@oracle-agent/oracle 0.28.27 → 0.28.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -3
- package/SETUP.md +3 -0
- package/dist/assets/skills/bankrbot/SKILL.md +24 -0
- package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +39 -0
- package/dist/assets/skills/oracle-chain-graphs-telegram-cards/SKILL.md +2 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-uniswap-v4-hooks/SKILL.md +31 -0
- package/dist/assets/skills/oracle-x402/SKILL.md +30 -0
- package/dist/bin/desk-server.mjs +28 -26
- package/dist/bin/oracle-data-mcp.mjs +32 -12
- package/dist/bin/oracle-gateway.mjs +39 -26
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +15 -15
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/bin/oracle.mjs +4 -3
- package/dist/cli/commands/auth.mjs +6 -6
- package/dist/cli/commands/chat.mjs +155 -155
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/eval.mjs +77 -77
- package/dist/cli/commands/harness.mjs +4 -4
- package/dist/cli/commands/model.mjs +157 -157
- package/dist/cli/commands/receipt.mjs +1 -1
- package/dist/cli/commands/setup.mjs +23 -23
- package/dist/cli/commands/signer.mjs +8 -8
- package/dist/cli/commands/snipe.mjs +24 -0
- package/dist/cli/commands/swap.mjs +25 -25
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/control/approval-binding.mjs +1 -0
- package/dist/control/finality.mjs +1 -0
- package/dist/control-plane/index.mjs +6 -0
- package/dist/data/desk-data.mjs +26 -24
- package/dist/governance-prepare.mjs +2 -0
- package/dist/index.mjs +44 -31
- package/dist/local-marketplace.mjs +3 -0
- package/dist/local-pack-registry.mjs +3 -0
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +8 -8
- package/dist/local-x402.mjs +3 -0
- package/dist/nft/index.mjs +1 -1
- package/dist/notifications/index.mjs +3 -0
- package/dist/position-health.mjs +2 -0
- package/dist/router/index.mjs +2 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/safety-intelligence.mjs +1 -0
- package/dist/scanner/index.mjs +3 -3
- package/dist/task.d.mts +130 -0
- package/dist/task.mjs +2 -0
- package/dist/tax-lots.mjs +5 -0
- package/dist/tenant-rbac.mjs +1 -0
- package/dist/workflow-telemetry.mjs +1 -0
- package/package.json +17 -2
- package/public/agent-connect/index.html +2 -2
- package/public/install.sh +2 -2
- package/public/oracle-splash/index.html +2 -2
- package/public/oracle-splash/install.sh +2 -2
package/dist/bin/desk-server.mjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`),c=zI("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function e1(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Nf):Math.min(250*2**e,Nf)+Math.floor(Math.random()*100)}function Eo(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Qc(e,t,n){return Eo(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Ao(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function n1(e){return e?e.byteLength??e.length??0:0}async function Rf(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&&(Ao(e),!r))throw Qc(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 Qc(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+=n1(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 Qc(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function $f(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function r1(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:s,untrustedUrl:c=!1,maxResponseBytes:l=null,importUndici:u,validateResponse:d}){let p=new AbortController,m=setTimeout(()=>p.abort(),i),f=null,h=t,g=a?{lookupFn:a}:{};if(c&&!s&&!Jc(h))throw Eo(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let b=async(x,{status:w=null}={})=>{let y=await Gc(x,g);if(!y.ok)throw Eo(w==null?`HTTP refused ${x}: ${y.error}`:`HTTP redirect to ${x} ${y.error}`,w==null?{}:{status:w});let S=new URL(x).hostname;if(s){if(f&&(await f.close(),f=null),!f)try{f=await Kc({requireUndici:!0,...u?{importUndici:u}:{}})}catch(E){throw Eo(w==null?`HTTP refused ${x}: ${E?.message||E}`:`HTTP redirect to ${x} refused: ${E?.message||E}`,w==null?{}:{status:w})}f.pin(S,y.addresses),h=f.fetch}else Pf(h,S,y.addresses);return y};try{let x=String(e),w={...r||{}};c&&await b(x);for(let y=0;y<=Of;y+=1){let S=await h(x,{method:n,headers:w,body:o,signal:p.signal,redirect:"manual"});if(GI.has(S.status)){if(n!=="GET"&&n!=="HEAD"){let C=await Rf(S,l??KI,{url:x,truncate:!0}),I=new Error(`HTTP ${S.status} ${n} ${x} redirected non-idempotent request`);throw I.status=S.status,I.body=$f(C)??C.slice(0,300),I}if(y===Of)throw Ao(S),new Error(`HTTP redirect loop for ${e}`);let A=S.headers?.get?.("location"),P;try{P=XI(A,x)}catch(C){throw Ao(S),C}let T=!QI(P,x);if(Ao(S),T&&(w=JI(w)),c)await b(P,{status:S.status});else if(T){let C=await Gc(P,g);if(!C.ok){let I=new Error(`HTTP redirect from ${x} ${C.error}`);throw I.status=S.status,I.retryable=!1,I}s&&C.addresses?.length&&(f||(f=await Kc(u?{importUndici:u}:{})),f&&(f.pin(new URL(P).hostname,C.addresses),h=f.fetch))}x=P;continue}if(typeof d=="function")try{await d(S,{url:x})}catch(A){throw Ao(S),Eo(A?.message||String(A))}let E=await Rf(S,l,{url:x,onOversize:()=>p.abort()}),v=$f(E);if(!S.ok){let A=new Error(`HTTP ${S.status} ${n} ${x}`);throw A.status=S.status,A.retryAfter=S.headers?.get?.("retry-after")??null,A.body=v??E.slice(0,300),A}return v??E}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),f&&await f.close()}}async function k(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},a=t.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let s=Number.isInteger(t.retries)?Math.max(t.retries,0):VI,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,m=Number(t.maxResponseBytes),f=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let y;for(let S=0;S<=s;S++)try{return await r1(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:f,importUndici:d,validateResponse:p})}catch(E){y=E;let v=E?.status,A=E?.name==="AbortError",P=new Set([408,425,429]),T=E?.retryable===!1?!1:v!=null?P.has(v)||WI.has(v)&&Cf.has(o):!A&&Cf.has(o);if(S===s||!T)throw E;await t1(e1(S,E?.retryAfter))}throw y};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let b=ZI(o,e,i,{untrustedUrl:u,maxResponseBytes:f}),x=Xc.get(b);if(x)return x;let w=h().finally(()=>Xc.delete(b));return Xc.set(b,w),w}async function Oe(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 Xe(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 WI,Cf,VI,Nf,Lf,GI,Of,KI,Xc,t1,j=K(()=>{Tf();WI=new Set([408,425,429,500,502,503,504]),Cf=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),VI=2,Nf=4e3,Lf=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],GI=new Set([301,302,303,307,308]),Of=3,KI=64*1024;Xc=new Map;t1=e=>new Promise(t=>setTimeout(t,e))});function el(e){return Bf.get(Number(e))||null}function Mf(e,t=process.env){let n=el(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Ff(e){return Bf.has(Number(e))}var Zc,Bf,Uf=K(()=>{Zc={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}},Bf=new Map(Object.values(Zc).map(e=>[e.chainId,e]))});var fa={};Rt(fa,{PUBLIC_RPC_FALLBACKS:()=>nl,erc20Allowance:()=>al,erc20BalanceOf:()=>_o,resolveRpcUrl:()=>rl,rpcBlockNumber:()=>Io,rpcCall:()=>W,rpcChainId:()=>ol,rpcGasPrice:()=>il,rpcGetBalance:()=>Dn,rpcHealth:()=>br,rpcHealthAll:()=>sl,transactionReceipt:()=>Po});import{Interface as o1,getAddress as i1}from"ethers";function sn(e,t){try{return i1(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function a1(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 tl(e){return e==null?null:Number.parseInt(String(e),16)}function rl(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Mf(e,n);return r||nl[Number(e)]||null}function c1(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!s1.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 W(e,t,n=[],r={}){let o=String(t||"");c1(o);let i=rl(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await k(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function br(e,t={}){let n=await W(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await W(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:el(e)?.name||null}}async function Io(e,t={}){let n=await W(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function ol(e,t={}){let n=await W(e,"eth_chainId",[],t);return parseInt(n,16)}async function il(e,t={}){let n=await W(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Dn(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await W(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function al(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=sn(e.token||e.tokenAddress,"token"),o=sn(e.owner,"owner"),i=sn(e.spender,"spender"),a=ma.encodeFunctionData("allowance",[o,i]),s=await W(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=ma.decodeFunctionResult("allowance",s),l=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function _o(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=sn(e.token||e.tokenAddress,"token"),o=sn(e.account||e.owner||e.address,"account"),i=ma.encodeFunctionData("balanceOf",[o]),a=await W(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=ma.decodeFunctionResult("balanceOf",a),c=BigInt(s[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Po(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=a1(e.txHash||e.hash||e.transactionHash),o=await W(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=tl(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?sn(e.expectedTo,"expectedTo"):null,u=o.to?sn(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?sn(o.from,"receipt.from"):null,blockNumber:tl(o.blockNumber),transactionIndex:tl(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function sl(e={}){let t=e.chainIds||Object.values(Zc).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Ff(r)&&!nl[r]&&!rl(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await br(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var ma,nl,s1,Ee=K(()=>{j();Uf();ma=new o1(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);nl={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"};s1=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function p1(e,t,n){let r=vt(t),o=vt(n),i=vt(e?.baseToken?.address),a=vt(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function m1(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function ha(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||l1).replace(/\/$/,"")}async function qf(e={}){let n=(await k(`${ha(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Hn(e,t={}){if(!e)throw new Error("tokenAddress required");return k(`${ha(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function To(e,t={}){if(!e)throw new Error("query required");return k(`${ha(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Df(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return k(`${ha(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function Hf({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Co({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Co({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=vt(u1[Number(e)]||e),a=new Set(d1(r).filter(Boolean).map(vt)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>Hn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${vt(m?.chainId)}:${vt(m?.dexId)}:${vt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>vt(p?.chainId)===i).filter(p=>p1(p,t,n)).filter(p=>!a.size||a.has(vt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:m1(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}var l1,u1,vt,d1,xr=K(()=>{j();l1="https://api.dexscreener.com",u1=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),vt=e=>String(e??"").toLowerCase(),d1=e=>Array.isArray(e)?e:e==null?[]:[e]});import{readFileSync as h1}from"node:fs";import{homedir as g1}from"node:os";import{join as ga}from"node:path";function y1(){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=g1();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||ga(t,".config","oracle")).trim();return[e,ga(n,"exec.env")].filter(Boolean)}return[e,ga(t,".config","oracle","exec.env"),ga(t,".config","mad-desk","exec.env")].filter(Boolean)}function jf(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of y1())try{let i=h1(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 zf=K(()=>{});var Wf=K(()=>{});import{createHash as w1,createHmac as Gf,timingSafeEqual as b1}from"node:crypto";function wa(e){return Array.isArray(e)?`[${e.map(wa).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wa(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Kf(e,{required:t=!1}={}){try{return jf(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function ll(e){let{signature:t,...n}=e;return n}function Yf(e,{secret:t}={}){let n=Kf(t);return n?{...e,signature:Gf("sha256",n).update(wa(ll(e))).digest("hex")}:e}function x1(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 w1("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Ae(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=Kf(o);if(i){let m=Gf("sha256",i).update(wa(ll(e))).digest("hex");if(!v1(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>ya||!Number.isInteger(s)||s<0||s>ya||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=k1(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 Yf({...ll(e),calldataHash:x1(r)},{secret:o})}function v1(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:b1(n,r)}function cl(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function S1(e){let t=e==null?ya: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,ya)}function Qe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=cl(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(cl(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,cl(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=S1(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function ul({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=Vf,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Qe({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)||Vf)),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 Yf({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 k1(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 le(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=ul({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 ya,Vf,We=K(()=>{zf();Wf();ya=100,Vf=2e4});import{createHash as E1,createHmac as A1,timingSafeEqual as v5}from"node:crypto";function dl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(dl).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${dl(e[n])}`).join(",")}}`}function Jf(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Xf(e=process.env){return Jf(process.env)||Jf(e)}function P1(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function jn(e){let t=P1(e);return E1("sha256").update(dl(t)).digest("hex")}function T1(e,t=Xf()){return t?A1("sha256",t).update(String(e)).digest("hex"):""}function B(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+pl:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>_1)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:I1},m=jn(p),f=Xf(r),h=f?T1(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var I1,pl,_1,ne=K(()=>{I1=2,pl=300*1e3,_1=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var bl={};Rt(bl,{PANCAKE_FEE_TIERS:()=>ba,UNI_V3_CHAINS:()=>$e,UNI_V3_FEE_TIERS:()=>th,UNI_V3_VENUES:()=>oh,uniV3Chains:()=>wl,uniV3EthUsdc:()=>va,uniV3Health:()=>yl,uniV3PrepareExactIn:()=>gl,uniV3QuoteExactIn:()=>zt,uniV3QuoteExactInPath:()=>hl});import{Interface as Zf,getAddress as No,isAddress as eh}from"ethers";function fl(e,t){let n=Number(e),r=$e[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys($e).join(", ")})`);let o=oh[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 ml(e,t){let n=$e[Number(t)];if(!e||e===nh||e===rh||/^eth$/i.test(String(e)))return No(n.weth);let r=String(e);if(/^weth$/i.test(r))return No(n.weth);if(/^usdc$/i.test(r))return No(n.usdc);if(!eh(r))throw new Error(`invalid token address: ${e}`);return No(r)}function N1(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 O1(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}=fl(e.chainId??8453,e.venue),a=ml(e.tokenIn||"WETH",n),s=ml(e.tokenOut||$e[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:th,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let E of u){let v=xa.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:E,sqrtPriceLimitX96:0n}]);try{let A=await W(n,"eth_call",[{to:r,data:v},"latest"],t);if(!A||A==="0x"){d.push({fee:E,ok:!1,error:"empty result"});continue}let P=xa.decodeFunctionResult("quoteExactInputSingle",A),T={fee:E,ok:!0,amountOut:P[0].toString(),sqrtPriceX96After:P[1].toString(),initializedTicksCrossed:Number(P[2]),gasEstimate:P[3].toString()};d.push(T),(!p||BigInt(T.amountOut)>BigInt(p.amountOut))&&(p=T)}catch(A){d.push({fee:E,ok:!1,error:String(A.message||A).slice(0,160)})}}if(!p){let E=d.map(v=>`${v.fee}:${v.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${E}`)}let m=e.liquidityUsd==null?await Co({chainId:n,tokenA:a,tokenB:s,dexIds:N1(e.venue)},t).catch(()=>[]):[],f={};for(let E of m.slice(0,8))if(!(!E.pairAddress||!eh(E.pairAddress)))try{let v=await W(n,"eth_call",[{to:E.pairAddress,data:C1},"latest"],t),A=v&&v!=="0x"&&v.length<=66?Number.parseInt(v,16):NaN;if(!Number.isFinite(A)||A<=0||A>1e6)continue;(f[A]==null||E.liquidityUsd>f[A].liquidityUsd)&&(f[A]=E)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let E=BigInt(p.amountOut),A=d.filter(P=>P.ok&&Number((E-BigInt(P.amountOut))*10000n/E)<=h).filter(P=>f[P.fee]?.liquidityUsd!=null).sort((P,T)=>f[T.fee].liquidityUsd-f[P.fee].liquidityUsd)[0];A&&A.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:f[A.fee].liquidityUsd,bandBps:h},p=A)}let b=f[p.fee]??null,x=m[0]??null,w=b??x,y=e.liquidityUsd??b?.liquidityUsd??x?.liquidityUsd??null,S=e.liquidityUsd!=null?"caller":b?"pool":x?"pair":null;return le({venue:"uniswap-v3",chainId:n,chain:$e[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:S,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 hl(e={},t={}){let{chainId:n,quoter:r,router:o}=fl(e.chainId??8453),i=(e.tokens||[]).map(p=>ml(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=O1(i,a),l=xa.encodeFunctionData("quoteExactInput",[c,s]),u=await W(n,"eth_call",[{to:r,data:l},"latest"],t),d=xa.decodeFunctionResult("quoteExactInput",u);return le({venue:"uniswap-v3",chainId:n,chain:$e[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 va(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await zt({chainId:n,tokenIn:$e[n].weth,tokenOut:$e[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function gl(e={},t={}){let n=Number(e.chainId??8453),r=fl(n,e.venue),o=No(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===nh||i===rh||/^eth$/i.test(i),s=await zt(e,t),c=Qf.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=Qf.encodeFunctionData("multicall",[d,[c]]);return B({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:Ae(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function yl(e={}){let t=Number(e.chainId??8453);try{let n=await va({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 wl(){return Object.entries($e).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var $e,th,C1,xa,Qf,nh,rh,ba,oh,zn=K(()=>{Ee();xr();We();ne();$e={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"}},th=[100,500,3e3,1e4],C1="0xddca3f43",xa=new Zf(["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)"]),Qf=new Zf(["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)"]),nh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",rh="0x0000000000000000000000000000000000000000",ba=[100,500,2500,1e4],oh={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ba}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ba}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ba}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Al={};Rt(Al,{UNI_V4_CHAINS:()=>nt,UNI_V4_FEE_TIERS:()=>xl,computeV4PoolId:()=>vl,uniV4Chains:()=>kl,uniV4Health:()=>El,uniV4PrepareExactIn:()=>U1,uniV4QuoteExactIn:()=>ln,uniV4QuoteExactOut:()=>Sl});import{AbiCoder as R1,Interface as ih,getAddress as St,isAddress as Ea,keccak256 as $1}from"ethers";function Aa(e){let t=Number(e),n=nt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(nt).join(", ")})`);return{chainId:t,...n}}function ka(e,t){let n=nt[Number(t)];if(!e||e===ah||e===cn||/^eth$/i.test(String(e)))return St(n.weth);let r=String(e);if(/^weth$/i.test(r))return St(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return St(n.usdc);if(!Ea(r))throw new Error(`invalid token address: ${e}`);return St(r)}function vl({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=cn}){let i=St(e),a=St(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=o&&Ea(o)?St(o):cn;return $1(Oo.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function sh({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=cn}){let i=St(e),a=St(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&Ea(o)?St(o):cn},zeroForOne:l}}async function ln(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Aa(e.chainId??8453),a=ka(e.tokenIn||"WETH",n),s=ka(e.tokenOut||nt[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}]:[...xl],u=e.hooks||cn,d=[],p=null;for(let v of l){let{poolKey:A,zeroForOne:P}=sh({tokenIn:a,tokenOut:s,fee:v.fee,tickSpacing:v.tickSpacing,hooks:u}),T=Sa.encodeFunctionData("quoteExactInputSingle",[{poolKey:A,zeroForOne:P,exactAmount:c,hookData:"0x"}]);try{let C=await(t.rpcCall||W)(n,"eth_call",[{to:r,data:T},"latest"],t);if(!C||C==="0x"){d.push({...v,ok:!1,error:"empty result"});continue}let I=Sa.decodeFunctionResult("quoteExactInputSingle",C),F={fee:v.fee,tickSpacing:v.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:A,zeroForOne:P,poolId:vl({...A})};d.push(F),(!p||BigInt(F.amountOut)>BigInt(p.amountOut))&&(p=F)}catch(C){d.push({...v,ok:!1,error:String(C.message||C).slice(0,160)})}}if(!p){let v=d.map(A=>`${A.fee}/${A.tickSpacing}:${A.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${v}`)}let m=e.liquidityUsd==null?await Co({chainId:n,tokenA:a,tokenB:s,dexIds:ch},t).catch(()=>[]):[],f=new Map;for(let v of m){let A=String(v.pairAddress||"").toLowerCase();A&&f.set(A,v)}let h=v=>f.get(String(v.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 v=BigInt(p.amountOut),P=d.filter(T=>T.ok&&Number((v-BigInt(T.amountOut))*10000n/v)<=g).filter(T=>h(T)?.liquidityUsd!=null).sort((T,C)=>h(C).liquidityUsd-h(T).liquidityUsd)[0];P&&P.poolId!==p.poolId&&(b={priceBestFee:p.fee,chosenFee:P.fee,chosenPoolUsd:h(P).liquidityUsd,bandBps:g},p=P)}let x=h(p),w=m[0]??null,y=x??w,S=e.liquidityUsd??x?.liquidityUsd??w?.liquidityUsd??null,E=e.liquidityUsd!=null?"caller":x?"pool":w?"pair":null;return le({venue:"uniswap-v4",chainId:n,chain:nt[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:S,liquiditySource:y,liquidityAttribution:E,liquidityPick:b,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Ea(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:S,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Sl(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Aa(e.chainId??8453),a=ka(e.tokenIn||"WETH",n),s=ka(e.tokenOut||nt[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}]:[...xl],u=e.hooks||cn,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=sh({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),b=Sa.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||W)(n,"eth_call",[{to:r,data:b},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let w=Sa.decodeFunctionResult("quoteExactOutputSingle",x),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:h,zeroForOne:g,poolId:vl({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await Hf({chainId:n,tokenA:a,tokenB:s,dexIds:ch},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:nt[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 U1(e={},t={}){let n=Number(e.chainId??8453),r=Aa(n);if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let o=St(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let i=Number(e.slippageBps);if(!Number.isInteger(i)||i<0||i>=1e4)throw new Error("slippageBps must be an integer from 0 through 9999");let a=String(e.tokenIn||"");if(!a||a===ah||a===cn||/^eth$/i.test(a))throw new Error("uniswap-v4 prepare currently requires an ERC-20 tokenIn; native input is not inferred");let s=await ln(e,t);if(!r.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let c=BigInt(s.amountOut)*BigInt(1e4-i)/10000n,l={currency0:s.zeroForOne?s.tokenIn:s.tokenOut,currency1:s.zeroForOne?s.tokenOut:s.tokenIn,fee:s.fee,tickSpacing:s.tickSpacing,hooks:s.hooks},d=Oo.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[l,s.zeroForOne,BigInt(s.amountIn),c,0n,"0x"]]),p=Oo.encode(["address","uint256"],[s.tokenIn,BigInt(s.amountIn)]),m=Oo.encode(["address","uint256"],[s.tokenOut,c]),f=Oo.encode(["bytes","bytes[]"],[M1,[d,p,m]]),h=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),b=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+h,x=L1.encodeFunctionData("execute",[B1,[f],b]);return B({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:b,quote:{...s,amountOutMinimum:c.toString(),slippageBps:i},requiresApproval:{token:s.tokenIn,spender:F1,amount:s.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:o,to:r.universalRouter,data:x,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function kl(){return Object.entries(nt).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 El(e={}){let t=Aa(e.chainId??8453),n=await W(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 Oo,cn,nt,xl,Sa,L1,B1,M1,F1,ah,ch,vr=K(()=>{Ee();xr();We();ne();Oo=R1.defaultAbiCoder(),cn="0x0000000000000000000000000000000000000000",nt={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"}},xl=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Sa=new ih(["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)"]),L1=new ih(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),B1="0x10",M1="0x060c0f",F1="0x000000000022D473030F116dDEE9F6B43aC78BA3",ah="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";ch=["uniswap-v4","uniswapv4"]});function kt({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:uh(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([uh(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[lh]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${lh}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function uh(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function lt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var lh,Wn=K(()=>{lh="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});function U_({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"?F_:M_}async function ge(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=U_(t);return k(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Vh(e={}){let t=await ge({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function Vt(e={}){return ge({type:"allMids"},e)}async function Ar(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ge({type:"l2Book",coin:String(e)},t)}async function jo(e={}){return ge({type:"outcomeMeta"},e)}async function Ua(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ge({type:"spotClearinghouseState",user:e},t)}async function Gh(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ge({type:"userFills",user:e},t)}async function qa(e={}){return ge({type:"meta"},e)}async function dt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ge(t,e)}async function Ir({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 ge(i,o)}async function Da({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return ge({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Kh(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ge({type:"openOrders",user:e},t)}async function Yh(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ge({type:"frontendOpenOrders",user:e},t)}async function _r(e,t={}){if(!e)throw new Error("hlUserState requires user");return ge({type:"clearinghouseState",user:e},t)}async function Ha(e={}){return ge({type:"spotMeta"},e)}var M_,F_,ot=K(()=>{j();M_="https://api.hyperliquid.xyz/info",F_="https://api.hyperliquid-testnet.xyz/info"});async function r0(e={}){let t=Date.now();if(Ko.dexs&&t-Ko.at<6e4&&!e.fetchImpl)return Ko.dexs;let n=await ge({type:"perpDexs"},e);return Ko={at:t,dexs:Array.isArray(n)?n:[]},Ko.dexs}async function o0(e="",t={}){let n=e||"",r=Date.now(),o=n0.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ge({type:"metaAndAssetCtxs",dex:e},t):await dt(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return n0.set(n,c),c}function mn(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let n=t%10;if(n!==0&&n!==1)return null;let r=Math.floor(t/10),o=i0+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function pn(e,t){let n=tu(e),r=tu(t);if(n==null)throw new Error("hl-assets: outcome id must be a non-negative integer");if(r!==0&&r!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*n+r;if(!Number.isSafeInteger(o))throw new Error("hl-assets: outcome encoding exceeds safe integer range");let i=i0+o;if(!Number.isSafeInteger(i))throw new Error("hl-assets: outcome asset id exceeds safe integer range");return{encoding:o,outcome:n,side:r,coin:`#${o}`,assetId:i}}function tu(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 nu(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:mn(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:pn(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:Y_(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=pn(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 r0(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 o0(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 x=K_+m*1e4+g,w=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:x,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:w.markPx??null}}let{universe:r,ctxs:o}=await o0("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await r0(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 nu({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 Y_(e,t){let n=tu(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var i0,K_,Ko,n0,Ka=K(()=>{ot();i0=1e8,K_=1e5,Ko={at:0,dexs:null},n0=new Map});function Le(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function pt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Xn(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let n=Le(e,t);if(n==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(n)&&!/^0x[0-9a-fA-F]+$/.test(n))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(n)}`);try{return BigInt(n)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(n)}`)}}function mt(e,t="amount"){let n=Xn(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Re(e,t,n="amount"){let r=Le(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 Pr=K(()=>{});function eP(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 a0(e,t){let n=Le(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 $t(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=>$t(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)}:${$t(e[r],t)}`).join(",")}}`}function tP(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)||$t(n,"declared order type")!==$t({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if($t(n,"declared order type")!==$t({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||$t(n,"declared order type")!==$t({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 nP(e,t,n){let r=a0(e.s,"signed size"),o=a0(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Re(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Re(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function rP(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=fn(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(pt(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=Xn(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Re(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function s0(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(Le(e.s,"hl: signed size")!==Le(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Le(e.p,"hl: signed price")!==Le(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($t(e.t,"signed order type")!==$t(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 c0(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(Le(e.s,"hl: bracket protection size")!==Le(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Le(e.p,"hl: bracket protection price")!==Le(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(Le(i.triggerPx,"hl: triggerPx")!==Le(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function oP(e){let t=String(e||"").replace(/\/$/,"");if(!J_.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function ru(e){return mn(e)!=null}function iP(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(ru(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 aP(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(ru(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 l0(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=fn(n.kind,"kind",48),o=Q_[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=oP(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!==Z_[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(X_.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=fn(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=mn(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(iP(c,t),aP(c,l,t),r==="hip4-order"&&!ru(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");tP(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");s0(u[0],n,l);let f=1;d!=null&&c0(u[f++],n,l,d,"tp"),p!=null&&c0(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");s0(u[0],n,l)}nP(u[0],n,t),rP(n,t),s=Le(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=fn(n.usd,"margin usd",64),d=Re(u,6,"hl: margin usd");if(Xn(n.action.ntli,"hl: signed margin ntli")!==d)throw new Error("hl: signed margin amount must match usd");if(typeof n.isBuy!="boolean"||n.action.isBuy!==n.isBuy)throw new Error("hl: signed margin isBuy must match");let m=Re(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=eP(f,6)}}if(r==="builder-fee-approval"){let c=fn(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(fn(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=fn(n.maxFeeRate,"maxFeeRate",32);if(fn(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=Re(u.slice(0,-1),12,"hl: builder fee percent"),p=Re(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 J_,X_,Q_,Z_,fn,u0=K(()=>{Pr();Ka();J_=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),X_=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),Q_=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"}),Z_=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"}),fn=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function cP(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 Ya(e,t={},n={}){let r=String(e?.kind||""),o=sP[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:cP(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 l0(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 sP,ou=K(()=>{u0();sP=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as lP,JsonRpcProvider as uP}from"ethers";function gP(e){return hP.test(String(e||""))}async function Ja(e,{contract:t=dP,rpc:n=mP,chainId:r=pP,balanceOf:o}={}){if(!gP(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new uP(n,r,{staticNetwork:!0}),a=new lP(t,fP,i);return BigInt(await a.balanceOf(e))}var dP,pP,mP,fP,hP,iu=K(()=>{dP="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",pP=999,mP="https://rpc.hyperliquid.xyz/evm",fP=["function balanceOf(address owner) view returns (uint256)"],hP=/^0x[a-fA-F0-9]{40}$/});import{existsSync as yP,readFileSync as wP,lstatSync as bP}from"node:fs";import{homedir as d0}from"node:os";import{join as au}from"node:path";function SP(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(p0,t)?p0[t]:vP}function _P(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[m0])return String(e[m0]);let t=e.ORACLE_CONFIG_DIR||au(d0(),".config","oracle");return au(t,"fee-recipient")}return au(d0(),".config","oracle","fee-recipient")}function su(e=process.env){try{let t=_P(e);if(!yP(t)||bP(t).isSymbolicLink())return"";let n=wP(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function PP(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),xP)}function TP({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[EP]||"").trim(),o=String(e[AP]||IP).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=SP(t),a=PP(e[kP],{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=su(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 Xa({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=TP({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 Ja(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function f0(e){return e?.applies?`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 h0(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function g0(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var xP,vP,p0,kP,EP,AP,m0,IP,Yo=K(()=>{iu();xP=100,vP=5,p0=Object.freeze({swap:5,bridge:5,perps:0,nft:0});kP="ORACLE_INTEGRATOR_FEE_BPS",EP="ORACLE_INTEGRATOR_FEE_RECIPIENT",AP="ORACLE_INTEGRATOR_ID",m0="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",IP="oracle"});var wu={};Rt(wu,{HL_BUILDER_ADDRESS_ENV:()=>Qa,HL_BUILDER_DEFAULT_FEE_BPS:()=>CP,HL_BUILDER_FEE_ENV:()=>lu,HL_BUILDER_FEE_TIERS:()=>Jo,HL_BUILDER_MAX_FEE_BPS:()=>cu,HL_PERP_MAX_SIG_FIGS:()=>y0,HL_PERP_PRICE_DECIMALS:()=>w0,HL_SIGNATURE_CHAIN_ID:()=>du,MARGIN_MODE:()=>Xo,ORDER_TYPES:()=>et,TIF:()=>Qo,formatPerpPrice:()=>Kt,formatPerpSize:()=>S0,hlBuilderFeeBpsForKind:()=>v0,hlPerpAssetInfo:()=>hn,hlPrepareBracketOrder:()=>yu,hlPrepareBuilderApproval:()=>fu,hlPrepareCancelOrder:()=>Zo,hlPreparePerpOrder:()=>Nr,hlPrepareUpdateIsolatedMargin:()=>gu,hlPrepareUpdateLeverage:()=>hu,resolveBuilderFee:()=>pu});function b0(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 NP(e,t){let n=b0(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function OP(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 x0(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 v0(e="perp"){if(e==="perp"||e==="main")return Jo.perp;if(e==="spot")return Jo.spot;if(e==="hip3")return Jo.hip3;if(e==="outcome"||e==="hip4")return Jo.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function pu({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Qa]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Qa} must be an EVM address`);let o=su(e);if(!o||o!==r)return null;let i=e?.[lu],a=v0(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: ${lu} must be a positive number in 0.1 bps increments`);if(s>cu)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${cu} 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 RP(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 ge({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 $P(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||Ja;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function mu(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 LP(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 mu(r,a,n)}function Kt(e,t,n={}){let r=w0-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return mu(LP(e,y0,n),r,n)}function S0(e,t){let n=mu(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 BP(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 hn(e={},t={}){let n=await nu(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 uu(e,{tif:t=Qo.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case et.LIMIT:return{limit:{tif:t}};case et.MARKET:return{limit:{tif:Qo.IOC}};case et.STOP_MARKET:case et.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:Kt(n,o),tpsl:e===et.STOP_MARKET?"sl":"tp"}};case et.STOP_LIMIT:case et.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:Kt(n,o),tpsl:e===et.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Tr(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:du,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 Cr(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=Ya(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,B(r,{provider:e.provider||"hl-perps",kind:e.kind})}function fu(e={},t={}){let n=pu({env:t.env});if(!n)throw new Error(`hl-perps: ${Qa} 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:du,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Cr({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Tr(o,r,t)},e,t)}async function Nr(e={},t={}){let n=await hn(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??et.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=x0(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=S0(e.size??e.sz,n.szDecimals),s;if(r===et.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let E=await Vt(t);x=Number(E?.[n.coin]??E?.[String(n.assetId)]??NaN)}if(!Number.isFinite(x))throw new Error("hl-perps: no mark price available for a market order");let 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?x*(1+w/1e4):x*(1-w/1e4);s=Kt(y,n.szDecimals,{roundDown:o});let S=Math.abs(Number(s)/x-1)*1e4;if(S>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${S.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=Kt(e.price??e.limitPx,n.szDecimals)}let c=uu(r,{tif:e.tif??(r===et.MARKET?Qo.IOC:Qo.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=pu({env:t.env,kind:n.kind}),p=await $P(d,e,t),m=p.exempt?null:d,f=await RP(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),b=BP(a,s);return Cr({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,...Tr(u,g,t)},e,t)}async function Zo(e={},t={}){let n=await hn(OP(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=b0(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Cr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Tr(i,Number(e.nonce??Date.now()),t)},e,t)}async function hu(e={},t={}){let n=await hn(e,t),r=NP(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||Xo.CROSS).toLowerCase();if(o!==Xo.CROSS&&o!==Xo.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Xo.CROSS,leverage:r};return Cr({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,...Tr(i,Number(e.nonce??Date.now()),t)},e,t)}async function gu(e={},t={}){let n=await hn(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=Re(o,6,"hl-perps: usd"),a=x0(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Cr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Tr(s,Number(e.nonce??Date.now()),t)},e,t)}async function yu(e={},t={}){let n=await Nr(e,t),r=await hn(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:Kt(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:uu(et.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:Kt(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:uu(et.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 Cr({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:Kt(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:Kt(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Tr(a,Number(e.nonce??Date.now()),t)},e,t)}var y0,w0,du,CP,cu,Qa,lu,Jo,et,Qo,Xo,Za=K(()=>{ot();Ka();Pr();ne();ou();iu();Yo();y0=5,w0=6,du="0x66eee",CP=2,cu=10,Qa="ORACLE_HL_BUILDER_ADDRESS",lu="ORACLE_HL_BUILDER_FEE_BPS",Jo=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),et=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Qo=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Xo=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function qu(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:wn}var wn,ps=K(()=>{wn="0x000000000000000000000000000000000000dEaD"});var Vu={};Rt(Vu,{LIFI_API:()=>Mg,lifiChains:()=>Wu,lifiHealth:()=>ju,lifiPrepare:()=>zu,lifiQuote:()=>bn});function Hu(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Mg).replace(/\/$/,"")}function jT(e){let t=String(e||Du).toLowerCase();return t===Du.toLowerCase()||t===HT}function Bg(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 ju(e={}){let t=await k(`${Hu(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 bn(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Du,toToken:i,fromAmount:a,fromAddress:s=wn}=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=Qe({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 Xa({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(h0(u)))c.set(g,b);let d=await k(`${Hu(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=le(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 zu(e={},t={}){let n=await bn(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(!jT(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:Bg(s,"approval token"),spender:Bg(a,"approval spender"),amount:String(e.fromAmount)}}return B({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:Ae(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Wu(e={}){return k(`${Hu(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Mg,Du,HT,ii=K(()=>{j();We();ps();ne();Yo();Mg="https://li.quest/v1";Du="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",HT="0x0000000000000000000000000000000000000000"});var Yu={};Rt(Yu,{ZEROX_API:()=>Gg,zeroxHealth:()=>Gu,zeroxPrepare:()=>Ku,zeroxPrice:()=>hs,zeroxQuote:()=>vn});function Kg(e={}){return kt({provider:"zerox",defaultUrl:Gg,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Yg(e={}){return Kg(e).baseUrl}function fs(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Jg(e={}){return lt({"0x-version":"v2",accept:"application/json"},{"0x-api-key":fs(e)},Kg(e).trusted)}async function Gu(e={}){if(!fs(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await hs({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 hs(e={},t={}){if(!fs(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let s=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return a&&s.set("taker",a),k(`${Yg(t)}/swap/allowance-holder/price?${s}`,{headers:Jg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function vn(e={},t={}){if(!fs(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=Qe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`0x: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(s.selectedBps)});a&&c.set("taker",a);let l=await k(`${Yg(t)}/swap/allowance-holder/quote?${c}`,{headers:Jg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?le(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 Ku(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await vn(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 B({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:Ae(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var Gg,si=K(()=>{j();We();Wn();ne();Gg="https://api.0x.org"});async function Xg(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Ju({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ju(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:a}=e;if(!n||o==null||i==null||!a)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let s=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(a)}),c=(t.baseUrl||process.env.ACROSS_API_URL||KT).replace(/\/$/,"");return k(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Qg(e={}){try{let t=await Xu({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Xu(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let a=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),s=Qe({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||YT).replace(/\/$/,""),u=await k(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?le(u,{chainId:Number(e.originChainId||e.chainId||XT[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 Zg(e={}){try{let t=await gs({user:wn,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 gs(e={},t={}){let{user:n=wn,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=Qe({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||JT).replace(/\/$/,""),d=await k(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:a,amount:String(s),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:le(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 ey(e={},t={}){let n=await gs(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:Ae(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return B({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 KT,YT,JT,XT,ty=K(()=>{j();We();ps();ne();KT="https://across.to/api",YT="https://api.hop.exchange/v1",JT="https://api.relay.link",XT={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Qu(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function ny(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}var N3,ys=K(()=>{N3=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var id={};Rt(id,{COW_CANCEL_TYPES:()=>sy,COW_HOSTS:()=>ed,COW_ORDER_TYPES:()=>ws,COW_SETTLEMENT:()=>oy,COW_VAULT_RELAYER:()=>iy,cowCancelOrders:()=>cC,cowChains:()=>od,cowHealth:()=>nd,cowOrder:()=>vs,cowOrderStatus:()=>xs,cowOrderUid:()=>rC,cowPrepareCancel:()=>aC,cowPrepareOrder:()=>rd,cowQuote:()=>Xt,cowSignCancel:()=>sC,cowSignOrder:()=>oC,cowSubmitSignedOrder:()=>iC,cowVerifyOrderFill:()=>uC});import{TypedDataEncoder as ry,getAddress as ci,isAddress as ZT}from"ethers";function bs(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=ed[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function eC(e,t="v1",n={}){let r=bs(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function Sn(e,t){let n=String(e||"").trim();if(!ZT(n))throw new Error(`cowswap: ${t} must be an address`);return ci(n).toLowerCase()}function Br(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 cy(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 ly(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 tC({digest:e,owner:t,validTo:n}={}){let r=cy(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 td(e){let t=oy[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:ci(t)}}function nC(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=cy(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Br(e.sellAmount,"sellAmount"),buyAmount:Br(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:Br(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function nd(e={}){try{let t=await Xt({chainId:1,sellToken:Zu[1],buyToken:ay[1],sellAmountBeforeFee:"1000000000000000",from:wn},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 Xt(e={},t={}){let n=Number(e.chainId??1),r=qu(e.from||e.owner),o=e.sellToken||Zu[n],i=e.buyToken||ay[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=Zu[n],!o))throw new Error("no WETH mapping for chain");let s={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:a,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await k(`${bs(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?le(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function rd(e={},t={}){let n=Number(e.chainId??1),r=Sn(qu(e.from||e.owner||e.signer),"owner"),o=await Xt({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=nC(o?.quote||o,n,r),a=td(n),s={domain:a,types:ws,primaryType:"Order",message:i},c=ry.hash(a,ws,i),l=iy[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return B({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:ci(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:ci(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:ci(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function xs(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return k(`${bs(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function vs(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return k(`${bs(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function rC(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||ry.hash(td(n),ws,r),i=e.owner||e.from||e.signer||r.receiver;return tC({digest:o,owner:i,validTo:r.validTo})}async function oC(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 iC(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 aC(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)=>ly(a,`orderUids[${s}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=td(t);return B({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:sy,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function sC(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function cC(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function lC(e={}){return Br(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function uC(e={},t={}){let n=Number(e.chainId??1),r=ly(e.uid||e.orderUid),o=t.order||await vs({chainId:n,uid:r},t),i=t.status||o.status||await xs({chainId:n,uid:r},t).catch(()=>null),a=t.trades||await k(`${eC(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(lC(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(Br(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(Br(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 od(){return Object.keys(ed).map(Number)}var ed,oy,iy,Zu,ay,ws,sy,li=K(()=>{j();We();ys();ps();ne();ed={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"},oy=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),iy=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Zu={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ay={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},ws=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"}]}),sy=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{existsSync as Ab,readFileSync as Ib}from"node:fs";import{dirname as Eb,join as qs}from"node:path";import{fileURLToPath as NO}from"node:url";function _b(e){let t=Eb(NO(e));for(let n=0;n<8;n+=1){let r=qs(t,"package.json");if(Ab(r))try{let i=JSON.parse(Ib(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Eb(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Pb(e){return JSON.parse(Ib(qs(_b(e),"package.json"),"utf8"))}function Ds(e,t){let n=_b(t),r=qs(n,e);return Ab(r)?r:qs(n,"dist","assets",e)}var Hs=K(()=>{});import{isAddress as OO}from"ethers";function $O(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Tb,tag:`v${Tb}`}),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 js(e){let t=nr[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Ii(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function _i(e,t){let n=String(e||"");if(!OO(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function Cb(e,t){let n=js(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");Ii(i,"safe-erc20: supply"),_i(a,"safe-erc20: initialHolder"),_i(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(Ii(i,"safe-erc721-drop: cap"),_i(a,"safe-erc721-drop: treasury"),Ii(s,"safe-erc721-drop: mintPrice"),Ii(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");_i(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;_i(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`)}Ii(i,"safe-vesting: durationSeconds")}return n}function Nb(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Tb,RO,nr,zs=K(()=>{Tb="5.0.2",RO={"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"]}};nr=Object.freeze(Object.fromEntries(Object.entries(RO).map(([e,t])=>[e,$O(e,t)])))});import{spawnSync as Md}from"node:child_process";import{existsSync as rr,readFileSync as Ws,readdirSync as Ob,statSync as Rb}from"node:fs";import{join as Mt}from"node:path";import{createHash as LO}from"node:crypto";function Gs(){return rr(Pi)?Ob(Pi).filter(e=>nr[e]&&Rb(Mt(Pi,e)).isDirectory()).map(e=>{let t=Mt(Pi,e),n=Mt(t,"SECURITY.md");return{id:e,path:t,metadata:js(e),securityNotice:rr(n)?Ws(n,"utf8").slice(0,500):null,disclaimer:Vs}}):[]}function $b(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",Mt(e,".foundry/bin/forge")];for(let n of t)if(Md(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function BO(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Md("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function Xr(e,t,n){let r=Md(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 MO(e){let t=LO("sha256");function n(r){let o=Rb(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Ob(r).sort())n(Mt(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(Ws(r)))}return n(e),t.digest("hex")}function Ti(e,t={}){let n=js(e),r=t.allowSkipStatic!==!1,o=Mt(Pi,e);if(!rr(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=$b();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(!rr(Mt(o,"lib","forge-std"))){let m=Xr(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
4
|
-
${m.stderr}`)}if(!
|
|
5
|
-
${m.stderr}`)}let a=
|
|
6
|
-
${c.stderr}`.slice(0,2e3));let l=
|
|
2
|
+
var x_=Object.defineProperty;var Y=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Ut=(e,t)=>{for(var n in t)x_(e,n,{get:t[n],enumerable:!0})};import Qn from"node:net";import S_ from"node:dns";function Ua(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 Il(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 Al(e){if(Qn.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(Qn.isIPv6(e)){let t=Ua(e);if(!t)return!1;let n=Ua("::ffff:0:0");return Il(t,n,96)?Al([...t.slice(12)].join(".")):Il(t,Ua("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Il(t,Ua(o),i)):!1}return!1}function v_(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(k_.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=Qn.isIP(n);return r!==0&&!Al(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function _l(e,{lookupFn:t=S_.promises.lookup}={}){let n=v_(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:Qn.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=>!Al(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Pl({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||(Qn.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(Qn.isIP(p))return[{address:p,family:Qn.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=E_((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 E_(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[Tl]=Object.freeze({pin:t}),e}function Nl(e){return typeof e=="function"&&typeof e[Tl]?.pin=="function"}function $h(e,t,n){if(!Nl(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Tl].pin(t,n)}var k_,Tl,Bh=Y(()=>{k_=new Set(["localhost","metadata.google.internal","metadata.goog"]);Tl=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as I_}from"node:crypto";function N_(e){let t=String(e||"").toLowerCase();return Hh.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function C_(e){let t={};for(let[n,r]of Object.entries(e||{}))N_(n)||(t[n]=r);return t}function O_(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 R_(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function L_(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([...Hh,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
|
|
3
|
+
`),c=I_("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function $_(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Fh):Math.min(250*2**e,Fh)+Math.floor(Math.random()*100)}function Do(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ol(e,t,n){return Do(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Ho(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function M_(e){return e?e.byteLength??e.length??0:0}async function qh(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&&(Ho(e),!r))throw Ol(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 Ol(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+=M_(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 Ol(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function Dh(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function F_(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:s,untrustedUrl:c=!1,maxResponseBytes:l=null,importUndici:u,validateResponse:d}){let p=new AbortController,m=setTimeout(()=>p.abort(),i),f=null,h=t,g=a?{lookupFn:a}:{};if(c&&!s&&!Nl(h))throw Do(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let b=async(x,{status:w=null}={})=>{let y=await _l(x,g);if(!y.ok)throw Do(w==null?`HTTP refused ${x}: ${y.error}`:`HTTP redirect to ${x} ${y.error}`,w==null?{}:{status:w});let k=new URL(x).hostname;if(s){if(f&&(await f.close(),f=null),!f)try{f=await Pl({requireUndici:!0,...u?{importUndici:u}:{}})}catch(v){throw Do(w==null?`HTTP refused ${x}: ${v?.message||v}`:`HTTP redirect to ${x} refused: ${v?.message||v}`,w==null?{}:{status:w})}f.pin(k,y.addresses),h=f.fetch}else $h(h,k,y.addresses);return y};try{let x=String(e),w={...r||{}};c&&await b(x);for(let y=0;y<=Uh;y+=1){let k=await h(x,{method:n,headers:w,body:o,signal:p.signal,redirect:"manual"});if(P_.has(k.status)){if(n!=="GET"&&n!=="HEAD"){let N=await qh(k,l??T_,{url:x,truncate:!0}),A=new Error(`HTTP ${k.status} ${n} ${x} redirected non-idempotent request`);throw A.status=k.status,A.body=Dh(N)??N.slice(0,300),A}if(y===Uh)throw Ho(k),new Error(`HTTP redirect loop for ${e}`);let E=k.headers?.get?.("location"),_;try{_=O_(E,x)}catch(N){throw Ho(k),N}let T=!R_(_,x);if(Ho(k),T&&(w=C_(w)),c)await b(_,{status:k.status});else if(T){let N=await _l(_,g);if(!N.ok){let A=new Error(`HTTP redirect from ${x} ${N.error}`);throw A.status=k.status,A.retryable=!1,A}s&&N.addresses?.length&&(f||(f=await Pl(u?{importUndici:u}:{})),f&&(f.pin(new URL(_).hostname,N.addresses),h=f.fetch))}x=_;continue}if(typeof d=="function")try{await d(k,{url:x})}catch(E){throw Ho(k),Do(E?.message||String(E))}let v=await qh(k,l,{url:x,onOversize:()=>p.abort()}),S=Dh(v);if(!k.ok){let E=new Error(`HTTP ${k.status} ${n} ${x}`);throw E.status=k.status,E.retryAfter=k.headers?.get?.("retry-after")??null,E.body=S??v.slice(0,300),E}return S??v}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),f&&await f.close()}}async function I(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):__,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,m=Number(t.maxResponseBytes),f=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let y;for(let k=0;k<=s;k++)try{return await F_(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:f,importUndici:d,validateResponse:p})}catch(v){y=v;let S=v?.status,E=v?.name==="AbortError",_=new Set([408,425,429]),T=v?.retryable===!1?!1:S!=null?_.has(S)||A_.has(S)&&Mh.has(o):!E&&Mh.has(o);if(k===s||!T)throw v;await B_($_(k,v?.retryAfter))}throw y};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let b=L_(o,e,i,{untrustedUrl:u,maxResponseBytes:f}),x=Cl.get(b);if(x)return x;let w=h().finally(()=>Cl.delete(b));return Cl.set(b,w),w}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 rt(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 A_,Mh,__,Fh,Hh,P_,Uh,T_,Cl,B_,j=Y(()=>{Bh();A_=new Set([408,425,429,500,502,503,504]),Mh=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),__=2,Fh=4e3,Hh=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],P_=new Set([301,302,303,307,308]),Uh=3,T_=64*1024;Cl=new Map;B_=e=>new Promise(t=>setTimeout(t,e))});function Ll(e){return jh.get(Number(e))||null}function zh(e,t=process.env){let n=Ll(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Vh(e){return jh.has(Number(e))}var Rl,jh,Wh=Y(()=>{Rl={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}},jh=new Map(Object.values(Rl).map(e=>[e.chainId,e]))});var Da={};Ut(Da,{PUBLIC_RPC_FALLBACKS:()=>Bl,erc20Allowance:()=>ql,erc20BalanceOf:()=>zo,resolveRpcUrl:()=>Ml,rpcBlockNumber:()=>jo,rpcCall:()=>V,rpcChainId:()=>Fl,rpcGasPrice:()=>Ul,rpcGetBalance:()=>Zn,rpcHealth:()=>Lr,rpcHealthAll:()=>Dl,transactionReceipt:()=>Vo});import{Interface as U_,getAddress as q_}from"ethers";function yn(e,t){try{return q_(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function D_(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 $l(e){return e==null?null:Number.parseInt(String(e),16)}function Ml(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=zh(e,n);return r||Bl[Number(e)]||null}function j_(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!H_.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||"");j_(o);let i=Ml(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 I(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function Lr(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:Ll(e)?.name||null}}async function jo(e,t={}){let n=await V(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Fl(e,t={}){let n=await V(e,"eth_chainId",[],t);return parseInt(n,16)}async function Ul(e,t={}){let n=await V(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Zn(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 ql(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=yn(e.token||e.tokenAddress,"token"),o=yn(e.owner,"owner"),i=yn(e.spender,"spender"),a=qa.encodeFunctionData("allowance",[o,i]),s=await V(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=qa.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 zo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=yn(e.token||e.tokenAddress,"token"),o=yn(e.account||e.owner||e.address,"account"),i=qa.encodeFunctionData("balanceOf",[o]),a=await V(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=qa.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 Vo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=D_(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=$l(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?yn(e.expectedTo,"expectedTo"):null,u=o.to?yn(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?yn(o.from,"receipt.from"):null,blockNumber:$l(o.blockNumber),transactionIndex:$l(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Dl(e={}){let t=e.chainIds||Object.values(Rl).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Vh(r)&&!Bl[r]&&!Ml(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Lr(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var qa,Bl,H_,_e=Y(()=>{j();Wh();qa=new U_(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Bl={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"};H_=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function Gh(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Hl(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),a=String(r||"").toLowerCase(),s=(t||[]).map((c,l)=>{let u=Gh(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)||z_.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 Kh(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Gh(e,n[0]).address||null}var z_,jl=Y(()=>{z_=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function K_(e,t,n){let r=Pt(t),o=Pt(n),i=Pt(e?.baseToken?.address),a=Pt(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function Y_(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ha(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||V_).replace(/\/$/,"")}async function Yh(e={}){let n=(await I(`${Ha(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function er(e,t={}){if(!e)throw new Error("tokenAddress required");return I(`${Ha(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Wo(e,t={}){if(!e)throw new Error("query required");return I(`${Ha(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Jh(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return I(`${Ha(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function Xh({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Go({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Go({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Pt(W_[Number(e)]||e),a=new Set(G_(r).filter(Boolean).map(Pt)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>er(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=`${Pt(m?.chainId)}:${Pt(m?.dexId)}:${Pt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>Pt(p?.chainId)===i).filter(p=>K_(p,t,n)).filter(p=>!a.size||a.has(Pt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Y_(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}var V_,W_,Pt,G_,$r=Y(()=>{j();jl();V_="https://api.dexscreener.com",W_=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Pt=e=>String(e??"").toLowerCase(),G_=e=>Array.isArray(e)?e:e==null?[]:[e]});import{readFileSync as X_}from"node:fs";import{homedir as Q_}from"node:os";import{join as ja}from"node:path";function Z_(){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=Q_();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||ja(t,".config","oracle")).trim();return[e,ja(n,"exec.env")].filter(Boolean)}return[e,ja(t,".config","oracle","exec.env"),ja(t,".config","mad-desk","exec.env")].filter(Boolean)}function Qh(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Z_())try{let i=X_(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 Zh=Y(()=>{});var e0=Y(()=>{});import{createHash as eP,createHmac as n0,timingSafeEqual as tP}from"node:crypto";function Va(e){return Array.isArray(e)?`[${e.map(Va).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Va(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function r0(e,{required:t=!1}={}){try{return Qh(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function Vl(e){let{signature:t,...n}=e;return n}function o0(e,{secret:t}={}){let n=r0(t);return n?{...e,signature:n0("sha256",n).update(Va(Vl(e))).digest("hex")}:e}function nP(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 eP("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=r0(o);if(i){let m=n0("sha256",i).update(Va(Vl(e))).digest("hex");if(!rP(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=iP(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 o0({...Vl(e),calldataHash:nP(r)},{secret:o})}function rP(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:tP(n,r)}function zl(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function oP(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 ot({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=zl(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(zl(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,zl(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=oP(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function Wl({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=t0,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=ot({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)||t0)),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 o0({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 iP(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 de(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=Wl({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,t0,Ye=Y(()=>{Zh();e0();za=100,t0=2e4});import{createHash as aP,createHmac as sP,timingSafeEqual as l3}from"node:crypto";function Gl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Gl).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Gl(e[n])}`).join(",")}}`}function i0(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function a0(e=process.env){return i0(process.env)||i0(e)}function uP(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function tr(e){let t=uP(e);return aP("sha256").update(Gl(t)).digest("hex")}function dP(e,t=a0()){return t?sP("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+Kl:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>lP)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:cP},m=tr(p),f=a0(r),h=f?dP(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var cP,Kl,lP,ie=Y(()=>{cP=2,Kl=300*1e3,lP=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var tu={};Ut(tu,{PANCAKE_FEE_TIERS:()=>Wa,UNI_V3_CHAINS:()=>Fe,UNI_V3_FEE_TIERS:()=>u0,UNI_V3_VENUES:()=>m0,uniV3Chains:()=>eu,uniV3EthUsdc:()=>Ka,uniV3Health:()=>Zl,uniV3PrepareExactIn:()=>Ql,uniV3QuoteExactIn:()=>Xt,uniV3QuoteExactInPath:()=>Xl});import{Interface as c0,getAddress as Ko,isAddress as l0}from"ethers";function Jl(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=m0[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 Yl(e,t){let n=Fe[Number(t)];if(!e||e===d0||e===p0||/^eth$/i.test(String(e)))return Ko(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ko(n.weth);if(/^usdc$/i.test(r))return Ko(n.usdc);if(!l0(r))throw new Error(`invalid token address: ${e}`);return Ko(r)}function mP(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 fP(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 Xt(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Jl(e.chainId??8453,e.venue),a=Yl(e.tokenIn||"WETH",n),s=Yl(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:u0,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 S=Ga.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:v,sqrtPriceLimitX96:0n}]);try{let E=await V(n,"eth_call",[{to:r,data:S},"latest"],t);if(!E||E==="0x"){d.push({fee:v,ok:!1,error:"empty result"});continue}let _=Ga.decodeFunctionResult("quoteExactInputSingle",E),T={fee:v,ok:!0,amountOut:_[0].toString(),sqrtPriceX96After:_[1].toString(),initializedTicksCrossed:Number(_[2]),gasEstimate:_[3].toString()};d.push(T),(!p||BigInt(T.amountOut)>BigInt(p.amountOut))&&(p=T)}catch(E){d.push({fee:v,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let v=d.map(S=>`${S.fee}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${v}`)}let m=e.liquidityUsd==null?await Go({chainId:n,tokenA:a,tokenB:s,dexIds:mP(e.venue)},t).catch(()=>[]):[],f={};for(let v of m.slice(0,8))if(!(!v.pairAddress||!l0(v.pairAddress)))try{let S=await V(n,"eth_call",[{to:v.pairAddress,data:pP},"latest"],t),E=S&&S!=="0x"&&S.length<=66?Number.parseInt(S,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((_,T)=>f[T.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,x=m[0]??null,w=b??x,y=e.liquidityUsd??b?.liquidityUsd??x?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":b?"pool":x?"pair":null;return de({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 Xl(e={},t={}){let{chainId:n,quoter:r,router:o}=Jl(e.chainId??8453),i=(e.tokens||[]).map(p=>Yl(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=fP(i,a),l=Ga.encodeFunctionData("quoteExactInput",[c,s]),u=await V(n,"eth_call",[{to:r,data:l},"latest"],t),d=Ga.decodeFunctionResult("quoteExactInput",u);return de({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 Ka(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Xt({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 Ql(e={},t={}){let n=Number(e.chainId??8453),r=Jl(n,e.venue),o=Ko(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===d0||i===p0||/^eth$/i.test(i),s=await Xt(e,t),c=s0.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=s0.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 Zl(e={}){let t=Number(e.chainId??8453);try{let n=await Ka({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 eu(){return Object.entries(Fe).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var Fe,u0,pP,Ga,s0,d0,p0,Wa,m0,nr=Y(()=>{_e();$r();Ye();ie();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"}},u0=[100,500,3e3,1e4],pP="0xddca3f43",Ga=new c0(["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)"]),s0=new c0(["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)"]),d0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",p0="0x0000000000000000000000000000000000000000",Wa=[100,500,2500,1e4],m0={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Wa}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Wa}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Wa}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var mu={};Ut(mu,{UNI_V4_CHAINS:()=>lt,UNI_V4_FEE_TIERS:()=>ou,computeV4PoolId:()=>Xa,decodeV4HookPermissions:()=>au,uniV4Chains:()=>du,uniV4Health:()=>pu,uniV4InspectHook:()=>cu,uniV4PrepareExactIn:()=>uu,uniV4QuoteExactIn:()=>wn,uniV4QuoteExactOut:()=>lu});import{AbiCoder as hP,Interface as nu,getAddress as qt,isAddress as ru,keccak256 as gP}from"ethers";function au(e){let t=Qo(e),n=Number(BigInt(t)&wP),r=Object.fromEntries(f0.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(f0.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}function Xo(e){let t=Number(e),n=lt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(lt).join(", ")})`);return{chainId:t,...n}}function Qo(e){if(e==null||e==="")return Je;let t=String(e);if(!ru(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return qt(t)}function Br(e,t){let n=lt[Number(t)];if(Jo(e))return qt(n.weth);let r=String(e);if(/^weth$/i.test(r))return qt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return qt(n.usdc);if(!ru(r))throw new Error(`invalid token address: ${e}`);return qt(r)}function Jo(e){let t=String(e||"").trim().toLowerCase();return!t||t===kP.toLowerCase()||t===Je.toLowerCase()||t==="eth"}function Xa({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Je}){let i=qt(e),a=qt(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=Qo(o);return gP(Yo.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function su({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Je}){let i=qt(e),a=qt(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:Qo(o)},zeroForOne:l}}function vP({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=au(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 cu(e={},t={}){let n=Xo(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Br(e.tokenIn||"WETH",n.chainId),o=Br(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=Qo(e.hooks),{poolKey:c}=su({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=Xa(c),u=t.rpcCall||V,d=Ya.encodeFunctionData("getSlot0",[l]),p=Ya.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=Ya.decodeFunctionResult("getSlot0",m),b=Ya.decodeFunctionResult("getLiquidity",f)[0],x=g[0],w=x>0n,y=s===Je?null:typeof h=="string"&&h!=="0x"&&h.length>4,k=!!(i&iu),v=vP({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:x.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:au(s)}),risk:v})}async function wn(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Xo(e.chainId??8453),a=Br(e.tokenIn||"WETH",n),s=Br(e.tokenOut||lt[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}]:[...ou],u=e.hooks||Je,d=[],p=null;for(let S of l){let{poolKey:E,zeroForOne:_}=su({tokenIn:a,tokenOut:s,fee:S.fee,tickSpacing:S.tickSpacing,hooks:u}),T=Ja.encodeFunctionData("quoteExactInputSingle",[{poolKey:E,zeroForOne:_,exactAmount:c,hookData:"0x"}]);try{let N=await(t.rpcCall||V)(n,"eth_call",[{to:r,data:T},"latest"],t);if(!N||N==="0x"){d.push({...S,ok:!1,error:"empty result"});continue}let A=Ja.decodeFunctionResult("quoteExactInputSingle",N),M={fee:S.fee,tickSpacing:S.tickSpacing,ok:!0,amountOut:A[0].toString(),gasEstimate:A[1].toString(),poolKey:E,zeroForOne:_,poolId:Xa({...E})};d.push(M),(!p||BigInt(M.amountOut)>BigInt(p.amountOut))&&(p=M)}catch(N){d.push({...S,ok:!1,error:String(N.message||N).slice(0,160)})}}if(!p){let S=d.map(E=>`${E.fee}/${E.tickSpacing}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${S}`)}let m=e.liquidityUsd==null?await Go({chainId:n,tokenA:a,tokenB:s,dexIds:h0},t).catch(()=>[]):[],f=new Map;for(let S of m){let E=String(S.pairAddress||"").toLowerCase();E&&f.set(E,S)}let h=S=>f.get(String(S.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 S=BigInt(p.amountOut),_=d.filter(T=>T.ok&&Number((S-BigInt(T.amountOut))*10000n/S)<=g).filter(T=>h(T)?.liquidityUsd!=null).sort((T,N)=>h(N).liquidityUsd-h(T).liquidityUsd)[0];_&&_.poolId!==p.poolId&&(b={priceBestFee:p.fee,chosenFee:_.fee,chosenPoolUsd:h(_).liquidityUsd,bandBps:g},p=_)}let x=h(p),w=m[0]??null,y=x??w,k=e.liquidityUsd??x?.liquidityUsd??w?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":x?"pool":w?"pair":null;return de({venue:"uniswap-v4",chainId:n,chain:lt[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"&&ru(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&&!Jo(e.tokenIn)&&!Jo(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Je&&!(p.fee&iu)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:k,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function lu(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Xo(e.chainId??8453),a=Br(e.tokenIn||"WETH",n),s=Br(e.tokenOut||lt[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}]:[...ou],u=e.hooks||Je,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=su({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),b=Ja.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||V)(n,"eth_call",[{to:r,data:b},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let w=Ja.decodeFunctionResult("quoteExactOutputSingle",x),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:h,zeroForOne:g,poolId:Xa({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await Xh({chainId:n,tokenA:a,tokenB:s,dexIds:h0},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:lt[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 uu(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=Xo(r);if(Qo(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)&iu)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=qt(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(Jo(e.tokenIn)||Jo(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await wn(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let u=BigInt(l.amountOut)*BigInt(1e4-s)/10000n,d={currency0:l.zeroForOne?l.tokenIn:l.tokenOut,currency1:l.zeroForOne?l.tokenOut:l.tokenIn,fee:l.fee,tickSpacing:l.tickSpacing,hooks:l.hooks},m=Yo.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,l.zeroForOne,BigInt(l.amountIn),u,0n,"0x"]]),f=Yo.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=Yo.encode(["address","uint256"],[l.tokenOut,u]),g=Yo.encode(["bytes","bytes[]"],[xP,[m,f,h]]),x=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,w=yP.encodeFunctionData("execute",[bP,[g],x]);return $({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:x,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:SP,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 du(){return Object.entries(lt).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 pu(e={}){let t=Xo(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 Yo,Je,lt,ou,Ja,yP,Ya,f0,wP,iu,bP,xP,SP,kP,h0,Mr=Y(()=>{_e();$r();Ye();ie();Yo=hP.defaultAbiCoder(),Je="0x0000000000000000000000000000000000000000",lt={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"}},ou=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Ja=new nu(["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)"]),yP=new nu(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Ya=new nu(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),f0=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"]]),wP=(1n<<14n)-1n,iu=8388608;bP="0x10",xP="0x060c0f",SP="0x000000000022D473030F116dDEE9F6B43aC78BA3",kP="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";h0=["uniswap-v4","uniswapv4"]});function ut({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[g0]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${g0}=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 it(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 g0,bn=Y(()=>{g0="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});function vT({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"?kT:ST}async function be(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=vT(t);return I(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Z0(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 Zt(e={}){return be({type:"allMids"},e)}async function Dr(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return be({type:"l2Book",coin:String(e)},t)}async function li(e={}){return be({type:"outcomeMeta"},e)}async function ds(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return be({type:"spotClearinghouseState",user:e},t)}async function eg(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return be({type:"userFills",user:e},t)}async function ps(e={}){return be({type:"meta"},e)}async function wt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),be(t,e)}async function Hr({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 ms({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 tg(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return be({type:"openOrders",user:e},t)}async function ng(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return be({type:"frontendOpenOrders",user:e},t)}async function jr(e,t={}){if(!e)throw new Error("hlUserState requires user");return be({type:"clearinghouseState",user:e},t)}async function fs(e={}){return be({type:"spotMeta"},e)}var ST,kT,pt=Y(()=>{j();ST="https://api.hyperliquid.xyz/info",kT="https://api.hyperliquid-testnet.xyz/info"});async function ug(e={}){let t=Date.now();if(fi.dexs&&t-fi.at<6e4&&!e.fetchImpl)return fi.dexs;let n=await be({type:"perpDexs"},e);return fi={at:t,dexs:Array.isArray(n)?n:[]},fi.dexs}async function dg(e="",t={}){let n=e||"",r=Date.now(),o=lg.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await be({type:"metaAndAssetCtxs",dex:e},t):await wt(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return lg.set(n,c),c}function vn(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=pg+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function kn(e,t){let n=ju(e),r=ju(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=pg+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 ju(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 zu(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:vn(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:kn(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:RT(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=kn(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 ug(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 dg(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 x=OT+m*1e4+g,w=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:x,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:w.markPx??null}}let{universe:r,ctxs:o}=await dg("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await ug(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 zu({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 RT(e,t){let n=ju(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var pg,OT,fi,lg,xs=Y(()=>{pt();pg=1e8,OT=1e5,fi={at:0,dexs:null},lg=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 bt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function cr(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 xt(e,t="amount"){let n=cr(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 zr=Y(()=>{});function FT(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 mg(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 Dt(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(r=>Dt(r,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Dt(e[r],t)}`).join(",")}}`}function UT(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,n=e.orderWire;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("hl: declared order wire required");if(t==="limit"){let i=n.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||Dt(n,"declared order type")!==Dt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(Dt(n,"declared order type")!==Dt({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let r={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!r)throw new Error("hl: unsupported declared order type");let o=n.trigger?.triggerPx;if(o==null||Dt(n,"declared order type")!==Dt({trigger:{isMarket:r.isMarket,triggerPx:o,tpsl:r.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function qT(e,t,n){let r=mg(e.s,"signed size"),o=mg(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 DT(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=En(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(bt(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=cr(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 fg(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(Dt(e.t,"signed order type")!==Dt(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let r=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(r)throw new Error("hl: undeclared signed client order id")}else if(!r||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function hg(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 HT(e){let t=String(e||"").replace(/\/$/,"");if(!LT.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Vu(e){return vn(e)!=null}function jT(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(Vu(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 zT(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(Vu(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 gg(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=En(n.kind,"kind",48),o=BT[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=HT(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!==MT[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if($T.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=En(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=vn(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(jT(c,t),zT(c,l,t),r==="hip4-order"&&!Vu(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");UT(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");fg(u[0],n,l);let f=1;d!=null&&hg(u[f++],n,l,d,"tp"),p!=null&&hg(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");fg(u[0],n,l)}qT(u[0],n,t),DT(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=En(n.usd,"margin usd",64),d=Be(u,6,"hl: margin usd");if(cr(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=FT(f,6)}}if(r==="builder-fee-approval"){let c=En(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(En(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=En(n.maxFeeRate,"maxFeeRate",32);if(En(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 LT,$T,BT,MT,En,yg=Y(()=>{zr();xs();LT=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),$T=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),BT=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"}),MT=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"}),En=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function WT(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 Ss(e,t={},n={}){let r=String(e?.kind||""),o=VT[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:WT(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 gg(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 VT,Wu=Y(()=>{yg();VT=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 GT,JsonRpcProvider as KT}from"ethers";function eN(e){return ZT.test(String(e||""))}async function ks(e,{contract:t=YT,rpc:n=XT,chainId:r=JT,balanceOf:o}={}){if(!eN(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new KT(n,r,{staticNetwork:!0}),a=new GT(t,QT,i);return BigInt(await a.balanceOf(e))}var YT,JT,XT,QT,ZT,Gu=Y(()=>{YT="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",JT=999,XT="https://rpc.hyperliquid.xyz/evm",QT=["function balanceOf(address owner) view returns (uint256)"],ZT=/^0x[a-fA-F0-9]{40}$/});import{existsSync as tN,readFileSync as nN,lstatSync as rN}from"node:fs";import{homedir as wg}from"node:os";import{join as Ku}from"node:path";function aN(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(bg,t)?bg[t]:iN}function dN(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[xg])return String(e[xg]);let t=e.ORACLE_CONFIG_DIR||Ku(wg(),".config","oracle");return Ku(t,"fee-recipient")}return Ku(wg(),".config","oracle","fee-recipient")}function Yu(e=process.env){try{let t=dN(e);if(!tN(t)||rN(t).isSymbolicLink())return"";let n=nN(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function pN(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),oN)}function mN({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[cN]||"").trim(),o=String(e[lN]||uN).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=aN(t),a=pN(e[sN],{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=Yu(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 vs({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=mN({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let a=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(a))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await ks(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Sg(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 kg(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function vg(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var oN,iN,bg,sN,cN,lN,xg,uN,hi=Y(()=>{Gu();oN=100,iN=5,bg=Object.freeze({swap:5,bridge:5,perps:0,nft:0});sN="ORACLE_INTEGRATOR_FEE_BPS",cN="ORACLE_INTEGRATOR_FEE_RECIPIENT",lN="ORACLE_INTEGRATOR_ID",xg="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",uN="oracle"});var ad={};Ut(ad,{HL_BUILDER_ADDRESS_ENV:()=>Es,HL_BUILDER_DEFAULT_FEE_BPS:()=>fN,HL_BUILDER_FEE_ENV:()=>Xu,HL_BUILDER_FEE_TIERS:()=>gi,HL_BUILDER_MAX_FEE_BPS:()=>Ju,HL_PERP_MAX_SIG_FIGS:()=>Eg,HL_PERP_PRICE_DECIMALS:()=>Ig,HL_SIGNATURE_CHAIN_ID:()=>Zu,MARGIN_MODE:()=>yi,ORDER_TYPES:()=>st,TIF:()=>wi,formatPerpPrice:()=>tn,formatPerpSize:()=>Tg,hlBuilderFeeBpsForKind:()=>Pg,hlPerpAssetInfo:()=>In,hlPrepareBracketOrder:()=>id,hlPrepareBuilderApproval:()=>nd,hlPrepareCancelOrder:()=>bi,hlPreparePerpOrder:()=>Gr,hlPrepareUpdateIsolatedMargin:()=>od,hlPrepareUpdateLeverage:()=>rd,resolveBuilderFee:()=>ed});function Ag(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 hN(e,t){let n=Ag(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function gN(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 _g(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 Pg(e="perp"){if(e==="perp"||e==="main")return gi.perp;if(e==="spot")return gi.spot;if(e==="hip3")return gi.hip3;if(e==="outcome"||e==="hip4")return gi.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function ed({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Es]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Es} must be an EVM address`);let o=Yu(e);if(!o||o!==r)return null;let i=e?.[Xu],a=Pg(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: ${Xu} must be a positive number in 0.1 bps increments`);if(s>Ju)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${Ju} 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 yN(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 wN(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||ks;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function td(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 bN(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 td(r,a,n)}function tn(e,t,n={}){let r=Ig-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return td(bN(e,Eg,n),r,n)}function Tg(e,t){let n=td(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 xN(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 In(e={},t={}){let n=await zu(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 Qu(e,{tif:t=wi.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case st.LIMIT:return{limit:{tif:t}};case st.MARKET:return{limit:{tif:wi.IOC}};case st.STOP_MARKET:case st.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:tn(n,o),tpsl:e===st.STOP_MARKET?"sl":"tp"}};case st.STOP_LIMIT:case st.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:tn(n,o),tpsl:e===st.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Vr(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Zu,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 Wr(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=Ss(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 nd(e={},t={}){let n=ed({env:t.env});if(!n)throw new Error(`hl-perps: ${Es} 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:Zu,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Wr({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Vr(o,r,t)},e,t)}async function Gr(e={},t={}){let n=await In(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??st.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=_g(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=Tg(e.size??e.sz,n.szDecimals),s;if(r===st.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let v=await Zt(t);x=Number(v?.[n.coin]??v?.[String(n.assetId)]??NaN)}if(!Number.isFinite(x))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?x*(1+w/1e4):x*(1-w/1e4);s=tn(y,n.szDecimals,{roundDown:o});let k=Math.abs(Number(s)/x-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=tn(e.price??e.limitPx,n.szDecimals)}let c=Qu(r,{tif:e.tif??(r===st.MARKET?wi.IOC:wi.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=ed({env:t.env,kind:n.kind}),p=await wN(d,e,t),m=p.exempt?null:d,f=await yN(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),b=xN(a,s);return Wr({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,...Vr(u,g,t)},e,t)}async function bi(e={},t={}){let n=await In(gN(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=Ag(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Wr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Vr(i,Number(e.nonce??Date.now()),t)},e,t)}async function rd(e={},t={}){let n=await In(e,t),r=hN(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||yi.CROSS).toLowerCase();if(o!==yi.CROSS&&o!==yi.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===yi.CROSS,leverage:r};return Wr({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,...Vr(i,Number(e.nonce??Date.now()),t)},e,t)}async function od(e={},t={}){let n=await In(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=_g(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Wr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Vr(s,Number(e.nonce??Date.now()),t)},e,t)}async function id(e={},t={}){let n=await Gr(e,t),r=await In(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:tn(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:Qu(st.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:tn(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:Qu(st.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 Wr({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:tn(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:tn(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Vr(a,Number(e.nonce??Date.now()),t)},e,t)}var Eg,Ig,Zu,fN,Ju,Es,Xu,gi,st,wi,yi,Is=Y(()=>{pt();xs();zr();ie();Wu();Gu();hi();Eg=5,Ig=6,Zu="0x66eee",fN=2,Ju=10,Es="ORACLE_HL_BUILDER_ADDRESS",Xu="ORACLE_HL_BUILDER_FEE_BPS",gi=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),st=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),wi=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),yi=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function Pd(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Pn}var Pn,Fs=Y(()=>{Pn="0x000000000000000000000000000000000000dEaD"});var Ld={};Ut(Ld,{LIFI_API:()=>zy,lifiChains:()=>Rd,lifiHealth:()=>Cd,lifiPrepare:()=>Od,lifiQuote:()=>Tn});function Nd(e={}){return(e.baseUrl||process.env.LIFI_API_URL||zy).replace(/\/$/,"")}function _C(e){let t=String(e||Td).toLowerCase();return t===Td.toLowerCase()||t===AC}function jy(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 Cd(e={}){let t=await I(`${Nd(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 Tn(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Td,toToken:i,fromAmount:a,fromAddress:s=Pn}=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=ot({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 vs({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(kg(u)))c.set(g,b);let d=await I(`${Nd(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=de(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 Od(e={},t={}){let n=await Tn(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(!_C(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:jy(s,"approval token"),spender:jy(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 Rd(e={}){return I(`${Nd(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var zy,Td,AC,Ii=Y(()=>{j();Ye();Fs();ie();hi();zy="https://li.quest/v1";Td="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",AC="0x0000000000000000000000000000000000000000"});var Md={};Ut(Md,{ZEROX_API:()=>ew,zeroxHealth:()=>$d,zeroxPrepare:()=>Bd,zeroxPrice:()=>Ds,zeroxQuote:()=>Cn});function tw(e={}){return ut({provider:"zerox",defaultUrl:ew,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function nw(e={}){return tw(e).baseUrl}function qs(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function rw(e={}){return it({"0x-version":"v2",accept:"application/json"},{"0x-api-key":qs(e)},tw(e).trusted)}async function $d(e={}){if(!qs(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Ds({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 Ds(e={},t={}){if(!qs(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),I(`${nw(t)}/swap/allowance-holder/price?${s}`,{headers:rw(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Cn(e={},t={}){if(!qs(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=ot({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 I(`${nw(t)}/swap/allowance-holder/quote?${c}`,{headers:rw(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?de(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 Bd(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Cn(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 ew,_i=Y(()=>{j();Ye();bn();ie();ew="https://api.0x.org"});async function ow(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Fd({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 Fd(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||OC).replace(/\/$/,"");return I(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function iw(e={}){try{let t=await Ud({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 Ud(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=ot({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||RC).replace(/\/$/,""),u=await I(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?de(u,{chainId:Number(e.originChainId||e.chainId||$C[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 aw(e={}){try{let t=await Hs({user:Pn,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 Hs(e={},t={}){let{user:n=Pn,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=ot({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||LC).replace(/\/$/,""),d=await I(`${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}:de(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 sw(e={},t={}){let n=await Hs(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 OC,RC,LC,$C,cw=Y(()=>{j();Ye();Fs();ie();OC="https://across.to/api",RC="https://api.hop.exchange/v1",LC="https://api.relay.link",$C={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function qd(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function lw(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}var x8,js=Y(()=>{x8=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Gd={};Ut(Gd,{COW_CANCEL_TYPES:()=>fw,COW_HOSTS:()=>Hd,COW_ORDER_TYPES:()=>zs,COW_SETTLEMENT:()=>dw,COW_VAULT_RELAYER:()=>pw,cowCancelOrders:()=>WC,cowChains:()=>Wd,cowHealth:()=>zd,cowOrder:()=>Gs,cowOrderStatus:()=>Ws,cowOrderUid:()=>DC,cowPrepareCancel:()=>zC,cowPrepareOrder:()=>Vd,cowQuote:()=>on,cowSignCancel:()=>VC,cowSignOrder:()=>HC,cowSubmitSignedOrder:()=>jC,cowVerifyOrderFill:()=>KC});import{TypedDataEncoder as uw,getAddress as Pi,isAddress as MC}from"ethers";function Vs(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Hd[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function FC(e,t="v1",n={}){let r=Vs(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function On(e,t){let n=String(e||"").trim();if(!MC(n))throw new Error(`cowswap: ${t} must be an address`);return Pi(n).toLowerCase()}function Qr(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 hw(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 gw(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 UC({digest:e,owner:t,validTo:n}={}){let r=hw(e,"order digest").slice(2),o=On(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 jd(e){let t=dw[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:Pi(t)}}function qC(e={},t,n){let r=On(e.sellToken,"sellToken"),o=On(e.buyToken,"buyToken"),i=On(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=hw(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Qr(e.sellAmount,"sellAmount"),buyAmount:Qr(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:Qr(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function zd(e={}){try{let t=await on({chainId:1,sellToken:Dd[1],buyToken:mw[1],sellAmountBeforeFee:"1000000000000000",from:Pn},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 on(e={},t={}){let n=Number(e.chainId??1),r=Pd(e.from||e.owner),o=e.sellToken||Dd[n],i=e.buyToken||mw[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=Dd[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 I(`${Vs(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?de(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Vd(e={},t={}){let n=Number(e.chainId??1),r=On(Pd(e.from||e.owner||e.signer),"owner"),o=await on({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=qC(o?.quote||o,n,r),a=jd(n),s={domain:a,types:zs,primaryType:"Order",message:i},c=uw.hash(a,zs,i),l=pw[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:Pi(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:Pi(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:Pi(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Ws(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return I(`${Vs(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gs(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return I(`${Vs(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function DC(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||uw.hash(jd(n),zs,r),i=e.owner||e.from||e.signer||r.receiver;return UC({digest:o,owner:i,validTo:r.validTo})}async function HC(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 jC(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 zC(e={}){let t=Number(e.chainId??1),n=On(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((a,s)=>gw(a,`orderUids[${s}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=jd(t);return $({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:fw,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function VC(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function WC(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function GC(e={}){return Qr(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function KC(e={},t={}){let n=Number(e.chainId??1),r=gw(e.uid||e.orderUid),o=t.order||await Gs({chainId:n,uid:r},t),i=t.status||o.status||await Ws({chainId:n,uid:r},t).catch(()=>null),a=t.trades||await I(`${FC(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=Array.isArray(a)?a:[],c=e.expectedOwner?On(e.expectedOwner,"expectedOwner"):null;if(c&&On(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(GC(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(Qr(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(Qr(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 Wd(){return Object.keys(Hd).map(Number)}var Hd,dw,pw,Dd,mw,zs,fw,Ti=Y(()=>{j();Ye();js();Fs();ie();Hd={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"},dw=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),pw=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Dd={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},mw={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},zs=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"}]}),fw=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{existsSync as aS,readFileSync as sS}from"node:fs";import{dirname as iS,join as bc}from"node:path";import{fileURLToPath as hL}from"node:url";function cS(e){let t=iS(hL(e));for(let n=0;n<8;n+=1){let r=bc(t,"package.json");if(aS(r))try{let i=JSON.parse(sS(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=iS(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function lS(e){return JSON.parse(sS(bc(cS(e),"package.json"),"utf8"))}function xc(e,t){let n=cS(t),r=bc(n,e);return aS(r)?r:bc(n,"dist","assets",e)}var Sc=Y(()=>{});import{isAddress as gL}from"ethers";function wL(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:uS,tag:`v${uS}`}),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 kc(e){let t=yr[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Qi(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Zi(e,t){let n=String(e||"");if(!gL(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function dS(e,t){let n=kc(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");Qi(i,"safe-erc20: supply"),Zi(a,"safe-erc20: initialHolder"),Zi(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(Qi(i,"safe-erc721-drop: cap"),Zi(a,"safe-erc721-drop: treasury"),Qi(s,"safe-erc721-drop: mintPrice"),Qi(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Zi(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Zi(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`)}Qi(i,"safe-vesting: durationSeconds")}return n}function pS(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var uS,yL,yr,vc=Y(()=>{uS="5.0.2",yL={"safe-erc20":{contractName:"SafeERC20",source:"src/SafeERC20.sol",constructor:["string name","string symbol","uint256 initialSupply","address initialHolder","address initialOwner"],authority:["initialOwner may pause transfers and use Ownable2Step"],monitor:["OwnershipTransferStarted","OwnershipTransferred","Paused","Unpaused","Transfer"]},"safe-erc721-drop":{contractName:"SafeERC721Drop",source:"src/SafeERC721Drop.sol",constructor:["string name","string symbol","uint256 cap","address treasury","uint256 mintPrice","uint256 perWalletCap","address initialOwner"],authority:["initialOwner may withdraw the full balance to immutable treasury","no mint, proxy, upgrade, or delegatecall authority"],monitor:["Transfer","OwnershipTransferred","Withdrawal"]},"safe-vesting":{contractName:"SafeVesting",source:"src/SafeVesting.sol",constructor:["address beneficiary","uint64 startTimestamp","uint64 durationSeconds"],authority:["beneficiary is the immutable OpenZeppelin owner/recipient identity","ownership transfer and renunciation are disabled","no separate administrator, proxy, upgrade, or delegatecall authority"],monitor:["EtherReleased","ERC20Released"]}};yr=Object.freeze(Object.fromEntries(Object.entries(yL).map(([e,t])=>[e,wL(e,t)])))});import{spawnSync as qp}from"node:child_process";import{existsSync as wr,readFileSync as Ec,readdirSync as mS,statSync as fS}from"node:fs";import{join as zt}from"node:path";import{createHash as bL}from"node:crypto";function Ac(){return wr(ea)?mS(ea).filter(e=>yr[e]&&fS(zt(ea,e)).isDirectory()).map(e=>{let t=zt(ea,e),n=zt(t,"SECURITY.md");return{id:e,path:t,metadata:kc(e),securityNotice:wr(n)?Ec(n,"utf8").slice(0,500):null,disclaimer:Ic}}):[]}function hS(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",zt(e,".foundry/bin/forge")];for(let n of t)if(qp(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function xL(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:qp("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function ho(e,t,n){let r=qp(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 SL(e){let t=bL("sha256");function n(r){let o=fS(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of mS(r).sort())n(zt(r,i))}else o.isFile()&&(r.endsWith(".sol")||r.endsWith(".toml")||r.endsWith(".md")||r.endsWith(".txt"))&&(t.update(r.slice(e.length)),t.update(Ec(r)))}return n(e),t.digest("hex")}function ta(e,t={}){let n=kc(e),r=t.allowSkipStatic!==!1,o=zt(ea,e);if(!wr(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=hS();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(!wr(zt(o,"lib","forge-std"))){let m=ho(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
4
|
+
${m.stderr}`)}if(!wr(zt(o,"lib","openzeppelin-contracts"))){let m=ho(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
5
|
+
${m.stderr}`)}let a=zt(o,"lib","openzeppelin-contracts","package.json"),s=wr(a)?JSON.parse(Ec(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=ho(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
6
|
+
${c.stderr}`.slice(0,2e3));let l=ho(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
|
|
7
7
|
${l.stdout}
|
|
8
|
-
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=
|
|
8
|
+
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=xL();if(d){let m=ho(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
|
|
9
9
|
${m.stdout}
|
|
10
|
-
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=
|
|
11
|
-
${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=
|
|
10
|
+
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=SL(o);return{ok:!0,templateId:e,metadata:n,path:o,forgeTests:{ok:!0,tool:"forge",summary:"forge test passed"},forgeBuild:{ok:!0,tool:"forge",summary:"forge build passed"},staticAnalysis:u,sourceHash:p,disclaimer:Ic,firmAudit:!1}}function gS(e,t={}){let n=ta(e,t),r=hS(),o=n.path,i=ho(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
|
|
11
|
+
${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=zt(o,"out",`${a}.sol`,`${a}.json`);if(!wr(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(Ec(s,"utf8"));return{gate:n,metadata:n.metadata,contractName:a,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:s}}var ea,Ic,_c=Y(()=>{Sc();vc();ea=xc("protocols/templates",import.meta.url),Ic="Template + Foundry tests + optional static analysis. NOT a paid security-firm audit. Do not put mainnet TVL on forks without an independent Solidity audit."});import{createHash as Dp}from"node:crypto";import{secp256k1 as na}from"@noble/curves/secp256k1.js";import{bech32m as bS}from"@scure/base";function Et(e,t){throw new Error(`${e}: ${t}`)}function ES(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||Et("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Hp(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{Et(t,`must be an integer from ${n} to ${r}`)}}function AL(e){let t=String(e||"");if(!t||[...t].some(o=>!xS.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(xS.indexOf(o));let r=[];for(;n>0n;)r.unshift(Number(n&255n)),n>>=8n;for(let o of t){if(o!=="1")break;r.unshift(0)}return Uint8Array.from(r)}function SS(e,t){let n=String(e||"").trim(),r=AL(n);return(!r||r.length!==32)&&Et(t,"must be a 32-byte base58 Solana public key"),n}function kS(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||Et(t,"must be a compressed secp256k1 public key");try{na.Point.fromHex(n)}catch{Et(t,"must encode a valid secp256k1 curve point")}return n}function _L(e){if(e<253)return Buffer.from([e]);if(e<=65535){let t=Buffer.alloc(3);return t[0]=253,t.writeUInt16LE(e,1),t}Et("bitcoin-tapscript-vault","script too large")}function zp(e,t){let n=Dp("sha256").update(e).digest();return Dp("sha256").update(n).update(n).update(t).digest()}function vS(e){return zp("TapLeaf",Buffer.concat([Buffer.from([192]),_L(e.length),e]))}function PL(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return zp("TapBranch",Buffer.concat([n,r]))}function Pc(e){return na.Point.fromHex(e).x.toString(16).padStart(64,"0")}function IS(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function TL(e,t){let n=[];return e.forEach((r,o)=>n.push(IS(Pc(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function NL(e){let t=Number(e),n=[];for(;t>0;)n.push(t&255),t>>=8;return n[n.length-1]&128&&n.push(0),Buffer.from([n.length,...n])}function CL(e,t){return Buffer.concat([NL(t),Buffer.from([178,117]),IS(Pc(e)),Buffer.from([172])])}function OL(e,t,n){let r=na.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${zp("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%na.Point.Fn.ORDER,s=o.add(na.Point.BASE.multiply(a)),c=Buffer.from(s.x.toString(16).padStart(64,"0"),"hex"),l=n==="mainnet"?"bc":n==="regtest"?"bcrt":"tb";return{address:bS.encode(l,[1,...bS.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function Rt(e,t){return Object.freeze({path:e,content:t.endsWith(`
|
|
12
12
|
`)?t:`${t}
|
|
13
|
-
`})}function
|
|
13
|
+
`})}function RL(e){let t=Dp("sha256");for(let n of[...e].sort((r,o)=>r.path.localeCompare(o.path)))t.update(n.path).update("\0").update(n.content).update("\0");return t.digest("hex")}function LL(e){let t=ES(e.projectName),n=SS(e.authority,"solana-safe-vault authority"),r=Hp(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||Et("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=SS(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&Et("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
|
|
14
14
|
use anchor_lang::system_program::{transfer, Transfer};
|
|
15
15
|
|
|
16
16
|
declare_id!("${i}");
|
|
@@ -98,16 +98,16 @@ pub enum VaultError {
|
|
|
98
98
|
#[msg("Vault has insufficient funds")] InsufficientFunds,
|
|
99
99
|
#[msg("Arithmetic overflow")] ArithmeticOverflow,
|
|
100
100
|
}
|
|
101
|
-
`,s=[
|
|
101
|
+
`,s=[Rt("Anchor.toml",`[provider]
|
|
102
102
|
cluster = "${o}"
|
|
103
103
|
wallet = "~/.config/solana/id.json"
|
|
104
104
|
|
|
105
105
|
[programs.${o}]
|
|
106
106
|
${t} = "${i}"
|
|
107
|
-
`),
|
|
107
|
+
`),Rt("Cargo.toml",`[workspace]
|
|
108
108
|
members = ["programs/${t}"]
|
|
109
109
|
resolver = "2"
|
|
110
|
-
`),
|
|
110
|
+
`),Rt(`programs/${t}/Cargo.toml`,`[package]
|
|
111
111
|
name = "${t}"
|
|
112
112
|
version = "0.1.0"
|
|
113
113
|
edition = "2021"
|
|
@@ -123,29 +123,31 @@ default = []
|
|
|
123
123
|
|
|
124
124
|
[dependencies]
|
|
125
125
|
anchor-lang = "0.31.1"
|
|
126
|
-
`),
|
|
126
|
+
`),Rt(`programs/${t}/src/lib.rs`,a),Rt(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
|
|
127
127
|
// 1. initialize with ${r} slots; 2. deposit; 3. reject early withdrawal;
|
|
128
128
|
// 4. advance slots; 5. withdraw as authority; 6. reject non-authority.
|
|
129
|
-
`),
|
|
129
|
+
`),Rt("SECURITY.md",`# Security model
|
|
130
130
|
|
|
131
131
|
- Initial and permanent withdrawal authority: \`${n}\`
|
|
132
132
|
- Unlock delay: ${r} slots after the most recent deposit
|
|
133
133
|
- No upgrade authority is created by this source; deployment authority handling is external
|
|
134
134
|
- Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
|
|
135
|
-
`)];return{family:"solana",network:o,projectName:t,protocolModel:
|
|
135
|
+
`)];return{family:"solana",network:o,projectName:t,protocolModel:Tc["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:s,gate:{sourceChecks:{ok:a.includes("address = vault.authority")&&a.includes("checked_add")&&a.includes('seeds = [b"vault"')&&!a.includes("invoke_signed_unchecked"),checks:["authority constraint","checked slot arithmetic","PDA seed binding","no unchecked CPI"]},compiler:{tool:"anchor",requiredBeforeDeploy:!0,run:!1},tests:{tool:"anchor test",requiredBeforeDeploy:!0,run:!1},simulation:{cluster:o,requiredBeforeDeploy:!0,run:!1},firmAudit:!1,disclaimer:jp},deploymentPrepared:!1}}function $L(e){let t=ES(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||Et("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((b,x)=>kS(b,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&Et("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Hp(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=kS(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&Et("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=Hp(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(Pc).join(",")})`,c=`and_v(v:older(${a}),pk(${Pc(i)}))`,l=`taproot_tree(${s},${c})`,u=TL(r,o),d=CL(i,Number(a)),p=PL(vS(u),vS(d)),m=OL(r[0],p,n),f=`tr(${m.internalKey},{${s},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(a),miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[Rt("policy/miniscript.txt",l),Rt("policy/descriptor.txt",f),Rt("policy/manifest.json",JSON.stringify(h,null,2)),Rt("tests/policy-vectors.json",JSON.stringify({cooperative:{requiredSignatures:o,csvBlocks:0,expected:"spendable"},insufficientCooperative:{requiredSignatures:Math.max(0,o-1),csvBlocks:0,expected:"rejected"},earlyRecovery:{recoverySignature:!0,csvBlocks:Math.max(0,Number(a)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(a),expected:"spendable"}},null,2)),Rt("SECURITY.md",`# Security model
|
|
136
136
|
|
|
137
137
|
- Cooperative path: ${o}-of-${r.length}
|
|
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:Js["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:qd},psbtPrepared:!1,fundingPrepared:!1}}function Ni(){return Object.values(Js).map(e=>({...e,disclaimer:qd}))}async function Oi(e={}){let t=String(e.templateId||"").trim(),n=Js[t];n||yt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?JO(e):XO(e),o=YO(r.files);return B({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 qd,Ub,Js,Hd=K(()=>{ne();qd="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",Ub="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Js=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 Bp={};Rt(Bp,{PARASWAP_API:()=>wS,paraswapHealth:()=>Lp,paraswapPrepare:()=>$p,paraswapPrice:()=>nn,paraswapTokens:()=>wc});function uo(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 wc(e={},t={}){let n=Number(e.chainId||1);return k(`${Rp(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function nn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:uo(e.srcToken,"srcToken"),destToken:uo(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 Xa({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(g0(o)))r.set(s,c);let i=await k(`${Rp(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...le(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 $p(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=uo(e.userAddress,"userAddress"),o=await nn(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:uo(e.srcToken,"srcToken"),destToken:uo(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=uo(e.receiver,"receiver"));let c=await k(`${Rp(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 B({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:Ae(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Lp(e={}){let t=await wc({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var wS,Rp,ji=K(()=>{j();We();ne();Yo();wS="https://api.paraswap.io",Rp=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||wS).replace(/\/$/,"")});var ZE={};Rt(ZE,{CONTRACTS_EVAL_HERE:()=>kF,runContractsEval:()=>SF});import Tc from"node:fs";import Rn from"node:path";import{spawnSync as lF}from"node:child_process";import{fileURLToPath as uF}from"node:url";function wF(){let e=process.env.HOME||"";for(let t of["forge",Rn.join(e,".foundry/bin/forge")])if(lF(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function QE(e,t=[]){if(!Tc.existsSync(e))return t;for(let n of Tc.readdirSync(e)){let r=Rn.join(e,n);if(Tc.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;QE(r,t)}else n.endsWith(".sol")&&!r.includes(`${Rn.sep}lib${Rn.sep}`)&&t.push(r)}return t}function bF(){let e=[];for(let t of Object.keys(nr)){let n=Rn.join(dF,t),r=QE(Rn.join(n,"src")),o=[];for(let i of r){let a=Tc.readFileSync(i,"utf8");for(let s of pF)s.test(a)&&o.push(`${Rn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function xF(){return wF()?Object.keys(nr).map(e=>{try{let t=Ti(e,{allowSkipStatic:!0});return{language:"Solidity",templateId:e,ok:t.ok===!0&&t.forgeTests?.ok===!0,forge:t.forgeTests,firmAudit:t.firmAudit===!1}}catch(t){return{language:"Solidity",templateId:e,ok:!1,error:String(t?.message||t).slice(0,240)}}}):Object.keys(nr).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function vF(){let e=[],t=Ni();e.push({language:"catalog",ok:t.some(o=>o.family==="solana")&&t.some(o=>o.family==="bitcoin"),templates:t.map(o=>o.id)});let n=await Oi({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:mF,programId:fF,unlockDelaySlots:1200});e.push({language:"Rust / Anchor",templateId:"solana-safe-vault",ok:n.oraclePrepared===!0&&n.signingReady===!1&&n.broadcastReady===!1&&n.firmAudit===!1,artifactHash:n.artifactHash});let r=await Oi({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[hF,gF],recoveryPubkey:yF,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 SF(){let e=bF(),t=xF(),n=await vF(),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 dF,pF,mF,fF,hF,gF,yF,kF,eA=K(()=>{zs();Ks();Hd();Hs();dF=Ds("protocols/templates",import.meta.url),pF=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],mF="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",fF="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",hF="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",gF="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",yF="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";kF=Rn.dirname(uF(import.meta.url))});import{createHash as WF}from"node:crypto";function Ut(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function fo(e){return typeof e=="number"&&Number.isFinite(e)}function Vm(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Vm(t);return Object.freeze(e)}for(let t of Object.keys(e))Vm(e[t]);return Object.freeze(e)}function mr(e){if(Array.isArray(e))return e.map(mr);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=mr(e[n]);return t}return e}function zm(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 TA(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function GF(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function KF(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function YF(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 NA(e){if(!Ut(e))throw new TypeError("evidence artifact must be a plain object");if(!VF.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(!Ut(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(!Ut(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ut(e.train)||!Ut(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return mr({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>mr(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 OA(e){return WF("sha256").update(JSON.stringify(NA(e)),"utf8").digest("hex")}function Ct(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Wm(e,t){if(!Ut(e)||!Ut(e.metrics))throw new Error(`${t} metrics required`);let n=Ct(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(!fo(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 JF(e,{maxDailyLossPct:t}={}){let n=e.split,r=Ct(n.trainStartIndex,"split.trainStartIndex"),o=Ct(n.trainEndIndex,"split.trainEndIndex"),i=Ct(n.trainBarCount,"split.trainBarCount",1),a=Ct(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Ct(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Ct(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(!fo(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Wm(e.train,"train");let l=Wm(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(fo(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(!Ut(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=Ct(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),x=Ct(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),w=Ct(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),y=Ct(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||x>=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 S=Wm({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(S.tradeCount<1||S.netPnlUsd<=0||S.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(fo(t)&&S.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!fo(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 RA(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=NA(e),r=mr({id:e.id,...n});if(JSON.stringify(mr(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=OA(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&JF(e,t),e}function Gm({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let a=[];if(!Ut(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ut(n))throw new TypeError("backtestOptions must be a plain object");if(!fo(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=Ye(e),c=ho(s),l=na(t),u=t.length,d=($=[],q={})=>CA({status:"fail",strategy:s,sHash:c,barsHash:l,split:q.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:q.train||null,holdout:q.holdout||null,walkForward:q.walkForward||{windows:[],passRate:0},flags:[...a,...$]});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,x;try{b=Ln(s,h,n),x=Ln(s,g,n)}catch($){return d([{type:"backtest_error",message:String($.message||$)}])}let w={metrics:zm(b),costs:TA(b),tradeCount:b.metrics.tradeCount},y={metrics:zm(x),costs:TA(x),tradeCount:x.metrics.tradeCount},S={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:m,holdoutEndIndex:u-1,holdoutBarCount:f,trainFraction:r},E=[],v=Math.floor(u/(o+1));if(v<3)a.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:v});else for(let $=0;$<o;$++){let q=v*($+1),te=q,Y=Math.min(u,te+v);if(Y-te<3||q<3){E.push({index:$,trainStartIndex:0,trainEndIndex:q-1,evalStartIndex:te,evalEndIndex:Y-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Ce=t.slice(te,Y),tt;try{tt=Ln(s,Ce,n)}catch{E.push({index:$,trainStartIndex:0,trainEndIndex:q-1,evalStartIndex:te,evalEndIndex:Y-1,passed:!1,reason:"backtest_error",metrics:null});continue}let M=zm(tt),H=YF(M,s.risk,i);E.push({index:$,trainStartIndex:0,trainEndIndex:q-1,evalStartIndex:te,evalEndIndex:Y-1,passed:H,reason:H?"pass":"fail_metrics",metrics:M})}let A=E.filter($=>$.passed).length,P=E.length===0?0:A/E.length,T={windows:E,passRate:P,windowsRun:E.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 C=GF(y.costs),I=KF(x);I>0&&C>I&&a.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let F=a.some($=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes($.type)),D=a.some($=>$.type==="overfit"),N="fail";return y.metrics.tradeCount>=i&&y.metrics.netPnlUsd>0&&y.metrics.profitFactor>1&&y.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&P>=.6&&!(I>0&&C>I)&&!D&&!a.some($=>$.type==="severe_oos_collapse"||$.type==="invalid_windowing")?N="pass_live_eligible":!F&&y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&Number.isFinite(y.metrics.netPnlUsd)?(N="pass_paper_only",y.metrics.tradeCount<i&&a.push({type:"undersampled",message:"holdout trades below minTrades"})):D&&y.metrics.tradeCount>0&&w.metrics.netPnlUsd>0?N="fail":y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&!F?N="pass_paper_only":N="fail",y.metrics.netPnlUsd<0&&(N=N==="pass_live_eligible"?"fail":N==="pass_paper_only"?"pass_paper_only":"fail",N="fail"),CA({status:N,strategy:s,sHash:c,barsHash:l,split:S,train:w,holdout:y,walkForward:T,flags:a})}function CA({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:hr,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c};return l.id=OA(l),Vm(mr(JSON.parse(JSON.stringify(l))))}var VF,Km=K(()=>{gr();fr();Rc();VF=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function ra(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function QF(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Jm(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Jm(n,`${t}[${r}]`));return}if(ra(e))for(let[n,r]of Object.entries(e)){let o=QF(n);if(XF.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Jm(r,`${t}.${n}`)}}function Ym(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function $A({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Jm({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!ra(e))throw new Error("handoff: strategy required");if(!ra(t))throw new Error("handoff: evidence required");if(!ra(n))throw new Error("handoff: shadow required");if(!ra(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=Ye(e,{nowMs:o}),s=Je(a);if(RA(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(!Ym(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(!Ym(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(!Ym(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:oa,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 B(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var XF,LA=K(()=>{gr();Km();fr();ne();XF=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function go(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function yo(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function ia(e){if(Array.isArray(e))for(let t of e)ia(t);else if(e&&typeof e=="object")for(let t of Object.values(e))ia(t);return Object.freeze(e)}function e6(e){let t=ZF[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function t6(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");yo(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=yo(Number(o.t),`candles[${r}].t`);if(yo(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:go(o.o,`candles[${r}].o`),h:go(o.h,`candles[${r}].h`),l:go(o.l,`candles[${r}].l`),c:go(o.c,`candles[${r}].c`),v:go(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 ia([...n.values()].sort((r,o)=>r.t-o.t))}function n6(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=yo(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:go(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function r6({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 Da({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 n6(o,n)}function o6(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 BA(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=e6(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=yo(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):yo(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Ir({coin:n,interval:r,startTime:s,endTime:i},t),r6({coin:n,startTime:s,endTime:i},t)]),u=t6(c,{endTime:i}),d=ia(o6(u,l,o));return ia({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var ZF,MA=K(()=>{ot();ZF=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 s6(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))a6.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"||!i6.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 c6(e={}){let t=await qa(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 i6,a6,FA,UA=K(()=>{ot();LA();MA();i6=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),a6=new Set(["coin","interval"]);FA=Object.freeze({id:"hyperliquid",validateMarket:s6,fetchBars:BA,listMarkets:c6,prepareIntent(e){return $A(e)}})});function u6(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 l6.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 Xm(e){return typeof e!="string"?null:d6.get(e)??null}function Qm(e){let t=Xm(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var l6,qA,d6,A7,Zm=K(()=>{UA();l6=Object.freeze(["id","validateMarket","prepareIntent"]);qA=[FA].map(u6),d6=new Map(qA.map(e=>[e.id,e])),A7=Object.freeze([...qA])});import{createHash as p6}from"node:crypto";function bt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Pe(e){return typeof e=="number"&&Number.isFinite(e)}function KA(e){return Number.isInteger(e)&&e>0}function of(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)of(t);return Object.freeze(e)}for(let t of Object.keys(e))of(e[t]);return Object.freeze(e)}function af(e){if(Array.isArray(e))return e.map(af);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=af(e[n]);return t}return e}function O(e,t,n){e.push({path:t,message:n})}function Bn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||O(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function QA(e,t,n,r){if(!Pe(e)||!Pe(t)||!Pe(n)||!Pe(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 rf(e,t,n,r){if(bt(e)){if(Bn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return O(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return O(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!bt(o)||![o.value,o.min,o.max,o.step].every(KA)?(O(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return KA(e)?e:(O(r,t,"must be a positive integer or {param}"),null)}function YA(e,t,n,r){return bt(e)?(Bn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(O(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(O(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Pe(e)?e:(O(r,t,"must be a finite number or {param}"),null)}function $c(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 v6(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 $c(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 S6(e,t){if(!bt(e))return O(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>WA)return O(t,"parameters",`too many parameters (max ${WA})`),null;let r={};for(let o of n){if(!JA.test(o)){O(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!bt(i)){O(t,a,"must be a plain object");continue}Bn(i,HA,a,t);for(let d of HA)d in i||O(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Pe(c)||O(t,`${a}.min`,"must be a finite number"),Pe(l)||O(t,`${a}.max`,"must be a finite number"),(!Pe(u)||u<=0)&&O(t,`${a}.step`,"must be a positive finite number"),Pe(s)||O(t,`${a}.value`,"must be a finite number"),Pe(c)&&Pe(l)&&c>l&&O(t,`${a}.min`,"min must be <= max"),Pe(s)&&Pe(c)&&Pe(l)&&Pe(u)&&u>0&&(QA(s,c,l,u)||O(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 k6(e,t,n,r){let o=`nodes.${t}`;if(!bt(e))return O(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!zA[e.type])return O(r,`${o}.type`,"unknown or missing node type"),Bn(e,x6,o,r),null;switch(Bn(e,zA[e.type],o,r),(typeof e.id!="string"||!XA.test(e.id))&&O(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!m6.has(e.field))&&O(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=YA(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!f6.has(e.indicator))&&O(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?O(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=rf(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?O(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))O(r,`${o}.period`,"required field is missing");else{let s=rf(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))O(r,`${o}.${s}`,"required field is missing");else{let c=rf(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?w6.has(e.output)?a.output=e.output:O(r,`${o}.output`,"must be line|signal|histogram"):O(r,`${o}.output`,"required field is missing"),"period"in e&&O(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&O(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))O(r,`${o}.stdDev`,"required field is missing");else{let s=YA(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?O(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?b6.has(e.output)?a.output=e.output:O(r,`${o}.output`,"must be upper|middle|lower"):O(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&O(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&O(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&O(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&O(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!h6.has(e.op))&&O(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&O(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&O(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"||!g6.has(e.op))&&O(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return O(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?O(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&O(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&O(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"||!y6.has(e.direction))&&O(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&O(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&O(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 E6(e,t,n){if(!bt(e))return O(t,"risk","must be a plain object"),null;Bn(e,jA,"risk",t);for(let p of jA)(!(p in e)||e[p]==null)&&O(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Pe(o)||o<=0||o>50?O(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Pe(i)||i<=0?O(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Pe(a)||a<=0||a>100?O(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Pe(s)||s<=0||s>100?O(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Pe(c)||c<=0||c>1e3?O(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?O(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Pe(u)||u<=0||u>100?O(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?O(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&O(t,"risk.expiresAt","must be strictly greater than nowMs"):O(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function sf(e,t={}){let n=[];if(!bt(e))return O(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Bn(e,DA,"",n);for(let d of DA)(!(d in e)||e[d]==null)&&O(n,d,"required field is missing");e.version!==ef&&O(n,"version",`must be ${ef}`),(typeof e.id!="string"||!JA.test(e.id))&&O(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>GA)&&O(n,"name",`must be a non-empty string max ${GA}`);let r=Xm(e.venue);r||O(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)bt(e.market)||O(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))O(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)O(n,p.path,p.message)}let i=S6(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))O(n,"nodes","must be an array");else if(e.nodes.length>VA)O(n,"nodes",`too many nodes (max ${VA})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=k6(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&XA.test(p.id)&&(s.has(p.id)?O(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 $c(p))s.has(f)||O(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of $c(p)){let h=s.get(f);h&&tf.has(h.type)&&O(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of $c(p)){let h=s.get(f);h&&!tf.has(h.type)&&O(n,m,`node ref "${f}" must be boolean`)}}v6(s)&&O(n,"nodes","graph contains a cycle")}let c=null;if(!bt(e.rules))O(n,"rules","must be a plain object");else{Bn(e.rules,nf,"rules",n);for(let d of nf)d in e.rules||O(n,`rules.${d}`,"required field is missing");c={};for(let d of nf){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){O(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){O(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);tf.has(m.type)||O(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=E6(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=of({version:ef,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 Ye(e,t={}){let n=sf(e,t);if(!n.ok)throw new wo(n.errors);return n.strategy}function A6(e){let t=Ye(e);return JSON.stringify(af(t))}function ho(e){let t=A6(e);return p6("sha256").update(t,"utf8").digest("hex")}function aa(e,t){if(!bt(e))throw new wo([{path:"",message:"strategy must be a plain object"}]);if(!bt(t))throw new wo([{path:"overrides",message:"must be a plain object"}]);let n=Ye(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)){O(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Pe(a)){O(o,i,"override must be a finite number");continue}if(!QA(a,s.min,s.max,s.step)){O(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new wo(o);return Ye({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 ef,JA,XA,m6,f6,h6,g6,y6,w6,b6,tf,DA,HA,nf,jA,x6,zA,WA,VA,GA,wo,fr=K(()=>{Zm();ef=1,JA=/^[a-z0-9][a-z0-9._-]{0,63}$/,XA=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,m6=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),f6=new Set(["sma","ema","rsi","macd","bollinger","atr"]),h6=new Set(["gt","gte","lt","lte","eq"]),g6=new Set(["and","or","not"]),y6=new Set(["above","below"]),w6=new Set(["line","signal","histogram"]),b6=new Set(["upper","middle","lower"]),tf=new Set(["compare","logic","cross"]),DA=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),HA=new Set(["value","min","max","step"]),nf=new Set(["entryLong","entryShort","exitLong","exitShort"]),jA=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),x6=new Set(["id","type"]),zA={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"])},WA=16,VA=128,GA=100,wo=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 sa(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 Mn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function I6(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 eI(e,t){sa(e),Mn(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 Lc(e,t){sa(e),Mn(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 tI(e,t){sa(e),Mn(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]=ZA(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]=ZA(i,a)}return n}function ZA(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function nI(e,t={}){sa(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Mn(n),Mn(r),Mn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=Lc(e,n),a=Lc(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 rI(e,t={}){sa(e);let n=t.period,r=t.stdDev;if(Mn(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 oI(e,t){I6(e),Mn(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 iI=K(()=>{});import{createHash as _6}from"node:crypto";var cf,P6,T6,C6,aI,sI=K(()=>{cf=2,P6="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",T6="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",C6="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",aI=_6("sha256").update(JSON.stringify({version:cf,compilerSourceHash:P6,indicatorsSourceHash:T6,schemaSourceHash:C6})).digest("hex")});function Nt(e){return typeof e=="number"&&Number.isFinite(e)}function R6(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 bo(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function $6(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(!Nt(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(!Nt(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!==O6[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Nt(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Nt(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 yr(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=N6[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=bo(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?bo(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=oI(d,c);break}let u=yr(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Nt(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=eI(u,c);else if(a.indicator==="ema")s=Lc(u,c);else if(a.indicator==="rsi")s=tI(u,c);else if(a.indicator==="macd")s=nI(u,{fastPeriod:bo(a.fastPeriod,n),slowPeriod:bo(a.slowPeriod,n),signalPeriod:bo(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=rI(u,{period:c,stdDev:bo(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=yr(a.left,t,n,r,o,i),l=yr(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||!Nt(d)||!Nt(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=>yr(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=yr(a.left,t,n,r,o,i),l=yr(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||!Nt(d)||!Nt(p)||!Nt(m)||!Nt(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 Je(e,t={}){let n=Ye(e);t&&Object.keys(t).length&&(n=aa(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(R6(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=ho(n);function l(m,f){let h={};for(let b of o){let x=m.get(b);h[b]=x[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){$6(m,f,n.market.interval);let h=new Map;for(let g of o)yr(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:oa,compilerHash:hr,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}var oa,hr,N6,O6,gr=K(()=>{fr();iI();sI();oa=cf,hr=aI,N6=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),O6=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 L6}from"node:crypto";function M6(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function qt(e){return typeof e=="number"&&Number.isFinite(e)}function lf(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)lf(t);return Object.freeze(e)}for(let t of Object.keys(e))lf(e[t]);return Object.freeze(e)}function Bc(e){if(Array.isArray(e))return e.map(Bc);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Bc(e[n]);return t}return e}function uf(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)=>uf(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))uf(r,`${t}.${n}`)}}function lI(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(!qt(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(!qt(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&&!qt(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!qt(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!qt(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function na(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&lI(e),L6("sha256").update(JSON.stringify(Bc(e)),"utf8").digest("hex")}function F6(e){if(e==null&&(e={}),!M6(e))throw new TypeError("options must be a plain object");let t={...B6},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(!qt(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(!qt(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(!qt(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 Mc(e){return e/1e4}function U6(e,t,n){let r=Mc(n);return t==="long"?e*(1+r):e*(1-r)}function q6(e,t,n){let r=Mc(n);return t==="long"?e*(1-r):e*(1+r)}function cI(e,t,n){let r=Math.abs(e)*Mc(t),o=Math.abs(e)*Mc(n);return{taker:r,builder:o,total:r+o}}function D6(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function H6(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function j6(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function z6(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 W6(e,t,n){return t==="long"?e.l<=n:e.h>=n}function V6(e,t,n){return t==="long"?e.h>=n:e.l<=n}function G6(e,t,n){return t==="long"?e.l<=n:e.h>=n}function ca(e,t){for(let n of e.requiredSeries)if(["fundingRate","openInterest"].includes(n)&&!t.every(r=>qt(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function K6(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 Y6(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 Ln(e,t,n={}){let r=F6(n);lI(t);let o=na(t);r.nowMs!==void 0&&Ye(e,{nowMs:r.nowMs});let i=Je(e);if(ca(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,x=[],w=[],y=[],S=[],E=[],v=null,A=0,P=null,T=p,C=!1,I=0,F=0,D=[],N=new Array(t.length).fill(0);function U(L){D.push(L)}function $(L){let oe=t[L].v*(r.maxVolumeParticipationPct/100);return Math.max(0,oe-N[L])}function q(L){if(!v)return p;let oe=v.side==="long"?(L-v.entryPrice)*v.qty:(v.entryPrice-L)*v.qty;return p+oe}function te(L,oe,V){let Se=V.o,ce=D6(p,a);if(!(ce>0)||!(Se>0))return;let ke=U6(Se,oe,l),ye=ce/ke,Ne=$(L),So=ke*Ne;if(ye>Ne){y.push({kind:"entry",barIndex:L,time:V.t,side:oe,requestedNotionalUsd:ce,maxFillNotionalUsd:So,reason:"volume_participation"});return}N[L]+=ye;let Ot=Math.abs(ke-Se)*ye,jt=cI(ce,u,d);p-=jt.total,m+=jt.taker,f+=jt.builder,g+=Ot,b+=ce,v={lifecycleEpoch:++F,side:oe,entryBarIndex:L,entryReferencePrice:Se,entryPrice:ke,qty:ye,notionalUsd:ce,stop:H6(ke,oe,a.stopLossPct),take:j6(ke,oe,a.takeProfitPct),liq:z6(ke,oe,a.maxLeverage,u+d),entryFees:jt.taker,entryBuilderFees:jt.builder,entrySlippageUsd:Ot,fundingAccrued:0}}function Y(L,oe,V,Se){if(!v)return!1;let ce=v.side,ke=oe,ye=ke;V!=="liquidation"&&Se&&(ye=q6(ke,ce,l));let Ne=v.qty,So=Ne*ye;if(V!=="liquidation"){let _f=$(L),FI=ye*_f;if(Ne>_f)return y.push({kind:"exit",barIndex:L,time:t[L].t,side:ce,requestedNotionalUsd:So,maxFillNotionalUsd:FI,reason:"volume_participation",triggerReason:V}),!1;N[L]+=Ne}let Ot=cI(So,u,d),jt=V==="liquidation"?0:Math.abs(ye-ke)*Ne,ko,zc;ce==="long"?(ko=(ke-v.entryReferencePrice)*Ne,zc=(ye-v.entryPrice)*Ne):(ko=(v.entryReferencePrice-ke)*Ne,zc=(v.entryPrice-ye)*Ne),p+=zc,p-=Ot.total,m+=Ot.taker,f+=Ot.builder,g+=jt,b+=So;let MI={side:ce,entryBarIndex:v.entryBarIndex,entryTime:t[v.entryBarIndex].t,entryPrice:v.entryPrice,exitBarIndex:L,exitTime:t[L].t,exitPrice:ye,exitReason:V,qty:Ne,notionalUsd:v.notionalUsd,grossPnlUsd:ko,feesUsd:v.entryFees+Ot.taker,builderFeesUsd:v.entryBuilderFees+Ot.builder,fundingUsd:v.fundingAccrued,slippageUsd:v.entrySlippageUsd+jt,netPnlUsd:ko-(v.entryFees+Ot.taker+v.entryBuilderFees+Ot.builder)-v.fundingAccrued-(v.entrySlippageUsd+jt)};return x.push(MI),V==="liquidation"&&w.push({barIndex:L,time:t[L].t,side:ce,price:ye,tradeIndex:x.length-1}),v=null,F+=1,I=L+1+(a.cooldownBars||0),!0}function Ce(L,oe,V,Se){let ce=L+1;if(ce>=t.length)return;D.some(ye=>ye.kind==="exit"&&ye.side===oe&&ye.fillBar===ce&&ye.epoch===Se)||U({kind:"exit",side:oe,signalBar:L,fillBar:ce,reason:V,epoch:Se})}function tt(L){let oe=D.filter(V=>V.fillBar===L);for(let V=D.length-1;V>=0;V--)D[V].fillBar===L&&D.splice(V,1);oe.sort((V,Se)=>{let ce=ke=>ke.kind==="exit"?0:1;return ce(V)-ce(Se)});for(let V of oe)if(V.kind==="exit"){if(!v||v.side!==V.side||v.lifecycleEpoch!==V.epoch)continue;let Se=V.reason||"rule";Y(L,t[L].o,Se,!0)||Ce(L,V.side,Se,V.epoch)}else if(V.kind==="entry"){if(v||V.epoch!==F||L<I)continue;te(L,V.side,t[L])}}function M(L){if(!v)return;let oe=t[L],V=oe.fundingPaymentRate;if(V==null||!qt(V)||V===0)return;let Se=Math.abs(v.qty*oe.c),ce=V*Se;v.side==="long"?(p-=ce,v.fundingAccrued+=ce,h+=ce):(p+=ce,v.fundingAccrued-=ce,h-=ce)}function H(L){if(!v)return;let oe=t[L].o;(v.side==="long"?oe<=v.liq:oe>=v.liq)&&Y(L,oe,"liquidation",!1)}function Q(L){if(!v)return;let oe=t[L],V=v.side,Se=G6(oe,V,v.liq),ce=W6(oe,V,v.stop),ke=V6(oe,V,v.take),ye=Ne=>V==="long"?Math.min(Ne,oe.o):Math.max(Ne,oe.o);if(Se){Y(L,ye(v.liq),"liquidation",!1);return}if(ce&&ke){Y(L,ye(v.stop),"stop_loss",!0)||Ce(L,V,"stop_loss",v.lifecycleEpoch);return}if(ce){Y(L,ye(v.stop),"stop_loss",!0)||Ce(L,V,"stop_loss",v.lifecycleEpoch);return}ke&&(Y(L,v.take,"take_profit",!0)||Ce(L,V,"take_profit",v.lifecycleEpoch))}for(let L=0;L<t.length;L++){let oe=Math.floor(t[L].t/864e5);oe!==P&&(P=oe,T=q(t[L].o),C=!1),H(L),tt(L),Q(L),M(L),!C&&q(t[L].c)<=T*(1-a.maxDailyLossPct/100)&&(C=!0,S.push({type:"daily_loss_limit",barIndex:L,time:t[L].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let V=s[L].signals,Se=L+c;if(v)(v.side==="long"&&V.exitLong===!0||v.side==="short"&&V.exitShort===!0)&&Se<t.length&&(D.some(Ne=>Ne.kind==="exit"&&Ne.side===v.side&&Ne.fillBar===Se&&Ne.epoch===v.lifecycleEpoch)||U({kind:"exit",side:v.side,signalBar:L,fillBar:Se,reason:"rule",epoch:v.lifecycleEpoch}));else{let ke=V.entryLong===!0,ye=V.entryShort===!0;ke&&ye?S.push({type:"conflicting_entry_signals",barIndex:L,time:t[L].t,message:"conflicting entry signals; no position opened"}):!C&&(ke||ye)&&Se<t.length&&L>=I&&U({kind:"entry",side:ke?"long":"short",signalBar:L,fillBar:Se,epoch:F})}let ce=p;v&&(A+=1,ce=q(t[L].c)),E.push({barIndex:L,time:t[L].t,equity:ce,positionSide:v?v.side:null})}let he=null;if(v){let L=t.length-1;if(Y(L,t[L].c,"end_of_data",!0))E[L]={barIndex:L,time:t[L].t,equity:p,positionSide:null};else{let V=q(t[L].c);he={side:v.side,entryBarIndex:v.entryBarIndex,entryTime:t[v.entryBarIndex].t,entryPrice:v.entryPrice,qty:v.qty,notionalUsd:v.notionalUsd,markPrice:t[L].c,markedEquityUsd:V},S.push({type:"open_position_at_end",barIndex:L,time:t[L].t,message:"end-of-data exit missed; position remains open and marked"})}}let He=(v?q(t[t.length-1].c):p)-r.initialEquityUsd,X=He/r.initialEquityUsd*100,ve=0,xt=0,wr=0;for(let L of x)L.netPnlUsd>0?(ve+=1,xt+=L.netPnlUsd):L.netPnlUsd<0&&(wr+=-L.netPnlUsd);let Ht=x.length,Un=Ht===0?0:ve/Ht,jc=0;wr>0?jc=xt/wr:xt>0&&(jc=1e12);let LI={netPnlUsd:He,netPnlPct:X,maxDrawdownPct:Y6(E),winRate:Un,profitFactor:jc,tradeCount:Ht,sharpe:K6(E),turnoverUsd:b,exposurePct:A/t.length*100},BI={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},If={barsHash:o,strategyHash:i.strategyHash,compilerHash:hr,compilerVersion:oa,config:BI,trades:x,equityCurve:E,metrics:LI,costs:{feesUsd:m,builderFeesUsd:f,fundingUsd:h,slippageUsd:g},liquidations:w,missedFills:y,openPositionAtEnd:he,flags:S};return uf(If),lf(Bc(If))}var B6,Rc=K(()=>{gr();fr();B6=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as J6}from"node:crypto";function oU(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function df(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)df(t);return Object.freeze(e)}for(let t of Object.keys(e))df(e[t]);return Object.freeze(e)}function iU(e){return String(e).trim().replace(/\s+/g," ")}function aU(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function sU(e){for(let n of Q6)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 cU(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 X6.has(n)?n:null}function lU(e){let t={...eU},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 uU(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 dU(e){let t=J6("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 pU(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 mU(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 fU(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 hU(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 uI(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 gU({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:uI(s.fast),ema_right_period:uI(s.slow)},nodes:c,rules:l,risk:{...r,expiresAt:o}}}function yU({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 wU({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 dI(e,t={}){if(typeof e!="string")throw new De("prompt must be a string");if(e.length>1e3)throw new De("prompt length must be <= 1000");if(!oU(t))throw new De("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new De("options.nowMs is required integer epoch ms");let n=t.nowMs,r=rU;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new De("expiresInMs must be an integer");if(r=t.expiresInMs,r<tU||r>nU)throw new De("expiresInMs must be between 1h and 30d")}if(Z6.test(e))throw new De(`prompt appears to contain secrets and is rejected. ${xo}`);let o=iU(e);if(!o)throw new De(`empty prompt. ${xo}`);if(uU(o))throw new De(`duplicate interval or risk clause. ${xo}`);let i=aU(o),a=sU(o),s=cU(o);if(!i||!a||!s)throw new De(`could not parse side/coin/interval. ${xo}`);let c=lU(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new De("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new De("position size out of range");let l=n+r,u=dU(o),d=`Draft ${a} ${i}`.slice(0,100),p=pU(o),m=mU(o),f=fU(o),h=[p,m,f].filter(Boolean);if(h.length!==1)throw new De(`unsupported or ambiguous prompt. ${xo}`);if(!hU(o,h[0]))throw new De(`unsupported or ambiguous prompt. ${xo}`);let g,b=h[0],x={side:i,coin:a,interval:s,risk:c,expiresAt:l,id:u,name:d,spec:b};b.kind==="ema_cross"?g=gU(x):b.kind==="rsi"?g=yU(x):g=wU(x);let w=sf(g,{nowMs:n});if(!w.ok)throw new De(`draft failed validation: ${w.errors.map(y=>y.message).join("; ")}`);return df(Ye(g,{nowMs:n}))}var De,X6,Q6,Z6,xo,eU,tU,nU,rU,pI=K(()=>{fr();De=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},X6=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Q6=new Set(["BTC","ETH","SOL","HYPE"]),Z6=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,xo="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.",eU=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),tU=36e5,nU=30*864e5,rU=864e5});import{createHash as bU}from"node:crypto";function hI(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 gI(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function mf(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)mf(t);return Object.freeze(e)}for(let t of Object.keys(e))mf(e[t]);return Object.freeze(e)}function la(e){if(Array.isArray(e))return e.map(la);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=la(e[n]);return t}return e}function Fc(e){return JSON.stringify(la(e))}function xU(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 vU(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=Fc(r),a=Fc(o);return i<a?-1:i>a?1:0}),n}function pf(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=Fc(n),s=Fc(o);return a<s}function yI(e,t,n={}){if(!gI(n))throw new TypeError("options must be a plain object");for(let y of Object.keys(n))if(hI(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>mI)throw new TypeError(`maxTrials must be an integer 1..${mI}`);o=y}let i=n.objective??"netPnlUsd";if(!fI.has(i))throw new TypeError(`objective must be one of ${[...fI].join("|")}`);let a=n.backtestOptions??{};if(!gI(a))throw new TypeError("backtestOptions must be a plain object");for(let y of Object.keys(a))if(hI(y))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${y}"`);let s=Ye(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 S=xU(s.parameters[y]);if(S.length===0)throw new Error(`parameter "${y}" produces an empty grid`);l[y]=S,u*=S.length}let d=vU(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 S=aa(s,y),E=Ln(S,t,a);h==null&&(h=E.config);let v={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},A={parameters:{...y},metrics:v};m.push(A),(!f||pf(i,v,y,f.metrics,f.parameters))&&(f=A)}m.sort((y,S)=>pf(i,y.metrics,y.parameters,S.metrics,S.parameters)?-1:pf(i,S.metrics,S.parameters,y.metrics,y.parameters)?1:0);let g={...f.parameters},b=aa(s,g),x={strategyHash:ho(s),compilerHash:hr,trainBarsHash:na(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:m.length,candidates:m,bestParameters:g,bestStrategy:b},w={id:bU("sha256").update(JSON.stringify(la(x)),"utf8").digest("hex"),...x};return mf(la(JSON.parse(JSON.stringify(w))))}var mI,fI,wI=K(()=>{gr();fr();Rc();mI=256,fI=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import an from"node:fs";import Uc from"node:path";function qc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Dt(e){return e==null?e:JSON.parse(JSON.stringify(e))}function kU(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function vo(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>vo(n,`${t}[${r}]`));return}if(qc(e))for(let[n,r]of Object.entries(e)){let o=kU(n);if(SU.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);vo(r,`${t}.${n}`)}}function EU(e){if(typeof e!="string"||!e||!Uc.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function bI(e){let t;try{t=an.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 AU(){return{version:hf,runners:[]}}function xI(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!qc(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==hf)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 vo(n,Uc.basename(t)),{version:hf,runners:n.runners.map(r=>Dt(r))}}function vI(e,t){vo(t,"store");let n=Uc.dirname(e);an.mkdirSync(n,{recursive:!0,mode:448});let r=Uc.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
142
|
-
`;try{an.writeFileSync(r,o,{mode:384,flag:"wx"}),an.renameSync(r,e);try{an.chmodSync(e,384)}catch{}}catch(i){try{an.unlinkSync(r)}catch{}throw i}}function SI(e={}){let t=e.path;if(EU(t),bI(t),an.existsSync(t)?xI(an.readFileSync(t,"utf8"),t):vI(t,AU()),ff.has(t))return ff.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 bI(t),xI(an.readFileSync(t,"utf8"),t)}function s(f){vI(t,f)}function c(f){if(!qc(f)||typeof f.id!="string"||!f.id)throw new Error("shadow-store: create requires record with string id");vo(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=Dt(f);return h.runners.push(g),s(h),Dt(g)}function l(f){let h=a().runners.find(g=>g.id===f);return h?Dt(h):null}function u(){return a().runners.map(f=>Dt(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 x=Dt(g.runners[b]),w=h(x);if(!qc(w)||w.id!==f)throw new Error("shadow-store: updater must return record with same id");return vo(w,"record"),g.runners[b]=Dt(w),s(g),Dt(g.runners[b])}function p(f){let h=a(),g=h.runners.findIndex(x=>x.id===f);if(g<0)throw new Error(`shadow-store: runner not found: ${f}`);let b=Dt(h.runners[g]);return b.status!=="stopped"&&(b.status="stopped",h.runners[g]=b,s(h)),Dt(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 ff.set(t,m),m}var hf,SU,ff,kI=K(()=>{hf=1,SU=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];ff=new Map});import{createHash as wf}from"node:crypto";function gf(e){return e==null?e:JSON.parse(JSON.stringify(e))}function yf(e){return Array.isArray(e)?e.map(yf):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,yf(e[t])])):e}function AI(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return wf("sha256").update(JSON.stringify(yf(e))).digest("hex")}function IU(e,t,n,r,o){return wf("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function _U(e,t,n,r){return wf("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function PU(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function EI(e){return e==="entryLong"||e==="entryShort"}function bf({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=SI({path:e});function r({strategy:c,evidenceId:l=null}={}){let u=Je(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,x)=>b.createdAt-x.createdAt||b.id.localeCompare(x.id))[0];if(p)return gf(p);let m=t(),f=_U(m,u.strategyHash,u.compilerHash,d),h=n.get(f);if(h)return gf(h);let g={id:f,strategy:gf(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=Je(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 F=l[I].t;(h==null||F>h)&&g.push(I)}if(g.length===0)return d;let b=new Map(d.intendedOrders.map(I=>[I.id,I])),x=new Set(d.fills.map(I=>I.orderId)),w=new Map(d.missedFills.map(I=>[I.orderId,I])),y=(I,F)=>`${I}|${F}`,S=new Map(d.markouts.map(I=>[y(I.orderId,I.horizon),I])),E=d.position?{...d.position}:null,v=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,A=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function P({action:I,signalBarT:F,signalIndex:D}){let N=PU(I),U=IU(d.id,d.strategyHash,F,N,I);if(b.has(U))return b.get(U);let $=D+1,q=$<l.length,te={id:U,action:I,type:I,side:N,signalBarT:F,fillBarT:q?l[$].t:null,status:q?"open":"missed"};return b.set(U,te),d.intendedOrders.push(te),te}function T(I,F,D){if(x.has(I.id))return;let N={orderId:I.id,action:EI(I.action)?"entry":"exit",side:I.side,price:F.o,barT:F.t,signalBarT:I.signalBarT,barIndex:D};if(d.fills.push(N),x.add(I.id),I.status="filled",I.fillBarT=F.t,w.has(I.id)&&(w.delete(I.id),d.missedFills=d.missedFills.filter(U=>U.orderId!==I.id)),EI(I.action)){E={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:F.t,entryPrice:F.o,entryBarIndex:D};for(let U of u){let $=y(I.id,U);if(S.has($))continue;let q={orderId:I.id,horizon:U,entryBarT:F.t,entryPrice:F.o,side:E.side,status:"pending",close:null,barT:null};S.set($,q),d.markouts.push(q)}}else E=null,v=Number(d.strategy?.risk?.cooldownBars)||0,A=F.t}function C(I){if(x.has(I.id)||w.has(I.id))return;let F={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};w.set(I.id,F),d.missedFills.push(F),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||x.has(I.id))continue;let F=f.get(I.signalBarT);if(F==null)continue;let D=F+1;D<l.length&&(h==null||l[D].t>h)&&T(I,l[D],D)}for(let I of g){let F=l[I],D=m[I].signals,N=E,U=q=>{if(E||v>0&&(A==null||F.t>=A))return;let Y=P({action:q,signalBarT:F.t,signalIndex:I}),Ce=I+1;Ce<l.length?T(Y,l[Ce],Ce):C(Y)},$=q=>{if(!E||E.side==="long"&&q!=="exitLong"||E.side==="short"&&q!=="exitShort")return;let te=P({action:q,signalBarT:F.t,signalIndex:I}),Y=I+1;Y<l.length?T(te,l[Y],Y):C(te)};N?(D.exitLong&&$("exitLong"),D.exitShort&&$("exitShort")):D.entryLong&&D.entryShort||(D.entryLong&&U("entryLong"),D.entryShort&&U("entryShort")),v>0&&A!=null&&F.t>=A&&(v-=1,v===0&&(A=null)),d.cursor=F.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let F=d.fills.find(U=>U.orderId===I.orderId&&U.action==="entry");if(!F)continue;let D=f.get(F.barT);if(D==null)continue;let N=D+I.horizon;if(N<l.length){I.close=l[N].c,I.barT=l[N].t,I.status="filled";let U=I.entryPrice;I.markout=I.side==="long"?(I.close-U)/U:(U-I.close)/U}}return d.position=E,d.cooldownBarsRemaining=v,d.cooldownStartT=A,d.updatedAt=t(),d})}return{start:r,step:s,list:i,get:o,stop:a}}var II=K(()=>{gr();kI()});var TI={};Rt(TI,{runStrategyOperation:()=>BU});import TU from"node:os";import CU from"node:path";function ua(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function OU(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function vf(e){if(Array.isArray(e)){for(let t of e)vf(t);return}if(ua(e))for(let[t,n]of Object.entries(e)){if(NU.some(r=>OU(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);vf(n)}}function RU(e){if(!ua(e))throw new TypeError("strategy input must be a plain object");return vf(e),e}function $U(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 xf(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=Qm(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);let a=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r}),s=Array.isArray(a)?a:a?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function Sf(e,t){let n=e.backtestOptions??{};if(!ua(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function _I(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!ua(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:Sf(e,r)}}function PI(){return CU.join(TU.homedir(),".oracle","strategy-shadow.json")}function LU(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 BU(e,t={},n={}){let r=RU(t),o=$U(r,n);if(e==="draft")return{strategy:dI(r.prompt,{nowMs:o})};if(e==="validate"){let i=Je(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=Je(r.strategy),a=await xf(i.strategy,r,n,o);ca(i,a);let s=Gm(_I(r,i.strategy,a,o));return e==="evidence"?s:{backtest:Ln(i.strategy,a,Sf(r,o)),evidence:s}}if(e==="optimize"){let i=Je(r.strategy),a=await xf(i.strategy,r,n,o);ca(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(!ua(d))throw new TypeError("options must be a plain object");let p=yI(i.strategy,u,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:Sf(r,o)}),m=p.bestStrategy;return{strategy:m,optimization:p,evidence:Gm(_I(r,m,a,o,{trainFraction:l}))}}if(e==="shadow"){let i=bf({storePath:n.storePath??PI(),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 xf(s.strategy,r,n,o);return ca(Je(s.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${a}`)}if(e==="prepare"){let i=Je(r.strategy),a=Qm(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await bf({storePath:n.storePath??PI(),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??LU(i.strategy,o);return a.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:AI(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 NU,CI=K(()=>{Rc();gr();Km();pI();wI();II();Zm();NU=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import{createServer as MU}from"node:http";import{randomBytes as FU}from"node:crypto";import{verifyMessage as UU}from"ethers";zn();vr();j();Wn();ne();import{readFileSync as j1,existsSync as z1}from"node:fs";import{getAddress as W1,Interface as _a,TypedDataEncoder as Tl,parseUnits as V1}from"ethers";var q1=/^(0|[1-9][0-9]*)$/,Il=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function Vn(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(!q1.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 D1(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function H1(e={}){return e.maxFeePerGas!=null?Vn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Vn(e.gasPrice,"gasPrice"):null}function _l(e={}){try{let t=D1(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Vn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=Vn(n.gasLimit??n.gas,"gasLimit"),s=H1(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=Vn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Vn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Vn(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 dh(e={}){let t=_l(e);if(!t.ok)throw new Il(t);return t}var G1="https://api.opensea.io/api/v2",K1="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)",Y1=new _a([`function ${K1}`]),Ia=new _a(["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"]),J1=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"]),X1=new Set(J1),yh=new Set(["solana","flow"]),Ro="0x0000000000000000000000000000000000000000";function Q1(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!z1(e))return"";try{for(let t of j1(e,"utf8").split(`
|
|
143
|
-
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Wt(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||Q1()}function wh(e={}){return kt({provider:"opensea",defaultUrl:G1,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Gn(e={}){return wh(e).baseUrl}function Kn(e={}){return lt({accept:"application/json"},{"x-api-key":Wt(e)},wh(e).trusted)}function bh(e){let t=String(e||"ethereum").trim().toLowerCase();if(!X1.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ee(e,t="address"){try{return W1(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function xh(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!yh.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ee(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 Z1(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 e_(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 ph(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 t_(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 vh(e={}){if(!Wt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Lo("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 Lo(e,t={}){if(!e)throw new Error("collection slug required");if(!Wt(t))throw new Error("OPENSEA_API_KEY required");return k(`${Gn(t)}/collections/${encodeURIComponent(e)}`,{headers:Kn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Sh(e,t={}){let n=await Lo(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 Bo(e={},t={}){if(!Wt(t))throw new Error("OPENSEA_API_KEY required");let n=bh(e.chain),r=xh(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${Gn(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await k(l.toString(),{headers:Kn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(t_(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 Pa(e={},t={}){if(!Wt(t))throw new Error("OPENSEA_API_KEY required");let n=xh(e.address||e.owner),r=await k(`${Gn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Kn(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 Ta=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 Mo(e){let t=String(e||"").trim().toLowerCase(),n=Ta[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Ze(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`opensea: ${t} must be an unsigned integer`);let o=BigInt(r);if(n&&o<=0n)throw new Error(`opensea: ${t} must be positive`);return o}function n_(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 $o(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function kh(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 Eh(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 r_(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function o_(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=ee(e?.token,t);if(n===0&&r!==Ro)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Ro)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function i_(e,t){let n=Ze(e?.startAmount,`${t} startAmount`),r=Ze(e?.endAmount??e?.startAmount,`${t} endAmount`);if(n!==r)throw new Error(`opensea: ${t} must be a fixed amount, not a decaying range`);return n}function Pl(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(r_);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=o_(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+=i_(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var a_=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 rt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function mh(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 Ah(e,t){return{itemType:Number(rt(e?.itemType,`${t} itemType`)),token:ee(e?.token,`${t} token`),identifierOrCriteria:rt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:rt(e?.startAmount,`${t} startAmount`),endAmount:rt(e?.endAmount,`${t} endAmount`)}}function s_(e,t){return{...Ah(e,t),recipient:ee(e?.recipient,`${t} recipient`)}}function c_(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:ee(e.offerer,`${t} offerer`),zone:ee(e.zone,`${t} zone`),offer:n.map((o,i)=>Ah(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>s_(o,`${t} consideration[${i}]`)),orderType:Number(rt(e.orderType,`${t} orderType`)),startTime:rt(e.startTime,`${t} startTime`),endTime:rt(e.endTime,`${t} endTime`),zoneHash:mh(e.zoneHash,`${t} zoneHash`),salt:rt(e.salt,`${t} salt`),conduitKey:mh(e.conduitKey,`${t} conduitKey`),counter:rt(e.counter,`${t} counter`)}}function Ih(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=c_(t,n);if(Tl.hashStruct("OrderComponents",a_,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function _h(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=ee(e?.token,`${t} contract`),o=$o(e?.identifierOrCriteria),i=Ze(e?.startAmount,`${t} startAmount`,{positive:!0}),a=Ze(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)throw new Error(`opensea: ${t} must be a fixed quantity, not a decaying range`);if(n===2&&i!==1n)throw new Error(`opensea: ${t} ERC-721 quantity must be exactly 1`);if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`opensea: ${t} quantity exceeds safe integer range`);return{itemType:n,contract:r,tokenId:o,quantity:Number(i)}}function l_(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 _h(r[0],`${t} offer NFT`)}function u_(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=_h(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 d_(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ee(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 p_(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 Ph(e,t,n,r){let o=rt(t?.startTime,`${r} startTime`),i=rt(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=Eh(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&p_(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function m_(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(Ta[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=l_(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;d_(e.asset,s,c,"listing");let l=Ze(e.price?.current?.value,"listing price",{positive:!0}),u=Ih(e,i,"listing"),d=Pl(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:ee(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:Ph(e,i,n,"listing"),counter:rt(i?.counter,"listing counter")}}async function Cl(e={},t={}){if(!Wt(t))throw new Error("OPENSEA_API_KEY required");let n=Mo(e.chain);n.contract=e.contract?ee(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Number(e.limit??12);if(!Number.isSafeInteger(o)||o<1||o>50)throw new Error("opensea: listing limit must be 1 through 50");let i=new URL(`${Gn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await k(i.toString(),{headers:Kn(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=>m_(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Ca(e={},t={}){let n=$o(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 Cl({...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 f_(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=u_(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Ze(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Pl(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=Pl(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:Ih(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ee(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:Ph(e,i,r,"offer"),counter:rt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Na(e={},t={}){if(!Wt(t))throw new Error("OPENSEA_API_KEY required");let n=Mo(e.chain);n.contract=e.contract?ee(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=$o(e.tokenId),i=await k(`${Gn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:Kn(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 f_(a,n,o,s)}function h_(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 Th(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"&&Th(n))}function Ch(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function Nh(e){return!e||typeof e!="object"?!1:Ch(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&Nh(t))}function Oh(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"&&Oh(o,t,n);return t}function fh(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Rh(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Ch(e))throw new Error("opensea: signed transaction material refused");if((e.from?ee(fh(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ee(fh(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=Y1.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=n_(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Oa(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 Nl(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}=Oa(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(()=>(Ee(),fa)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let m=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(m).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(Ee(),fa)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>m?u:m}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function g_(e,t){if(Th(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(Nh(e))throw new Error("opensea: signed transaction material refused");let n=Oh(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=>Rh(r,t))}function y_(e,t,n={}){return B({...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 $h(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function Lh(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function w_(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=ee(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Ra(e={},t={}){if(!Wt(t))throw new Error("OPENSEA_API_KEY required");h_(e);let{chain:n,chainId:r}=Mo(e.chain),o=ee(e.buyer||e.minter||e.address,"buyer"),i=ee(e.contract,"NFT contract"),a=kh(e.quantity),s=Ze(e.priceWei,"priceWei"),c=Ze(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Eh(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 Lo(d,t),m=w_(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await k(`${Gn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:Kn(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 x=new Set(b.map(N=>ee(N,"SeaDrop mint target"))),w=g_(h,{buyer:o,chainId:r,targets:x});if(w.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,S,E=null,v;try{y=Ia.decodeFunctionData("mintPublic",w[0].data),S="public",v=Ia.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Ia.decodeFunctionData("mintAllowList",w[0].data),S="allowlist";let N=y[4],U=[...y[5]].map(String);if(U.length<1||U.length>64||U.some(Y=>!/^0x[0-9a-fA-F]{64}$/.test(Y)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let $=BigInt(N.startTime),q=BigInt(N.endTime),te=BigInt(Math.floor(l/1e3));if($>te||q<=te)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(N.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(N.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");v=Ia.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],N,U]),E={mintPrice:BigInt(N.mintPrice).toString(),maxTotalMintableByWallet:BigInt(N.maxTotalMintableByWallet).toString(),startTime:$.toString(),endTime:q.toString(),dropStageIndex:BigInt(N.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(N.maxTokenSupplyForStage).toString(),feeBps:Number(N.feeBps),restrictFeeRecipients:!!N.restrictFeeRecipients,proof:U}}catch(N){throw/opensea:/.test(String(N?.message||""))?N:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let A=ee(y[0],"mint NFT contract"),P=ee(y[1],"mint fee recipient"),T=ee(y[2],"mint recipient");if(A!==m)throw new Error("opensea: mint calldata collection mismatch");if(T!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(v.toLowerCase()!==w[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let C=w.reduce((N,U)=>N+U.valueWei,0n);if(C!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(C>c)throw new Error("opensea: mint total exceeds total cap");let I=await Nl(w,r,{...t,provider:e.provider||t.provider});if(I.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let F=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},D=dh({chainId:r,tx:w[0],policy:F});return y_({action:"mint",mintType:S,...E?{stage:E}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:C.toString(),maxTotalWei:c.toString(),mintTarget:w[0].to,feeRecipient:P,expiry:u,transactions:w.map(Oa),gasWar:D,...I},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+pl,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function b_(e={}){let t=bh(e.chain);if(yh.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?ph(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=ph(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:ee(e.contract,"NFT contract"),token_id:o,quantity:e_(e.quantity??1,"quantity"),price:{amount:Z1(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ee(e.price?.currency??e.currency??Ro,"price currency")},start_time:n.text,end_time:r.text}}var Sr={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"}]},hh=new _a(["function setApprovalForAll(address operator,bool approved)"]),x_=new _a(["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 gh(e,t){return e?.[t]||(e?.action===t?e:null)}function v_(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(w=>gh(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=ee(c.verifyingContract,"listing protocol"),u=s.message;if(ee(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(ee(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||ee(w.token,"listing payment token")!==Ro)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(w.startAmount),S=BigInt(w.endAmount);if(y<=0n||y!==S)throw new Error("opensea: listing consideration must be fixed and positive");ee(w.recipient,"listing consideration recipient"),p+=y}let m=V1(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=Tl.hashStruct("OrderComponents",Sr,u),b=o.map(w=>gh(w,"itemApprovalAction")).find(Boolean)||o.find(w=>/setApprovalForAll/i.test(String(w?.action||""))),x=null;if(b){let w=b.transaction||b.itemApprovalAction?.transaction,y=Rh(w,{buyer:t,chainId:r,targets:new Set([n.contract])}),S;try{S=hh.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=ee(S[0],"listing approval operator");if(S[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(hh.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:Sr,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function $a(e={},t={}){if(!Wt(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=ee(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(b_);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=ee(e.taker,"taker"));let c=await k(`${Gn(t)}/listings/actions`,{method:"POST",headers:Kn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Mo(o[0].chain),u=v_(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await Nl(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return B({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(Oa),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 Bh(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Mo(e.chain),o=ee(e.seller||e.address||e.owner,"seller"),i=ee(e.protocolAddress,"reviewed Seaport protocol address"),a=ee(e.contract,"NFT contract"),s=$o(e.tokenId),c=kh(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[A,P]of Object.entries(Sr)){let T=l.types?.[A];if(!Array.isArray(T)||T.length!==P.length||T.some((C,I)=>C?.name!==P[I].name||C?.type!==P[I].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(A=>A!=="EIP712Domain").sort().join(",")!==Object.keys(Sr).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=ee(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ee(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(ee(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if($o(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=Ze(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=Ze(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let A of m.consideration){if(Number(A.itemType)!==0||ee(A.token,"cancellation payment token")!==Ro)throw new Error("opensea: cancellation requires native fixed-price consideration");let P=Ze(A.startAmount,"cancellation consideration startAmount",{positive:!0}),T=Ze(A.endAmount,"cancellation consideration endAmount",{positive:!0});if(P!==T)throw new Error("opensea: cancellation consideration must be fixed and positive");ee(A.recipient,"cancellation consideration recipient")}let b=Ze(m.startTime,"cancellation startTime");if(Ze(m.endTime,"cancellation endTime",{positive:!0})<=b)throw new Error("opensea: cancellation listing time bounds invalid");let w=Tl.hashStruct("OrderComponents",Sr,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 S=x_.encodeFunctionData("cancel",[[m]]),E=[{from:o,to:p,data:S,value:"0x0",valueWei:0n,chainId:r}],v=await Nl(E,r,{...t,provider:e.provider||t.provider});if(v.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return B({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:Sr,primaryType:"OrderComponents",message:m},transactions:E.map(Oa),...v,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}Ee();xr();var La=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"}),Z=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),k_=/^0x[0-9a-fA-F]{40}$/;function E_(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}k_.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))La.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 A_(e){let{ok:t,errors:n,warnings:r}=E_(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
141
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:Tc["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:jp},psbtPrepared:!1,fundingPrepared:!1}}function ra(){return Object.values(Tc).map(e=>({...e,disclaimer:jp}))}async function oa(e={}){let t=String(e.templateId||"").trim(),n=Tc[t];n||Et("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?LL(e):$L(e),o=RL(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 jp,xS,Tc,Vp=Y(()=>{ie();jp="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",xS="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Tc=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 Um={};Ut(Um,{PARASWAP_API:()=>Zv,paraswapHealth:()=>Fm,paraswapPrepare:()=>Mm,paraswapPrice:()=>mn,paraswapTokens:()=>Xc});function Po(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 Xc(e={},t={}){let n=Number(e.chainId||1);return I(`${Bm(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function mn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Po(e.srcToken,"srcToken"),destToken:Po(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 vs({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(vg(o)))r.set(s,c);let i=await I(`${Bm(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...de(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 Mm(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=Po(e.userAddress,"userAddress"),o=await mn(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Po(e.srcToken,"srcToken"),destToken:Po(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=Po(e.receiver,"receiver"));let c=await I(`${Bm(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 Fm(e={}){let t=await Xc({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var Zv,Bm,ha=Y(()=>{j();Ye();ie();hi();Zv="https://api.paraswap.io",Bm=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Zv).replace(/\/$/,"")});var LA={};Ut(LA,{CONTRACTS_EVAL_HERE:()=>s6,runContractsEval:()=>a6});import cl from"node:fs";import Vn from"node:path";import{spawnSync as GU}from"node:child_process";import{fileURLToPath as KU}from"node:url";function n6(){let e=process.env.HOME||"";for(let t of["forge",Vn.join(e,".foundry/bin/forge")])if(GU(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function RA(e,t=[]){if(!cl.existsSync(e))return t;for(let n of cl.readdirSync(e)){let r=Vn.join(e,n);if(cl.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;RA(r,t)}else n.endsWith(".sol")&&!r.includes(`${Vn.sep}lib${Vn.sep}`)&&t.push(r)}return t}function r6(){let e=[];for(let t of Object.keys(yr)){let n=Vn.join(YU,t),r=RA(Vn.join(n,"src")),o=[];for(let i of r){let a=cl.readFileSync(i,"utf8");for(let s of JU)s.test(a)&&o.push(`${Vn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function o6(){return n6()?Object.keys(yr).map(e=>{try{let t=ta(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(yr).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function i6(){let e=[],t=ra();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 oa({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:XU,programId:QU,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 oa({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[ZU,e6],recoveryPubkey:t6,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 a6(){let e=r6(),t=o6(),n=await i6(),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 YU,JU,XU,QU,ZU,e6,t6,s6,$A=Y(()=>{vc();_c();Vp();Sc();YU=xc("protocols/templates",import.meta.url),JU=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],XU="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",QU="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",ZU="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",e6="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",t6="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";s6=Vn.dirname(KU(import.meta.url))});import{createHash as N6}from"node:crypto";function Wt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Co(e){return typeof e=="number"&&Number.isFinite(e)}function eh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)eh(t);return Object.freeze(e)}for(let t of Object.keys(e))eh(e[t]);return Object.freeze(e)}function Pr(e){if(Array.isArray(e))return e.map(Pr);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Pr(e[n]);return t}return e}function Qf(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 u1(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function O6(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function R6(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function L6(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 p1(e){if(!Wt(e))throw new TypeError("evidence artifact must be a plain object");if(!C6.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(!Wt(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(!Wt(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Wt(e.train)||!Wt(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Pr({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Pr(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 m1(e){return N6("sha256").update(JSON.stringify(p1(e)),"utf8").digest("hex")}function Bt(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Zf(e,t){if(!Wt(e)||!Wt(e.metrics))throw new Error(`${t} metrics required`);let n=Bt(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(!Co(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 $6(e,{maxDailyLossPct:t}={}){let n=e.split,r=Bt(n.trainStartIndex,"split.trainStartIndex"),o=Bt(n.trainEndIndex,"split.trainEndIndex"),i=Bt(n.trainBarCount,"split.trainBarCount",1),a=Bt(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Bt(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Bt(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(!Co(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Zf(e.train,"train");let l=Zf(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Co(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(!Wt(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=Bt(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),x=Bt(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),w=Bt(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),y=Bt(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||x>=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=Zf({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(Co(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(!Co(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 f1(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=p1(e),r=Pr({id:e.id,...n});if(JSON.stringify(Pr(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=m1(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&$6(e,t),e}function th({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let a=[];if(!Wt(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Wt(n))throw new TypeError("backtestOptions must be a plain object");if(!Co(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=tt(e),c=Oo(s),l=Ta(t),u=t.length,d=(O=[],F={})=>d1({status:"fail",strategy:s,sHash:c,barsHash:l,split:F.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:F.train||null,holdout:F.holdout||null,walkForward:F.walkForward||{windows:[],passRate:0},flags:[...a,...O]});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,x;try{b=Gn(s,h,n),x=Gn(s,g,n)}catch(O){return d([{type:"backtest_error",message:String(O.message||O)}])}let w={metrics:Qf(b),costs:u1(b),tradeCount:b.metrics.tradeCount},y={metrics:Qf(x),costs:u1(x),tradeCount:x.metrics.tradeCount},k={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:m,holdoutEndIndex:u-1,holdoutBarCount:f,trainFraction:r},v=[],S=Math.floor(u/(o+1));if(S<3)a.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:S});else for(let O=0;O<o;O++){let F=S*(O+1),Q=F,K=Math.min(u,Q+S);if(K-Q<3||F<3){v.push({index:O,trainStartIndex:0,trainEndIndex:F-1,evalStartIndex:Q,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Re=t.slice(Q,K),ct;try{ct=Gn(s,Re,n)}catch{v.push({index:O,trainStartIndex:0,trainEndIndex:F-1,evalStartIndex:Q,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let q=Qf(ct),H=L6(q,s.risk,i);v.push({index:O,trainStartIndex:0,trainEndIndex:F-1,evalStartIndex:Q,evalEndIndex:K-1,passed:H,reason:H?"pass":"fail_metrics",metrics:q})}let E=v.filter(O=>O.passed).length,_=v.length===0?0:E/v.length,T={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=O6(y.costs),A=R6(x);A>0&&N>A&&a.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let M=a.some(O=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(O.type)),D=a.some(O=>O.type==="overfit"),C="fail";return y.metrics.tradeCount>=i&&y.metrics.netPnlUsd>0&&y.metrics.profitFactor>1&&y.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&_>=.6&&!(A>0&&N>A)&&!D&&!a.some(O=>O.type==="severe_oos_collapse"||O.type==="invalid_windowing")?C="pass_live_eligible":!M&&y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&Number.isFinite(y.metrics.netPnlUsd)?(C="pass_paper_only",y.metrics.tradeCount<i&&a.push({type:"undersampled",message:"holdout trades below minTrades"})):D&&y.metrics.tradeCount>0&&w.metrics.netPnlUsd>0?C="fail":y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&!M?C="pass_paper_only":C="fail",y.metrics.netPnlUsd<0&&(C=C==="pass_live_eligible"?"fail":C==="pass_paper_only"?"pass_paper_only":"fail",C="fail"),d1({status:C,strategy:s,sHash:c,barsHash:l,split:k,train:w,holdout:y,walkForward:T,flags:a})}function d1({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:Nr,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c};return l.id=m1(l),eh(Pr(JSON.parse(JSON.stringify(l))))}var C6,nh=Y(()=>{Cr();Tr();ml();C6=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function Na(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function M6(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function oh(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>oh(n,`${t}[${r}]`));return}if(Na(e))for(let[n,r]of Object.entries(e)){let o=M6(n);if(B6.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);oh(r,`${t}.${n}`)}}function rh(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function h1({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(oh({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Na(e))throw new Error("handoff: strategy required");if(!Na(t))throw new Error("handoff: evidence required");if(!Na(n))throw new Error("handoff: shadow required");if(!Na(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let a=tt(e,{nowMs:o}),s=nt(a);if(f1(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(!rh(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(!rh(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(!rh(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:Ca,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 B6,g1=Y(()=>{Cr();nh();Tr();ie();B6=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Ro(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Lo(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Oa(e){if(Array.isArray(e))for(let t of e)Oa(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Oa(t);return Object.freeze(e)}function U6(e){let t=F6[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function q6(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Lo(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=Lo(Number(o.t),`candles[${r}].t`);if(Lo(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:Ro(o.o,`candles[${r}].o`),h:Ro(o.h,`candles[${r}].h`),l:Ro(o.l,`candles[${r}].l`),c:Ro(o.c,`candles[${r}].c`),v:Ro(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 Oa([...n.values()].sort((r,o)=>r.t-o.t))}function D6(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=Lo(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Ro(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function H6({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 ms({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 D6(o,n)}function j6(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 y1(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=U6(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Lo(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):Lo(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Hr({coin:n,interval:r,startTime:s,endTime:i},t),H6({coin:n,startTime:s,endTime:i},t)]),u=q6(c,{endTime:i}),d=Oa(j6(u,l,o));return Oa({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var F6,w1=Y(()=>{pt();F6=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 W6(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))V6.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"||!z6.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 G6(e={}){let t=await ps(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 z6,V6,b1,x1=Y(()=>{pt();g1();w1();z6=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),V6=new Set(["coin","interval"]);b1=Object.freeze({id:"hyperliquid",validateMarket:W6,fetchBars:y1,listMarkets:G6,prepareIntent(e){return h1(e)}})});function Y6(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 K6.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 ih(e){return typeof e!="string"?null:J6.get(e)??null}function ah(e){let t=ih(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var K6,S1,J6,KV,sh=Y(()=>{x1();K6=Object.freeze(["id","validateMarket","prepareIntent"]);S1=[b1].map(Y6),J6=new Map(S1.map(e=>[e.id,e])),KV=Object.freeze([...S1])});import{createHash as X6}from"node:crypto";function At(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ce(e){return typeof e=="number"&&Number.isFinite(e)}function T1(e){return Number.isInteger(e)&&e>0}function ph(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ph(t);return Object.freeze(e)}for(let t of Object.keys(e))ph(e[t]);return Object.freeze(e)}function mh(e){if(Array.isArray(e))return e.map(mh);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=mh(e[n]);return t}return e}function L(e,t,n){e.push({path:t,message:n})}function Kn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||L(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function R1(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 dh(e,t,n,r){if(At(e)){if(Kn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return L(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return L(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!At(o)||![o.value,o.min,o.max,o.step].every(T1)?(L(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return T1(e)?e:(L(r,t,"must be a positive integer or {param}"),null)}function N1(e,t,n,r){return At(e)?(Kn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(L(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(L(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Ce(e)?e:(L(r,t,"must be a finite number or {param}"),null)}function fl(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 a5(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 fl(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 s5(e,t){if(!At(e))return L(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>A1)return L(t,"parameters",`too many parameters (max ${A1})`),null;let r={};for(let o of n){if(!C1.test(o)){L(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!At(i)){L(t,a,"must be a plain object");continue}Kn(i,v1,a,t);for(let d of v1)d in i||L(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Ce(c)||L(t,`${a}.min`,"must be a finite number"),Ce(l)||L(t,`${a}.max`,"must be a finite number"),(!Ce(u)||u<=0)&&L(t,`${a}.step`,"must be a positive finite number"),Ce(s)||L(t,`${a}.value`,"must be a finite number"),Ce(c)&&Ce(l)&&c>l&&L(t,`${a}.min`,"min must be <= max"),Ce(s)&&Ce(c)&&Ce(l)&&Ce(u)&&u>0&&(R1(s,c,l,u)||L(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 c5(e,t,n,r){let o=`nodes.${t}`;if(!At(e))return L(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!I1[e.type])return L(r,`${o}.type`,"unknown or missing node type"),Kn(e,i5,o,r),null;switch(Kn(e,I1[e.type],o,r),(typeof e.id!="string"||!O1.test(e.id))&&L(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Q6.has(e.field))&&L(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=N1(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Z6.has(e.indicator))&&L(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?L(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=dh(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?L(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))L(r,`${o}.period`,"required field is missing");else{let s=dh(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))L(r,`${o}.${s}`,"required field is missing");else{let c=dh(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?r5.has(e.output)?a.output=e.output:L(r,`${o}.output`,"must be line|signal|histogram"):L(r,`${o}.output`,"required field is missing"),"period"in e&&L(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&L(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))L(r,`${o}.stdDev`,"required field is missing");else{let s=N1(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?L(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?o5.has(e.output)?a.output=e.output:L(r,`${o}.output`,"must be upper|middle|lower"):L(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&L(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&L(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&L(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&L(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!e5.has(e.op))&&L(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&L(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&L(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"||!t5.has(e.op))&&L(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return L(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?L(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&L(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&L(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"||!n5.has(e.direction))&&L(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&L(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&L(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 l5(e,t,n){if(!At(e))return L(t,"risk","must be a plain object"),null;Kn(e,E1,"risk",t);for(let p of E1)(!(p in e)||e[p]==null)&&L(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Ce(o)||o<=0||o>50?L(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Ce(i)||i<=0?L(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Ce(a)||a<=0||a>100?L(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Ce(s)||s<=0||s>100?L(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Ce(c)||c<=0||c>1e3?L(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?L(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Ce(u)||u<=0||u>100?L(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?L(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&L(t,"risk.expiresAt","must be strictly greater than nowMs"):L(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function fh(e,t={}){let n=[];if(!At(e))return L(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Kn(e,k1,"",n);for(let d of k1)(!(d in e)||e[d]==null)&&L(n,d,"required field is missing");e.version!==ch&&L(n,"version",`must be ${ch}`),(typeof e.id!="string"||!C1.test(e.id))&&L(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>P1)&&L(n,"name",`must be a non-empty string max ${P1}`);let r=ih(e.venue);r||L(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)At(e.market)||L(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))L(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)L(n,p.path,p.message)}let i=s5(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))L(n,"nodes","must be an array");else if(e.nodes.length>_1)L(n,"nodes",`too many nodes (max ${_1})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=c5(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&O1.test(p.id)&&(s.has(p.id)?L(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 fl(p))s.has(f)||L(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of fl(p)){let h=s.get(f);h&&lh.has(h.type)&&L(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of fl(p)){let h=s.get(f);h&&!lh.has(h.type)&&L(n,m,`node ref "${f}" must be boolean`)}}a5(s)&&L(n,"nodes","graph contains a cycle")}let c=null;if(!At(e.rules))L(n,"rules","must be a plain object");else{Kn(e.rules,uh,"rules",n);for(let d of uh)d in e.rules||L(n,`rules.${d}`,"required field is missing");c={};for(let d of uh){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){L(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){L(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);lh.has(m.type)||L(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=l5(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=ph({version:ch,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 tt(e,t={}){let n=fh(e,t);if(!n.ok)throw new $o(n.errors);return n.strategy}function u5(e){let t=tt(e);return JSON.stringify(mh(t))}function Oo(e){let t=u5(e);return X6("sha256").update(t,"utf8").digest("hex")}function Ra(e,t){if(!At(e))throw new $o([{path:"",message:"strategy must be a plain object"}]);if(!At(t))throw new $o([{path:"overrides",message:"must be a plain object"}]);let n=tt(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)){L(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Ce(a)){L(o,i,"override must be a finite number");continue}if(!R1(a,s.min,s.max,s.step)){L(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new $o(o);return tt({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 ch,C1,O1,Q6,Z6,e5,t5,n5,r5,o5,lh,k1,v1,uh,E1,i5,I1,A1,_1,P1,$o,Tr=Y(()=>{sh();ch=1,C1=/^[a-z0-9][a-z0-9._-]{0,63}$/,O1=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Q6=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),Z6=new Set(["sma","ema","rsi","macd","bollinger","atr"]),e5=new Set(["gt","gte","lt","lte","eq"]),t5=new Set(["and","or","not"]),n5=new Set(["above","below"]),r5=new Set(["line","signal","histogram"]),o5=new Set(["upper","middle","lower"]),lh=new Set(["compare","logic","cross"]),k1=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),v1=new Set(["value","min","max","step"]),uh=new Set(["entryLong","entryShort","exitLong","exitShort"]),E1=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),i5=new Set(["id","type"]),I1={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"])},A1=16,_1=128,P1=100,$o=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 La(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 Yn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function d5(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 $1(e,t){La(e),Yn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function hl(e,t){La(e),Yn(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 B1(e,t){La(e),Yn(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]=L1(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]=L1(i,a)}return n}function L1(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function M1(e,t={}){La(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Yn(n),Yn(r),Yn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=hl(e,n),a=hl(e,r),s=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&a[d]!=null&&(s[d]=i[d]-a[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<s.length;d++)s[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=s[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=s[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*s[g]+(1-f)*p,c[g]=p,l[g]=s[g]-p}}return{line:s,signal:c,histogram:l}}function F1(e,t={}){La(e);let n=t.period,r=t.stdDev;if(Yn(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 U1(e,t){d5(e),Yn(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 q1=Y(()=>{});import{createHash as p5}from"node:crypto";var hh,m5,f5,h5,D1,H1=Y(()=>{hh=2,m5="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",f5="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",h5="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",D1=p5("sha256").update(JSON.stringify({version:hh,compilerSourceHash:m5,indicatorsSourceHash:f5,schemaSourceHash:h5})).digest("hex")});function Mt(e){return typeof e=="number"&&Number.isFinite(e)}function w5(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 Bo(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function b5(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:a,o:s,h:c,l,c:u,v:d}=i;if(!Mt(a)&&(typeof a=="number"&&Number.isFinite(a)),!Number.isFinite(a))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u],["v",d]])if(!Mt(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(s,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(s,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(a>r))throw new TypeError("bars t must be strictly increasing");if(a-r!==y5[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Mt(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Mt(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Or(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=g5[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=Bo(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?Bo(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=U1(d,c);break}let u=Or(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Mt(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=$1(u,c);else if(a.indicator==="ema")s=hl(u,c);else if(a.indicator==="rsi")s=B1(u,c);else if(a.indicator==="macd")s=M1(u,{fastPeriod:Bo(a.fastPeriod,n),slowPeriod:Bo(a.slowPeriod,n),signalPeriod:Bo(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=F1(u,{period:c,stdDev:Bo(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=Or(a.left,t,n,r,o,i),l=Or(a.right,t,n,r,o,i);s=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!Mt(d)||!Mt(p)){s[u]=!1;continue}switch(a.op){case"gt":s[u]=d>p;break;case"gte":s[u]=d>=p;break;case"lt":s[u]=d<p;break;case"lte":s[u]=d<=p;break;case"eq":s[u]=d===p;break;default:s[u]=!1}}break}case"logic":{let c=a.inputs.map(l=>Or(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=Or(a.left,t,n,r,o,i),l=Or(a.right,t,n,r,o,i);s=new Array(o+1),s[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!Mt(d)||!Mt(p)||!Mt(m)||!Mt(f)){s[u]=!1;continue}a.direction==="above"?s[u]=d<=p&&m>f:s[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${a.type}`)}return i.set(e,s),s}function nt(e,t={}){let n=tt(e);t&&Object.keys(t).length&&(n=Ra(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(w5(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=Oo(n);function l(m,f){let h={};for(let b of o){let x=m.get(b);h[b]=x[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){b5(m,f,n.market.interval);let h=new Map;for(let g of o)Or(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:Ca,compilerHash:Nr,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}var Ca,Nr,g5,y5,Cr=Y(()=>{Tr();q1();H1();Ca=hh,Nr=D1,g5=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),y5=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 x5}from"node:crypto";function k5(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Gt(e){return typeof e=="number"&&Number.isFinite(e)}function gh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)gh(t);return Object.freeze(e)}for(let t of Object.keys(e))gh(e[t]);return Object.freeze(e)}function gl(e){if(Array.isArray(e))return e.map(gl);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=gl(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 z1(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(!Gt(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(!Gt(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&&!Gt(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!Gt(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!Gt(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function Ta(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&z1(e),x5("sha256").update(JSON.stringify(gl(e)),"utf8").digest("hex")}function v5(e){if(e==null&&(e={}),!k5(e))throw new TypeError("options must be a plain object");let t={...S5},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(!Gt(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(!Gt(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(!Gt(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 yl(e){return e/1e4}function E5(e,t,n){let r=yl(n);return t==="long"?e*(1+r):e*(1-r)}function I5(e,t,n){let r=yl(n);return t==="long"?e*(1-r):e*(1+r)}function j1(e,t,n){let r=Math.abs(e)*yl(t),o=Math.abs(e)*yl(n);return{taker:r,builder:o,total:r+o}}function A5(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function _5(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function P5(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function T5(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 N5(e,t,n){return t==="long"?e.l<=n:e.h>=n}function C5(e,t,n){return t==="long"?e.h>=n:e.l<=n}function O5(e,t,n){return t==="long"?e.l<=n:e.h>=n}function $a(e,t){for(let n of e.requiredSeries)if(["fundingRate","openInterest"].includes(n)&&!t.every(r=>Gt(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function R5(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 L5(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 Gn(e,t,n={}){let r=v5(n);z1(t);let o=Ta(t);r.nowMs!==void 0&&tt(e,{nowMs:r.nowMs});let i=nt(e);if($a(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,x=[],w=[],y=[],k=[],v=[],S=null,E=0,_=null,T=p,N=!1,A=0,M=0,D=[],C=new Array(t.length).fill(0);function U(B){D.push(B)}function O(B){let ae=t[B].v*(r.maxVolumeParticipationPct/100);return Math.max(0,ae-C[B])}function F(B){if(!S)return p;let ae=S.side==="long"?(B-S.entryPrice)*S.qty:(S.entryPrice-B)*S.qty;return p+ae}function Q(B,ae,W){let Ie=W.o,ue=A5(p,a);if(!(ue>0)||!(Ie>0))return;let Ae=E5(Ie,ae,l),xe=ue/Ae,Le=O(B),Uo=Ae*Le;if(xe>Le){y.push({kind:"entry",barIndex:B,time:W.t,side:ae,requestedNotionalUsd:ue,maxFillNotionalUsd:Uo,reason:"volume_participation"});return}C[B]+=xe;let Ft=Math.abs(Ae-Ie)*xe,Jt=j1(ue,u,d);p-=Jt.total,m+=Jt.taker,f+=Jt.builder,g+=Ft,b+=ue,S={lifecycleEpoch:++M,side:ae,entryBarIndex:B,entryReferencePrice:Ie,entryPrice:Ae,qty:xe,notionalUsd:ue,stop:_5(Ae,ae,a.stopLossPct),take:P5(Ae,ae,a.takeProfitPct),liq:T5(Ae,ae,a.maxLeverage,u+d),entryFees:Jt.taker,entryBuilderFees:Jt.builder,entrySlippageUsd:Ft,fundingAccrued:0}}function K(B,ae,W,Ie){if(!S)return!1;let ue=S.side,Ae=ae,xe=Ae;W!=="liquidation"&&Ie&&(xe=I5(Ae,ue,l));let Le=S.qty,Uo=Le*xe;if(W!=="liquidation"){let Lh=O(B),b_=xe*Lh;if(Le>Lh)return y.push({kind:"exit",barIndex:B,time:t[B].t,side:ue,requestedNotionalUsd:Uo,maxFillNotionalUsd:b_,reason:"volume_participation",triggerReason:W}),!1;C[B]+=Le}let Ft=j1(Uo,u,d),Jt=W==="liquidation"?0:Math.abs(xe-Ae)*Le,qo,El;ue==="long"?(qo=(Ae-S.entryReferencePrice)*Le,El=(xe-S.entryPrice)*Le):(qo=(S.entryReferencePrice-Ae)*Le,El=(S.entryPrice-xe)*Le),p+=El,p-=Ft.total,m+=Ft.taker,f+=Ft.builder,g+=Jt,b+=Uo;let w_={side:ue,entryBarIndex:S.entryBarIndex,entryTime:t[S.entryBarIndex].t,entryPrice:S.entryPrice,exitBarIndex:B,exitTime:t[B].t,exitPrice:xe,exitReason:W,qty:Le,notionalUsd:S.notionalUsd,grossPnlUsd:qo,feesUsd:S.entryFees+Ft.taker,builderFeesUsd:S.entryBuilderFees+Ft.builder,fundingUsd:S.fundingAccrued,slippageUsd:S.entrySlippageUsd+Jt,netPnlUsd:qo-(S.entryFees+Ft.taker+S.entryBuilderFees+Ft.builder)-S.fundingAccrued-(S.entrySlippageUsd+Jt)};return x.push(w_),W==="liquidation"&&w.push({barIndex:B,time:t[B].t,side:ue,price:xe,tradeIndex:x.length-1}),S=null,M+=1,A=B+1+(a.cooldownBars||0),!0}function Re(B,ae,W,Ie){let ue=B+1;if(ue>=t.length)return;D.some(xe=>xe.kind==="exit"&&xe.side===ae&&xe.fillBar===ue&&xe.epoch===Ie)||U({kind:"exit",side:ae,signalBar:B,fillBar:ue,reason:W,epoch:Ie})}function ct(B){let ae=D.filter(W=>W.fillBar===B);for(let W=D.length-1;W>=0;W--)D[W].fillBar===B&&D.splice(W,1);ae.sort((W,Ie)=>{let ue=Ae=>Ae.kind==="exit"?0:1;return ue(W)-ue(Ie)});for(let W of ae)if(W.kind==="exit"){if(!S||S.side!==W.side||S.lifecycleEpoch!==W.epoch)continue;let Ie=W.reason||"rule";K(B,t[B].o,Ie,!0)||Re(B,W.side,Ie,W.epoch)}else if(W.kind==="entry"){if(S||W.epoch!==M||B<A)continue;Q(B,W.side,t[B])}}function q(B){if(!S)return;let ae=t[B],W=ae.fundingPaymentRate;if(W==null||!Gt(W)||W===0)return;let Ie=Math.abs(S.qty*ae.c),ue=W*Ie;S.side==="long"?(p-=ue,S.fundingAccrued+=ue,h+=ue):(p+=ue,S.fundingAccrued-=ue,h-=ue)}function H(B){if(!S)return;let ae=t[B].o;(S.side==="long"?ae<=S.liq:ae>=S.liq)&&K(B,ae,"liquidation",!1)}function te(B){if(!S)return;let ae=t[B],W=S.side,Ie=O5(ae,W,S.liq),ue=N5(ae,W,S.stop),Ae=C5(ae,W,S.take),xe=Le=>W==="long"?Math.min(Le,ae.o):Math.max(Le,ae.o);if(Ie){K(B,xe(S.liq),"liquidation",!1);return}if(ue&&Ae){K(B,xe(S.stop),"stop_loss",!0)||Re(B,W,"stop_loss",S.lifecycleEpoch);return}if(ue){K(B,xe(S.stop),"stop_loss",!0)||Re(B,W,"stop_loss",S.lifecycleEpoch);return}Ae&&(K(B,S.take,"take_profit",!0)||Re(B,W,"take_profit",S.lifecycleEpoch))}for(let B=0;B<t.length;B++){let ae=Math.floor(t[B].t/864e5);ae!==_&&(_=ae,T=F(t[B].o),N=!1),H(B),ct(B),te(B),q(B),!N&&F(t[B].c)<=T*(1-a.maxDailyLossPct/100)&&(N=!0,k.push({type:"daily_loss_limit",barIndex:B,time:t[B].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let W=s[B].signals,Ie=B+c;if(S)(S.side==="long"&&W.exitLong===!0||S.side==="short"&&W.exitShort===!0)&&Ie<t.length&&(D.some(Le=>Le.kind==="exit"&&Le.side===S.side&&Le.fillBar===Ie&&Le.epoch===S.lifecycleEpoch)||U({kind:"exit",side:S.side,signalBar:B,fillBar:Ie,reason:"rule",epoch:S.lifecycleEpoch}));else{let Ae=W.entryLong===!0,xe=W.entryShort===!0;Ae&&xe?k.push({type:"conflicting_entry_signals",barIndex:B,time:t[B].t,message:"conflicting entry signals; no position opened"}):!N&&(Ae||xe)&&Ie<t.length&&B>=A&&U({kind:"entry",side:Ae?"long":"short",signalBar:B,fillBar:Ie,epoch:M})}let ue=p;S&&(E+=1,ue=F(t[B].c)),v.push({barIndex:B,time:t[B].t,equity:ue,positionSide:S?S.side:null})}let we=null;if(S){let B=t.length-1;if(K(B,t[B].c,"end_of_data",!0))v[B]={barIndex:B,time:t[B].t,equity:p,positionSide:null};else{let W=F(t[B].c);we={side:S.side,entryBarIndex:S.entryBarIndex,entryTime:t[S.entryBarIndex].t,entryPrice:S.entryPrice,qty:S.qty,notionalUsd:S.notionalUsd,markPrice:t[B].c,markedEquityUsd:W},k.push({type:"open_position_at_end",barIndex:B,time:t[B].t,message:"end-of-data exit missed; position remains open and marked"})}}let We=(S?F(t[t.length-1].c):p)-r.initialEquityUsd,Z=We/r.initialEquityUsd*100,Ee=0,_t=0,Rr=0;for(let B of x)B.netPnlUsd>0?(Ee+=1,_t+=B.netPnlUsd):B.netPnlUsd<0&&(Rr+=-B.netPnlUsd);let Yt=x.length,Xn=Yt===0?0:Ee/Yt,vl=0;Rr>0?vl=_t/Rr:_t>0&&(vl=1e12);let g_={netPnlUsd:We,netPnlPct:Z,maxDrawdownPct:L5(v),winRate:Xn,profitFactor:vl,tradeCount:Yt,sharpe:R5(v),turnoverUsd:b,exposurePct:E/t.length*100},y_={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},Rh={barsHash:o,strategyHash:i.strategyHash,compilerHash:Nr,compilerVersion:Ca,config:y_,trades:x,equityCurve:v,metrics:g_,costs:{feesUsd:m,builderFeesUsd:f,fundingUsd:h,slippageUsd:g},liquidations:w,missedFills:y,openPositionAtEnd:we,flags:k};return yh(Rh),gh(gl(Rh))}var S5,ml=Y(()=>{Cr();Tr();S5=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as $5}from"node:crypto";function j5(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function wh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)wh(t);return Object.freeze(e)}for(let t of Object.keys(e))wh(e[t]);return Object.freeze(e)}function z5(e){return String(e).trim().replace(/\s+/g," ")}function V5(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function W5(e){for(let n of M5)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 G5(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 B5.has(n)?n:null}function K5(e){let t={...U5},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 Y5(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 J5(e){let t=$5("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 X5(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 Q5(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 Z5(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 eq(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 V1(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 tq({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:V1(s.fast),ema_right_period:V1(s.slow)},nodes:c,rules:l,risk:{...r,expiresAt:o}}}function nq({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 rq({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 W1(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(!j5(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=H5;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Ve("expiresInMs must be an integer");if(r=t.expiresInMs,r<q5||r>D5)throw new Ve("expiresInMs must be between 1h and 30d")}if(F5.test(e))throw new Ve(`prompt appears to contain secrets and is rejected. ${Mo}`);let o=z5(e);if(!o)throw new Ve(`empty prompt. ${Mo}`);if(Y5(o))throw new Ve(`duplicate interval or risk clause. ${Mo}`);let i=V5(o),a=W5(o),s=G5(o);if(!i||!a||!s)throw new Ve(`could not parse side/coin/interval. ${Mo}`);let c=K5(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=J5(o),d=`Draft ${a} ${i}`.slice(0,100),p=X5(o),m=Q5(o),f=Z5(o),h=[p,m,f].filter(Boolean);if(h.length!==1)throw new Ve(`unsupported or ambiguous prompt. ${Mo}`);if(!eq(o,h[0]))throw new Ve(`unsupported or ambiguous prompt. ${Mo}`);let g,b=h[0],x={side:i,coin:a,interval:s,risk:c,expiresAt:l,id:u,name:d,spec:b};b.kind==="ema_cross"?g=tq(x):b.kind==="rsi"?g=nq(x):g=rq(x);let w=fh(g,{nowMs:n});if(!w.ok)throw new Ve(`draft failed validation: ${w.errors.map(y=>y.message).join("; ")}`);return wh(tt(g,{nowMs:n}))}var Ve,B5,M5,F5,Mo,U5,q5,D5,H5,G1=Y(()=>{Tr();Ve=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},B5=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),M5=new Set(["BTC","ETH","SOL","HYPE"]),F5=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Mo="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.",U5=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),q5=36e5,D5=30*864e5,H5=864e5});import{createHash as oq}from"node:crypto";function J1(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 X1(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function xh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)xh(t);return Object.freeze(e)}for(let t of Object.keys(e))xh(e[t]);return Object.freeze(e)}function Ba(e){if(Array.isArray(e))return e.map(Ba);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Ba(e[n]);return t}return e}function wl(e){return JSON.stringify(Ba(e))}function iq(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 aq(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=wl(r),a=wl(o);return i<a?-1:i>a?1:0}),n}function bh(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=wl(n),s=wl(o);return a<s}function Q1(e,t,n={}){if(!X1(n))throw new TypeError("options must be a plain object");for(let y of Object.keys(n))if(J1(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>K1)throw new TypeError(`maxTrials must be an integer 1..${K1}`);o=y}let i=n.objective??"netPnlUsd";if(!Y1.has(i))throw new TypeError(`objective must be one of ${[...Y1].join("|")}`);let a=n.backtestOptions??{};if(!X1(a))throw new TypeError("backtestOptions must be a plain object");for(let y of Object.keys(a))if(J1(y))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${y}"`);let s=tt(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=iq(s.parameters[y]);if(k.length===0)throw new Error(`parameter "${y}" produces an empty grid`);l[y]=k,u*=k.length}let d=aq(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=Ra(s,y),v=Gn(k,t,a);h==null&&(h=v.config);let S={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:S};m.push(E),(!f||bh(i,S,y,f.metrics,f.parameters))&&(f=E)}m.sort((y,k)=>bh(i,y.metrics,y.parameters,k.metrics,k.parameters)?-1:bh(i,k.metrics,k.parameters,y.metrics,y.parameters)?1:0);let g={...f.parameters},b=Ra(s,g),x={strategyHash:Oo(s),compilerHash:Nr,trainBarsHash:Ta(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:m.length,candidates:m,bestParameters:g,bestStrategy:b},w={id:oq("sha256").update(JSON.stringify(Ba(x)),"utf8").digest("hex"),...x};return xh(Ba(JSON.parse(JSON.stringify(w))))}var K1,Y1,Z1=Y(()=>{Cr();Tr();ml();K1=256,Y1=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import gn from"node:fs";import bl from"node:path";function xl(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Kt(e){return e==null?e:JSON.parse(JSON.stringify(e))}function cq(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Fo(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>Fo(n,`${t}[${r}]`));return}if(xl(e))for(let[n,r]of Object.entries(e)){let o=cq(n);if(sq.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);Fo(r,`${t}.${n}`)}}function lq(e){if(typeof e!="string"||!e||!bl.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function e_(e){let t;try{t=gn.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 uq(){return{version:kh,runners:[]}}function t_(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!xl(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==kh)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 Fo(n,bl.basename(t)),{version:kh,runners:n.runners.map(r=>Kt(r))}}function n_(e,t){Fo(t,"store");let n=bl.dirname(e);gn.mkdirSync(n,{recursive:!0,mode:448});let r=bl.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
142
|
+
`;try{gn.writeFileSync(r,o,{mode:384,flag:"wx"}),gn.renameSync(r,e);try{gn.chmodSync(e,384)}catch{}}catch(i){try{gn.unlinkSync(r)}catch{}throw i}}function r_(e={}){let t=e.path;if(lq(t),e_(t),gn.existsSync(t)?t_(gn.readFileSync(t,"utf8"),t):n_(t,uq()),Sh.has(t))return Sh.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 e_(t),t_(gn.readFileSync(t,"utf8"),t)}function s(f){n_(t,f)}function c(f){if(!xl(f)||typeof f.id!="string"||!f.id)throw new Error("shadow-store: create requires record with string id");Fo(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=Kt(f);return h.runners.push(g),s(h),Kt(g)}function l(f){let h=a().runners.find(g=>g.id===f);return h?Kt(h):null}function u(){return a().runners.map(f=>Kt(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 x=Kt(g.runners[b]),w=h(x);if(!xl(w)||w.id!==f)throw new Error("shadow-store: updater must return record with same id");return Fo(w,"record"),g.runners[b]=Kt(w),s(g),Kt(g.runners[b])}function p(f){let h=a(),g=h.runners.findIndex(x=>x.id===f);if(g<0)throw new Error(`shadow-store: runner not found: ${f}`);let b=Kt(h.runners[g]);return b.status!=="stopped"&&(b.status="stopped",h.runners[g]=b,s(h)),Kt(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 Sh.set(t,m),m}var kh,sq,Sh,o_=Y(()=>{kh=1,sq=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Sh=new Map});import{createHash as Ih}from"node:crypto";function vh(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Eh(e){return Array.isArray(e)?e.map(Eh):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Eh(e[t])])):e}function a_(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Ih("sha256").update(JSON.stringify(Eh(e))).digest("hex")}function dq(e,t,n,r,o){return Ih("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function pq(e,t,n,r){return Ih("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function mq(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function i_(e){return e==="entryLong"||e==="entryShort"}function Ah({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=r_({path:e});function r({strategy:c,evidenceId:l=null}={}){let u=nt(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,x)=>b.createdAt-x.createdAt||b.id.localeCompare(x.id))[0];if(p)return vh(p);let m=t(),f=pq(m,u.strategyHash,u.compilerHash,d),h=n.get(f);if(h)return vh(h);let g={id:f,strategy:vh(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=nt(d.strategy).evaluateAll(l),f=new Map;for(let A=0;A<l.length;A++)f.set(l[A].t,A);let h=d.cursor,g=[];for(let A=0;A<l.length;A++){let M=l[A].t;(h==null||M>h)&&g.push(A)}if(g.length===0)return d;let b=new Map(d.intendedOrders.map(A=>[A.id,A])),x=new Set(d.fills.map(A=>A.orderId)),w=new Map(d.missedFills.map(A=>[A.orderId,A])),y=(A,M)=>`${A}|${M}`,k=new Map(d.markouts.map(A=>[y(A.orderId,A.horizon),A])),v=d.position?{...d.position}:null,S=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,E=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function _({action:A,signalBarT:M,signalIndex:D}){let C=mq(A),U=dq(d.id,d.strategyHash,M,C,A);if(b.has(U))return b.get(U);let O=D+1,F=O<l.length,Q={id:U,action:A,type:A,side:C,signalBarT:M,fillBarT:F?l[O].t:null,status:F?"open":"missed"};return b.set(U,Q),d.intendedOrders.push(Q),Q}function T(A,M,D){if(x.has(A.id))return;let C={orderId:A.id,action:i_(A.action)?"entry":"exit",side:A.side,price:M.o,barT:M.t,signalBarT:A.signalBarT,barIndex:D};if(d.fills.push(C),x.add(A.id),A.status="filled",A.fillBarT=M.t,w.has(A.id)&&(w.delete(A.id),d.missedFills=d.missedFills.filter(U=>U.orderId!==A.id)),i_(A.action)){v={side:A.action==="entryLong"?"long":"short",entryOrderId:A.id,entryBarT:M.t,entryPrice:M.o,entryBarIndex:D};for(let U of u){let O=y(A.id,U);if(k.has(O))continue;let F={orderId:A.id,horizon:U,entryBarT:M.t,entryPrice:M.o,side:v.side,status:"pending",close:null,barT:null};k.set(O,F),d.markouts.push(F)}}else v=null,S=Number(d.strategy?.risk?.cooldownBars)||0,E=M.t}function N(A){if(x.has(A.id)||w.has(A.id))return;let M={orderId:A.id,action:A.action,side:A.side,signalBarT:A.signalBarT,status:"missed"};w.set(A.id,M),d.missedFills.push(M),A.status="missed"}for(let A of d.intendedOrders){if(A.status==="filled"||x.has(A.id))continue;let M=f.get(A.signalBarT);if(M==null)continue;let D=M+1;D<l.length&&(h==null||l[D].t>h)&&T(A,l[D],D)}for(let A of g){let M=l[A],D=m[A].signals,C=v,U=F=>{if(v||S>0&&(E==null||M.t>=E))return;let K=_({action:F,signalBarT:M.t,signalIndex:A}),Re=A+1;Re<l.length?T(K,l[Re],Re):N(K)},O=F=>{if(!v||v.side==="long"&&F!=="exitLong"||v.side==="short"&&F!=="exitShort")return;let Q=_({action:F,signalBarT:M.t,signalIndex:A}),K=A+1;K<l.length?T(Q,l[K],K):N(Q)};C?(D.exitLong&&O("exitLong"),D.exitShort&&O("exitShort")):D.entryLong&&D.entryShort||(D.entryLong&&U("entryLong"),D.entryShort&&U("entryShort")),S>0&&E!=null&&M.t>=E&&(S-=1,S===0&&(E=null)),d.cursor=M.t,d.lastProcessedBarIndex=A}for(let A of d.markouts){if(A.status!=="pending")continue;let M=d.fills.find(U=>U.orderId===A.orderId&&U.action==="entry");if(!M)continue;let D=f.get(M.barT);if(D==null)continue;let C=D+A.horizon;if(C<l.length){A.close=l[C].c,A.barT=l[C].t,A.status="filled";let U=A.entryPrice;A.markout=A.side==="long"?(A.close-U)/U:(U-A.close)/U}}return d.position=v,d.cooldownBarsRemaining=S,d.cooldownStartT=E,d.updatedAt=t(),d})}return{start:r,step:s,list:i,get:o,stop:a}}var s_=Y(()=>{Cr();o_()});var u_={};Ut(u_,{runStrategyOperation:()=>Sq});import fq from"node:os";import hq from"node:path";function Ma(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function yq(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ph(e){if(Array.isArray(e)){for(let t of e)Ph(t);return}if(Ma(e))for(let[t,n]of Object.entries(e)){if(gq.some(r=>yq(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Ph(n)}}function wq(e){if(!Ma(e))throw new TypeError("strategy input must be a plain object");return Ph(e),e}function bq(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 _h(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=ah(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);let a=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r}),s=Array.isArray(a)?a:a?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function Th(e,t){let n=e.backtestOptions??{};if(!Ma(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function c_(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!Ma(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:Th(e,r)}}function l_(){return hq.join(fq.homedir(),".oracle","strategy-shadow.json")}function xq(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 Sq(e,t={},n={}){let r=wq(t),o=bq(r,n);if(e==="draft")return{strategy:W1(r.prompt,{nowMs:o})};if(e==="validate"){let i=nt(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=nt(r.strategy),a=await _h(i.strategy,r,n,o);$a(i,a);let s=th(c_(r,i.strategy,a,o));return e==="evidence"?s:{backtest:Gn(i.strategy,a,Th(r,o)),evidence:s}}if(e==="optimize"){let i=nt(r.strategy),a=await _h(i.strategy,r,n,o);$a(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(!Ma(d))throw new TypeError("options must be a plain object");let p=Q1(i.strategy,u,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:Th(r,o)}),m=p.bestStrategy;return{strategy:m,optimization:p,evidence:th(c_(r,m,a,o,{trainFraction:l}))}}if(e==="shadow"){let i=Ah({storePath:n.storePath??l_(),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 _h(s.strategy,r,n,o);return $a(nt(s.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${a}`)}if(e==="prepare"){let i=nt(r.strategy),a=ah(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ah({storePath:n.storePath??l_(),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??xq(i.strategy,o);return a.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:a_(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 gq,d_=Y(()=>{ml();Cr();nh();G1();Z1();s_();sh();gq=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import{createServer as kq}from"node:http";import{randomBytes as vq}from"node:crypto";import{verifyMessage as Eq}from"ethers";nr();Mr();j();bn();ie();import{readFileSync as _P,existsSync as PP}from"node:fs";import{getAddress as TP,Interface as Za,TypedDataEncoder as yu,parseUnits as NP}from"ethers";var EP=/^(0|[1-9][0-9]*)$/,fu=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function rr(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(!EP.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 IP(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function AP(e={}){return e.maxFeePerGas!=null?rr(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?rr(e.gasPrice,"gasPrice"):null}function hu(e={}){try{let t=IP(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=rr(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=rr(n.gasLimit??n.gas,"gasLimit"),s=AP(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=rr(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=rr(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:rr(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 w0(e={}){let t=hu(e);if(!t.ok)throw new fu(t);return t}var CP="https://api.opensea.io/api/v2",OP="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)",RP=new Za([`function ${OP}`]),Qa=new Za(["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"]),LP=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"]),$P=new Set(LP),E0=new Set(["solana","flow"]),Zo="0x0000000000000000000000000000000000000000";function BP(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!PP(e))return"";try{for(let t of _P(e,"utf8").split(`
|
|
143
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Qt(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||BP()}function I0(e={}){return ut({provider:"opensea",defaultUrl:CP,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function or(e={}){return I0(e).baseUrl}function ir(e={}){return it({accept:"application/json"},{"x-api-key":Qt(e)},I0(e).trusted)}function A0(e){let t=String(e||"ethereum").trim().toLowerCase();if(!$P.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function oe(e,t="address"){try{return TP(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function _0(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!E0.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return oe(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 MP(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 FP(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 b0(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 UP(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 P0(e={}){if(!Qt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await ti("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 ti(e,t={}){if(!e)throw new Error("collection slug required");if(!Qt(t))throw new Error("OPENSEA_API_KEY required");return I(`${or(t)}/collections/${encodeURIComponent(e)}`,{headers:ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function T0(e,t={}){let n=await ti(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 ni(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=A0(e.chain),r=_0(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(`${or(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 I(l.toString(),{headers:ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(UP(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 es(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=_0(e.address||e.owner),r=await I(`${or(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:ir(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 ts=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 ri(e){let t=String(e||"").trim().toLowerCase(),n=ts[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function at(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 qP(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 ei(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function N0(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 C0(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 DP(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function HP(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=oe(e?.token,t);if(n===0&&r!==Zo)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Zo)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function jP(e,t){let n=at(e?.startAmount,`${t} startAmount`),r=at(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 gu(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(DP);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=HP(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+=jP(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var zP=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 dt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function x0(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 O0(e,t){return{itemType:Number(dt(e?.itemType,`${t} itemType`)),token:oe(e?.token,`${t} token`),identifierOrCriteria:dt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:dt(e?.startAmount,`${t} startAmount`),endAmount:dt(e?.endAmount,`${t} endAmount`)}}function VP(e,t){return{...O0(e,t),recipient:oe(e?.recipient,`${t} recipient`)}}function WP(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:oe(e.offerer,`${t} offerer`),zone:oe(e.zone,`${t} zone`),offer:n.map((o,i)=>O0(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>VP(o,`${t} consideration[${i}]`)),orderType:Number(dt(e.orderType,`${t} orderType`)),startTime:dt(e.startTime,`${t} startTime`),endTime:dt(e.endTime,`${t} endTime`),zoneHash:x0(e.zoneHash,`${t} zoneHash`),salt:dt(e.salt,`${t} salt`),conduitKey:x0(e.conduitKey,`${t} conduitKey`),counter:dt(e.counter,`${t} counter`)}}function R0(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=WP(t,n);if(yu.hashStruct("OrderComponents",zP,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function L0(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=oe(e?.token,`${t} contract`),o=ei(e?.identifierOrCriteria),i=at(e?.startAmount,`${t} startAmount`,{positive:!0}),a=at(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 GP(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 L0(r[0],`${t} offer NFT`)}function KP(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=L0(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 YP(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&oe(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 JP(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 $0(e,t,n,r){let o=dt(t?.startTime,`${r} startTime`),i=dt(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=C0(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&JP(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function XP(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(ts[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=GP(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;YP(e.asset,s,c,"listing");let l=at(e.price?.current?.value,"listing price",{positive:!0}),u=R0(e,i,"listing"),d=gu(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:oe(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:$0(e,i,n,"listing"),counter:dt(i?.counter,"listing counter")}}async function wu(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=ri(e.chain);n.contract=e.contract?oe(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(`${or(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await I(i.toString(),{headers:ir(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=>XP(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function ns(e={},t={}){let n=ei(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 wu({...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 QP(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=KP(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=at(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=gu(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=gu(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:R0(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:oe(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:$0(e,i,r,"offer"),counter:dt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function rs(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=ri(e.chain);n.contract=e.contract?oe(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=ei(e.tokenId),i=await I(`${or(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:ir(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 QP(a,n,o,s)}function ZP(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 B0(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"&&B0(n))}function M0(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function F0(e){return!e||typeof e!="object"?!1:M0(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&F0(t))}function U0(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"&&U0(o,t,n);return t}function S0(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function q0(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(M0(e))throw new Error("opensea: signed transaction material refused");if((e.from?oe(S0(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=oe(S0(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=RP.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=qP(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function os(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 bu(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}=os(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(),Da)),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(),Da)),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 eT(e,t){if(B0(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(F0(e))throw new Error("opensea: signed transaction material refused");let n=U0(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=>q0(r,t))}function tT(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 D0(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function H0(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function nT(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=oe(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function is(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");ZP(e);let{chain:n,chainId:r}=ri(e.chain),o=oe(e.buyer||e.minter||e.address,"buyer"),i=oe(e.contract,"NFT contract"),a=N0(e.quantity),s=at(e.priceWei,"priceWei"),c=at(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=C0(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 ti(d,t),m=nT(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await I(`${or(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:ir(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 x=new Set(b.map(C=>oe(C,"SeaDrop mint target"))),w=eT(h,{buyer:o,chainId:r,targets:x});if(w.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,k,v=null,S;try{y=Qa.decodeFunctionData("mintPublic",w[0].data),k="public",S=Qa.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Qa.decodeFunctionData("mintAllowList",w[0].data),k="allowlist";let C=y[4],U=[...y[5]].map(String);if(U.length<1||U.length>64||U.some(K=>!/^0x[0-9a-fA-F]{64}$/.test(K)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let O=BigInt(C.startTime),F=BigInt(C.endTime),Q=BigInt(Math.floor(l/1e3));if(O>Q||F<=Q)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(C.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(C.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");S=Qa.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],C,U]),v={mintPrice:BigInt(C.mintPrice).toString(),maxTotalMintableByWallet:BigInt(C.maxTotalMintableByWallet).toString(),startTime:O.toString(),endTime:F.toString(),dropStageIndex:BigInt(C.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(C.maxTokenSupplyForStage).toString(),feeBps:Number(C.feeBps),restrictFeeRecipients:!!C.restrictFeeRecipients,proof:U}}catch(C){throw/opensea:/.test(String(C?.message||""))?C:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=oe(y[0],"mint NFT contract"),_=oe(y[1],"mint fee recipient"),T=oe(y[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(T!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(S.toLowerCase()!==w[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let N=w.reduce((C,U)=>C+U.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 A=await bu(w,r,{...t,provider:e.provider||t.provider});if(A.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let M=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},D=w0({chainId:r,tx:w[0],policy:M});return tT({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(os),gasWar:D,...A},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Kl,Date.parse(u),v?Number(BigInt(v.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function rT(e={}){let t=A0(e.chain);if(E0.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?b0(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=b0(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:oe(e.contract,"NFT contract"),token_id:o,quantity:FP(e.quantity??1,"quantity"),price:{amount:MP(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:oe(e.price?.currency??e.currency??Zo,"price currency")},start_time:n.text,end_time:r.text}}var Fr={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"}]},k0=new Za(["function setApprovalForAll(address operator,bool approved)"]),oT=new Za(["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 v0(e,t){return e?.[t]||(e?.action===t?e:null)}function iT(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(w=>v0(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=oe(c.verifyingContract,"listing protocol"),u=s.message;if(oe(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(oe(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||oe(w.token,"listing payment token")!==Zo)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");oe(w.recipient,"listing consideration recipient"),p+=y}let m=NP(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=yu.hashStruct("OrderComponents",Fr,u),b=o.map(w=>v0(w,"itemApprovalAction")).find(Boolean)||o.find(w=>/setApprovalForAll/i.test(String(w?.action||""))),x=null;if(b){let w=b.transaction||b.itemApprovalAction?.transaction,y=q0(w,{buyer:t,chainId:r,targets:new Set([n.contract])}),k;try{k=k0.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let v=oe(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(k0.encodeFunctionData("setApprovalForAll",[v,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:v}}return{protocolAddress:l,typedData:{domain:c,types:Fr,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function as(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=oe(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(rT);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=oe(e.taker,"taker"));let c=await I(`${or(t)}/listings/actions`,{method:"POST",headers:ir(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=ri(o[0].chain),u=iT(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await bu(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(os),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 j0(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=ri(e.chain),o=oe(e.seller||e.address||e.owner,"seller"),i=oe(e.protocolAddress,"reviewed Seaport protocol address"),a=oe(e.contract,"NFT contract"),s=ei(e.tokenId),c=N0(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(Fr)){let T=l.types?.[E];if(!Array.isArray(T)||T.length!==_.length||T.some((N,A)=>N?.name!==_[A].name||N?.type!==_[A].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(Fr).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=oe(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(oe(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(oe(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(ei(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=at(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=at(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||oe(E.token,"cancellation payment token")!==Zo)throw new Error("opensea: cancellation requires native fixed-price consideration");let _=at(E.startAmount,"cancellation consideration startAmount",{positive:!0}),T=at(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(_!==T)throw new Error("opensea: cancellation consideration must be fixed and positive");oe(E.recipient,"cancellation consideration recipient")}let b=at(m.startTime,"cancellation startTime");if(at(m.endTime,"cancellation endTime",{positive:!0})<=b)throw new Error("opensea: cancellation listing time bounds invalid");let w=yu.hashStruct("OrderComponents",Fr,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=oT.encodeFunctionData("cancel",[[m]]),v=[{from:o,to:p,data:k,value:"0x0",valueWei:0n,chainId:r}],S=await bu(v,r,{...t,provider:e.provider||t.provider});if(S.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:Fr,primaryType:"OrderComponents",message:m},transactions:v.map(os),...S,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}_e();$r();var ss=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),ne=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),J=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),sT=/^0x[0-9a-fA-F]{40}$/;function cT(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let a=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${a} must be an object`);continue}sT.test(i.address||"")||t.push(`${a}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${a}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${a}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${a}.verified.method is required`),i.verified.source||t.push(`${a}.verified.source is required`),i.verified.date||n.push(`${a}.verified.date missing -- add one so staleness is visible`)):t.push(`${a} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))ss.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 lT(e){let{ok:t,errors:n,warnings:r}=cT(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
144
144
|
- ${n.join(`
|
|
145
|
-
- `)}`);let o=e.capabilities||{},i=La.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:La.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of La)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 Ol=new Map;function Mh(e){let t=A_(e);return Ol.set(t.chainId,t),t}function kr(e){return Ol.get(Number(e))||null}function Ba(){return[...Ol.values()]}Ee();var $l={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},ut=e=>BigInt(e).toString(16).padStart(64,"0"),Fo=e=>e.slice(2).toLowerCase().padStart(64,"0");function I_(e,t){return`0x${$l.getAmountsOut}`+ut(e)+ut(64)+ut(t.length)+t.map(Fo).join("")}function __(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 Rl(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Ll=100;function P_(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ll)throw new Error(`slippageBps ${n} exceeds the ${Ll} 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 Fh(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await W(t,"eth_call",[{to:o,data:I_(i,a)},"latest"],s);return __(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=Rl(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=Rl(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:Z.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:Z.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:Z.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:Z.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:Z.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=Z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=Z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=Z.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:g,amountIn:String(i),bought:d.toString(),returned:m.toString(),retentionBps:f,evidence: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=Rl(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=P_(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)),x=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,w=x?`0x${$l.swapExactETHForTokens}`+ut(g)+ut(128)+Fo(s)+ut(b)+ut(f.length)+f.map(Fo).join(""):`0x${$l.swapExactTokensForTokens}`+ut(a)+ut(g)+ut(160)+Fo(s)+ut(b)+ut(f.length)+f.map(Fo).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:w,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Ll,deadline:b.toString()},requires:x?[]:[{step:"approve",token:f[0],spender:m,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}Ee();var T_=[100,500,3e3,1e4],Uh={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Yn=e=>BigInt(e).toString(16).padStart(64,"0"),Uo=e=>e.slice(2).toLowerCase().padStart(64,"0"),qh=/^0x[0-9a-fA-F]{40}$/,Ml=100;function C_(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ml)throw new Error(`slippageBps ${n} exceeds the ${Ml} 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 Bl(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Dh(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${Uh.quoteExactInputSingle}`+Uo(a)+Uo(s)+Yn(c)+Yn(l)+Yn(0),p=await W(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 T_){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=Bl(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(!qh.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=Bl(c.scanner,"quoter"),u=s||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:Z.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||!u)return{chainId:t,token:i,verdict:Z.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 d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:a},c);if(!d.best)return{chainId:t,token:i,verdict:Z.FAIL,evidence:re.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:Z.FAIL,evidence:re.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p.best.amountOut,f=Number(m*10000n/BigInt(a)),h=Z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=Z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=Z.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:g,amountIn:String(a),bought:d.best.amountOut.toString(),returned:m.toString(),retentionBps:f,buyFee:d.best.fee,sellFee:p.best.fee,evidence: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=Bl(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(!qh.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=C_(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${Uh.exactInputSingle}`+Uo(i)+Uo(a)+Yn(f)+Uo(c)+Yn(s)+Yn(h)+Yn(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:Ml,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Ma={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Hh(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function jh(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 W(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Io(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:re.LIVE}},async nativeBalance(r,o={}){let i=await Dn(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 _o({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,Ma.decimals,o).catch(()=>null),n(r,Ma.symbol,o).catch(()=>null),n(r,Ma.name,o).catch(()=>null),n(r,Ma.totalSupply,o).catch(()=>null)]),l=Hh(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:jh(a?.result??a),name:jh(s?.result??s),totalSupply:(Hh(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 Hn(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?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 W(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=Z.PASS,s=u=>{let d={[Z.PASS]:0,[Z.CAUTION]:1,[Z.UNKNOWN]:2,[Z.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==re.LIVE?(i.push({check:"erc20-metadata",result:Z.UNKNOWN,detail:c.warning}),s(Z.UNKNOWN)):i.push({check:"erc20-metadata",result:Z.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===re.UNAVAILABLE)i.push({check:"liquidity",result:Z.UNKNOWN,detail:l.reason}),s(Z.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:Z.FAIL,detail:"no pool with liquidity found"}),s(Z.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:Z.CAUTION,detail:`top pool only $${d}`}),s(Z.CAUTION)):i.push({check:"liquidity",result:Z.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:Z.CAUTION,detail:"pool under 24h old"}),s(Z.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:Z.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),s(u.verdict)}else i.push({check:"sellability",result:Z.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),s(Z.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function zh(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,Dh({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Fh({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 Er=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function qo(){return Er.map(e=>Mh(zh(e)))}var Do=new Map,O_=Object.keys($e).map(Number),R_=Object.keys(nt).map(Number),$_=Er.map(e=>e.chainId),L_=[...new Set(Object.values(Ta))],Fl=new Set,Wh=!1;function R(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(Wh&&Fl.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Do.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Do.get(t)}function Ho(e){return Do.get(e)||null}function Fa({venue:e,op:t}={}){let n=[...Do.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function B_(){Fl.clear();for(let e of Do.keys())Fl.add(e);Wh=!0}R({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"});R({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."});R({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."});R({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."});R({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"});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."]])R({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});R({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."});R({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:$_,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Er.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."});R({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)"});R({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)"});R({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"});R({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."});R({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."});R({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"});R({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."});R({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."});R({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."});R({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."});R({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."});R({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"});R({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)"});R({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});R({id:"uniswap-v3",venue:"dex",chainIds:O_,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"});R({id:"uniswap-v4",venue:"dex",chainIds:R_,auth:"none",ops:["health","quote","chains"],execution:"read-only",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});R({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)"});R({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)"});R({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)"});R({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});R({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)"});R({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});R({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)"});R({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)"});R({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"});R({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"});R({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"});R({id:"opensea-nft",venue:"nft",chainIds:L_,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"});R({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity"],execution:"prepare",baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 agent identity registration and inspection using an exact configured registry; the connected wallet signs and pays network gas"});R({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"});R({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"});R({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"});R({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"});R({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"});R({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)"});R({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"});R({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)"});R({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"});R({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"});R({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."});R({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."});B_();R({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});R({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."});R({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."});R({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."});R({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."});R({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)."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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."});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});j();ot();ot();var D_=/^0x[0-9a-fA-F]{40}$/,zo="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Ul(e,t){let n=String(e||"").trim();if(!D_.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Jh(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Xh(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 H_(e){return[...e].sort((t,n)=>(Jh(n.tvl)??-1)-(Jh(t.tvl)??-1))}function ql(e){return e.hlInfo||ge}function Dl(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Hl(e={},t={}){let n=await ql(t)({type:"vaultSummaries"},t),r=H_((Array.isArray(n)?n:[]).map(Xh));return Dl({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function ja(e={},t={}){let r={type:"vaultDetails",vaultAddress:Ul(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Ul(e.user,"user"));let o=await ql(t)(r,t);return Dl({provider:"hl-vaults",vault:Xh(o||{}),raw:o})}async function jl(e={},t={}){let n=Ul(e.user||e.address,"user"),r=await ql(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 Dl({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function zl(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return ja({...e,vaultAddress:zo},t);if(n==="summaries")return Hl(e,t);if(n==="details")return ja(e,t);if(n==="mine")return jl(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Qh(e={}){try{let t=await zl({mode:"hlp"},e);return{ok:t.vault.vaultAddress===zo&&!!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}}}Ee();import{AbiCoder as z_}from"ethers";var Wl=999;var Fe=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Vl=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),W_=z_.defaultAbiCoder();function Wo(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 Vo(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 Jn(e,t){return e.length?W_.encode(e,t):"0x"}function Gt(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 V_(e,t=0){let n=Gt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function un(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Wl});let r=await W(Wl,"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 dn(e){return{provider:"hl-precompiles",chainId:Wl,...Vl,...e}}async function za(e={}){let t=await un(Fe.l1BlockNumber,"0x",e);return dn({op:"l1BlockNumber",precompile:Fe.l1BlockNumber,l1BlockNumber:Gt(t).toString(),raw:t})}async function Gl(e={},t={}){let n=Vo(e.index??e.assetId??0,"index",32),r=await un(Fe.markPx,Jn(["uint32"],[n]),t);return dn({op:"markPx",precompile:Fe.markPx,index:n,markPx:Gt(r).toString(),raw:r})}async function Kl(e={},t={}){let n=Vo(e.index??e.assetId??0,"index",32),r=await un(Fe.oraclePx,Jn(["uint32"],[n]),t);return dn({op:"oraclePx",precompile:Fe.oraclePx,index:n,oraclePx:Gt(r).toString(),raw:r})}async function Yl(e={},t={}){let n=Vo(e.index??e.assetId??0,"index",32),r=await un(Fe.spotPx,Jn(["uint32"],[n]),t);return dn({op:"spotPx",precompile:Fe.spotPx,index:n,spotPx:Gt(r).toString(),raw:r})}async function Jl(e={},t={}){let n=Wo(e.user,"user"),r=Vo(e.perp??e.assetId??0,"perp",16),o=await un(Fe.position,Jn(["address","uint16"],[n,r]),t);return dn({op:"position",precompile:Fe.position,user:n,perp:r,szi:V_(o,0),raw:o})}async function Xl(e={},t={}){let n=Wo(e.user,"user"),r=Vo(e.token??0,"token",64),o=await un(Fe.spotBalance,Jn(["address","uint64"],[n,r]),t);return dn({op:"spotBalance",precompile:Fe.spotBalance,user:n,token:r,total:Gt(o,0).toString(),hold:Gt(o,1).toString(),raw:o})}async function Ql(e={},t={}){let n=Wo(e.user,"user"),r=Wo(e.vaultAddress??e.vault??zo,"vault"),o=await un(Fe.vaultEquity,Jn(["address","address"],[n,r]),t);return dn({op:"vaultEquity",precompile:Fe.vaultEquity,user:n,vaultAddress:r,hlp:r===zo,equity:Gt(o,0).toString(),raw:o})}async function Zl(e={},t={}){let n=Wo(e.user,"user"),r=await un(Fe.withdrawable,Jn(["address"],[n]),t);return dn({op:"withdrawable",precompile:Fe.withdrawable,user:n,withdrawable:Gt(r).toString(),raw:r})}async function Zh(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return za(t);if(n==="markPx")return Gl(e,t);if(n==="oraclePx")return Kl(e,t);if(n==="spotPx")return Yl(e,t);if(n==="position")return Jl(e,t);if(n==="spotBalance")return Xl(e,t);if(n==="vaultEquity"||n==="hlp")return Ql(e,t);if(n==="withdrawable")return Zl(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function e0(e={}){try{let t=await za(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Vl,l1BlockNumber:t.l1BlockNumber,precompiles:Fe}}catch(t){return{ok:!1,provider:"hl-precompiles",...Vl,error:String(t?.message||t).slice(0,160)}}}ot();ne();function t0(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Va(e={},t,n){let r=String(t||""),o=t0(e);if(o){let a=Go(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=Go(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function Ga(e={},t=[],n){let r=t0(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Go(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&Go(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(Go(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var eu=Number.MAX_SAFE_INTEGER,Wa=String(eu);function Go(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=eu?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>Wa.length||t.length===Wa.length&&t>Wa||t===Wa&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=eu?r:null}function k0(){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 Yt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function E0(e){let t=Yt(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function MP(e,t,n=4){let r=Yt(e),o=Yt(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 A0(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=Yt(a.funding),l=Yt(a.markPx??a.oraclePx),u=Yt(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:Yt(a.oraclePx),openInterest:u,fundingAprPct:E0(c)})}return r}function I0(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=Yt(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=E0(n),o=n>0,i={coin:e.coin,notionalUsd:Yt(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?MP(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 bu(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await dt(t),i=A0(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 xu(e={},t={}){let n=String(e.coin||"").trim();if(!n)throw new Error("hl-delta-neutral: coin required");let r=Number(e.notionalUsd??e.notional??1e3),o=await dt(t),i=A0(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return I0(i,r)}async function vu(e={},t={}){P0(e,t,"hl-delta-neutral");let n=T0(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await xu(e,t);if(r.verdict==="skip")return B({...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=Va(e,r.coin,"hl-delta-neutral");if(!_0.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(()=>(Za(),wu)),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 B({...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 _0=/^0x[0-9a-fA-F]{40}$/;function P0(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 FP(e,t,n){P0(e,t,n)}function UP(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=T0(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"&&Ga(e,n,"hl-delta-neutral"),t==="live"&&!_0.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 T0(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 C0(e={},t={}){FP(e,t,"hl-delta-neutral");let n=UP(e),r=await bu({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=I0(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 vu({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();Pr();var DP=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),ei=14,N0=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Or(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function Su(e){let t=String(e||"").replace(/\/$/,"");if(!DP.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function O0(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=N0(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=Su(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(Xn(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(Xn(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Or(n.orderType,0,"orderType"),Or(n.timeInForce,1,"timeInForce"),Or(n.reduceOnly,0,"reduceOnly"),Or(n.triggerPrice,0,"triggerPrice"),Or(n.orderExpiry,-1,"orderExpiry");let c=N0(n.symbol||n.coin,"symbol",32),l=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(l.length&&!l.includes(c)&&!l.includes(String(i))&&!l.includes("*"))throw new Error("lighter: market not allowed");if(n.side!=="buy"&&n.side!=="sell")throw new Error("lighter: side must be buy or sell");let u=mt(n.baseAmount,"lighter: baseAmount"),d=mt(n.price,"lighter: price");if(u>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(u),m=Number(d),f=Number(n.sizeDecimals??0),h=Number(n.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=f+h,b=u*d,x=Re(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(b!==x)throw new Error("lighter: notionalUsd must match size and price");let w=Re(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(b>w)throw new Error("lighter: notional exceeds cap");let y=Le(n.notionalUsd,"lighter: notionalUsd");return Or(n.txType,ei,"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 HP(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 R0(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=Su(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:HP(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??ei,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return O0(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var L0="https://mainnet.zklighter.elliot.ai",B0="https://testnet.zklighter.elliot.ai";function jP(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?B0:L0}function M0(){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 gn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function zP(e,t){let n=e.toString().padStart(t+1,"0");if(t===0)return n;let r=n.slice(0,-t),o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}function F0(e){let t=gn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function WP(e,t,n=4){let r=gn(e),o=gn(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 $0(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function U0(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=$0(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=$0(a.market_id);if(s==null)continue;let c=o.get(s),l=gn(c?.mark_price??c?.index_price),u=gn(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:gn(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:F0(u)})}return i}function q0(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=gn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=F0(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:gn(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?WP(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 D0(e={}){let t=jP(e),n=e.fetchImpl,r=await k(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await k(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function ku(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await D0(t),i=U0(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 Eu(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 D0(t),a=U0(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return q0(a,r)}async function Au(e={},t={}){j0(e,t,"lighter");let n=z0(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 Eu(e,t);if(o.verdict==="skip")return B({...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=Va(e,o.coin,"lighter");if(!H0.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=zP(BigInt(o.baseAmount)*BigInt(o.price),c);if(e.clientOrderIndex!=null&&(typeof e.clientOrderIndex!="number"||!Number.isSafeInteger(e.clientOrderIndex)||e.clientOrderIndex<0))throw new Error("lighter: clientOrderIndex must be a safe integer");let u={...o,targetNotionalUsd:o.notionalUsd,notionalUsd:l,kind:"lighter-order",surface:"lighter",side:o.perpSide,clientOrderIndex:e.clientOrderIndex??Date.now()%1e9,accountIndex:r,orderType:0,timeInForce:1,reduceOnly:0,triggerPrice:0,orderExpiry:-1,txType:ei,submitTo:`${s?B0:L0}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=R0(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return B({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var H0=/^0x[0-9a-fA-F]{40}$/;function j0(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 VP(e,t,n){j0(e,t,n)}function GP(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=z0(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"&&Ga(e,n,"lighter"),t==="live"&&!H0.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 z0(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 W0(e={},t={}){VP(e,t,"lighter");let n=GP(e),r=await ku({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=q0(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 Au({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 YP="https://clob.polymarket.com",JP="https://gamma-api.polymarket.com";function ti(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||YP).replace(/\/$/,"")}function V0(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||JP).replace(/\/$/,"")}async function Iu(e={}){return k(`${ti(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function G0(e={}){let t=await Iu(e);return{ok:t!=null&&t!=="",time:t}}async function K0({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return k(`${V0(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Y0(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${ti(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function J0(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${ti(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function X0(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${ti(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Q0(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return k(`${ti(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Z0({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return k(`${V0(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}Ee();j();import{createHash as eg}from"node:crypto";var Rr="mainnet-beta",QP="https://api.mainnet-beta.solana.com",_u="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function ZP(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||QP).trim()}function xe(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 eT(e,t){return t?[...e,{commitment:t}]:e}async function ni(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await k(ZP(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 Pu(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await ni("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Rr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function tg(e={}){try{let[t,n]=await Promise.all([ni("getHealth",[],e),Pu({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Rr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Rr,error:String(t?.message||t),exec:!1}}}async function es(e={},t={}){let n=xe(e.address||e.owner,"address"),r=await ni("getBalance",eT([n],e.commitment),t);return{provider:"solana-rpc",cluster:Rr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function tT(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 ri(e={},t={}){let n=xe(e.owner||e.address,"owner"),r=e.mint?{mint:xe(e.mint,"mint")}:{programId:xe(e.programId||_u,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await ni("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(tT):[];return{provider:"solana-rpc",cluster:Rr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function nT(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 rT(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 oT(e){let t=Buffer.from(e,"base64");try{let n=rT(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return eg("sha256").update(t.subarray(r)).digest("hex")}catch{return eg("sha256").update(t).digest("hex")}}async function ng(e={},t={}){let n=nT(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await ni("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Rr,ok:i.err==null,transactionHash:oT(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 aT="mainnet",sT="https://mempool.space/api",cT="https://mempool.space/testnet/api";function Lt(e={}){return String(e.network||process.env.BTC_NETWORK||aT).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Cu(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Lt(e)==="testnet"?cT:sT}function Tu(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function Et(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function lT(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 Nu(e,t={}){let n=`${Cu(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 ts(e,t={}){let n=await Nu(e,t);try{return JSON.parse(n)}catch{return n}}async function rg(e={}){try{let t=await Nu("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:Lt(e),baseUrl:Tu(Cu(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:Lt(e),baseUrl:Tu(Cu(e)),error:Tu(t?.message||t),exec:!1}}}async function og(e={}){let t=await Nu("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:Lt(e),tipHeight:Number(t)}}async function ig(e={}){try{let t=await ts("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:Lt(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:Lt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ns(e={},t={}){let n=Et(e.address||e.addr,"address"),r=await ts(`/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:Lt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function ag(e={},t={}){let n=Et(e.address||e.addr,"address"),r=await ts(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:Lt(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 sg(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 ts(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:Lt(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 cg(e={},t={}){let n=lT(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:Lt(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}Wn();var Ou="https://ordinals.com";function rs(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var dT=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function lg(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=rs(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=dT.includes(o)&&(i==="https:"||a)}}catch{n=!1}return lt({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function $r(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:lg(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 ug(e={}){let t=rs(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:lg(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 os(e={},t={}){let n=Et(e.address||e.addr,"address"),r=rs(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 $r(a,t),c=pT(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 pT(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 Lr(e={},t={}){let n=Et(e.address||e.addr,"address"),r=rs(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 $r(s,t),l=mT(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 dg(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||Ou,o=await $r(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function pg(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||Ou,o=Number(e.page||0),i=await $r(`${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 mg(e={},t={}){let n=t.ordinalsBase||Ou,r=e.height??await $r(`${n}/r/blockheight`,t),o=await $r(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function mT(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}))}Wn();ne();var hT=["unsigned","notsigned","tosign","signable"],gT=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),yT=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Ru(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function wT(e){return hT.some(t=>e.startsWith(t))||gT.has(e)}function bT(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Ru(t);return wT(n)?!1:yT.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function xT(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 $u(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=>$u(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(bT(c)){o.push(c);continue}o.push(...$u(l,t+1,n,r))}let a=Object.keys(e).map(Ru).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Ru(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),xT(e)&&o.push("v/r/s"),o}function Jt(e,t){let n=$u(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 vT="https://api.satflow.com/v1";function fg(e={}){return kt({provider:"satflow",defaultUrl:vT,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function is(e={}){return fg(e).baseUrl}function Bu(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function ST(e={}){return lt({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Bu(e)},fg(e).trusted)}async function yn(e,{method:t="GET",body:n,opts:r={}}={}){if(!Bu(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${is(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:ST(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 hg(e={}){if(!!!Bu(e))return{ok:!1,provider:"satflow",baseUrl:is(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 yn("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:is(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:is(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function gg(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 yn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function yg(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 yn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function wg(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 yn(`/item?${r}`,{opts:t})}}async function as(e={},t={}){let n=Et(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await yn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function bg(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 yn(`/orders/floor?${r}`,{opts:t})}}var kT=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function xg(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))kT.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var ET=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"]),AT=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function Lu(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 IT(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=Et(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=Et(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function vg(e={},t={}){let n=xg(e,ET);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=Lu(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await yn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=Lu(a)??Lu(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`);Jt("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=IT(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return B({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 ss(e={},t={}){let n=xg(e,AT);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 yn("/intent/sell",{method:"POST",body:n,opts:t});return Jt("satflow",r),B({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 ls="https://lite-api.jup.ag/swap/v1",Fu="So11111111111111111111111111111111111111112",Eg="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",PT=100,Sg=2e4;function Ag(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||ls).replace(/\/$/,"")}function oi(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 Ig(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>PT)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function cs(e,t){return e==null?t:!!e}function TT(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 CT(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 _g(e){let t=Buffer.from(e,"base64"),n=CT(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 Mu(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Sg}={}){let r=xe(e.inputMint,"inputMint"),o=xe(e.outputMint,"outputMint"),i=oi(e.inAmount,"inAmount"),a=oi(e.outAmount,"outAmount"),s=oi(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Ig(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)||Sg,1e3),3e4)}}function NT({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Fu)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=_g(n),a=oi(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 OT=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),RT="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function kg(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=RT.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 Pg(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(`${ls}/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])=>kg(p)),c=[],l=a.filter(([p])=>!kg(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${ls}/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,x]=m[g];h&&h.executable===!0&&OT.has(h.owner)?c.push({programId:b,label:x,owner:h.owner}):l.push({programId:b,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${ls}/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 Tg(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await us({inputMint:Fu,outputMint:Eg,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 us(e={},t={}){let n=xe(e.inputMint||e.fromMint||Fu,"inputMint"),r=xe(e.outputMint||e.toMint||Eg,"outputMint"),o=oi(e.amount||e.inAmount,"amount"),i=Ig(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${Ag(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await k(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Mu({...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 $T(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Cg(e={},t={}){let n=xe(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Mu(e.quoteResponse,t)}:await us(e,t),o=r.quote,i=r.solanaGuard||Mu(o,t);if(cs(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await k(`${Ag(t)}/swap`,{method:"POST",body:$T({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:cs(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:cs(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:cs(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=TT(a?.swapTransaction);_g(s),Jt("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=NT({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return B({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 BT="https://coins.llama.fi",MT="https://api.llama.fi",FT="https://yields.llama.fi",UT="https://stablecoins.llama.fi";function qT(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||BT).replace(/\/$/,"")}function Ng(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||MT).replace(/\/$/,"")}async function At(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return k(`${qT(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Og(e={}){let n=(await At(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Uu(e={}){return k(`${Ng(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function Rg(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||FT).replace(/\/$/,""),r=await k(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(a=>String(a.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(a=>String(a.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(a=>!!a.stablecoin==!!e.stablecoin)),o.sort((a,s)=>Number(s.tvlUsd||0)-Number(a.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...r,data:o.slice(0,i)}}async function ds(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||UT).replace(/\/$/,""),r=e.includePrices!==!1;return k(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function $g(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return k(`${Ng(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Lg(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await At(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}ii();xr();zn();vr();Ee();We();ne();import{Interface as qg,getAddress as ai,isAddress as zT}from"ethers";var xn={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},WT=[1,50,100,200,2e3],Fg=new qg(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),VT=new qg(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Dg="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Hg="0x0000000000000000000000000000000000000000";function jg(e){let t=Number(e),n=xn[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(xn).join(", ")})`);return{chainId:t,...n}}function Ug(e,t){let n=xn[Number(t)];if(!e||e===Dg||e===Hg||/^eth$/i.test(String(e)))return ai(n.weth);let r=String(e);if(/^weth$/i.test(r))return ai(n.weth);if(/^usdc$/i.test(r))return ai(n.usdc);if(!zT(r))throw new Error(`invalid token address: ${e}`);return ai(r)}async function ms(e={},t={}){let{chainId:n,quoter:r,router:o}=jg(e.chainId??8453),i=Ug(e.tokenIn||"WETH",n),a=Ug(e.tokenOut||xn[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]:[...WT],l=[],u=null;for(let d of c){let p=Fg.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await W(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=Fg.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 le({venue:"aerodrome",chainId:n,chain:xn[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 zg(e={},t={}){let n=Number(e.chainId??8453),r=jg(n),o=ai(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Dg||i===Hg||/^eth$/i.test(i),s=await ms(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=VT.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 B({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:Ae(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Wg(e={}){let t=Number(e.chainId??8453);try{let n=await ms({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:xn[t]?.router,quoter:xn[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Vg(){return Object.entries(xn).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}si();ty();li();j();We();Wn();ne();var dC="https://api.1inch.dev/swap/v6.0";function uy(e={}){return kt({provider:"oneinch",defaultUrl:dC,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function ad(e={}){return uy(e).baseUrl}function ui(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function sd(e={}){let t=ui(e);return lt({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},uy(e).trusted)}async function dy(e={}){if(!ui(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await di({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 di(e={},t={}){if(!ui(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let a=new URLSearchParams({src:r,dst:o,amount:String(i)}),s=await k(`${ad(t)}/${n}/quote?${a}`,{headers:sd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?le(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function pC(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function cd(e={},t={}){if(!ui(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return k(`${ad(t)}/${n}/approve/spender`,{headers:sd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function py(e={},t={}){if(!ui(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=Qe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`1inch: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:a,slippage:String(s.selectedBps/100)});e.receiver&&c.set("receiver",e.receiver),e.referrer&&c.set("referrer",e.referrer),e.disableEstimate!=null&&c.set("disableEstimate",String(!!e.disableEstimate)),e.allowPartialFill!=null&&c.set("allowPartialFill",String(!!e.allowPartialFill)),e.includeProtocols&&c.set("includeProtocols",String(e.includeProtocols)),e.excludeProtocols&&c.set("excludeProtocols",String(e.excludeProtocols));let l=await k(`${ad(t)}/${n}/swap?${c}`,{headers:sd(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=le(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!pC(r)){let f=l?.spender||l?.approvalAddress||(await cd({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 B({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:Ae(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var fC=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function pi(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||fC,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function my(e={}){try{let t=await pi({type:"allMids"},{...e,maxMessages:1}),n=t.last||{},r=n.data?.mids||n.data||{},o=typeof r=="object"?Object.keys(r).length:0;return{ok:!0,ms:t.ms,midCount:o,channel:n.channel||null}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function fy(e={}){let t=await pi({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function hy(e,t={}){if(!e)throw new Error("coin required");let n=await pi({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var gC=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Ss(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||gC,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 gy(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Ss([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 yy(e,t={}){if(!e)throw new Error("assetId required");let n=await Ss([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}j();import{getAddress as EC,Interface as Fr,keccak256 as dd}from"ethers";import{createHash as pd,createHmac as AC,timingSafeEqual as Oy}from"node:crypto";vr();Ee();import{Interface as xy,getAddress as ld,isAddress as wC}from"ethers";var bC="0x0000000000000000000000000000000000000000",vy=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),xC=new xy(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),vC=new xy(["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 SC(e){let t=Number(e??4663),n=vy[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function wy(e,t){if(/^weth$/i.test(String(e||"")))return ld(vy[t].weth);if(!wC(String(e||"")))throw new Error(`up33: invalid token ${e}`);return ld(e)}function kC(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function by(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 Sy(e,t={},n={}){try{let r=SC(t.chainId),o=wy(t.tokenIn,r.chainId),i=wy(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=kC(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||W,l=await by(c,r.chainId,r.factory,xC,"getPool",[o,i,s]),u=ld(l[0]);if(u.toLowerCase()===bC)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 by(c,r.chainId,r.quoter,vC,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 ky(e={},t={}){return Sy("exact-input",e,t)}async function Ey(e={},t={}){return Sy("exact-output",e,t)}ne();var J=4663,ks="https://anvil.clutch.market",IC=`${ks}/api/markets/snapshot?chainId=${J}`,_C=`${ks}/api/rpc?chainId=${J}`,PC=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),it="0x0bd7d308f8e1639fab988df18a8011f41eacad73",md="0x0000000000000000000000000000000000000000",Qn=1e5,TC=256e3,Ay=256,CC=3e4,NC=Object.freeze({"0x25482a6e453646f518c6194def85b0d477134f27":"0xdb1cb50fd93395644993895a2d1ee784973287453c16b1aa92716284fd265265","0x2554cad3d851381ec1a16b7bf7b4737ed46b40fe":"0x3a7563ef4a79e56aeab6e11b3fea2e319964a962379cb31beeedc4eaadf87cc1","0xd9206764cbc81c326ee6cace76c80089f6a0b360":"0x93cee896d680d2a0fb068413f39cf5b684dd70799dd9379f9ec35a2492d28b75","0x4e07aa3e0228cfe099462bc25f4789adb6038451":"0x04078324b6c9b861b6b59308c9327d73250992e1dd76546feccdf18e5e4d5fbc","0x714a07a5accc26a2799c50f3781612b4675129a1":"0x83ef76324d1c19aa59c76e5376814c0ed1071354d0c850110a94e91f35b4db28","0xfe0b24a3b4052ad78f10fa75a27118c3e54a00e6":"0x965e384f236132ec25d88662665408e49a443014a7fc58af92c03833df957f2f","0x2079c001b1a1e1be53b7463387510ddac2b45da2":"0x6c9c976c7cbd34e17e14189ccd487be9b541107885b86e28aa7ef1a033b7bb9f","0x147ef077bfbe4bbec3f267c358073c449cbb4b32":"0x5064f645f51ece3be2e5a6624c9cc6d508ba1544fef45455bbc7a906d07e6a4f","0xe6fa04e189ea271f0311162afc839443c51fe920":"0x467b919a9109c34d63ce40f8fcb4c9f33bccb45e7f6a027685a22228882553e1","0x492d80f0009cd250ceabcfcfb1c5c1de40f98ef6":"0x5da29cfd5f8f686998564a8ef0b89156c9f75d381c80ee5886b617385346e928","0x5bdf7bd9b20bb7c50061e4f4748725cd341d1f45":"0x94c052d894b557ac5b20295d74ee82c2a34b127cf148ba93e7596dc0cab549eb","0xdd59536f394c4b589e695f5921723b89ea479379":"0xa2c5533b1f8a41d863fa787dec42e51d57d8d77343555e5b0a9ce18fb51361ef","0xf29aa29804033d5fc9a16ad6f864e495d950acb4":"0xec8d77482cbd2f550345d67fc7f0f317e349ffd148a06b05237c9efb82b61900","0x26c41f7c732cf27b9c687f88ae4c9dbfed4f9ac4":"0xce7a9041ec2808643506b6327fed3d46b07dca344ff7b32e110d28a8fe6c712a","0x6109ed398827f06ba2ccd763a597ae2e0586b349":"0x625695c20dccfca1c2db898d09b4f56bde23b6ae0b9d76adc05573d280f320b0","0x95aa9e2130016e7ffe8828a4e1e2047441704cfd":"0xded628a34f602a70f5dc4d34974a2107ad5539be3428a34083aeddce8b2f46c4"}),ft=Object.freeze({chainId:J,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),je=new Fr(["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"]),OC=new Fr(["function allowance(address owner,address spender) view returns (uint256)"]),Ry=new Fr(["function decimals() view returns (uint8)"]),Iy=new Fr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),ht=new Fr(["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)"]),kn=new Fr(["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 G(e,t){try{return EC(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Zt(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 at(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 ie(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(J,"eth_call",[{to:G(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function $y(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 _y(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>Ay)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Ay}`);return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new Error("stonkbrokers: Anvil snapshot rows must be objects");if(Number(n.chainId)!==J)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${J}`);return{name:n.name||n.collectionName||null,chainId:J,collection:G(n.collection||n.collectionAddress,"Anvil collection"),market:G(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?G(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 RC(e,t,n=[],r={}){if(Number(e)!==J)throw new Error(`stonkbrokers: Anvil supports chain ${J} only`);if(!PC.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await k(_C,{method:"POST",headers:{origin:ks,referer:`${ks}/`,"user-agent":"Mozilla/5.0"},body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??2e4,retries:0});if(o?.error)throw new Error(`stonkbrokers: Anvil RPC ${o.error.message||"failed"}`);if(o?.result==null)throw new Error("stonkbrokers: Anvil RPC returned no result");return o.result}function It(e={}){return e.rpcCall||((t,n,r)=>RC(t,n,r,e))}async function Ur(e={},t={}){if(e.snapshot){let s=_y(e.snapshot),c={kind:"anvil-markets",chainId:J,total:s.length,contentHash:pd("sha256").update(Mr(s)).digest("hex")},l=fd(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(s,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),s}let n=s=>{let c=String(s?.headers?.get?.("content-type")||"").split(";",1)[0].trim().toLowerCase();if(c!=="application/json"&&!c.endsWith("+json"))throw new Error("stonkbrokers: Anvil snapshot content-type must be JSON")},r=await k(IC,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:TC,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=_y(r),i={kind:"anvil-markets",chainId:J,total:o.length,contentHash:pd("sha256").update(Mr(o)).digest("hex")},a=fd(e.snapshotCompletenessEvidence??r.completenessEvidence,i,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(o,"snapshotCoverage",{value:{complete:a.valid,evidence:a.evidence,error:a.error},enumerable:!1}),o}function Es(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 Ly({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 Ur({},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=NC[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=It(n),c=Es(await s(J,"eth_blockNumber",[])),l=await s(J,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||Es(l?.number)!==c)throw new Error("stonkbrokers: Anvil RPC returned an invalid block attestation");let d=Object.freeze({blockHash:u,requireCanonical:!0}),p=String(await s(J,"eth_getCode",[e,d])).toLowerCase();if(!/^0x[0-9a-f]+$/.test(p)||p==="0x")throw new Error("stonkbrokers: Anvil market runtime is empty");let m=dd(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+CC}}function By(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:J,market:e.record.market,collection:e.record.collection,paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r,snapshotFetchedAtMs:e.snapshotFetchedAtMs,snapshotExpiresAtMs:e.snapshotExpiresAtMs,blockNumber:BigInt(e.blockNumber).toString(),blockHash:e.blockHash,runtimeCodeHash:e.runtimeCodeHash})}async function fi(e={},t={}){let n=G(e.market,"Anvil market"),r=G(e.collection,"NFT collection"),o=Zt(e.tokenId),i=await Ly({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ie(a,n,je,"quoteSpecificBuy",[BigInt(o)],s),ie(a,n,je,"inventory",[BigInt(o)],s),ie(a,r,ht,"ownerOf",[BigInt(o)],s),ie(a,n,je,"collection",[],s),ie(a,n,je,"token",[],s),ie(a,n,je,"robinhoodSwapFeeWei",[],s)]),f=G(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=G(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await ie(a,h,Ry,"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(),x=By(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:b}),w=!!c[4],y=!!l[0],S=G(u[0],"NFT owner")===n,E=w&&y&&S;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:J,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:g,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:b,fees:$y(c[2],c[3]),available:E,evidence:{quoteAvailable:w,inventory:y,ownerIsMarket:S,marketCollection:f,attestation:x},reason:E?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function As(e={},t={}){let n=G(e.market,"Anvil market"),r=G(e.collection,"NFT collection"),o=await Ly({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ie(i,n,je,"quoteSellNFT",[],a),ie(i,n,je,"collection",[],a),ie(i,n,je,"token",[],a),ie(i,n,je,"robinhoodSwapFeeWei",[],a)]),d=G(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=G(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await ie(i,p,Ry,"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=By(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:J,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(s[0]).toString(),grossPayoutRaw:BigInt(s[1]).toString(),nativeSwapFeeWei:f,fees:$y(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function My(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 Qt(e,t){let n=at(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function Fy({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:J,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Qt(o,"gasLimit").toString(),maxFeePerGas:Qt(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=Qt(a,"maxPriorityFeePerGasWei").toString()),c}function Uy(e,t){return B({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 qy(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=G(e.buyer,"buyer"),r=G(e.market,"Anvil market"),o=G(e.collection,"NFT collection"),i=Zt(e.tokenId),a=Qt(e.maxTotalCostRaw,"maxTotalCostRaw"),s=at(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 fi({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=Qt(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=G(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,b={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await ie(It(t),f,OC,"allowance",[n,r],b))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let w={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[Fy({...w,to:r,data:je.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],S={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},E={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:g,anvilQuote:S,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:My(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:J,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:S,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:y}};return Uy(E,l)}async function Dy(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=It(t),r=G(e.seller,"seller"),o=G(e.market,"Anvil market"),i=G(e.collection,"NFT collection"),a=Zt(e.tokenId),s=Qt(e.minPayoutRaw,"minPayoutRaw"),c=at(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 As({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([ie(n,i,ht,"ownerOf",[BigInt(a)],p).then(T=>G(T[0],"NFT owner")),ie(n,i,ht,"getApproved",[BigInt(a)],p).then(T=>G(T[0],"NFT approval")),ie(n,i,ht,"isApprovedForAll",[r,o],p).then(T=>!!T[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=Qt(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(b!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=G(u.paymentToken,"Anvil payment token"),S=Number(u.paymentTokenDecimals),E={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},v=[Fy({...E,to:o,data:je.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],A={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},P={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:y,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:A,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:b.toString()},tradeId:My(e.tradeId),slippageBps:0,expiresAtMs:x+w,fee:{oracleFeeBps:0},artifact:{chainId:J,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:A,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:v}};return Uy(P,u)}async function $C(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(S=>Zt(S)),w={kind:"anvil-inventory",chainId:J,market:G(e.market,"Anvil market"),collection:G(e.collection,"NFT collection"),total:x.length,contentHash:pd("sha256").update(Mr(x)).digest("hex")},y=fd(e.inventoryCompletenessEvidence,w,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:x,total:x.length,scanned:x.length,complete:y.valid,continuation:y.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=It(t),r=G(e.market,"Anvil market"),o=Es(await n(J,"eth_blockNumber",[])),i=await n(J,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||Es(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ie(n,r,je,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>Qn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${Qn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>Qn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${Qn}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:Qn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ie(n,r,je,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let x=f.toString();g.add(x),h.push(x),f=BigInt((await ie(n,r,je,"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 LC(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 BC(e,t,n){let r=It(n);try{let o=String((await ie(r,e,ht,"tokenURI",[BigInt(t)]))[0]),i=LC(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await k(a,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,lookupFn:n.lookupFn,untrustedUrl:!0,maxResponseBytes:256e3})}catch(o){if(n.allowRarityOfFallback===!1)throw o;let i=await ie(r,e,ht,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function Hy(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 MC(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 Is(e={},t={}){let n=G(e.market,"Anvil market"),r=G(e.collection,"NFT collection"),o=await $C({...e,market:n},t),i=o.ids,a=Math.min(Math.max(Number(e.minStars??4)||4,1),5),s=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=It(t),p=(await Xe(i,s,async h=>{try{let g=await ie(u,r,ht,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(g[0])+1}}catch(g){return e.includeErrors?{tokenId:h,stars:null,error:String(g.message||g)}:null}})).filter(h=>h&&h.stars>=a),f=(await Xe(p,s,async h=>{try{let g=await fi({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:g.available,quote:g,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(g){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(g.message||g)}:null}})).filter(Boolean).sort((h,g)=>Number(g.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(g.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:J,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:f.length,candidates:f,exec:!1,readOnly:!0}}let l=(await Xe(i,s,async u=>{try{let[d,p]=await Promise.all([BC(r,u,t),fi({market:n,collection:r,tokenId:u},t)]),m=Hy(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?MC(d,f):e.includeAll===!0?!0:m!=null&&m>=a)?{tokenId:u,stars:m,traits:d.attributes||[],available:p.available,quote:p,decision:"WATCH",reason:"trait evidence is ranking-only until exact exit liquidity clears net-profit gates"}:null}catch(d){return e.includeErrors?{tokenId:u,available:!1,error:String(d.message||d)}:null}})).filter(Boolean).sort((u,d)=>Number(d.stars||0)-Number(u.stars||0)||(BigInt(u.tokenId)<BigInt(d.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-traits",chainId:J,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:l.length,candidates:l,exec:!1,readOnly:!0}}function jy(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Py(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 zy(e={}){return{maxMarkets:Py(e,"maxMarkets",Qn),maxItemsPerMarket:Py(e,"maxItemsPerMarket",Qn)}}function Wy(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function mi(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 Vy(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 Gy(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=zy(e),o=await Ur(e,t),i=Wy(o,e,n),a=t.scanCollection||Is,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Xe(i,s,async l=>{let u=jy(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,...mi(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...mi(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:J,marketCount:i.length,...Vy(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 Ky(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=zy(e),o=await Ur(e,t),i=o.snapshotCoverage?.complete===!0,a=Wy(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||hd,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Xe(a,l,async d=>{let p=jy(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",...mi(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=mi(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),...mi(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:J,marketCount:a.length,...Vy(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 Ty(e,t){return e>t?"ARB":"PASS"}async function FC(e={},t={}){let n=String(e.direction||""),r=at(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=G(e.paymentToken,"Anvil payment token"),i={chainId:J,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:It(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||Ey)({chainId:J,tokenIn:it,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:it,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||Sl)({...i,tokenIn:it,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:it,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||ky)({chainId:J,tokenIn:o,tokenOut:it,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:it,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||ln)({...i,tokenIn:o,tokenOut:it,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:it,amountInRaw:r.toString(),amountOutWei:String(c.amountOut),source:`uniswap-v4:${c.poolId}`,venue:c.venue||"uniswap-v4",fee:c.fee,tickSpacing:c.tickSpacing,hooks:c.hooks||null,poolId:c.poolId,gasEstimate:c.gasEstimate}}function Cy(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=G(e.quoteToken,"conversion quote token");if(n!==it)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=at(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=at(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function UC(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 Mr(e){return Array.isArray(e)?`[${e.map(Mr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Mr(e[t])}`).join(",")}}`:JSON.stringify(e)}function Yy(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:AC("sha256",n).update(Mr(r)).digest("hex")}}function qC(e,t){return Yy(e,t)}function fd(e,t,n,r){try{if(!e||typeof e!="object"||Array.isArray(e))throw new Error("completeness evidence is required");if(!r||String(r).length<16)throw new Error("trusted completeness attestation secret is unavailable");let o=String(e.mac||"").toLowerCase(),i=qC(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!Oy(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 DC(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:UC(e,t)}function ud(e,t,n,r,o,i){let a=DC(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==J)throw new Error(`${r} evidence chainId mismatch`);if(String(a.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(a.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(a.source||"").trim())throw new Error(`${r} evidence source is required`);if(!i||String(i).length<16)throw new Error(`${r} trusted attestation secret is unavailable`);let s=String(a.mac||"").toLowerCase(),c=Yy(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!Oy(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&&G(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=at(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Qt(a.gasLimit,`${r} evidence gasLimit`),g=Qt(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)!==J)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(G(b.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let w=G(b.sender,`${r} simulation sender`),y=G(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(at(b.valueWei,`${r} simulation valueWei`))!==String(at(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&&G(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 S=Number(b.quotedAtMs),E=Number(b.expiresAtMs);if(!Number.isFinite(S)||!Number.isFinite(E)||S>n||E<=n||E<=S)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...a,amountWei:f.toString()},error:null}}catch(s){return{amount:null,evidence:null,error:String(s.message||s)}}}function Ny(e){let t=G(e,"OpenSea payment token");if(t!==md&&t!==it)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function hd(e={},t={}){let n=await Is(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=G(e.owner,"execution owner")}catch{}let a=(b,x,w,y={})=>({calldataHash:b==null?null:String(b).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:w,owner:i,...y}),s=(b,x,w,y,S)=>ud(e.gasEvidence??e.gasCostEvidence,b,r,`${x} gas`,a(w,y,x,S),o),c=(b,x)=>{let w=null;try{w=G(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 S=ud(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",y,o);if(S.amount!=null||b?.gasEstimate==null)return S;let E=ud(e.gasPriceEvidence,x,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(E.amount==null)return{amount:null,evidence:null,error:E.error};let v=at(b.gasEstimate,"conversion gasEstimate");return{amount:v*E.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:v.toString(),gasPriceEvidence:E.evidence},error:null}},l=(b,x,w,y,S)=>{try{let E=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(E))throw new Error("exact Seaport order hash is required");let v=G(x?.protocolAddress,"Seaport protocol address"),A=String(x?.executionCalldataHash||"").toLowerCase(),P=/^0x[0-9a-f]{64}$/.test(A)?A:null,T=y==="seaport-fulfillment"&&S===md?String(x?.priceWei??""):"0",C={orderHash:E,protocolAddress:v,target:v,valueWei:T},I=s(b,y,P,w,C);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 F=I.evidence?.approvalRequired;if(typeof F!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==F)throw new Error("Seaport approval requirement evidence mismatch");let D=[I];if(F){let U=String(x?.approvalCalldataHash||"").toLowerCase(),$=/^0x[0-9a-f]{64}$/.test(U)?U:null,q=y==="seaport-offer-acceptance"?n.collection:S;D.push(s(b,"seaport-approval",$,w,{...C,target:q,valueWei:"0"}))}if(S===md){let U=b==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",$=String(x?.prerequisiteCalldataHash||"").toLowerCase(),q=/^0x[0-9a-f]{64}$/.test($)?$:null,te=U==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";D.push(s(b,U,q,w,{...C,target:it,valueWei:te}))}let N=D.find(U=>U.amount==null);if(N)throw new Error(N.error);return{amount:D.reduce((U,$)=>U+$.amount,0n),evidence:D.map(U=>U.evidence),error:null}}catch(E){return{amount:null,evidence:null,error:String(E.message||E)}}},u=at(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Ca,p=t.openSeaBestOffer||Na,m=t.paymentTokenConversion||(b=>FC({...b,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await As({market:n.market,collection:n.collection},t),h=[];for(let b of n.candidates){let x=null;try{x=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId},t)}catch{}let w=b.quote,y=dd(je.encodeFunctionData("buySpecificNFT",[BigInt(b.tokenId),BigInt(w.totalCostRaw)])).toLowerCase(),S=s("anvil-to-opensea","anvil-call",y,w.evidence.attestation,{target:n.market,valueWei:w.nativeSwapFeeWei}),E=null,v=null;if(x)try{E=Ny(x.paymentToken)}catch($){v=String($.message||$)}let A=v||!x?{amount:null,evidence:null,error:v||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,w.evidence.attestation,"seaport-offer-acceptance",E),P={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:x?.grossOfferWei==null?null:String(x.grossOfferWei),openSeaSellingValueWei:x?.sellerNetWei==null?null:String(x.sellerNetWei),openSeaFeeWei:x?.feeWei==null?null:String(x.feeWei),openSeaPaymentToken:E,gasCostWei:S.amount==null?null:S.amount.toString(),gasEvidence:S.evidence,marketplaceGasCostWei:A.amount==null?null:A.amount.toString(),marketplaceGasEvidence:A.evidence,conversionGasCostWei:null};if(x?.sellerNetWei==null||!w.available)h.push({...P,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(v)h.push({...P,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${v}`});else if(S.amount==null)h.push({...P,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${S.error}`});else if(A.amount==null)h.push({...P,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${A.error}`});else if(typeof m!="function")h.push({...P,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let $=Cy(await m({chainId:J,direction:"acquire-exact-output",amountRaw:w.totalCostRaw,paymentToken:w.paymentToken,quoteToken:it}),{direction:"acquire-exact-output",amountRaw:w.totalCostRaw}),q=c($,"anvil-to-opensea");if(q.amount==null)h.push({...P,conversion:$,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${q.error}`});else{let te=S.amount+A.amount+q.amount,Y=BigInt(x.sellerNetWei)-BigInt($.amountInWei)-BigInt(w.nativeSwapFeeWei)-te;h.push({...P,conversionGasCostWei:q.amount.toString(),conversionGasEvidence:q.evidence,totalExecutionGasWei:te.toString(),anvilCostInWethWei:$.amountInWei,conversion:$,netWei:Y.toString(),decision:Ty(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($){h.push({...P,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String($.message||$)}`})}let T=null;try{T=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!T)continue;let C=dd(je.encodeFunctionData("sellNFT",[BigInt(b.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),I=s("opensea-to-anvil","anvil-call",C,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),F=null,D=null;try{F=Ny(T.paymentToken)}catch($){D=String($.message||$)}let N=D?{amount:null,evidence:null,error:D}:l("opensea-to-anvil",T,f.evidence.attestation,"seaport-fulfillment",F),U={route:"opensea-to-anvil",tokenId:b.tokenId,stars:b.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(T.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:F,gasCostWei:I.amount==null?null:I.amount.toString(),gasEvidence:I.evidence,marketplaceGasCostWei:N.amount==null?null:N.amount.toString(),marketplaceGasEvidence:N.evidence,conversionGasCostWei:null};if(D){h.push({...U,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${D}`});continue}if(I.amount==null){h.push({...U,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${I.error}`});continue}if(N.amount==null){h.push({...U,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${N.error}`});continue}if(typeof m!="function"){h.push({...U,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let $=Cy(await m({chainId:J,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:it}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),q=c($,"opensea-to-anvil");if(q.amount==null)h.push({...U,conversion:$,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${q.error}`});else{let te=I.amount+N.amount+q.amount,Y=BigInt($.amountOutWei)-BigInt(T.priceWei)-BigInt(f.nativeSwapFeeWei)-te;h.push({...U,conversionGasCostWei:q.amount.toString(),conversionGasEvidence:q.evidence,totalExecutionGasWei:te.toString(),anvilPayoutInWethWei:$.amountOutWei,conversion:$,netWei:Y.toString(),decision:Ty(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($){h.push({...U,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String($.message||$)}`})}}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:J,collection:n.collection,market:n.market,slug:String(e.slug||""),gasCostWei:null,conversionGasCostWei:null,gasPriceWei:null,inventoryTotal:n.inventoryTotal,inventoryScanned:n.inventoryScanned,complete:n.complete,truncated:n.truncated,continuation:n.continuation,minNetWei:u.toString(),opportunities:g.sort((b,x)=>{let w=BigInt(b.netWei??"-1"),y=BigInt(x.netWei??"-1");return y>w?1:y<w?-1:0}),arbCount:g.filter(b=>b.decision==="ARB").length,exec:!1,readOnly:!0}}async function _s(e={},t={}){let n=It(t),r=Zt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ie(n,ft.ammVault,Iy,"quoteSpecificBuy",[BigInt(r)]),ie(n,ft.ammVault,Iy,"inventory",[BigInt(r)]),ie(n,ft.nft,ht,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:G(a[0],"broker owner")===ft.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:J,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:s,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function Jy(e,t){try{return G((await ie(t,ft.nft,ht,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return G((await ie(t,ft.nft,ht,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Xy(e={},t={}){let n=It(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Xe(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Zt(a.brokerTokenId,"brokerTokenId"),c=Zt(a.nestedTokenId,"nestedTokenId"),l=G(a.tba,"TBA"),u=G(a.nestedCollection,"nested collection"),d=Hy({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([Jy(s,n),ie(n,u,ht,"ownerOf",[BigInt(c)]).then(g=>G(g[0],"nested owner")),_s({brokerTokenId:s},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:s,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:a.traits||[],available:h,quote:f,decision:"WATCH",reason:h?"rarity is ranking-only until exit-liquidity evidence clears profit gates":"nested custody or parent availability is stale"}})).filter(Boolean).sort((a,s)=>s.stars-a.stars);return{provider:"stonkbrokers",chainId:J,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function Qy(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=G(e.buyer,"buyer"),r=Zt(e.brokerTokenId,"brokerTokenId"),o=at(e.maxTokenCostWei,"maxTokenCostWei"),i=at(e.maxEthFeeWei,"maxEthFeeWei"),a=await _s({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 B({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:J,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:ft.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:a.tokenCostWei,quotedEthFeeWei:a.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function hi(e={},t={}){let n=It(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?ft.overtimeBooster:ft.stockBooster,[i,a,s,c,l,u]=await Promise.all([ie(n,o,kn,"pendingEth"),ie(n,o,kn,"minDropWei"),ie(n,o,kn,"roundActive"),ie(n,o,kn,"currentRound"),ie(n,o,kn,"roundState").catch(()=>null),ie(n,o,kn,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:J,which:r,booster:o,pendingWei:d.toString(),minDropWei:p.toString(),roundActive:m,roundId:BigInt(c[0]).toString(),cursor:l?BigInt(l[2]).toString():null,remaining:l?BigInt(l[3]).toString():null,stockTokens:u?Array.from(u[0]).map(g=>G(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function Zy(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?ft.overtimeBooster:ft.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?kn.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):kn.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return B({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:J,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:J,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function ew(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>Zt(s,"brokerTokenId")):[],r=It(t),o=await Xe(n,8,async s=>{let[c,l]=await Promise.all([ie(r,ft.nft,ht,"ownerOf",[BigInt(s)]).then(u=>G(u[0],"broker owner")),Jy(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([hi({which:"stock"},t),hi({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:J,owner:e.owner?G(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function tw(e={},t={}){try{let n=await Ur(e,t);return{ok:!0,chainId:J,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:J,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function nw(e={},t={}){try{let n=await hi({which:"stock"},t);return{ok:!0,chainId:J,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:J,error:String(n.message||n).slice(0,180)}}}ne();import{createHash as jC}from"node:crypto";var Ps="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",zC=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"}]),Zn=Object.freeze(Object.fromEntries(zC.map(e=>[e.name,e.selector]))),WC=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),VC=new Set(["name","endpoint","version","skills","domains"]),GC=new Set(["agentId","agentRegistry"]),rw=new Set(["reputation","crypto-economic","tee-attestation"]),KC=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,YC=64*1024;function gi(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 gd(e,t,n){for(let r of Object.keys(e)){if(KC.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 qr(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 ow(e,t,{service:n=!1}={}){let r=qr(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 yd(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 Ts(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function wd(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 bd(e){let t=Ts(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return yd(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function aw(){let e=[];try{let t=Ts(process.env.ORACLE_ERC8004_CHAIN_ID);bd(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 JC(e){return JSON.parse(JSON.stringify(e))}function Cs(e){let t=gi(e,"registration file");if(gd(t,WC,"registration"),t.type!==Ps)throw new Error("erc8004: registration-v1 type required");let n={type:Ps,name:qr(t.name,"name",128),description:qr(t.description,"description",4096),image:ow(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=gi(a,`services[${s}]`);gd(c,VC,`services[${s}]`);let l=qr(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:ow(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=qr(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=gi(a,`registrations[${s}]`);gd(c,GC,`registrations[${s}]`);let l=wd(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>rw.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!rw.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>YC)throw new Error("erc8004: registration metadata oversized");return JC(n)}function XC(e){if(gi(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ps)throw new Error("erc8004: registration-v1 type required");return Cs({type:Ps,...e})}function QC(e){let t=Cs(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function yi(e){return BigInt(e).toString(16).padStart(64,"0")}function sw(e){let t=Buffer.from(e,"utf8").toString("hex");return`${yi(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function ZC(e){return`${Zn.register}${yi(32)}${sw(e)}`}function eN(e,t){return`${Zn.setAgentURI}${yi(e)}${yi(64)}${sw(t)}`}function tN(e,t){return`${e}${yi(t)}`}function nN(e){return jC("sha256").update(e,"utf8").digest("hex")}function xd(e,t){gi(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 cw(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Ts(e.chainId),c=yd(e.owner,"owner"),l=bd(s),u=Number(t?.nowMs??Date.now());return B({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:nN(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 lw(e={},t={}){xd(e,new Set(["chainId","owner","registration"]));let n=QC(XC(e.registration));return cw(e,t,{kind:"erc8004-register",uri:n,selector:Zn.register,data:ZC(n)})}function uw(e={},t={}){xd(e,new Set(["chainId","owner","agentId","agentURI"]));let n=wd(e.agentId),r=dw(e.agentURI);return cw(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:Zn.setAgentURI,data:eN(n,r),id:n})}function dw(e){let t=qr(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 Cs(o),t}function iw(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 yd(`0x${e.slice(-40)}`,t)}function rN(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 pw(e={},t={}){xd(e,new Set(["chainId","agentId"]));let n=Ts(e.chainId),r=wd(e.agentId),o=bd(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:tN(d,r)},"latest"]),[a,s,c]=await Promise.all([i(Zn.ownerOf),i(Zn.tokenURI),i(Zn.getAgentWallet)]),l=dw(rN(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Cs(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:iw(a,"owner"),tokenURI:l,agentURI:l,agentWallet:iw(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}xr();Ee();var mw=999;async function fw(e={}){let t={chainId:mw,rpc:null,dex:null};try{t.rpc=await br(mw,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await To("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 hw(e="HYPE",t={}){let r=(await To(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 gw(e,t={}){return Hn(e,t)}j();Wn();ne();var aN="https://api-mainnet.magiceden.dev/v2",wi=1e9;function yw(e={}){return kt({provider:"magiceden",defaultUrl:aN,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Hr(e={}){return yw(e).baseUrl}function er(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function jr(e={}){let t=er(e);return lt({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},yw(e).trusted)}function vd(e){let t=String(e||"").trim();if(!/^[a-z0-9_]{1,64}$/i.test(t))throw new Error("magiceden: symbol must be a collection slug");return t}function Dr(e,t){if(typeof e=="number"){if(!Number.isFinite(e)||e<=0)throw new Error(`magiceden: ${t} must be a positive number`);return e}let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`magiceden: ${t} must be a plain decimal number (no hex, exponent, or sign)`);let r=Number(n);if(!Number.isFinite(r)||r<=0)throw new Error(`magiceden: ${t} must be a positive number`);return r}function sN(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 cN(e){return Math.round(Dr(e,"priceSol")*wi)}function lN(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 uN({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function dN(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=uN(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function ww(e={}){try{let t=await Sd({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!er(e),readTier:"keyless",prepareTier:er(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!er(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Sd(e={},t={}){let n=vd(e.symbol||e.collection),r=await k(`${Hr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:jr(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/wi:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/wi:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/wi:null,exec:!1,raw:r}}function bw(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*wi):null,tokenSize:e.tokenSize??1}}async function xw(e={},t={}){let n=vd(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(`${Hr(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let a=await k(i.toString(),{headers:jr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(bw);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function vw(e={},t={}){let n=xe(e.tokenMint||e.mint,"tokenMint"),r=await k(`${Hr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:jr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(bw);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Sw(e={},t={}){if(!er(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=xe(e.buyer||e.userPublicKey,"buyer"),r=xe(e.seller,"seller"),o=xe(e.tokenMint,"tokenMint"),i=xe(e.tokenATA||e.tokenAddress,"tokenATA"),a=xe(e.auctionHouse,"auctionHouse"),s=Dr(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:Dr(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Hr(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",a),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await k(l.toString(),{headers:jr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Jt("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 B({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:cN(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Ns(e={},t={}){if(!er(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=xe(e.seller||e.userPublicKey,"seller"),r=xe(e.tokenMint,"tokenMint"),o=xe(e.tokenATA||e.tokenAddress,"tokenATA"),i=xe(e.auctionHouse,"auctionHouse"),a=Dr(e.priceSol??e.price,"priceSol"),s=lN(e.expiry),c=dN(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${Hr(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",xe(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await k(l.toString(),{headers:jr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Jt("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 B({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 kw(e={},t={}){if(!er(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=xe(e.buyer||e.userPublicKey,"buyer"),r=vd(e.symbol||e.collection);if(e.maxPriceSol==null)throw new Error("magiceden: maxPriceSol is required to prepare a mint \u2014 an uncapped mint has no spend ceiling");let o=Dr(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:Dr(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${Hr(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await k(a.toString(),{headers:jr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=sN(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`);Jt("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 B({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();ou();j();ot();var zr=8,kd=10n**BigInt(zr),mN="0xa4b1",Ew=7,Ed=1,fN=2n**64n-1n;function hN(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 xi(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Vr(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 bi(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>zr)throw new Error(`hl-staking: ${t} has more than ${zr} decimals`);let i=BigInt(r)*kd+BigInt((o+"0".repeat(zr)).slice(0,zr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>fN)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Wr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function en(e){let t=BigInt(String(e||"0")),n=t/kd,r=(t%kd).toString().padStart(zr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Aw(e={}){try{let t=await Ad(e);return{ok:t.count>0,provider:"hl-staking",chain:xi(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 Ad(e={}){let t=await ge({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 Id(e={},t={}){let n=Vr(e.user||e.address,"user"),r=await ge({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 _d(e={},t={}){let n=Vr(e.user||e.address,"user"),r=await ge({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 Iw(e={},t={}){let n=Vr(e.user||e.address,"user"),r=await ge({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function _w(e={},t={}){let n=Vr(e.user||e.address,"user"),r=await ge({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Pd(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 Os(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||mN)}function gN(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Os(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Td({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:xi(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:hN(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:gN(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=Ya(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,B(l,{provider:"hl-staking",kind:e})}function Pw(e={},t={}){let n=bi(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:bi(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${en(n)} HYPE exceeds maxHype cap ${en(r)} HYPE`);let o=Pd(e),i=xi(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Os(t),wei:Wr(n),nonce:o};return Td({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:Wr(n),nonce:o},opts:t,args:e,caps:{amountHype:en(n),maxHype:r?en(r):null},notes:["Moves HYPE from your Hyperliquid spot balance into your staking balance.","Staking balance still earns nothing until it is delegated to a validator.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function Tw(e={},t={}){let n=bi(e.amountHype??e.amount,"amountHype"),r=Pd(e),o=xi(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Os(t),wei:Wr(n),nonce:r};return Td({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:Wr(n),nonce:r},opts:t,args:e,caps:{amountHype:en(n)},notes:[`Starts the ${Ew} 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 Cw(e={},t={}){let n=Vr(e.validator,"validator"),r=bi(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:bi(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${en(r)} HYPE exceeds maxHype cap ${en(s)} HYPE`);let c=Pd(e),l=xi(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Os(t),validator:n,wei:Wr(r),isUndelegate:a,nonce:c};return Td({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:Wr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:en(r),maxHype:s?en(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Ed} 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 ${Ed} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Nw(e={},t={}){let n=Vr(e.user||e.address,"user"),r=await Id({user:n},t),o=await _d({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Ew,validatorLockupDays:Ed,exec:!1}}ot();async function Cd(e={}){let t=Date.now();try{let n=await Vt(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 wN=24*365,bN=8;function ze(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function xN(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Rs(e={},t={}){let[n,r]=await Promise.all([dt(t),Vt(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=ze(u.markPx),p=ze(u.prevDayPx),m=ze(u.openInterest),f=ze(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:ze(u.oraclePx),midPx:ze(u.midPx)??ze(r?.[c.name]),prevDayPx:p,change24hPct:xN(d,p),dayNtlVolumeUsd:ze(u.dayNtlVlm),premium:ze(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(wN/bN)*100,openInterestCoin:m,openInterestUsd:m==null||d==null?null:m*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:s.length,markets:s,totals:{openInterestUsd:s.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:s.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function Ow(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Rs(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 Rw(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([Rs({},t),Ir({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Ar(n,t).catch(()=>null)]),u=s.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:ze(h.o),high:ze(h.h),low:ze(h.l),close:ze(h.c),volume:ze(h.v)})),p=l?.levels??[],m=ze(p?.[0]?.[0]?.px),f=ze(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 $w(e={},t={}){let n=await Ha(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 UN,readFileSync as qN,readdirSync as DN,renameSync as HN,writeFileSync as jN}from"node:fs";import{homedir as zN}from"node:os";import{join as Ms}from"node:path";var vi=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});j();Ee();ne();import{Interface as Nd,getAddress as Dw,isAddress as SN}from"ethers";var Lw=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Bw=Object.freeze({42161:{name:"arbitrum",api:Lw[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Lw[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),Mw="0x0000000000000000000000000000000000000000",kN=`0x${"0".repeat(64)}`,Fw=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Uw=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),$s=new Nd(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),Hw=new Nd(["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)"]),EN=new Nd(["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)"]),AN=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Kr(e){let t=Number(e??42161),n=Bw[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Bw).join(", ")})`);return{chainId:t,...n}}function Ls(e,t={}){let n=Kr(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function gt(e,t){if(!SN(e))throw new Error(`${t} must be a valid EVM address`);return Dw(e)}function se(e){return Dw(e).toLowerCase()}function Gr(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 tr(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 IN(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 Fw))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:Fw[t]}}function PN(e){let t=String(e||"noSwap").trim();if(!(t in Uw))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:Uw[t]}}function TN(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function CN(e,t){let n=se(t);return e.find(r=>se(r.marketToken||r.market||r.address)===n)||null}function NN(e,t){let n=se(t);return e.find(r=>se(r.tokenAddress||r.address)===n)||null}function ON({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Gr(e?.minPrice,"gmx minPrice"),i=Gr(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 RN(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function $N(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Bt(e,t,n=r=>r){let o=Array.from(e?.items||e?.[0]||[]).find(i=>String(i?.key??i?.[0]??"")===t);return o?n(o.value??o[1]):null}function LN(e={}){let t=e.addressItems||e[0],n=e.uintItems||e[1],r=e.boolItems||e[3],o=e.bytes32Items||e[4],i=e.stringItems||e[6];return{account:Bt(t,"account",a=>se(a)),market:Bt(t,"market",a=>se(a)),initialCollateralToken:Bt(t,"initialCollateralToken",a=>se(a)),key:Bt(o,"key",a=>String(a).toLowerCase()),reason:Bt(i,"reason",a=>String(a)),sizeDeltaUsd:Bt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:Bt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:Bt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:Bt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:Bt(r,"isLong",a=>!!a)}}function BN(e={},t){if(se(e.address)!==se(t.eventEmitter))return null;let n;try{n=EN.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=AN[r];if(!o)return null;let i=LN(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||$N(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?se(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 qw(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function MN(e=[],{chainId:t}={}){let n=Kr(t);return(Array.isArray(e)?e:[]).map(r=>BN(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function jw(e={},t={}){return k(`${Ls(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Od(e={},t={}){return k(`${Ls(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function zw(e={},t={}){return k(`${Ls(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Yr(e={},t={}){return k(`${Ls(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Ww(e={}){let t=await Yr({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function Vw(e={},t={}){let n=Kr(e.chainId??42161),r=gt(e.account||e.owner||e.user,"gmx account"),o=tr(e.start??0,"gmx start"),i=tr(e.end??e.limit??20,"gmx end"),a=Hw.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||W)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:se(n.reader),dataStore:se(n.dataStore),account:se(r),raw:c}}async function Gw(e={},t={}){let n=Kr(e.chainId??42161),r=String(e.key||e.orderKey||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error("gmx order key must be bytes32 hex");let o=Hw.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||W)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:se(n.reader),dataStore:se(n.dataStore),key:r,raw:a}}async function Kw(e={},t={}){let n=Kr(e.chainId??42161),r=t.receipt||await Po({chainId:n.chainId,txHash:e.txHash,expectedTo:e.expectedTo||n.exchangeRouter},t),o=String(e.txHash||r.txHash||"").toLowerCase();if(r.ok!==!0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:r.status||"unknown",reason:r.reason||"receipt not successful",receipt:r};let i=MN(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)=>qw(d.status)>=qw(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?se(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:se(n.eventEmitter),events:s,receipt:r}}async function Yw(e={},t={}){let n=Kr(e.chainId??42161),r=_N(e.orderType||e.type),o=PN(e.decreasePositionSwapType),i=gt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=gt(e.receiver||i,"gmx receiver"),s=gt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?gt(e.callbackContract,"gmx callbackContract"):Mw,l=e.uiFeeReceiver?gt(e.uiFeeReceiver,"gmx uiFeeReceiver"):Mw,u=gt(e.market||e.marketToken,"gmx market"),d=gt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Gr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):tr(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=Gr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=Gr(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=IN(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[w,y]=await Promise.all([Od({chainId:n.chainId},t),Yr({chainId:n.chainId},t)]),S=CN(TN(w,"markets"),u);if(!S)throw new Error("gmx market not found in public registry");if(S.isListed===!1)throw new Error("gmx market is not listed");let E=gt(S.indexToken,"gmx market indexToken"),v=gt(S.longToken,"gmx market longToken"),A=gt(S.shortToken,"gmx market shortToken"),P=se(d);if(![se(v),se(A)].includes(P))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let T=RN(S,x);if(T>0n&&m>T)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let C=NN(y,E);if(!C)throw new Error("gmx index ticker not found");let I=e.acceptablePrice?Gr(e.acceptablePrice,"gmx acceptablePrice").toString():ON({ticker:C,isLong:x,typeKey:r.key,maxSlippageBps:b}),F=(e.swapPath||[]).map(he=>gt(he,"gmx swapPath market"));if(F.length>3)throw new Error("gmx swapPath too long for guarded slice");let D=tr(e.triggerPrice??"0","gmx triggerPrice"),N=tr(e.callbackGasLimit??"0","gmx callbackGasLimit"),U=tr(e.minOutputAmount??"0","gmx minOutputAmount"),$=tr(e.validFromTime??"0","gmx validFromTime"),q=!!e.shouldUnwrapNativeToken,te=e.autoCancel==null?!0:!!e.autoCancel,Y=String(e.referralCode||kN);if(!/^0x[0-9a-fA-F]{64}$/.test(Y))throw new Error("gmx referralCode must be bytes32 hex");let Ce=Array.isArray(e.dataList)?e.dataList:[];for(let he of Ce)if(!/^0x[0-9a-fA-F]{64}$/.test(String(he)))throw new Error("gmx dataList entries must be bytes32 hex");let tt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:F},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:D,acceptablePrice:BigInt(I),executionFee:f,callbackGasLimit:N,minOutputAmount:U,validFromTime:$},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:q,autoCancel:te,referralCode:Y,dataList:Ce},M=[];r.key==="marketIncrease"&&p>0n&&M.push($s.encodeFunctionData("sendTokens",[d,n.orderVault,p])),M.push($s.encodeFunctionData("sendWnt",[n.orderVault,f])),M.push($s.encodeFunctionData("createOrder",[tt]));let H=$s.encodeFunctionData("multicall",[M]),Q={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:se(i),receiver:se(a),exchangeRouter:se(n.exchangeRouter),router:se(n.router),orderVault:se(n.orderVault),market:se(u),indexToken:se(E),initialCollateralToken:se(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:I,maxSlippageBps:b,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return B({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:se(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:se(d),spender:se(n.router),amount:p.toString()}:null,gmxGuard:Q,transaction:{chainId:n.chainId,from:se(i),to:se(n.exchangeRouter),data:H,value:f.toString(),gmxGuard:Q}},{provider:"gmx",kind:"gmx-order"})}ot();var En="oracle.hl.entry-state.v1",WN=8,VN=24*365;function we(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Jr(e){return e==null||e===0?0:e>0?1:-1}function Si(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function GN(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Ms(zN(),".config","oracle")}function Qw(e={}){return Ms(GN(e),"hl-entry-states")}function Bs(e,t,n){return n==null&&e.push(t),n}function KN(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 tn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function YN(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:we(a.time),rate:we(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return tn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)Jr(o[a].rate)!==Jr(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 JN(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return tn("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=we(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}:tn("defillama.stablecoins","no peggedUSD")}function Jw(e,t){let n=we(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 XN(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 tn("gmx.tickers","no matching symbol");let c=Jw(s.minPrice,n),l=Jw(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return tn("gmx.tickers","unreadable price");let d=n!=null&&n>0?Si(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?tn("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 QN({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?tn("hl-info.fundingHistory","not fetched"):YN(r,{coin:e,asOfMs:n}),llamaStables:o==null?tn("defillama.stablecoins","not fetched"):JN(o,n),gmxTicker:i==null?tn("gmx.tickers","not fetched"):XN(i,{coin:e,hlMark:t,asOfMs:n})}}function Xw(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=we(s?.px),l=we(s?.sz);if(c==null||l==null||c<=0||l<=0)continue;let u=c*l,d=Math.min(u,Math.max(0,t-o));if(d<=0||(i+=d/c,o+=d,o>=t))break}let a=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:a}}function ZN(e,t){if(!e)return{present:!1,unknown:["userState"]};let n=String(t).toUpperCase(),i=(e.assetPositions||e.clearinghouseState?.assetPositions||[]).find(f=>String(f?.position?.coin||"").toUpperCase()===n)?.position;if(!i)return{present:!1,unknown:[]};let a=we(i.szi),s=we(i.positionValue)!=null&&a?Math.abs(we(i.positionValue)/a):null,c=we(i.entryPx),l=we(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:we(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function eO({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:a=Date.now(),fundingHistory:s=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:En,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=KN(n,e);if(!d)return{schema:En,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Bs(u,"markPx",we(m.markPx)),h=Bs(u,"oraclePx",we(m.oraclePx)),g=we(m.midPx),b=we(m.premium),x=Bs(u,"fundingRate",we(m.funding)),w=Bs(u,"openInterestCoin",we(m.openInterest)),y=we(m.dayNtlVlm),S=Array.isArray(m.impactPxs)?m.impactPxs:[],E=we(S[0]),v=we(S[1]),A=x==null?null:x*(VN/WN)*100,P=w==null||f==null?null:w*f,T=i==null||i===0||w==null?null:(w-i)/i*100;T==null&&u.push("oiDeltaPct");let C=r?.levels,I=Array.isArray(C)?C[0]:[],F=Array.isArray(C)?C[1]:[],D=we(I?.[0]?.px),N=we(F?.[0]?.px);D==null&&u.push("book.bidPx"),N==null&&u.push("book.askPx");let U=Xw(F,Number(t)||0,"buy"),$=Xw(I,Number(t)||0,"sell");U.fillable||u.push("book.buyFillable"),$.fillable||u.push("book.sellFillable");let q=g??f,te=U.avgFillPx==null||q==null?null:Si(U.avgFillPx,q),Y=$.avgFillPx==null||q==null?null:Si(q,$.avgFillPx),Ce=ZN(o,e);for(let Q of Ce.unknown||[])u.push(Q);let tt=we(m.prevDayPx),M=f==null||tt==null||tt===0?null:(f-tt)/tt*100;M==null&&u.push("change24hPct");let H=QN({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:En,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:b,markOracleBps:Si(f,h),fundingRate:x,fundingAprPct:A,openInterestCoin:w,openInterestUsd:P,oiDeltaPct:T,dayNtlVolumeUsd:y,change24hPct:M,impactBidPx:E,impactAskPx:v,maxLeverage:p.maxLeverage??null,book:{bidPx:D,askPx:N,spreadBps:D==null||N==null?null:Si(N,D),notionalUsd:Number(t)||0,buy:U,sell:$,buySlipBps:te,sellSlipBps:Y},position:Ce,overlays:H,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function Zw(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 tO(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 nO({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==En||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=tO(n),a=Zw(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:En,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:vi.ALERT_ONLY},c=Qw({...o,configDir:r||o.configDir});UN(c,{recursive:!0,mode:448});let l=Ms(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return jN(u,`${JSON.stringify(s,null,2)}
|
|
146
|
-
`,{mode:384}),HN(u,l),s}function Rd(e={}){let t=Qw(e),n=[];try{n=DN(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(qN(Ms(t,r),"utf8")))}function rO(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:vi.ALERT_ONLY};let r=e.see,o=t;Jr(r.fundingRate)!==Jr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),Jr(r.premium)!==Jr(o.premium)&&r.premium!=null&&o.premium!=null&&n.push({key:"premiumSign",level:"hold",from:r.premium,to:o.premium});let i=r.position?.liqDistancePct,a=o.position?.liqDistancePct;i!=null&&a!=null&&(a<5||a<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:a});let s=e.side,c=s==="long"?r.book?.buy:r.book?.sell,l=s==="long"?o.book?.buy:o.book?.sell;c?.fillable&&l&&!l.fillable&&n.push({key:"bookFillable",level:"thesis-broke",from:!0,to:!1});let u=o.oiDeltaPct;return u!=null&&Math.abs(u)>=15&&n.push({key:"oiDeltaPct",level:"hold",from:0,to:u}),{schema:En,id:e.id,coin:e.see.coin,side:e.side,actionMode:vi.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function eb(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await dt(e))?.[0]?.universe?.length,venue:"hyperliquid",latencyMs:Date.now()-t}}catch(n){return{provider:"hl-entry-state",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}async function ki(e={},t={}){let n=e.coin,r=we(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([dt(t),n?Ar(n,t).catch(()=>null):Promise.resolve(null),e.user?_r(e.user,t).catch(()=>null):Promise.resolve(null),n?Da({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),ds({},t).catch(()=>null),Yr({chainId:42161},t).catch(()=>null)]);return eO({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:we(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function tb(e={},t={}){let n=e.see&&e.see.schema===En?e.see:await ki(e,t);return{see:n,...Zw(n,e.side)}}async function nb(e={},t={}){let n=e.see&&e.see.schema===En?e.see:await ki(e,t);return nO({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function rb(e={},t={}){let n=e.locked||Rd(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:vi.ALERT_ONLY};let r=await ki({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return rO(n,r)}ot();Ka();Za();async function ob(e={}){let t=await jo(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function ib(e={},t={}){let n=e.coin,r=e.outcome==null?null:pn(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=sb(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=$d(i)));let a=n==null?null:mn(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 jo(t))?.outcomes||[]).find(f=>{try{return pn(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=$d(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=pn(r,i).coin}if(a=mn(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,Nr(c,t)}async function ab(e={},t={}){let n=e.coin,r=e.outcome==null?null:pn(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=sb(e.outcomeSide):(o=e.side,o!=null&&(o=$d(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=pn(r,o).coin}let i=mn(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,Zo(a,t)}function sb(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function $d(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();Pr();var Oq="0x"+"00".repeat(32);function aO(e){let t=typeof e=="bigint"?e:mt(e,"poly: atomicUsdc");if(t<=0n)throw new Error("poly: order amounts must be positive integer micro-units");let n=t/1000000n,r=(t%1000000n).toString().padStart(6,"0").replace(/0+$/,"");return r?`${n.toString()}.${r}`:n.toString()}function cb(e,t){let n=mt(e.makerAmount,"poly: makerAmount"),r=mt(e.takerAmount,"poly: takerAmount");return aO(t==="BUY"?n:r)}Pr();var sO=new Set(["https://clob.polymarket.com/order"]),Ei=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Bq=Object.freeze(Ei.map(e=>e[0])),cO=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),lO="0xe111180000d2663c0091e4f400237545b87b996b",uO="0xe2222d279d744050d28e00520010520000310f59",lb=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function ub(e){let t=String(e||"").replace(/\/$/,"");if(!sO.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function db(e){let t=pt(e,"poly: exchange").toLowerCase();if(!cO.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function pb(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=lb(n.kind,"kind",48);if(r!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(pt(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(ub(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(db(o.verifyingContract),db(n.exchange),pt(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==pt(n.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof n.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=n.negRisk?uO:lO;if(pt(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==Ei.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let v=0;v<Ei.length;v+=1)if(s[v]?.name!==Ei[v][0]||s[v]?.type!==Ei[v][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(pt(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(pt(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=lb(n.tokenId,"tokenId",80);if(pt(a.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=mt(a.makerAmount,"poly: makerAmount"),m=mt(a.takerAmount,"poly: takerAmount"),f=mt(n.makerAmount,"poly: prepared makerAmount"),h=mt(n.takerAmount,"poly: prepared takerAmount");if(p!==f)throw new Error("poly: signed makerAmount differs from prepared envelope");if(m!==h)throw new Error("poly: signed takerAmount differs from prepared envelope");let g=d==="BUY"?p:m,b=d==="BUY"?m:p,x=Re(n.quantity,6,"poly: quantity");if(x<=0n||x!==b)throw new Error("poly: quantity must match CLOB v2 amounts");let w=Re(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(Re(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let S=cb(a,d);if(Re(S,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let E=t.maxNotionalUsd??t.maxNotionalUsdc;if(E!=null){let v=Re(E,6,"poly: maxNotionalUsd");if(g>v)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:S,submitTo:ub(n.submitTo)})}function dO(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 mb(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:dO({...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 pb(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as jq,randomInt as pO}from"node:crypto";import{keccak256 as Wq,concat as Vq,zeroPadValue as Gq,getCreate2Address as Kq,AbiCoder as Yq}from"ethers";var wb=137;var mO="0xE111180000d2663C0091e4f400237545B87B996B",fO="0xe2222d279d744050d28e00520010520000310F59",fb="0x0000000000000000000000000000000000000000000000000000000000000000",Ld=6;var hO={name:"Polymarket CTF Exchange",version:"2",chainId:wb},gO={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"}]},hb={"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 Fs(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Us(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function gb(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function bb(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function yO(e,t,n,r){let o=bb(Number(n),r.price);if(e==="BUY"){let c=Us(Number(t),r.size),l=c*o;return Fs(l)>r.amount&&(l=gb(l,r.amount+4),Fs(l)>r.amount&&(l=Us(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=Us(Number(t),r.size),s=a*o;return Fs(s)>r.amount&&(s=gb(s,r.amount+4),Fs(s)>r.amount&&(s=Us(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function yb(e){let t=Number(e).toFixed(Ld),[n,r=""]=t.split(".");return(n+r.padEnd(Ld,"0").slice(0,Ld)).replace(/^0+/,"")||"0"}function wO(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=fb,builder:p=fb}=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=hb[String(c)]||hb["0.01"],g=bb(m,h.price),{rawMakerAmt:b,rawTakerAmt:x}=yO(n,f,g,h),w=yb(b),y=yb(x),S=String(pO(1,2**31-1)),E=Date.now().toString(),v=n==="BUY"?0:1,A=s?fO:mO,P={salt:S,maker:i,signer:a,tokenId:String(t),makerAmount:w,takerAmount:y,side:v,signatureType:u,timestamp:E,metadata:d,builder:p},T={...hO,verifyingContract:A},C=n==="BUY"?b:x;return{domain:T,types:gO,value:P,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:b),notionalUsdc:C,exchange:A,negRisk:s}}function xb(){return{ok:!0,provider:"poly-clob",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Hosted/keyless remains prepare-only."}}function vb(e={},t={}){let n=wO(e),r={provider:"poly-clob",kind:"poly-order",chainId:wb,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=mb(r,e,t)}catch{r.oraclePrepared=!1}return B(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as FO,keccak256 as Bb}from"ethers";import{wordlists as xO}from"ethers";var vO=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),SO=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],kO=new Set([12,15,18,21,24]);function EO(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return kO.has(t.length)&&t.every(n=>xO.en.getWordIndex(n)>=0)}var AO=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,IO=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,_O=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function PO(e){let t=Sb(e);return _O.has(t)||IO.test(t)}var Ai=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Sb(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function TO(e){let t=Sb(e);return[...vO].some(n=>t.includes(n))}function CO(e,t,n){if(typeof t=="string"){if(SO.some(r=>r.test(t))||EO(t))throw new Ai(n);if(AO.test(t)&&!PO(e))throw new Ai(n)}}function Bd(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return CO(n,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>Bd(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(TO(o))throw new Ai(i);e[o]!==void 0&&(r[o]=Bd(e[o],i,o))}return r}function kb(e){return Bd(e)}ne();Ks();zs();var UO=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function qO(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=kb(e);for(let o of Object.keys(n))if(!UO.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 Mb(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=Cb(n,o),a=Lb(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!a.bytecode||a.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let s=a.bytecode.startsWith("0x")?a.bytecode:`0x${a.bytecode}`,u=(await new FO(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}:{...qO(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return B({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:Bb(s),authorityReport:Nb(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:Bb(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:Vs},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"})}Ks();Hd();Za();j();var QO="https://api.geckoterminal.com/api/v2",Xs=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||QO).replace(/\/$/,""),Qr=e=>encodeURIComponent(String(e));async function jd(e={},t={}){let n=Math.max(1,Number(e.page||1));return k(`${Xs(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return k(`${Xs(t)}/networks/${Qr(e.network)}/pools/${Qr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Vb(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return k(`${Xs(t)}/networks/${Qr(e.network)}/tokens/${Qr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Gb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),k(`${Xs(t)}/networks/${Qr(e.network)}/pools/${Qr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Kb(e={}){let t=await jd({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}j();Ee();We();ne();import{Interface as Qb,getAddress as Zb,isAddress as eR}from"ethers";var tR="https://api.curve.finance/v1",ex=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||tR).replace(/\/$/,""),nR=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),tx="0x0000000000000000000000000000000000000000",zd=new Qb(["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)"]),Yb=new Qb(["function coins(uint256) view returns (address)"]);function nx(e){let t=nR[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Ri(e,t){if(!eR(e))throw new Error(`${t} must be a valid EVM address`);return Zb(e)}function rR(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 Jb(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function rx(e,t,n){return[e,t,n,...Array(8).fill(tx)]}function ox(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function ix(e){return[e,...Array(4).fill(tx)]}async function oR({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=Yb.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=Yb.decodeFunctionResult("coins",c);i.push(Zb(l[0]))}return i}function Xb(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 ax(e={}){return k(`${ex(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Wd(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return k(`${ex(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function sx(e={}){let t=await Wd({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Vd(e={},t={}){let n=Number(e.chainId??8453),r=nx(n),o=Ri(e.pool,"curve pool"),i=Ri(e.tokenIn,"curve tokenIn"),a=Ri(e.tokenOut,"curve tokenOut"),s=rR(e.amountIn,"curve amountIn"),c=Jb(e.nCoins??2,"curve nCoins",2,8),l=Jb(e.poolType,"curve poolType",1,4),u=t.rpcCall||W,d=await oR({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=Xb(d,i,"tokenIn"),m=Xb(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=rx(i,o,a),h=ox(p,m,l,c),g=ix(o),b=zd.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),w=zd.decodeFunctionResult("get_dy",x),y=BigInt(w[0]);if(y<=0n)throw new Error("curve quote returned zero output");return le({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(S=>S.map(E=>E.toString())),pools:g},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function cx(e={},t={}){let n=Number(e.chainId??8453),r=nx(n),o=Ri(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Ri(e.receiver||e.recipient||o,"curve receiver"),a=await Vd({...e,sender:o},t),s=rx(a.tokenIn,a.pool,a.tokenOut),c=ox(a.i,a.j,a.poolType,a.nCoins),l=ix(a.pool),u=zd.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return B({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:Ae(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}j();Ee();ne();import{Interface as aR,getAddress as sR,isAddress as cR,keccak256 as lx,toUtf8Bytes as ux}from"ethers";var lR="https://api.morpho.org/graphql",Qs=new aR(["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)"]),uR=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||lR;async function Kd(e,t,n={}){return k(uR(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var dR="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 } } } }",pR="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 $i(e,t){let n=String(e||"").trim();if(!cR(n))throw new Error(`morpho: ${t} must be an address`);return sR(n).toLowerCase()}function mR(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 Gd(e){return Array.isArray(e)?`[${e.map(Gd).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Gd(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Li(e,t,n,r,o={}){let i=Qs.encodeFunctionData(n,r),s=await(o.rpcCall||W)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Qs.decodeFunctionResult(n,s)}function fR(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function dx(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Kd(dR,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Yd(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Kd(pR,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function px(e={}){return{ok:(await Kd("query { __typename }",{},e))?.data?.__typename==="Query"}}async function mx(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=$i(e.vault||e.vaultAddress,"vault"),i=$i(e.owner||e.from||e.sender,"owner"),a=$i(e.receiver||i,"receiver"),s=mR(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Yd({chainId:n,first:100},t),u=fR(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 Li(n,o,"asset",[],t),m=$i(p,"vault asset");if((u?.asset?.address?$i(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[x]=await Li(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[w]=await Li(n,o,"previewDeposit",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:w.toString()},h=Qs.encodeFunctionData("deposit",[s,a])}else{let[x]=await Li(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[w]=await Li(n,o,"previewWithdraw",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:w.toString()},h=Qs.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:lx(ux(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=lx(ux(Gd(b))),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();Ee();We();ne();import{Interface as gR,getAddress as Jd,isAddress as yR}from"ethers";var wR="https://api-v3.balancer.fi/",bR=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||wR;async function gx(e,t,n={}){return k(bR(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var xR="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",fx=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"}}),vR="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",SR="0x0000000000000000000000000000000000000000",Xd=new gR(["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 yx(e){let t=Number(e??8453),n=fx[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(fx).join(", ")})`);return{chainId:t,...n}}function wx(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===SR||t===vR.toLowerCase()}function Zs(e,t){if(!yR(e))throw new Error(`${t} must be a valid EVM address`);return Jd(e)}function hx(e,t,n){let r=String(e||"");return wx(r)||/^weth$/i.test(r)?Jd(t.weth):/^usdc$/i.test(r)?Jd(t.usdc):Zs(r,n)}function kR(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 bx(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function xx(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return gx(xR,{first:n,chains:r,where:{chainIn:r}},t)}async function vx(e={}){return{ok:(await gx("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Qd(e={},t={}){let n=yx(e.chainId),r=Zs(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=hx(o,n,"balancer tokenIn"),a=hx(e.tokenOut||"USDC",n,"balancer tokenOut"),s=kR(e.amountIn,"balancer amountIn"),c=Zs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Xd.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,bx(e.userData)]),d=await(t.rpcCall||W)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Xd.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return le({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 Sx(e={},t={}){let n=yx(e.chainId),r=Zs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=wx(o),a=await Qd({...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=Xd.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,bx(e.userData)]);return B({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:Ae(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}j();We();ne();import{getAddress as AR}from"ethers";var IR="https://api-v2.pendle.finance/core",_R=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),PR="0x0000000000000000000000000000000000000000",TR="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",kx=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||IR).replace(/\/$/,"");function ec(e,t){try{return AR(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function Zr(e,t){return ec(e,t).toLowerCase()}function CR(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===TR||t===PR}function Zd(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 NR(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:ec(t.token,`pendle input ${n} token`),amount:Zd(t.amount,`pendle input ${n} amount`)}))}function OR(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>ec(t,`pendle output ${n} token`))}function RR(e){let t=_R[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function $R(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 Zd(t,"pendle output amount")}function LR(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!CR(r.token)).map(r=>({token:Zr(r.token,"pendle approval token"),spender:Zr(t,"pendle approval spender"),amount:Zd(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function ep(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),k(`${kx(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ex(e={}){let t=await ep({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function tp(e={},t={}){let n=Number(e.chainId??42161),r=RR(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=ec(e.receiver||o,"pendle receiver"),a=NR(e.inputs),s=OR(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=Qe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:a,outputs:s,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await k(`${kx(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(Zr(p.to,"pendle tx target")!==Zr(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&Zr(p.from,"pendle tx sender")!==Zr(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=$R(u),f=le(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return B({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:LR(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:Ae(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function Ax(e={},t={}){let n=await tp(e,t),{transaction:r,...o}=n;return o}j();We();ne();import{isAddress as MR}from"ethers";var FR="https://api.odos.xyz",np=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||FR).replace(/\/$/,"");async function rp(e={}){return k(`${np(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function UR(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(!MR(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Ix(e={},t={}){let n=UR(e),r=Qe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await k(`${np(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 _x(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Ix(e,t);return{...le(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 Px(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Ix(e,t),i=await k(`${np(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=le(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 B({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:Ae(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function Tx(e={}){let t=await rp(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}j();var Cx=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,DR=/[<>&`*_~[\]()|\\]/g,HR=/[\u0000-\u001F\u007F]/g;function op(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Cx,"").replace(HR,"").replace(DR,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function ip(e){if(e==null)return!1;let t=String(e);return Cx.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Nx=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 tc(e,t={}){let n=Number(e),r=t.baseUrl||Nx[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Ox(e){return!!Nx[Number(e)]}async function ap(e={},t={}){return k(`${tc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Rx(e={},t={}){if(!e.address)throw new Error("address required");return k(`${tc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function $x(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return k(`${tc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Lx(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${tc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await k(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function Bx(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=op(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=op(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:ip(o.symbol)||ip(o.name)||void 0})}return n}async function Mx(e={}){let t=await ap({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as zR}from"ethers";j();Ee();ot();var WR="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",Ux=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 An(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function nc(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function Fx(e){if(!e)return null;try{return zR(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function or(e={},t=process.env){let n=e.addresses||{},r=Fx(n.evm||e.evmAddress||nc(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||nc(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||nc(t,"ORACLE_BITCOIN_ADDRESS"),a=Fx(n.hyperliquid||e.hyperliquidAddress||nc(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?xe(o,"portfolio Solana address"):null,bitcoin:i?Et(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function Bi(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 eo(e){let t=Number(e);return Number.isFinite(t)?t:null}function rc(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function In(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function qx(e,t){let n=Ux[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 VR(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:Bi(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 sp(e,t){return{family:e,status:"unsupported",reason:t}}function cp(e,t){if(!e||e.status!=="ok")return e;let n=qx(t,e.symbol),r=eo(e.amount),o=r!=null&&n.priceUsd!=null?rc(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Dx(e={}){let t=or({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function oc(e={},t={}){let n=new Date().toISOString(),r=or(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Er.map(M=>[M.chainId,M])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(Ux))],u=o?Oe(()=>At(l,An(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Xe(c,e.concurrency||5,async M=>{let H=s.get(M);if(!H)return{family:"evm",chainId:M,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:M,name:H.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let Q={...An(t,"evm"),rpcUrl:e.rpcUrls?.[M]||t.evm?.rpcUrls?.[M]},he=await Oe(()=>Dn(M,r.evm,Q));if(!he.ok)return{family:"evm",chainId:M,name:H.name,address:r.evm,status:"unavailable",latencyMs:he.ms,error:he.error};let Me=H.nativeCurrency?.decimals??18,He=H.nativeCurrency?.symbol||"NATIVE",X=he.data.balanceWei,ve={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Ox(M)){let xt=await Oe(()=>Lx({chainId:M,address:r.evm},{...An(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));xt.ok?ve={status:"ok",assets:Bx(xt.data,{fungibleOnly:!0}).map(Ht=>{let Un=Bi(Ht.amountRaw,Ht.decimals);return{...Ht,amount:Un,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:xt.ms}:ve={status:"unavailable",assets:[],reason:xt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:xt.ms}}return{family:"evm",chainId:M,name:H.name,address:r.evm,status:"ok",latencyMs:he.ms,native:{status:"ok",symbol:He,amountRaw:X,decimals:Me,amount:Bi(X,Me)},fungibleTokens:ve,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:ve.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let M=An(t,"solana"),H=await Oe(()=>es({address:r.solana},M)),Q=i||a?await Promise.all([Oe(()=>ri({owner:r.solana,programId:_u},M)).then(ve=>({...ve,program:"spl-token"})),Oe(()=>ri({owner:r.solana,programId:WR},M)).then(ve=>({...ve,program:"token-2022"}))]):[],he=VR(Q),Me=he.filter(ve=>ve.classification==="collectible-candidate"),He=he.filter(ve=>ve.classification!=="collectible-candidate"),X=Q.filter(ve=>!ve.ok).map(ve=>ve.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:H.ok||Q.some(ve=>ve.ok)?"ok":"unavailable",native:H.ok?{status:"ok",symbol:"SOL",amountRaw:H.data.lamports,decimals:9,amount:Bi(H.data.lamports,9),slot:H.data.slot}:{status:"unavailable",symbol:"SOL",error:H.error},fungibleTokens:{status:i?X.length===Q.length?"unavailable":X.length?"partial":"ok":"not-requested",assets:i?He:[],errors:X,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?X.length===Q.length?"unavailable":"partial":"not-requested",assets:a?Me:[],errors:X,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 M=An(t,"bitcoin"),H=An(t,"bitcoinMeta"),[Q,he,Me]=await Promise.all([Oe(()=>ns({address:r.bitcoin},M)),i?Oe(()=>os({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?Oe(()=>Lr({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),He=he.ok?he.data:null,X=Me.ok?Me.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:Q.ok||He?.ok||X?.ok?"ok":"unavailable",native:Q.ok?{status:"ok",symbol:"BTC",amountRaw:Q.data.balanceSats,decimals:8,amount:Bi(Q.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:Q.error},fungibleTokens:{status:i?He?.ok?"ok":"unavailable":"not-requested",assets:He?.balances||[],error:He?.ok?null:He?.error||he.error,verification:"indexer-reported"},collectibles:{status:a?X?.ok?"ok":"unavailable":"not-requested",assets:X?.inscriptions||[],error:X?.ok?null:X?.error||Me.error,unknownNotEmpty:!!X?.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 M=An(t,"hyperliquid"),[H,Q,he]=await Promise.all([Oe(()=>Ua(r.hyperliquid,M)),Oe(()=>_r(r.hyperliquid,M)),Oe(()=>Vt(M))]),Me=(H.ok&&Array.isArray(H.data?.balances)?H.data.balances:[]).filter(X=>In(X.total)||In(X.hold)).map(X=>({coin:X.coin||null,total:String(X.total??"0"),hold:String(X.hold??"0"),priceUsd:null,usdValue:null})),He=(Q.ok&&Array.isArray(Q.data?.assetPositions)?Q.data.assetPositions:[]).map(X=>X.position||X).filter(X=>In(X.szi)).map(X=>({coin:X.coin||null,size:String(X.szi??"0"),entryPrice:X.entryPx??null,positionValueUsd:X.positionValue??null,unrealizedPnlUsd:X.unrealizedPnl??null,liquidationPrice:X.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:H.ok||Q.ok?"ok":"unavailable",spot:{status:H.ok?"ok":"unavailable",balances:Me,error:H.ok?null:H.error},perps:{status:Q.ok?"ok":"unavailable",accountValueUsd:Q.data?.marginSummary?.accountValue??null,withdrawableUsd:Q.data?.withdrawable??null,positions:He,error:Q.ok?null:Q.error},mids:he.ok?he.data:{},source:"hyperliquid-info"}})(),[h,g,b,x,w]=await Promise.all([d,p,m,f,u]),y=w.ok?w.data:null,S=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),E=[];for(let M of h){if(M.family!=="evm"||M.fungibleTokens?.status!=="ok")continue;let H=S[M.chainId];if(H)for(let Q of M.fungibleTokens.assets||[])Q.address&&E.push(`${H}:${String(Q.address).toLowerCase()}`)}let v=null;if(o&&E.length){let M=[...new Set(E)],H=await Oe(()=>At(M,An(t,"prices")));H.ok&&(v=H.data)}let A=h.map(M=>{let H=M.native?{...M,native:cp(M.native,y)}:M;if(H.fungibleTokens?.status==="ok"&&Array.isArray(H.fungibleTokens.assets)){let Q=S[H.chainId],he=H.fungibleTokens.assets.map(Me=>{let He=String(Me.symbol||"").toUpperCase(),X=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(He)&&(X=1),X==null&&Q&&Me.address&&v?.coins){let wr=`${Q}:${String(Me.address).toLowerCase()}`,Ht=v.coins[wr],Un=Number(Ht?.price);Number.isFinite(Un)&&Un>0&&(X=Un)}let ve=eo(Me.amount),xt=ve!=null&&X!=null?rc(ve*X):null;return{...Me,priceUsd:X,usdValue:xt}});H={...H,fungibleTokens:{...H.fungibleTokens,assets:he}}}return H});g.native&&(g.native=cp(g.native,y)),b.native&&(b.native=cp(b.native,y));let P=0,T=0,C=0;for(let M of[...A,g,b]){M.native?.status==="ok"&&In(M.native.amount)&&(M.native.usdValue!=null?(P+=M.native.usdValue,T+=1):C+=1);for(let H of M.fungibleTokens?.assets||[])!In(H.amount)&&!In(H.amountRaw)||(H.usdValue!=null?(P+=H.usdValue,T+=1):C+=1)}let I=qx(y,"HYPE");for(let M of x.spot?.balances||[]){let H=String(M.coin||"").toUpperCase(),Q=H==="USDC"||H==="USDT"||H==="USDT0"?1:H==="HYPE"?I.priceUsd||eo(x.mids?.HYPE):eo(x.mids?.[M.coin]),he=eo(M.total);M.priceUsd=Q,M.usdValue=he!=null&&Q!=null?rc(he*Q):null,In(M.total)&&(M.usdValue!=null?(P+=M.usdValue,T+=1):C+=1)}let F=eo(x.perps?.accountValueUsd);F!=null&&F!==0&&(P+=F,T+=1);let D=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(M=>In(M.amount)).length,N=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;C+=D+N;let U=[...A,g,b,x],$=M=>U.filter(H=>H.status===M).length,q=[],te=A.filter(M=>M.fungibleTokens?.status==="unavailable"),Y=A.filter(M=>M.fungibleTokens?.status==="ok");te.length&&!Y.length?q.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):te.length&&q.push(`EVM token discovery partial: Blockscout covered ${Y.length} chain(s); ${te.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&q.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),b.collectibles?.unknownNotEmpty&&q.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),w.ok||q.push(`Price provider unavailable: ${w.error}`);let Ce=[sp("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),sp("sui","Sui balance adapter is not installed"),sp("aptos","Aptos balance adapter is not installed")],tt=U.some(M=>["unavailable","partial","not-configured"].includes(M.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(M.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:U.length,ok:$("ok"),unavailable:$("unavailable"),notConfigured:$("not-configured"),unsupported:$("unsupported")+Ce.length,evmChainsRequested:c.length,evmChainsOk:A.filter(M=>M.status==="ok").length},valuation:{knownUsd:rc(P),label:"known priced value, not a complete portfolio total",pricedItems:T,unpricedNonzeroItems:C,complete:C===0&&!tt&&$("unavailable")===0&&$("not-configured")===0&&Ce.length===0,priceSource:o?"DefiLlama":null,priceStatus:w.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...A,g,b,x],unsupportedFamilies:Ce,warnings:q}}import{constants as ac}from"node:fs";import{chmod as y2,mkdir as w2,open as b2,readFile as x2}from"node:fs/promises";import{createHash as v2,randomUUID as S2}from"node:crypto";import k2 from"node:os";import no from"node:path";j();j();var KR=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"]),YR=new Set(["image/jpeg","image/png","image/webp"]);function JR(e){let t=String(e||"").toLowerCase();return KR.some(n=>t===n||t.endsWith(`.${n}`))}function XR(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 Hx(e){let t=XR(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!JR(n.hostname)?null:n}async function QR(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=Hx(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 Oe(()=>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=Hx(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(!YR.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(s.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await s.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function lp(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ZR(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function jx(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 QR(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:S},E)=>{let v=E%u,A=Math.floor(E/u),P=v*d,T=m+A*p,C=y?`<image x="${P+14}" y="${T+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${P+14}" y="${T+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${P+170}" y="${T+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,I=lp(ZR(w,E).slice(0,34)),F=lp(w.chain||"unknown chain");return`${C}<text x="${P+16}" y="${T+350}" fill="#f3f5f7" font-size="17" font-weight="600">${I}</text><text x="${P+16}" y="${T+376}" fill="#8d98a8" font-size="13">${F}${S?" \xB7 placeholder":""}</text>`}).join(""),x=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${lp(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(x).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(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 e2=[/\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],t2=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,n2=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function r2(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;t2.test(n)&&t.push("url-in-name");let i=e2.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),n2.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 zx(e={}){let t=r2(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}ne();var o2=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"}]),i2=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 ir(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Mi(e,t){let n=await Oe(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function a2(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 s2(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 c2(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 Gx(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function l2(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 u2(e,t){let n=Gx(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 d2(e){let t=new Map;for(let n of e){let r=Gx(n);t.has(r)||t.set(r,n)}return[...t.values()]}function p2(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 Kx(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function to(e={},t={}){let n=new Date().toISOString(),r=or(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=o2.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=ir(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await Xe(l,4,async y=>({row:y,result:await Mi(`opensea-${y.chain}`,()=>Bo({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:S}of u)if(S.ok){let E=S.data.nfts.map(v=>({...v,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...E),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:S.data.complete?"ok":"partial",count:E.length,complete:S.data.complete,next:S.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:S.error,source:"opensea"});if(!r.evm)for(let y of i.filter(S=>S.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 Mi("opensea-solana",()=>Bo({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let S=y.data.nfts.map(E=>({...E,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...S),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:S.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 Mi("satflow-wallet-contents",()=>as({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},ir(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let S=a2(y.data.contents).map(v=>s2(v,r.bitcoin));s.push(...S);let E=S.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:E?"ok":"partial",count:S.length,complete:E,source:"satflow"})}else{let S=await Mi("bitcoin-meta-inscriptions",()=>Lr({address:r.bitcoin},ir(t,"bitcoinMeta")),t.timeoutMs??35e3),E=S.ok&&S.data?.ok&&Array.isArray(S.data.inscriptions)?S.data.inscriptions:[];s.push(...E.map(v=>c2(v,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:E.length?"partial":"unavailable",count:E.length,complete:!1,source:E.length?"bitcoin-meta":"satflow",error:E.length?"Satflow unavailable; fallback has IDs only":y.error})}}else(!o||o.has("bitcoin"))&&a.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let y of[...new Set([r.evm,r.solana].filter(Boolean))]){let S=await Mi(`opensea-pnl-${y}`,()=>Pa({address:y},c),t.timeoutMs??35e3);d.push(S.ok?{status:"ok",...S.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:S.error})}let p=l2(e.costBasis),m=d2(s).map(y=>u2(y,p)).map(y=>zx(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,S)=>y+Number(S.estimatedValueUsd),0)*100)/100,x=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:i2,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:x,complete:x===0&&w.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:p2(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 Wx(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 m2(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 Yx(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 $a(e,ir(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=Wx(e.expiry??e.endTime,"Solana NFT listing expiry");return Ns({...e,expiry:r},ir(t,"magiceden"))}if(n==="satflow"){let r=Wx(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return ss({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:m2(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},ir(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function up(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 dp(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function ic(e){return String(e??"").trim().toLowerCase()}function f2(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=ic(t),i=ic(n);return!o||!i?!1:r.some(a=>ic(a.trait_type??a.traitType??a.type)===o&&ic(a.value??a.trait_value??a.traitValue)===i)}function h2(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function Vx(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 pp(e){return Math.round(Number(e)*1e6)/1e6}function _n(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 Jx(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return _n(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(v=>e[v]==null||e[v]==="");if(o.length)return _n(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=up(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=up(e.minTraitVolumeEth,"minTraitVolumeEth"),u=up(e.traitFloorEth,"traitFloorEth"),d=dp(e.collectionFloorEth),p=dp(e.maxListingAgeMs),m=dp(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return _n(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return _n(e,"invalid-min-trait-sales");if(u<=0)return _n(e,"trait-floor-unavailable");let f=v=>f2(v,e.traitType,e.traitValue)&&h2(v,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(v=>{if(!m)return!0;let A=Vx(v,["timestamp","soldAt","createdAt"]);return A!=null&&i-A<=m}),g=pp(h.reduce((v,A)=>v+Number(A.priceEth??A.price??0),0)),b={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return _n(e,"trait-liquidity-insufficient",{traitSales:b});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(v=>{let A=Number(v.priceEth??v.price);if(!Number.isFinite(A)||A<=0||A>a)return!1;if(!p)return!0;let P=Vx(v,["listedAt","createdAt","timestamp"]);return P!=null&&i-P<=p}).map(v=>{let A=Number(v.priceEth??v.price),P=Math.round((u-A)/u*1e4);return{...v,priceEth:A,discountBps:P}}).filter(v=>v.discountBps>=s).sort((v,A)=>v.priceEth-A.priceEth||A.discountBps-v.discountBps),w={traitSales:b,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:x.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return _n(e,"invalid-min-trait-listings",w);if(x.length<y)return _n(e,"trait-listing-depth-insufficient",w);let S=x[0],E=B({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:pp(S.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:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:pp(S.priceEth),discountBps:S.discountBps},evidence:w,prepareIntent:E}}async function Xx(e={},t={}){let n=await to({...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 Qx(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await to({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await jx({...e,items:n},ir(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var Zx=10*1024*1024,nv=1e3;function Pn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ro(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function ev(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 rv(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 E2(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function ov(e={}){return`portfolio_${v2("sha256").update(E2(e)).digest("hex").slice(0,20)}`}function iv(e={}){if(e.historyFile)return no.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return no.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||no.join(k2.homedir(),".hermes");return no.join(no.resolve(n),"state","oracle","portfolio-history.jsonl")}function A2(e){let t=Pn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?ro(t):null}function I2(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Pn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?ro(t):null}function _2(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=Pn(c.usdValue);return l==null?s:s+l},0),i=Pn(n.perps?.accountValueUsd),a=ro(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>Pn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=Pn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:ro(r)})}return t}function P2(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 T2(e,t){let n=iv(t),r=`${JSON.stringify(e)}
|
|
147
|
-
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await w2(no.dirname(n),{recursive:!0,mode:448});let o=ac.O_APPEND|ac.O_CREAT|ac.O_WRONLY|(ac.O_NOFOLLOW||0),i=await b2(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await y2(n,384),n}async function av(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||oc,o=t.nftInventoryImpl||to,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(S=>({status:"unavailable",error:String(S?.message||S).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=A2(s),u=I2(c),d=[l,u].filter(S=>S!=null),p=d.length?ro(d.reduce((S,E)=>S+E,0)):null,m=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=s?.addresses||or(e,t.env||process.env),b=ov(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let w={schemaVersion:1,id:`snapshot_${S2()}`,portfolioId:b,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(S=>[S,!!g?.[S]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:m,label:m?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(s?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(s?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:_2(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:P2(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await T2(w,t),snapshot:w,balance:s,nfts:c}}async function C2(e){let t=iv(e);try{let n=await x2(t);if(n.byteLength>Zx)throw new Error(`portfolio history exceeds ${Zx} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
148
|
-
`))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function N2(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=or(e,t.env||process.env);return Object.values(n).some(Boolean)?ov(n):null}async function mp(e={},t={}){let n=rv(e.limit,100,1,nv,"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=ev(e.since,"portfolio history since"),i=ev(e.until,"portfolio history until"),a=N2(e,t),s=await C2(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=>Pn(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 tv(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function sc(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function O2(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 R2(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 S=y/4,E=100+S*470,v=u-S*(u-l);return`<line x1="100" y1="${E}" x2="1140" y2="${E}" stroke="#26313c" stroke-width="1"/><text x="86" y="${E+5}" text-anchor="end" fill="#8795a5" font-size="15">${tv(v)}</text>`}).join(""),h=e.map((w,y)=>`<circle cx="${d(y)}" cy="${p(w.value)}" r="5" fill="#b8f0ff"><title>${sc(w.recordedAt)}: ${tv(w.value)}</title></circle>`).join(""),g=sc(e[0].recordedAt.slice(0,10)),b=sc(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 ${sc(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 sv(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=rv(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await mp({...e,order:"asc",limit:e.limit??nv},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:Pn(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=O2(o,n),a=i[0].value,s=i.at(-1).value,c=ro(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=R2(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"}}}Ee();var L2=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"}}),B2=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),M2=`0x${"0".repeat(64)}`;function F2(e){return!e||e==="0x"||e===M2}async function ar(e={},t={}){let n=t.rpcCall||W,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(L2))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of B2)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!F2(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 cv(e={}){let t=Date.now();try{let n=await ar({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"}}}We();var q2=/^0x[0-9a-fA-F]{40}$/,lv=4663;function cc(e,t){let n=String(e||"").trim();if(!q2.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function fp(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 Fi(e,t){return e==null||e===""?null:fp(e,t)}function D2({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=cc(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=fp(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=Fi(u.gasLimit??c.gasLimit,"gasLimit"),h=Fi(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)),x=ul({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:b,secret:l.routeAttestationSecret}),w=Ae(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),y={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:w.selectedBps,expiresAtMs:g+b},S=Fi(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return S&&(y.maxPriorityFeePerGas=S),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||S)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=Fi(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=Fi(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 H2(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}qo();let n=kr(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function j2({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!==Z.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==Z.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==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 uv(e={},t={}){let n=Number(e.chainId??lv);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=cc(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?cc(e.tokenIn,"tokenIn"):null,i=e.recipient?cc(e.recipient,"recipient"):null,a=e.amountIn==null?null:fp(e.amountIn,"amountIn"),s=H2(n,t.scanner),c=t.scanContractRisk||ar,[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=j2({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),b=null,x=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{x=D2({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:!!x,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:s.key,name:s.name,nativeCurrency:s.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!b,unsignedTx:b,localSignerEnvelope:x,localSignerBlockedReason:w,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function dv(){qo();let e=Ba();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:lv,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"}}Ee();Ee();var W2=5,hp=[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 sr(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 V2(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 lc(e={},t={}){let n=t.rpcCall||W,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=sr(e.maxFeePerGasWei,"maxFeePerGasWei"),a=sr(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=sr(e.gasLimit,"gasLimit"),c=sr(e.maxTotalGasWei,"maxTotalGasWei")}catch(v){return{status:"error",viable:!1,error:v.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${W2.toString(16)}`,"pending",hp],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(v){return{status:"unavailable",viable:!1,error:v?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=sr(u?.baseFeePerGas,"baseFeePerGas")??sr(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(v=>{try{return sr(v?.[o.percentile],"reward")}catch{return null}}).filter(v=>v!=null&&v>0n),f=V2(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,x=[];a!=null&&g>a&&(x.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(x.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&&x.push({field:"totalGas",wanted:w.toString(),capped:c.toString()});let y=f==null||g>=f,S=c==null||w==null||w<=c,E=y&&S;return y||h.push(`tip cap ${g} is below the observed ${hp[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),S||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:E,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:hp[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:w==null?null:w.toString(),clamps:x,notes:h}}Ee();var K2="08c379a0",Y2="4e487b71",J2=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 X2(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===K2)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===Y2){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:J2[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 Q2(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 Z2(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 e$(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 Ui(e={},t={}){let n=t.rpcCall||W,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=e$(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=Q2(f);if(!Z2(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=X2(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 mv(e={}){let t=Date.now();try{let n=await Ui({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 n$=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 r$(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 o$(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 fv(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=o$(t);else if(o==="quantity")r+=r$(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function i$({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 uc(e={},t={}){let n=t.rpcCall||W,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=n$.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 hv(e={}){let t=Date.now();try{let n=await uc({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 gp(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 uc({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 ar({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Ui({chainId:r,tx:{from:o,to:n,data:fv(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 lc({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=fv(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=_l({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,x=null;try{b=i$({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(w){x=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:x,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 nL}from"node:crypto";import{createHash as s$}from"node:crypto";var c$=1,l$=8,Ue=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},u$=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),d$=new Set(["family","id"]),p$=new Set(["id","startsAt","endsAt","eligibility"]),m$=new Set(["kind","proofFormat","proofDigest"]),f$=new Set(["amount","unit"]),h$=new Set(["value","unit"]);function oo(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Ue(`${t} must be a plain object`);return e}function io(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Ue(`${n} has unknown field ${r}`,"unknown-field")}function wt(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Ue(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function g$(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Ue(`${t} must be a positive safe integer`);return e}function yp(e,t){if(e=oo(e,t),io(e,f$,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Ue(`${t} requires amount and unit`,"ambiguous-unit");let n=wt(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Ue(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:wt(e.unit,`${t}.unit`)}}function wp(e,t){if(e=oo(e,t),io(e,h$,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Ue(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function y$(e,t){e=oo(e,t),io(e,m$,t);let n=wt(e.kind,`${t}.kind`),r=wt(e.proofFormat,`${t}.proofFormat`),o=wt(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Ue(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function w$(e,t){let n=`stages[${t}]`;e=oo(e,n),io(e,p$,n);let r=wp(e.startsAt,`${n}.startsAt`),o=wp(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Ue(`${n} must end after it starts`,"invalid-stage-range");return{id:wt(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:y$(e.eligibility,`${n}.eligibility`)}}function bp(e){if(e=oo(e,"input"),io(e,u$,"input"),e.version!==c$)throw new Ue("version must be 1");let t=oo(e.chain,"chain");io(t,d$,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>l$)throw new Ue("stages must contain 1 through 8 entries","stage-count");let r=n.map(w$).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 Ue("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 Ue("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Ue("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:wt(t.family,"chain.family"),id:wt(t.id,"chain.id")},marketplace:wt(e.marketplace,"marketplace"),mechanism:wt(e.mechanism,"mechanism"),collection:wt(e.collection,"collection"),recipient:wt(e.recipient,"recipient"),quantity:g$(e.quantity,"quantity"),stages:r,mintValueCap:yp(e.mintValueCap,"mintValueCap"),networkFeeCap:yp(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:yp(e.priorityFeeCap,"priorityFeeCap"),expiry:wp(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Ue("every stage must end no later than expiry","stage-after-expiry");return i}function b$(e){return JSON.stringify(bp(e))}function gv(e){return`sha256:${s$("sha256").update(b$(e),"utf8").digest("hex")}`}var xp=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),cr=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),vp=Object.freeze(Object.values(cr)),yv=new Set(vp),wv=Object.freeze(vp.slice(0,4)),x$=vp,v$=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Ve=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function dc(e,t){if(!Array.isArray(e)||e.length===0)throw new Ve(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Ve(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Ve(`${t} contains duplicates`);return[...n].sort()}function S$(e){if(!Array.isArray(e))throw new Ve("capabilities must be an array");let t=new Set(e);for(let n of t)if(!yv.has(n))throw new Ve(`unknown capability ${n}`,"unknown-capability");return x$.every(n=>t.has(n))?xp.AUTOMINT_READY:wv.every(n=>t.has(n))?xp.PREPARE_READY:xp.RESEARCH_ONLY}function Sp(e=[]){if(!Array.isArray(e))throw new Ve("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Ve("entry must be an object");for(let i of Object.keys(n))if(!v$.has(i))throw new Ve(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Ve("entry id must be an exact string");if(t.has(n.id))throw new Ve(`duplicate entry id ${n.id}`,"duplicate-entry");let r=dc(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(dc(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(dc(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(dc(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:S$(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=wv){let o=t.get(n);if(!o)throw new Ve(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!yv.has(i))throw new Ve(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Ve(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var B8=Sp([]);ne();import{getAddress as k$,Interface as kp,keccak256 as E$}from"ethers";var Tn=Object.freeze({manifold:new kp(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new kp(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new kp(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Ap=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"})}),q8=Object.freeze(Object.fromEntries(Object.entries(Ap).map(([e,t])=>[Tn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function ue(e){throw new Error(`evm-mint-launchpads: ${e}`)}function st(e,t){try{return k$(String(e||""))}catch{return ue(`invalid ${t}`)}}function Ge(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&ue(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return ue(`${t} must be an unsigned integer`)}}function Ep(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&ue(`invalid ${t}`),e.map(String)}function A$(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&ue("invalid chainId");let o=st(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&st(u.contract,"reviewed contract")===o);a||ue("unsupported contract or wrong chain");let s=st(a.mintTarget||a.contract,"reviewed mint target"),c=Tn[e].getFunction(Ap[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))&&ue("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function I$(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);ue("runtime bytecode verification required")}function _$(e,t){let n=e.stage;if(!n)return null;let r=Ge(n.startTime,"stage startTime"),o=Ge(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&ue("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function P$(e,t){let n=Ap[e];String(t).slice(0,10).toLowerCase()!==Tn[e].getFunction(n.signature).selector.toLowerCase()&&ue("unknown selector");let r;try{r=Tn[e].decodeFunctionData(n.signature,t)}catch{ue("invalid calldata layout")}let o;return e==="manifold"&&(o=Tn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Tn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Tn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&ue("calldata must be canonical with no suffix"),r}async function bv(e,t={},n={}){Tn[e]||ue("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=A$(e,t,n),s=st(t.recipient||t.minter,"recipient"),c=Ge(t.quantity,"quantity",{positive:!0}),l=Ge(t.priceWei,"priceWei"),u=Ge(t.maxValueWei,"maxValueWei"),d=Ge(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&ue("transaction chain mismatch"),st(p.to,"transaction target")!==i&&ue("transaction target mismatch");let m=await I$(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||E$(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&ue("runtime bytecode is not reviewed");let f=P$(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=_$(t,h),b,x,w,y=null,S=[];if(e==="manifold")st(f[0],"calldata contract")!==o&&ue("calldata contract mismatch"),(t.instanceId==null||Ge(f[1],"instanceId")!==Ge(t.instanceId,"instanceId"))&&ue("instance/stage mismatch"),(t.mintIndex==null||Ge(f[2],"mintIndex")!==Ge(t.mintIndex,"mintIndex"))&&ue("mint index/stage mismatch"),S=Ep([...f[3]]),b=st(f[4],"calldata recipient"),x=1n,w=l;else if(e==="zora")b=st(f[0],"calldata recipient"),x=BigInt(f[1]),w=l,t.comment!=null&&f[2]!==String(t.comment)&&ue("comment mismatch"),t.mintReferral!=null&&st(f[3],"mint referral")!==st(t.mintReferral,"expected mint referral")&&ue("mint referral mismatch");else{b=st(f[0],"calldata recipient"),x=BigInt(f[1]),w=BigInt(f[3]);let T=f[4];S=Ep([...T.proof]),y=BigInt(T.quantityLimitPerWallet),y<c&&ue("wallet allowance below quantity"),(BigInt(T.pricePerToken)!==l||st(T.currency,"allowlist currency")!==st(f[2],"currency"))&&ue("allowlist terms mismatch")}b!==s&&ue("recipient mismatch"),x!==c&&ue("quantity mismatch"),w!==l&&ue("price mismatch"),t.proof!=null&&JSON.stringify(S.map(T=>T.toLowerCase()))!==JSON.stringify(Ep(t.proof).map(T=>T.toLowerCase()))&&ue("proof mismatch");let E=Ge(p.value??0,"transaction value"),v=l*c;(E<v||E-v>d||E>u)&&ue("transaction value or fee cap exceeded");let A=p.gasLimit==null?null:Ge(p.gasLimit,"gasLimit"),P=p.maxFeePerGas==null?null:Ge(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(A==null||A>Ge(t.maxGasLimit,"maxGasLimit"))&&ue("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>Ge(t.maxFeePerGasWei,"maxFeePerGasWei"))&&ue("gas fee cap exceeded"),B({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:E.toString(),platformFeeWei:(E-v).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...y==null?{}:{walletAllowance:y.toString()},proof:S,transaction:{chainId:r,to:i,data:p.data,value:E.toString(),...A==null?{}:{gasLimit:A.toString()},...P==null?{}:{maxFeePerGas:P.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var T$="RESEARCH_ONLY";var C$="canonical serialized-message decoding and program-specific instruction validation are not implemented",pc=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),H8=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function N$(){throw new Error(`solana-mint: ${T$}; disabled until ${C$}`)}function xv(){N$()}ne();import{Address as O$,CompactSize as R$,NETWORK as $$,OutScript as Nv,Script as L$,TEST_NETWORK as vv,Transaction as B$,utils as M$}from"@scure/btc-signer";import{createHash as qi}from"node:crypto";var Sv="universal-ordinals-mint",kv="bitcoin-ordinals-mint-plan",F$=1800*1e3,U$=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Ev=new Set,q$=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function Pt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function Cn(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`ordinals mint: ${t} must be an integer`);let o=BigInt(r);if(n?o<=0n:o<0n)throw new Error(`ordinals mint: ${t} must be ${n?"positive":"non-negative"}`);return o}function Ip(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`ordinals mint: ${t} must be a non-negative number`);return n}function Ov(e,t){let n=Pt(e,t).toLowerCase();if(!/^(?:[0-9a-f]{2})+$/.test(n))throw new Error(`ordinals mint: ${t} must be non-empty canonical hex`);return n}function D$(e){return e==="bitcoin"||e==="mainnet"?$$:e==="regtest"?{...vv,bech32:"bcrt"}:vv}function Av(e,t){try{let n=Nv.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 H$(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function j$(e){let t=qi("sha256").update(e.unsignedTx).digest();return qi("sha256").update(t).digest().reverse().toString("hex")}function Iv(e,...t){let n=qi("sha256").update(e,"ascii").digest();return qi("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function z$(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=Iv("TapLeaf",Buffer.from([a]),Buffer.from(R$.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Iv("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=M$.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 _v(e,t){let n=Pt(e,t);try{let r=Buffer.from(n,"base64");if(!r.length||r.toString("base64")!==n||r.subarray(0,5).toString("hex")!=="70736274ff")throw new Error("bad PSBT encoding or magic");let o=B$.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(H$(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=Av(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)=>z$(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 Av(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:j$(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 W$(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 V$(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 G$=new Set([1,3]);function K$(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=V$(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!G$.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 Y$(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=L$.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(K$(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(qi("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||W$(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 Pv(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 J$(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 Rv(e,t="parentId"){let n=Pt(e,t).toLowerCase();if(!/^[0-9a-f]{64}i\d+$/.test(n))throw new Error(`ordinals mint: ${t} must be a canonical inscription id`);return n}function $v(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Pt(e.txid,`commitInputs[${t}].txid`).toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`ordinals mint: commitInputs[${t}].txid must be 64 hex`);let r=Number(e.vout);if(!Number.isSafeInteger(r)||r<0||r>4294967295)throw new Error(`ordinals mint: commitInputs[${t}].vout invalid`);let o=Cn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function X$(e,{recipient:t,parentId:n,postageSats:r}){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: revealOutputs required");let o=e.map((a,s)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${s} invalid`);return{role:Pt(a.role,`revealOutputs[${s}].role`),address:Pt(a.address,`revealOutputs[${s}].address`),valueSats:Cn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:Ov(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:Rv(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 Q$(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Pt(n?.role,`commitOutputs[${r}].role`),valueSats:Cn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:Ov(n?.scriptHex,`commitOutputs[${r}].scriptHex`)}));if(t.filter(n=>n.role==="reveal").length!==1)throw new Error("ordinals mint: exactly one commit reveal output required");return t}function Tv(e,t,n){if(e.length!==t.length||e.some((r,o)=>r.valueSats!==t[o].valueSats||r.scriptHex!==t[o].scriptHex))throw new Error(`ordinals mint: actual ${n} outputs do not match reviewed outputs`)}function Cv(e,t,n){try{return Buffer.from(Nv.encode(O$(D$(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 Z$(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)=>$v({...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 eL(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");J$(e);for(let C of["content","contentBytes","body","file","path","url","contentUrl"])if(e[C]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let C of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[C]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=Pt(e.network,"network").toLowerCase();if(!U$.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Pt(e.contentHash??e.contentSha256??e.sha256,"contentHash").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new Error("ordinals mint: contentHash must be a 32-byte SHA-256 hex digest");let o=Pt(e.contentType??e.mimeType,"contentType").toLowerCase();if(!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(o))throw new Error("ordinals mint: invalid contentType");let i=Rv(e.parentId??e.parentInscriptionId),a=Pt(e.recipient??e.destination,"recipient"),s=Cn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString();if(!Array.isArray(e.commitInputs)||e.commitInputs.length===0)throw new Error("ordinals mint: exact commitInputs required");let c=e.commitInputs.map($v);if(new Set(c.map(C=>C.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");Z$(e,c);let l=_v(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=_v(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=Q$(e.commitOutputs),p=X$(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((C,I)=>C.txid!==c[I].txid||C.vout!==c[I].vout||C.valueSats!==c[I].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Tv(l.outputs,d,"commit PSBT"),Tv(u.outputs,p,"reveal PSBT");let m=Cv(a,n,"recipient");if(p.find(C=>C.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[C,I]of p.entries())if(I.scriptHex!==Cv(I.address,n,`revealOutputs[${C}].address`))throw new Error(`ordinals mint: reveal output ${C} script does not pay its bound address`);let f=d.findIndex(C=>C.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(C=>C.txid===l.txid&&C.vout===f);if(h.length!==1||h[0].valueSats!==d[f].valueSats||h[0].scriptHex!==d[f].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");Y$(u,{contentHash:r,contentType:o,parentId:i});let g=Ip(e.commitFeeRateSatVb,"commitFeeRateSatVb"),b=Ip(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Ip(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||b>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let w=Cn(e.commitFeeSats,"commitFeeSats"),y=Cn(e.revealFeeSats,"revealFeeSats"),S=Cn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(w+y>S)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(C=>C.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let A=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:Cn(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(A.enabled){if(!Number.isSafeInteger(A.outputIndex)||A.outputIndex<0||p[A.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[A.outputIndex].valueSats!==A.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(C=>C.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let P=Number(t.nowMs??Date.now()),T=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(T)||T<=P||T-P>F$)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(Pv),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(Pv),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:b,maxRate:x,commitFee:w.toString(),revealFee:y.toString(),maxTotalFee:S.toString(),rbf:e.rbf,cpfp:A,expiresAt:T}}function tL(e={},t={}){let n=eL(e,t),r=n.commitInputs.find(s=>Ev.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:Sv,kind:kv,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...q$},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=B(i,{provider:Sv,kind:kv,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Ev.add(s.outpoint);return a}var Lv=tL;var rL=Object.freeze([cr.DISCOVERY,cr.ELIGIBILITY,cr.PREPARATION,cr.SIMULATION]),Bv=[["evm.manifold","evm",["manifold"],["mint","claim"],"evm","manifold"],["evm.zora","evm",["zora"],["mint"],"evm","zora"],["evm.thirdweb","evm",["thirdweb"],["mint","claim"],"evm","thirdweb"],["evm.opensea-seadrop","evm",["opensea"],["mint","seadrop"],"opensea",null],["solana.metaplex-core","solana",["metaplex"],["mint"],"solana",pc.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",pc.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",pc.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Mv=Object.freeze(Bv.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([cr.DISCOVERY]):rL,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),n9=Sp(Mv.map(({family:e,tier:t,enabled:n,...r})=>r)),Fv=new Map(Bv.map(e=>[e[0],e])),oL=new Set(["intent","adapterId","input"]),iL=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,mc=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function be(e,t,n){throw new mc(e,t,n?{cause:n}:{})}function z(e,t,n){String(e??"")!==String(t)&&be("intent-mismatch",`${n} does not match canonical intent`)}function Be(e,t,n){let r=e[t];return r.unit!==n&&be("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function Uv(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))iL.test(n)&&be("custody-refused",`${t}.${n} is outside the prepare-only boundary`),Uv(r,`${t}.${n}`)}function aL(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function sL(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&be("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||be("intent-mismatch","stageId does not match canonical intent"),z(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${nL("sha256").update(JSON.stringify(aL(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))&&be("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)&&be("expired-intent","canonical mint stage is not active at authoritative now"),o}function cL(e,t){let n=Fv.get(t);n||be("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))&&be("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function lL(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,Be(e,"mintValueCap","wei"),"mint-value cap"),z(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Be(e,"networkFeeCap","wei"),"network-fee cap"),z(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Be(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,Be(e,"mintValueCap","lamports"),"mint-value cap"),z(t.networkFeeCapLamports,Be(e,"networkFeeCap","lamports"),"network-fee cap"),z(t.priorityFeeCapLamports,Be(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,Be(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,Be(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,Be(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function uL(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==jn(e))&&be("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&be("custody-refused","leaf artifact is not strictly prepare-only")}function dL(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=Be(e,"mintValueCap","wei"),o=Be(e,"networkFeeCap","wei"),i=Be(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||be("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)&&be("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)&&be("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&&be("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function pL(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,Be(e,"mintValueCap","lamports"),"mint-value cap");let r=Be(e,"networkFeeCap","lamports"),o=Be(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)&&be("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function mL(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,Be(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,Be(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,Be(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 _p(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Mv})}async function qv(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:_p()}}async function Dv(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&be("invalid-request","request must be a plain object");for(let u of Object.keys(e))oL.has(u)||be("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&be("invalid-request","explicit adapterId is required; adapter inference is refused"),Fv.has(e.adapterId)||be("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&be("invalid-request","family-specific decoded input is required"),Uv(n);let r;try{r=bp(e.intent)}catch(u){be("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||be("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&be("expired-intent","canonical mint intent has expired");let i=cL(r,e.adapterId);i[1]==="solana"&&be("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=sL(r,n,r.chain.family,o);lL(r,n);let s;try{i[4]==="evm"?s=await bv(i[5],n,t):i[4]==="opensea"?s=await Ra(n,t):i[4]==="solana"?(z(n.programId,i[5],"selected Solana adapter program"),s=await xv(n,t)):s=await Lv(n,t)}catch(u){if(u instanceof mc)throw u;be("adapter-refused",u?.message||"adapter preparation failed",u)}uL(s);let c=i[4]==="bitcoin"?mL(r,n,s):i[4]==="solana"?pL(r,n,s):dL(r,n,s),l=Object.freeze({intentHash:gv(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 B({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 Pp="ROUTE_ONLY",Tp=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),jv=new Set(Object.values(Tp)),hL=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),gL=new Set(["amount","currency"]),yL=new Set(["value","unit"]),wL=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),bL=new Set(["provider","operations"]),fe=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 fe(`${t} must be a plain object`);return e}function Di(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new fe(`${n} has unknown field ${r}`,"unknown-field")}function Ie(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new fe(`${t} must be an exact non-empty string`);return e}function zv(e,t,{positive:n=!1}={}){if(e=Ie(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new fe(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function ao(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new fe(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>Ie(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new fe(`${t} contains duplicates`);return r}function Wv(e,t){return e=co(e,t),Di(e,gL,t),{amount:zv(e.amount,`${t}.amount`),currency:Ie(e.currency,`${t}.currency`)}}function Hv(e,t){if(!Array.isArray(e))throw new fe(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>Wv(n,`${t}[${r}]`))}function xL(e){if(e=co(e,"expiry"),Di(e,yL,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new fe("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function vL(e,t,n){Object.hasOwn(e,n)&&(t[n]=Ie(e[n],n))}function Vv(e){e=co(e,"intent"),Di(e,hL,"intent");let t=Ie(e.action,"action");if(!jv.has(t))throw new fe(`unsupported action ${t}`,"invalid-action");let n={action:t,family:Ie(e.family,"family"),network:Ie(e.network,"network"),standard:Ie(e.standard,"standard"),collection:Ie(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])vL(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 fe("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new fe("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new fe("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=Ie(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new fe("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=Ie(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=Ie(e.sender,"sender"))}else n.owner=Ie(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=Ie(e.recipient,"recipient")),n.quantity=zv(e.quantity,"quantity",{positive:!0}),n.marketplace=Ie(e.marketplace,"marketplace"),n.protocol=Ie(e.protocol,"protocol"),n.artifactKind=Ie(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new fe(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=Wv(e.price,"price"),n.expiry=xL(e.expiry),n.fees=Hv(e.fees,"fees"),n.royalties=Hv(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=Ie(e.listingId,"listingId")),n}function SL(e){e=co(e,"adapter"),Di(e,wL,"adapter");let t=ao(e.actions,"adapter.actions");for(let o of t)if(!jv.has(o))throw new fe(`adapter has unknown action ${o}`,"invalid-action");let n=co(e.surface,"adapter.surface");Di(n,bL,"adapter.surface");let r=co(n.operations,"adapter.surface.operations");for(let o of t)Ie(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new fe(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:Ie(e.id,"adapter.id"),family:Ie(e.family,"adapter.family"),networks:Object.freeze(ao(e.networks,"adapter.networks")),standards:Object.freeze(ao(e.standards,"adapter.standards")),marketplaces:Object.freeze(ao(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(ao(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(ao(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Pp,custody:"user",surface:Object.freeze({provider:Ie(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function kL(e=[]){if(!Array.isArray(e))throw new fe("entries must be an array");let t=e.map(SL);if(new Set(t.map(r=>r.id)).size!==t.length)throw new fe("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:Pp,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=Vv(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new fe("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new fe(`adapter lacks ${o.action}`,"unsupported-operation"):new fe("no exact adapter route","unsupported-operation")}})}var so=(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}}),Cp=kL([so("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"}),so("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"}),so("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"}),so("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),so("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),so("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function Gv(e,{access:t="public",feeProfile:n="default",registry:r=Cp,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new fe("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new fe("nowMs must be a non-negative safe integer","invalid-expiry");let i=Vv(e);if(i.expiry&&o>=i.expiry.value)throw new fe("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Pp,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:Ie(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 hc="universal-evm-nft-transfer",Kv="evm-nft-safe-transfer",AL=1800*1e3,IL=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),_L=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function Yv(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(_L.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);Yv(r,t)}}}function Np(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 lr(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 Hi=e=>e.toString(16).padStart(64,"0"),fc=e=>e.slice(2).padStart(64,"0");function PL(e,t,n,r,o){return e==="erc721"?`0x42842e0e${fc(t)}${fc(n)}${Hi(r)}`:`0xf242432a${fc(t)}${fc(n)}${Hi(r)}${Hi(o)}${Hi(160n)}${Hi(0n)}`}function TL(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(Yv(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=lr(e.chainId,"chainId",{positive:!0,safe:!0}),o=Np(e.sender??e.from,"sender"),i=Np(e.recipient??e.to,"recipient"),a=Np(e.contract??e.contractAddress??e.tokenContract,"contract"),s=lr(e.tokenId,"tokenId"),c=lr(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(lr(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=lr(e.gasLimit,"gasLimit",{positive:!0}),u=lr(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=lr(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)>AL)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=PL(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 Jv(e={},t={}){let n=TL(e,t),r={provider:hc,kind:Kv,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...IL},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 B(r,{provider:hc,kind:Kv,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}ne();var gc="universal-solana-nft-transfer",Xv="solana-verified-nft-transfer",Zv="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",ur=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Qv=new Set(Object.values(ur)),NL=new Set([ur.token,ur.token2022]),OL=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),RL=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function ae(e){throw new Error(`solana nft transfer: ${e}`)}function Tt(e,t){let n=String(e??"").trim();return n||ae(`${t} required`),n}function Ft(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||ae(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&ae(`${t} must be positive`),r}function Te(e,t,n){String(e??"")!==String(t)&&ae(`${n} mismatch; mutation refused`)}function eS(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))RL.test(r)&&o!=null&&o!==!1&&ae(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),eS(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ae(`${r} refused; adapter is prepare-only`)}}function $L(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&ae(`${t} must be decoded`),Array.isArray(e.accounts)||ae(`${t} decoded accounts required`),e.decoded}function LL(e,t,n){for(let r of e.accounts){let o=Tt(r.pubkey,"account pubkey");t.has(o)||ae(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&ae(`unexpected writable account ${o}`)}}function BL(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ae("request object required"),eS(e),(e.network!=="mainnet-beta"||e.genesisHash!==Zv)&&ae("mainnet genesis/network mismatch"),e.reviewed!==!0&&ae("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=Tt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&ae("standard must be metaplex or core");let n=Tt(e.mint??e.asset,"mint/asset"),r=Tt(e.collection,"collection");e.collectionVerified!==!0&&ae("verified collection required");let o=Tt(e.owner,"owner"),i=Tt(e.recipient,"recipient"),a=Ft(e.quantity,"quantity",{positive:!0}),s=Ft(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&ae("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&ae("Core quantity must be exactly 1");let c=Tt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==ur.core:!NL.has(c))&&ae("reviewed transfer program mismatch");let l=t==="metaplex"?Tt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?Tt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Te(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Ft(e.decimals??0,"decimals")):null,p=Ft(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Ft(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Ft(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&ae("priority fee exceeds reviewed cap");let g=Ft(e.networkFeeLamports,"networkFeeLamports"),b=Ft(e.networkFeeCapLamports,"networkFeeCapLamports");g>b&&ae("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&ae("transaction object required"),x.version!==0&&x.version!=="legacy"&&ae("transaction version must be 0 or legacy");let w=Tt(x.recentBlockhash,"recentBlockhash");Te(w,e.approvedBlockhash,"blockhash mutation after approval");let y=Ft(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),S=Ft(e.currentBlockHeight,"currentBlockHeight");S>y&&ae("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&ae("canonical instructions required");let E=new Set([o,n,l,u].filter(Boolean)),v=new Set([o,i,n,r,l,u,...Qv].filter(Boolean)),A=0,P=0,T=0,C=0;for(let[I,F]of x.instructions.entries()){let D=Tt(F.programId,`instructions[${I}].programId`);Qv.has(D)||ae(`unknown program ${D}`);let N=$L(F,`instructions[${I}]`);LL(F,v,E);let U=String(N.type??N.instruction??"").toLowerCase();D===ur.computeBudget?U.includes("limit")?(Te(N.units??N.computeUnitLimit,p,"compute-unit limit"),A++):U.includes("price")?(Te(N.microLamports??N.computeUnitPriceMicroLamports,m,"compute-unit price"),P++):ae("unsupported compute budget instruction"):D===ur.associatedToken?((t!=="metaplex"||U!=="createassociatedtokenaccountidempotent")&&ae("non-canonical associated token instruction"),Te(N.payer,o,"ATA payer"),Te(N.owner,i,"ATA recipient"),Te(N.mint,n,"ATA mint"),Te(N.tokenAccount,u,"recipient ATA"),Te(N.tokenProgramId,c,"ATA token program"),C++):t==="metaplex"&&D===c?(U!=="transferchecked"&&ae("only canonical transferChecked is allowed"),Te(N.mint,n,"mint"),Te(N.owner,o,"owner"),Te(N.recipient,i,"recipient"),Te(N.sourceTokenAccount,l,"source token account"),Te(N.destinationTokenAccount,u,"recipient ATA"),Te(N.amount,a,"quantity"),Te(N.decimals,d,"decimals"),T++):t==="core"&&D===ur.core?(U!=="transfer"&&ae("only canonical Core transfer is allowed"),Te(N.asset,n,"mint/asset"),Te(N.collection,r,"collection"),N.collectionVerified!==!0&&ae("verified collection required in Core instruction"),Te(N.owner,o,"owner"),Te(N.newOwner,i,"recipient"),Te(N.amount??1,1,"quantity"),T++):ae(`program ${D} is not valid for ${t} transfer`)}return(A!==1||P!==1)&&ae("exactly one compute-unit limit and price instruction required"),T!==1&&ae("exactly one canonical transfer instruction required"),t==="metaplex"&&C>1&&ae("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:S.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:b.toString(),transaction:x}}function tS(e={},t={}){let n=BL(e),r=Number(t.nowMs??Date.now()),o={provider:gc,kind:Xv,chain:"solana-mainnet-beta",genesisHash:Zv,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...OL},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 B(o,{provider:gc,kind:Xv,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}ne();var yc="universal-ordinals-transfer",nS="bitcoin-ordinals-transfer-plan",rS=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),FL=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function me(e){throw new Error(`ordinals transfer: ${e}`)}function On(e,t){let n=String(e??"").trim();return n||me(`${t} required`),n}function Nn(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||me(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&me(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&me(`${t} out of range`),o}function oS(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&me(`${t} must be positive`),n}function cS(e,t){let n=On(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||me(`${t} must be 64 hex`),n}function lS(e,t="inscriptionId"){let n=On(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||me(`${t} must be canonical`),n}function uS(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&&me(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),uS(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&me(`${r} bypass refused; adapter is prepare-only`)}function dS(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&me(`${t}.${n} arbitrary script refused; use a bound address`)}function iS(e,t){(!e||typeof e!="object"||Array.isArray(e))&&me(`${t} must be an object`),dS(e,t);let n=cS(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&me(`${t}.vout invalid`),{txid:n,vout:r,valueSats:Nn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:On(e.address,`${t}.address`),sequence:Number(Nn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function aS(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&me(`${t} must be an object`),dS(e,t),{role:On(e.role,`${t}.role`),address:On(e.address,`${t}.address`),valueSats:Nn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:lS(e.inscriptionId,`${t}.inscriptionId`)}}}function sS(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&me(`${n} mismatch; mutation refused`)}function UL(e={}){(!e||typeof e!="object"||Array.isArray(e))&&me("request object required"),uS(e);let t=On(e.network,"network").toLowerCase(),n=cS(e.genesisHash,"genesisHash");(!rS[t]||n!==rS[t])&&me("network/genesis mismatch");let r=lS(e.inscriptionId),o=iS(e.ownerInput,"ownerInput");On(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&me("current inscription outpoint mismatch");let i=On(e.destination,"destination"),a=Nn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:aS(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&me("exact change output invalid");let c=oS(e.feeRateSatVb,"feeRateSatVb"),l=oS(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&me("fee rate exceeds reviewed cap");let u=Nn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=Nn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&me("total fee exceeds reviewed cap");let p=Number(Nn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(Nn(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&me("RBF sequence refused"),o.sequence!==m&&me("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&me("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&me("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&me("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&me("exactly one PSBT input required; extra inputs refused"),sS(iS(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((w,y)=>aS(w,`psbt.outputs[${y}]`)):me("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};sS(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(w=>w.role==="inscription"&&w.inscriptionId===r).length!==1&&me("exactly one inscription-carrying output required");let x=h.reduce((w,y)=>w+BigInt(y.valueSats),0n);return BigInt(o.valueSats)!==x+u&&me("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 pS(e={},t={}){let n=UL(e);return B({provider:yc,kind:nS,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...FL},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:yc,kind:nS,env:t.env})}ys();Ee();function DL(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 mS(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),a=[];if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(i))return{status:"error",error:"chainId is required"};if(r!=="alert_only"&&r!=="execute")return{status:"ok",actionMode:"alert_only",requestedMode:r,downgraded:!0,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:null,notes:[`unrecognized actionMode ${JSON.stringify(r)} \u2014 defaulted to alert_only; only the exact string "execute" arms a trigger`]};let s=r;if(r==="execute")if(!Qu(t.env||process.env))s="alert_only",a.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=DL(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 fS(e={},t={}){let n=t.rpcCall||W,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"]}}ys();var jL=1440*60*1e3;function zL(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>jL&&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 hS="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",WL=4663,VL="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",gS="a22cb465",GL="a0712d68";function Op(e){return String(e||"").trim().toLowerCase()}function lo(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function KL(e){let t=lo(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${gS}${t.padStart(64,"0")}${"0".repeat(64)}`}function YL(e){return lo(e).includes(lo(hS))}function JL(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>lo(n?.data).startsWith(gS))}function XL(e={},t){let n=lo(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return Op(i[0])!==VL?!1:lo(i[2])===n})}function QL(e=1){return`0x${GL}${BigInt(e).toString(16).padStart(64,"0")}`}function yS(e={},t={}){let n=Op(e.contract),r=Op(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!==WL&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),YL(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"),JL(s)&&a.push("simulation sets approval / setApprovalForAll"),XL(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:QL(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:KL(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!ny(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=zL(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:hS.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"]}}ji();import{createHash as eB}from"node:crypto";import{getAddress as ES,isAddress as Mp}from"ethers";var bS="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",tB=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),nB=Object.freeze(["lifi"]),xS=/^0x[0-9a-fA-F]{64}$/,rB=/^\d+$/;function _e(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function vS(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&_e(t,"must be a positive chainId"),n}function bc(e,t){let n=String(e??"").trim();return(!rB.test(n)||BigInt(n)<=0n)&&_e(t,"must be a positive integer string"),n}function oB(e,t){return e==null||e===""?null:bc(e,t)}function SS(e,t){let n=String(e??"").trim();return n.toLowerCase()===bS.toLowerCase()?bS:(Mp(n)||_e(t,"must be an EVM address or native token sentinel"),ES(n))}function AS(e,t){let n=String(e??"").trim();return Mp(n)||_e(t,"must be an EVM address"),ES(n)}function iB(e,t){return e==null||e===""?null:AS(e,t)}function kS(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||_e(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function aB(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||_e(r,"must be a finite millisecond timestamp"),o<=t&&_e(r,"expired"),o>t+n&&_e(r,"exceeds maxDeadlineMs"),Math.floor(o)}function po(e){if(Array.isArray(e))return e.map(po);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=po(e[n]));return t}return e}function sB(e){return JSON.stringify(po(e))}function xc(e){return`0x${eB("sha256").update(sB(e)).digest("hex")}`}function IS(e,t){let n={...e};for(let r of t)delete n[r];return n}function cB(e){return xc(IS(e,["intentHash"]))}function lB(e){return xc(IS(e,["firmQuoteHash"]))}function Fp(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&_e("time","is invalid");let o=vS(e.fromChainId??e.fromChain,"fromChainId"),i=vS(e.toChainId??e.toChain,"toChainId"),s=o===i?tB:nB,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:SS(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:SS(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:bc(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:AS(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:aB(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:oB(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:kS(e.allowedSources,"allowedSources",s),allowedRouters:kS(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)?po(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&_e("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):xc({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=cB(c),Object.freeze(c)}function uB(e){return(!e||typeof e!="object"||Array.isArray(e))&&_e("artifact","required"),e.typedDataHash!=null&&!xS.test(String(e.typedDataHash))&&_e("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!xS.test(String(e.calldataHash))&&_e("artifact.calldataHash","must be bytes32"),e.to!=null&&!Mp(String(e.to))&&_e("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&_e("artifact.data","must be hex"),po(e)}function _S(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&_e("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||_e("quote expiry","required"),o<=r&&_e("quote","expired"),o>e.deadlineMs&&_e("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||_e("source","required"),e.allowedSources.includes(i)||_e("source","not allowed by intent");let a=bc(t.amountOut??t.buyAmount,"amountOut"),s=bc(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&_e("minBuyAmount","exceeds amountOut");let c=uB(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||_e("quotedAtMs","must be finite");let u=iB(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)?po(t.metadata):{}};return d.quoteId||(d.quoteId=xc({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=lB(d),Object.freeze(d)}ii();ji();si();li();zn();function zi(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function PS(e,t){return String(e?.[t]??"").trim()}function Wi(e,t){return Object.freeze({source:e,run:t})}function dB(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??$e,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return zi(e,"lifi")&&a.push(Wi("lifi",async()=>{let c=await(r.lifiQuote??bn)({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 pB(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(zi(e,"paraswap")&&a.push(Wi("paraswap",async()=>{let c=await(r.paraswapPrice??nn)({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}}})),zi(e,"0x")&&(PS(n,"ZEROX_API_KEY")||PS(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(Wi("0x",async()=>{let c=await(r.zeroxQuote??vn)({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}}})),zi(e,"cow")&&a.push(Wi("cow",async()=>{let c=await(r.cowQuote??Xt)({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}}})),zi(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(Wi("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 pB(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function mB(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function fB(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>mB(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(_S(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 hB(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 TS(e,t={}){let n=dB(e,t),{quotes:r,failed:o}=await fB(e,n,t),i=hB(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 CS(e={},t={}){return Fp(e,t)}async function NS(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Fp(e,t);return TS(n,t)}async function OS(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}j();var yB="https://app.across.to";function Up(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||yB).replace(/\/$/,"")}async function RS(e={}){try{let t=await k(`${Up(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 $S(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return k(`${Up(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function LS(e={},t={}){let n=new URLSearchParams;return e.originChainId&&n.set("originChainId",String(e.originChainId)),e.destinationChainId&&n.set("destinationChainId",String(e.destinationChainId)),e.token&&n.set("token",String(e.token)),e.amount&&n.set("amount",String(e.amount)),k(`${Up(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var bB="https://api.beefy.finance";function qp(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||bB).replace(/\/$/,"")}async function BS(e={}){try{let t=await k(`${qp(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 MS(e={},t={}){let n=await k(`${qp(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 FS(e={}){return k(`${qp(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}j();var vB="https://public-api.birdeye.so";function US(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||vB).replace(/\/$/,"")}async function qS(e={}){try{let t=await k(`${US(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 DS(e={},t={}){let n=String(e.sortBy||"v24hUSD"),r=String(e.sortType||"desc"),o=Math.max(0,Number(e.offset||0)),i=Math.min(50,Math.max(1,Number(e.limit||20)));return k(`${US(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var kB="https://api.celenium.io";function Dp(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||kB).replace(/\/$/,"")}async function HS(e={}){try{let t=await k(`${Dp(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 jS(e={}){return k(`${Dp(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function zS(e={},t={}){let n=Number(e.height);if(n&&(!Number.isFinite(n)||n<1))throw new Error("celestia-da: height must be positive");let r=n?`/v1/block/${n}`:"/v1/block";return k(`${Dp(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var AB="https://api.mainnet-beta.solana.com";function IB(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||AB).replace(/\/$/,"")}async function vc(e,t,n={}){let r=IB(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 WS(e={}){try{let t=await vc("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 VS(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 vc("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function GS(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)),vc("searchAssets",o,t)}async function KS(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return vc("getAssetProof",{id:n},t)}j();var PB="https://api.l2beat.com";function Hp(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||PB).replace(/\/$/,"")}async function YS(e={}){try{let t=await k(`${Hp(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 JS(e={},t={}){let n=await k(`${Hp(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 XS(e={},t={}){return k(`${Hp(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var CB="https://api.spark.fi";function jp(e={}){return(e.baseUrl||process.env.SPARK_API_URL||CB).replace(/\/$/,"")}async function QS(e={}){try{return{ok:(await k(`${jp(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 ZS(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?k(`${jp(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):k(`${jp(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var OB="https://api.symbiotic.fi";function zp(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||OB).replace(/\/$/,"")}async function ek(e={}){try{let t=await k(`${zp(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 tk(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await k(`${zp(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 nk(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return k(`${zp(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var $B="https://staking-api.polygon.technology/api/v2",LB=18,BB=200,MB=50,FB=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Vp(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||$B).replace(/\/$/,"")}function UB(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 qB(e,t=MB){let n=Number(e??t);return Number.isFinite(n)?Math.min(BB,Math.max(1,Math.trunc(n))):t}function Wp(e){let t=Number(e);return Number.isFinite(t)?t/10**LB:null}async function Gp(e,t={}){let n=await k(`${Vp(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 rk(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:Wp(e.totalStaked),selfStakePolApprox:Wp(e.selfStake),delegatedStakePolApprox:Wp(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function ok(e={},t={}){let n=await Gp("/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=FB.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=qB(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(rk)}}async function ik(e={},t={}){let n=UB(e.id??e.validatorId,"id"),o=(await Gp(`/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:{...rk(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 ak(e={}){try{let t=await Gp("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Vp(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Vp(e),error:String(t?.message||t),exec:!1}}}j();var HB="https://api.v3.aave.com/graphql",M9=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),jB=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||HB;async function Sc(e,t,n={}){let r=await k(jB(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 zB=`query Markets($request: MarketsRequest!) {
|
|
145
|
+
- `)}`);let o=e.capabilities||{},i=ss.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:ss.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of ss)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 xu=new Map;function z0(e){let t=lT(e);return xu.set(t.chainId,t),t}function Ur(e){return xu.get(Number(e))||null}function cs(){return[...xu.values()]}_e();var ku={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},yt=e=>BigInt(e).toString(16).padStart(64,"0"),oi=e=>e.slice(2).toLowerCase().padStart(64,"0");function uT(e,t){return`0x${ku.getAmountsOut}`+yt(e)+yt(64)+yt(t.length)+t.map(oi).join("")}function dT(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 Su(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var vu=100;function pT(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 V0(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await V(t,"eth_call",[{to:o,data:uT(i,a)},"latest"],s);return dT(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=Su(c.scanner);if(!l)return{chainId:t,evidence:ne.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:ne.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:ne.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=Su(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:J.UNKNOWN,evidence:ne.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:ne.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:ne.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:ne.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:ne.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:ne.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=Su(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!==ne.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=pT(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)),x=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,w=x?`0x${ku.swapExactETHForTokens}`+yt(g)+yt(128)+oi(s)+yt(b)+yt(f.length)+f.map(oi).join(""):`0x${ku.swapExactTokensForTokens}`+yt(a)+yt(g)+yt(160)+oi(s)+yt(b)+yt(f.length)+f.map(oi).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:w,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:vu,deadline:b.toString()},requires:x?[]:[{step:"approve",token:f[0],spender:m,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}_e();var mT=[100,500,3e3,1e4],W0={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},ar=e=>BigInt(e).toString(16).padStart(64,"0"),ii=e=>e.slice(2).toLowerCase().padStart(64,"0"),G0=/^0x[0-9a-fA-F]{40}$/,Iu=100;function fT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Iu)throw new Error(`slippageBps ${n} exceeds the ${Iu} 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 Eu(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function K0(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${W0.quoteExactInputSingle}`+ii(a)+ii(s)+ar(c)+ar(l)+ar(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 mT){let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=Eu(c.scanner,"quoter");if(!l)return{chainId:t,evidence:ne.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(!G0.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:ne.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:ne.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=Eu(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:ne.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:ne.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:ne.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 S=await o({quoter:l,tokenIn:i,tokenOut:k,amountIn:v.best.amountOut},c);if(S.best){let E=S.best.amountOut,_=Number(E*10000n/BigInt(a)),T=J.PASS,N="round trip vs dollar book completes with expected fee/impact loss";return _<5e3?(T=J.FAIL,N=`round trip vs dollar book returns only ${(_/100).toFixed(2)}% -- punitive tax or no real liquidity`):_<9e3&&(T=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:T,reason:N,amountIn:String(a),bought:v.best.amountOut.toString(),returned:E.toString(),retentionBps:_,buyFee:v.best.fee,sellFee:S.best.fee,evidence:ne.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:ne.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),S=v.best?await o({quoter:l,tokenIn:i,tokenOut:k,amountIn:v.best.amountOut},c):{best:null};if(v.best&&S.best){let E=S.best.amountOut,_=Number(E*10000n/BigInt(a)),T=J.PASS,N="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return _<5e3?(T=J.FAIL,N=`dollar-book round trip returns only ${(_/100).toFixed(2)}%`):_<9e3&&(T=J.CAUTION,N=`dollar-book round trip returns ${(_/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:T,reason:N,amountIn:String(a),bought:v.best.amountOut.toString(),returned:E.toString(),retentionBps:_,buyFee:v.best.fee,sellFee:S.best.fee,evidence:ne.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:J.FAIL,evidence:ne.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,x=Number(b*10000n/BigInt(a)),w=J.PASS,y="round trip completes with expected fee/impact loss";return x<5e3?(w=J.FAIL,y=`round trip returns only ${(x/100).toFixed(2)}% -- punitive tax or no real liquidity`):x<9e3&&(w=J.CAUTION,y=`round trip returns ${(x/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:w,reason:y,amountIn:String(a),bought:h.best.amountOut.toString(),returned:b.toString(),retentionBps:x,buyFee:h.best.fee,sellFee:g.best.fee,evidence:ne.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=Eu(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(!G0.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!==ne.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=fT(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(d.useNative||m.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),b=`0x${W0.exactInputSingle}`+ii(i)+ii(a)+ar(f)+ii(c)+ar(s)+ar(h)+ar(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:Iu,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."}}}}jl();var ls={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Y0(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function J0(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 hT(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 jo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:ne.LIVE}},async nativeBalance(r,o={}){let i=await Zn(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:ne.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await zo({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:ne.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:ne.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,ls.decimals,o).catch(()=>null),n(r,ls.symbol,o).catch(()=>null),n(r,ls.name,o).catch(()=>null),n(r,ls.totalSupply,o).catch(()=>null)]),l=Y0(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:J0(a?.result??a),name:J0(s?.result??s),totalSupply:(Y0(c?.result??c)??null)?.toString()??null,evidence:u?ne.LIVE:ne.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:ne.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await er(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=Hl(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:Kh(r,l),evidence:l.length?ne.LIVE:ne.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:ne.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:ne.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!==ne.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===ne.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 X0(e){let n={...hT(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,K0({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,V0({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 qr=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 ai(){return qr.map(e=>z0(X0(e)))}var si=new Map,gT=Object.keys(Fe).map(Number),yT=Object.keys(lt).map(Number),wT=qr.map(e=>e.chainId),bT=[...new Set(Object.values(ts))],Au=new Set,Q0=!1;function R(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(Q0&&Au.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return si.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),si.get(t)}function ci(e){return si.get(e)||null}function us({venue:e,op:t}={}){let n=[...si.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function xT(){Au.clear();for(let e of si.keys())Au.add(e);Q0=!0}R({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"});R({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."});R({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."});R({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."});R({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"});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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."]])R({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});R({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."});R({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:wT,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:qr.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."});R({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)"});R({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)"});R({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"});R({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."});R({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."});R({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"});R({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."});R({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."});R({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."});R({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."});R({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."});R({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"});R({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)"});R({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});R({id:"uniswap-v3",venue:"dex",chainIds:gT,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"});R({id:"uniswap-v4",venue:"dex",chainIds:yT,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."});R({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."});R({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."});R({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)"});R({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)"});R({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)"});R({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});R({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)"});R({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});R({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)"});R({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)"});R({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"});R({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"});R({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"});R({id:"opensea-nft",venue:"nft",chainIds:bT,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"});R({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."});R({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."});R({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."});R({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity"],execution:"prepare",baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 agent identity registration and inspection using an exact configured registry; the connected wallet signs and pays network gas"});R({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"});R({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"});R({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"});R({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"});R({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"});R({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)"});R({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"});R({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)"});R({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"});R({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"});R({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."});R({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."});xT();R({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});R({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."});R({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."});R({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."});R({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."});R({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)."});R({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."});R({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."});R({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."});R({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."});R({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."});R({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"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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."});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});R({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)"});j();pt();pt();var IT=/^0x[0-9a-fA-F]{40}$/,ui="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function _u(e,t){let n=String(e||"").trim();if(!IT.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function rg(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function og(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 AT(e){return[...e].sort((t,n)=>(rg(n.tvl)??-1)-(rg(t.tvl)??-1))}function Pu(e){return e.hlInfo||be}function Tu(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Nu(e={},t={}){let n=await Pu(t)({type:"vaultSummaries"},t),r=AT((Array.isArray(n)?n:[]).map(og));return Tu({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function hs(e={},t={}){let r={type:"vaultDetails",vaultAddress:_u(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=_u(e.user,"user"));let o=await Pu(t)(r,t);return Tu({provider:"hl-vaults",vault:og(o||{}),raw:o})}async function Cu(e={},t={}){let n=_u(e.user||e.address,"user"),r=await Pu(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 Tu({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Ou(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return hs({...e,vaultAddress:ui},t);if(n==="summaries")return Nu(e,t);if(n==="details")return hs(e,t);if(n==="mine")return Cu(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function ig(e={}){try{let t=await Ou({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ui&&!!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 PT}from"ethers";var Ru=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"}),Lu=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),TT=PT.defaultAbiCoder();function di(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 pi(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 sr(e,t){return e.length?TT.encode(e,t):"0x"}function en(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 NT(e,t=0){let n=en(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function xn(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Ru});let r=await V(Ru,"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 Sn(e){return{provider:"hl-precompiles",chainId:Ru,...Lu,...e}}async function gs(e={}){let t=await xn(He.l1BlockNumber,"0x",e);return Sn({op:"l1BlockNumber",precompile:He.l1BlockNumber,l1BlockNumber:en(t).toString(),raw:t})}async function $u(e={},t={}){let n=pi(e.index??e.assetId??0,"index",32),r=await xn(He.markPx,sr(["uint32"],[n]),t);return Sn({op:"markPx",precompile:He.markPx,index:n,markPx:en(r).toString(),raw:r})}async function Bu(e={},t={}){let n=pi(e.index??e.assetId??0,"index",32),r=await xn(He.oraclePx,sr(["uint32"],[n]),t);return Sn({op:"oraclePx",precompile:He.oraclePx,index:n,oraclePx:en(r).toString(),raw:r})}async function Mu(e={},t={}){let n=pi(e.index??e.assetId??0,"index",32),r=await xn(He.spotPx,sr(["uint32"],[n]),t);return Sn({op:"spotPx",precompile:He.spotPx,index:n,spotPx:en(r).toString(),raw:r})}async function Fu(e={},t={}){let n=di(e.user,"user"),r=pi(e.perp??e.assetId??0,"perp",16),o=await xn(He.position,sr(["address","uint16"],[n,r]),t);return Sn({op:"position",precompile:He.position,user:n,perp:r,szi:NT(o,0),raw:o})}async function Uu(e={},t={}){let n=di(e.user,"user"),r=pi(e.token??0,"token",64),o=await xn(He.spotBalance,sr(["address","uint64"],[n,r]),t);return Sn({op:"spotBalance",precompile:He.spotBalance,user:n,token:r,total:en(o,0).toString(),hold:en(o,1).toString(),raw:o})}async function qu(e={},t={}){let n=di(e.user,"user"),r=di(e.vaultAddress??e.vault??ui,"vault"),o=await xn(He.vaultEquity,sr(["address","address"],[n,r]),t);return Sn({op:"vaultEquity",precompile:He.vaultEquity,user:n,vaultAddress:r,hlp:r===ui,equity:en(o,0).toString(),raw:o})}async function Du(e={},t={}){let n=di(e.user,"user"),r=await xn(He.withdrawable,sr(["address"],[n]),t);return Sn({op:"withdrawable",precompile:He.withdrawable,user:n,withdrawable:en(r).toString(),raw:r})}async function ag(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return gs(t);if(n==="markPx")return $u(e,t);if(n==="oraclePx")return Bu(e,t);if(n==="spotPx")return Mu(e,t);if(n==="position")return Fu(e,t);if(n==="spotBalance")return Uu(e,t);if(n==="vaultEquity"||n==="hlp")return qu(e,t);if(n==="withdrawable")return Du(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function sg(e={}){try{let t=await gs(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Lu,l1BlockNumber:t.l1BlockNumber,precompiles:He}}catch(t){return{ok:!1,provider:"hl-precompiles",...Lu,error:String(t?.message||t).slice(0,160)}}}pt();ie();function cg(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function ws(e={},t,n){let r=String(t||""),o=cg(e);if(o){let a=mi(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=mi(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function bs(e={},t=[],n){let r=cg(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(mi(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&mi(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(mi(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Hu=Number.MAX_SAFE_INTEGER,ys=String(Hu);function mi(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Hu?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>ys.length||t.length===ys.length&&t>ys||t===ys&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Hu?r:null}function Ng(){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 nn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function Cg(e){let t=nn(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function SN(e,t,n=4){let r=nn(e),o=nn(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("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 Og(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=nn(a.funding),l=nn(a.markPx??a.oraclePx),u=nn(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:nn(a.oraclePx),openInterest:u,fundingAprPct:Cg(c)})}return r}function Rg(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=nn(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=Cg(n),o=n>0,i={coin:e.coin,notionalUsd:nn(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?SN(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 sd(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await wt(t),i=Og(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 cd(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 wt(t),i=Og(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return Rg(i,r)}async function ld(e={},t={}){$g(e,t,"hl-delta-neutral");let n=Bg(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await cd(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=ws(e,r.coin,"hl-delta-neutral");if(!Lg.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(()=>(Is(),ad)),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 Lg=/^0x[0-9a-fA-F]{40}$/;function $g(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 kN(e,t,n){$g(e,t,n)}function vN(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=Bg(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"&&bs(e,n,"hl-delta-neutral"),t==="live"&&!Lg.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 Bg(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 Mg(e={},t={}){kN(e,t,"hl-delta-neutral");let n=vN(e),r=await sd({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=Rg(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 ld({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();ie();zr();var IN=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),xi=14,Fg=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Kr(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function ud(e){let t=String(e||"").replace(/\/$/,"");if(!IN.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function Ug(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=Fg(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=ud(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(cr(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(cr(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Kr(n.orderType,0,"orderType"),Kr(n.timeInForce,1,"timeInForce"),Kr(n.reduceOnly,0,"reduceOnly"),Kr(n.triggerPrice,0,"triggerPrice"),Kr(n.orderExpiry,-1,"orderExpiry");let c=Fg(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=xt(n.baseAmount,"lighter: baseAmount"),d=xt(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,x=Be(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(b!==x)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 Kr(n.txType,xi,"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 AN(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 qg(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=ud(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:AN(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??xi,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return Ug(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var Hg="https://mainnet.zklighter.elliot.ai",jg="https://testnet.zklighter.elliot.ai";function _N(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?jg:Hg}function zg(){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 An(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function PN(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){let t=An(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function TN(e,t,n=4){let r=An(e),o=An(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 Dg(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Wg(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=Dg(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=Dg(a.market_id);if(s==null)continue;let c=o.get(s),l=An(c?.mark_price??c?.index_price),u=An(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:An(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:Vg(u)})}return i}function Gg(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=An(e.funding);if(n==null)throw new Error("lighter: funding required");let r=Vg(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:An(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?TN(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 Kg(e={}){let t=_N(e),n=e.fetchImpl,r=await I(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await I(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function dd(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Kg(t),i=Wg(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 pd(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 Kg(t),a=Wg(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return Gg(a,r)}async function md(e={},t={}){Jg(e,t,"lighter");let n=Xg(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 pd(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=ws(e,o.coin,"lighter");if(!Yg.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=PN(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:xi,submitTo:`${s?jg:Hg}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=qg(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 Yg=/^0x[0-9a-fA-F]{40}$/;function Jg(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 NN(e,t,n){Jg(e,t,n)}function CN(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=Xg(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"&&bs(e,n,"lighter"),t==="live"&&!Yg.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 Xg(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 Qg(e={},t={}){NN(e,t,"lighter");let n=CN(e),r=await dd({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=Gg(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 md({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 RN="https://clob.polymarket.com",LN="https://gamma-api.polymarket.com";function Si(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||RN).replace(/\/$/,"")}function Zg(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||LN).replace(/\/$/,"")}async function fd(e={}){return I(`${Si(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function ey(e={}){let t=await fd(e);return{ok:t!=null&&t!=="",time:t}}async function ty({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 I(`${Zg(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function ny(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${Si(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ry(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${Si(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function oy(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return I(`${Si(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function iy(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 I(`${Si(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function ay({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 I(`${Zg(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}_e();j();import{createHash as sy}from"node:crypto";var Yr="mainnet-beta",BN="https://api.mainnet-beta.solana.com",hd="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function MN(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||BN).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 FN(e,t){return t?[...e,{commitment:t}]:e}async function ki(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 I(MN(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 gd(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await ki("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Yr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function cy(e={}){try{let[t,n]=await Promise.all([ki("getHealth",[],e),gd({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Yr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Yr,error:String(t?.message||t),exec:!1}}}async function As(e={},t={}){let n=ve(e.address||e.owner,"address"),r=await ki("getBalance",FN([n],e.commitment),t);return{provider:"solana-rpc",cluster:Yr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function UN(e={}){let t=e.account?.data?.parsed?.info||{},n=t.tokenAmount||{};return{pubkey:e.pubkey,mint:t.mint||null,owner:t.owner||null,amount:String(n.amount??"0"),decimals:n.decimals??null,uiAmount:n.uiAmount??null,uiAmountString:n.uiAmountString??null,raw:e}}async function vi(e={},t={}){let n=ve(e.owner||e.address,"owner"),r=e.mint?{mint:ve(e.mint,"mint")}:{programId:ve(e.programId||hd,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await ki("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(UN):[];return{provider:"solana-rpc",cluster:Yr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function qN(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 DN(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 HN(e){let t=Buffer.from(e,"base64");try{let n=DN(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return sy("sha256").update(t.subarray(r)).digest("hex")}catch{return sy("sha256").update(t).digest("hex")}}async function ly(e={},t={}){let n=qN(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await ki("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Yr,ok:i.err==null,transactionHash:HN(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 zN="mainnet",VN="https://mempool.space/api",WN="https://mempool.space/testnet/api";function Ht(e={}){return String(e.network||process.env.BTC_NETWORK||zN).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function wd(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Ht(e)==="testnet"?WN:VN}function yd(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 Tt(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 GN(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 bd(e,t={}){let n=`${wd(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 _s(e,t={}){let n=await bd(e,t);try{return JSON.parse(n)}catch{return n}}async function uy(e={}){try{let t=await bd("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:Ht(e),baseUrl:yd(wd(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:Ht(e),baseUrl:yd(wd(e)),error:yd(t?.message||t),exec:!1}}}async function dy(e={}){let t=await bd("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:Ht(e),tipHeight:Number(t)}}async function py(e={}){try{let t=await _s("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:Ht(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:Ht(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ps(e={},t={}){let n=Tt(e.address||e.addr,"address"),r=await _s(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:Ht(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function my(e={},t={}){let n=Tt(e.address||e.addr,"address"),r=await _s(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:Ht(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function fy(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 _s(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:Ht(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function hy(e={},t={}){let n=GN(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:Ht(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}bn();var xd="https://ordinals.com";function Ts(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var YN=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function gy(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=Ts(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=YN.includes(o)&&(i==="https:"||a)}}catch{n=!1}return it({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Jr(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:gy(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=Ts(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:gy(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 Ns(e={},t={}){let n=Tt(e.address||e.addr,"address"),r=Ts(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 Jr(a,t),c=JN(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 JN(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 Xr(e={},t={}){let n=Tt(e.address||e.addr,"address"),r=Ts(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 Jr(s,t),l=XN(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 wy(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||xd,o=await Jr(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function by(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||xd,o=Number(e.page||0),i=await Jr(`${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 xy(e={},t={}){let n=t.ordinalsBase||xd,r=e.height??await Jr(`${n}/r/blockheight`,t),o=await Jr(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function XN(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}))}bn();ie();var ZN=["unsigned","notsigned","tosign","signable"],eC=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),tC=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Sd(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function nC(e){return ZN.some(t=>e.startsWith(t))||eC.has(e)}function rC(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Sd(t);return nC(n)?!1:tC.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function oC(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 kd(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=>kd(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(rC(c)){o.push(c);continue}o.push(...kd(l,t+1,n,r))}let a=Object.keys(e).map(Sd).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Sd(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),oC(e)&&o.push("v/r/s"),o}function rn(e,t){let n=kd(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 iC="https://api.satflow.com/v1";function Sy(e={}){return ut({provider:"satflow",defaultUrl:iC,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Cs(e={}){return Sy(e).baseUrl}function Ed(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function aC(e={}){return it({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Ed(e)},Sy(e).trusted)}async function _n(e,{method:t="GET",body:n,opts:r={}}={}){if(!Ed(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Cs(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:aC(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 ky(e={}){if(!!!Ed(e))return{ok:!1,provider:"satflow",baseUrl:Cs(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 _n("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Cs(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:Cs(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function vy(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 _n(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Ey(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 _n(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Iy(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 _n(`/item?${r}`,{opts:t})}}async function Os(e={},t={}){let n=Tt(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 _n(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function Ay(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 _n(`/orders/floor?${r}`,{opts:t})}}var sC=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function _y(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))sC.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var cC=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"]),lC=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function vd(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 uC(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=Tt(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=Tt(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 Py(e={},t={}){let n=_y(e,cC);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=vd(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await _n("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=vd(a)??vd(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`);rn("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=uC(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 Rs(e={},t={}){let n=_y(e,lC);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 _n("/intent/sell",{method:"POST",body:n,opts:t});return rn("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();ie();var $s="https://lite-api.jup.ag/swap/v1",Ad="So11111111111111111111111111111111111111112",Cy="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",pC=100,Ty=2e4;function Oy(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||$s).replace(/\/$/,"")}function Ei(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 Ry(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>pC)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function Ls(e,t){return e==null?t:!!e}function mC(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 fC(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 Ly(e){let t=Buffer.from(e,"base64"),n=fC(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 Id(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Ty}={}){let r=ve(e.inputMint,"inputMint"),o=ve(e.outputMint,"outputMint"),i=Ei(e.inAmount,"inAmount"),a=Ei(e.outAmount,"outAmount"),s=Ei(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Ry(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)||Ty,1e3),3e4)}}function hC({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Ad)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=Ly(n),a=Ei(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 gC=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),yC="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Ny(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=yC.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 $y(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(`${$s}/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])=>Ny(p)),c=[],l=a.filter(([p])=>!Ny(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${$s}/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,x]=m[g];h&&h.executable===!0&&gC.has(h.owner)?c.push({programId:b,label:x,owner:h.owner}):l.push({programId:b,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${$s}/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 By(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Bs({inputMint:Ad,outputMint:Cy,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 Bs(e={},t={}){let n=ve(e.inputMint||e.fromMint||Ad,"inputMint"),r=ve(e.outputMint||e.toMint||Cy,"outputMint"),o=Ei(e.amount||e.inAmount,"amount"),i=Ry(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${Oy(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 I(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Id({...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 wC(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function My(e={},t={}){let n=ve(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Id(e.quoteResponse,t)}:await Bs(e,t),o=r.quote,i=r.solanaGuard||Id(o,t);if(Ls(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await I(`${Oy(t)}/swap`,{method:"POST",body:wC({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:Ls(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:Ls(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:Ls(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=mC(a?.swapTransaction);Ly(s),rn("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=hC({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 xC="https://coins.llama.fi",SC="https://api.llama.fi",kC="https://yields.llama.fi",vC="https://stablecoins.llama.fi";function EC(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||xC).replace(/\/$/,"")}function Fy(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||SC).replace(/\/$/,"")}async function Nt(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return I(`${EC(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Uy(e={}){let n=(await Nt(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function _d(e={}){return I(`${Fy(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function qy(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||kC).replace(/\/$/,""),r=await I(`${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 Ms(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||vC).replace(/\/$/,""),r=e.includePrices!==!1;return I(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Dy(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 I(`${Fy(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Hy(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Nt(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}Ii();$r();nr();Mr();_e();Ye();ie();import{Interface as Gy,getAddress as Ai,isAddress as PC}from"ethers";var Nn={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},TC=[1,50,100,200,2e3],Vy=new Gy(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),NC=new Gy(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Ky="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Yy="0x0000000000000000000000000000000000000000";function Jy(e){let t=Number(e),n=Nn[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Nn).join(", ")})`);return{chainId:t,...n}}function Wy(e,t){let n=Nn[Number(t)];if(!e||e===Ky||e===Yy||/^eth$/i.test(String(e)))return Ai(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ai(n.weth);if(/^usdc$/i.test(r))return Ai(n.usdc);if(!PC(r))throw new Error(`invalid token address: ${e}`);return Ai(r)}async function Us(e={},t={}){let{chainId:n,quoter:r,router:o}=Jy(e.chainId??8453),i=Wy(e.tokenIn||"WETH",n),a=Wy(e.tokenOut||Nn[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...TC],l=[],u=null;for(let d of c){let p=Vy.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=Vy.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 de({venue:"aerodrome",chainId:n,chain:Nn[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 Xy(e={},t={}){let n=Number(e.chainId??8453),r=Jy(n),o=Ai(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Ky||i===Yy||/^eth$/i.test(i),s=await Us(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=NC.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return $({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 Qy(e={}){let t=Number(e.chainId??8453);try{let n=await Us({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:Nn[t]?.router,quoter:Nn[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Zy(){return Object.entries(Nn).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}_i();cw();Ti();j();Ye();bn();ie();var YC="https://api.1inch.dev/swap/v6.0";function yw(e={}){return ut({provider:"oneinch",defaultUrl:YC,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Kd(e={}){return yw(e).baseUrl}function Ni(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Yd(e={}){let t=Ni(e);return it({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},yw(e).trusted)}async function ww(e={}){if(!Ni(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Ci({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 Ci(e={},t={}){if(!Ni(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 I(`${Kd(t)}/${n}/quote?${a}`,{headers:Yd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?de(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function JC(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Jd(e={},t={}){if(!Ni(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return I(`${Kd(t)}/${n}/approve/spender`,{headers:Yd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function bw(e={},t={}){if(!Ni(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=ot({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 I(`${Kd(t)}/${n}/swap?${c}`,{headers:Yd(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=de(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!JC(r)){let f=l?.spender||l?.approvalAddress||(await Jd({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"})}ie();var QC=96*1024,xw=50;function ZC(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>QC)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 an(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function kw(e,t){let n=an(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 eO(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 tO(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=an(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:an(e.network,`accepts[${t}].network`),amount:kw(e.amount,`accepts[${t}].amount`),asset:an(e.asset,`accepts[${t}].asset`),payTo:an(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:eO(e.extra)})}function Xd(e){let t=ZC(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>xw)throw new Error(`x402: accepts must contain 1-${xw} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:an(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(tO));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 Sw(e,t){return String(e)===String(t)}function nO(e,t={}){let n=Xd(e),r=an(t.network,"network"),o=an(t.asset,"asset"),i=an(t.payTo,"payTo"),a=BigInt(kw(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&Sw(l.asset,o)&&Sw(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 vw(e={}){return e.paymentRequired??e.header??e.body}function Ew(e={}){return Xd(vw(e))}function Iw(e={},t={}){let n=Xd(vw(e)),r=nO(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 Aw(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}j();bn();var oO="https://api.bankr.bot";function Qd(e={}){return ut({provider:"bankr",defaultUrl:oO,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function _w(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function iO(e={}){let t=_w(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function Pw(e={},t=!1){let n=iO(e),r=Qd(e);return it({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function Tw(e,t={}){return I(`${Qd(t).baseUrl}${e}`,{headers:Pw(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function Zd(e={}){return Tw("/wallet/me",e)}async function Nw(e={}){return Tw("/wallet/portfolio",e)}function Oi(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function aO(e){let t=Oi(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 Cw(e={},t={}){let n={fromChain:Oi(e.fromChain,"fromChain"),fromToken:Oi(e.fromToken,"fromToken"),toChain:Oi(e.toChain,"toChain"),toToken:Oi(e.toToken,"toToken"),amount:aO(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 I(`${Qd(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:Pw(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function Ow(e={}){if(!_w(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await Zd(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var cO=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Ri(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||cO,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 Rw(e={}){try{let t=await Ri({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 Lw(e={}){let t=await Ri({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function $w(e,t={}){if(!e)throw new Error("coin required");let n=await Ri({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var uO=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Ks(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||uO,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 Bw(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Ks([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 Mw(e,t={}){if(!e)throw new Error("assetId required");let n=await Ks([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import Hw from"node:path";import{homedir as EO}from"node:os";import{createHash as IO,randomUUID as AO}from"node:crypto";import ge from"node:fs";import Ys from"node:path";import{createHash as pO,randomUUID as Fw}from"node:crypto";var ep=1,Ct=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Rn(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(Rn).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Rn(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function Uw(e){return pO("sha256").update(Rn(e)).digest("hex")}function Js(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 Xs(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function qw(e){ge.mkdirSync(e,{recursive:!0,mode:448});try{ge.chmodSync(e,448)}catch{}}function tp(e){try{let t=ge.statSync(e);return{...JSON.parse(ge.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function Zr({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=()=>Fw()}={}){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:ep,kind:t,generation:0,data:w}}function d(w){let y;try{y=JSON.parse(w)}catch(S){throw new Ct(`corrupt ${t} snapshot: invalid JSON (${S.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new Ct(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==ep)throw new Ct(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new Ct(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:k,...v}=y;if(typeof k!="string"||!/^[a-f0-9]{64}$/.test(k)||Uw(v)!==k)throw new Ct(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(S){throw new Ct(`corrupt ${t} snapshot: ${S.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 Ct(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ge.chmodSync(e,384)}catch{}return d(ge.readFileSync(e,"utf8"))}function m(){qw(Ys.dirname(e));let w=Js(o),y=String(c()),k=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:w})}
|
|
146
|
+
`,v=()=>{let T;try{return T=ge.openSync(l,"wx",384),ge.writeFileSync(T,k,"utf8"),ge.fsyncSync(T),ge.closeSync(T),{lockId:y}}catch(N){let A=T!==void 0;if(A)try{ge.closeSync(T)}catch{}if(A)try{ge.unlinkSync(l)}catch{}if(N?.code!=="EEXIST")throw N;return null}},E=Js(o)+s,_=new Int32Array(new SharedArrayBuffer(4));for(;;){let T=v();if(T)return T;let N=Js(o),A=tp(l),M=!1;if(A){let C=N-Number(A.acquiredAt??A.mtimeMs);M=Number.isFinite(C)&&C>=a}else try{M=N-ge.statSync(l).mtimeMs>=a}catch{M=!1}if(M){let C=tp(l);if(A?C?.lockId===A.lockId:C===null){try{ge.unlinkSync(l)}catch(O){if(O?.code!=="ENOENT")throw O}continue}}let D=E-N;if(D<=0)throw new Ct(`${t} store is busy`,"STORE_BUSY");Atomics.wait(_,0,0,Math.min(10,D))}}function f(w){if(tp(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:Uw(w)},k=`${Rn(y)}
|
|
147
|
+
`;if(Buffer.byteLength(k)>i)throw new Ct(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let v=Ys.dirname(e);qw(v);let S=Ys.join(v,`.${Ys.basename(e)}.${process.pid}.${Fw()}.tmp`),E;try{E=ge.openSync(S,"wx",384),ge.writeFileSync(E,k,"utf8"),ge.fsyncSync(E),ge.closeSync(E),E=void 0,ge.renameSync(S,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(S)}catch(_){if(_?.code!=="ENOENT")throw _}}}function g(){return Xs(p().data)}function b(){let w=p();return{schemaVersion:w.schemaVersion,kind:w.kind,generation:w.generation,data:Xs(w.data)}}function x(w){if(typeof w!="function")throw new TypeError("mutator must be a function");let y=m();try{let k=p(),v=Xs(k.data),S=w(v,{generation:k.generation,now:Js(o)});return r(v),h({schemaVersion:ep,kind:t,generation:k.generation+1,data:v}),Xs(S)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:b,mutate:x})}import{wordlists as mO}from"ethers";var fO=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),hO=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],gO=new Set([12,15,18,21,24]);function yO(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return gO.has(t.length)&&t.every(n=>mO.en.getWordIndex(n)>=0)}var wO=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,bO=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,xO=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function SO(e){let t=Dw(e);return xO.has(t)||bO.test(t)}var Li=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Dw(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function kO(e){let t=Dw(e);return[...fO].some(n=>t.includes(n))}function vO(e,t,n){if(typeof t=="string"){if(hO.some(r=>r.test(t))||yO(t))throw new Li(n);if(wO.test(t)&&!SO(e))throw new Li(n)}}function np(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return vO(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)=>np(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(kO(o))throw new Li(i);e[o]!==void 0&&(r[o]=np(e[o],i,o))}return r}function sn(e){return np(e)}var Zs=1,jw="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",G8=Object.freeze(["listing","offer","arm","instruct"]),_O=Object.freeze(["open","cancelled","expired","armed","submitted"]),K8=Object.freeze(["arm","sign-and-broadcast"]),PO=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."}),TO=/^(?:0|[1-9][0-9]*)$/,NO=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,CO=/^0x[a-fA-F0-9]{40}$/,OO=/^0x[a-fA-F0-9]{64}$/,RO=/[\u0000-\u001f\u007f]/,LO=new Set(_O),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 dr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))dr(t);Object.freeze(e)}return e}function Bi(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||RO.test(o))&&ee(`${t} is invalid`),r?o.toLowerCase():o}function Xe(e,t){let n=Bi(e,t,{max:128});return NO.test(n)||ee(`${t} must be a bounded id`),n}function $i(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 TO.test(r)||ee(`${t} must be a canonical integer string`),n&&r==="0"&&ee(`${t} must be positive`),r}function ur(e,t){let n=Bi(e,t,{max:42,lower:!0});return CO.test(n)||ee(`${t} must be a 20-byte EVM address`),n}function zw(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ee(`${t} must be a plain object`),e}function lr(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 rp(e){return new Date(e).toISOString()}function $O(e){return IO("sha256").update(Rn(e),"utf8").digest("hex")}function BO(e=process.env){let t=e.ORACLE_CONFIG_DIR||Hw.join(EO(),".config","oracle");return Hw.join(t,"local-marketplace.v1.json")}function Qs(e){let t=e.status==="submitted";return dr({schemaVersion:Zs,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:LO.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=>dr({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:jw,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function MO(e){(!e||e.schemaVersion!==Zs||!Array.isArray(e.listings))&&ee("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&ee("marketplace capacity exceeded","STORE_LIMIT")}function op(e,t){return dr({schemaVersion:Zs,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:jw,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function FO(e,t,n){typeof e=="string"&&ee("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=zw(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&ee("generic signHash is refused","SIGNHASH_REFUSED");let o=ur(r.from??r.offerer??t.seller,"artifact.from"),i=ur(r.to??r.recipient??n.buyer,"artifact.to"),a=$i(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 UO(e,t){if(e==null)return{action:"arm"};let n=zw(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ee("generic signHash is refused","SIGNHASH_REFUSED");let r=Bi(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 Vw({filePath:e=BO(),clock:t=()=>Date.now(),idFactory:n=()=>AO()}={}){let r=Zr({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Zs,listings:[]}),validateData:MO});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={}){sn(h);let g=Xe(h.tenantId,"tenantId"),b=ur(h.seller,"seller"),x=Bi(h.asset,"asset",{max:128}),w=$i(h.amount,"amount",{positive:!0}),y=$i(h.price,"price",{positive:!0}),k=$i(h.chainId,"chainId",{positive:!0}),v=lr(t),S=rp(v),E=h.expiresAt==null?rp(v+864e5):Bi(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(T=>{T.listings.some(M=>M.listingId===_)&&ee("listingId already exists","DUPLICATE");let N={listingId:_,tenantId:g,seller:b,asset:x,amount:w,price:y,chainId:k,status:"open",createdAt:S,expiresAt:E,offers:[],custody:"none",execution:"armed-local"},A={...N,listingHash:$O(N)};return T.listings.push(A),Qs(A)})}function s({tenantId:h}={}){let g=Xe(h,"tenantId"),b=lr(t);return dr(r.read().listings.filter(x=>o(x,g)).map(x=>Qs(i({...x,offers:x.offers.map(w=>({...w}))},b))))}function c({tenantId:h,listingId:g,actor:b}={}){let x=Xe(h,"tenantId"),w=Xe(g,"listingId"),y=ur(b,"actor"),k=lr(t);return r.mutate(v=>{let S=v.listings.find(E=>o(E,x)&&E.listingId===w);return S||ee("listing not found","NOT_FOUND"),i(S,k),S.seller!==y&&ee("only the seller can cancel","FORBIDDEN"),S.status!=="open"&&ee("listing is not open","NOT_OPEN"),S.status="cancelled",Qs(S)})}function l(h={}){sn(h);let g=Xe(h.tenantId,"tenantId"),b=Xe(h.listingId,"listingId"),x=ur(h.buyer,"buyer"),w=$i(h.amount,"amount",{positive:!0}),y=lr(t),k=Xe(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(v=>{let S=v.listings.find(E=>o(E,g)&&E.listingId===b);return S||ee("listing not found","NOT_FOUND"),i(S,y),S.status!=="open"&&ee("listing is not open","NOT_OPEN"),S.seller===x&&ee("seller cannot offer on their own listing","FORBIDDEN"),S.offers.some(E=>E.offerId===k)&&ee("offerId already exists","DUPLICATE"),S.offers.push({offerId:k,buyer:x,amount:w,status:"open",createdAt:rp(y)}),Qs(S)})}function u(h,{tenantId:g,listingId:b,offerId:x,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 S=v.offers.find(E=>E.offerId===x);return(!S||!["open","armed"].includes(S.status))&&ee("offer not found","NOT_FOUND"),{row:v,offer:S}}function d({tenantId:h,listingId:g,offerId:b,actor:x}={}){let w=Xe(h,"tenantId"),y=Xe(g,"listingId"),k=Xe(b,"offerId"),v=ur(x,"actor"),S=lr(t);return r.mutate(E=>{let{row:_,offer:T}=u(E,{tenantId:w,listingId:y,offerId:k,actor:v,now:S});return _.status="armed",T.status="armed",op(_,T)})}async function p({tenantId:h,listingId:g,offerId:b,actor:x,instruction:w,executor:y}={}){let k=Xe(h,"tenantId"),v=Xe(g,"listingId"),S=Xe(b,"offerId"),E=ur(x,"actor"),_=lr(t),T=r.mutate(O=>{let{row:F,offer:Q}=u(O,{tenantId:k,listingId:v,offerId:S,actor:E,now:_,allowed:["open","armed"]}),K=UO(w,F);return F.status="armed",Q.status="armed",{armed:op(F,Q),instruction:K,listingHash:F.listingHash}});if(T.instruction.action==="arm")return T.armed;let N=r.read().listings.find(O=>O.listingId===v&&O.tenantId===k),A=N?.offers.find(O=>O.offerId===S),M=FO(T.instruction.artifact,N,A);(!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 D=await y.executeConfirmedArtifact(M,T.instruction.nonce,y),C=D?.receipt?.transactionHash??D?.transactionHash;(typeof C!="string"||!OO.test(C))&&ee("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let U=D?.receipt?.status??D?.status;return U!==1&&U!=="0x1"&&ee("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(O=>{let{row:F,offer:Q}=u(O,{tenantId:k,listingId:v,offerId:S,actor:E,now:lr(t),allowed:["armed"]});return F.status="submitted",Q.status="submitted",F.transactionHash=C.toLowerCase(),dr({...op(F,Q),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:F.transactionHash,review:`Local P2 fill ${F.listingId} signed and broadcast through the instructed local signer. transactionHash=${F.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Xe(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&ee("consult text required"),dr({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 PO}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import Ww from"node:path";import{homedir as qO}from"node:os";import{createHash as DO,randomUUID as HO}from"node:crypto";var tc=1,Gw="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",tH=Object.freeze(["open","cancelled","armed","submitted"]),jO=/^(?:0|[1-9][0-9]*)$/,zO=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,VO=/^0x[a-fA-F0-9]{40}$/,WO=/^0x[a-fA-F0-9]{64}$/,GO=/[\u0000-\u001f\u007f]/,cp=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function re(e,t){throw new cp(e,t)}function Mi(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Mi(t);Object.freeze(e)}return e}function Fi(e,t,{max:n=256}={}){typeof e!="string"&&re(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||GO.test(r))&&re(`${t} is invalid`),r}function cn(e,t){let n=Fi(e,t,{max:128});return zO.test(n)||re(`${t} must be a bounded id`),n}function ec(e,t,{positive:n=!1}={}){typeof e=="number"&&re(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return jO.test(r)||re(`${t} must be a canonical integer string`),n&&r==="0"&&re(`${t} must be positive`),r}function pr(e,t){let n=Fi(e,t,{max:42}).toLowerCase();return VO.test(n)||re(`${t} must be a 20-byte EVM address`),n}function KO(e){let t=Fi(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{re("resource must be an https URL")}return n.protocol!=="https:"&&re("resource must be https"),(n.username||n.password)&&re("resource must not contain credentials"),n.toString()}function Kw(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&re(`${t} must be a plain object`),e}function YO(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&re("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function JO(e){return new Date(e).toISOString()}function XO(e=process.env){let t=e.ORACLE_CONFIG_DIR||Ww.join(qO(),".config","oracle");return Ww.join(t,"local-x402.v1.json")}function ap(e){let t=e.status==="submitted";return Mi({schemaVersion:tc,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:Gw,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function QO(e){(!e||e.schemaVersion!==tc||!Array.isArray(e.intents))&&re("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&re("x402 capacity exceeded","STORE_LIMIT")}function sp(e){return Mi({schemaVersion:tc,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:Gw,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function ZO(e,t){typeof e=="string"&&re("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=Kw(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&re("generic signHash is refused","SIGNHASH_REFUSED");let r=pr(n.from??t.payer,"artifact.from"),o=pr(n.to??t.payTo,"artifact.to"),i=ec(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&re("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&re("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&re("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&re("amount exceeds maxBudget","BUDGET"),n}function eR(e,t){if(e==null)return{action:"arm"};let n=Kw(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&re("generic signHash is refused","SIGNHASH_REFUSED");let r=Fi(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&re("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&re("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&re("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&re("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function Yw({filePath:e=XO(),clock:t=()=>Date.now(),idFactory:n=()=>HO()}={}){let r=Zr({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:tc,intents:[]}),validateData:QO});function o(l={}){sn(l);let u=cn(l.tenantId,"tenantId"),d=pr(l.payer,"payer"),p=pr(l.payTo,"payTo"),m=KO(l.resource),f=ec(l.amount,"amount",{positive:!0}),h=ec(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&re("amount exceeds maxBudget","BUDGET");let g=Fi(l.asset??"USDC","asset",{max:32}),b=ec(l.chainId,"chainId",{positive:!0}),x=YO(t),w=cn(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(S=>S.intentId===w)&&re("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:JO(x),custody:"none",execution:"armed-local"},v={...k,intentHash:DO("sha256").update(Rn(k),"utf8").digest("hex")};return y.intents.push(v),ap(v)})}function i({tenantId:l}={}){let u=cn(l,"tenantId");return Mi(r.read().intents.filter(d=>d.tenantId===u).map(ap))}function a({tenantId:l,intentId:u,actor:d}={}){let p=cn(l,"tenantId"),m=cn(u,"intentId"),f=pr(d,"actor");return r.mutate(h=>{let g=h.intents.find(b=>b.tenantId===p&&b.intentId===m);return g||re("intent not found","NOT_FOUND"),g.payer!==f&&re("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&re("intent is not open","NOT_OPEN"),g.status="cancelled",ap(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=cn(l,"tenantId"),m=cn(u,"intentId"),f=pr(d,"actor");return r.mutate(h=>{let g=h.intents.find(b=>b.tenantId===p&&b.intentId===m);return g||re("intent not found","NOT_FOUND"),g.payer!==f&&re("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||re("intent is not open","NOT_OPEN"),g.status="armed",sp(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=cn(l,"tenantId"),h=cn(u,"intentId"),g=pr(d,"actor"),b=r.mutate(S=>{let E=S.intents.find(T=>T.tenantId===f&&T.intentId===h);E||re("intent not found","NOT_FOUND"),E.payer!==g&&re("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(E.status)||re("intent is not open","NOT_OPEN");let _=eR(p,E);return E.status="armed",{armed:sp(E),instruction:_}});if(b.instruction.action==="arm")return b.armed;let x=r.read().intents.find(S=>S.tenantId===f&&S.intentId===h),w=ZO(b.instruction.artifact,x);(!m||typeof m.executeConfirmedArtifact!="function")&&re("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&re("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"||!WO.test(k))&&re("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let v=y?.receipt?.status??y?.status;return v!==1&&v!=="0x1"&&re("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(S=>{let E=S.intents.find(_=>_.tenantId===f&&_.intentId===h);return(!E||E.status!=="armed")&&re("intent is not armed","NOT_OPEN"),E.status="submitted",E.transactionHash=k.toLowerCase(),Mi({...sp(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 Jw from"node:path";import{homedir as tR}from"node:os";import{randomUUID as nR}from"node:crypto";var dp=1,rR="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",uH=Object.freeze(["listed","revoked"]),oR=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,iR=/[\u0000-\u001f\u007f]/,aR=/^[a-f0-9]{64}$/,sR=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,cR=new Set(["read","prepare","none"]),up=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 up(e,t)}function pp(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))pp(t);Object.freeze(e)}return e}function Ln(e,t,{max:n=256}={}){typeof e!="string"&&Me(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||iR.test(r))&&Me(`${t} is invalid`),r}function Ui(e,t){let n=Ln(e,t,{max:128});return oR.test(n)||Me(`${t} must be a bounded id`),n}function Xw(e,t){let n=Ln(e,t,{max:64}).toLowerCase();return aR.test(n)||Me(`${t} must be 64 lowercase hex`),n}function lR(e,t){let n=Ln(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 uR(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&Me("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Ln(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!sR.test(r)||r==="0.0.0.0")&&Me(`outboundHosts[${n}] is not an allowlisted host`),r}))}function Qw(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 Zw(e){return new Date(e).toISOString()}function dR(e=process.env){let t=e.ORACLE_CONFIG_DIR||Jw.join(tR(),".config","oracle");return Jw.join(t,"local-pack-registry.v1.json")}function lp(e){return pp({schemaVersion:dp,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:rR,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function pR(e){(!e||e.schemaVersion!==dp||!Array.isArray(e.packs))&&Me("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&Me("pack registry capacity exceeded","STORE_LIMIT")}function eb({filePath:e=dR(),clock:t=()=>Date.now(),idFactory:n=()=>nR()}={}){let r=Zr({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:dp,packs:[]}),validateData:pR});function o(l={}){sn(l);let u=Ui(l.tenantId,"tenantId"),d=Ln(l.name,"name",{max:128}),p=Ln(l.version,"version",{max:64}),m=Ln(l.publisher,"publisher",{max:128}),f=Xw(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:Xw(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:lR(l.homepage,"homepage"),b=uR(l.outboundHosts),x=Ln(l.spendScope??"none","spendScope",{max:16});cR.has(x)||Me("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&Me("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let w=Qw(t),y=Ui(String(l.packId??`pack-${n()}`),"packId");return r.mutate(k=>{k.packs.some(S=>S.packId===y||S.tenantId===u&&S.name===d&&S.version===p&&S.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:x,status:"listed",createdAt:Zw(w),revokedAt:null,execution:"none",pluginExecution:!1};return k.packs.push(v),lp(v)})}function i({tenantId:l}={}){let u=Ui(l,"tenantId");return pp(r.read().packs.filter(d=>d.tenantId===u).map(lp))}function a({tenantId:l,packId:u}={}){let d=Ui(l,"tenantId"),p=Ui(u,"packId"),m=Qw(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=Zw(m),lp(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 bR,Interface as to,keccak256 as hp}from"ethers";import{createHash as gp,createHmac as xR,timingSafeEqual as hb}from"node:crypto";Mr();_e();import{Interface as rb,getAddress as mp,isAddress as mR}from"ethers";var fR="0x0000000000000000000000000000000000000000",ob=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),hR=new rb(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),gR=new rb(["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 yR(e){let t=Number(e??4663),n=ob[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function tb(e,t){if(/^weth$/i.test(String(e||"")))return mp(ob[t].weth);if(!mR(String(e||"")))throw new Error(`up33: invalid token ${e}`);return mp(e)}function wR(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function nb(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 ib(e,t={},n={}){try{let r=yR(t.chainId),o=tb(t.tokenIn,r.chainId),i=tb(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=wR(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 nb(c,r.chainId,r.factory,hR,"getPool",[o,i,s]),u=mp(l[0]);if(u.toLowerCase()===fR)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 nb(c,r.chainId,r.quoter,gR,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 ab(e={},t={}){return ib("exact-input",e,t)}async function sb(e={},t={}){return ib("exact-output",e,t)}ie();var X=4663,nc="https://anvil.clutch.market",SR=`${nc}/api/markets/snapshot?chainId=${X}`,kR=`${nc}/api/rpc?chainId=${X}`,vR=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),mt="0x0bd7d308f8e1639fab988df18a8011f41eacad73",yp="0x0000000000000000000000000000000000000000",mr=1e5,ER=256e3,cb=256,IR=3e4,AR=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"}),St=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 to(["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"]),_R=new to(["function allowance(address owner,address spender) view returns (uint256)"]),gb=new to(["function decimals() view returns (uint8)"]),lb=new to(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),kt=new to(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)","function tokenURI(uint256 tokenId) view returns (string)","function rarityOf(uint256 tokenId) view returns (uint8)","function tokenWallet(uint256 tokenId) view returns (address)","function predictWallet(uint256 tokenId) view returns (address)"]),$n=new to(["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 G(e,t){try{return bR(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function un(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 ft(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:G(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function yb(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 ub(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>cb)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${cb}`);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:G(n.collection||n.collectionAddress,"Anvil collection"),market:G(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?G(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 PR(e,t,n=[],r={}){if(Number(e)!==X)throw new Error(`stonkbrokers: Anvil supports chain ${X} only`);if(!vR.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await I(kR,{method:"POST",headers:{origin:nc,referer:`${nc}/`,"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 Ot(e={}){return e.rpcCall||((t,n,r)=>PR(t,n,r,e))}async function no(e={},t={}){if(e.snapshot){let s=ub(e.snapshot),c={kind:"anvil-markets",chainId:X,total:s.length,contentHash:gp("sha256").update(eo(s)).digest("hex")},l=wp(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 I(SR,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:ER,retries:0});if(!r||typeof r!="object"||Array.isArray(r)||!Array.isArray(r.data))throw new Error("stonkbrokers: Anvil snapshot must be a JSON object with a data array");let o=ub(r),i={kind:"anvil-markets",chainId:X,total:o.length,contentHash:gp("sha256").update(eo(o)).digest("hex")},a=wp(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 rc(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 wb({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 no({},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=AR[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=Ot(n),c=rc(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)||rc(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=hp(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+IR}}function bb(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 Di(e={},t={}){let n=G(e.market,"Anvil market"),r=G(e.collection,"NFT collection"),o=un(e.tokenId),i=await wb({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,kt,"ownerOf",[BigInt(o)],s),se(a,n,Ge,"collection",[],s),se(a,n,Ge,"token",[],s),se(a,n,Ge,"robinhoodSwapFeeWei",[],s)]),f=G(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=G(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,gb,"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(),x=bb(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:b}),w=!!c[4],y=!!l[0],k=G(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:yb(c[2],c[3]),available:v,evidence:{quoteAvailable:w,inventory:y,ownerIsMarket:k,marketCollection:f,attestation:x},reason:v?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function oc(e={},t={}){let n=G(e.market,"Anvil market"),r=G(e.collection,"NFT collection"),o=await wb({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=G(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=G(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,gb,"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=bb(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:yb(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function xb(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 ln(e,t){let n=ft(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function Sb({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:ln(o,"gasLimit").toString(),maxFeePerGas:ln(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=ln(a,"maxPriorityFeePerGasWei").toString()),c}function kb(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 vb(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=G(e.buyer,"buyer"),r=G(e.market,"Anvil market"),o=G(e.collection,"NFT collection"),i=un(e.tokenId),a=ln(e.maxTotalCostRaw,"maxTotalCostRaw"),s=ft(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 Di({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=ln(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=G(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,b={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await se(Ot(t),f,_R,"allowance",[n,r],b))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let w={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[Sb({...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:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:xb(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 kb(v,l)}async function Eb(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=Ot(t),r=G(e.seller,"seller"),o=G(e.market,"Anvil market"),i=G(e.collection,"NFT collection"),a=un(e.tokenId),s=ln(e.minPayoutRaw,"minPayoutRaw"),c=ft(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 oc({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([se(n,i,kt,"ownerOf",[BigInt(a)],p).then(T=>G(T[0],"NFT owner")),se(n,i,kt,"getApproved",[BigInt(a)],p).then(T=>G(T[0],"NFT approval")),se(n,i,kt,"isApprovedForAll",[r,o],p).then(T=>!!T[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=ln(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(b!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=G(u.paymentToken,"Anvil payment token"),k=Number(u.paymentTokenDecimals),v={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},S=[Sb({...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:xb(e.tradeId),slippageBps:0,expiresAtMs:x+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:S}};return kb(_,u)}async function TR(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(k=>un(k)),w={kind:"anvil-inventory",chainId:X,market:G(e.market,"Anvil market"),collection:G(e.collection,"NFT collection"),total:x.length,contentHash:gp("sha256").update(eo(x)).digest("hex")},y=wp(e.inventoryCompletenessEvidence,w,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:x,total:x.length,scanned:x.length,complete:y.valid,continuation:y.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=Ot(t),r=G(e.market,"Anvil market"),o=rc(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)||rc(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>mr)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${mr}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>mr))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${mr}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:mr};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 x=f.toString();g.add(x),h.push(x),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 NR(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 CR(e,t,n){let r=Ot(n);try{let o=String((await se(r,e,kt,"tokenURI",[BigInt(t)]))[0]),i=NR(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await I(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,kt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function Ib(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 OR(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 ic(e={},t={}){let n=G(e.market,"Anvil market"),r=G(e.collection,"NFT collection"),o=await TR({...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=Ot(t),p=(await rt(i,s,async h=>{try{let g=await se(u,r,kt,"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 rt(p,s,async h=>{try{let g=await Di({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 rt(i,s,async u=>{try{let[d,p]=await Promise.all([CR(r,u,t),Di({market:n,collection:r,tokenId:u},t)]),m=Ib(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?OR(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 Ab(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function db(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 _b(e={}){return{maxMarkets:db(e,"maxMarkets",mr),maxItemsPerMarket:db(e,"maxItemsPerMarket",mr)}}function Pb(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function qi(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 Tb(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 Nb(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=_b(e),o=await no(e,t),i=Pb(o,e,n),a=t.scanCollection||ic,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await rt(i,s,async l=>{let u=Ab(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,...qi(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...qi(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:X,marketCount:i.length,...Tb(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 Cb(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=_b(e),o=await no(e,t),i=o.snapshotCoverage?.complete===!0,a=Pb(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||bp,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await rt(a,l,async d=>{let p=Ab(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",...qi(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=qi(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),...qi(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:X,marketCount:a.length,...Tb(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 pb(e,t){return e>t?"ARB":"PASS"}async function RR(e={},t={}){let n=String(e.direction||""),r=ft(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=G(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:Ot(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||sb)({chainId:X,tokenIn:mt,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:mt,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||lu)({...i,tokenIn:mt,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:mt,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||ab)({chainId:X,tokenIn:o,tokenOut:mt,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:mt,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||wn)({...i,tokenIn:o,tokenOut:mt,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:mt,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 mb(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=G(e.quoteToken,"conversion quote token");if(n!==mt)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=ft(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=ft(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function LR(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 eo(e){return Array.isArray(e)?`[${e.map(eo).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${eo(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ob(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:xR("sha256",n).update(eo(r)).digest("hex")}}function $R(e,t){return Ob(e,t)}function wp(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=$R(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!hb(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 BR(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:LR(e,t)}function fp(e,t,n,r,o,i){let a=BR(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=Ob(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!hb(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&&G(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=ft(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=ln(a.gasLimit,`${r} evidence gasLimit`),g=ln(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(G(b.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let w=G(b.sender,`${r} simulation sender`),y=G(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(ft(b.valueWei,`${r} simulation valueWei`))!==String(ft(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&&G(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 fb(e){let t=G(e,"OpenSea payment token");if(t!==yp&&t!==mt)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function bp(e={},t={}){let n=await ic(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=G(e.owner,"execution owner")}catch{}let a=(b,x,w,y={})=>({calldataHash:b==null?null:String(b).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:w,owner:i,...y}),s=(b,x,w,y,k)=>fp(e.gasEvidence??e.gasCostEvidence,b,r,`${x} gas`,a(w,y,x,k),o),c=(b,x)=>{let w=null;try{w=G(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=fp(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",y,o);if(k.amount!=null||b?.gasEstimate==null)return k;let v=fp(e.gasPriceEvidence,x,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(v.amount==null)return{amount:null,evidence:null,error:v.error};let S=ft(b.gasEstimate,"conversion gasEstimate");return{amount:S*v.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:S.toString(),gasPriceEvidence:v.evidence},error:null}},l=(b,x,w,y,k)=>{try{let v=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(v))throw new Error("exact Seaport order hash is required");let S=G(x?.protocolAddress,"Seaport protocol address"),E=String(x?.executionCalldataHash||"").toLowerCase(),_=/^0x[0-9a-f]{64}$/.test(E)?E:null,T=y==="seaport-fulfillment"&&k===yp?String(x?.priceWei??""):"0",N={orderHash:v,protocolAddress:S,target:S,valueWei:T},A=s(b,y,_,w,N);if(A.amount==null)throw new Error(A.error);if(A.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let M=A.evidence?.approvalRequired;if(typeof M!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==M)throw new Error("Seaport approval requirement evidence mismatch");let D=[A];if(M){let U=String(x?.approvalCalldataHash||"").toLowerCase(),O=/^0x[0-9a-f]{64}$/.test(U)?U:null,F=y==="seaport-offer-acceptance"?n.collection:k;D.push(s(b,"seaport-approval",O,w,{...N,target:F,valueWei:"0"}))}if(k===yp){let U=b==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",O=String(x?.prerequisiteCalldataHash||"").toLowerCase(),F=/^0x[0-9a-f]{64}$/.test(O)?O:null,Q=U==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";D.push(s(b,U,F,w,{...N,target:mt,valueWei:Q}))}let C=D.find(U=>U.amount==null);if(C)throw new Error(C.error);return{amount:D.reduce((U,O)=>U+O.amount,0n),evidence:D.map(U=>U.evidence),error:null}}catch(v){return{amount:null,evidence:null,error:String(v.message||v)}}},u=ft(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||ns,p=t.openSeaBestOffer||rs,m=t.paymentTokenConversion||(b=>RR({...b,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await oc({market:n.market,collection:n.collection},t),h=[];for(let b of n.candidates){let x=null;try{x=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId},t)}catch{}let w=b.quote,y=hp(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,S=null;if(x)try{v=fb(x.paymentToken)}catch(O){S=String(O.message||O)}let E=S||!x?{amount:null,evidence:null,error:S||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,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:x?.grossOfferWei==null?null:String(x.grossOfferWei),openSeaSellingValueWei:x?.sellerNetWei==null?null:String(x.sellerNetWei),openSeaFeeWei:x?.feeWei==null?null:String(x.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(x?.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(S)h.push({..._,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${S}`});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 O=mb(await m({chainId:X,direction:"acquire-exact-output",amountRaw:w.totalCostRaw,paymentToken:w.paymentToken,quoteToken:mt}),{direction:"acquire-exact-output",amountRaw:w.totalCostRaw}),F=c(O,"anvil-to-opensea");if(F.amount==null)h.push({..._,conversion:O,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${F.error}`});else{let Q=k.amount+E.amount+F.amount,K=BigInt(x.sellerNetWei)-BigInt(O.amountInWei)-BigInt(w.nativeSwapFeeWei)-Q;h.push({..._,conversionGasCostWei:F.amount.toString(),conversionGasEvidence:F.evidence,totalExecutionGasWei:Q.toString(),anvilCostInWethWei:O.amountInWei,conversion:O,netWei:K.toString(),decision:pb(K,u),reason:K>u?"exact inventory, exact conversion, native fee, gas, and exact OpenSea seller net clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(O){h.push({..._,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(O.message||O)}`})}let T=null;try{T=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!T)continue;let N=hp(Ge.encodeFunctionData("sellNFT",[BigInt(b.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),A=s("opensea-to-anvil","anvil-call",N,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),M=null,D=null;try{M=fb(T.paymentToken)}catch(O){D=String(O.message||O)}let C=D?{amount:null,evidence:null,error:D}:l("opensea-to-anvil",T,f.evidence.attestation,"seaport-fulfillment",M),U={route:"opensea-to-anvil",tokenId:b.tokenId,stars:b.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(T.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:M,gasCostWei:A.amount==null?null:A.amount.toString(),gasEvidence:A.evidence,marketplaceGasCostWei:C.amount==null?null:C.amount.toString(),marketplaceGasEvidence:C.evidence,conversionGasCostWei:null};if(D){h.push({...U,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${D}`});continue}if(A.amount==null){h.push({...U,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${A.error}`});continue}if(C.amount==null){h.push({...U,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${C.error}`});continue}if(typeof m!="function"){h.push({...U,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let O=mb(await m({chainId:X,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:mt}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),F=c(O,"opensea-to-anvil");if(F.amount==null)h.push({...U,conversion:O,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${F.error}`});else{let Q=A.amount+C.amount+F.amount,K=BigInt(O.amountOutWei)-BigInt(T.priceWei)-BigInt(f.nativeSwapFeeWei)-Q;h.push({...U,conversionGasCostWei:F.amount.toString(),conversionGasEvidence:F.evidence,totalExecutionGasWei:Q.toString(),anvilPayoutInWethWei:O.amountOutWei,conversion:O,netWei:K.toString(),decision:pb(K,u),reason:K>u?"exact OpenSea listing, exact conversion, native fee, gas, and current Anvil payout clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(O){h.push({...U,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(O.message||O)}`})}}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,x)=>{let w=BigInt(b.netWei??"-1"),y=BigInt(x.netWei??"-1");return y>w?1:y<w?-1:0}),arbCount:g.filter(b=>b.decision==="ARB").length,exec:!1,readOnly:!0}}async function ac(e={},t={}){let n=Ot(t),r=un(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([se(n,St.ammVault,lb,"quoteSpecificBuy",[BigInt(r)]),se(n,St.ammVault,lb,"inventory",[BigInt(r)]),se(n,St.nft,kt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:G(a[0],"broker owner")===St.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 Rb(e,t){try{return G((await se(t,St.nft,kt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return G((await se(t,St.nft,kt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Lb(e={},t={}){let n=Ot(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await rt(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=un(a.brokerTokenId,"brokerTokenId"),c=un(a.nestedTokenId,"nestedTokenId"),l=G(a.tba,"TBA"),u=G(a.nestedCollection,"nested collection"),d=Ib({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([Rb(s,n),se(n,u,kt,"ownerOf",[BigInt(c)]).then(g=>G(g[0],"nested owner")),ac({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 $b(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=G(e.buyer,"buyer"),r=un(e.brokerTokenId,"brokerTokenId"),o=ft(e.maxTokenCostWei,"maxTokenCostWei"),i=ft(e.maxEthFeeWei,"maxEthFeeWei"),a=await ac({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:St.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 Hi(e={},t={}){let n=Ot(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?St.overtimeBooster:St.stockBooster,[i,a,s,c,l,u]=await Promise.all([se(n,o,$n,"pendingEth"),se(n,o,$n,"minDropWei"),se(n,o,$n,"roundActive"),se(n,o,$n,"currentRound"),se(n,o,$n,"roundState").catch(()=>null),se(n,o,$n,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId: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=>G(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function Bb(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?St.overtimeBooster:St.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?$n.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):$n.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return $({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 Mb(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>un(s,"brokerTokenId")):[],r=Ot(t),o=await rt(n,8,async s=>{let[c,l]=await Promise.all([se(r,St.nft,kt,"ownerOf",[BigInt(s)]).then(u=>G(u[0],"broker owner")),Rb(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Hi({which:"stock"},t),Hi({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:X,owner:e.owner?G(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Fb(e={},t={}){try{let n=await no(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 Ub(e={},t={}){try{let n=await Hi({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)}}}ie();import{createHash as FR}from"node:crypto";var sc="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",UR=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"}]),fr=Object.freeze(Object.fromEntries(UR.map(e=>[e.name,e.selector]))),qR=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),DR=new Set(["name","endpoint","version","skills","domains"]),HR=new Set(["agentId","agentRegistry"]),qb=new Set(["reputation","crypto-economic","tee-attestation"]),jR=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,zR=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 xp(e,t,n){for(let r of Object.keys(e)){if(jR.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 ro(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 Db(e,t,{service:n=!1}={}){let r=ro(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 Sp(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 cc(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function kp(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 vp(e){let t=cc(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Sp(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function jb(){let e=[];try{let t=cc(process.env.ORACLE_ERC8004_CHAIN_ID);vp(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 VR(e){return JSON.parse(JSON.stringify(e))}function lc(e){let t=ji(e,"registration file");if(xp(t,qR,"registration"),t.type!==sc)throw new Error("erc8004: registration-v1 type required");let n={type:sc,name:ro(t.name,"name",128),description:ro(t.description,"description",4096),image:Db(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}]`);xp(c,DR,`services[${s}]`);let l=ro(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:Db(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=ro(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}]`);xp(c,HR,`registrations[${s}]`);let l=kp(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>qb.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!qb.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>zR)throw new Error("erc8004: registration metadata oversized");return VR(n)}function WR(e){if(ji(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==sc)throw new Error("erc8004: registration-v1 type required");return lc({type:sc,...e})}function GR(e){let t=lc(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function zi(e){return BigInt(e).toString(16).padStart(64,"0")}function zb(e){let t=Buffer.from(e,"utf8").toString("hex");return`${zi(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function KR(e){return`${fr.register}${zi(32)}${zb(e)}`}function YR(e,t){return`${fr.setAgentURI}${zi(e)}${zi(64)}${zb(t)}`}function JR(e,t){return`${e}${zi(t)}`}function XR(e){return FR("sha256").update(e,"utf8").digest("hex")}function Ep(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 Vb(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=cc(e.chainId),c=Sp(e.owner,"owner"),l=vp(s),u=Number(t?.nowMs??Date.now());return $({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:XR(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 Wb(e={},t={}){Ep(e,new Set(["chainId","owner","registration"]));let n=GR(WR(e.registration));return Vb(e,t,{kind:"erc8004-register",uri:n,selector:fr.register,data:KR(n)})}function Gb(e={},t={}){Ep(e,new Set(["chainId","owner","agentId","agentURI"]));let n=kp(e.agentId),r=Kb(e.agentURI);return Vb(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:fr.setAgentURI,data:YR(n,r),id:n})}function Kb(e){let t=ro(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 lc(o),t}function Hb(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 Sp(`0x${e.slice(-40)}`,t)}function QR(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 Yb(e={},t={}){Ep(e,new Set(["chainId","agentId"]));let n=cc(e.chainId),r=kp(e.agentId),o=vp(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:JR(d,r)},"latest"]),[a,s,c]=await Promise.all([i(fr.ownerOf),i(fr.tokenURI),i(fr.getAgentWallet)]),l=Kb(QR(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=lc(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Hb(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Hb(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}$r();_e();var Jb=999;async function Xb(e={}){let t={chainId:Jb,rpc:null,dex:null};try{t.rpc=await Lr(Jb,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Wo("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 Qb(e="HYPE",t={}){let r=(await Wo(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 Zb(e,t={}){return er(e,t)}j();bn();ie();var t2="https://api-mainnet.magiceden.dev/v2",Vi=1e9;function ex(e={}){return ut({provider:"magiceden",defaultUrl:t2,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function io(e={}){return ex(e).baseUrl}function hr(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function ao(e={}){let t=hr(e);return it({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},ex(e).trusted)}function Ip(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 oo(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 n2(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 r2(e){return Math.round(oo(e,"priceSol")*Vi)}function o2(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 i2({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function a2(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=i2(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function tx(e={}){try{let t=await Ap({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!hr(e),readTier:"keyless",prepareTier:hr(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!hr(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Ap(e={},t={}){let n=Ip(e.symbol||e.collection),r=await I(`${io(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:ao(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/Vi:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Vi:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Vi:null,exec:!1,raw:r}}function nx(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*Vi):null,tokenSize:e.tokenSize??1}}async function rx(e={},t={}){let n=Ip(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(`${io(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 I(i.toString(),{headers:ao(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(nx);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function ox(e={},t={}){let n=ve(e.tokenMint||e.mint,"tokenMint"),r=await I(`${io(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:ao(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(nx);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function ix(e={},t={}){if(!hr(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=oo(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:oo(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${io(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 I(l.toString(),{headers:ao(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});rn("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:r2(s),transaction:p,transactionEncoding:"base64",raw:u})}async function uc(e={},t={}){if(!hr(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=oo(e.priceSol??e.price,"priceSol"),s=o2(e.expiry),c=a2(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${io(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 I(l.toString(),{headers:ao(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});rn("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 ax(e={},t={}){if(!hr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=ve(e.buyer||e.userPublicKey,"buyer"),r=Ip(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=oo(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:oo(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${io(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await I(a.toString(),{headers:ao(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=n2(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`);rn("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})}ie();Wu();j();pt();var so=8,_p=10n**BigInt(so),c2="0xa4b1",sx=7,Pp=1,l2=2n**64n-1n;function u2(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 Gi(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function lo(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 Wi(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>so)throw new Error(`hl-staking: ${t} has more than ${so} decimals`);let i=BigInt(r)*_p+BigInt((o+"0".repeat(so)).slice(0,so)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>l2)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function co(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function dn(e){let t=BigInt(String(e||"0")),n=t/_p,r=(t%_p).toString().padStart(so,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function cx(e={}){try{let t=await Tp(e);return{ok:t.count>0,provider:"hl-staking",chain:Gi(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 Tp(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 Np(e={},t={}){let n=lo(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 Cp(e={},t={}){let n=lo(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 lx(e={},t={}){let n=lo(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 ux(e={},t={}){let n=lo(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 Op(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 dc(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||c2)}function d2(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(dc(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Rp({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:Gi(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:u2(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:d2(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=Ss(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 dx(e={},t={}){let n=Wi(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Wi(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${dn(n)} HYPE exceeds maxHype cap ${dn(r)} HYPE`);let o=Op(e),i=Gi(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:dc(t),wei:co(n),nonce:o};return Rp({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:co(n),nonce:o},opts:t,args:e,caps:{amountHype:dn(n),maxHype:r?dn(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 px(e={},t={}){let n=Wi(e.amountHype??e.amount,"amountHype"),r=Op(e),o=Gi(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:dc(t),wei:co(n),nonce:r};return Rp({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:co(n),nonce:r},opts:t,args:e,caps:{amountHype:dn(n)},notes:[`Starts the ${sx} 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 mx(e={},t={}){let n=lo(e.validator,"validator"),r=Wi(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:Wi(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${dn(r)} HYPE exceeds maxHype cap ${dn(s)} HYPE`);let c=Op(e),l=Gi(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:dc(t),validator:n,wei:co(r),isUndelegate:a,nonce:c};return Rp({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:co(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:dn(r),maxHype:s?dn(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Pp} 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 ${Pp} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function fx(e={},t={}){let n=lo(e.user||e.address,"user"),r=await Np({user:n},t),o=await Cp({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:sx,validatorLockupDays:Pp,exec:!1}}pt();async function Lp(e={}){let t=Date.now();try{let n=await Zt(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 m2=24*365,f2=8;function Ke(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function h2(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function pc(e={},t={}){let[n,r]=await Promise.all([wt(t),Zt(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:h2(d,p),dayNtlVolumeUsd:Ke(u.dayNtlVlm),premium:Ke(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(m2/f2)*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 hx(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await pc(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 gx(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([pc({},t),Hr({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Dr(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 yx(e={},t={}){let n=await fs(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 L2,readFileSync as $2,readdirSync as B2,renameSync as M2,writeFileSync as F2}from"node:fs";import{homedir as U2}from"node:os";import{join as gc}from"node:path";var Ki=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});j();_e();ie();import{Interface as $p,getAddress as Ex,isAddress as y2}from"ethers";var wx=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),bx=Object.freeze({42161:{name:"arbitrum",api:wx[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:wx[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),xx="0x0000000000000000000000000000000000000000",w2=`0x${"0".repeat(64)}`,Sx=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),kx=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),mc=new $p(["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"]),Ix=new $p(["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)"]),b2=new $p(["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)"]),x2=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function po(e){let t=Number(e??42161),n=bx[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(bx).join(", ")})`);return{chainId:t,...n}}function fc(e,t={}){let n=po(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function vt(e,t){if(!y2(e))throw new Error(`${t} must be a valid EVM address`);return Ex(e)}function le(e){return Ex(e).toLowerCase()}function uo(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 gr(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 S2(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 k2(e){let t=String(e||"marketIncrease").trim();if(!(t in Sx))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:Sx[t]}}function v2(e){let t=String(e||"noSwap").trim();if(!(t in kx))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:kx[t]}}function E2(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function I2(e,t){let n=le(t);return e.find(r=>le(r.marketToken||r.market||r.address)===n)||null}function A2(e,t){let n=le(t);return e.find(r=>le(r.tokenAddress||r.address)===n)||null}function _2({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=uo(e?.minPrice,"gmx minPrice"),i=uo(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 P2(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function T2(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function jt(e,t,n=r=>r){let o=Array.from(e?.items||e?.[0]||[]).find(i=>String(i?.key??i?.[0]??"")===t);return o?n(o.value??o[1]):null}function N2(e={}){let t=e.addressItems||e[0],n=e.uintItems||e[1],r=e.boolItems||e[3],o=e.bytes32Items||e[4],i=e.stringItems||e[6];return{account:jt(t,"account",a=>le(a)),market:jt(t,"market",a=>le(a)),initialCollateralToken:jt(t,"initialCollateralToken",a=>le(a)),key:jt(o,"key",a=>String(a).toLowerCase()),reason:jt(i,"reason",a=>String(a)),sizeDeltaUsd:jt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:jt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:jt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:jt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:jt(r,"isLong",a=>!!a)}}function C2(e={},t){if(le(e.address)!==le(t.eventEmitter))return null;let n;try{n=b2.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=x2[r];if(!o)return null;let i=N2(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||T2(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 vx(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function O2(e=[],{chainId:t}={}){let n=po(t);return(Array.isArray(e)?e:[]).map(r=>C2(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function Ax(e={},t={}){return I(`${fc(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Bp(e={},t={}){return I(`${fc(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function _x(e={},t={}){return I(`${fc(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function mo(e={},t={}){return I(`${fc(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Px(e={}){let t=await mo({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function Tx(e={},t={}){let n=po(e.chainId??42161),r=vt(e.account||e.owner||e.user,"gmx account"),o=gr(e.start??0,"gmx start"),i=gr(e.end??e.limit??20,"gmx end"),a=Ix.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 Nx(e={},t={}){let n=po(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=Ix.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 Cx(e={},t={}){let n=po(e.chainId??42161),r=t.receipt||await Vo({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=O2(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)=>vx(d.status)>=vx(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 Ox(e={},t={}){let n=po(e.chainId??42161),r=k2(e.orderType||e.type),o=v2(e.decreasePositionSwapType),i=vt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=vt(e.receiver||i,"gmx receiver"),s=vt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?vt(e.callbackContract,"gmx callbackContract"):xx,l=e.uiFeeReceiver?vt(e.uiFeeReceiver,"gmx uiFeeReceiver"):xx,u=vt(e.market||e.marketToken,"gmx market"),d=vt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?uo(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):gr(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=uo(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=uo(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=S2(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[w,y]=await Promise.all([Bp({chainId:n.chainId},t),mo({chainId:n.chainId},t)]),k=I2(E2(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=vt(k.indexToken,"gmx market indexToken"),S=vt(k.longToken,"gmx market longToken"),E=vt(k.shortToken,"gmx market shortToken"),_=le(d);if(![le(S),le(E)].includes(_))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let T=P2(k,x);if(T>0n&&m>T)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let N=A2(y,v);if(!N)throw new Error("gmx index ticker not found");let A=e.acceptablePrice?uo(e.acceptablePrice,"gmx acceptablePrice").toString():_2({ticker:N,isLong:x,typeKey:r.key,maxSlippageBps:b}),M=(e.swapPath||[]).map(we=>vt(we,"gmx swapPath market"));if(M.length>3)throw new Error("gmx swapPath too long for guarded slice");let D=gr(e.triggerPrice??"0","gmx triggerPrice"),C=gr(e.callbackGasLimit??"0","gmx callbackGasLimit"),U=gr(e.minOutputAmount??"0","gmx minOutputAmount"),O=gr(e.validFromTime??"0","gmx validFromTime"),F=!!e.shouldUnwrapNativeToken,Q=e.autoCancel==null?!0:!!e.autoCancel,K=String(e.referralCode||w2);if(!/^0x[0-9a-fA-F]{64}$/.test(K))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 ct={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:M},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:D,acceptablePrice:BigInt(A),executionFee:f,callbackGasLimit:C,minOutputAmount:U,validFromTime:O},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:F,autoCancel:Q,referralCode:K,dataList:Re},q=[];r.key==="marketIncrease"&&p>0n&&q.push(mc.encodeFunctionData("sendTokens",[d,n.orderVault,p])),q.push(mc.encodeFunctionData("sendWnt",[n.orderVault,f])),q.push(mc.encodeFunctionData("createOrder",[ct]));let H=mc.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:A,maxSlippageBps:b,isLong:x,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"})}pt();var Bn="oracle.hl.entry-state.v1",q2=8,D2=24*365;function Se(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function fo(e){return e==null||e===0?0:e>0?1:-1}function Yi(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function H2(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||gc(U2(),".config","oracle")}function $x(e={}){return gc(H2(e),"hl-entry-states")}function hc(e,t,n){return n==null&&e.push(t),n}function j2(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 pn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function z2(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 pn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)fo(o[a].rate)!==fo(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 V2(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return pn("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}:pn("defillama.stablecoins","no peggedUSD")}function Rx(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 W2(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 pn("gmx.tickers","no matching symbol");let c=Rx(s.minPrice,n),l=Rx(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return pn("gmx.tickers","unreadable price");let d=n!=null&&n>0?Yi(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?pn("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 G2({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?pn("hl-info.fundingHistory","not fetched"):z2(r,{coin:e,asOfMs:n}),llamaStables:o==null?pn("defillama.stablecoins","not fetched"):V2(o,n),gmxTicker:i==null?pn("gmx.tickers","not fetched"):W2(i,{coin:e,hlMark:t,asOfMs:n})}}function Lx(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 K2(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 Y2({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:Bn,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=j2(n,e);if(!d)return{schema:Bn,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=hc(u,"markPx",Se(m.markPx)),h=hc(u,"oraclePx",Se(m.oraclePx)),g=Se(m.midPx),b=Se(m.premium),x=hc(u,"fundingRate",Se(m.funding)),w=hc(u,"openInterestCoin",Se(m.openInterest)),y=Se(m.dayNtlVlm),k=Array.isArray(m.impactPxs)?m.impactPxs:[],v=Se(k[0]),S=Se(k[1]),E=x==null?null:x*(D2/q2)*100,_=w==null||f==null?null:w*f,T=i==null||i===0||w==null?null:(w-i)/i*100;T==null&&u.push("oiDeltaPct");let N=r?.levels,A=Array.isArray(N)?N[0]:[],M=Array.isArray(N)?N[1]:[],D=Se(A?.[0]?.px),C=Se(M?.[0]?.px);D==null&&u.push("book.bidPx"),C==null&&u.push("book.askPx");let U=Lx(M,Number(t)||0,"buy"),O=Lx(A,Number(t)||0,"sell");U.fillable||u.push("book.buyFillable"),O.fillable||u.push("book.sellFillable");let F=g??f,Q=U.avgFillPx==null||F==null?null:Yi(U.avgFillPx,F),K=O.avgFillPx==null||F==null?null:Yi(F,O.avgFillPx),Re=K2(o,e);for(let te of Re.unknown||[])u.push(te);let ct=Se(m.prevDayPx),q=f==null||ct==null||ct===0?null:(f-ct)/ct*100;q==null&&u.push("change24hPct");let H=G2({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:Bn,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:b,markOracleBps:Yi(f,h),fundingRate:x,fundingAprPct:E,openInterestCoin:w,openInterestUsd:_,oiDeltaPct:T,dayNtlVolumeUsd:y,change24hPct:q,impactBidPx:v,impactAskPx:S,maxLeverage:p.maxLeverage??null,book:{bidPx:D,askPx:C,spreadBps:D==null||C==null?null:Yi(C,D),notionalUsd:Number(t)||0,buy:U,sell:O,buySlipBps:Q,sellSlipBps:K},position:Re,overlays:H,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function Bx(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 J2(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 X2({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Bn||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=J2(n),a=Bx(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Bn,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Ki.ALERT_ONLY},c=$x({...o,configDir:r||o.configDir});L2(c,{recursive:!0,mode:448});let l=gc(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return F2(u,`${JSON.stringify(s,null,2)}
|
|
148
|
+
`,{mode:384}),M2(u,l),s}function Mp(e={}){let t=$x(e),n=[];try{n=B2(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse($2(gc(t,r),"utf8")))}function Q2(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Ki.ALERT_ONLY};let r=e.see,o=t;fo(r.fundingRate)!==fo(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),fo(r.premium)!==fo(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:Bn,id:e.id,coin:e.see.coin,side:e.side,actionMode:Ki.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function Mx(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await wt(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 Ji(e={},t={}){let n=e.coin,r=Se(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([wt(t),n?Dr(n,t).catch(()=>null):Promise.resolve(null),e.user?jr(e.user,t).catch(()=>null):Promise.resolve(null),n?ms({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Ms({},t).catch(()=>null),mo({chainId:42161},t).catch(()=>null)]);return Y2({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:Se(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function Fx(e={},t={}){let n=e.see&&e.see.schema===Bn?e.see:await Ji(e,t);return{see:n,...Bx(n,e.side)}}async function Ux(e={},t={}){let n=e.see&&e.see.schema===Bn?e.see:await Ji(e,t);return X2({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function qx(e={},t={}){let n=e.locked||Mp(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Ki.ALERT_ONLY};let r=await Ji({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return Q2(n,r)}pt();xs();Is();async function Dx(e={}){let t=await li(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Hx(e={},t={}){let n=e.coin,r=e.outcome==null?null:kn(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=zx(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=Fp(i)));let a=n==null?null:vn(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 li(t))?.outcomes||[]).find(f=>{try{return kn(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=Fp(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=kn(r,i).coin}if(a=vn(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,Gr(c,t)}async function jx(e={},t={}){let n=e.coin,r=e.outcome==null?null:kn(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=zx(e.outcomeSide):(o=e.side,o!=null&&(o=Fp(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=kn(r,o).coin}let i=vn(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,bi(a,t)}function zx(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function Fp(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")}ie();zr();var e9="0x"+"00".repeat(32);function tL(e){let t=typeof e=="bigint"?e:xt(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 Vx(e,t){let n=xt(e.makerAmount,"poly: makerAmount"),r=xt(e.takerAmount,"poly: takerAmount");return tL(t==="BUY"?n:r)}zr();var nL=new Set(["https://clob.polymarket.com/order"]),Xi=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),o9=Object.freeze(Xi.map(e=>e[0])),rL=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),oL="0xe111180000d2663c0091e4f400237545b87b996b",iL="0xe2222d279d744050d28e00520010520000310f59",Wx=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function Gx(e){let t=String(e||"").replace(/\/$/,"");if(!nL.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Kx(e){let t=bt(e,"poly: exchange").toLowerCase();if(!rL.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Yx(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=Wx(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(bt(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Gx(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(Kx(o.verifyingContract),Kx(n.exchange),bt(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==bt(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?iL:oL;if(bt(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!==Xi.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let S=0;S<Xi.length;S+=1)if(s[S]?.name!==Xi[S][0]||s[S]?.type!==Xi[S][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(bt(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(bt(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=Wx(n.tokenId,"tokenId",80);if(bt(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=xt(a.makerAmount,"poly: makerAmount"),m=xt(a.takerAmount,"poly: takerAmount"),f=xt(n.makerAmount,"poly: prepared makerAmount"),h=xt(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,x=Be(n.quantity,6,"poly: quantity");if(x<=0n||x!==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=Vx(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 S=Be(v,6,"poly: maxNotionalUsd");if(g>S)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:k,submitTo:Gx(n.submitTo)})}function aL(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 Jx(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:aL({...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 Yx(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as d9,randomInt as sL}from"node:crypto";import{keccak256 as m9,concat as f9,zeroPadValue as h9,getCreate2Address as g9,AbiCoder as y9}from"ethers";var tS=137;var cL="0xE111180000d2663C0091e4f400237545B87B996B",lL="0xe2222d279d744050d28e00520010520000310F59",Xx="0x0000000000000000000000000000000000000000000000000000000000000000",Up=6;var uL={name:"Polymarket CTF Exchange",version:"2",chainId:tS},dL={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"}]},Qx={"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 yc(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function wc(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function Zx(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function nS(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function pL(e,t,n,r){let o=nS(Number(n),r.price);if(e==="BUY"){let c=wc(Number(t),r.size),l=c*o;return yc(l)>r.amount&&(l=Zx(l,r.amount+4),yc(l)>r.amount&&(l=wc(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=wc(Number(t),r.size),s=a*o;return yc(s)>r.amount&&(s=Zx(s,r.amount+4),yc(s)>r.amount&&(s=wc(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function eS(e){let t=Number(e).toFixed(Up),[n,r=""]=t.split(".");return(n+r.padEnd(Up,"0").slice(0,Up)).replace(/^0+/,"")||"0"}function mL(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=Xx,builder:p=Xx}=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=Qx[String(c)]||Qx["0.01"],g=nS(m,h.price),{rawMakerAmt:b,rawTakerAmt:x}=pL(n,f,g,h),w=eS(b),y=eS(x),k=String(sL(1,2**31-1)),v=Date.now().toString(),S=n==="BUY"?0:1,E=s?lL:cL,_={salt:k,maker:i,signer:a,tokenId:String(t),makerAmount:w,takerAmount:y,side:S,signatureType:u,timestamp:v,metadata:d,builder:p},T={...uL,verifyingContract:E},N=n==="BUY"?b:x;return{domain:T,types:dL,value:_,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:b),notionalUsdc:N,exchange:E,negRisk:s}}function rS(){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 oS(e={},t={}){let n=mL(e),r={provider:"poly-clob",kind:"poly-order",chainId:tS,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=Jx(r,e,t)}catch{r.oraclePrepared=!1}return $(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as kL,keccak256 as yS}from"ethers";ie();_c();vc();var vL=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function EL(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=sn(e);for(let o of Object.keys(n))if(!vL.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 wS(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=dS(n,o),a=gS(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 kL(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}:{...EL(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:yS(s),authorityReport:pS(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:yS(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:Ic},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"})}_c();Vp();Is();j();var BL="https://api.geckoterminal.com/api/v2",Nc=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||BL).replace(/\/$/,""),go=e=>encodeURIComponent(String(e));async function Wp(e={},t={}){let n=Math.max(1,Number(e.page||1));return I(`${Nc(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function AS(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return I(`${Nc(t)}/networks/${go(e.network)}/pools/${go(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _S(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return I(`${Nc(t)}/networks/${go(e.network)}/tokens/${go(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function PS(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)),I(`${Nc(t)}/networks/${go(e.network)}/pools/${go(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function TS(e={}){let t=await Wp({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}j();_e();Ye();ie();import{Interface as RS,getAddress as LS,isAddress as FL}from"ethers";var UL="https://api.curve.finance/v1",$S=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||UL).replace(/\/$/,""),qL=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),BS="0x0000000000000000000000000000000000000000",Gp=new RS(["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)"]),NS=new RS(["function coins(uint256) view returns (address)"]);function MS(e){let t=qL[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function ia(e,t){if(!FL(e))throw new Error(`${t} must be a valid EVM address`);return LS(e)}function DL(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 CS(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 FS(e,t,n){return[e,t,n,...Array(8).fill(BS)]}function US(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function qS(e){return[e,...Array(4).fill(BS)]}async function HL({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=NS.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=NS.decodeFunctionResult("coins",c);i.push(LS(l[0]))}return i}function OS(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 DS(e={}){return I(`${$S(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Kp(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 I(`${$S(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function HS(e={}){let t=await Kp({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Yp(e={},t={}){let n=Number(e.chainId??8453),r=MS(n),o=ia(e.pool,"curve pool"),i=ia(e.tokenIn,"curve tokenIn"),a=ia(e.tokenOut,"curve tokenOut"),s=DL(e.amountIn,"curve amountIn"),c=CS(e.nCoins??2,"curve nCoins",2,8),l=CS(e.poolType,"curve poolType",1,4),u=t.rpcCall||V,d=await HL({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=OS(d,i,"tokenIn"),m=OS(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=FS(i,o,a),h=US(p,m,l,c),g=qS(o),b=Gp.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),w=Gp.decodeFunctionResult("get_dy",x),y=BigInt(w[0]);if(y<=0n)throw new Error("curve quote returned zero output");return de({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 jS(e={},t={}){let n=Number(e.chainId??8453),r=MS(n),o=ia(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=ia(e.receiver||e.recipient||o,"curve receiver"),a=await Yp({...e,sender:o},t),s=FS(a.tokenIn,a.pool,a.tokenOut),c=US(a.i,a.j,a.poolType,a.nCoins),l=qS(a.pool),u=Gp.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();ie();import{Interface as zL,getAddress as VL,isAddress as WL,keccak256 as zS,toUtf8Bytes as VS}from"ethers";var GL="https://api.morpho.org/graphql",Cc=new zL(["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)"]),KL=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||GL;async function Xp(e,t,n={}){return I(KL(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var YL="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 } } } }",JL="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 aa(e,t){let n=String(e||"").trim();if(!WL(n))throw new Error(`morpho: ${t} must be an address`);return VL(n).toLowerCase()}function XL(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 Jp(e){return Array.isArray(e)?`[${e.map(Jp).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Jp(e[t])}`).join(",")}}`:JSON.stringify(e)}async function sa(e,t,n,r,o={}){let i=Cc.encodeFunctionData(n,r),s=await(o.rpcCall||V)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Cc.decodeFunctionResult(n,s)}function QL(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function WS(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Xp(YL,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Qp(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Xp(JL,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function GS(e={}){return{ok:(await Xp("query { __typename }",{},e))?.data?.__typename==="Query"}}async function KS(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=aa(e.vault||e.vaultAddress,"vault"),i=aa(e.owner||e.from||e.sender,"owner"),a=aa(e.receiver||i,"receiver"),s=XL(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Qp({chainId:n,first:100},t),u=QL(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 sa(n,o,"asset",[],t),m=aa(p,"vault asset");if((u?.asset?.address?aa(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[x]=await sa(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[w]=await sa(n,o,"previewDeposit",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:w.toString()},h=Cc.encodeFunctionData("deposit",[s,a])}else{let[x]=await sa(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[w]=await sa(n,o,"previewWithdraw",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:w.toString()},h=Cc.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:zS(VS(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=zS(VS(Jp(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();ie();import{Interface as e$,getAddress as Zp,isAddress as t$}from"ethers";var n$="https://api-v3.balancer.fi/",r$=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||n$;async function XS(e,t,n={}){return I(r$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var o$="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",YS=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"}}),i$="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",a$="0x0000000000000000000000000000000000000000",em=new e$(["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 QS(e){let t=Number(e??8453),n=YS[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(YS).join(", ")})`);return{chainId:t,...n}}function ZS(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===a$||t===i$.toLowerCase()}function Oc(e,t){if(!t$(e))throw new Error(`${t} must be a valid EVM address`);return Zp(e)}function JS(e,t,n){let r=String(e||"");return ZS(r)||/^weth$/i.test(r)?Zp(t.weth):/^usdc$/i.test(r)?Zp(t.usdc):Oc(r,n)}function s$(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function ek(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 tk(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 XS(o$,{first:n,chains:r,where:{chainIn:r}},t)}async function nk(e={}){return{ok:(await XS("query { __typename }",{},e))?.data?.__typename==="Query"}}async function tm(e={},t={}){let n=QS(e.chainId),r=Oc(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=JS(o,n,"balancer tokenIn"),a=JS(e.tokenOut||"USDC",n,"balancer tokenOut"),s=s$(e.amountIn,"balancer amountIn"),c=Oc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=em.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,ek(e.userData)]),d=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=em.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return de({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 rk(e={},t={}){let n=QS(e.chainId),r=Oc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=ZS(o),a=await tm({...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=em.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,ek(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();ie();import{getAddress as l$}from"ethers";var u$="https://api-v2.pendle.finance/core",d$=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),p$="0x0000000000000000000000000000000000000000",m$="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",ok=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||u$).replace(/\/$/,"");function Rc(e,t){try{return l$(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function yo(e,t){return Rc(e,t).toLowerCase()}function f$(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===m$||t===p$}function nm(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 h$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:Rc(t.token,`pendle input ${n} token`),amount:nm(t.amount,`pendle input ${n} amount`)}))}function g$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>Rc(t,`pendle output ${n} token`))}function y$(e){let t=d$[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function w$(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 nm(t,"pendle output amount")}function b$(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!f$(r.token)).map(r=>({token:yo(r.token,"pendle approval token"),spender:yo(t,"pendle approval spender"),amount:nm(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function rm(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)),I(`${ok(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ik(e={}){let t=await rm({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function om(e={},t={}){let n=Number(e.chainId??42161),r=y$(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=Rc(e.receiver||o,"pendle receiver"),a=h$(e.inputs),s=g$(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=ot({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 I(`${ok(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(yo(p.to,"pendle tx target")!==yo(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&yo(p.from,"pendle tx sender")!==yo(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=w$(u),f=de(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:b$(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 ak(e={},t={}){let n=await om(e,t),{transaction:r,...o}=n;return o}j();Ye();ie();import{isAddress as S$}from"ethers";var k$="https://api.odos.xyz",im=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||k$).replace(/\/$/,"");async function am(e={}){return I(`${im(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function v$(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(!S$(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function sk(e={},t={}){let n=v$(e),r=ot({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 I(`${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 ck(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await sk(e,t);return{...de(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 lk(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await sk(e,t),i=await I(`${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=de(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 uk(e={}){let t=await am(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}j();var dk=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,I$=/[<>&`*_~[\]()|\\]/g,A$=/[\u0000-\u001F\u007F]/g;function sm(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(dk,"").replace(A$,"").replace(I$,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function cm(e){if(e==null)return!1;let t=String(e);return dk.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var pk=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 Lc(e,t={}){let n=Number(e),r=t.baseUrl||pk[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function mk(e){return!!pk[Number(e)]}async function lm(e={},t={}){return I(`${Lc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function fk(e={},t={}){if(!e.address)throw new Error("address required");return I(`${Lc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hk(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return I(`${Lc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function gk(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${Lc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await I(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function yk(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=sm(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=sm(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:cm(o.symbol)||cm(o.name)||void 0})}return n}async function wk(e={}){let t=await lm({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as P$}from"ethers";j();_e();pt();var T$="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",xk=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function Mn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function $c(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function bk(e){if(!e)return null;try{return P$(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function br(e={},t=process.env){let n=e.addresses||{},r=bk(n.evm||e.evmAddress||$c(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||$c(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||$c(t,"ORACLE_BITCOIN_ADDRESS"),a=bk(n.hyperliquid||e.hyperliquidAddress||$c(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?ve(o,"portfolio Solana address"):null,bitcoin:i?Tt(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function ca(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 wo(e){let t=Number(e);return Number.isFinite(t)?t:null}function Bc(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Fn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Sk(e,t){let n=xk[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 N$(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:ca(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 um(e,t){return{family:e,status:"unsupported",reason:t}}function dm(e,t){if(!e||e.status!=="ok")return e;let n=Sk(t,e.symbol),r=wo(e.amount),o=r!=null&&n.priceUsd!=null?Bc(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function kk(e={}){let t=br({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Mc(e={},t={}){let n=new Date().toISOString(),r=br(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(qr.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(xk))],u=o?$e(()=>Nt(l,Mn(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=rt(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={...Mn(t,"evm"),rpcUrl:e.rpcUrls?.[q]||t.evm?.rpcUrls?.[q]},we=await $e(()=>Zn(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 De=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&&mk(q)){let _t=await $e(()=>gk({chainId:q,address:r.evm},{...Mn(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));_t.ok?Ee={status:"ok",assets:yk(_t.data,{fungibleOnly:!0}).map(Yt=>{let Xn=ca(Yt.amountRaw,Yt.decimals);return{...Yt,amount:Xn,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:_t.ms}:Ee={status:"unavailable",assets:[],reason:_t.error||"blockscout token-balances failed",source:"blockscout",latencyMs:_t.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:De,amount:ca(Z,De)},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=Mn(t,"solana"),H=await $e(()=>As({address:r.solana},q)),te=i||a?await Promise.all([$e(()=>vi({owner:r.solana,programId:hd},q)).then(Ee=>({...Ee,program:"spl-token"})),$e(()=>vi({owner:r.solana,programId:T$},q)).then(Ee=>({...Ee,program:"token-2022"}))]):[],we=N$(te),De=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:ca(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?De:[],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=Mn(t,"bitcoin"),H=Mn(t,"bitcoinMeta"),[te,we,De]=await Promise.all([$e(()=>Ps({address:r.bitcoin},q)),i?$e(()=>Ns({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?$e(()=>Xr({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),We=we.ok?we.data:null,Z=De.ok?De.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:ca(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||De.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=Mn(t,"hyperliquid"),[H,te,we]=await Promise.all([$e(()=>ds(r.hyperliquid,q)),$e(()=>jr(r.hyperliquid,q)),$e(()=>Zt(q))]),De=(H.ok&&Array.isArray(H.data?.balances)?H.data.balances:[]).filter(Z=>Fn(Z.total)||Fn(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=>Fn(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:De,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,x,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 S=null;if(o&&v.length){let q=[...new Set(v)],H=await $e(()=>Nt(q,Mn(t,"prices")));H.ok&&(S=H.data)}let E=h.map(q=>{let H=q.native?{...q,native:dm(q.native,y)}:q;if(H.fungibleTokens?.status==="ok"&&Array.isArray(H.fungibleTokens.assets)){let te=k[H.chainId],we=H.fungibleTokens.assets.map(De=>{let We=String(De.symbol||"").toUpperCase(),Z=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(We)&&(Z=1),Z==null&&te&&De.address&&S?.coins){let Rr=`${te}:${String(De.address).toLowerCase()}`,Yt=S.coins[Rr],Xn=Number(Yt?.price);Number.isFinite(Xn)&&Xn>0&&(Z=Xn)}let Ee=wo(De.amount),_t=Ee!=null&&Z!=null?Bc(Ee*Z):null;return{...De,priceUsd:Z,usdValue:_t}});H={...H,fungibleTokens:{...H.fungibleTokens,assets:we}}}return H});g.native&&(g.native=dm(g.native,y)),b.native&&(b.native=dm(b.native,y));let _=0,T=0,N=0;for(let q of[...E,g,b]){q.native?.status==="ok"&&Fn(q.native.amount)&&(q.native.usdValue!=null?(_+=q.native.usdValue,T+=1):N+=1);for(let H of q.fungibleTokens?.assets||[])!Fn(H.amount)&&!Fn(H.amountRaw)||(H.usdValue!=null?(_+=H.usdValue,T+=1):N+=1)}let A=Sk(y,"HYPE");for(let q of x.spot?.balances||[]){let H=String(q.coin||"").toUpperCase(),te=H==="USDC"||H==="USDT"||H==="USDT0"?1:H==="HYPE"?A.priceUsd||wo(x.mids?.HYPE):wo(x.mids?.[q.coin]),we=wo(q.total);q.priceUsd=te,q.usdValue=we!=null&&te!=null?Bc(we*te):null,Fn(q.total)&&(q.usdValue!=null?(_+=q.usdValue,T+=1):N+=1)}let M=wo(x.perps?.accountValueUsd);M!=null&&M!==0&&(_+=M,T+=1);let D=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(q=>Fn(q.amount)).length,C=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;N+=D+C;let U=[...E,g,b,x],O=q=>U.filter(H=>H.status===q).length,F=[],Q=E.filter(q=>q.fungibleTokens?.status==="unavailable"),K=E.filter(q=>q.fungibleTokens?.status==="ok");Q.length&&!K.length?F.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):Q.length&&F.push(`EVM token discovery partial: Blockscout covered ${K.length} chain(s); ${Q.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&F.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),b.collectibles?.unknownNotEmpty&&F.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),w.ok||F.push(`Price provider unavailable: ${w.error}`);let Re=[um("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),um("sui","Sui balance adapter is not installed"),um("aptos","Aptos balance adapter is not installed")],ct=U.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:U.length,ok:O("ok"),unavailable:O("unavailable"),notConfigured:O("not-configured"),unsupported:O("unsupported")+Re.length,evmChainsRequested:c.length,evmChainsOk:E.filter(q=>q.status==="ok").length},valuation:{knownUsd:Bc(_),label:"known priced value, not a complete portfolio total",pricedItems:T,unpricedNonzeroItems:N,complete:N===0&&!ct&&O("unavailable")===0&&O("not-configured")===0&&Re.length===0,priceSource:o?"DefiLlama":null,priceStatus:w.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...E,g,b,x],unsupportedFamilies:Re,warnings:F}}import{constants as Uc}from"node:fs";import{chmod as tB,mkdir as nB,open as rB,readFile as oB}from"node:fs/promises";import{createHash as iB,randomUUID as aB}from"node:crypto";import sB from"node:os";import xo from"node:path";j();j();var O$=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"]),R$=new Set(["image/jpeg","image/png","image/webp"]);function L$(e){let t=String(e||"").toLowerCase();return O$.some(n=>t===n||t.endsWith(`.${n}`))}function $$(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 vk(e){let t=$$(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!L$(n.hostname)?null:n}async function B$(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=vk(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=vk(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(!R$.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 pm(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function M$(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function Ek(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 B$(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 S=v%u,E=Math.floor(v/u),_=S*d,T=m+E*p,N=y?`<image x="${_+14}" y="${T+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${_+14}" y="${T+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${T+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,A=pm(M$(w,v).slice(0,34)),M=pm(w.chain||"unknown chain");return`${N}<text x="${_+16}" y="${T+350}" fill="#f3f5f7" font-size="17" font-weight="600">${A}</text><text x="${_+16}" y="${T+376}" fill="#8d98a8" font-size="13">${M}${k?" \xB7 placeholder":""}</text>`}).join(""),x=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${pm(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(x).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(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 F$=[/\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],U$=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,q$=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function D$(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;U$.test(n)&&t.push("url-in-name");let i=F$.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),q$.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 Ik(e={}){let t=D$(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}ie();var H$=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"}]),j$=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 xr(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function la(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 z$(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 V$(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 W$(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 Pk(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function G$(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 K$(e,t){let n=Pk(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 Y$(e){let t=new Map;for(let n of e){let r=Pk(n);t.has(r)||t.set(r,n)}return[...t.values()]}function J$(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 Tk(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function bo(e={},t={}){let n=new Date().toISOString(),r=br(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=H$.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=xr(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await rt(l,4,async y=>({row:y,result:await la(`opensea-${y.chain}`,()=>ni({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(S=>({...S,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 la("opensea-solana",()=>ni({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 la("satflow-wallet-contents",()=>Os({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},xr(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let k=z$(y.data.contents).map(S=>V$(S,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 la("bitcoin-meta-inscriptions",()=>Xr({address:r.bitcoin},xr(t,"bitcoinMeta")),t.timeoutMs??35e3),v=k.ok&&k.data?.ok&&Array.isArray(k.data.inscriptions)?k.data.inscriptions:[];s.push(...v.map(S=>W$(S,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 la(`opensea-pnl-${y}`,()=>es({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=G$(e.costBasis),m=Y$(s).map(y=>K$(y,p)).map(y=>Ik(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,x=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:j$,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:x,complete:x===0&&w.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:J$(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 Ak(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 X$(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 Nk(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 as(e,xr(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=Ak(e.expiry??e.endTime,"Solana NFT listing expiry");return uc({...e,expiry:r},xr(t,"magiceden"))}if(n==="satflow"){let r=Ak(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Rs({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:X$(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},xr(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function mm(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 fm(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Fc(e){return String(e??"").trim().toLowerCase()}function Q$(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Fc(t),i=Fc(n);return!o||!i?!1:r.some(a=>Fc(a.trait_type??a.traitType??a.type)===o&&Fc(a.value??a.trait_value??a.traitValue)===i)}function Z$(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function _k(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 hm(e){return Math.round(Number(e)*1e6)/1e6}function Un(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 Ck(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return Un(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(S=>e[S]==null||e[S]==="");if(o.length)return Un(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=mm(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=mm(e.minTraitVolumeEth,"minTraitVolumeEth"),u=mm(e.traitFloorEth,"traitFloorEth"),d=fm(e.collectionFloorEth),p=fm(e.maxListingAgeMs),m=fm(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return Un(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return Un(e,"invalid-min-trait-sales");if(u<=0)return Un(e,"trait-floor-unavailable");let f=S=>Q$(S,e.traitType,e.traitValue)&&Z$(S,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(S=>{if(!m)return!0;let E=_k(S,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),g=hm(h.reduce((S,E)=>S+Number(E.priceEth??E.price??0),0)),b={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return Un(e,"trait-liquidity-insufficient",{traitSales:b});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(S=>{let E=Number(S.priceEth??S.price);if(!Number.isFinite(E)||E<=0||E>a)return!1;if(!p)return!0;let _=_k(S,["listedAt","createdAt","timestamp"]);return _!=null&&i-_<=p}).map(S=>{let E=Number(S.priceEth??S.price),_=Math.round((u-E)/u*1e4);return{...S,priceEth:E,discountBps:_}}).filter(S=>S.discountBps>=s).sort((S,E)=>S.priceEth-E.priceEth||E.discountBps-S.discountBps),w={traitSales:b,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:x.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return Un(e,"invalid-min-trait-listings",w);if(x.length<y)return Un(e,"trait-listing-depth-insufficient",w);let k=x[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:hm(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:hm(k.priceEth),discountBps:k.discountBps},evidence:w,prepareIntent:v}}async function Ok(e={},t={}){let n=await bo({...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 Rk(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await bo({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await Ek({...e,items:n},xr(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var Lk=10*1024*1024,Mk=1e3;function qn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function So(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function $k(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 Fk(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 cB(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Uk(e={}){return`portfolio_${iB("sha256").update(cB(e)).digest("hex").slice(0,20)}`}function qk(e={}){if(e.historyFile)return xo.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return xo.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||xo.join(sB.homedir(),".hermes");return xo.join(xo.resolve(n),"state","oracle","portfolio-history.jsonl")}function lB(e){let t=qn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?So(t):null}function uB(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=qn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?So(t):null}function dB(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=qn(c.usdValue);return l==null?s:s+l},0),i=qn(n.perps?.accountValueUsd),a=So(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>qn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=qn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:So(r)})}return t}function pB(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 mB(e,t){let n=qk(t),r=`${JSON.stringify(e)}
|
|
149
|
+
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await nB(xo.dirname(n),{recursive:!0,mode:448});let o=Uc.O_APPEND|Uc.O_CREAT|Uc.O_WRONLY|(Uc.O_NOFOLLOW||0),i=await rB(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await tB(n,384),n}async function Dk(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||Mc,o=t.nftInventoryImpl||bo,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=lB(s),u=uB(c),d=[l,u].filter(k=>k!=null),p=d.length?So(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||br(e,t.env||process.env),b=Uk(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let w={schemaVersion:1,id:`snapshot_${aB()}`,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:dB(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:pB(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await mB(w,t),snapshot:w,balance:s,nfts:c}}async function fB(e){let t=qk(e);try{let n=await oB(t);if(n.byteLength>Lk)throw new Error(`portfolio history exceeds ${Lk} 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 hB(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=br(e,t.env||process.env);return Object.values(n).some(Boolean)?Uk(n):null}async function gm(e={},t={}){let n=Fk(e.limit,100,1,Mk,"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=$k(e.since,"portfolio history since"),i=$k(e.until,"portfolio history until"),a=hB(e,t),s=await fB(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=>qn(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 Bk(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function qc(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function gB(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function yB(e,t){let c=e.map(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,S=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">${Bk(S)}</text>`}).join(""),h=e.map((w,y)=>`<circle cx="${d(y)}" cy="${p(w.value)}" r="5" fill="#b8f0ff"><title>${qc(w.recordedAt)}: ${Bk(w.value)}</title></circle>`).join(""),g=qc(e[0].recordedAt.slice(0,10)),b=qc(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 ${qc(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 Hk(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Fk(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await gm({...e,order:"asc",limit:e.limit??Mk},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:qn(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=gB(o,n),a=i[0].value,s=i.at(-1).value,c=So(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=yB(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:a,endKnownUsd:s,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}_e();var bB=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"}}),xB=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),SB=`0x${"0".repeat(64)}`;function kB(e){return!e||e==="0x"||e===SB}async function Sr(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(bB))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of xB)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!kB(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 jk(e={}){let t=Date.now();try{let n=await Sr({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 EB=/^0x[0-9a-fA-F]{40}$/,zk=4663;function Dc(e,t){let n=String(e||"").trim();if(!EB.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function ym(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 ua(e,t){return e==null||e===""?null:ym(e,t)}function IB({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:a,unsignedTx:s,args:c,opts:l}){let u=s?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=Dc(u.to,"prepared destination"),p=String(u.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let m=ym(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=ua(u.gasLimit??c.gasLimit,"gasLimit"),h=ua(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)),x=Wl({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:b,secret:l.routeAttestationSecret}),w=Pe(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),y={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:w.selectedBps,expiresAtMs:g+b},k=ua(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=ua(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=ua(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 AB(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}ai();let n=Ur(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function _B({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==ne.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!==ne.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 Vk(e={},t={}){let n=Number(e.chainId??zk);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=Dc(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Dc(e.tokenIn,"tokenIn"):null,i=e.recipient?Dc(e.recipient,"recipient"):null,a=e.amountIn==null?null:ym(e.amountIn,"amountIn"),s=AB(n,t.scanner),c=t.scanContractRisk||Sr,[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=_B({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),b=null,x=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{x=IB({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:!!x,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:s.key,name:s.name,nativeCurrency:s.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!b,unsignedTx:b,localSignerEnvelope:x,localSignerBlockedReason:w,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function Wk(){ai();let e=cs();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:zk,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 TB=5,wm=[50,75,90],Gk=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function kr(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 NB(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 Hc(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=Gk[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Gk).join(", ")}`};let i,a,s,c;try{i=kr(e.maxFeePerGasWei,"maxFeePerGasWei"),a=kr(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=kr(e.gasLimit,"gasLimit"),c=kr(e.maxTotalGasWei,"maxTotalGasWei")}catch(S){return{status:"error",viable:!1,error:S.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${TB.toString(16)}`,"pending",wm],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(S){return{status:"unavailable",viable:!1,error:S?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=kr(u?.baseFeePerGas,"baseFeePerGas")??kr(l?.baseFeePerGas?.[l.baseFeePerGas.length-1],"baseFeePerGas");if(d==null)return{status:"unavailable",viable:!1,error:"chain did not report a baseFeePerGas (pre-EIP-1559?)",notes:["this pricer is EIP-1559 only"]};let m=(Array.isArray(l?.reward)?l.reward:[]).map(S=>{try{return kr(S?.[o.percentile],"reward")}catch{return null}}).filter(S=>S!=null&&S>0n),f=NB(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,x=[];a!=null&&g>a&&(x.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(x.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&&x.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 ${wm[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:wm[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:w==null?null:w.toString(),clamps:x,notes:h}}_e();var OB="08c379a0",RB="4e487b71",LB=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 $B(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===OB)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===RB){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:LB[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 BB(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 MB(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 FB(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 da(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=FB(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=BB(f);if(!MB(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=$B(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 Kk(e={}){let t=Date.now();try{let n=await da({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 qB=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 DB(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 HB(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 Yk(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=HB(t);else if(o==="quantity")r+=DB(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function jB({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 jc(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=qB.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 Jk(e={}){let t=Date.now();try{let n=await jc({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 bm(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 jc({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 Sr({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await da({chainId:r,tx:{from:o,to:n,data:Yk(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 Hc({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=Yk(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=hu({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,x=null;try{b=jB({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(w){x=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:x,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}}ie();import{createHash as qM}from"node:crypto";import{createHash as VB}from"node:crypto";var WB=1,GB=8,je=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},KB=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),YB=new Set(["family","id"]),JB=new Set(["id","startsAt","endsAt","eligibility"]),XB=new Set(["kind","proofFormat","proofDigest"]),QB=new Set(["amount","unit"]),ZB=new Set(["value","unit"]);function ko(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 vo(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 eM(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new je(`${t} must be a positive safe integer`);return e}function xm(e,t){if(e=ko(e,t),vo(e,QB,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 Sm(e,t){if(e=ko(e,t),vo(e,ZB,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 tM(e,t){e=ko(e,t),vo(e,XB,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 nM(e,t){let n=`stages[${t}]`;e=ko(e,n),vo(e,JB,n);let r=Sm(e.startsAt,`${n}.startsAt`),o=Sm(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:tM(e.eligibility,`${n}.eligibility`)}}function km(e){if(e=ko(e,"input"),vo(e,KB,"input"),e.version!==WB)throw new je("version must be 1");let t=ko(e.chain,"chain");vo(t,YB,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>GB)throw new je("stages must contain 1 through 8 entries","stage-count");let r=n.map(nM).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:eM(e.quantity,"quantity"),stages:r,mintValueCap:xm(e.mintValueCap,"mintValueCap"),networkFeeCap:xm(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:xm(e.priorityFeeCap,"priorityFeeCap"),expiry:Sm(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 rM(e){return JSON.stringify(km(e))}function Xk(e){return`sha256:${VB("sha256").update(rM(e),"utf8").digest("hex")}`}var vm=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),vr=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Em=Object.freeze(Object.values(vr)),Qk=new Set(Em),Zk=Object.freeze(Em.slice(0,4)),oM=Em,iM=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 zc(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 aM(e){if(!Array.isArray(e))throw new Qe("capabilities must be an array");let t=new Set(e);for(let n of t)if(!Qk.has(n))throw new Qe(`unknown capability ${n}`,"unknown-capability");return oM.every(n=>t.has(n))?vm.AUTOMINT_READY:Zk.every(n=>t.has(n))?vm.PREPARE_READY:vm.RESEARCH_ONLY}function Im(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(!iM.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=zc(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(zc(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(zc(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(zc(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:aM(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=Zk){let o=t.get(n);if(!o)throw new Qe(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!Qk.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 nj=Im([]);ie();import{getAddress as sM,Interface as Am,keccak256 as cM}from"ethers";var Dn=Object.freeze({manifold:new Am(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Am(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Am(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Pm=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"})}),aj=Object.freeze(Object.fromEntries(Object.entries(Pm).map(([e,t])=>[Dn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function pe(e){throw new Error(`evm-mint-launchpads: ${e}`)}function ht(e,t){try{return sM(String(e||""))}catch{return pe(`invalid ${t}`)}}function Ze(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&pe(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return pe(`${t} must be an unsigned integer`)}}function _m(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&pe(`invalid ${t}`),e.map(String)}function lM(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&pe("invalid chainId");let o=ht(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&ht(u.contract,"reviewed contract")===o);a||pe("unsupported contract or wrong chain");let s=ht(a.mintTarget||a.contract,"reviewed mint target"),c=Dn[e].getFunction(Pm[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))&&pe("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function uM(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);pe("runtime bytecode verification required")}function dM(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)&&pe("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function pM(e,t){let n=Pm[e];String(t).slice(0,10).toLowerCase()!==Dn[e].getFunction(n.signature).selector.toLowerCase()&&pe("unknown selector");let r;try{r=Dn[e].decodeFunctionData(n.signature,t)}catch{pe("invalid calldata layout")}let o;return e==="manifold"&&(o=Dn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Dn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Dn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&pe("calldata must be canonical with no suffix"),r}async function ev(e,t={},n={}){Dn[e]||pe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=lM(e,t,n),s=ht(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)&&pe("transaction chain mismatch"),ht(p.to,"transaction target")!==i&&pe("transaction target mismatch");let m=await uM(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||cM(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&pe("runtime bytecode is not reviewed");let f=pM(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=dM(t,h),b,x,w,y=null,k=[];if(e==="manifold")ht(f[0],"calldata contract")!==o&&pe("calldata contract mismatch"),(t.instanceId==null||Ze(f[1],"instanceId")!==Ze(t.instanceId,"instanceId"))&&pe("instance/stage mismatch"),(t.mintIndex==null||Ze(f[2],"mintIndex")!==Ze(t.mintIndex,"mintIndex"))&&pe("mint index/stage mismatch"),k=_m([...f[3]]),b=ht(f[4],"calldata recipient"),x=1n,w=l;else if(e==="zora")b=ht(f[0],"calldata recipient"),x=BigInt(f[1]),w=l,t.comment!=null&&f[2]!==String(t.comment)&&pe("comment mismatch"),t.mintReferral!=null&&ht(f[3],"mint referral")!==ht(t.mintReferral,"expected mint referral")&&pe("mint referral mismatch");else{b=ht(f[0],"calldata recipient"),x=BigInt(f[1]),w=BigInt(f[3]);let T=f[4];k=_m([...T.proof]),y=BigInt(T.quantityLimitPerWallet),y<c&&pe("wallet allowance below quantity"),(BigInt(T.pricePerToken)!==l||ht(T.currency,"allowlist currency")!==ht(f[2],"currency"))&&pe("allowlist terms mismatch")}b!==s&&pe("recipient mismatch"),x!==c&&pe("quantity mismatch"),w!==l&&pe("price mismatch"),t.proof!=null&&JSON.stringify(k.map(T=>T.toLowerCase()))!==JSON.stringify(_m(t.proof).map(T=>T.toLowerCase()))&&pe("proof mismatch");let v=Ze(p.value??0,"transaction value"),S=l*c;(v<S||v-S>d||v>u)&&pe("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"))&&pe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(_==null||_>Ze(t.maxFeePerGasWei,"maxFeePerGasWei"))&&pe("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-S).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 mM="RESEARCH_ONLY";var fM="canonical serialized-message decoding and program-specific instruction validation are not implemented",Vc=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),cj=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function hM(){throw new Error(`solana-mint: ${mM}; disabled until ${fM}`)}function tv(){hM()}ie();import{Address as gM,CompactSize as yM,NETWORK as wM,OutScript as pv,Script as bM,TEST_NETWORK as nv,Transaction as xM,utils as SM}from"@scure/btc-signer";import{createHash as pa}from"node:crypto";var rv="universal-ordinals-mint",ov="bitcoin-ordinals-mint-plan",kM=1800*1e3,vM=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),iv=new Set,EM=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function Lt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function Hn(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 Tm(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 mv(e,t){let n=Lt(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 IM(e){return e==="bitcoin"||e==="mainnet"?wM:e==="regtest"?{...nv,bech32:"bcrt"}:nv}function av(e,t){try{let n=pv.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 AM(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function _M(e){let t=pa("sha256").update(e.unsignedTx).digest();return pa("sha256").update(t).digest().reverse().toString("hex")}function sv(e,...t){let n=pa("sha256").update(e,"ascii").digest();return pa("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function PM(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=sv("TapLeaf",Buffer.from([a]),Buffer.from(yM.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=sv("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=SM.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 cv(e,t){let n=Lt(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=xM.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(AM(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=av(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)=>PM(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 av(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:_M(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 TM(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 NM(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 CM=new Set([1,3]);function OM(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=NM(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!CM.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 RM(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=bM.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(OM(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(pa("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||TM(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 lv(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 LM(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 fv(e,t="parentId"){let n=Lt(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 hv(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Lt(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=Hn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function $M(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:Lt(a.role,`revealOutputs[${s}].role`),address:Lt(a.address,`revealOutputs[${s}].address`),valueSats:Hn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:mv(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:fv(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 BM(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Lt(n?.role,`commitOutputs[${r}].role`),valueSats:Hn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:mv(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 uv(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 dv(e,t,n){try{return Buffer.from(pv.encode(gM(IM(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 MM(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)=>hv({...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 FM(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");LM(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=Lt(e.network,"network").toLowerCase();if(!vM.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Lt(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=Lt(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=fv(e.parentId??e.parentInscriptionId),a=Lt(e.recipient??e.destination,"recipient"),s=Hn(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(hv);if(new Set(c.map(N=>N.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");MM(e,c);let l=cv(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=cv(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=BM(e.commitOutputs),p=$M(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((N,A)=>N.txid!==c[A].txid||N.vout!==c[A].vout||N.valueSats!==c[A].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");uv(l.outputs,d,"commit PSBT"),uv(u.outputs,p,"reveal PSBT");let m=dv(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,A]of p.entries())if(A.scriptHex!==dv(A.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");RM(u,{contentHash:r,contentType:o,parentId:i});let g=Tm(e.commitFeeRateSatVb,"commitFeeRateSatVb"),b=Tm(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Tm(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||b>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let w=Hn(e.commitFeeSats,"commitFeeSats"),y=Hn(e.revealFeeSats,"revealFeeSats"),k=Hn(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:Hn(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()),T=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(T)||T<=_||T-_>kM)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(lv),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(lv),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:b,maxRate:x,commitFee:w.toString(),revealFee:y.toString(),maxTotalFee:k.toString(),rbf:e.rbf,cpfp:E,expiresAt:T}}function UM(e={},t={}){let n=FM(e,t),r=n.commitInputs.find(s=>iv.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:rv,kind:ov,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...EM},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:rv,kind:ov,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)iv.add(s.outpoint);return a}var gv=UM;var DM=Object.freeze([vr.DISCOVERY,vr.ELIGIBILITY,vr.PREPARATION,vr.SIMULATION]),yv=[["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",Vc.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",Vc.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",Vc.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],wv=Object.freeze(yv.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([vr.DISCOVERY]):DM,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),kj=Im(wv.map(({family:e,tier:t,enabled:n,...r})=>r)),bv=new Map(yv.map(e=>[e[0],e])),HM=new Set(["intent","adapterId","input"]),jM=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Wc=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 Wc(e,t,n?{cause:n}:{})}function z(e,t,n){String(e??"")!==String(t)&&ke("intent-mismatch",`${n} does not match canonical intent`)}function qe(e,t,n){let r=e[t];return r.unit!==n&&ke("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function xv(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))jM.test(n)&&ke("custody-refused",`${t}.${n} is outside the prepare-only boundary`),xv(r,`${t}.${n}`)}function zM(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function VM(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:${qM("sha256").update(JSON.stringify(zM(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 WM(e,t){let n=bv.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 GM(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,qe(e,"mintValueCap","wei"),"mint-value cap"),z(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,qe(e,"networkFeeCap","wei"),"network-fee cap"),z(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,qe(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,qe(e,"mintValueCap","lamports"),"mint-value cap"),z(t.networkFeeCapLamports,qe(e,"networkFeeCap","lamports"),"network-fee cap"),z(t.priorityFeeCapLamports,qe(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,qe(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,qe(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,qe(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function KM(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==tr(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 YM(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=qe(e,"mintValueCap","wei"),o=qe(e,"networkFeeCap","wei"),i=qe(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 JM(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,qe(e,"mintValueCap","lamports"),"mint-value cap");let r=qe(e,"networkFeeCap","lamports"),o=qe(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 XM(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,qe(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,qe(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,qe(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 Nm(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:wv})}async function Sv(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Nm()}}async function kv(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))HM.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"),bv.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"),xv(n);let r;try{r=km(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=WM(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=VM(r,n,r.chain.family,o);GM(r,n);let s;try{i[4]==="evm"?s=await ev(i[5],n,t):i[4]==="opensea"?s=await is(n,t):i[4]==="solana"?(z(n.programId,i[5],"selected Solana adapter program"),s=await tv(n,t)):s=await gv(n,t)}catch(u){if(u instanceof Wc)throw u;ke("adapter-refused",u?.message||"adapter preparation failed",u)}KM(s);let c=i[4]==="bitcoin"?XM(r,n,s):i[4]==="solana"?JM(r,n,s):YM(r,n,s),l=Object.freeze({intentHash:Xk(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 Cm="ROUTE_ONLY",Om=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),Ev=new Set(Object.values(Om)),ZM=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),eF=new Set(["amount","currency"]),tF=new Set(["value","unit"]),nF=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),rF=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 Ao(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 ma(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 Iv(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 Eo(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 Av(e,t){return e=Ao(e,t),ma(e,eF,t),{amount:Iv(e.amount,`${t}.amount`),currency:Te(e.currency,`${t}.currency`)}}function vv(e,t){if(!Array.isArray(e))throw new ye(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>Av(n,`${t}[${r}]`))}function oF(e){if(e=Ao(e,"expiry"),ma(e,tF,"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 iF(e,t,n){Object.hasOwn(e,n)&&(t[n]=Te(e[n],n))}function _v(e){e=Ao(e,"intent"),ma(e,ZM,"intent");let t=Te(e.action,"action");if(!Ev.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"])iF(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=Iv(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=Av(e.price,"price"),n.expiry=oF(e.expiry),n.fees=vv(e.fees,"fees"),n.royalties=vv(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=Te(e.listingId,"listingId")),n}function aF(e){e=Ao(e,"adapter"),ma(e,nF,"adapter");let t=Eo(e.actions,"adapter.actions");for(let o of t)if(!Ev.has(o))throw new ye(`adapter has unknown action ${o}`,"invalid-action");let n=Ao(e.surface,"adapter.surface");ma(n,rF,"adapter.surface");let r=Ao(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(Eo(e.networks,"adapter.networks")),standards:Object.freeze(Eo(e.standards,"adapter.standards")),marketplaces:Object.freeze(Eo(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(Eo(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(Eo(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Cm,custody:"user",surface:Object.freeze({provider:Te(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function sF(e=[]){if(!Array.isArray(e))throw new ye("entries must be an array");let t=e.map(aF);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:Cm,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=_v(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 Io=(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}}),Rm=sF([Io("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"}),Io("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"}),Io("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"}),Io("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Io("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Io("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function Pv(e,{access:t="public",feeProfile:n="default",registry:r=Rm,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=_v(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:Cm,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)})}ie();var Kc="universal-evm-nft-transfer",Tv="evm-nft-safe-transfer",lF=1800*1e3,uF=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),dF=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function Nv(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(dF.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);Nv(r,t)}}}function Lm(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 Er(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 fa=e=>e.toString(16).padStart(64,"0"),Gc=e=>e.slice(2).padStart(64,"0");function pF(e,t,n,r,o){return e==="erc721"?`0x42842e0e${Gc(t)}${Gc(n)}${fa(r)}`:`0xf242432a${Gc(t)}${Gc(n)}${fa(r)}${fa(o)}${fa(160n)}${fa(0n)}`}function mF(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(Nv(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=Er(e.chainId,"chainId",{positive:!0,safe:!0}),o=Lm(e.sender??e.from,"sender"),i=Lm(e.recipient??e.to,"recipient"),a=Lm(e.contract??e.contractAddress??e.tokenContract,"contract"),s=Er(e.tokenId,"tokenId"),c=Er(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(Er(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=Er(e.gasLimit,"gasLimit",{positive:!0}),u=Er(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=Er(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)>lF)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=pF(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 Cv(e={},t={}){let n=mF(e,t),r={provider:Kc,kind:Tv,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...uF},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:Kc,kind:Tv,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}ie();var Yc="universal-solana-nft-transfer",Ov="solana-verified-nft-transfer",Lv="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Ir=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Rv=new Set(Object.values(Ir)),hF=new Set([Ir.token,Ir.token2022]),gF=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),yF=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function ce(e){throw new Error(`solana nft transfer: ${e}`)}function $t(e,t){let n=String(e??"").trim();return n||ce(`${t} required`),n}function Vt(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 $v(e,t="request",n=new Set){if(!(!e||typeof e!="object"||n.has(e))){n.add(e);for(let[r,o]of Object.entries(e))yF.test(r)&&o!=null&&o!==!1&&ce(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),$v(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 wF(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 bF(e,t,n){for(let r of e.accounts){let o=$t(r.pubkey,"account pubkey");t.has(o)||ce(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&ce(`unexpected writable account ${o}`)}}function xF(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ce("request object required"),$v(e),(e.network!=="mainnet-beta"||e.genesisHash!==Lv)&&ce("mainnet genesis/network mismatch"),e.reviewed!==!0&&ce("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=$t(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&ce("standard must be metaplex or core");let n=$t(e.mint??e.asset,"mint/asset"),r=$t(e.collection,"collection");e.collectionVerified!==!0&&ce("verified collection required");let o=$t(e.owner,"owner"),i=$t(e.recipient,"recipient"),a=Vt(e.quantity,"quantity",{positive:!0}),s=Vt(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=$t(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==Ir.core:!hF.has(c))&&ce("reviewed transfer program mismatch");let l=t==="metaplex"?$t(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?$t(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Oe(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Vt(e.decimals??0,"decimals")):null,p=Vt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Vt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Vt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&ce("priority fee exceeds reviewed cap");let g=Vt(e.networkFeeLamports,"networkFeeLamports"),b=Vt(e.networkFeeCapLamports,"networkFeeCapLamports");g>b&&ce("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&ce("transaction object required"),x.version!==0&&x.version!=="legacy"&&ce("transaction version must be 0 or legacy");let w=$t(x.recentBlockhash,"recentBlockhash");Oe(w,e.approvedBlockhash,"blockhash mutation after approval");let y=Vt(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),k=Vt(e.currentBlockHeight,"currentBlockHeight");k>y&&ce("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&ce("canonical instructions required");let v=new Set([o,n,l,u].filter(Boolean)),S=new Set([o,i,n,r,l,u,...Rv].filter(Boolean)),E=0,_=0,T=0,N=0;for(let[A,M]of x.instructions.entries()){let D=$t(M.programId,`instructions[${A}].programId`);Rv.has(D)||ce(`unknown program ${D}`);let C=wF(M,`instructions[${A}]`);bF(M,S,v);let U=String(C.type??C.instruction??"").toLowerCase();D===Ir.computeBudget?U.includes("limit")?(Oe(C.units??C.computeUnitLimit,p,"compute-unit limit"),E++):U.includes("price")?(Oe(C.microLamports??C.computeUnitPriceMicroLamports,m,"compute-unit price"),_++):ce("unsupported compute budget instruction"):D===Ir.associatedToken?((t!=="metaplex"||U!=="createassociatedtokenaccountidempotent")&&ce("non-canonical associated token instruction"),Oe(C.payer,o,"ATA payer"),Oe(C.owner,i,"ATA recipient"),Oe(C.mint,n,"ATA mint"),Oe(C.tokenAccount,u,"recipient ATA"),Oe(C.tokenProgramId,c,"ATA token program"),N++):t==="metaplex"&&D===c?(U!=="transferchecked"&&ce("only canonical transferChecked is allowed"),Oe(C.mint,n,"mint"),Oe(C.owner,o,"owner"),Oe(C.recipient,i,"recipient"),Oe(C.sourceTokenAccount,l,"source token account"),Oe(C.destinationTokenAccount,u,"recipient ATA"),Oe(C.amount,a,"quantity"),Oe(C.decimals,d,"decimals"),T++):t==="core"&&D===Ir.core?(U!=="transfer"&&ce("only canonical Core transfer is allowed"),Oe(C.asset,n,"mint/asset"),Oe(C.collection,r,"collection"),C.collectionVerified!==!0&&ce("verified collection required in Core instruction"),Oe(C.owner,o,"owner"),Oe(C.newOwner,i,"recipient"),Oe(C.amount??1,1,"quantity"),T++):ce(`program ${D} is not valid for ${t} transfer`)}return(E!==1||_!==1)&&ce("exactly one compute-unit limit and price instruction required"),T!==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:x}}function Bv(e={},t={}){let n=xF(e),r=Number(t.nowMs??Date.now()),o={provider:Yc,kind:Ov,chain:"solana-mainnet-beta",genesisHash:Lv,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...gF},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:Yc,kind:Ov,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}ie();var Jc="universal-ordinals-transfer",Mv="bitcoin-ordinals-transfer-plan",Fv=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),kF=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function he(e){throw new Error(`ordinals transfer: ${e}`)}function zn(e,t){let n=String(e??"").trim();return n||he(`${t} required`),n}function jn(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 Uv(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&he(`${t} must be positive`),n}function jv(e,t){let n=zn(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||he(`${t} must be 64 hex`),n}function zv(e,t="inscriptionId"){let n=zn(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||he(`${t} must be canonical`),n}function Vv(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`),Vv(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 Wv(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 qv(e,t){(!e||typeof e!="object"||Array.isArray(e))&&he(`${t} must be an object`),Wv(e,t);let n=jv(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:jn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:zn(e.address,`${t}.address`),sequence:Number(jn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function Dv(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&he(`${t} must be an object`),Wv(e,t),{role:zn(e.role,`${t}.role`),address:zn(e.address,`${t}.address`),valueSats:jn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:zv(e.inscriptionId,`${t}.inscriptionId`)}}}function Hv(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&he(`${n} mismatch; mutation refused`)}function vF(e={}){(!e||typeof e!="object"||Array.isArray(e))&&he("request object required"),Vv(e);let t=zn(e.network,"network").toLowerCase(),n=jv(e.genesisHash,"genesisHash");(!Fv[t]||n!==Fv[t])&&he("network/genesis mismatch");let r=zv(e.inscriptionId),o=qv(e.ownerInput,"ownerInput");zn(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&he("current inscription outpoint mismatch");let i=zn(e.destination,"destination"),a=jn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:Dv(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&he("exact change output invalid");let c=Uv(e.feeRateSatVb,"feeRateSatVb"),l=Uv(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&he("fee rate exceeds reviewed cap");let u=jn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=jn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&he("total fee exceeds reviewed cap");let p=Number(jn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(jn(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"),Hv(qv(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((w,y)=>Dv(w,`psbt.outputs[${y}]`)):he("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};Hv(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 x=h.reduce((w,y)=>w+BigInt(y.valueSats),0n);return BigInt(o.valueSats)!==x+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 Gv(e={},t={}){let n=vF(e);return $({provider:Jc,kind:Mv,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...kF},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:Jc,kind:Mv,env:t.env})}js();_e();function IF(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 Kv(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(!qd(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=IF(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 Yv(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"]}}js();var _F=1440*60*1e3;function PF(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>_F&&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 Jv="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",TF=4663,NF="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Xv="a22cb465",CF="a0712d68";function $m(e){return String(e||"").trim().toLowerCase()}function _o(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function OF(e){let t=_o(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Xv}${t.padStart(64,"0")}${"0".repeat(64)}`}function RF(e){return _o(e).includes(_o(Jv))}function LF(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>_o(n?.data).startsWith(Xv))}function $F(e={},t){let n=_o(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return $m(i[0])!==NF?!1:_o(i[2])===n})}function BF(e=1){return`0x${CF}${BigInt(e).toString(16).padStart(64,"0")}`}function Qv(e={},t={}){let n=$m(e.contract),r=$m(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!==TF&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),RF(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"),LF(s)&&a.push("simulation sets approval / setApprovalForAll"),$F(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:BF(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:OF(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!lw(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=PF(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:Jv.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"]}}ha();import{createHash as FF}from"node:crypto";import{getAddress as iE,isAddress as qm}from"ethers";var eE="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",UF=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),qF=Object.freeze(["lifi"]),tE=/^0x[0-9a-fA-F]{64}$/,DF=/^\d+$/;function Ne(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function nE(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Ne(t,"must be a positive chainId"),n}function Qc(e,t){let n=String(e??"").trim();return(!DF.test(n)||BigInt(n)<=0n)&&Ne(t,"must be a positive integer string"),n}function HF(e,t){return e==null||e===""?null:Qc(e,t)}function rE(e,t){let n=String(e??"").trim();return n.toLowerCase()===eE.toLowerCase()?eE:(qm(n)||Ne(t,"must be an EVM address or native token sentinel"),iE(n))}function aE(e,t){let n=String(e??"").trim();return qm(n)||Ne(t,"must be an EVM address"),iE(n)}function jF(e,t){return e==null||e===""?null:aE(e,t)}function oE(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 zF(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 To(e){if(Array.isArray(e))return e.map(To);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=To(e[n]));return t}return e}function VF(e){return JSON.stringify(To(e))}function Zc(e){return`0x${FF("sha256").update(VF(e)).digest("hex")}`}function sE(e,t){let n={...e};for(let r of t)delete n[r];return n}function WF(e){return Zc(sE(e,["intentHash"]))}function GF(e){return Zc(sE(e,["firmQuoteHash"]))}function Dm(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=nE(e.fromChainId??e.fromChain,"fromChainId"),i=nE(e.toChainId??e.toChain,"toChainId"),s=o===i?UF:qF,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:rE(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:rE(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Qc(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:aE(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:zF(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:HF(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:oE(e.allowedSources,"allowedSources",s),allowedRouters:oE(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)?To(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):Zc({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=WF(c),Object.freeze(c)}function KF(e){return(!e||typeof e!="object"||Array.isArray(e))&&Ne("artifact","required"),e.typedDataHash!=null&&!tE.test(String(e.typedDataHash))&&Ne("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!tE.test(String(e.calldataHash))&&Ne("artifact.calldataHash","must be bytes32"),e.to!=null&&!qm(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"),To(e)}function cE(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=Qc(t.amountOut??t.buyAmount,"amountOut"),s=Qc(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&Ne("minBuyAmount","exceeds amountOut");let c=KF(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=jF(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)?To(t.metadata):{}};return d.quoteId||(d.quoteId=Zc({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=GF(d),Object.freeze(d)}Ii();ha();_i();Ti();nr();function ga(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function lE(e,t){return String(e?.[t]??"").trim()}function ya(e,t){return Object.freeze({source:e,run:t})}function YF(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 ga(e,"lifi")&&a.push(ya("lifi",async()=>{let c=await(r.lifiQuote??Tn)({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 JF(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(ga(e,"paraswap")&&a.push(ya("paraswap",async()=>{let c=await(r.paraswapPrice??mn)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),l=c?.priceRoute??c;return{quoteId:l?.id??null,amountOut:l?.destAmount,minBuyAmount:c?.amountOutMinimum??l?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:l},metadata:{contractAddress:l?.contractAddress??null}}})),ga(e,"0x")&&(lE(n,"ZEROX_API_KEY")||lE(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(ya("0x",async()=>{let c=await(r.zeroxQuote??Cn)({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}}})),ga(e,"cow")&&a.push(ya("cow",async()=>{let c=await(r.cowQuote??on)({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}}})),ga(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(ya("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Xt)({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 JF(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function XF(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function QF(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>XF(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(cE(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 ZF(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 uE(e,t={}){let n=YF(e,t),{quotes:r,failed:o}=await QF(e,n,t),i=ZF(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 dE(e={},t={}){return Dm(e,t)}async function pE(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Dm(e,t);return uE(n,t)}async function mE(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}j();var t4="https://app.across.to";function Hm(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||t4).replace(/\/$/,"")}async function fE(e={}){try{let t=await I(`${Hm(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 hE(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return I(`${Hm(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function gE(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)),I(`${Hm(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var r4="https://api.beefy.finance";function jm(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||r4).replace(/\/$/,"")}async function yE(e={}){try{let t=await I(`${jm(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 wE(e={},t={}){let n=await I(`${jm(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 bE(e={}){return I(`${jm(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}j();var i4="https://public-api.birdeye.so";function xE(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||i4).replace(/\/$/,"")}async function SE(e={}){try{let t=await I(`${xE(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 kE(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 I(`${xE(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var s4="https://api.celenium.io";function zm(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||s4).replace(/\/$/,"")}async function vE(e={}){try{let t=await I(`${zm(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 EE(e={}){return I(`${zm(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function IE(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 I(`${zm(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var l4="https://api.mainnet-beta.solana.com";function u4(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||l4).replace(/\/$/,"")}async function el(e,t,n={}){let r=u4(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 AE(e={}){try{let t=await el("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 _E(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 el("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function PE(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)),el("searchAssets",o,t)}async function TE(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return el("getAssetProof",{id:n},t)}j();var p4="https://api.l2beat.com";function Vm(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||p4).replace(/\/$/,"")}async function NE(e={}){try{let t=await I(`${Vm(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 CE(e={},t={}){let n=await I(`${Vm(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 OE(e={},t={}){return I(`${Vm(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var f4="https://api.spark.fi";function Wm(e={}){return(e.baseUrl||process.env.SPARK_API_URL||f4).replace(/\/$/,"")}async function RE(e={}){try{return{ok:(await I(`${Wm(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 LE(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?I(`${Wm(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):I(`${Wm(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var g4="https://api.symbiotic.fi";function Gm(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||g4).replace(/\/$/,"")}async function $E(e={}){try{let t=await I(`${Gm(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 BE(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await I(`${Gm(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 ME(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return I(`${Gm(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var w4="https://staking-api.polygon.technology/api/v2",b4=18,x4=200,S4=50,k4=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Ym(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||w4).replace(/\/$/,"")}function v4(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 E4(e,t=S4){let n=Number(e??t);return Number.isFinite(n)?Math.min(x4,Math.max(1,Math.trunc(n))):t}function Km(e){let t=Number(e);return Number.isFinite(t)?t/10**b4:null}async function Jm(e,t={}){let n=await I(`${Ym(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 FE(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:Km(e.totalStaked),selfStakePolApprox:Km(e.selfStake),delegatedStakePolApprox:Km(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function UE(e={},t={}){let n=await Jm("/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=k4.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=E4(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(FE)}}async function qE(e={},t={}){let n=v4(e.id??e.validatorId,"id"),o=(await Jm(`/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:{...FE(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 DE(e={}){try{let t=await Jm("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Ym(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Ym(e),error:String(t?.message||t),exec:!1}}}j();var A4="https://api.v3.aave.com/graphql",rz=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),_4=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||A4;async function tl(e,t,n={}){let r=await I(_4(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 P4=`query Markets($request: MarketsRequest!) {
|
|
149
151
|
markets(request: $request) {
|
|
150
152
|
name
|
|
151
153
|
address
|
|
@@ -153,7 +155,7 @@ anchor-lang = "0.31.1"
|
|
|
153
155
|
totalMarketSize
|
|
154
156
|
totalAvailableLiquidity
|
|
155
157
|
}
|
|
156
|
-
}`,
|
|
158
|
+
}`,T4=`query Market($request: MarketRequest!) {
|
|
157
159
|
market(request: $request) {
|
|
158
160
|
name
|
|
159
161
|
address
|
|
@@ -186,7 +188,7 @@ anchor-lang = "0.31.1"
|
|
|
186
188
|
}
|
|
187
189
|
}
|
|
188
190
|
}
|
|
189
|
-
}`,
|
|
191
|
+
}`,N4=`query Chains($filter: ChainsFilter!) {
|
|
190
192
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
191
|
-
}`;function GB(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 sk(e={},t={}){let n={chainIds:GB(e)};return e.user&&(n.user=String(e.user)),{markets:(await Sc(zB,{request:n},t))?.data?.markets??[]}}async function ck(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 Sc(WB,{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 lk(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 Sc(VB,{filter:r},t))?.data?.chains??[]}}async function uk(e={}){return{ok:(await Sc("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}j();var YB="https://staking-api.babylonlabs.io";function Kp(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||YB).replace(/\/$/,"")}function kc(e,t={}){return k(`${Kp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function dk(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 pk(e={}){try{let n=(await kc("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Kp(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Kp(e),error:String(t?.message||t),exec:!1}}}async function mk(e={},t={}){let r=(await kc("/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 fk(e={},t={}){let n=await kc("/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=dk(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 hk(e={},t={}){let n=dk(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 kc(`/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 XB="https://markets.bisq.network";function Yp(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||XB).replace(/\/$/,"")}function gk(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 Ec(e,t={}){return k(`${Yp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function yk(e={}){try{let t=await Ec("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Yp(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Yp(e),error:String(t?.message||t),exec:!1}}}async function wk(e={},t={}){let n=await Ec("/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 bk(e={},t={}){let n=gk(e.market||e.pair||"btc_usd","market"),r=await Ec(`/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 xk(e={},t={}){let n=gk(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 Ec(`/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 rn=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"}}),ZB=new Map([["bob",60808],["rootstock",30],["rsk",30]]),eM=60808;function Vi(e){if(e==null||e==="")return eM;let t=ZB.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!rn[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(rn).join(", ")} / bob, rootstock)`);return n}function Jp(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Vi(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||rn[n].url).replace(/\/$/,"")}function vk(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 Ac(e,t,n={}){return k(`${Jp(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Sk(e={},t={}){let n;try{n=Vi(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=rn[n];try{let o=await Ac(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Jp(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:Jp(n,e),error:String(o?.message||o),exec:!1}}}async function Xp(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(rn).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Xp({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:rn[c].name,error:String(l?.message||l)}}}))}}let r=Vi(n),o=rn[r],i=await Ac(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 kk(e={},t={}){let n=Vi(e.chainId??e.chain),r=vk(e.address||e.addr,"address"),o=rn[n],i=await Ac(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 Ek(e={},t={}){let n=Vi(e.chainId??e.chain),r=vk(e.address||e.addr,"address"),o=await Ac(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:rn[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 nM="https://insights.braiins.com/api/v1.0";function Qp(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||nM).replace(/\/$/,"")}function Zp(e,t={}){return k(`${Qp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Ak(e={}){try{let t=await Zp("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Qp(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Qp(e),error:String(t?.message||t),exec:!1}}}async function Ik(e={},t={}){let n=await Zp("/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 _k(e={},t={}){let n=await Zp("/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 oM="https://api.cow.fi",Pk=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function Tk(e={}){return(e.baseUrl||process.env.COW_API_URL||oM).replace(/\/$/,"")}function iM(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=Pk[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(Pk).join(", ")})`);return n}function em(e,t,n){return`${Tk(n)}/${iM(e)}/api/v1${t}`}function Ck(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 Nk(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function Ok(e={},t={}){return k(em(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Rk(e={},t={}){let n=Ck(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(Nk(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await k(`${em(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 $k(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",Ck(e.owner||e.address||e.user,"owner"));let r=await k(`${em(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,Nk(e))}}async function Lk(e={}){let t=await k(`${Tk(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 sM="https://api.hiro.so",cM=20;function tm(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||sM).replace(/\/$/,"")}function lM(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Gi(e,t={}){return k(`${tm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:lM(t)})}async function Bk(e={}){try{let t=await Gi("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:tm(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:cM,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:tm(e),error:String(t?.message||t),exec:!1}}}async function Mk(e={},t={}){let n=await Gi("/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 Fk(e={},t={}){let n=await Gi("/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 Uk(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Gi(`/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 qk(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Gi(`/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 dM="https://bundles.jito.wtf",Hk=1e9;function nm(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||dM).replace(/\/$/,"")}function pM(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function Dk(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*Hk):null}function mM(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/Hk:null,raw:e}}async function jk(e={}){try{let t=await k(`${nm(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function zk(e={},t={}){let n=pM(e.limit,5,100),r=new URL(`${nm(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await k(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(mM),s=a.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:a.length,totalTipLamports:s.reduce((c,l)=>c+l,0),maxTipLamports:s.length?Math.max(...s):null,bundles:a}}async function Wk(e={}){let t=await k(`${nm(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,Dk(i)])),suggestedTipLamports:Dk(r.p75||r.p50),raw:n}}j();var hM="https://api.kamino.finance";function gM(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||hM).replace(/\/$/,"")}function ct(e){let t=Number(e);return Number.isFinite(t)?t:null}function Vk(e={}){let t=ct(e.totalValueLocked)??0,n=ct(e.apy?.totalApy)??0,r=ct(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:ct(e.sharePrice),sharesIssued:ct(e.sharesIssued),profitAndLoss:ct(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:ct(e.apy?.vault?.totalApr),apy24h:ct(e.kaminoApy?.vault?.apy24h),apy7d:ct(e.kaminoApy?.vault?.apy7d),apy30d:ct(e.kaminoApy?.vault?.apy30d),poolPrice:ct(e.apy?.vault?.poolPrice),priceLower:ct(e.apy?.vault?.priceLower),priceUpper:ct(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function rm(e={},t={}){let n=new URL(`${gM(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function Gk(e={}){try{let t=await rm({},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 Kk(e={},t={}){let r=(await rm(e,t)).map(Vk),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 Yk(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await rm({...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",...Vk(o),raw:o}}j();var wM="https://blockstream.info/liquid/api",Jk="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ic(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||wM).replace(/\/$/,"")}function bM(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 xM(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 Xk(e,t={}){let n=`${Ic(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 Qk(e,t={}){return k(`${Ic(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Zk(e={}){try{let t=await Xk("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ic(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ic(e),error:String(t?.message||t),exec:!1}}}async function eE(e={},t={}){let n=await Xk("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function tE(e={},t={}){let n=bM(e.address||e.addr,"address"),r=await Qk(`/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 nE(e={},t={}){let n=xM(e.assetId||e.asset||Jk,"assetId"),r=await Qk(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Jk,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 SM="https://api-mainnet.magiceden.dev/v2/ord/btc",kM=600;function om(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||SM).replace(/\/$/,"")}function EM(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function rE(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 oE(e,t={}){return k(`${om(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:EM(t),retries:t.retries??1})}async function iE(e={}){let t=rE(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await oE(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:om(e),probeCollection:t,rateLimitRpm:kM,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:om(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function aE(e={},t={}){let n=rE(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await oE(`/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 IM="https://mempool.space/api",_M=7;function im(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||IM).replace(/\/$/,"")}function _c(e,t={}){return k(`${im(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function sE(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>_M}}async function cE(e={}){try{let n=(await _c("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=sE(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:im(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:im(e),error:String(t?.message||t),exec:!1}}}async function lE(e={},t={}){let r=(await _c("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=sE(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 uE(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 _c(`/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 dE(e={},t={}){let n=await _c("/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 TM="https://mempool.space/api",pE=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function am(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||TM).replace(/\/$/,"")}function mE(e,t){let n=String(e||t).trim().toLowerCase();if(!pE.has(n))throw new Error(`mempool-mining: window must be one of ${[...pE].join(", ")}`);return n}function Ki(e,t={}){return k(`${am(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function fE(e={}){try{let t=await Ki("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:am(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:am(e),error:String(t?.message||t),exec:!1}}}async function hE(e={},t={}){let n=await Ki("/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 gE(e={},t={}){let n=mE(e.window||e.timeframe,"1w"),r=await Ki(`/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 yE(e={},t={}){let n=mE(e.window||e.timeframe,"3d"),r=await Ki(`/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 wE(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Ki(`/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 NM="https://amm-v2.meteora.ag",bE=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),xE=new Set(["dynamic","multitoken","lst","farms"]),OM=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function RM(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||NM).replace(/\/$/,"")}function Ke(e){let t=Number(e);return Number.isFinite(t)?t:null}function $M(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:Ke(e.pool_lp_price_in_usd),tvlUsd:Ke(e.pool_tvl),farmTvlUsd:Ke(e.farm_tvl),volume24hUsd:Ke(e.trading_volume),volume7dUsd:Ke(e.weekly_trading_volume),fee24hUsd:Ke(e.fee_volume),fee7dUsd:Ke(e.weekly_fee_volume),tradeApyPct:Ke(e.trade_apy),weeklyTradeApyPct:Ke(e.weekly_trade_apy),baseApyPct:Ke(e.daily_base_apy),farmingApyPct:Ke(e.farming_apy),totalApyPct:(Ke(e.trade_apy)??0)+(Ke(e.farming_apy)??0),aprPct:Ke(e.apr),feePct:Ke(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 LM(e={},t={}){let n=new URL(`${RM(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(!bE.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...bE].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(!xE.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...xE].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(!OM.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 sm(e={},t={}){let{url:n,page:r,size:o}=LM(e,t),i=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map($M),totalCount:i?.total_count??null,page:r,size:o}}async function vE(e={}){try{let{pools:t,totalCount:n}=await sm({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 SE(e={},t={}){let n=await sm({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,a)=>i+(a.tvlUsd??0),0),pools:r}}async function kE(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await sm({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 MM="https://ordinals.com";function Pc(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||MM).replace(/\/$/,"")}function FM(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 EE(e,t={}){let n=`${Pc(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 cm(e,t={}){return k(`${Pc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function AE(e={}){try{let t=await EE("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Pc(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Pc(e),error:String(t?.message||t),exec:!1}}}async function IE(e={},t={}){let n=await EE("/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 _E(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 cm(`/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 PE(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 cm(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 TE(e={},t={}){let n=FM(e.name||e.rune||e.runeName,"name"),r=await cm(`/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 qM="https://hermes.pyth.network",um={"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"},DM=/^[0-9a-fA-F]{64}$/;function CE(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||qM).replace(/\/$/,"")}function NE(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=um[n.toUpperCase()]||um[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!DM.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 lm(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function dm(e={}){let t=lm({price:Number(e.price?.conf),expo:e.price?.expo}),n=lm(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:lm(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 pm(e,t={}){let n=new URL(`${CE(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function OE(e={}){try{let t=await pm([um["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(dm):[])[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 RE(e={},t={}){let n=NE(e.feedId||e.id||e.symbol,"feedId"),r=await pm([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(dm):[],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 $E(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>NE(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 pm(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(dm):[]),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 LE(e={},t={}){let n=new URL(`${CE(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}j();var jM="https://relayscan.io",BE=new Set(["1h","12h","24h","7d"]);function mm(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||jM).replace(/\/$/,"")}function ME(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!BE.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...BE].join(", ")}`);return t}function zM(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 fm(e={},t={}){return k(`${mm(t)}/overview/json?t=${ME(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function FE(e={},t={}){return k(`${mm(t)}/builder-profit/json?t=${ME(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function UE(e={},t={}){let n=zM(e);return k(`${mm(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function qE(e={}){let t=await fm({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 VM="https://extra-api.sanctum.so",GM=30,KM=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function hm(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||VM).replace(/\/$/,"")}function DE(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 YM(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function dr(e,t,n={}){let r={},o={};for(let i of YM(t,GM)){let a=new URL(`${hm(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await k(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function HE(e={}){try{let[t,n]=await Promise.all([k(`${hm(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),dr("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 gm(e={},t={}){let n=await k(`${hm(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 jE(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await gm({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=KM);let r=[...new Set(n.map(s=>DE(s,"lsts[]")))],[o,i]=await Promise.all([dr("apy/latest",r,t),dr("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 zE(e={},t={}){let n=DE(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([dr("apy/latest",[n],t),dr("apy/inception",[n],t),dr("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),dr("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 XM="https://api.save.finance",QM="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",WE="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",ZM=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function ym(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||XM).replace(/\/$/,"")}function VE(e,t="address"){let n=String(e??"").trim();if(!ZM.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function GE(e){let t=Number(e);return Number.isFinite(t)?t:null}function eF(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function tF(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:GE(e.rates?.supplyInterest),borrowApyPct:GE(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 KE(e={}){try{let t=await k(`${ym(e)}/v1/reserves?ids=${WE}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:WE,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function wm(e={},t={}){let n=new URL(`${ym(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(eF);if(e.includeHidden!==!0&&(o=o.filter(a=>!a.hidden)),e.name){let a=String(e.name).toLowerCase();o=o.filter(s=>String(s.name||"").toLowerCase()===a)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function YE(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=>VE(String(s).trim(),"reserve"));else{let a=VE(e.market||e.marketAddress||QM,"market"),c=(await wm({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===a);if(!c)throw new Error(`solend-lending: market ${a} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await k(`${ym(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...tF(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 bm(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 pr(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function Yi(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:bm(e.amount,"amount")}}function xm(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 Ji(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 vm(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 rF(e={},t={}){let n=Yi(e),r=pr(e.slices??10,"slices",2,100),o=pr(e.durationSec??3600,"durationSec",r,604800),i=xm(n.total,Array(r).fill(1));return Ji(n,"TWAP",vm(i,o,t.nowMs),{durationSec:o})}function oF(e={},t={}){let n=Yi(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=pr(e.durationSec??3600,"durationSec",r.length,604800),i=xm(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=vm(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return Ji(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function iF(e={}){let t=Yi(e),n=pr(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=bm(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 Ji(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function aF(e={}){let t=Yi(e),n=bm(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 Ji(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function sF(e={},t={}){let n=Yi(e),r=pr(e.slices??10,"slices",2,100),o=pr(e.durationSec??3600,"durationSec",r,604800),i=pr(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=xm(n.total,a);return Ji(n,"IS",vm(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function JE(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return rF(e,t);if(n==="VWAP")return oF(e,t);if(n==="POV")return iF(e,t);if(n==="ICEBERG")return aF(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return sF(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function XE(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var rA=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 tA(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Tp,adapters:Object.freeze(Cp.adapters.map(e=>{let t=rA[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function EF(e,t={}){let n=Gv(e,t),r=rA[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new fe(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var AF={"hl-info":{health:e=>Vh(e),allMids:e=>Vt(e),l2Book:(e,t={})=>Ar(t.coin,e),outcomeMeta:e=>jo(e),clearinghouse:(e,t={})=>Ua(t.user,e),userFills:(e,t={})=>Gh(t.user,e),meta:e=>qa(e),metaAndAssetCtxs:e=>dt(e),candleSnapshot:(e,t={})=>Ir(t,e),openOrders:(e,t={})=>Kh(t.user,e),frontendOpenOrders:(e,t={})=>Yh(t.user,e),userState:(e,t={})=>_r(t.user,e),spotMeta:e=>Ha(e)},"hl-vaults":{health:e=>Qh(e),summaries:(e,t={})=>Hl(t,e),details:(e,t={})=>ja(t,e),userEquities:(e,t={})=>jl(t,e),tracker:(e,t={})=>zl(t,e)},"hl-precompiles":{health:e=>e0(e),read:(e,t={})=>Zh(t,e),l1BlockNumber:e=>za(e),markPx:(e,t={})=>Gl(t,e),oraclePx:(e,t={})=>Kl(t,e),spotPx:(e,t={})=>Yl(t,e),position:(e,t={})=>Jl(t,e),spotBalance:(e,t={})=>Xl(t,e),vaultEquity:(e,t={})=>Ql(t,e),withdrawable:(e,t={})=>Zl(t,e)},"hl-delta-neutral":{health:()=>k0(),scan:(e,t={})=>bu(t,e),quote:(e,t={})=>xu(t,e),prepare:(e,t={})=>vu(t,e),loop:(e,t={})=>C0(t,e)},"lighter-delta-neutral":{health:()=>M0(),scan:(e,t={})=>ku(t,e),quote:(e,t={})=>Eu(t,e),prepare:(e,t={})=>Au(t,e),loop:(e,t={})=>W0(t,e)},"poly-public":{health:e=>G0(e),time:e=>Iu(e),markets:(e,t={})=>K0(t,e),book:(e,t={})=>Y0(t.tokenId,e),midpoint:(e,t={})=>J0(t.tokenId,e),spread:(e,t={})=>X0(t.tokenId,e),price:(e,t={})=>Q0(t.tokenId,{side:t.side},e),events:(e,t={})=>Z0(t,e)},"evm-rpc":{health:(e,t={})=>br(t.chainId??1,e),healthAll:(e,t={})=>sl({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Io(t.chainId??1,e),chainId:(e,t={})=>ol(t.chainId??1,e),getBalance:(e,t={})=>Dn(t.chainId??1,t.address,e),call:(e,t={})=>W(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>al(t,e),erc20Balance:(e,t={})=>_o(t,e),transactionReceipt:(e,t={})=>Po(t,e)},portfolio:{health:e=>Dx(e),balances:(e,t={})=>oc(t,e),snapshot:(e,t={})=>av(t,e),history:(e,t={})=>mp(t,e),valueGraph:(e,t={})=>sv(t,e)},"nft-portfolio":{health:e=>Kx(e),inventory:(e,t={})=>to(t,e),gallery:(e,t={})=>Qx(t,e),pnl:(e,t={})=>Xx(t,e),prepareList:(e,t={})=>Yx(t,e),traitSnipe:(e,t={})=>Jx(t,e)},"contract-risk":{health:e=>cv(e),scan:(e,t={})=>ar(t,e)},"evm-token-sniper":{health:e=>dv(e),scan:(e,t={})=>uv(t,e)},"evm-simulate":{health:e=>mv(e),simulate:(e,t={})=>Ui(t,e)},"nft-mint":{health:e=>hv(e),discover:(e,t={})=>uc(t,e),prepare:(e,t={})=>gp(t,e),priceGas:(e,t={})=>lc(t,e),createTrigger:(e,t={})=>mS(t,e),checkOpen:(e,t={})=>fS(t,e),evaluateMancerOs:(e,t={})=>yS(t,e)},"universal-mint-router":{health:()=>qv(),capabilities:()=>_p(),prepare:(e,t={})=>Dv(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:tA()}),capabilities:()=>tA(),route:(e,t={})=>EF(t,e)},"erc8004-identity":{health:()=>aw(),prepareIdentityRegistration:(e,t={})=>lw(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>uw(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>pw(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:hc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Jv(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:gc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>tS(t,e)},"universal-ordinals-transfer":{health:()=>({provider:yc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>pS(t,e)},"solana-rpc":{health:e=>tg(e),latestBlockhash:(e,t={})=>Pu(t,e),getBalance:(e,t={})=>es(t,e),tokenAccounts:(e,t={})=>ri(t,e),simulate:(e,t={})=>ng(t,e)},"bitcoin-esplora":{health:e=>rg(e),tipHeight:e=>og(e),fees:e=>ig(e),address:(e,t={})=>ns(t,e),utxos:(e,t={})=>ag(t,e),tx:(e,t={})=>sg(t,e),decode:(e,t={})=>cg(t,e)},"bitcoin-meta":{health:e=>ug(e),runeBalances:(e,t={})=>os(t,e),inscriptions:(e,t={})=>Lr(t,e),inscriptionInfo:(e,t={})=>dg(t,e),inscriptionChildren:(e,t={})=>pg(t,e),ordBlockInfo:(e,t={})=>mg(t,e)},satflow:{health:e=>hg(e),collectionFloors:(e,t={})=>gg(t,e),collectionStats:(e,t={})=>yg(t,e),item:(e,t={})=>wg(t,e),walletContents:(e,t={})=>as(t,e),floorListings:(e,t={})=>bg(t,e),preparePurchase:(e,t={})=>vg(t,e),prepareList:(e,t={})=>ss(t,e)},jupiter:{health:e=>Tg(e),venues:(e,t={})=>Pg(t,e),quote:(e,t={})=>us(t,e),prepare:(e,t={})=>Cg(t,e)},defillama:{health:e=>Og(e),prices:(e,t={})=>At(t.coins||[],e),pricesBySymbol:(e,t={})=>Lg(t.symbols,e),protocols:e=>Uu(e),yields:(e,t={})=>Rg(t,e),stablecoins:(e,t={})=>ds(t,e),dexVolumes:(e,t={})=>$g(t,e)},lifi:{health:e=>ju(e),quote:(e,t={})=>bn(t,e),prepare:(e,t={})=>zu(t,e),chains:e=>Wu(e)},dexscreener:{health:e=>qf(e),token:(e,t={})=>Hn(t.address||t.tokenAddress,e),search:(e,t={})=>To(t.q||t.query,e),pair:(e,t={})=>Df(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>yl({...e,chainId:t.chainId??8453}),quote:(e,t={})=>zt(t,e),prepare:(e,t={})=>gl(t,e),quotePath:(e,t={})=>hl(t,e),ethUsdc:(e,t={})=>va(t,e),chains:()=>wl()},"uniswap-v4":{health:(e,t={})=>El({...e,chainId:t.chainId??8453}),quote:(e,t={})=>ln(t,e),chains:()=>kl()},aerodrome:{health:(e,t={})=>Wg({...e,chainId:t.chainId??8453}),quote:(e,t={})=>ms(t,e),prepare:(e,t={})=>zg(t,e),chains:()=>Vg()},zerox:{health:e=>Gu(e),price:(e,t={})=>hs(t,e),quote:(e,t={})=>vn(t,e),prepare:(e,t={})=>Ku(t,e)},across:{health:e=>Xg(e),suggestedFees:(e,t={})=>Ju(t,e)},hop:{health:e=>Qg(e),quote:(e,t={})=>Xu(t,e)},relay:{health:e=>Zg(e),quote:(e,t={})=>gs(t,e),prepare:(e,t={})=>ey(t,e)},cowswap:{health:e=>nd(e),quote:(e,t={})=>Xt(t,e),prepareOrder:(e,t={})=>rd(t,e),order:(e,t={})=>vs(t,e),status:(e,t={})=>xs(t,e),chains:()=>od()},oneinch:{health:e=>dy(e),quote:(e,t={})=>di(t,e),prepare:(e,t={})=>py(t,e),approveSpender:(e,t={})=>cd(t,e)},"hl-ws":{health:e=>my(e),allMids:e=>fy(e),l2Book:(e,t={})=>hy(t.coin,e),snapshot:(e,t={})=>pi(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>gy({...e,assetId:t.assetId}),book:(e,t={})=>yy(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Ss(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>vh(e),collection:(e,t={})=>Lo(t.slug,e),floor:(e,t={})=>Sh(t.slug,e),bestListings:(e,t={})=>Cl(t,e),bestListing:(e,t={})=>Ca(t,e),bestOffer:(e,t={})=>Na(t,e),accountNfts:(e,t={})=>Bo(t,e),accountPnl:(e,t={})=>Pa(t,e),prepareBuy:(e,t={})=>$h(t,e),prepareSweep:(e,t={})=>Lh(t,e),prepareMint:(e,t={})=>Ra(t,e),prepareList:(e,t={})=>$a(t,e),prepareCancel:(e,t={})=>Bh(t,e)},"anvil-nft":{health:(e,t={})=>tw(t,e),markets:(e,t={})=>Ur(t,e),quoteSpecificBuy:(e,t={})=>fi(t,e),quoteSell:(e,t={})=>As(t,e),scanCollection:(e,t={})=>Is(t,e),scanAllMarkets:(e,t={})=>Gy(t,e),scanCrossVenueArb:(e,t={})=>hd(t,e),scanAllMarketsArb:(e,t={})=>Ky(t,e),prepareSpecificBuy:(e,t={})=>qy(t,e),prepareSell:(e,t={})=>Dy(t,e)},stonkbrokers:{health:(e,t={})=>nw(t,e),quoteBrokerBuy:(e,t={})=>_s(t,e),scanBrokerLoot:(e,t={})=>Xy(t,e),prepareBrokerBuy:(e,t={})=>Qy(t,e),brokerDesk:(e,t={})=>ew(t,e),clockInStatus:(e,t={})=>hi(t,e),prepareClockIn:(e,t={})=>Zy(t,e)},"hl-outcome":{list:e=>ob(e),prepareOrder:(e,t={})=>ib(t,e),prepareCancel:(e,t={})=>ab(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Gs().map(e=>e.id),nativeTemplates:Ni().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Gs(),listNative:()=>Ni(),gate:(e,t={})=>Ti(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Mb(t,e),buildNative:(e,t={})=>Oi(t),eval:async()=>(await Promise.resolve().then(()=>(eA(),ZE))).runContractsEval()},"poly-clob":{health:()=>xb(),prepareOrder:(e,t={})=>vb(t||{},e)},"hl-perps":{health:e=>Cd(e),assetInfo:(e,t={})=>hn(t,e),prepareOrder:(e,t={})=>Nr(t,e),prepareCancel:(e,t={})=>Zo(t,e),prepareLeverage:(e,t={})=>hu(t,e),prepareIsolatedMargin:(e,t={})=>gu(t,e),prepareBracket:(e,t={})=>yu(t,e),prepareBuilderApproval:(e,t={})=>fu(t,e)},"hl-markets":{health:e=>Cd(e),markets:(e,t={})=>Rs(t,e),leaderboards:(e,t={})=>Ow(t,e),coin:(e,t={})=>Rw(t,e),spot:(e,t={})=>$w(t,e)},"hl-entry-state":{health:e=>eb(e),see:(e,t={})=>ki(t,e),qualify:(e,t={})=>tb(t,e),lock:(e,t={})=>nb(t,e),list:e=>Rd(e),watch:(e,t={})=>rb(t,e)},"magiceden-sol":{health:e=>ww(e),stats:(e,t={})=>Sd(t,e),listings:(e,t={})=>xw(t,e),tokenListings:(e,t={})=>vw(t,e),prepareBuy:(e,t={})=>Sw(t,e),prepareList:(e,t={})=>Ns(t,e),prepareMint:(e,t={})=>kw(t,e)},"hl-staking":{health:e=>Aw(e),validators:e=>Ad(e),delegatorSummary:(e,t={})=>Id(t,e),delegations:(e,t={})=>_d(t,e),rewards:(e,t={})=>Iw(t,e),history:(e,t={})=>_w(t,e),preflight:(e,t={})=>Nw(t,e),prepareStakeDeposit:(e,t={})=>Pw(t,e),prepareStakeWithdraw:(e,t={})=>Tw(t,e),prepareDelegate:(e,t={})=>Cw(t,e)},"hyperevm-dex":{health:e=>fw(e),search:(e,t={})=>hw(t.q||t.query||"HYPE",e),token:(e,t={})=>gw(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Kb(e),networks:(e,t={})=>jd(t,e),pool:(e,t={})=>Wb(t,e),token:(e,t={})=>Vb(t,e),ohlcv:(e,t={})=>Gb(t,e)},curve:{health:e=>sx(e),openapi:e=>ax(e),pools:(e,t={})=>Wd(t,e),quote:(e,t={})=>Vd(t,e),prepare:(e,t={})=>cx(t,e)},gmx:{health:e=>Ww(e),tickers:(e,t={})=>Yr(t,e),markets:(e,t={})=>jw(t,e),marketsInfo:(e,t={})=>Od(t,e),tokens:(e,t={})=>zw(t,e),prepareOrder:(e,t={})=>Yw(t,e),positions:(e,t={})=>Vw(t,e),orderStatus:(e,t={})=>Gw(t,e),verifyOrder:(e,t={})=>Kw(t,e)},morpho:{health:e=>px(e),markets:(e,t={})=>dx(t,e),vaults:(e,t={})=>Yd(t,e),prepareVault:(e,t={})=>mx(t,e)},balancer:{health:e=>vx(e),pools:(e,t={})=>xx(t,e),quote:(e,t={})=>Qd(t,e),prepare:(e,t={})=>Sx(t,e)},pendle:{health:e=>Ex(e),markets:(e,t={})=>ep(t,e),quote:(e,t={})=>Ax(t,e),prepare:(e,t={})=>tp(t,e)},odos:{health:e=>Tx(e),chains:e=>rp(e),quote:(e,t={})=>_x(t,e),prepare:(e,t={})=>Px(t,e)},blockscout:{health:e=>Mx(e),stats:(e,t={})=>ap(t,e),address:(e,t={})=>Rx(t,e),token:(e,t={})=>$x(t,e)},paraswap:{health:e=>Lp(e),tokens:(e,t={})=>wc(t,e),price:(e,t={})=>nn(t,e),quote:(e,t={})=>nn(t,e),prepare:(e,t={})=>$p(t,e)},rfq:{health:e=>OS(e),intent:(e,t={})=>CS(t,e),quote:(e,t={})=>NS(t,e)},"polygon-staking":{health:e=>ak(e),validators:(e,t={})=>ok(t,e),validatorDetail:(e,t={})=>ik(t,e)},"aave-v3":{health:e=>uk(e),markets:(e,t={})=>sk(t,e),marketReserves:(e,t={})=>ck(t,e),chains:e=>lk(e)},"babylon-staking":{health:e=>pk(e),stats:e=>mk(e),finalityProviders:e=>fk(e),delegations:(e,t={})=>hk(t,e)},"bisq-markets":{health:e=>yk(e),markets:e=>wk(e),ticker:(e,t={})=>bk(t,e),trades:(e,t={})=>xk(t,e)},"bob-rootstock":{health:(e,t={})=>Sk(t.chainId,e),stats:(e,t={})=>Xp(t,e),addressInfo:(e,t={})=>kk(t,e),tokenBalances:(e,t={})=>Ek(t,e)},"braiins-insights":{health:e=>Ak(e),priceStats:e=>Ik(e),poolStats:e=>_k(e)},"cow-protocol":{health:e=>Lk(e),auction:e=>Ok(e),openOrders:(e,t={})=>Rk(t,e),recentTrades:(e,t={})=>$k(t,e)},"hiro-stacks":{health:e=>Bk(e),networkInfo:e=>Mk(e),stackingInfo:e=>Fk(e),poxCycles:e=>Uk(e),blocks:(e,t={})=>qk(t,e)},"jito-mev":{health:e=>jk(e),recentBundles:(e,t={})=>zk(t,e),tipFloor:e=>Wk(e)},"kamino-strategies":{health:e=>Gk(e),strategies:(e,t={})=>Kk(t,e),strategyMetrics:(e,t={})=>Yk(t,e)},"liquid-esplora":{health:e=>Zk(e),tipHeight:e=>eE(e),addressInfo:(e,t={})=>tE(t,e),assetInfo:(e,t={})=>nE(t,e)},"magiceden-ordinals":{health:e=>iE(e),collectionStat:(e,t={})=>aE(t,e)},"mempool-lightning":{health:e=>cE(e),statistics:e=>lE(e),nodeRankings:(e,t={})=>uE(t,e),nodeCountries:e=>dE(e)},"mempool-mining":{health:e=>fE(e),difficulty:e=>hE(e),poolShare:(e,t={})=>gE(t,e),hashrate:(e,t={})=>yE(t,e),rewardStats:(e,t={})=>wE(t,e)},"meteora-dlmm":{health:e=>vE(e),pools:(e,t={})=>SE(t,e),poolSearch:(e,t={})=>kE(t,e)},"ordinals-runes":{health:e=>AE(e),blockHeight:e=>IE(e),blockInfo:(e,t={})=>_E(t,e),satInfo:(e,t={})=>PE(t,e),runeInfo:(e,t={})=>TE(t,e)},"pyth-price-feeds":{health:e=>OE(e),latestPrice:(e,t={})=>RE(t,e),latestPrices:(e,t={})=>$E(t,e),feedDirectory:e=>LE(e)},"relayscan-mev":{health:e=>qE(e),overview:(e,t={})=>fm(t,e),builderProfit:(e,t={})=>FE(t,e),dailyStats:(e,t={})=>UE(t,e)},"sanctum-lst":{health:e=>HE(e),lstList:e=>gm(e),apyAll:e=>jE(e),apyIndividual:(e,t={})=>zE(t,e)},"solend-lending":{health:e=>KE(e),markets:e=>wm(e),reserves:(e,t={})=>YE(t,e)},"execution-strategies":{health:()=>XE(),plan:(e,t={})=>JE(t)},"across-bridge":{health:e=>RS(e),pools:(e,t={})=>$S(t,e),suggestedFees:(e,t={})=>LS(t,e)},"beefy-yields":{health:e=>BS(e),apy:(e,t={})=>MS(t,e),apyBreakdown:e=>FS(e)},"birdeye-tokens":{health:e=>qS(e),tokenList:(e,t={})=>DS(t,e)},"celestia-da":{health:e=>HS(e),stats:e=>jS(e),blockStats:(e,t={})=>zS(t,e)},"das-assets":{health:e=>WS(e),assetsByOwner:(e,t={})=>VS(t,e),searchAssets:(e,t={})=>GS(t,e),assetProof:(e,t={})=>KS(t,e)},"l2beat-tvl":{health:e=>YS(e),tvl:(e,t={})=>JS(t,e),activity:(e,t={})=>XS(t,e)},"spark-lend":{health:e=>QS(e),markets:(e,t={})=>ZS(t,e)},"symbiotic-restaking":{health:e=>ek(e),vaults:(e,t={})=>tk(t,e),vaultDetail:(e,t={})=>nk(t,e)}},nA=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),oA=new Set(["hl-exec"]);function Sm(e){return oA.has(String(e||""))}function IF(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(oA.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=Fa().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!nA.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(nA.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let a=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(a))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${a||"<missing>"}`)}}async function _(e,t,n={},r={}){if(Sm(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.`);IF(e,t,n);let o=Ho(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=AF[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function km({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||Fa().map(d=>d.id);!o&&!e&&(s=s.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof a=="function"?a:(d,p,m)=>_(d,"health",p,m),u={};return await Xe(s,i??8,async d=>{if(!Ho(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await Oe(()=>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 iA(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function _F(e){return e.execution==="prepare"&&iA(e).length?"armed-local":e.execution||"read-only"}function Cc(){return Fa().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:_F(e),localSignerSurfaces:iA(e),description:e.description}))}var aA={catalog:Cc,health:km,call:_,hl:{health:e=>_("hl-info","health",{},e),allMids:e=>_("hl-info","allMids",{},e),l2Book:(e,t)=>_("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>_("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>_("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>_("hl-info","userFills",{user:e},t),meta:e=>_("hl-info","meta",{},e),metaAndAssetCtxs:e=>_("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>_("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>_("hl-info","openOrders",{user:e},t),userState:(e,t)=>_("hl-info","userState",{user:e},t),spotMeta:e=>_("hl-info","spotMeta",{},e),vaults:{health:e=>_("hl-vaults","health",{},e),summaries:(e,t)=>_("hl-vaults","summaries",e||{},t),details:(e,t)=>_("hl-vaults","details",e||{},t),mine:(e,t)=>_("hl-vaults","userEquities",{user:e},t),track:(e,t)=>_("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>_("hl-entry-state","see",e||{},t),qualify:(e,t)=>_("hl-entry-state","qualify",e||{},t),lock:(e,t)=>_("hl-entry-state","lock",e||{},t),list:e=>_("hl-entry-state","list",{},e),watch:(e,t)=>_("hl-entry-state","watch",e||{},t)},staking:{health:e=>_("hl-staking","health",{},e),validators:e=>_("hl-staking","validators",{},e),summary:(e,t)=>_("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>_("hl-staking","delegations",{user:e},t),rewards:(e,t)=>_("hl-staking","rewards",{user:e},t),history:(e,t)=>_("hl-staking","history",{user:e},t),preflight:(e,t)=>_("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>_("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>_("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>_("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>_("poly-public","health",{},e),time:e=>_("poly-public","time",{},e),markets:(e,t)=>_("poly-public","markets",e||{},t),book:(e,t)=>_("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>_("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>_("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>_("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>_("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>_("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>_("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>_("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>_("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>_("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>_("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>_("evm-token-sniper","health",{},e),scan:(e,t)=>_("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>_("portfolio","balances",e||{},t),snapshot:(e,t)=>_("portfolio","snapshot",e||{},t),history:(e,t)=>_("portfolio","history",e||{},t),valueGraph:(e,t)=>_("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>_("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>_("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>_("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>_("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>_("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>_("opensea-nft","floor",{slug:e},t),collection:(e,t)=>_("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>_("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>_("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>_("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>_("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>_("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>_("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>_("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>_("universal-mint-router","health",{},e),capabilities:e=>_("universal-mint-router","capabilities",{},e),prepare:(e,t)=>_("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>_("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>_("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>_("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>_("solana-rpc","health",{},e),latestBlockhash:(e,t)=>_("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>_("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>_("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>_("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>_("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>_("jupiter","prepare",e||{},t),nftStats:(e,t)=>_("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>_("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>_("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>_("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>_("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>_("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>_("bitcoin-esplora","health",{},e),tipHeight:e=>_("bitcoin-esplora","tipHeight",{},e),fees:e=>_("bitcoin-esplora","fees",{},e),address:(e,t)=>_("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>_("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>_("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>_("bitcoin-esplora","decode",e||{},t),metaHealth:e=>_("bitcoin-meta","health",{},e),runeBalances:(e,t)=>_("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>_("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>_("satflow","health",{},e),satflowFloors:(e,t)=>_("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>_("satflow","walletContents",{address:e},t)},prices:{health:e=>_("defillama","health",{},e),current:(e,t)=>_("defillama","prices",{coins:e},t),bySymbol:(e,t)=>_("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>_("defillama","protocols",{},e)},lifi:{health:e=>_("lifi","health",{},e),quote:(e,t)=>_("lifi","quote",e||{},t),chains:e=>_("lifi","chains",{},e)},dex:{health:e=>_("dexscreener","health",{},e),token:(e,t)=>_("dexscreener","token",{address:e},t),search:(e,t)=>_("dexscreener","search",{q:e},t),pair:(e,t,n)=>_("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>_("uniswap-v3","health",e||{},t),quote:(e,t)=>_("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>_("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>_("uniswap-v3","ethUsdc",e||{},t),chains:e=>_("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>_("uniswap-v4","health",e||{},t),quote:(e,t)=>_("uniswap-v4","quote",e||{},t),chains:e=>_("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>_("across","suggestedFees",e||{},t),hop:(e,t)=>_("hop","quote",e||{},t),relay:(e,t)=>_("relay","quote",e||{},t)},cow:{quote:(e,t)=>_("cowswap","quote",e||{},t)},hlWs:{allMids:e=>_("hl-ws","allMids",{},e),l2Book:(e,t)=>_("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>_("poly-ws","book",{assetId:e},t)}};import{homedir as Em}from"node:os";import{join as Am}from"node:path";var sA=process.env.ORACLE_PUBLIC_DESKTOP==="1",PF=sA?process.env.ORACLE_CONFIG_DIR||Am(Em(),".config","oracle"):Am(Em(),".config","oracle"),yH=sA?PF:Am(Em(),".config","mad-desk");function Xi(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 Im(e,t,n=!1){return String(Xi(e,t,n?"1":"")).trim()==="1"}function _m(e,t){return String(Xi(e,t,""))}Hs();var on=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),lA={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Qi=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function cA(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:on.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Qi(n);if(p==null||p<=0n)return{source:t,quality:on.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(a);return{source:t,quality:o==null?on.NO_GAS:on.FULL,amountOut:p.toString(),minOut:Qi(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 uA(e,t,{divisor:n=1000n}={}){let r=Qi(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=Qi(i),c=Qi(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 dA(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 pA(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:a=null}={}){let s=e.filter(A=>A.quality!==on.FAILED),c=e.filter(A=>A.quality===on.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(A=>{let P=BigInt(A.amountOut),T=0n,C=!1,I=!1,F=BigInt(A.oracleFeeBps??0),D=F>0n?P*F/10000n:0n;if(l){let $=A.gasUsd,q=Number(A.meta?.gasUnits??A.estimatedGas);if($==null&&p&&Number.isFinite(q)&&q>0){let Y=q*u/1e18*d;Number.isFinite(Y)&&Y>=0&&($=Y,I=!0)}let te=($??0)+(A.feeUsd??0);if(te>0){let Y=te/t*10**n;Number.isFinite(Y)&&Y>=0&&(T=BigInt(Math.floor(Y)),C=!0)}else $===0&&(C=!0)}let N=T+D,U=P>N?P-N:0n;return{...A,grossOut:P.toString(),netOut:U.toString(),costInDest:T.toString(),oracleFeeInDest:D.toString(),costAccounted:C,gasEstimated:I}}),f=Number(o)>0?Number(o):0,h=m.reduce((A,P)=>BigInt(P.netOut)>A?BigInt(P.netOut):A,0n),g=A=>h>0n?Number((h-BigInt(A))*10000n/h):0,b=[],x=m.slice().sort((A,P)=>BigInt(P.netOut)>BigInt(A.netOut)?1:-1)[0]??null;m.sort((A,P)=>{let T=g(A.netOut)<=f?0:1,C=g(P.netOut)<=f?0:1;if(r&&f>0&&T!==C)return T-C;if(r&&f>0){let I=A.liquidityUsd??-1,F=P.liquidityUsd??-1;if(I!==F)return F-I}return BigInt(P.netOut)>BigInt(A.netOut)?1:-1}),r&&f>0&&x&&m[0]&&m[0].source!==x.source&&b.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${x.source} within ${f} bps`);let w=m.filter(A=>!A.costAccounted).map(A=>A.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 A=m.find(P=>P.costAccounted&&g(P.netOut)<=f);A&&b.push(`winner ${y.source} has UNMEASURED gas; gas-measured ${A.source} is within ${f} bps and may net more once ${y.source}'s real gas is paid \u2014 prefer it if unsure.`)}let S=m.filter(A=>A.gasEstimated).map(A=>A.source);S.length&&b.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${S.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let E=null,v=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let A=BigInt(m[0].netOut),P=BigInt(m[1].netOut);P>0n&&(E=Number((A-P)*10000n/P),v=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:E,spreadBasis:v,rankedOn:l?"net-of-cost":"gross",warnings:b}}async function Pm(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"?cA({source:a,error:String(o.reason?.message||o.reason)}):cA({source:a,...o.value})})}ii();ji();si();li();zn();vr();var Tm=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function mA(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Tm(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function fA(e,t={}){let n=lA[Number(e)];if(!n)return null;try{let r=await At([n],t);return Tm(r?.coins?.[n]?.price)}catch{return null}}var NH=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 Cm({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 bn({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:mA(m?.gasCosts),feeUsd:mA(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 nn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:a,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:Tm(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 vn({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 di({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 Xt({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"}}}}),$e[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}}}}),nt[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await ln({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}Yo();Ee();var TF={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function CF(e,t,n){let r=TF[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let a=(await At([o],n))?.coins?.[o],s=Number(a?.price),c=Number(a?.decimals);return{priceUsd:Number.isFinite(s)?s:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function gA(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let a=fA(n,t),s=CF(n,o,t),c=il(n,t).catch(()=>null),l=Cm({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}),[u,d,p]=await Promise.all([Pm(l,{timeoutMs:t.timeoutMs??12e3}),s,c]);a.catch(()=>{});let m=await a.then(g=>g,()=>null),f=pA(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:m}),h=t.maxImpactPct===void 0?25:t.maxImpactPct;if(h!=null&&f.best){let g=f.best.source,x=await uA(async w=>{let y=Cm({...e,amountIn:w.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}).filter(E=>E.source===g);return y.length?(await Pm(y,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(x){let w=dA(f,{[g]:x},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...w,sourcesTried:l.length,sourcesAnswered:u.filter(y=>y.quality!==on.FAILED).length,note:hA(w,l.length),priceImpact:{[g]:Number(x.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...f,sourcesTried:l.length,sourcesAnswered:u.filter(g=>g.quality!==on.FAILED).length,note:hA(f,l.length)}}function NF(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${f0(t)}`:""}function hA(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=NF(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 $n=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),OF=100,Nm={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:a}=await Promise.resolve().then(()=>(zn(),bl)),s=await a({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:$n.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,fee:a,tickSpacing:s,hooks:c},l)=>{let{uniV4PrepareExactIn:u}=await Promise.resolve().then(()=>(vr(),Al)),d=await u({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,fee:a,tickSpacing:s,hooks:c},l);return{artifactKind:$n.TRANSACTION,transaction:d.transaction,requiresApproval:d.requiresApproval,amountOut:d.quote?.amountOut??null,minOut:d.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(()=>(ii(),Vu)),s=await a({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:$n.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(()=>(ji(),Bp)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:a,userAddress:o,side:"SELL"},s);return{artifactKind:$n.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(()=>(si(),Yu)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:$n.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(()=>(li(),id)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:$n.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 RF=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),$F=/^0x[0-9a-fA-F]{40}$/;async function yA(e,t={}){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(!$F.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(RF.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 gA(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=Nm[o];if(!a){let g=r.routes.find(b=>Nm[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):"",x=[String(g?.message||g),b].filter(Boolean).join(" :: "),w=/allowance/i.test(x),y=!w&&/not enough|insufficient|balance/i.test(x),S,E;w?(E="approval-required-first",S=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${x}`):y?(E="taker-not-funded",S=`${o} refused to build the transaction: ${x}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(E="provider-error",S=`${o} prepare failed: ${x}`);let v=r.routes.find(A=>Nm[A.source]&&A.source!==o);return{ok:!1,reason:S,failureKind:E,...v?{alternative:v.source}:{},comparison:r}}let c=e.driftToleranceBps??OF,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 B({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===$n.TRANSACTION?s.transaction?.to??null:s.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...s.artifactKind===$n.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"})}zn();var Om=/^0x[0-9a-fA-F]{40}$/,LF=24,wA=!1;function vA(){wA||(qo(),wA=!0)}var qe=class extends Error{constructor(t,n){super(n),this.status=t}};function BF(e){if(vA(),e==null||e==="")throw new qe(400,"chainId is required");let t=Number(e);if(Number.isFinite(t)&&kr(t))return t;let n=Ba().find(r=>r.key===String(e).toLowerCase());if(n)return n.chainId;throw new qe(400,`unknown chain "${e}"`)}function bA(e,t){if(typeof e!="string")throw new qe(400,`${t} is required`);let n=e.trim();if(n===""||n.length>LF)throw new qe(400,`${t} is invalid`);if(!/^[A-Za-z0-9._-]+$/.test(n)&&!Om.test(n))throw new qe(400,`${t} is invalid`);return n}function MF(e,t){let n=String(e).trim();if(!/^\d+(\.\d+)?$/.test(n))throw new qe(400,"sellAmount must be a positive decimal number");if(Number(n)<=0)throw new qe(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 qe(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 qe(400,"sellAmount rounds to zero at this token's precision");return s}async function xA(e,t){if(vA(),Om.test(t)){let l=await kr(e).resolveToken(t).catch(()=>null),u=Number(l?.decimals);return{address:t,decimals:Number.isFinite(u)?u:null}}let n=$e[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 kr(e).resolveToken(o).catch(()=>null),s=Number(a?.decimals);return{address:o,decimals:Number.isFinite(s)?s:null}}async function SA(e={},t={}){let n=BF(e.chainId??e.chain),r=bA(e.sellSymbol??e.sellToken,"sellSymbol"),o=bA(e.buySymbol??e.buyToken,"buySymbol");if(r.toLowerCase()===o.toLowerCase())throw new qe(400,"sell and buy assets must differ");let i=typeof e.taker=="string"?e.taker.trim():"";if(!Om.test(i))throw new qe(400,"taker must be the wallet address that will sign");let[a,s]=await Promise.all([xA(n,r),xA(n,o)]);if(!a)throw new qe(400,`could not resolve sell asset "${r}" on chain ${n}`);if(!s)throw new qe(400,`could not resolve buy asset "${o}" on chain ${n}`);let c=MF(e.sellAmount,a.decimals),l=await yA({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 UF,randomBytes as EA}from"node:crypto";import{readFileSync as qF,writeFileSync as DF,mkdirSync as HF,existsSync as jF}from"node:fs";import{dirname as IA,join as AA}from"node:path";import{fileURLToPath as zF}from"node:url";var FF=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),Zi="agent:execute";var mo=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function kA(e){let t=Array.isArray(e)&&e.length?e:mo,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!FF.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}function _A(e){return UF("sha256").update(String(e),"utf8").digest("hex")}function Rm(){return{version:1,keys:[]}}function ta(){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=AA(IA(zF(import.meta.url)),"..","..");return AA(e,"data","agent-keys.json")}function Nc(e){if(!jF(e))return Rm();try{let t=JSON.parse(qF(e,"utf8"));return!t||!Array.isArray(t.keys)?Rm():t}catch{return Rm()}}function $m(e,t){HF(IA(e),{recursive:!0}),DF(e,JSON.stringify(t,null,2),{mode:384})}function ea(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 Lm({owner:e,name:t="Agent key",scopes:n,tier:r=null,controllerAllowlist:o=[],storePath:i=ta()}={}){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=kA(n);if(s.includes(Zi)){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_${EA(24).toString("base64url")}`,l={id:EA(8).toString("hex"),owner:a,name:String(t).slice(0,80),scopes:s,tier:r,keyHash:_A(c),createdAt:new Date().toISOString(),revokedAt:null,lastUsedAt:null},u=Nc(i);return u.keys.push(l),$m(i,u),{key:c,record:ea(l)}}function Bm(e,{storePath:t=ta(),includeRevoked:n=!1}={}){let r=String(e||"").toLowerCase();return Nc(t).keys.filter(i=>i.owner===r).filter(i=>n||!i.revokedAt).map(ea)}function Mm({owner:e,id:t,storePath:n=ta()}={}){let r=String(e||"").toLowerCase(),o=Nc(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(),$m(n,o)),ea(i)}function Fm(e,{storePath:t=ta()}={}){if(!e)throw new Error("key required");let n=_A(e),r=Nc(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(),$m(t,r),{...ea(o),identity:{type:"scoped-key",owner:o.owner,scopes:o.scopes}}}var Um={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:[...mo].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:[...mo],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:[...mo,Zi],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 Oc(){return Object.values(Um).map(e=>({id:e.id,label:e.label,description:e.description,scopes:e.scopes,custody:e.custody,canExecute:e.canExecute}))}function PA(e){let t=Um[e];if(!t)throw new Error(`Unknown tier: ${e}`);return t}function qm({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=PA(t),s=i||a.scopes,c=Lm({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(Zi),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 Dm(e,t){return Fm(e,t)}function Hm(e,t){return Bm(e,t)}function jm(e){return Mm(e)}var Hc=Xi("ORACLE_DATA_HOST","MAD_DESK_HOST","127.0.0.1"),Ef=Number(Xi("ORACLE_DATA_PORT","MAD_DESK_PORT",8787)),NI=Im("ORACLE_ONBOARD_HTTP","MAD_ONBOARD_HTTP",!1),OI=Im("ORACLE_PUBLIC_API_MODE","MAD_PUBLIC_API_MODE",!1),qU=Pb(import.meta.url),DU=new Set(["127.0.0.1","localhost","::1","[::1]"]),Dc=64*1024,HU=300,jU=1e4,da=new Map,zU=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(!DU.has(String(Hc).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 WU(e){return new Set(String(e||"").split(",").map(t=>t.trim()).filter(Boolean))}function RI(e){return WU(_m("ORACLE_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS","MAD_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS")).has(e)}function $I(e){return e&&e.auth&&e.auth!=="none"}function VU(){return Cc().filter(e=>!$I(e)||RI(e.id)).map(e=>e.id)}var pe=class extends Error{constructor(t,n,r){super(r||n),this.status=t,this.code=n}};function Af(e){let t=String(e||"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(t))throw new pe(400,"invalid-owner","owner must be a 0x-prefixed address");return t}function GU(e){let t={},n=String(e||"").split(/\r?\n/).map(r=>r.trim()).filter(Boolean);if(n[0]!=="Oracle onboarding")throw new pe(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 KU(e=Math.floor(Date.now()/1e3)){for(let[t,n]of da)n.expiresAt<=e&&da.delete(t)}function YU({owner:e,action:t,tier:n,id:r}={}){let o=Af(e),i=String(t||"");if(!new Set(["onboard","list","revoke"]).has(i))throw new pe(400,"invalid-action","action must be onboard, list, or revoke");let a=n==null?null:String(n);if(i==="onboard"&&!a)throw new pe(400,"tier-required","onboard challenge requires tier");let s=r==null?null:String(r).trim();if(i==="revoke"&&!s)throw new pe(400,"id-required","revoke challenge requires key id");if(s&&s.length>256)throw new pe(400,"invalid-id","key id is too long");let c=Math.floor(Date.now()/1e3);if(KU(c),da.size>=jU)throw new pe(429,"challenge-capacity","too many pending wallet challenges");let l=c+HU,u=FU(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(`
|
|
192
|
-
`);return
|
|
193
|
+
}`;function C4(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 HE(e={},t={}){let n={chainIds:C4(e)};return e.user&&(n.user=String(e.user)),{markets:(await tl(P4,{request:n},t))?.data?.markets??[]}}async function jE(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 tl(T4,{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 zE(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 tl(N4,{filter:r},t))?.data?.chains??[]}}async function VE(e={}){return{ok:(await tl("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}j();var R4="https://staking-api.babylonlabs.io";function Xm(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||R4).replace(/\/$/,"")}function nl(e,t={}){return I(`${Xm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function WE(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 GE(e={}){try{let n=(await nl("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Xm(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Xm(e),error:String(t?.message||t),exec:!1}}}async function KE(e={},t={}){let r=(await nl("/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 YE(e={},t={}){let n=await nl("/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=WE(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 JE(e={},t={}){let n=WE(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 nl(`/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 $4="https://markets.bisq.network";function Qm(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||$4).replace(/\/$/,"")}function XE(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 rl(e,t={}){return I(`${Qm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function QE(e={}){try{let t=await rl("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Qm(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Qm(e),error:String(t?.message||t),exec:!1}}}async function ZE(e={},t={}){let n=await rl("/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 eI(e={},t={}){let n=XE(e.market||e.pair||"btc_usd","market"),r=await rl(`/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 tI(e={},t={}){let n=XE(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 rl(`/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 fn=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"}}),M4=new Map([["bob",60808],["rootstock",30],["rsk",30]]),F4=60808;function wa(e){if(e==null||e==="")return F4;let t=M4.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!fn[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(fn).join(", ")} / bob, rootstock)`);return n}function Zm(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=wa(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||fn[n].url).replace(/\/$/,"")}function nI(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 ol(e,t,n={}){return I(`${Zm(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function rI(e={},t={}){let n;try{n=wa(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=fn[n];try{let o=await ol(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Zm(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:Zm(n,e),error:String(o?.message||o),exec:!1}}}async function ef(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(fn).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await ef({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:fn[c].name,error:String(l?.message||l)}}}))}}let r=wa(n),o=fn[r],i=await ol(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 oI(e={},t={}){let n=wa(e.chainId??e.chain),r=nI(e.address||e.addr,"address"),o=fn[n],i=await ol(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 iI(e={},t={}){let n=wa(e.chainId??e.chain),r=nI(e.address||e.addr,"address"),o=await ol(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:fn[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 q4="https://insights.braiins.com/api/v1.0";function tf(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||q4).replace(/\/$/,"")}function nf(e,t={}){return I(`${tf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function aI(e={}){try{let t=await nf("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:tf(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:tf(e),error:String(t?.message||t),exec:!1}}}async function sI(e={},t={}){let n=await nf("/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 cI(e={},t={}){let n=await nf("/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 H4="https://api.cow.fi",lI=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function uI(e={}){return(e.baseUrl||process.env.COW_API_URL||H4).replace(/\/$/,"")}function j4(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=lI[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(lI).join(", ")})`);return n}function rf(e,t,n){return`${uI(n)}/${j4(e)}/api/v1${t}`}function dI(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 pI(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function mI(e={},t={}){return I(rf(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fI(e={},t={}){let n=dI(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(pI(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await I(`${rf(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 hI(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",dI(e.owner||e.address||e.user,"owner"));let r=await I(`${rf(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,pI(e))}}async function gI(e={}){let t=await I(`${uI(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 V4="https://api.hiro.so",W4=20;function of(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||V4).replace(/\/$/,"")}function G4(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function ba(e,t={}){return I(`${of(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:G4(t)})}async function yI(e={}){try{let t=await ba("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:of(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:W4,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:of(e),error:String(t?.message||t),exec:!1}}}async function wI(e={},t={}){let n=await ba("/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 bI(e={},t={}){let n=await ba("/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 xI(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await ba(`/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 SI(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await ba(`/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 Y4="https://bundles.jito.wtf",vI=1e9;function af(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||Y4).replace(/\/$/,"")}function J4(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function kI(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*vI):null}function X4(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/vI:null,raw:e}}async function EI(e={}){try{let t=await I(`${af(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 II(e={},t={}){let n=J4(e.limit,5,100),r=new URL(`${af(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 I(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(X4),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 AI(e={}){let t=await I(`${af(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,kI(i)])),suggestedTipLamports:kI(r.p75||r.p50),raw:n}}j();var Z4="https://api.kamino.finance";function eU(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||Z4).replace(/\/$/,"")}function gt(e){let t=Number(e);return Number.isFinite(t)?t:null}function _I(e={}){let t=gt(e.totalValueLocked)??0,n=gt(e.apy?.totalApy)??0,r=gt(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:gt(e.sharePrice),sharesIssued:gt(e.sharesIssued),profitAndLoss:gt(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:gt(e.apy?.vault?.totalApr),apy24h:gt(e.kaminoApy?.vault?.apy24h),apy7d:gt(e.kaminoApy?.vault?.apy7d),apy30d:gt(e.kaminoApy?.vault?.apy30d),poolPrice:gt(e.apy?.vault?.poolPrice),priceLower:gt(e.apy?.vault?.priceLower),priceUpper:gt(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function sf(e={},t={}){let n=new URL(`${eU(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await I(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function PI(e={}){try{let t=await sf({},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 TI(e={},t={}){let r=(await sf(e,t)).map(_I),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 NI(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await sf({...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",..._I(o),raw:o}}j();var nU="https://blockstream.info/liquid/api",CI="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function il(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||nU).replace(/\/$/,"")}function rU(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 oU(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 OI(e,t={}){let n=`${il(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}function RI(e,t={}){return I(`${il(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function LI(e={}){try{let t=await OI("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:il(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:il(e),error:String(t?.message||t),exec:!1}}}async function $I(e={},t={}){let n=await OI("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function BI(e={},t={}){let n=rU(e.address||e.addr,"address"),r=await RI(`/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 MI(e={},t={}){let n=oU(e.assetId||e.asset||CI,"assetId"),r=await RI(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===CI,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 aU="https://api-mainnet.magiceden.dev/v2/ord/btc",sU=600;function cf(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||aU).replace(/\/$/,"")}function cU(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function FI(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 UI(e,t={}){return I(`${cf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:cU(t),retries:t.retries??1})}async function qI(e={}){let t=FI(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await UI(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:cf(e),probeCollection:t,rateLimitRpm:sU,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:cf(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 DI(e={},t={}){let n=FI(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await UI(`/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 uU="https://mempool.space/api",dU=7;function lf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||uU).replace(/\/$/,"")}function al(e,t={}){return I(`${lf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function HI(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>dU}}async function jI(e={}){try{let n=(await al("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=HI(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:lf(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:lf(e),error:String(t?.message||t),exec:!1}}}async function zI(e={},t={}){let r=(await al("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=HI(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 VI(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 al(`/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 WI(e={},t={}){let n=await al("/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 mU="https://mempool.space/api",GI=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function uf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||mU).replace(/\/$/,"")}function KI(e,t){let n=String(e||t).trim().toLowerCase();if(!GI.has(n))throw new Error(`mempool-mining: window must be one of ${[...GI].join(", ")}`);return n}function xa(e,t={}){return I(`${uf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function YI(e={}){try{let t=await xa("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:uf(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:uf(e),error:String(t?.message||t),exec:!1}}}async function JI(e={},t={}){let n=await xa("/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 XI(e={},t={}){let n=KI(e.window||e.timeframe,"1w"),r=await xa(`/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 QI(e={},t={}){let n=KI(e.window||e.timeframe,"3d"),r=await xa(`/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 ZI(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await xa(`/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 hU="https://amm-v2.meteora.ag",eA=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),tA=new Set(["dynamic","multitoken","lst","farms"]),gU=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function yU(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||hU).replace(/\/$/,"")}function et(e){let t=Number(e);return Number.isFinite(t)?t:null}function wU(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 bU(e={},t={}){let n=new URL(`${yU(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(!eA.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...eA].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(!tA.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...tA].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(!gU.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 df(e={},t={}){let{url:n,page:r,size:o}=bU(e,t),i=await I(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(wU),totalCount:i?.total_count??null,page:r,size:o}}async function nA(e={}){try{let{pools:t,totalCount:n}=await df({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 rA(e={},t={}){let n=await df({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 oA(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 df({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 SU="https://ordinals.com";function sl(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||SU).replace(/\/$/,"")}function kU(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 iA(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 pf(e,t={}){return I(`${sl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function aA(e={}){try{let t=await iA("/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 sA(e={},t={}){let n=await iA("/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 cA(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 pf(`/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 lA(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 pf(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 uA(e={},t={}){let n=kU(e.name||e.rune||e.runeName,"name"),r=await pf(`/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 EU="https://hermes.pyth.network",ff={"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"},IU=/^[0-9a-fA-F]{64}$/;function dA(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||EU).replace(/\/$/,"")}function pA(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=ff[n.toUpperCase()]||ff[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!IU.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 mf(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function hf(e={}){let t=mf({price:Number(e.price?.conf),expo:e.price?.expo}),n=mf(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:mf(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 gf(e,t={}){let n=new URL(`${dA(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"),I(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function mA(e={}){try{let t=await gf([ff["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(hf):[])[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 fA(e={},t={}){let n=pA(e.feedId||e.id||e.symbol,"feedId"),r=await gf([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(hf):[],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 hA(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>pA(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 gf(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(hf):[]),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 gA(e={},t={}){let n=new URL(`${dA(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 I(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 _U="https://relayscan.io",yA=new Set(["1h","12h","24h","7d"]);function yf(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||_U).replace(/\/$/,"")}function wA(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!yA.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...yA].join(", ")}`);return t}function PU(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 wf(e={},t={}){return I(`${yf(t)}/overview/json?t=${wA(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function bA(e={},t={}){return I(`${yf(t)}/builder-profit/json?t=${wA(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function xA(e={},t={}){let n=PU(e);return I(`${yf(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function SA(e={}){let t=await wf({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 NU="https://extra-api.sanctum.so",CU=30,OU=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function bf(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||NU).replace(/\/$/,"")}function kA(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 RU(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Ar(e,t,n={}){let r={},o={};for(let i of RU(t,CU)){let a=new URL(`${bf(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await I(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 vA(e={}){try{let[t,n]=await Promise.all([I(`${bf(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Ar("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 xf(e={},t={}){let n=await I(`${bf(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 EA(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await xf({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=OU);let r=[...new Set(n.map(s=>kA(s,"lsts[]")))],[o,i]=await Promise.all([Ar("apy/latest",r,t),Ar("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 IA(e={},t={}){let n=kA(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Ar("apy/latest",[n],t),Ar("apy/inception",[n],t),Ar("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Ar("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 $U="https://api.save.finance",BU="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",AA="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",MU=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Sf(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||$U).replace(/\/$/,"")}function _A(e,t="address"){let n=String(e??"").trim();if(!MU.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function PA(e){let t=Number(e);return Number.isFinite(t)?t:null}function FU(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 UU(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:PA(e.rates?.supplyInterest),borrowApyPct:PA(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 TA(e={}){try{let t=await I(`${Sf(e)}/v1/reserves?ids=${AA}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:AA,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function kf(e={},t={}){let n=new URL(`${Sf(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 I(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(FU);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 NA(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=>_A(String(s).trim(),"reserve"));else{let a=_A(e.market||e.marketAddress||BU,"market"),c=(await kf({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 I(`${Sf(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...UU(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 vf(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 _r(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 Sa(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:vf(e.amount,"amount")}}function Ef(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 ka(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 If(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 DU(e={},t={}){let n=Sa(e),r=_r(e.slices??10,"slices",2,100),o=_r(e.durationSec??3600,"durationSec",r,604800),i=Ef(n.total,Array(r).fill(1));return ka(n,"TWAP",If(i,o,t.nowMs),{durationSec:o})}function HU(e={},t={}){let n=Sa(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=_r(e.durationSec??3600,"durationSec",r.length,604800),i=Ef(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=If(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return ka(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function jU(e={}){let t=Sa(e),n=_r(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=vf(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 ka(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function zU(e={}){let t=Sa(e),n=vf(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 ka(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function VU(e={},t={}){let n=Sa(e),r=_r(e.slices??10,"slices",2,100),o=_r(e.durationSec??3600,"durationSec",r,604800),i=_r(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=Ef(n.total,a);return ka(n,"IS",If(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function CA(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return DU(e,t);if(n==="VWAP")return HU(e,t);if(n==="POV")return jU(e,t);if(n==="ICEBERG")return zU(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return VU(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function OA(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var FA=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 BA(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Om,adapters:Object.freeze(Rm.adapters.map(e=>{let t=FA[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function c6(e,t={}){let n=Pv(e,t),r=FA[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 Af=new Map;function ll(e={}){let t=e.filePath||void 0,n=t||"__default__";return Af.has(n)||Af.set(n,Yw(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Af.get(n)}var _f=new Map;function Pf(e={}){let t=e.filePath||void 0,n=t||"__default__";return _f.has(n)||_f.set(n,eb(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),_f.get(n)}var Tf=new Map;function va(e={}){let t=e.filePath||void 0,n=t||"__default__";return Tf.has(n)||Tf.set(n,Vw(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Tf.get(n)}var l6={"hl-info":{health:e=>Z0(e),allMids:e=>Zt(e),l2Book:(e,t={})=>Dr(t.coin,e),outcomeMeta:e=>li(e),clearinghouse:(e,t={})=>ds(t.user,e),userFills:(e,t={})=>eg(t.user,e),meta:e=>ps(e),metaAndAssetCtxs:e=>wt(e),candleSnapshot:(e,t={})=>Hr(t,e),openOrders:(e,t={})=>tg(t.user,e),frontendOpenOrders:(e,t={})=>ng(t.user,e),userState:(e,t={})=>jr(t.user,e),spotMeta:e=>fs(e)},"hl-vaults":{health:e=>ig(e),summaries:(e,t={})=>Nu(t,e),details:(e,t={})=>hs(t,e),userEquities:(e,t={})=>Cu(t,e),tracker:(e,t={})=>Ou(t,e)},"hl-precompiles":{health:e=>sg(e),read:(e,t={})=>ag(t,e),l1BlockNumber:e=>gs(e),markPx:(e,t={})=>$u(t,e),oraclePx:(e,t={})=>Bu(t,e),spotPx:(e,t={})=>Mu(t,e),position:(e,t={})=>Fu(t,e),spotBalance:(e,t={})=>Uu(t,e),vaultEquity:(e,t={})=>qu(t,e),withdrawable:(e,t={})=>Du(t,e)},"hl-delta-neutral":{health:()=>Ng(),scan:(e,t={})=>sd(t,e),quote:(e,t={})=>cd(t,e),prepare:(e,t={})=>ld(t,e),loop:(e,t={})=>Mg(t,e)},"lighter-delta-neutral":{health:()=>zg(),scan:(e,t={})=>dd(t,e),quote:(e,t={})=>pd(t,e),prepare:(e,t={})=>md(t,e),loop:(e,t={})=>Qg(t,e)},"poly-public":{health:e=>ey(e),time:e=>fd(e),markets:(e,t={})=>ty(t,e),book:(e,t={})=>ny(t.tokenId,e),midpoint:(e,t={})=>ry(t.tokenId,e),spread:(e,t={})=>oy(t.tokenId,e),price:(e,t={})=>iy(t.tokenId,{side:t.side},e),events:(e,t={})=>ay(t,e)},"evm-rpc":{health:(e,t={})=>Lr(t.chainId??1,e),healthAll:(e,t={})=>Dl({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>jo(t.chainId??1,e),chainId:(e,t={})=>Fl(t.chainId??1,e),getBalance:(e,t={})=>Zn(t.chainId??1,t.address,e),call:(e,t={})=>V(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>ql(t,e),erc20Balance:(e,t={})=>zo(t,e),transactionReceipt:(e,t={})=>Vo(t,e)},portfolio:{health:e=>kk(e),balances:(e,t={})=>Mc(t,e),snapshot:(e,t={})=>Dk(t,e),history:(e,t={})=>gm(t,e),valueGraph:(e,t={})=>Hk(t,e)},"nft-portfolio":{health:e=>Tk(e),inventory:(e,t={})=>bo(t,e),gallery:(e,t={})=>Rk(t,e),pnl:(e,t={})=>Ok(t,e),prepareList:(e,t={})=>Nk(t,e),traitSnipe:(e,t={})=>Ck(t,e)},"contract-risk":{health:e=>jk(e),scan:(e,t={})=>Sr(t,e)},"evm-token-sniper":{health:e=>Wk(e),scan:(e,t={})=>Vk(t,e)},"evm-simulate":{health:e=>Kk(e),simulate:(e,t={})=>da(t,e)},"nft-mint":{health:e=>Jk(e),discover:(e,t={})=>jc(t,e),prepare:(e,t={})=>bm(t,e),priceGas:(e,t={})=>Hc(t,e),createTrigger:(e,t={})=>Kv(t,e),checkOpen:(e,t={})=>Yv(t,e),evaluateMancerOs:(e,t={})=>Qv(t,e)},"universal-mint-router":{health:()=>Sv(),capabilities:()=>Nm(),prepare:(e,t={})=>kv(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:BA()}),capabilities:()=>BA(),route:(e,t={})=>c6(t,e)},"erc8004-identity":{health:()=>jb(),prepareIdentityRegistration:(e,t={})=>Wb(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Gb(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Yb(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:Kc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Cv(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:Yc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Bv(t,e)},"universal-ordinals-transfer":{health:()=>({provider:Jc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Gv(t,e)},"solana-rpc":{health:e=>cy(e),latestBlockhash:(e,t={})=>gd(t,e),getBalance:(e,t={})=>As(t,e),tokenAccounts:(e,t={})=>vi(t,e),simulate:(e,t={})=>ly(t,e)},"bitcoin-esplora":{health:e=>uy(e),tipHeight:e=>dy(e),fees:e=>py(e),address:(e,t={})=>Ps(t,e),utxos:(e,t={})=>my(t,e),tx:(e,t={})=>fy(t,e),decode:(e,t={})=>hy(t,e)},"bitcoin-meta":{health:e=>yy(e),runeBalances:(e,t={})=>Ns(t,e),inscriptions:(e,t={})=>Xr(t,e),inscriptionInfo:(e,t={})=>wy(t,e),inscriptionChildren:(e,t={})=>by(t,e),ordBlockInfo:(e,t={})=>xy(t,e)},satflow:{health:e=>ky(e),collectionFloors:(e,t={})=>vy(t,e),collectionStats:(e,t={})=>Ey(t,e),item:(e,t={})=>Iy(t,e),walletContents:(e,t={})=>Os(t,e),floorListings:(e,t={})=>Ay(t,e),preparePurchase:(e,t={})=>Py(t,e),prepareList:(e,t={})=>Rs(t,e)},jupiter:{health:e=>By(e),venues:(e,t={})=>$y(t,e),quote:(e,t={})=>Bs(t,e),prepare:(e,t={})=>My(t,e)},defillama:{health:e=>Uy(e),prices:(e,t={})=>Nt(t.coins||[],e),pricesBySymbol:(e,t={})=>Hy(t.symbols,e),protocols:e=>_d(e),yields:(e,t={})=>qy(t,e),stablecoins:(e,t={})=>Ms(t,e),dexVolumes:(e,t={})=>Dy(t,e)},lifi:{health:e=>Cd(e),quote:(e,t={})=>Tn(t,e),prepare:(e,t={})=>Od(t,e),chains:e=>Rd(e)},dexscreener:{health:e=>Yh(e),token:(e,t={})=>er(t.address||t.tokenAddress,e),search:(e,t={})=>Wo(t.q||t.query,e),pair:(e,t={})=>Jh(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Zl({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Xt(t,e),prepare:(e,t={})=>Ql(t,e),quotePath:(e,t={})=>Xl(t,e),ethUsdc:(e,t={})=>Ka(t,e),chains:()=>eu()},"uniswap-v4":{health:(e,t={})=>pu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>wn(t,e),inspectHook:(e,t={})=>cu(t,e),prepare:(e,t={})=>uu(t,e),chains:()=>du()},x402:{health:()=>Aw(),inspect:(e,t={})=>Ew(t),prepare:(e,t={})=>Iw(t,e)},bankr:{health:e=>Ow(e),wallet:e=>Zd(e),portfolio:e=>Nw(e),swapQuote:(e,t={})=>Cw(t,e)},aerodrome:{health:(e,t={})=>Qy({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Us(t,e),prepare:(e,t={})=>Xy(t,e),chains:()=>Zy()},zerox:{health:e=>$d(e),price:(e,t={})=>Ds(t,e),quote:(e,t={})=>Cn(t,e),prepare:(e,t={})=>Bd(t,e)},across:{health:e=>ow(e),suggestedFees:(e,t={})=>Fd(t,e)},hop:{health:e=>iw(e),quote:(e,t={})=>Ud(t,e)},relay:{health:e=>aw(e),quote:(e,t={})=>Hs(t,e),prepare:(e,t={})=>sw(t,e)},cowswap:{health:e=>zd(e),quote:(e,t={})=>on(t,e),prepareOrder:(e,t={})=>Vd(t,e),order:(e,t={})=>Gs(t,e),status:(e,t={})=>Ws(t,e),chains:()=>Wd()},oneinch:{health:e=>ww(e),quote:(e,t={})=>Ci(t,e),prepare:(e,t={})=>bw(t,e),approveSpender:(e,t={})=>Jd(t,e)},"hl-ws":{health:e=>Rw(e),allMids:e=>Lw(e),l2Book:(e,t={})=>$w(t.coin,e),snapshot:(e,t={})=>Ri(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Bw({...e,assetId:t.assetId}),book:(e,t={})=>Mw(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Ks(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>P0(e),collection:(e,t={})=>ti(t.slug,e),floor:(e,t={})=>T0(t.slug,e),bestListings:(e,t={})=>wu(t,e),bestListing:(e,t={})=>ns(t,e),bestOffer:(e,t={})=>rs(t,e),accountNfts:(e,t={})=>ni(t,e),accountPnl:(e,t={})=>es(t,e),prepareBuy:(e,t={})=>D0(t,e),prepareSweep:(e,t={})=>H0(t,e),prepareMint:(e,t={})=>is(t,e),prepareList:(e,t={})=>as(t,e),prepareCancel:(e,t={})=>j0(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={})=>va(e).createListing(t),listListings:(e,t={})=>va(e).listListings(t),cancelListing:(e,t={})=>va(e).cancelListing(t),createOffer:(e,t={})=>va(e).createOffer(t),armFill:(e,t={})=>va(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={})=>ll(e).createIntent(t),listIntents:(e,t={})=>ll(e).listIntents(t),cancelIntent:(e,t={})=>ll(e).cancelIntent(t),armPayment:(e,t={})=>ll(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={})=>Pf(e).registerPack(t),listPacks:(e,t={})=>Pf(e).listPacks(t),revokePack:(e,t={})=>Pf(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>Fb(t,e),markets:(e,t={})=>no(t,e),quoteSpecificBuy:(e,t={})=>Di(t,e),quoteSell:(e,t={})=>oc(t,e),scanCollection:(e,t={})=>ic(t,e),scanAllMarkets:(e,t={})=>Nb(t,e),scanCrossVenueArb:(e,t={})=>bp(t,e),scanAllMarketsArb:(e,t={})=>Cb(t,e),prepareSpecificBuy:(e,t={})=>vb(t,e),prepareSell:(e,t={})=>Eb(t,e)},stonkbrokers:{health:(e,t={})=>Ub(t,e),quoteBrokerBuy:(e,t={})=>ac(t,e),scanBrokerLoot:(e,t={})=>Lb(t,e),prepareBrokerBuy:(e,t={})=>$b(t,e),brokerDesk:(e,t={})=>Mb(t,e),clockInStatus:(e,t={})=>Hi(t,e),prepareClockIn:(e,t={})=>Bb(t,e)},"hl-outcome":{list:e=>Dx(e),prepareOrder:(e,t={})=>Hx(t,e),prepareCancel:(e,t={})=>jx(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Ac().map(e=>e.id),nativeTemplates:ra().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Ac(),listNative:()=>ra(),gate:(e,t={})=>ta(t.templateId||t.id,e),prepareDeploy:(e,t={})=>wS(t,e),buildNative:(e,t={})=>oa(t),eval:async()=>(await Promise.resolve().then(()=>($A(),LA))).runContractsEval()},"poly-clob":{health:()=>rS(),prepareOrder:(e,t={})=>oS(t||{},e)},"hl-perps":{health:e=>Lp(e),assetInfo:(e,t={})=>In(t,e),prepareOrder:(e,t={})=>Gr(t,e),prepareCancel:(e,t={})=>bi(t,e),prepareLeverage:(e,t={})=>rd(t,e),prepareIsolatedMargin:(e,t={})=>od(t,e),prepareBracket:(e,t={})=>id(t,e),prepareBuilderApproval:(e,t={})=>nd(t,e)},"hl-markets":{health:e=>Lp(e),markets:(e,t={})=>pc(t,e),leaderboards:(e,t={})=>hx(t,e),coin:(e,t={})=>gx(t,e),spot:(e,t={})=>yx(t,e)},"hl-entry-state":{health:e=>Mx(e),see:(e,t={})=>Ji(t,e),qualify:(e,t={})=>Fx(t,e),lock:(e,t={})=>Ux(t,e),list:e=>Mp(e),watch:(e,t={})=>qx(t,e)},"magiceden-sol":{health:e=>tx(e),stats:(e,t={})=>Ap(t,e),listings:(e,t={})=>rx(t,e),tokenListings:(e,t={})=>ox(t,e),prepareBuy:(e,t={})=>ix(t,e),prepareList:(e,t={})=>uc(t,e),prepareMint:(e,t={})=>ax(t,e)},"hl-staking":{health:e=>cx(e),validators:e=>Tp(e),delegatorSummary:(e,t={})=>Np(t,e),delegations:(e,t={})=>Cp(t,e),rewards:(e,t={})=>lx(t,e),history:(e,t={})=>ux(t,e),preflight:(e,t={})=>fx(t,e),prepareStakeDeposit:(e,t={})=>dx(t,e),prepareStakeWithdraw:(e,t={})=>px(t,e),prepareDelegate:(e,t={})=>mx(t,e)},"hyperevm-dex":{health:e=>Xb(e),search:(e,t={})=>Qb(t.q||t.query||"HYPE",e),token:(e,t={})=>Zb(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>TS(e),networks:(e,t={})=>Wp(t,e),pool:(e,t={})=>AS(t,e),token:(e,t={})=>_S(t,e),ohlcv:(e,t={})=>PS(t,e)},curve:{health:e=>HS(e),openapi:e=>DS(e),pools:(e,t={})=>Kp(t,e),quote:(e,t={})=>Yp(t,e),prepare:(e,t={})=>jS(t,e)},gmx:{health:e=>Px(e),tickers:(e,t={})=>mo(t,e),markets:(e,t={})=>Ax(t,e),marketsInfo:(e,t={})=>Bp(t,e),tokens:(e,t={})=>_x(t,e),prepareOrder:(e,t={})=>Ox(t,e),positions:(e,t={})=>Tx(t,e),orderStatus:(e,t={})=>Nx(t,e),verifyOrder:(e,t={})=>Cx(t,e)},morpho:{health:e=>GS(e),markets:(e,t={})=>WS(t,e),vaults:(e,t={})=>Qp(t,e),prepareVault:(e,t={})=>KS(t,e)},balancer:{health:e=>nk(e),pools:(e,t={})=>tk(t,e),quote:(e,t={})=>tm(t,e),prepare:(e,t={})=>rk(t,e)},pendle:{health:e=>ik(e),markets:(e,t={})=>rm(t,e),quote:(e,t={})=>ak(t,e),prepare:(e,t={})=>om(t,e)},odos:{health:e=>uk(e),chains:e=>am(e),quote:(e,t={})=>ck(t,e),prepare:(e,t={})=>lk(t,e)},blockscout:{health:e=>wk(e),stats:(e,t={})=>lm(t,e),address:(e,t={})=>fk(t,e),token:(e,t={})=>hk(t,e)},paraswap:{health:e=>Fm(e),tokens:(e,t={})=>Xc(t,e),price:(e,t={})=>mn(t,e),quote:(e,t={})=>mn(t,e),prepare:(e,t={})=>Mm(t,e)},rfq:{health:e=>mE(e),intent:(e,t={})=>dE(t,e),quote:(e,t={})=>pE(t,e)},"polygon-staking":{health:e=>DE(e),validators:(e,t={})=>UE(t,e),validatorDetail:(e,t={})=>qE(t,e)},"aave-v3":{health:e=>VE(e),markets:(e,t={})=>HE(t,e),marketReserves:(e,t={})=>jE(t,e),chains:e=>zE(e)},"babylon-staking":{health:e=>GE(e),stats:e=>KE(e),finalityProviders:e=>YE(e),delegations:(e,t={})=>JE(t,e)},"bisq-markets":{health:e=>QE(e),markets:e=>ZE(e),ticker:(e,t={})=>eI(t,e),trades:(e,t={})=>tI(t,e)},"bob-rootstock":{health:(e,t={})=>rI(t.chainId,e),stats:(e,t={})=>ef(t,e),addressInfo:(e,t={})=>oI(t,e),tokenBalances:(e,t={})=>iI(t,e)},"braiins-insights":{health:e=>aI(e),priceStats:e=>sI(e),poolStats:e=>cI(e)},"cow-protocol":{health:e=>gI(e),auction:e=>mI(e),openOrders:(e,t={})=>fI(t,e),recentTrades:(e,t={})=>hI(t,e)},"hiro-stacks":{health:e=>yI(e),networkInfo:e=>wI(e),stackingInfo:e=>bI(e),poxCycles:e=>xI(e),blocks:(e,t={})=>SI(t,e)},"jito-mev":{health:e=>EI(e),recentBundles:(e,t={})=>II(t,e),tipFloor:e=>AI(e)},"kamino-strategies":{health:e=>PI(e),strategies:(e,t={})=>TI(t,e),strategyMetrics:(e,t={})=>NI(t,e)},"liquid-esplora":{health:e=>LI(e),tipHeight:e=>$I(e),addressInfo:(e,t={})=>BI(t,e),assetInfo:(e,t={})=>MI(t,e)},"magiceden-ordinals":{health:e=>qI(e),collectionStat:(e,t={})=>DI(t,e)},"mempool-lightning":{health:e=>jI(e),statistics:e=>zI(e),nodeRankings:(e,t={})=>VI(t,e),nodeCountries:e=>WI(e)},"mempool-mining":{health:e=>YI(e),difficulty:e=>JI(e),poolShare:(e,t={})=>XI(t,e),hashrate:(e,t={})=>QI(t,e),rewardStats:(e,t={})=>ZI(t,e)},"meteora-dlmm":{health:e=>nA(e),pools:(e,t={})=>rA(t,e),poolSearch:(e,t={})=>oA(t,e)},"ordinals-runes":{health:e=>aA(e),blockHeight:e=>sA(e),blockInfo:(e,t={})=>cA(t,e),satInfo:(e,t={})=>lA(t,e),runeInfo:(e,t={})=>uA(t,e)},"pyth-price-feeds":{health:e=>mA(e),latestPrice:(e,t={})=>fA(t,e),latestPrices:(e,t={})=>hA(t,e),feedDirectory:e=>gA(e)},"relayscan-mev":{health:e=>SA(e),overview:(e,t={})=>wf(t,e),builderProfit:(e,t={})=>bA(t,e),dailyStats:(e,t={})=>xA(t,e)},"sanctum-lst":{health:e=>vA(e),lstList:e=>xf(e),apyAll:e=>EA(e),apyIndividual:(e,t={})=>IA(t,e)},"solend-lending":{health:e=>TA(e),markets:e=>kf(e),reserves:(e,t={})=>NA(t,e)},"execution-strategies":{health:()=>OA(),plan:(e,t={})=>CA(t)},"across-bridge":{health:e=>fE(e),pools:(e,t={})=>hE(t,e),suggestedFees:(e,t={})=>gE(t,e)},"beefy-yields":{health:e=>yE(e),apy:(e,t={})=>wE(t,e),apyBreakdown:e=>bE(e)},"birdeye-tokens":{health:e=>SE(e),tokenList:(e,t={})=>kE(t,e)},"celestia-da":{health:e=>vE(e),stats:e=>EE(e),blockStats:(e,t={})=>IE(t,e)},"das-assets":{health:e=>AE(e),assetsByOwner:(e,t={})=>_E(t,e),searchAssets:(e,t={})=>PE(t,e),assetProof:(e,t={})=>TE(t,e)},"l2beat-tvl":{health:e=>NE(e),tvl:(e,t={})=>CE(t,e),activity:(e,t={})=>OE(t,e)},"spark-lend":{health:e=>RE(e),markets:(e,t={})=>LE(t,e)},"symbiotic-restaking":{health:e=>$E(e),vaults:(e,t={})=>BE(t,e),vaultDetail:(e,t={})=>ME(t,e)}},MA=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),UA=new Set(["hl-exec"]);function Nf(e){return UA.has(String(e||""))}function u6(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(UA.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=us().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!MA.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(MA.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 P(e,t,n={},r={}){if(Nf(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.`);u6(e,t,n);let o=ci(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=l6[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function Cf({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||us().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)=>P(d,"health",p,m),u={};return await rt(s,i??8,async d=>{if(!ci(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 qA(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function d6(e){return e.execution==="prepare"&&qA(e).length?"armed-local":e.execution||"read-only"}function ul(){return us().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:d6(e),localSignerSurfaces:qA(e),description:e.description}))}var DA={catalog:ul,health:Cf,call:P,hl:{health:e=>P("hl-info","health",{},e),allMids:e=>P("hl-info","allMids",{},e),l2Book:(e,t)=>P("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>P("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>P("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>P("hl-info","userFills",{user:e},t),meta:e=>P("hl-info","meta",{},e),metaAndAssetCtxs:e=>P("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>P("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>P("hl-info","openOrders",{user:e},t),userState:(e,t)=>P("hl-info","userState",{user:e},t),spotMeta:e=>P("hl-info","spotMeta",{},e),vaults:{health:e=>P("hl-vaults","health",{},e),summaries:(e,t)=>P("hl-vaults","summaries",e||{},t),details:(e,t)=>P("hl-vaults","details",e||{},t),mine:(e,t)=>P("hl-vaults","userEquities",{user:e},t),track:(e,t)=>P("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>P("hl-entry-state","see",e||{},t),qualify:(e,t)=>P("hl-entry-state","qualify",e||{},t),lock:(e,t)=>P("hl-entry-state","lock",e||{},t),list:e=>P("hl-entry-state","list",{},e),watch:(e,t)=>P("hl-entry-state","watch",e||{},t)},staking:{health:e=>P("hl-staking","health",{},e),validators:e=>P("hl-staking","validators",{},e),summary:(e,t)=>P("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>P("hl-staking","delegations",{user:e},t),rewards:(e,t)=>P("hl-staking","rewards",{user:e},t),history:(e,t)=>P("hl-staking","history",{user:e},t),preflight:(e,t)=>P("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>P("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>P("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>P("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>P("poly-public","health",{},e),time:e=>P("poly-public","time",{},e),markets:(e,t)=>P("poly-public","markets",e||{},t),book:(e,t)=>P("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>P("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>P("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>P("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>P("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>P("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>P("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>P("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>P("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>P("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>P("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>P("evm-token-sniper","health",{},e),scan:(e,t)=>P("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>P("portfolio","balances",e||{},t),snapshot:(e,t)=>P("portfolio","snapshot",e||{},t),history:(e,t)=>P("portfolio","history",e||{},t),valueGraph:(e,t)=>P("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>P("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>P("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>P("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>P("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>P("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>P("opensea-nft","floor",{slug:e},t),collection:(e,t)=>P("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>P("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>P("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>P("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>P("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>P("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>P("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>P("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>P("universal-mint-router","health",{},e),capabilities:e=>P("universal-mint-router","capabilities",{},e),prepare:(e,t)=>P("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>P("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>P("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>P("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>P("solana-rpc","health",{},e),latestBlockhash:(e,t)=>P("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>P("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>P("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>P("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>P("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>P("jupiter","prepare",e||{},t),nftStats:(e,t)=>P("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>P("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>P("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>P("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>P("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>P("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>P("bitcoin-esplora","health",{},e),tipHeight:e=>P("bitcoin-esplora","tipHeight",{},e),fees:e=>P("bitcoin-esplora","fees",{},e),address:(e,t)=>P("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>P("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>P("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>P("bitcoin-esplora","decode",e||{},t),metaHealth:e=>P("bitcoin-meta","health",{},e),runeBalances:(e,t)=>P("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>P("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>P("satflow","health",{},e),satflowFloors:(e,t)=>P("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>P("satflow","walletContents",{address:e},t)},prices:{health:e=>P("defillama","health",{},e),current:(e,t)=>P("defillama","prices",{coins:e},t),bySymbol:(e,t)=>P("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>P("defillama","protocols",{},e)},lifi:{health:e=>P("lifi","health",{},e),quote:(e,t)=>P("lifi","quote",e||{},t),chains:e=>P("lifi","chains",{},e)},dex:{health:e=>P("dexscreener","health",{},e),token:(e,t)=>P("dexscreener","token",{address:e},t),search:(e,t)=>P("dexscreener","search",{q:e},t),pair:(e,t,n)=>P("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>P("uniswap-v3","health",e||{},t),quote:(e,t)=>P("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>P("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>P("uniswap-v3","ethUsdc",e||{},t),chains:e=>P("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>P("uniswap-v4","health",e||{},t),quote:(e,t)=>P("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>P("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>P("uniswap-v4","prepare",e||{},t),chains:e=>P("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>P("x402","inspect",e||{},t),prepare:(e,t)=>P("x402","prepare",e||{},t)},bankr:{wallet:e=>P("bankr","wallet",{},e),portfolio:e=>P("bankr","portfolio",{},e),swapQuote:(e,t)=>P("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>P("across","suggestedFees",e||{},t),hop:(e,t)=>P("hop","quote",e||{},t),relay:(e,t)=>P("relay","quote",e||{},t)},cow:{quote:(e,t)=>P("cowswap","quote",e||{},t)},hlWs:{allMids:e=>P("hl-ws","allMids",{},e),l2Book:(e,t)=>P("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>P("poly-ws","book",{assetId:e},t)}};import{homedir as Of}from"node:os";import{join as Rf}from"node:path";var HA=process.env.ORACLE_PUBLIC_DESKTOP==="1",p6=HA?process.env.ORACLE_CONFIG_DIR||Rf(Of(),".config","oracle"):Rf(Of(),".config","oracle"),qz=HA?p6:Rf(Of(),".config","mad-desk");function Ea(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 Lf(e,t,n=!1){return String(Ea(e,t,n?"1":"")).trim()==="1"}function $f(e,t){return String(Ea(e,t,""))}Sc();var hn=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),zA={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"},Ia=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function jA(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:hn.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Ia(n);if(p==null||p<=0n)return{source:t,quality:hn.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(a);return{source:t,quality:o==null?hn.NO_GAS:hn.FULL,amountOut:p.toString(),minOut:Ia(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 VA(e,t,{divisor:n=1000n}={}){let r=Ia(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=Ia(i),c=Ia(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 WA(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 GA(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!==hn.FAILED),c=e.filter(E=>E.quality===hn.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),T=0n,N=!1,A=!1,M=BigInt(E.oracleFeeBps??0),D=M>0n?_*M/10000n:0n;if(l){let O=E.gasUsd,F=Number(E.meta?.gasUnits??E.estimatedGas);if(O==null&&p&&Number.isFinite(F)&&F>0){let K=F*u/1e18*d;Number.isFinite(K)&&K>=0&&(O=K,A=!0)}let Q=(O??0)+(E.feeUsd??0);if(Q>0){let K=Q/t*10**n;Number.isFinite(K)&&K>=0&&(T=BigInt(Math.floor(K)),N=!0)}else O===0&&(N=!0)}let C=T+D,U=_>C?_-C:0n;return{...E,grossOut:_.toString(),netOut:U.toString(),costInDest:T.toString(),oracleFeeInDest:D.toString(),costAccounted:N,gasEstimated:A}}),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=[],x=m.slice().sort((E,_)=>BigInt(_.netOut)>BigInt(E.netOut)?1:-1)[0]??null;m.sort((E,_)=>{let T=g(E.netOut)<=f?0:1,N=g(_.netOut)<=f?0:1;if(r&&f>0&&T!==N)return T-N;if(r&&f>0){let A=E.liquidityUsd??-1,M=_.liquidityUsd??-1;if(A!==M)return M-A}return BigInt(_.netOut)>BigInt(E.netOut)?1:-1}),r&&f>0&&x&&m[0]&&m[0].source!==x.source&&b.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${x.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,S=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/_),S=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:v,spreadBasis:S,rankedOn:l?"net-of-cost":"gross",warnings:b}}async function Bf(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"?jA({source:a,error:String(o.reason?.message||o.reason)}):jA({source:a,...o.value})})}Ii();ha();_i();Ti();nr();Mr();var Mf=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function KA(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Mf(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function YA(e,t={}){let n=zA[Number(e)];if(!n)return null;try{let r=await Nt([n],t);return Mf(r?.coins?.[n]?.price)}catch{return null}}var eV=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 Ff({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 Tn({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:KA(m?.gasCosts),feeUsd:KA(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),a!=null&&d.push({source:"paraswap",run:async()=>{let p=s??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await mn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:a,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:Mf(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 Cn({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 Ci({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 on({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 Xt({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}}}}),lt[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await wn({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}hi();_e();var m6={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function f6(e,t,n){let r=m6[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let a=(await Nt([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 XA(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=YA(n,t),s=f6(n,o,t),c=Ul(n,t).catch(()=>null),l=Ff({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}),[u,d,p]=await Promise.all([Bf(l,{timeoutMs:t.timeoutMs??12e3}),s,c]);a.catch(()=>{});let m=await a.then(g=>g,()=>null),f=GA(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:m}),h=t.maxImpactPct===void 0?25:t.maxImpactPct;if(h!=null&&f.best){let g=f.best.source,x=await VA(async w=>{let y=Ff({...e,amountIn:w.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}).filter(v=>v.source===g);return y.length?(await Bf(y,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(x){let w=WA(f,{[g]:x},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...w,sourcesTried:l.length,sourcesAnswered:u.filter(y=>y.quality!==hn.FAILED).length,note:JA(w,l.length),priceImpact:{[g]:Number(x.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...f,sourcesTried:l.length,sourcesAnswered:u.filter(g=>g.quality!==hn.FAILED).length,note:JA(f,l.length)}}function h6(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Sg(t)}`:""}function JA(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=h6(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}ie();var Wn=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),g6=100,Uf={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:a}=await Promise.resolve().then(()=>(nr(),tu)),s=await a({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Wn.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(()=>(Mr(),mu)),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:Wn.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(()=>(Ii(),Ld)),s=await a({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Wn.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(()=>(ha(),Um)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:a,userAddress:o,side:"SELL"},s);return{artifactKind:Wn.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(()=>(_i(),Md)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Wn.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(()=>(Ti(),Gd)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Wn.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 y6=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),w6=/^0x[0-9a-fA-F]{40}$/,b6=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"]);async function QA(e,t={}){if(b6.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(!w6.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(y6.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 XA(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=Uf[o];if(!a){let g=r.routes.find(b=>Uf[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):"",x=[String(g?.message||g),b].filter(Boolean).join(" :: "),w=/allowance/i.test(x),y=!w&&/not enough|insufficient|balance/i.test(x),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: ${x}`):y?(v="taker-not-funded",k=`${o} refused to build the transaction: ${x}. 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: ${x}`);let S=r.routes.find(E=>Uf[E.source]&&E.source!==o);return{ok:!1,reason:k,failureKind:v,...S?{alternative:S.source}:{},comparison:r}}let c=e.driftToleranceBps??g6,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===Wn.TRANSACTION?s.transaction?.to??null:s.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...s.artifactKind===Wn.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"})}nr();var qf=/^0x[0-9a-fA-F]{40}$/,x6=24,ZA=!1;function n1(){ZA||(ai(),ZA=!0)}var ze=class extends Error{constructor(t,n){super(n),this.status=t}};function S6(e){if(n1(),e==null||e==="")throw new ze(400,"chainId is required");let t=Number(e);if(Number.isFinite(t)&&Ur(t))return t;let n=cs().find(r=>r.key===String(e).toLowerCase());if(n)return n.chainId;throw new ze(400,`unknown chain "${e}"`)}function e1(e,t){if(typeof e!="string")throw new ze(400,`${t} is required`);let n=e.trim();if(n===""||n.length>x6)throw new ze(400,`${t} is invalid`);if(!/^[A-Za-z0-9._-]+$/.test(n)&&!qf.test(n))throw new ze(400,`${t} is invalid`);return n}function k6(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 t1(e,t){if(n1(),qf.test(t)){let l=await Ur(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 Ur(e).resolveToken(o).catch(()=>null),s=Number(a?.decimals);return{address:o,decimals:Number.isFinite(s)?s:null}}async function r1(e={},t={}){let n=S6(e.chainId??e.chain),r=e1(e.sellSymbol??e.sellToken,"sellSymbol"),o=e1(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(!qf.test(i))throw new ze(400,"taker must be the wallet address that will sign");let[a,s]=await Promise.all([t1(n,r),t1(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=k6(e.sellAmount,a.decimals),l=await QA({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 E6,randomBytes as i1}from"node:crypto";import{readFileSync as I6,writeFileSync as A6,mkdirSync as _6,existsSync as P6}from"node:fs";import{dirname as s1,join as a1}from"node:path";import{fileURLToPath as T6}from"node:url";var v6=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),Aa="agent:execute";var No=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function o1(e){let t=Array.isArray(e)&&e.length?e:No,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!v6.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}function c1(e){return E6("sha256").update(String(e),"utf8").digest("hex")}function Df(){return{version:1,keys:[]}}function Pa(){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=a1(s1(T6(import.meta.url)),"..","..");return a1(e,"data","agent-keys.json")}function dl(e){if(!P6(e))return Df();try{let t=JSON.parse(I6(e,"utf8"));return!t||!Array.isArray(t.keys)?Df():t}catch{return Df()}}function Hf(e,t){_6(s1(e),{recursive:!0}),A6(e,JSON.stringify(t,null,2),{mode:384})}function _a(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 jf({owner:e,name:t="Agent key",scopes:n,tier:r=null,controllerAllowlist:o=[],storePath:i=Pa()}={}){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=o1(n);if(s.includes(Aa)){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_${i1(24).toString("base64url")}`,l={id:i1(8).toString("hex"),owner:a,name:String(t).slice(0,80),scopes:s,tier:r,keyHash:c1(c),createdAt:new Date().toISOString(),revokedAt:null,lastUsedAt:null},u=dl(i);return u.keys.push(l),Hf(i,u),{key:c,record:_a(l)}}function zf(e,{storePath:t=Pa(),includeRevoked:n=!1}={}){let r=String(e||"").toLowerCase();return dl(t).keys.filter(i=>i.owner===r).filter(i=>n||!i.revokedAt).map(_a)}function Vf({owner:e,id:t,storePath:n=Pa()}={}){let r=String(e||"").toLowerCase(),o=dl(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(),Hf(n,o)),_a(i)}function Wf(e,{storePath:t=Pa()}={}){if(!e)throw new Error("key required");let n=c1(e),r=dl(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(),Hf(t,r),{..._a(o),identity:{type:"scoped-key",owner:o.owner,scopes:o.scopes}}}var Gf={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:[...No].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:[...No],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:[...No,Aa],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 pl(){return Object.values(Gf).map(e=>({id:e.id,label:e.label,description:e.description,scopes:e.scopes,custody:e.custody,canExecute:e.canExecute}))}function l1(e){let t=Gf[e];if(!t)throw new Error(`Unknown tier: ${e}`);return t}function Kf({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=l1(t),s=i||a.scopes,c=jf({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(Aa),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 Yf(e,t){return Wf(e,t)}function Jf(e,t){return zf(e,t)}function Xf(e){return Vf(e)}var kl=Ea("ORACLE_DATA_HOST","MAD_DESK_HOST","127.0.0.1"),Ch=Number(Ea("ORACLE_DATA_PORT","MAD_DESK_PORT",8787)),p_=Lf("ORACLE_ONBOARD_HTTP","MAD_ONBOARD_HTTP",!1),m_=Lf("ORACLE_PUBLIC_API_MODE","MAD_PUBLIC_API_MODE",!1),Iq=lS(import.meta.url),Aq=new Set(["127.0.0.1","localhost","::1","[::1]"]),Sl=64*1024,_q=new Set(["bankr.swapQuote"]),Pq=300,Tq=1e4,Fa=new Map,Nq=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(!Aq.has(String(kl).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 Cq(e){return new Set(String(e||"").split(",").map(t=>t.trim()).filter(Boolean))}function f_(e){return Cq($f("ORACLE_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS","MAD_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS")).has(e)}function h_(e){return e&&e.auth&&e.auth!=="none"}function Oq(){return ul().filter(e=>!h_(e)||f_(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 Oh(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 Rq(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 Lq(e=Math.floor(Date.now()/1e3)){for(let[t,n]of Fa)n.expiresAt<=e&&Fa.delete(t)}function $q({owner:e,action:t,tier:n,id:r}={}){let o=Oh(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(Lq(c),Fa.size>=Tq)throw new fe(429,"challenge-capacity","too many pending wallet challenges");let l=c+Pq,u=vq(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 Fa.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 Nh(e={},{owner:t,action:n,tier:r,id:o}={}){let i=Oh(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=Eq(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=Rq(s);if(Oh(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=Fa.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 me(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 Jn(e){return new Promise((t,n)=>{let r=Number(e.headers["content-length"]||0);if(Number.isFinite(r)&&r>Sl){n(new fe(413,"body-too-large",`request body exceeds ${Sl} bytes`));return}let o=[],i=0,a=!1;e.on("data",s=>{if(!a){if(i+=s.length,i>Sl){a=!0,o.length=0,n(new fe(413,"body-too-large",`request body exceeds ${Sl} 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 Bq(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,""),s=new Set(["127.0.0.1","localhost","::1"]);if(!s.has(a))return`unexpected Host header ${i||"(none)"} \u2014 this server only answers to loopback names`;let c=e.headers.origin;if(c&&c!=="null")try{let l=new URL(c).hostname;if(!s.has(l))return`cross-origin request from ${c} refused`}catch{return`malformed Origin ${c} refused`}return null}var Mq=kq(async(e,t)=>{try{let n=Bq(e);if(n)return me(t,403,{error:n});let r=new URL(e.url||"/",`http://${kl}:${Ch}`),o=r.pathname;if(e.method==="GET"&&o==="/health")return me(t,200,{ok:!0,service:"oracle",plane:"data+onboard",exec:"local-signer",version:Iq.version,onboardHttp:p_});if(e.method==="GET"&&o==="/data/catalog")return me(t,200,{catalog:ul()});if(e.method==="GET"&&o==="/data/health"){let a=await Cf({timeoutMs:1e4,providers:m_?Oq():void 0});return me(t,200,a)}let i=Nq.get(o);if(i){let a;if(e.method==="GET"&&i==="shadow")a={action:"list"};else if(e.method==="POST")a=await Jn(e);else return me(t,405,{error:"method not allowed"});try{let{runStrategyOperation:s}=await Promise.resolve().then(()=>(d_(),u_)),c=await s(i,{...a,nowMs:a.nowMs??Date.now()});return me(t,200,c)}catch(s){return me(t,400,{error:s?.message||"strategy request rejected"})}}if(o==="/data/call"){let a,s,c;if(e.method==="GET"){a=r.searchParams.get("provider"),s=r.searchParams.get("op");let d=r.searchParams.get("args");c=d?JSON.parse(d):{}}else if(e.method==="POST"){let d=await Jn(e);a=d.provider,s=d.op,c=d.args||{}}else return me(t,405,{error:"method not allowed"});if(!a||!s)return me(t,400,{error:"provider and op required"});if(Nf(a))return me(t,403,{error:`${a} is an execution provider and is not served by the data plane; run the execution binary instead`});if(!_q.has(`${a}.${s}`)&&/sign|execute|broadcast|approve|submit|place|send|write|trade|order|swap/i.test(s))return me(t,403,{error:"sign/exec ops forbidden on data server"});let l=ci(a);if(m_&&h_(l)&&!f_(a))return me(t,403,{error:`public mode blocks ${a}.${s}: server API key providers are disabled unless explicitly allowlisted`});let u=await P(a,s,c,{timeoutMs:15e3});return me(t,200,{provider:a,op:s,result:u})}if(e.method==="POST"&&o==="/swap/prepare"){let a=await Jn(e);if(a.privateKey||a.secretKey||a.mnemonic)return me(t,400,{error:"do not send key material \u2014 taker address only"});try{let s=await r1(a);return me(t,200,s)}catch(s){if(s instanceof ze)return me(t,s.status,{error:s.message});throw s}}if(o.startsWith("/onboard")){if(!p_)return me(t,403,{error:"onboard HTTP disabled"});if(e.method==="GET"&&o==="/onboard/tiers")return me(t,200,{tiers:pl()});if(e.method==="POST"&&o==="/onboard/challenge"){let a=await Jn(e);return me(t,200,$q(a))}if(e.method==="POST"&&o==="/onboard"){let a=await Jn(e);if(a.privateKey||a.secretKey)return me(t,400,{error:"do not send wallet private keys \u2014 owner address only"});let s=a.tier||"observer";Nh(a,{owner:a.owner,action:"onboard",tier:s});let c=$f("ORACLE_EXECUTOR_CONTROLLERS","MAD_EXECUTOR_CONTROLLERS").split(",").map(u=>u.trim()).filter(Boolean),l=Kf({owner:a.owner,tier:s,name:a.name,controllerAllowlist:c});return me(t,201,l)}if(e.method==="POST"&&o==="/onboard/auth"){let a=await Jn(e),s=a.key||a.apiKey;if(!s)throw new fe(400,"key-required","key required");let c;try{c=Yf(s)}catch{throw new fe(401,"invalid-key","invalid or revoked key")}return me(t,200,c)}if(e.method==="GET"&&o==="/onboard/keys")return r.searchParams.get("owner")?me(t,405,{error:"method not allowed",message:"use POST /onboard/keys with wallet proof"}):me(t,400,{error:"owner query required"});if(e.method==="POST"&&o==="/onboard/keys"){let a=await Jn(e);return Nh(a,{owner:a.owner,action:"list"}),me(t,200,{keys:Jf(a.owner)})}if(e.method==="POST"&&o==="/onboard/revoke"){let a=await Jn(e);Nh(a,{owner:a.owner,action:"revoke",id:a.id});let s=Xf({owner:a.owner,id:a.id});return me(t,200,{revoked:s})}}return me(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 me(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?me(t,502,{error:"upstream-error",upstreamStatus:r}):me(t,500,{error:"internal-error"})}});Mq.listen(Ch,kl,()=>{console.log(JSON.stringify({listening:`http://${kl}:${Ch}`,plane:"data+onboard",exec:"local-signer",catalog:DA.catalog().map(e=>e.id),tiers:pl().map(e=>e.id)}))});
|