@oracle-agent/oracle 0.35.54 → 0.35.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +1 -1
- package/dist/cli/commands/chat.mjs +221 -221
- package/dist/cli/commands/data.mjs +1 -1
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +150 -150
- package/dist/cli/commands/farm.mjs +16 -16
- package/dist/cli/commands/model.mjs +223 -223
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +32 -25
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +22 -22
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +34 -34
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +5 -5
- package/dist/local-signer/runtime.mjs +21 -22
- package/dist/teams/index.mjs +7 -7
- package/dist/tui/standalone-client.mjs +102 -102
- package/package.json +1 -1
- package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
- package/public/oracle-splash/docs/connectors/index.html +2 -2
- package/public/oracle-splash/docs/getting-started/index.html +2 -2
- package/public/oracle-splash/docs/index.html +3 -3
- package/public/oracle-splash/docs/reference/index.html +2 -2
- package/public/oracle-splash/docs/security/index.html +2 -2
- package/public/oracle-splash/docs/using-oracle/index.html +2 -2
- package/public/oracle-splash/download/index.html +3 -3
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/index.html +6 -6
- package/server.json +2 -2
|
@@ -4,7 +4,7 @@ ${t}
|
|
|
4
4
|
${JSON.stringify(n??[])}`}async function rx(e,t,n){return x(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function ox(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>ZE)throw new Error(`rpcBatch: at most ${ZE} calls`);for(let i of t)tx(i?.method);let r=_u(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,s)=>({jsonrpc:"2.0",id:s+1,method:i.method,params:i.params||[]}));try{let i=await rx(r,o,n);if(Array.isArray(i)&&i.length===t.length){let s=new Map(i.map(a=>[Number(a?.id),a]));return t.map((a,c)=>nx(s.get(c+1)??i[c]))}}catch{}return Promise.all(t.map(i=>J(e,i.method,i.params||[],n)))}async function J(e,t,n=[],r={}){let o=String(t||""),i=tx(o),s=_u(e,r);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=ex.get(s);if(u!=null)return u}let c=r.dedupe!==!1&&!r.signal?Z6(s,o,n):null;if(c&&xa.has(c))return xa.get(c);let l=(async()=>{let u=await rx(s,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=nx(u);return i==="eth_chainid"&&typeof d=="string"&&ex.set(s,d),d})();return c&&(xa.set(c,l),l.finally(()=>{xa.get(c)===l&&xa.delete(c)}).catch(()=>{})),l}async function $i(e,t={}){let[n,r]=await ox(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:Ea(e)?.name||null}}async function Aa(e,t={}){let n=await J(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function th(e,t={}){let n=await J(e,"eth_chainId",[],t);return parseInt(n,16)}async function nh(e,t={}){let n=await J(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function qo(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await J(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function rh(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=qr(e.token||e.tokenAddress,"token"),o=qr(e.owner,"owner"),i=qr(e.spender,"spender"),s=Iu.encodeFunctionData("allowance",[o,i]),a=await J(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=Iu.decodeFunctionResult("allowance",a),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 ka(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=qr(e.token||e.tokenAddress,"token"),o=qr(e.account||e.owner||e.address,"account"),i=Iu.encodeFunctionData("balanceOf",[o]),s=await J(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=Iu.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Ia(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=X6(e.txHash||e.hash||e.transactionHash),o=await J(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=Zm(o.status),s=i===1,a=i===1?"success":i===0?"reverted":"unknown",c=s?null:a==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?qr(e.expectedTo,"expectedTo"):null,u=o.to?qr(o.to,"receipt.to"):null;return l&&u!==l&&(s=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:s,chainId:n,txHash:r,status:a,reason:c,statusCode:i,to:u,from:o.from?qr(o.from,"receipt.from"):null,blockNumber:Zm(o.blockNumber),transactionIndex:Zm(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function oh(e={}){let t=e.chainIds||Object.values(va).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!QE(r)&&!eh[r]&&!_u(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await $i(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Iu,eh,J6,ZE,xa,ex,Ne=_(()=>{q();Fo();Iu=new K6(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);eh={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",1339:"https://rpc.elysiumchain.tech"};J6=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;ZE=32,xa=new Map,ex=new Map});function ix(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 ih(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),s=String(r||"").toLowerCase(),a=(t||[]).map((c,l)=>{let u=ix(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)||e5.has(p)?g=300:s&&d===s&&(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 a.sort((c,l)=>l.score-c.score||c.index-l.index),a.map(c=>c.pool)}function sx(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&ix(e,n[0]).address||null}var e5,sh=_(()=>{e5=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function lx(e,t,n){let r=nt(t),o=nt(n),i=nt(e?.baseToken?.address),s=nt(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function ux(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function n5(e,t,n){let r=nt(e?.baseToken?.address)===nt(t),o=r?e?.baseToken:e?.quoteToken,i=r?e?.quoteToken:e?.baseToken,s=a=>({address:a?.address??null,name:a?.name??null,symbol:a?.symbol??null});return Object.freeze({chainSlug:e?.chainId??null,dexId:e?.dexId??null,poolAddress:e?.pairAddress??null,url:e?.url??null,labels:Object.freeze([...e?.labels??[]]),token0:Object.freeze(s(o)),token1:Object.freeze(s(i)),priceNative:e?.priceNative??null,priceUsd:e?.priceUsd??null,txns:e?.txns??null,volume:e?.volume??null,priceChange:e?.priceChange??null,liquidity:e?.liquidity??null,liquidityUsd:ux(e),fdv:ax(e?.fdv),marketCap:ax(e?.marketCap),pairCreatedAt:e?.pairCreatedAt??null,info:e?.info??null,boosts:e?.boosts??null})}function dx(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||ah).replace(/\/$/,"")}function jo(e,t){if(typeof e!="string"&&typeof e!="number")throw new Error(`${t} required`);let n=String(e).trim();if(!n||n.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:+~-]*$/u.test(n))throw new Error(`${t} must be a valid path component of at most 128 characters`);return encodeURIComponent(n)}function r5(e){if(typeof e!="string")throw new Error("query required");let t=e.trim();if(!t||t.length>200||/[\u0000-\u001f\u007f]/u.test(t))throw new Error("query must contain 1 to 200 printable characters");return t}function Nu(e=Bi,t=Bi){if(!Number.isInteger(e)||e<1||e>t)throw new Error(`limit must be an integer from 1 to ${t}`);return e}function tr(e,t){return x(`${dx(t)}${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}function Tu(e,t){let r=(Array.isArray(e)?e:e==null?[]:[e]).slice(0,t);return Object.freeze({items:Object.freeze(r),count:r.length,limit:t})}function px(e){let t=Array.isArray(e)?e:Array.isArray(e?.pairs)?e.pairs:[];return Object.freeze({schemaVersion:e&&!Array.isArray(e)?e.schemaVersion??null:null,pairs:Object.freeze(t),count:t.length})}async function fx(e={}){let n=(await x(`${dx(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function jn(e,t={}){return tr(`/latest/dex/tokens/${jo(e,"tokenAddress")}`,t)}async function Oa(e,t={}){return tr(`/latest/dex/search?q=${encodeURIComponent(r5(e))}`,t)}async function mx(e,t,n={}){return tr(`/latest/dex/pairs/${jo(e,"chainId")}/${jo(t,"pairAddress")}`,n)}async function hx({limit:e=Bi}={},t={}){let n=Nu(e);return Tu(await tr("/token-profiles/latest/v1",t),n)}async function gx({limit:e=Bi}={},t={}){let n=Nu(e);return Tu(await tr("/community-takeovers/latest/v1",t),n)}async function yx({limit:e=Bi}={},t={}){let n=Nu(e);return Tu(await tr("/token-boosts/latest/v1",t),n)}async function bx({limit:e=Bi}={},t={}){let n=Nu(e);return Tu(await tr("/token-boosts/top/v1",t),n)}async function wx({chainId:e,tokenAddress:t}={},n={}){let r=await tr(`/token-pairs/v1/${jo(e,"chainId")}/${jo(t,"tokenAddress")}`,n);return px(r)}async function Sx({chainId:e,tokenAddresses:t}={},n={}){let r=Array.isArray(t)?t:typeof t=="string"?t.split(","):[];if(r.length<1||r.length>_a)throw new Error(`tokenAddresses must contain 1 to ${_a} addresses`);let o=r.map(s=>jo(s,"tokenAddress")).join(","),i=await tr(`/tokens/v1/${jo(e,"chainId")}/${o}`,n);return px(i)}async function vx({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Na({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Na({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=nt(t5[Number(e)]||e),s=new Set(cx(r).filter(Boolean).map(nt)),a=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>jn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${nt(m?.chainId)}:${nt(m?.dexId)}:${nt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>nt(p?.chainId)===i).filter(p=>lx(p,t,n)).filter(p=>!s.size||s.has(nt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:ux(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}async function Ex({chainSlug:e,token0:t,token1:n,limit:r=10,dexIds:o=[]}={},i={}){if(!e||!t||!n)throw new Error("dexscreenerExactPairPools: chainSlug, token0, and token1 required");if(!Number.isInteger(r)||r<1||r>10)throw new Error("dexscreenerExactPairPools: limit must be an integer from 1 to 10");let s=new Set(cx(o).filter(Boolean).map(nt)),a=await Promise.allSettled([t,n].map(u=>jn(u,{...i,baseUrl:i.dexscreenerBaseUrl??i.baseUrl,timeoutMs:i.dexscreenerTimeoutMs??i.timeoutMs??12e3}))),c=new Set,l=[];for(let u of a)if(u.status==="fulfilled")for(let d of u.value?.pairs??u.value?.data?.pairs??[]){if(nt(d?.chainId)!==nt(e)||!lx(d,t,n)||s.size&&!s.has(nt(d?.dexId)))continue;let p=`${nt(d?.chainId)}:${nt(d?.pairAddress)}`;c.has(p)||(c.add(p),l.push(n5(d,t,n)))}return l.sort((u,d)=>(d.liquidityUsd??-1)-(u.liquidityUsd??-1)||String(u.poolAddress).localeCompare(String(d.poolAddress))).slice(0,r)}var ah,t5,nt,cx,ax,Bi,_a,nr=_(()=>{q();sh();ah="https://api.dexscreener.com",t5=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),nt=e=>String(e??"").toLowerCase(),cx=e=>Array.isArray(e)?e:e==null?[]:[e];ax=e=>{if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null};Bi=100,_a=30});import{readFileSync as i5}from"node:fs";import{homedir as s5}from"node:os";import{join as Cu}from"node:path";function a5(){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=s5();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Cu(t,".config","oracle")).trim();return[e,Cu(n,"exec.env")].filter(Boolean)}return[e,Cu(t,".config","oracle","exec.env"),Cu(t,".config","mad-desk","exec.env")].filter(Boolean)}function xx(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of a5())try{let i=i5(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(s&&(r=s[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 Ax=_(()=>{});var kx=_(()=>{});import{createHash as c5,createHmac as _x,timingSafeEqual as l5}from"node:crypto";function Ru(e){return Array.isArray(e)?`[${e.map(Ru).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ru(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Ox(e,{required:t=!1}={}){try{return xx(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function lh(e){let{signature:t,...n}=e;return n}function Nx(e,{secret:t}={}){let n=Ox(t);return n?{...e,signature:_x("sha256",n).update(Ru(lh(e))).digest("hex")}:e}function u5(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 c5("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function De(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=Ox(o);if(i){let m=_x("sha256",i).update(Ru(lh(e))).digest("hex");if(!d5(e.signature,m))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>Pu||!Number.isInteger(a)||a<0||a>Pu||s>a)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-s),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=f5(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 Nx({...lh(e),calldataHash:u5(r)},{secret:o})}function d5(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:l5(n,r)}function ch(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function p5(e){let t=e==null?Pu: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,Pu)}function Bt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=ch(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,a=Math.min(60,Math.abs(ch(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ch(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+s+a+c)),u=p5(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function uh({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l=Ix,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Bt({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});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)||Ix)),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 y=Number((d-g)*10000n/(d===0n?1n:d));if(y>p.capBps)throw new Error(`auto-slippage: realised floor implies ${y} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Nx({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 f5(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 s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+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 we(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=uh({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var Pu,Ix,Ot=_(()=>{Ax();kx();Pu=100,Ix=2e4});import{createHash as m5,createHmac as h5,timingSafeEqual as lle}from"node:crypto";function g5(e){let t=e==null||e===""?Di:Number(e);return!Number.isFinite(t)||t<0?Di:Math.min(t,ph)}function dh(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(dh).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${dh(e[n])}`).join(",")}}`}function Tx(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Px(e=process.env){return Tx(process.env)||Tx(e)}function y5(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function rr(e){let t=y5(e);return m5("sha256").update(dh(t)).digest("hex")}function Rx(e,t=Px()){return t?h5("sha256",t).update(String(e)).digest("hex"):""}function U(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 s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Di:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>ph)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:l,prepareVersion:Cx},m=rr(p),f=Px(r),h=f?Rx(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}function fh(e,{maxAgeMs:t=Di,nowMs:n=Date.now(),providers:r=null,kinds:o=null,label:i="operator"}={}){if(!e||typeof e!="object")throw new Error(`${i}: prepared envelope object required`);if(e.oraclePrepared!==!0)throw new Error(`${i}: prepared integrity envelope missing \u2014 use an @oracle-agent/oracle prepare result`);if(Number(e.prepareVersion)!==Cx)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let s=rr(e);if(String(e.prepareHash||"")!==s)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let a=Number(e.preparedAt),c=Number(e.expiresAt),l=g5(t),u=n-a,d=c-a;if(!Number.isFinite(u)||!Number.isFinite(c)||!Number.isFinite(d)||u<0||d<=0||d>ph||u>l||n>=c)throw new Error(`${i}: prepare envelope expired or clock-skewed (ageMs=${u}, max=${l})`);if(r&&!new Set(r).has(e.provider))throw new Error(`${i}: provider ${e.provider} not allowed here`);if(o&&!new Set(o).has(e.kind))throw new Error(`${i}: kind ${e.kind} not allowed here`);return!0}var Cx,Di,ph,oe=_(()=>{Cx=2,Di=300*1e3,ph=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var Sh={};lt(Sh,{PANCAKE_FEE_TIERS:()=>Lu,UNI_V3_CHAINS:()=>St,UNI_V3_FEE_TIERS:()=>Bx,UNI_V3_VENUES:()=>Fx,uniV3Chains:()=>wh,uniV3EthUsdc:()=>$u,uniV3Health:()=>bh,uniV3PrepareExactIn:()=>yh,uniV3QuoteExactIn:()=>or,uniV3QuoteExactInPath:()=>gh});import{Interface as Mx,getAddress as Ta,isAddress as $x}from"ethers";function hh(e,t){let n=Number(e),r=St[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(St).join(", ")})`);let o=Fx[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 s=o,a=s[i];if(!a){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function mh(e,t){let n=St[Number(t)];if(!e||e===Dx||e===Ux||/^eth$/i.test(String(e)))return Ta(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ta(n.weth);if(/^usdc$/i.test(r))return Ta(n.usdc);if(!$x(r))throw new Error(`invalid token address: ${e}`);return Ta(r)}function w5(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 S5(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 or(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=hh(e.chainId??8453,e.venue),s=mh(e.tokenIn||"WETH",n),a=mh(e.tokenOut||St[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:Bx,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],p=await Promise.all(u.map(async A=>{let E=Mu.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:A,sqrtPriceLimitX96:0n}]);try{let I=await J(n,"eth_call",[{to:r,data:E},"latest"],t);if(!I||I==="0x")return{fee:A,ok:!1,error:"empty result"};let N=Mu.decodeFunctionResult("quoteExactInputSingle",I);return{fee:A,ok:!0,amountOut:N[0].toString(),sqrtPriceX96After:N[1].toString(),initializedTicksCrossed:Number(N[2]),gasEstimate:N[3].toString()}}catch(I){return{fee:A,ok:!1,error:String(I.message||I).slice(0,160)}}})),m=null;for(let A of p)A.ok&&(!m||BigInt(A.amountOut)>BigInt(m.amountOut))&&(m=A);if(!m){let A=p.map(E=>`${E.fee}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${A}`)}let f=e.liquidityUsd==null?await Na({chainId:n,tokenA:s,tokenB:a,dexIds:w5(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(f.slice(0,8).map(async A=>{if(!(!A.pairAddress||!$x(A.pairAddress)))try{let E=await J(n,"eth_call",[{to:A.pairAddress,data:b5},"latest"],t),I=E&&E!=="0x"&&E.length<=66?Number.parseInt(E,16):NaN;if(!Number.isFinite(I)||I<=0||I>1e6)return;let N=h[I];(N==null||A.liquidityUsd>N.liquidityUsd)&&(h[I]=A)}catch{}}));let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),y=null;if(e.fee==null&&g>0&&BigInt(m.amountOut)>0n){let A=BigInt(m.amountOut),I=p.filter(N=>N.ok&&Number((A-BigInt(N.amountOut))*10000n/A)<=g).filter(N=>h[N.fee]?.liquidityUsd!=null).sort((N,T)=>h[T.fee].liquidityUsd-h[N.fee].liquidityUsd)[0];I&&I.fee!==m.fee&&(y={priceBestFee:m.fee,chosenFee:I.fee,chosenPoolUsd:h[I.fee].liquidityUsd,bandBps:g},m=I)}let b=h[m.fee]??null,w=f[0]??null,S=b??w,v=e.liquidityUsd??b?.liquidityUsd??w?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":b?"pool":w?"pair":null;return we({venue:"uniswap-v3",chainId:n,chain:St[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:m.fee,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:v,liquiditySource:S,liquidityAttribution:k,liquidityPick:y,sqrtPriceX96After:m.sqrtPriceX96After,initializedTicksCrossed:m.initializedTicksCrossed,triedFees:p,best:!0},{chainId:n,venue:o,amountOut:m.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function gh(e={},t={}){let{chainId:n,quoter:r,router:o}=hh(e.chainId??8453),i=(e.tokens||[]).map(p=>mh(p,n)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=S5(i,s),l=Mu.encodeFunctionData("quoteExactInput",[c,a]),u=await J(n,"eth_call",[{to:r,data:l},"latest"],t),d=Mu.decodeFunctionResult("quoteExactInput",u);return we({venue:"uniswap-v3",chainId:n,chain:St[n].name,quoter:r,tokens:i,fees:s,path:c,amountIn:a.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 $u(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await or({chainId:n,tokenIn:St[n].weth,tokenOut:St[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function yh(e={},t={}){let n=Number(e.chainId??8453),r=hh(n,e.venue),o=Ta(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Dx||i===Ux||/^eth$/i.test(i),a=await or(e,t),c=Lx.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.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=Lx.encodeFunctionData("multicall",[d,[c]]);return U({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:s?a.amountIn:"0",slippageGuard:De(a.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function bh(e={}){let t=Number(e.chainId??8453);try{let n=await $u({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:n.fee,amountOutUsdc:n.amountOutUsdc,midPxHint:n.amountOutUsdc/.001}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function wh(){return Object.entries(St).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var St,Bx,b5,Mu,Lx,Dx,Ux,Lu,Fx,Ui=_(()=>{Ne();nr();Ot();oe();St={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"}},Bx=[100,500,3e3,1e4],b5="0xddca3f43",Mu=new Mx(["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)"]),Lx=new Mx(["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)"]),Dx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ux="0x0000000000000000000000000000000000000000",Lu=[100,500,2500,1e4],Fx={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Lu}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Lu}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Lu}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Ph={};lt(Ph,{UNI_V4_CHAINS:()=>Gt,UNI_V4_FEE_TIERS:()=>xh,computeV4PoolId:()=>Uu,decodeV4HookPermissions:()=>kh,uniV4Chains:()=>Th,uniV4Health:()=>Ch,uniV4InspectHook:()=>_h,uniV4PrepareExactIn:()=>Nh,uniV4QuoteExactIn:()=>jr,uniV4QuoteExactOut:()=>Oh});import{AbiCoder as v5,Interface as vh,getAddress as Dt,isAddress as Eh,keccak256 as jx}from"ethers";function kh(e){let t=Ho(e),n=Number(BigInt(t)&x5),r=Object.fromEntries(qx.map(([s,a])=>[a,!!(n&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>r[s]&&!r[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(qx.filter(([,s])=>r[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Ca(e){let t=Number(e),n=Gt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Gt).join(", ")})`);return{chainId:t,...n}}function Ho(e){if(e==null||e==="")return vt;let t=String(e);if(!Eh(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Dt(t)}function ji(e,t){let n=Gt[Number(t)];if(qi(e))return Dt(vt);let r=String(e);if(/^weth$/i.test(r))return Dt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return Dt(n.usdc);if(!Eh(r))throw new Error(`invalid token address: ${e}`);return Dt(r)}function qi(e){let t=String(e||"").trim().toLowerCase();return!t||t===_5.toLowerCase()||t===vt.toLowerCase()||t==="eth"}function Uu({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=vt}){let i=Dt(e),s=Dt(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=Ho(o);return jx(Fi.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),l]))}function Ih({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=vt}){let i=Dt(e),s=Dt(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:Ho(o)},zeroForOne:l}}function O5({poolKey:e,poolId:t,tokenIn:n,tokenOut:r,fee:o,tickSpacing:i,hooks:s}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("uniswap-v4 exact poolKey must be an object");let a=Dt(e.currency0),c=Dt(e.currency1);if(a.toLowerCase()>=c.toLowerCase())throw new Error("uniswap-v4 exact poolKey requires canonical currency ordering");let l=Number(e.fee),u=Number(e.tickSpacing);if(!Number.isInteger(l)||l<0||l>16777215)throw new Error("uniswap-v4 exact poolKey requires uint24 fee");if(!Number.isInteger(u)||u<-8388608||u>8388607)throw new Error("uniswap-v4 exact poolKey requires int24 tickSpacing");let d=Ho(e.hooks),p={currency0:a,currency1:c,fee:l,tickSpacing:u,hooks:d},m=Dt(n),f=Dt(r);if(m.toLowerCase()===f.toLowerCase())throw new Error("tokenIn and tokenOut must differ");let h=new Set([a.toLowerCase(),c.toLowerCase()]);if(!h.has(m.toLowerCase())||!h.has(f.toLowerCase()))throw new Error("uniswap-v4 exact poolKey currencies do not match tokenIn/tokenOut");if(o!=null&&Number(o)!==l)throw new Error("uniswap-v4 exact poolKey fee conflicts with top-level fee");if(i!=null&&Number(i)!==u)throw new Error("uniswap-v4 exact poolKey tickSpacing conflicts with top-level tickSpacing");if(s!=null&&Ho(s).toLowerCase()!==d.toLowerCase())throw new Error("uniswap-v4 exact poolKey hooks conflict with top-level hooks");let g=jx(Fi.encode(["address","address","uint24","int24","address"],[a,c,l,u,d]));if(t!=null){if(!/^0x[0-9a-f]{64}$/i.test(String(t)))throw new Error("uniswap-v4 exact poolId must be bytes32");if(String(t).toLowerCase()!==g.toLowerCase())throw new Error(`uniswap-v4 exact poolId mismatch: expected ${g}`)}return{poolKey:p,poolId:g,zeroForOne:m.toLowerCase()===a.toLowerCase()}}function N5({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=kh(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==vt&&(c="low",a.push("nonzero hook requires independent contract review")),r&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),r&&e===vt&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==vt&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),n||(c="critical",a.push("pool is not initialized")),e!==vt&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==vt,returnsDelta:i,reasons:Object.freeze(a)})}async function _h(e={},t={}){let n=Ca(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=ji(e.tokenIn||"WETH",n.chainId),o=ji(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=Ho(e.hooks),{poolKey:c}=Ih({tokenIn:r,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),l=Uu(c),u=t.rpcCall||J,d=Bu.encodeFunctionData("getSlot0",[l]),p=Bu.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),a===vt?Promise.resolve(null):u(n.chainId,"eth_getCode",[a,"latest"],t)]),g=Bu.decodeFunctionResult("getSlot0",m),y=Bu.decodeFunctionResult("getLiquidity",f)[0],b=g[0],w=b>0n,S=a===vt?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&Ah),k=N5({hook:a,codePresent:S,initialized:w,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:w,sqrtPriceX96:b.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:y.toString(),dynamicFee:v}),hook:Object.freeze({address:a,codePresent:S,codeBytes:S?(h.length-2)/2:0,permissions:kh(a)}),risk:k})}async function jr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Ca(e.chainId??8453),s=ji(e.tokenIn||"WETH",n),a=ji(e.tokenOut||Gt[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.poolKey==null?null:O5({poolKey:e.poolKey,poolId:e.poolId,tokenIn:s,tokenOut:a,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks}),u=l?[{fee:l.poolKey.fee,tickSpacing:l.poolKey.tickSpacing}]:e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...xh],d=l?l.poolKey.hooks:e.hooks||vt,m=await Promise.all(u.map(async I=>{let N=l||Ih({tokenIn:s,tokenOut:a,fee:I.fee,tickSpacing:I.tickSpacing,hooks:d}),{poolKey:T,zeroForOne:D}=N,X=Du.encodeFunctionData("quoteExactInputSingle",[{poolKey:T,zeroForOne:D,exactAmount:c,hookData:"0x"}]);try{let H=await(t.rpcCall||J)(n,"eth_call",[{to:r,data:X},"latest"],t);if(!H||H==="0x")return{...I,ok:!1,error:"empty result"};let $=Du.decodeFunctionResult("quoteExactInputSingle",H);return{fee:I.fee,tickSpacing:I.tickSpacing,ok:!0,amountOut:$[0].toString(),gasEstimate:$[1].toString(),poolKey:T,zeroForOne:D,poolId:N.poolId||Uu({...T})}}catch(H){return{...I,ok:!1,error:String(H.message||H).slice(0,160)}}})),f=null;for(let I of m)I.ok&&(!f||BigInt(I.amountOut)>BigInt(f.amountOut))&&(f=I);if(!f){let I=m.map(N=>`${N.fee}/${N.tickSpacing}:${N.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${I}`)}let h=e.liquidityUsd==null?await Na({chainId:n,tokenA:s,tokenB:a,dexIds:Hx},t).catch(()=>[]):[],g=new Map;for(let I of h){let N=String(I.pairAddress||"").toLowerCase();N&&g.set(N,I)}let y=I=>g.get(String(I.poolId||"").toLowerCase())??null,b=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!l&&!(e.fee!=null&&e.tickSpacing!=null)&&b>0&&BigInt(f.amountOut)>0n){let I=BigInt(f.amountOut),T=m.filter(D=>D.ok&&Number((I-BigInt(D.amountOut))*10000n/I)<=b).filter(D=>y(D)?.liquidityUsd!=null).sort((D,X)=>y(X).liquidityUsd-y(D).liquidityUsd)[0];T&&T.poolId!==f.poolId&&(w={priceBestFee:f.fee,chosenFee:T.fee,chosenPoolUsd:y(T).liquidityUsd,bandBps:b},f=T)}let S=y(f),v=h[0]??null,k=S??v,A=e.liquidityUsd??S?.liquidityUsd??v?.liquidityUsd??null,E=e.liquidityUsd!=null?"caller":S?"pool":v?"pair":null;return we({venue:"uniswap-v4",chainId:n,chain:Gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,poolKey:Object.freeze({...f.poolKey}),zeroForOne:f.zeroForOne,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:A,liquiditySource:k,liquidityAttribution:E,liquidityPick:w,triedTiers:m,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Eh(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&&!qi(e.tokenIn)&&!qi(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&f.poolKey.hooks===vt&&!(f.fee&Ah)},{chainId:n,venue:i||r,amountOut:f.amountOut,liquidityUsd:A,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Oh(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Ca(e.chainId??8453),s=ji(e.tokenIn||"WETH",n),a=ji(e.tokenOut||Gt[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...xh],u=e.hooks||vt,p=await Promise.all(l.map(async h=>{let{poolKey:g,zeroForOne:y}=Ih({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),b=Du.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:y,exactAmount:c,hookData:"0x"}]);try{let w=await(t.rpcCall||J)(n,"eth_call",[{to:r,data:b},"latest"],t);if(!w||w==="0x")return{...h,ok:!1,error:"empty result"};let S=Du.decodeFunctionResult("quoteExactOutputSingle",w);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:S[0].toString(),gasEstimate:S[1].toString(),poolKey:g,zeroForOne:y,poolId:Uu({...g})}}catch(w){return{...h,ok:!1,error:String(w.message||w).slice(0,160)}}})),m=null;for(let h of p)h.ok&&(!m||BigInt(h.amountIn)<BigInt(m.amountIn))&&(m=h);if(!m){let h=p.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await vx({chainId:n,tokenA:s,tokenB:a,dexIds:Hx},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:Gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:m.amountIn,amountOut:c.toString(),gasEstimate:m.gasEstimate,fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,zeroForOne:m.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:p,best:!0,executionReady:!1,prepareReady:!1}}async function Nh(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(k=>Object.hasOwn(e,k)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=Ca(r);if(Ho(e.poolKey?.hooks??e.hooks)!==vt)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.poolKey?.fee??e.fee)&Ah)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=Dt(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let c=Number(e.slippageBps);if(!Number.isInteger(c)||c<0||c>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 l=Number(e.deadlineSeconds);if(!Number.isInteger(l)||l<30||l>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");let u=e.poolKey&&typeof e.poolKey=="object"?[e.poolKey.currency0,e.poolKey.currency1]:[];if(qi(e.tokenIn)||qi(e.tokenOut)||u.some(qi))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let d=await jr(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let p=BigInt(d.amountOut)*BigInt(1e4-c)/10000n,m={currency0:d.zeroForOne?d.tokenIn:d.tokenOut,currency1:d.zeroForOne?d.tokenOut:d.tokenIn,fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.hooks},h=Fi.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[m,d.zeroForOne,BigInt(d.amountIn),p,0n,"0x"]]),g=Fi.encode(["address","uint256"],[d.tokenIn,BigInt(d.amountIn)]),y=Fi.encode(["address","uint256"],[d.tokenOut,p]),b=Fi.encode(["bytes","bytes[]"],[k5,[h,g,y]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,v=E5.encodeFunctionData("execute",[A5,[b],S]);return U({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:S,quote:{...d,amountOutMinimum:p.toString(),slippageBps:c},hookInspection:null,requiresApproval:{token:d.tokenIn,spender:I5,amount:d.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:v,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Th(){return Object.entries(Gt).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Ch(e={}){let t=Ca(e.chainId??8453),n=await J(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 Fi,vt,Gt,xh,Du,E5,Bu,qx,x5,Ah,A5,k5,I5,_5,Hx,Hi=_(()=>{Ne();nr();Ot();oe();Fi=v5.defaultAbiCoder(),vt="0x0000000000000000000000000000000000000000",Gt={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},xh=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Du=new vh(["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)"]),E5=new vh(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Bu=new vh(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),qx=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"]]),x5=(1n<<14n)-1n,Ah=8388608;A5="0x10",k5="0x060c0f",I5="0x000000000022D473030F116dDEE9F6B43aC78BA3",_5="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Hx=["uniswap-v4","uniswapv4"]});function R5(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===T5)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===C5){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:P5[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 L5(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 M5(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 $5(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 zo(e={},t={}){let n=t.rpcCall||J,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=$5(o),s=[],a=null,c=!1,l=null;try{a=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=L5(f);if(!M5(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=R5(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,s.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){s.push(`gas estimation failed: ${f?.message||"unknown"}`)}s.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=a===p;return m&&s.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:a,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:s}}async function zx(e={}){let t=Date.now();try{let n=await zo({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 T5,C5,P5,Fu=_(()=>{Ne();T5="08c379a0",C5="4e487b71",P5=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 U5(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 s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}D5.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||n.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))qu.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 F5(e){let{ok:t,errors:n,warnings:r}=U5(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
5
5
|
- ${n.join(`
|
|
6
6
|
- `)}`);let o=e.capabilities||{},i=qu.filter(a=>typeof o[a]=="function"),s={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(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:qu.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of qu)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". 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(s)}function Lh(e){let t=F5(e);return Rh.set(t.chainId,t),t}function Vx(e){return Rh.get(Number(e))||null}function Wx(){return[...Rh.values()]}var qu,se,te,D5,Rh,Vo=_(()=>{qu=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),se=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),te=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),D5=/^0x[0-9a-fA-F]{40}$/;Rh=new Map});function Gx(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,feeIncludedInAmountOut:s=!1,oracleFeeBps:a=0,estimatedGas:c=null,liquidityUsd:l=null,error:u=null,executionReady:d=!1,meta:p={}}=e||{};if(u||n==null)return{source:t,quality:dn.FAILED,amountOut:null,error:u||"no amountOut returned"};let m=Pa(n);if(m==null||m<=0n)return{source:t,quality:dn.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(a);return{source:t,quality:o==null?dn.NO_GAS:dn.FULL,amountOut:m.toString(),minOut:Pa(r)?.toString()??null,gasUsd:o,feeUsd:i,feeIncludedInAmountOut:s===!0,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:c==null?null:String(c),liquidityUsd:l==null?null:Number(l),executionReady:d,meta:p}}async function Yx(e,t,{divisor:n=1000n}={}){let r=Pa(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(r)])}catch{return null}let a=Pa(i),c=Pa(s);if(a==null||c==null||a<=0n)return null;let l=Number(a)/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:a.toString(),fullAmountOut:c.toString()}}function Xx(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>n?(r.push({source:a.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(a.source),!0)}),s=[...e.warnings??[]];return r.length&&s.push(`dropped ${r.length} route(s) on price impact: `+r.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.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:s}}function Mh(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(I=>I.quality!==dn.FAILED),c=e.filter(I=>I.quality===dn.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(s),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,m=a.map(I=>{let N=BigInt(I.amountOut),T=0n,D=!1,X=!1,H=BigInt(I.oracleFeeBps??0),$=H>0n?N*H/10000n:0n;if(l){let B=I.gasUsd,V=Number(I.meta?.gasUnits??I.estimatedGas);if(B==null&&p&&Number.isFinite(V)&&V>0){let Oe=V*u/1e18*d;Number.isFinite(Oe)&&Oe>=0&&(B=Oe,X=!0)}let K=(B??0)+(I.feeIncludedInAmountOut?0:I.feeUsd??0);if(K>0){let Oe=K/t*10**n;Number.isFinite(Oe)&&Oe>=0&&(T=BigInt(Math.floor(Oe)),D=!0)}else B===0&&(D=!0)}let j=T+$,C=N>j?N-j:0n;return{...I,grossOut:N.toString(),netOut:C.toString(),costInDest:T.toString(),oracleFeeInDest:$.toString(),costAccounted:D,gasEstimated:X}}),f=Number(o)>0?Number(o):0,h=m.reduce((I,N)=>BigInt(N.netOut)>I?BigInt(N.netOut):I,0n),g=I=>h>0n?Number((h-BigInt(I))*10000n/h):0,y=[],b=(I,N)=>{let T=BigInt(I.netOut),D=BigInt(N.netOut);return T!==D?D>T?1:-1:String(I.source).localeCompare(String(N.source))},w=m.slice().sort(b)[0]??null;m.sort((I,N)=>{let T=g(I.netOut)<=f?0:1,D=g(N.netOut)<=f?0:1;if(r&&f>0&&T!==D)return T-D;if(r&&f>0){let X=I.liquidityUsd??-1,H=N.liquidityUsd??-1;if(X!==H)return H-X}return b(I,N)}),r&&f>0&&w&&m[0]&&m[0].source!==w.source&&y.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${w.source} within ${f} bps`);let S=m.filter(I=>!I.costAccounted).map(I=>I.source);l?S.length&&y.push(`gas not reported by: ${S.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):y.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let v=m[0];if(l&&v&&v.costAccounted===!1){let I=m.find(N=>N.costAccounted&&g(N.netOut)<=f);I&&y.push(`winner ${v.source} has UNMEASURED gas; gas-measured ${I.source} is within ${f} bps and may net more once ${v.source}'s real gas is paid \u2014 prefer it if unsure.`)}let k=m.filter(I=>I.gasEstimated).map(I=>I.source);k.length&&y.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 A=null,E=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let I=BigInt(m[0].netOut),N=BigInt(m[1].netOut);N>0n&&(A=Number((I-N)*10000n/N),E=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:A,spreadBasis:E,rankedOn:l?"net-of-cost":"gross",warnings:y}}async function ju(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>{let s;return Promise.race([o,new Promise((a,c)=>{s=setTimeout(()=>c(new Error(`${i}: timeout`)),t)})]).finally(()=>clearTimeout(s))};return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Gx({source:s,error:String(o.reason?.message||o.reason)}):Gx({source:s,...o.value})})}var dn,Kx,Pa,$h=_(()=>{Vo();dn=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Kx={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"},Pa=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Bh(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Hr}var Hr,Hu=_(()=>{Hr="0x000000000000000000000000000000000000dEaD"});import{Contract as q5,JsonRpcProvider as j5}from"ethers";function K5(e){return G5.test(String(e||""))}async function zu(e,{contract:t=H5,rpc:n=V5,chainId:r=z5,balanceOf:o}={}){if(!K5(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new j5(n,r,{staticNetwork:!0}),s=new q5(t,W5,i);return BigInt(await s.balanceOf(e))}var H5,z5,V5,W5,G5,Dh=_(()=>{H5="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",z5=999,V5="https://rpc.hyperliquid.xyz/evm",W5=["function balanceOf(address owner) view returns (uint256)"],G5=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Y5,readFileSync as X5,lstatSync as J5}from"node:fs";import{homedir as Jx}from"node:os";import{join as Uh}from"node:path";function e3(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Qx,t)?Qx[t]:Z5}function i3(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Zx])return String(e[Zx]);let t=e.ORACLE_CONFIG_DIR||Uh(Jx(),".config","oracle");return Uh(t,"fee-recipient")}return Uh(Jx(),".config","oracle","fee-recipient")}function Fh(e=process.env){try{let t=i3(e);if(!Y5(t)||J5(t).isSymbolicLink())return"";let n=X5(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function s3(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),Q5)}function a3({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[n3]||"").trim(),o=String(e[r3]||o3).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=e3(t),s=s3(e[t3],{fallback:r?i:0}),a=Math.min(s,i);if(!a)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=Fh(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function Vu({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=a3({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await zu(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function eA(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 tA(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function nA(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Q5,Z5,Qx,t3,n3,r3,Zx,o3,Ra=_(()=>{Dh();Q5=100,Z5=5,Qx=Object.freeze({swap:5,bridge:5,perps:0,nft:0});t3="ORACLE_INTEGRATOR_FEE_BPS",n3="ORACLE_INTEGRATOR_FEE_RECIPIENT",r3="ORACLE_INTEGRATOR_ID",Zx="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",o3="oracle"});var Wh={};lt(Wh,{LIFI_API:()=>rA,lifiChains:()=>Vh,lifiHealth:()=>Hh,lifiPrepare:()=>zh,lifiQuote:()=>ir});function jh(e={}){return(e.baseUrl||process.env.LIFI_API_URL||rA).replace(/\/$/,"")}function l3(e){let t=String(e||qh).toLowerCase();return t===qh.toLowerCase()||t===c3}function zi(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 Hh(e={}){let t=await x(`${jh(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 ir(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=qh,toToken:i,fromAmount:s,fromAddress:a=Hr}=e;if(n==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),l=Bt({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 Vu({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,y]of Object.entries(tA(u)))c.set(g,y);let d=await x(`${jh(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=we(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 zh(e={},t={}){let n=await ir(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");if(["nonce","authorizationList","maxFeePerBlobGas","blobVersionedHashes","blobs","kzg","signature","rawTransaction","signedTransaction","r","s","v"].find(d=>r[d]!=null))throw new Error("lifi: unsupported transaction authority");if(r.type!=null){let d=String(r.type).trim().toLowerCase();if(!/^(?:0x[0-9a-f]+|\d+)$/.test(d)||BigInt(d)>2n)throw new Error("lifi: unsupported transaction authority")}let i=Number(e.fromChain);if(r.chainId==null)throw new Error("lifi: transaction missing chain authority");if(Number(r.chainId)!==i)throw new Error("lifi: transaction chain mismatch");let s=e.fromAddress?zi(e.fromAddress,"transaction sender"):r.from?zi(r.from,"transaction sender"):null;if(!s)throw new Error("lifi: transaction missing sender authority");if(r.from&&zi(r.from,"transaction sender")!==s)throw new Error("lifi: transaction sender mismatch");let a=zi(r.to,"transaction target"),c=String(r.data);if(!/^0x(?:[0-9a-fA-F]{2})+$/.test(c))throw new Error("lifi: transaction calldata must be non-empty hex bytes");let l=String(r.value??"0x0");if(!/^(?:0x[0-9a-fA-F]+|\d+)$/.test(l))throw new Error("lifi: transaction value must be an unsigned integer string");let u=null;if(!l3(e.fromToken)){let d=n?.estimate?.approvalAddress||n?.approvalAddress;if(!d)throw new Error("lifi: ERC20 route missing approvalAddress");let p=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;u={token:zi(p,"approval token"),spender:zi(d,"approval spender"),amount:String(e.fromAmount)}}return U({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:i,quote:n,autoSlippage:n.autoSlippage,requiresApproval:u,transaction:{chainId:i,from:s,to:a,data:c,value:l,...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:De(n.autoSlippage,{chainId:i,venue:a,data:c})}},{provider:"lifi",kind:"lifi-tx",env:t.env,nowMs:t.nowMs,expiresAtMs:t.expiresAtMs})}async function Vh(e={}){return x(`${jh(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var rA,qh,c3,La=_(()=>{q();Ot();Hu();oe();Ra();rA="https://li.quest/v1";qh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",c3="0x0000000000000000000000000000000000000000"});var Xh={};lt(Xh,{PARASWAP_API:()=>oA,paraswapHealth:()=>Yh,paraswapPrepare:()=>Kh,paraswapPrice:()=>sr,paraswapTokens:()=>Wu});function Vi(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 Wu(e={},t={}){let n=Number(e.chainId||1);return x(`${Gh(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Vi(e.srcToken,"srcToken"),destToken:Vi(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 Vu({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(nA(o)))r.set(a,c);let i=await x(`${Gh(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...we(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,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 Kh(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=Vi(e.userAddress,"userAddress"),o=await sr(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Vi(e.srcToken,"srcToken"),destToken:Vi(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Vi(e.receiver,"receiver"));let c=await x(`${Gh(t)}/transactions/${n}`,{method:"POST",body:a,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()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return U({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.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:De(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Yh(e={}){let t=await Wu({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var oA,Gh,Ma=_(()=>{q();Ot();oe();Ra();oA="https://api.paraswap.io",Gh=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||oA).replace(/\/$/,"")});function Te({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let s=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:sA(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([sA(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!u?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[iA]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${iA}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function sA(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function pn(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function Ue(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var iA,gt=_(()=>{iA="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Zh={};lt(Zh,{ZEROX_API:()=>aA,zeroxHealth:()=>Jh,zeroxPrepare:()=>Qh,zeroxPrice:()=>Ku,zeroxQuote:()=>zr});function cA(e={}){return Te({provider:"zerox",defaultUrl:aA,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function lA(e={}){return cA(e).baseUrl}function Gu(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function uA(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Gu(e)},cA(e).trusted)}async function Jh(e={}){if(!Gu(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Ku({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 Ku(e={},t={}){if(!Gu(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),x(`${lA(t)}/swap/allowance-holder/price?${a}`,{headers:uA(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function zr(e={},t={}){if(!Gu(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let l=await x(`${lA(t)}/swap/allowance-holder/quote?${c}`,{headers:uA(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?we(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:a}}async function Qh(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await zr(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 U({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:De(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var aA,$a=_(()=>{q();Ot();gt();oe();aA="https://api.0x.org"});function dA(e={}){return Te({provider:"oneinch",defaultUrl:u3,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function eg(e={}){return dA(e).baseUrl}function Ba(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function tg(e={}){let t=Ba(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},dA(e).trusted)}async function pA(e={}){if(!Ba(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Da({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 Da(e={},t={}){if(!Ba(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 s=new URLSearchParams({src:r,dst:o,amount:String(i)}),a=await x(`${eg(t)}/${n}/quote?${s}`,{headers:tg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?we(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}function d3(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function ng(e={},t={}){if(!Ba(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return x(`${eg(t)}/${n}/approve/spender`,{headers:tg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function fA(e={},t={}){if(!Ba(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,s=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!s)throw new Error("oneinchPrepare requires src, dst, amount, from");let a=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`1inch: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:s,slippage:String(a.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 x(`${eg(t)}/${n}/swap?${c}`,{headers:tg(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(s).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=we(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!d3(r)){let f=l?.spender||l?.approvalAddress||(await ng({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 U({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||s,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:De(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var u3,rg=_(()=>{q();Ot();gt();oe();u3="https://api.1inch.dev/swap/v6.0"});function og(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function mA(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}var Qle,Yu=_(()=>{Qle=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Xu from"node:fs";import f3 from"node:os";import Gi from"node:path";import{fileURLToPath as m3}from"node:url";function hA(){return process.env.ORACLE_FAKE_HOME||f3.homedir()}function g3(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Ju(){return g3()?process.env.ORACLE_CONFIG_DIR||Gi.join(hA(),".config","oracle"):Gi.join(hA(),".config","oracle")}function y3(){return Gi.join(Ju(),"desk.json")}function b3(){return Gi.join(Ju(),"env")}function Wi({force:e=!1}={}){if(Wi._done&&!e)return Wi._result||null;Wi._done=!0;let t={},n=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=b3();if(Xu.existsSync(o))for(let i of Xu.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(s[1],a)}}catch{}try{let o=y3();if(Xu.existsSync(o)){let i=JSON.parse(Xu.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),Wi._result=Object.keys(t).length?t:null,Wi._result}var h3,oue,gA=_(()=>{h3=Gi.dirname(m3(import.meta.url)),oue=Gi.resolve(h3,"../..");try{Wi()}catch{}});var yA=_(()=>{});import{createHash as w3}from"node:crypto";function bA(e,t){if(e==null||typeof e!="object"||Array.isArray(e))throw new TypeError(`prepare verification: ${t} must be an object`);return e}function sg(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(sg).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${sg(e[n])}`).join(",")}}`}function k3(e){return w3("sha256").update(sg(e),"utf8").digest("hex")}function ig(e){let t=String(e||"").trim().toLowerCase().replace(/^0x/,"");return E3.test(t)?t:""}function I3(e,t="prepare verification"){if(bA(e,"prepared"),e.signed===!0)throw new Error(`${t}: prepared fact is signed`);if(e.broadcast===!0)throw new Error(`${t}: prepared fact claims broadcast`);for(let n of x3)if(e[n])throw new Error(`${t}: prepared fact carries ${n}`);for(let n of A3)if(e[n])throw new Error(`${t}: prepared fact claims executed ${n}`);return!0}function _3(e,t={}){let n=t.label||"prepare verification";if(bA(e,"artifact"),Number(e.version)!==S3)throw new Error(`${n}: unsupported verification artifact version`);if(e.kind!==v3)throw new Error(`${n}: verification artifact kind required`);if(e.custody!=="none")throw new Error(`${n}: verification artifact custody must be none`);if(e.execution!=="prepare-only")throw new Error(`${n}: verification artifact must stay prepare-only`);if(e.signingReady===!0||e.broadcastReady===!0||e.executionReady===!0)throw new Error(`${n}: verification artifact must not claim a ready execution flag`);if(e.attestation?.teeAttested===!0)throw new Error(`${n}: TEE attestation is not claimed or accepted`);if(!["ok","success","failed","error","unavailable","unknown"].includes(String(e.simulation?.status||"")))throw new Error(`${n}: simulation status required`);if(typeof e.intentSummary!="string"||!e.intentSummary.trim())throw new Error(`${n}: human-readable intent summary required`);if(!e.attestation||typeof e.attestation!="object")throw new Error(`${n}: attestation record required`);if(!Array.isArray(e.attestation.notClaimed)||!e.attestation.notClaimed.includes("tee-attestation"))throw new Error(`${n}: attestation must honestly exclude TEE claims`);let{artifactHash:r,...o}=e;if(ig(r)!==k3(o))throw new Error(`${n}: artifactHash mismatch \u2014 verification artifact was altered`);if(t.prepareHash){let i=ig(t.prepareHash),s=ig(e.prepareHash);if(!i||i!==s)throw new Error(`${n}: verification artifact does not bind this prepare`)}return e}function wA(e,t={}){let n=t.label||"armPreparedAction";if(!e||typeof e!="object")throw new Error(`${n}: prepared object required`);let r=e.prepareVerification||e.verificationArtifact||e.deskCheckpoint?.prepareVerification||t.checkpoint?.prepareVerification;if(!r)throw new Error(`${n}: prepare verification artifact required before arm`);return _3(r,{label:n,...e.prepareHash?{prepareHash:e.prepareHash}:{}}),I3(e,n),r}var S3,v3,due,E3,x3,A3,pue,SA=_(()=>{yA();oe();S3=1,v3="prepare-verification",due=Object.freeze({NONE:"none",PREPARE_CHECKSUM:"prepare-checksum",PREPARE_HMAC:"prepare-hmac"}),E3=/^(?:0x)?[0-9a-f]{64}$/i,x3=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),A3=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),pue=Object.freeze(["tee-attestation","remote-attestation","hardware-enclave","trusted-execution-environment","execution-authorization","signature","broadcast"])});var Ua={};lt(Ua,{armPreparedAction:()=>M3,callSigner:()=>vA,queueOwnerAction:()=>EA});import{existsSync as O3,readFileSync as N3}from"node:fs";import{request as T3}from"node:http";import C3 from"node:path";function R3(e=process.env){let t=String(e.ORACLE_SIGNER_URL||P3).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function L3(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=C3.join(Ju(),"signer","signer-token");return O3(t)?N3(t,"utf8").trim():null}function vA(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=R3(r),s=L3(r);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),l=n?Buffer.from(JSON.stringify(n)):null,u=T3({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...l?{"content-type":"application/json","content-length":l.length}:{}}},d=>{let p=[];d.on("data",m=>p.push(m)),d.on("end",()=>{let m=Buffer.concat(p).toString("utf8"),f={};try{f=m?JSON.parse(m):{}}catch{f={error:"signer refused"}}a({httpStatus:d.statusCode,...f})})});u.on("timeout",()=>{u.destroy(),a({ok:!1,error:"local signer timed out"})}),u.on("error",()=>a({ok:!1,error:"local signer is not running"})),l&&u.write(l),u.end()})}async function EA(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return vA("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function M3(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return wA(e,{env:t,label:"armPreparedAction"}),EA(n,t)}var P3,Fa=_(()=>{gA();SA();P3="http://127.0.0.1:9462"});var mg={};lt(mg,{COW_CANCEL_TYPES:()=>IA,COW_HOSTS:()=>Zu,COW_ORDER_TYPES:()=>Qu,COW_SETTLEMENT:()=>xA,COW_VAULT_RELAYER:()=>AA,armCowOrder:()=>F3,buildArmedCowOrder:()=>pg,cowCancelOrders:()=>W3,cowChains:()=>fg,cowHealth:()=>ug,cowOrder:()=>nd,cowOrderStatus:()=>td,cowOrderUid:()=>q3,cowPrepareCancel:()=>z3,cowPrepareOrder:()=>dg,cowQuote:()=>cr,cowSignCancel:()=>V3,cowSignOrder:()=>j3,cowSubmitSignedOrder:()=>H3,cowVerifyOrderFill:()=>K3});import{TypedDataEncoder as cg,getAddress as qa,isAddress as $3}from"ethers";function ed(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Zu[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function B3(e,t="v1",n={}){let r=ed(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function ar(e,t){let n=String(e||"").trim();if(!$3(n))throw new Error(`cowswap: ${t} must be an address`);return qa(n).toLowerCase()}function Ki(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 _A(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 OA(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 D3({digest:e,owner:t,validTo:n}={}){let r=_A(e,"order digest").slice(2),o=ar(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 lg(e){let t=xA[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:qa(t)}}function U3(e={},t,n){let r=ar(e.sellToken,"sellToken"),o=ar(e.buyToken,"buyToken"),i=ar(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=_A(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Ki(e.sellAmount,"sellAmount"),buyAmount:Ki(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Ki(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function ug(e={}){try{let t=await cr({chainId:1,sellToken:ag[1],buyToken:kA[1],sellAmountBeforeFee:"1000000000000000",from:Hr},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 cr(e={},t={}){let n=Number(e.chainId??1),r=Bh(e.from||e.owner),o=e.sellToken||ag[n],i=e.buyToken||kA[n],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ag[n],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await x(`${ed(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?we(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function dg(e={},t={}){let n=Number(e.chainId??1),r=ar(Bh(e.from||e.owner||e.signer),"owner"),o=await cr({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=U3(o?.quote||o,n,r),s=lg(n),a={domain:s,types:Qu,primaryType:"Order",message:i},c=cg.hash(s,Qu,i),l=AA[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return U({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:qa(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:qa(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:qa(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:pg({chainId:n,owner:r,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function pg(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=Zu[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=ar(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=cg.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function F3(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Fa(),Ua)),r=e.localSignerEnvelope||pg(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function td(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return x(`${ed(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function nd(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return x(`${ed(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function q3(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||cg.hash(lg(n),Qu,r),i=e.owner||e.from||e.signer||r.receiver;return D3({digest:o,owner:i,validTo:r.validTo})}async function j3(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 H3(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 z3(e={}){let t=Number(e.chainId??1),n=ar(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>OA(s,`orderUids[${a}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=lg(t);return U({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:IA,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function V3(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function W3(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function G3(e={}){return Ki(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function K3(e={},t={}){let n=Number(e.chainId??1),r=OA(e.uid||e.orderUid),o=t.order||await nd({chainId:n,uid:r},t),i=t.status||o.status||await td({chainId:n,uid:r},t).catch(()=>null),s=t.trades||await x(`${B3(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?ar(e.expectedOwner,"expectedOwner"):null;if(c&&ar(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:a};let l=0n;for(let p of a.filter(m=>String(m.orderUid||"").toLowerCase()===r))l+=BigInt(G3(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(Ki(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(Ki(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:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function fg(){return Object.keys(Zu).map(Number)}var Zu,xA,AA,ag,kA,Qu,IA,ja=_(()=>{q();Ot();Yu();Hu();oe();Zu={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"},xA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),AA=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ag={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},kA={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Qu=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"}]}),IA=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function Z3(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Y3).replace(/\/$/,"")}function NA(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||X3).replace(/\/$/,"")}function ej(e){let t=Array.isArray(e)?e:typeof e=="string"?e.split(","):[];return[...new Set(t.map(n=>String(n??"").trim()).filter(Boolean))].slice(0,100)}async function Kt(e,t={}){let n=ej(e);if(!n.length)throw new Error("llamaPrices requires coins[]");let r=n.map(encodeURIComponent).join(",");return x(`${Z3(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function TA(e={}){let n=(await Kt(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function rd(e={}){return x(`${NA(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function CA(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||J3).replace(/\/$/,""),r=await x(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(s=>String(s.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(s=>String(s.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(s=>!!s.stablecoin==!!e.stablecoin)),o.sort((s,a)=>Number(a.tvlUsd||0)-Number(s.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 od(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||Q3).replace(/\/$/,""),r=e.includePrices!==!1;return x(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function PA(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 x(`${NA(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function RA(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Kt(n,t),o={};for(let i of e){let s=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[s]||null}return o}var Y3,X3,J3,Q3,Wo=_(()=>{q();Y3="https://coins.llama.fi",X3="https://api.llama.fi",J3="https://yields.llama.fi",Q3="https://stablecoins.llama.fi"});var ad={};lt(ad,{ACROSS_API:()=>LA,HOP_API:()=>MA,RANGO_API:()=>BA,RELAY_API:()=>$A,acrossHealth:()=>hg,acrossSuggestedFees:()=>id,hopHealth:()=>gg,hopQuote:()=>sd,rangoQuote:()=>sj,relayHealth:()=>bg,relayPrepare:()=>wg,relayQuote:()=>Ha});async function hg(e={}){try{return{ok:!0,estimatedFillTimeSec:(await id({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 id(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:s}=e;if(!n||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||LA).replace(/\/$/,"");return x(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function gg(e={}){try{let t=await sd({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 sd(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||MA).replace(/\/$/,""),u=await x(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?we(u,{chainId:Number(e.originChainId||e.chainId||nj[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...u,autoSlippagePolicy:a}}function DA(e){return(e?.steps||[]).flatMap(t=>(t?.items||[]).filter(n=>n?.data?.to&&n?.data?.data).map(n=>({stepId:t.id,...n.data})))}function oj(e){let t=String(e?.data??"").toLowerCase();if(!t.startsWith(yg))return null;if(!/^0x[0-9a-f]{136}$/.test(t))throw new Error("relay: malformed ERC20 approval calldata");return{spender:`0x${t.slice(34,74)}`,amount:BigInt(`0x${t.slice(74,138)}`).toString()}}function ij(e){return DA(e).find(t=>!String(t.data).toLowerCase().startsWith(yg))??null}async function bg(e={}){try{let t=await Ha({user:Hr,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 Ha(e={},t={}){let{user:n=Hr,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=Bt({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||$A).replace(/\/$/,""),d=await x(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;if(!p||!/^\d+$/.test(String(p)))return{...d,autoSlippagePolicy:l};let m=ij(d);return we(d,{chainId:Number(r),venue:m?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function wg(e={},t={}){let n=await Ha(e,t),r=Number(e.originChainId),o=DA(n);if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase(),s=[],a=[];for(let u of o){if(u.chainId!=null&&Number(u.chainId)!==r)throw new Error("relay: transaction chain mismatch");if(e.user&&u.from&&String(u.from).toLowerCase()!==String(e.user).toLowerCase())throw new Error("relay: transaction sender mismatch");let d=oj(u);d?s.push({tx:u,approval:d}):a.push(u)}if(!a.length)throw new Error("relay: quote returned no bridge deposit transaction");if(a.some(u=>String(u.to).toLowerCase()!==i))throw new Error("relay: route execution target is not safely bound");if(s.length>1)throw new Error("relay: multiple token approvals are not supported");let c=null;if(s.length===1){let{tx:u,approval:d}=s[0],p=String(e.originCurrency||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(p)||p===rj)throw new Error("relay: native route returned an ERC20 approval");if(String(u.to).toLowerCase()!==p)throw new Error("relay: approval token mismatch");if(d.amount!==String(e.amount))throw new Error("relay: approval amount must equal the exact input amount");if(!a.some(m=>String(m.to).toLowerCase()===d.spender))throw new Error("relay: approval spender does not match the bridge target");c={token:p,spender:d.spender,amount:String(e.amount)}}let l=o.map(u=>({chainId:r,from:u.from||e.user,to:u.to,data:u.data,value:u.value??"0x0",...u.gasLimit!=null||u.gas!=null?{gasLimit:u.gasLimit??u.gas}:{},...String(u.data).toLowerCase().startsWith(yg)?{}:{slippageGuard:De(n.autoSlippage,{chainId:r,venue:u.to,data:u.data})}}));return U({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,requiresApproval:c,destination:i,transactions:l},{provider:"relay",kind:"relay-tx",env:t.env,nowMs:t.nowMs,expiresAtMs:t.expiresAtMs})}async function sj({from:e,to:t,amount:n,slippage:r=1,enableCentralizedSwappers:o=!1}={},i={}){if(!e||!t||!n)throw new Error("rangoQuote requires from, to, amount");let s=i.env??process.env,a=i.rangoApiKey||s.RANGO_API_KEY;if(!a)throw new Error("rango: RANGO_API_KEY is required");let c=new URLSearchParams({from:e,to:t,amount:String(n),slippage:String(r),enableCentralizedSwappers:o?"true":"false",apiKey:a}),l=(i.rangoBaseUrl||process.env.RANGO_API_URL||BA).replace(/\/$/,""),u;try{u=await x(`${l}/basic/quote?${c}`,{fetchImpl:i.fetchImpl,timeoutMs:i.timeoutMs??2e4,retries:i.retries})}catch(d){let p=Number.isInteger(d?.status)?` (HTTP ${d.status})`:"";throw new Error(`rango: request failed${p}`)}if(u?.error||u?.resultType&&u.resultType!=="OK"){let d=String(u?.error||u.resultType).split(a).join("[redacted]").split(encodeURIComponent(a)).join("[redacted]").slice(0,160);throw new Error(`rango: ${d}`)}return{amountOut:u?.route?.outputAmount,feeUsd:u?.route?.feeUsd??null,estimatedTime:u?.route?.estimatedTimeInSeconds}}var LA,MA,$A,BA,nj,yg,rj,cd=_(()=>{q();Ot();Hu();oe();LA="https://across.to/api",MA="https://api.hop.exchange/v1",$A="https://api.relay.link",BA="https://api.rango.exchange",nj={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};yg="0x095ea7b3",rj="0x0000000000000000000000000000000000000000"});function ld(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Ut(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}function UA(e){return Array.isArray(e)?e.flatMap((t,n)=>{let r=String(t?.amountUSD??"").trim();return/^\d+(?:\.\d+)?$/.test(r)?[{name:String(t?.name??t?.type??`cost-${n+1}`),amountUsd:r}]:[]}):[]}async function qA(e,t={}){let n=Kx[Number(e)];if(!n)return null;try{let r=await Kt([n],t);return Ut(r?.coins?.[n]?.price)}catch{return null}}async function aj(e={}){try{let t=await rd({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function cj(e,t={}){let n=Vr(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...FA[n]||[n]),r.push(...FA[Vr(e)]||[e]),r}function lj(e,t,n={}){let r=Array.isArray(e)?e:[],o=cj(t,n).map(Vr).filter(Boolean);for(let i of o){let s=r.find(c=>Vr(c?.slug)===i||Vr(c?.name)===i),a=Ut(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=r.find(c=>{let l=Vr(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:Vr(c?.slug).includes(i)||Vr(c?.name).includes(i)}),a=Ut(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Sg({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:l=null,v4PoolKey:u=null,v4PoolId:d=null,v4LiquidityUsd:p=null,opts:m={}}){let f=[];return f.push({source:"lifi",run:async()=>{let h=await ir({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},m),g=h?.estimate??h?.[0]?.estimate;return{amountOut:g?.toAmount,minOut:g?.toAmountMin,gasUsd:ld(g?.gasCosts),feeUsd:ld(g?.feeCosts),oracleFeeBps:h?.oracleFee?.applies?h.oracleFee.bps:0,meta:{tool:h?.tool??h?.toolDetails?.name,oracleFee:h?.oracleFee??null}}}}),s!=null&&f.push({source:"paraswap",run:async()=>{let h=a??(await Promise.resolve(l))?.decimals;if(h==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let g=await sr({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:h},m),y=g?.priceRoute;return{amountOut:y?.destAmount,gasUsd:Ut(y?.gasCostUSD),oracleFeeBps:g?.oracleFee?.applies?g.oracleFee.bps:0,meta:{bestRoute:y?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:g?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&f.push({source:"0x",run:async()=>{let h=await zr({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},m),g=null,y=h?.totalNetworkFee,b=await Promise.resolve(c);return y!=null&&b&&(g=Number(y)/1e18*b),{amountOut:h?.buyAmount,minOut:h?.minBuyAmount,gasUsd:g,meta:{source:h?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&f.push({source:"1inch",run:async()=>{let h=await Da({chainId:e,src:t,dst:n,amount:r},m),g=null;return h?.gas!=null&&c&&(g=null),{amountOut:h?.dstAmount,gasUsd:g,meta:{gasUnits:h?.gas}}}}),f.push({source:"cow",run:async()=>{let h=await cr({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},m),g=h?.quote??h,y=g?.feeAmount;return{amountOut:g?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:y,settlement:"solver-executed"}}}}),Gt[Number(e)]&&f.push({source:"uniswap-v4",run:async()=>{let h=u&&typeof u=="object"?{fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks,poolKey:u,poolId:d,liquidityUsd:p}:{},g=await jr({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,...h},m);return{amountOut:g?.amountOut,minOut:g?.minOut??g?.amountOutMinimum??null,gasUsd:null,liquidityUsd:g?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:g?.fee,tickSpacing:g?.tickSpacing,poolId:g?.poolId,hooks:g?.hooks,gasUnits:g?.gasEstimate,quoter:g?.quoter,poolManager:g?.poolManager,prepareReady:g?.prepareReady===!0,executionReady:!1}}}}),St[Number(e)]&&f.push({source:"uniswap-v3",run:async()=>{let h=await or({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},m);return{amountOut:h?.amountOut,minOut:h?.minOut??h?.amountOutMinimum??null,gasUsd:null,liquidityUsd:h?.liquidityUsd??null,meta:{onchain:!0,fee:h?.fee,gasUnits:h?.gasEstimate,quoter:h?.quoter}}}}),f}function jA({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,slippageBps:s,allowedSources:a,opts:c={}}){let l=[],u=null,d=async(m,f={})=>(u||=aj(c),lj(await u,m,f));if(l.push({source:"lifi",run:async()=>{let m=await ir({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,slippageBps:s},c),f=m?.estimate??m?.[0]?.estimate,h=(m?.includedSteps??m?.steps??[]).map((b,w)=>({id:String(b?.id??`step-${w+1}`),type:String(b?.type??"route"),tool:String(b?.tool??b?.toolDetails?.name??"LI.FI"),fromChainId:Number(b?.action?.fromChainId??e),toChainId:Number(b?.action?.toChainId??t)})),g={tool:m?.tool??m?.toolDetails?.name,durationSeconds:Ut(f?.executionDuration),destinationDecimals:Ut(m?.action?.toToken?.decimals),routeSteps:h,feeCosts:UA(f?.feeCosts),gasCosts:UA(f?.gasCosts)},y=await d("lifi",g);return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:ld(f?.gasCosts),feeUsd:ld(f?.feeCosts),feeIncludedInAmountOut:!0,oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,liquidityUsd:y?.liquidityUsd??null,meta:{...g,liquidityProtocol:y?.protocol,oracleFee:m?.oracleFee??null}}}}),l.push({source:"relay",run:async()=>{let{relayQuote:m}=await Promise.resolve().then(()=>(cd(),ad)),f=await m({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o),slippageBps:s},c),h=f?.details,g=(f?.steps??[]).map((k,A)=>({id:String(k?.id??`step-${A+1}`),type:String(k?.kind??"transaction"),tool:"Relay",label:String(k?.description??k?.action??k?.id??`Step ${A+1}`),fromChainId:Number(e),toChainId:Number(t)})),y=String(f?.fees?.relayer?.amountUsd??"").trim(),b=String(f?.fees?.gas?.amountUsd??"").trim(),w=String(h?.totalImpact?.usd??"").trim(),S={durationSeconds:Ut(h?.timeEstimate),rate:h?.rate,destinationDecimals:Ut(h?.currencyOut?.currency?.decimals),routeSteps:g,feeCosts:[.../^\d+(?:\.\d+)?$/.test(y)?[{name:"relayer",amountUsd:y}]:[],.../^-?\d+(?:\.\d+)?$/.test(w)?[{name:"total-impact",amountUsd:w}]:[]],gasCosts:/^\d+(?:\.\d+)?$/.test(b)?[{name:"origin-gas",amountUsd:b}]:[]},v=await d("relay",S);return{amountOut:h?.currencyOut?.amount,minOut:h?.currencyOut?.minimumAmount,gasUsd:Ut(f?.fees?.gas?.amountUsd),feeUsd:Ut(f?.fees?.relayer?.amountUsd)??(Ut(h?.totalImpact?.usd)!=null?Math.abs(Ut(h.totalImpact.usd)):null),feeIncludedInAmountOut:!0,liquidityUsd:v?.liquidityUsd??null,meta:{...S,liquidityProtocol:v?.protocol}}}}),l.push({source:"across",run:async()=>{let{acrossSuggestedFees:m}=await Promise.resolve().then(()=>(cd(),ad)),f=await m({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},c),h=f?.totalRelayFee?.total,g=null;if(h!=null)try{let b=BigInt(String(o))-BigInt(String(h));b>0n&&(g=b.toString())}catch{}let y=await d("across");return{amountOut:g,gasUsd:null,liquidityUsd:y?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Ut(f?.estimatedFillTimeSec),limits:f?.limits?{min:f.limits.minDeposit,max:f.limits.maxDeposit}:void 0,liquidityProtocol:y?.protocol}}}}),!Array.isArray(a))return l;let p=new Set(a.map(m=>String(m).toLowerCase()));return l.filter(m=>p.has(m.source))}var Ut,Vr,FA,HA=_(()=>{La();Ma();$a();rg();ja();Ui();Hi();Wo();$h();Ut=e=>{let t=Number(e);return Number.isFinite(t)?t:null};Vr=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),FA=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var GA={};lt(GA,{BRIDGE_REVIEW_SOURCES:()=>vg,QUALITY:()=>dn,bestBridgeRoute:()=>pj,bestSwapRoute:()=>Eg,formatComparisonNote:()=>ud,normalizeBridgeRouteOptions:()=>VA});function zA(e,t,n){let r=t.find(i=>Mi(i));if(r==null)return null;let o=Ea(r)?.name||`chain ${r}`;return{kind:e,...n,best:null,routes:[],failed:[],improvementBps:null,spreadBasis:null,rankedOn:null,warnings:[],unsupported:!0,readOnlyChain:Number(r),sourcesTried:0,sourcesAnswered:0,note:`${o} (${r}) is registered read-only: no swap venue or route source covers it. This is UNSUPPORTED, not a failed quote. Oracle reads balances and calls there; it does not quote or prepare.`}}function dj(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<1||t>100)throw new Error("slippageBps must be an integer from 1 through 100");return t}function VA(e,t=vg){let n=new Set((Array.isArray(t)?t:vg).map(s=>String(s).toLowerCase())),r=(e?.routes??[]).filter(s=>n.has(s.source)),o=new Set(r.map(s=>s.source)),i=(e?.failed??[]).filter(s=>n.has(s.source)&&!o.has(s.source));return[...r,...i].map(s=>({provider:s.source,status:s.quality===dn.FAILED?"unavailable":"quoted",amountOut:s.amountOut??null,minAmountOut:s.minOut??null,netAmountOut:s.netOut??null,feeUsd:s.feeUsd??null,gasUsd:s.gasUsd??null,etaSeconds:s.meta?.durationSeconds??null,decimalsOut:s.meta?.destinationDecimals??null,routeSteps:Array.isArray(s.meta?.routeSteps)?s.meta.routeSteps:[],feeCosts:Array.isArray(s.meta?.feeCosts)?s.meta.feeCosts:[],gasCosts:Array.isArray(s.meta?.gasCosts)?s.meta.gasCosts:[],selected:s.source===e?.best?.source,error:s.error??null}))}async function WA(e,t,n){let r=uj[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await Kt([o],n))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function Eg(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 s=zA("swap",[n],{chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i)});if(s)return s;let a=qA(n,t),c=WA(n,o,t),l=nh(n,t).catch(()=>null),u=Sg({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:c,opts:t}),[d,p,m]=await Promise.all([ju(u,{timeoutMs:t.timeoutMs??12e3}),c,l]);a.catch(()=>{});let f=await a.then(y=>y,()=>null),h=Mh(d,{destPriceUsd:p.priceUsd,destDecimals:e.decimalsOut??p.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:m,nativePriceUsd:f}),g=t.maxImpactPct===void 0?25:t.maxImpactPct;if(g!=null&&h.best){let y=h.best.source,w=await Yx(async S=>{let v=Sg({...e,amountIn:S.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:c,opts:t}).filter(A=>A.source===y);return v.length?(await ju(v,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(w){let S=Xx(h,{[y]:w},{maxImpactPct:g});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...S,sourcesTried:u.length,sourcesAnswered:d.filter(v=>v.quality!==dn.FAILED).length,note:ud(S,u.length),priceImpact:{[y]:Number(w.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...h,sourcesTried:u.length,sourcesAnswered:d.filter(y=>y.quality!==dn.FAILED).length,note:ud(h,u.length)}}async function pj(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s}=e;if(n==null||r==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(n)===Number(r))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=zA("bridge",[n,r],{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s)});if(a)return a;let c=dj(e.slippageBps),l={...e,slippageBps:c},u=WA(r,i,t),d=jA({...l,opts:t}),[p,m]=await Promise.all([ju(d,{timeoutMs:t.timeoutMs??15e3}),u]),f=Mh(p,{destPriceUsd:m.priceUsd,destDecimals:e.decimalsOut??m.decimals,liquidityFirst:!1,liquidityBandBps:0}),h=f.routes.map(g=>({source:g.source,seconds:g.meta?.durationSeconds??null})).filter(g=>g.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),slippageBps:c,...f,routeOptions:VA(f,e.allowedSources),durations:h,sourcesTried:d.length,sourcesAnswered:p.filter(g=>g.quality!==dn.FAILED).length,note:ud(f,d.length)}}function fj(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${eA(t)}`:""}function ud(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=fj(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 s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var uj,vg,xg=_(()=>{$h();HA();Ra();Wo();Ne();Fo();uj={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"},vg=Object.freeze(["lifi","relay"])});async function KA(e,t={}){if(yj.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(!gj.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(hj.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 Eg(e,t);if(!r.best){if(r.unsupported===!0)return{ok:!1,unsupported:!0,reason:r.note,priceImpactBlocked:!1,impactRejected:[],comparison:r};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 s=Ag[o];if(!s){let g=r.routes.find(y=>Ag[y.source]&&y.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 a;try{a=await s(e,t)}catch(g){let y=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",b=[String(g?.message||g),y].filter(Boolean).join(" :: "),w=/allowance/i.test(b),S=!w&&/not enough|insufficient|balance/i.test(b),v,k;w?(k="approval-required-first",v=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${b}`):S?(k="taker-not-funded",v=`${o} refused to build the transaction: ${b}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(k="provider-error",v=`${o} prepare failed: ${b}`);let A=r.routes.find(E=>Ag[E.source]&&E.source!==o);return{ok:!1,reason:v,failureKind:k,...A?{alternative:A.source}:{},comparison:r}}let c=e.driftToleranceBps??mj,l=null,u=null;if(a.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),y=BigInt(a.amountOut);g>0n&&(l=Number((y-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,y)=>Math.max(g,y.liquidityUsd??0),0)||null,f=i.liquidityUsd??null,h=f!=null&&m>0?Math.round(f/m*100):null;return U({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??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===Wr.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...a.artifactKind===Wr.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"})}var Wr,mj,Ag,hj,gj,yj,YA=_(()=>{xg();oe();Wr=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),mj=100,Ag={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Ui(),Sh)),a=await s({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Wr.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:l},u)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Hi(),Ph)),p=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:l},u);return{artifactKind:Wr.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:s}=await Promise.resolve().then(()=>(La(),Wh)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Wr.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Ma(),Xh)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:Wr.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:s}=await Promise.resolve().then(()=>($a(),Zh)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Wr.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(ja(),mg)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Wr.TYPED_DATA_ORDER,typedData:a.typedData,owner:a.owner,cowGuard:a.cowGuard,requiresApproval:{...a.requiresApproval,note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,vaultRelayer:a.vaultRelayer,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}},hj=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),gj=/^0x[0-9a-fA-F]{40}$/,yj=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});import{Interface as ZA,getAddress as Gr,id as bj,isAddress as wj}from"ethers";function Xi(e){let t=Number(e),n=Yi[t];if(!n)throw new Error(`lp-exit: unsupported chain ${e}; supported: ${Object.keys(Yi).join(", ")}`);return{chainId:t,...n}}function Ko(e,t){if(!wj(String(e||"")))throw new Error(`lp-exit: ${t} must be a valid address`);return Gr(String(e))}function ek(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`lp-exit: ${t} must be an unsigned integer`)}if(n<=0n)throw new Error(`lp-exit: ${t} must be positive`);return n}function xj(e){let t=Number(e??50);if(!Number.isInteger(t)||t<1||t>100)throw new Error("lp-exit: slippageBps must be an integer from 1 to 100");return t}function Aj(e,t){let n=Number(e.deadlineSeconds??300);if(!Number.isInteger(n)||n<30||n>600)throw new Error("lp-exit: deadlineSeconds must be an integer from 30 to 600");let r=Number(t.nowSeconds??Math.floor(Date.now()/1e3));if(!Number.isInteger(r)||r<=0)throw new Error("lp-exit: invalid current time");return r+n}function JA(e,t){if(e===0n)return 0n;let n=e*BigInt(1e4-t)/10000n;return n>0n?n:1n}function tk(e,t){if(!vj.test(String(e||"")))throw new Error(`lp-exit: valid ${t} transaction hash required`);return String(e).toLowerCase()}async function kg(e,t,n,r){return(r.rpcCall||J)(e,t,n,r)}function Go(e,t){return String(e||"").toLowerCase()===String(t||"").toLowerCase()}async function nk(e,t,n,r,o){let[i,s]=await Promise.all([kg(e,"eth_getTransactionReceipt",[t],r),kg(e,"eth_getTransactionByHash",[t],r)]),a=i?.status===1||i?.status==="1"||i?.status==="0x1";if(!i||!s||!a||!Go(i.transactionHash,t)||!Go(s.hash,t))throw new Error(`lp-exit: live confirmed successful ${o} receipt and transaction required`);if(!Go(s.from,n.from)||!Go(s.to,n.to)||!Go(s.input??s.data,n.data))throw new Error(`lp-exit: ${o} transaction does not match prepared from/to/input`);return{receipt:i,txHash:t}}function rk(e,t,n){let r=new Set(t.map(s=>s.toLowerCase())),o=`0x${n.slice(2).toLowerCase().padStart(64,"0")}`,i=new Map(t.map(s=>[s.toLowerCase(),0n]));for(let s of e.logs||[]){let a=String(s.address||"").toLowerCase();if(!r.has(a)||!Go(s.topics?.[0],Ej)||!Go(s.topics?.[2],o))continue;let c;try{c=BigInt(s.data)}catch{throw new Error("lp-exit: malformed ERC20 Transfer amount in receipt")}c>0n&&i.set(a,i.get(a)+c)}return i}function ok(e,t,n){if(fh(e,{providers:["lp-exit"],label:"lp-exit continuation",nowMs:n.nowMs??(n.nowSeconds==null?Date.now():Number(n.nowSeconds)*1e3)}),e.phase!==t)throw new Error(`lp-exit: ${t} prepared artifact required`)}async function QA(e,t,n,r){return(r.rpcCall||J)(e,"eth_call",[{to:t,data:n},"latest"],r)}async function Ig(e,t,n,r){let i=await(n.simulateTransaction||zo)({chainId:e,tx:t},n);if(i?.status==="unavailable"||i?.willRevert==null)throw new Error(`lp-exit: ${r} simulation unavailable; refusing unsigned transaction`);if(i?.status!=="ok"||i?.willRevert){let s=i?.revert?.reason||i?.error||"would revert";throw new Error(`lp-exit: ${r} simulation failed: ${s}`)}return i}async function _g(e={},t={}){if(Object.hasOwn(e,"positionManager"))throw new Error("lp-exit: positionManager is not accepted from callers; the reviewed registry is authoritative");let n=Xi(e.chainId),r=Ko(e.owner,"owner"),o=ek(e.tokenId,"tokenId"),i=Gr(n.positionManager),[s,a]=await Promise.all([QA(n.chainId,i,lr.encodeFunctionData("ownerOf",[o]),t),QA(n.chainId,i,lr.encodeFunctionData("positions",[o]),t)]),c=Gr(lr.decodeFunctionResult("ownerOf",s)[0]);if(c!==r)throw new Error(`lp-exit: owner mismatch; position ${o} belongs to ${c}`);let l=lr.decodeFunctionResult("positions",a);return Object.freeze({chainId:n.chainId,chain:n.name,venue:n.venue,positionManager:i,registrySource:n.source,tokenId:o.toString(),owner:r,operator:Gr(l[1]),token0:Gr(l[2]),token1:Gr(l[3]),fee:Number(l[4]),tickLower:Number(l[5]),tickUpper:Number(l[6]),liquidity:l[7].toString(),tokensOwed0:l[10].toString(),tokensOwed1:l[11].toString()})}async function ik(e={},t={}){if(Object.hasOwn(e,"positionManager"))throw new Error("lp-exit: positionManager is not accepted from callers; the reviewed registry is authoritative");let n=await _g(e,t),r=Xi(n.chainId),o=BigInt(n.liquidity);if(o<=0n)throw new Error("lp-exit: position has no active liquidity; collect-only exits are not yet supported");let i=e.liquidity==null?o:ek(e.liquidity,"liquidity");if(i>o)throw new Error("lp-exit: requested liquidity exceeds live position liquidity");let s=xj(e.slippageBps),a=Aj(e,t),c=lr.encodeFunctionData("decreaseLiquidity",[{tokenId:BigInt(n.tokenId),liquidity:i,amount0Min:0n,amount1Min:0n,deadline:a}]),l={chainId:n.chainId,from:n.owner,to:n.positionManager,data:c,value:"0"},u=await Ig(n.chainId,l,t,"amount probe");if(!u.returnData||u.returnData==="0x")throw new Error("lp-exit: amount probe simulation returned no amounts");let d,p;try{[d,p]=lr.decodeFunctionResult("decreaseLiquidity",u.returnData)}catch{throw new Error("lp-exit: amount probe simulation returned malformed amounts")}if(d===0n&&p===0n)throw new Error("lp-exit: live removal currently returns zero assets");let m=JA(d,s),f=JA(p,s),h=lr.encodeFunctionData("decreaseLiquidity",[{tokenId:BigInt(n.tokenId),liquidity:i,amount0Min:m,amount1Min:f,deadline:a}]),g=lr.encodeFunctionData("collect",[{tokenId:BigInt(n.tokenId),recipient:n.owner,amount0Max:XA,amount1Max:XA}]),y=lr.encodeFunctionData("multicall",[[h,g]]),b={chainId:n.chainId,from:n.owner,to:n.positionManager,data:y,value:"0"},w=await Ig(n.chainId,b,t,"guarded remove-and-collect");return U({provider:"lp-exit",phase:"remove-and-collect",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:a,position:n,liquidity:i.toString(),slippageBps:s,expected:{amount0:d.toString(),amount1:p.toString()},minimums:{amount0Min:m.toString(),amount1Min:f.toString()},transaction:b,simulation:w,continuation:{operation:"prepareLpSettlementToWrappedNative",requiresConfirmedReceipt:!0,requiresTransferProofFor:[n.token0,n.token1],note:"Re-read the mined transaction and receipt; only token Transfer logs to the bound owner are settlement evidence."}},{provider:"lp-exit",kind:"univ3-remove-and-collect",nowMs:t.nowMs??Number(t.nowSeconds??Math.floor(Date.now()/1e3))*1e3,expiresAtMs:a*1e3})}async function sk(e={},t={}){let n=e.removalPrepared;ok(n,"remove-and-collect",t);let r=Xi(n.chainId),o=Ko(n.position?.owner,"prepared owner");if(e.chainId!=null&&Number(e.chainId)!==r.chainId)throw new Error("lp-exit: chainId does not match prepared removal");if(e.owner!=null&&Ko(e.owner,"owner")!==o)throw new Error("lp-exit: owner does not match prepared removal");let i=tk(e.removalTxHash,"removal"),{receipt:s}=await nk(r.chainId,i,n.transaction,t,"removal"),a=Gr(r.wrappedNative),c=[Ko(n.position.token0,"prepared token0"),Ko(n.position.token1,"prepared token1")],l=rk(s,c,o),u=c.map(f=>({token:f,amount:l.get(f.toLowerCase()).toString()})).filter(f=>BigInt(f.amount)>0n);if(u.length===0)throw new Error("lp-exit: removal receipt proves no token transfers to prepared owner");let d=0n,p=[],m=t.prepareBestRoute||KA;for(let f of u){if(f.token===a){d+=BigInt(f.amount);continue}let h=await m({chainId:r.chainId,tokenIn:f.token,tokenOut:a,amountIn:f.amount,taker:o,maxSlippageBps:e.maxSlippageBps??100},t);if(!h?.ok||!h?.transaction)throw new Error(`lp-exit: no preparable net route for ${f.token}: ${h?.reason||"unknown failure"}`);p.push(Object.freeze({tokenIn:f.token,amountIn:f.amount,...h}))}return U({provider:"lp-exit",phase:"settle-to-wrapped-native",chainId:r.chainId,owner:o,removalTxHash:i,removalPrepareHash:n.prepareHash,position:n.position,wrappedNative:a,alreadyWrappedNative:d.toString(),routes:Object.freeze(p),warnings:Object.freeze(p.filter(f=>f.comparison?.rankedOn==="gross").map(f=>`${f.tokenIn} route ranked on gross output; gas was not accounted for`)),continuation:Object.freeze({operation:"prepareLpUnwrapNative",requiresConfirmedSwapReceipts:p.length>0,requiresWrappedNativeTransferProof:p.length>0,note:"Match every mined swap to its prepared route and derive wrapped-native received from Transfer logs before unwrapping."})},{provider:"lp-exit",kind:"univ3-settlement-routes",nowMs:t.nowMs??Date.now(),expiresAtMs:n.expiresAt})}async function ak(e={},t={}){let n=e.settlementPrepared;ok(n,"settle-to-wrapped-native",t);let r=Xi(n.chainId),o=Ko(n.owner,"prepared owner");if(e.chainId!=null&&Number(e.chainId)!==r.chainId)throw new Error("lp-exit: chainId does not match prepared settlement");if(e.owner!=null&&Ko(e.owner,"owner")!==o)throw new Error("lp-exit: owner does not match prepared settlement");let i=e.swapTxHashes??[];if(!Array.isArray(i)||i.length!==n.routes.length)throw new Error("lp-exit: one live swap transaction hash required for every prepared route");let s=Gr(r.wrappedNative),a=BigInt(n.alreadyWrappedNative),c=[];for(let p=0;p<n.routes.length;p+=1){let m=tk(i[p],"swap"),{receipt:f}=await nk(r.chainId,m,n.routes[p].transaction,t,`swap ${p+1}`),h=rk(f,[s],o).get(s.toLowerCase());if(h<=0n)throw new Error(`lp-exit: swap ${p+1} receipt proves no wrapped-native transfer to owner`);a+=h,c.push(m)}if(a<=0n)throw new Error("lp-exit: no receipt-proven wrapped-native amount to unwrap");let l=Sj.encodeFunctionData("withdraw",[a]),u={chainId:r.chainId,from:o,to:s,data:l,value:"0"},d=await Ig(r.chainId,u,t,"wrapped-native unwrap");return U({provider:"lp-exit",phase:"unwrap-native",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r.chainId,owner:o,swapTxHashes:c,settlementPrepareHash:n.prepareHash,nativeAmount:a.toString(),transaction:u,simulation:d,note:"UNSIGNED. The user's wallet must sign; Oracle does not broadcast or custody the native asset."},{provider:"lp-exit",kind:"wrapped-native-withdraw",nowMs:t.nowMs??Date.now(),expiresAtMs:n.expiresAt})}async function ck(){return Object.entries(Yi).map(([e,t])=>({chainId:Number(e),...t}))}async function lk(e={},t={}){let n=e.chainId==null?Object.keys(Yi).map(o=>Xi(o)):[Xi(e.chainId)],r=await Promise.all(n.map(async o=>{try{let i=await kg(o.chainId,"eth_getCode",[o.positionManager,"latest"],t),s=typeof i=="string"&&/^0x[0-9a-fA-F]+$/.test(i)&&i!=="0x";return{chainId:o.chainId,positionManager:o.positionManager,ok:s}}catch(i){return{chainId:o.chainId,positionManager:o.positionManager,ok:!1,error:String(i?.message||i)}}}));return{ok:r.every(o=>o.ok),chains:r}}var Yi,lr,Sj,XA,vj,Ej,Og=_(()=>{Ne();Fu();YA();oe();Yi=Object.freeze({1:Object.freeze({name:"ethereum",positionManager:"0xC36442b4a4522E871399CD717aBDD847Ab11FE88",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments"}),8453:Object.freeze({name:"base",positionManager:"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",wrappedNative:"0x4200000000000000000000000000000000000006",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"})}),lr=new ZA(["function ownerOf(uint256 tokenId) view returns (address)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline) params) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max) params) payable returns (uint256 amount0,uint256 amount1)","function multicall(bytes[] data) payable returns (bytes[] results)"]),Sj=new ZA(["function withdraw(uint256 wad)"]),XA=(1n<<128n)-1n,vj=/^0x[0-9a-fA-F]{64}$/,Ej=bj("Transfer(address,address,uint256)").toLowerCase()});function Yo(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(!Ij.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 _j(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function Oj(e={}){return e.maxFeePerGas!=null?Yo(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Yo(e.gasPrice,"gasPrice"):null}function Tg(e={}){try{let t=_j(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Yo(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),s=Yo(n.gasLimit??n.gas,"gasLimit"),a=Oj(n);if(a==null)throw new Error("maxFeePerGas or gasPrice required");let c=Yo(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Yo(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Yo(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=s*a;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&a>c?{ok:!1,status:"BLOCK",reason:`unit fee ${a} exceeds cap ${c}`,chainId:t,unitFeeWei:a.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:a.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 uk(e={}){let t=Tg(e);if(!t.ok)throw new Ng(t);return t}var Ij,Ng,Cg=_(()=>{Ij=/^(0|[1-9][0-9]*)$/,Ng=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}}});var Fg={};lt(Fg,{OPENSEA_ACCOUNT_CHAINS:()=>bk,OPENSEA_API:()=>gk,OPENSEA_EVM_CHAIN_IDS:()=>Wa,OPENSEA_NATIVE_PAYMENT_TOKEN:()=>Mj,OPENSEA_ROBINHOOD_WETH:()=>$j,SEAPORT_FULFILL_ADVANCED_ORDER:()=>yk,openseaAccountNfts:()=>es,openseaAccountPnl:()=>Va,openseaBestListing:()=>Ka,openseaBestListings:()=>fd,openseaBestOffer:()=>Ya,openseaCollection:()=>Zi,openseaCollectionStats:()=>xk,openseaContext:()=>qj,openseaFloor:()=>Mg,openseaHealth:()=>Lg,openseaPrepareBuy:()=>Bg,openseaPrepareCancel:()=>Ug,openseaPrepareList:()=>Ja,openseaPrepareMint:()=>Xa,openseaPrepareSweep:()=>Dg});import{readFileSync as Nj,existsSync as Tj}from"node:fs";import{getAddress as Cj,Interface as pd,TypedDataEncoder as Rg,parseUnits as Pj}from"ethers";function Bj(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Tj(e))return"";try{for(let t of Nj(e,"utf8").split(`
|
|
7
|
-
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Hn(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||Bj()}function Sk(e={}){return Te({provider:"opensea",defaultUrl:gk,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function ur(e={}){return Sk(e).baseUrl}function dr(e={}){return Ue({accept:"application/json"},{"x-api-key":Hn(e)},Sk(e).trusted)}function vk(e){let t=String(e||"ethereum").trim().toLowerCase();if(!Lj.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ce(e,t="address"){try{return Cj(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Ek(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!wk.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ce(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 Dj(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 Uj(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 dk(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 Fj(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,quantity:e.quantity==null&&e.balance==null?null:String(e.quantity??e.balance),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"}}}function qj(e={}){return{base:ur(e),headers:dr(e),fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs}}async function Lg(e={}){if(!Hn(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Zi("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 Zi(e,t={}){if(!e)throw new Error("collection slug required");if(!Hn(t))throw new Error("OPENSEA_API_KEY required");return x(`${ur(t)}/collections/${encodeURIComponent(e)}`,{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function xk(e,t={}){if(!e)throw new Error("collection slug required");if(!Hn(t))throw new Error("OPENSEA_API_KEY required");return x(`${ur(t)}/collections/${encodeURIComponent(e)}/stats`,{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Mg(e,t={}){let n=await Zi(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;if(o==null){let d=await xk(e,t);r=d?.total||d?.stats||d||{},o=r.floor_price??r.floorPrice??null}let i=(Array.isArray(n.contracts)?n.contracts:[]).map(d=>({chain:String(d?.chain||d?.chain_identifier||n.chain||"").trim().toLowerCase(),address:String(d?.address||d?.contract_address||d?.contract||"").trim()})).filter(d=>d.chain&&d.address),s=String(t.expectedChain||"").trim().toLowerCase(),a=String(t.expectedContract||"").trim(),c=null;if(s&&a){let d=p=>s==="solana"?p:p.toLowerCase();if(c=i.find(p=>p.chain===s&&d(p.address)===d(a))||null,!c)throw new Error("opensea: collection identity does not match held contract")}let l=c?.chain||String(n.chain||"").trim().toLowerCase()||i[0]?.chain||"",u=String(n.floor_price_symbol||n.floorPriceSymbol||r.floor_price_symbol||r.floorPriceSymbol||"").trim().toUpperCase()||null;return{slug:n.collection||e,name:n.name||null,floor:o,chain:l||null,contracts:i,currency:u,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:i,fees:n.fees,category:n.category}}}async function es(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=vk(e.chain),r=Ek(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),s=[],a=e.next?String(e.next):null,c=0;do{let l=new URL(`${ur(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),a&&l.searchParams.set("next",a);let u=await x(l.toString(),{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])s.push(Fj(d,n,r));a=u?.next?String(u.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function Va(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Ek(e.address||e.owner),r=await x(`${ur(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:dr(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}}function Ga(e){let t=String(e||"").trim().toLowerCase(),n=Wa[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Ft(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 jj(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 za(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function Ak(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 kk(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 Hj(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function zj(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=ce(e?.token,t);if(n===0&&r!==Qi)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Qi)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function Vj(e,t){let n=Ft(e?.startAmount,`${t} startAmount`),r=Ft(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 Pg(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(Hj);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 s of r){let a=zj(s,`${t} payment token`);if(o==null)o=a;else if(a!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=Vj(s,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}function Yt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function pk(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 Ik(e,t){return{itemType:Number(Yt(e?.itemType,`${t} itemType`)),token:ce(e?.token,`${t} token`),identifierOrCriteria:Yt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Yt(e?.startAmount,`${t} startAmount`),endAmount:Yt(e?.endAmount,`${t} endAmount`)}}function Gj(e,t){return{...Ik(e,t),recipient:ce(e?.recipient,`${t} recipient`)}}function Kj(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:ce(e.offerer,`${t} offerer`),zone:ce(e.zone,`${t} zone`),offer:n.map((o,i)=>Ik(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>Gj(o,`${t} consideration[${i}]`)),orderType:Number(Yt(e.orderType,`${t} orderType`)),startTime:Yt(e.startTime,`${t} startTime`),endTime:Yt(e.endTime,`${t} endTime`),zoneHash:pk(e.zoneHash,`${t} zoneHash`),salt:Yt(e.salt,`${t} salt`),conduitKey:pk(e.conduitKey,`${t} conduitKey`),counter:Yt(e.counter,`${t} counter`)}}function _k(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=Kj(t,n);if(Rg.hashStruct("OrderComponents",Wj,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function Ok(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=ce(e?.token,`${t} contract`),o=za(e?.identifierOrCriteria),i=Ft(e?.startAmount,`${t} startAmount`,{positive:!0}),s=Ft(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==s)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 Yj(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 Ok(r[0],`${t} offer NFT`)}function Xj(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(s=>[4,5].includes(Number(s?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(s=>[2,3].includes(Number(s?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=Ok(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 Jj(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ce(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 Qj(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 Nk(e,t,n,r){let o=Yt(t?.startTime,`${r} startTime`),i=Yt(t?.endTime,`${r} endTime`),s=BigInt(Math.floor(n/1e3));if(BigInt(o)>s)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=s)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let a=kk(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&Qj(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return a}function Zj(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(Wa[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,s=Yj(i,"listing"),a=s.contract;if(t.contract&&a!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=s.tokenId;Jj(e.asset,a,c,"listing");let l=Ft(e.price?.current?.value,"listing price",{positive:!0}),u=_k(e,i,"listing"),d=Pg(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:ce(e.protocol_address,"listing protocol address"),contract:a,tokenId:c,quantity:s.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:Nk(e,i,n,"listing"),counter:Yt(i?.counter,"listing counter")}}async function fd(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Ga(e.chain);n.contract=e.contract?ce(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(`${ur(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let s=await x(i.toString(),{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=Array.isArray(s?.listings)?s.listings:[];if(!a.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:a.map(l=>Zj(l,n,c)),next:s?.next?String(s.next):null,exec:!1,readOnly:!0}}async function Ka(e={},t={}){let n=za(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 s=1;s<=r;s+=1){let a=await fd({...e,tokenId:void 0,limit:50,next:o},t),c=a.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:s,exact:!0,exec:!1,readOnly:!0};if(!a.next||i.has(a.next))break;i.add(a.next),o=a.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function eH(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||{},a=Xj(i,n,"offer").contract;if(t.contract&&a!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Ft(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Pg(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=Pg(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:_k(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ce(e.protocol_address,"offer protocol address"),contract:a,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:Nk(e,i,r,"offer"),counter:Yt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Ya(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Ga(e.chain);n.contract=e.contract?ce(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=za(e.tokenId),i=await x(`${ur(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!s)throw new Error("opensea: no active exact NFT offer returned");let a=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return eH(s,n,o,a)}function tH(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 Tk(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"&&Tk(n))}function Ck(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function Pk(e){return!e||typeof e!="object"?!1:Ck(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&Pk(t))}function Rk(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"&&Rk(o,t,n);return t}function fk(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Lk(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Ck(e))throw new Error("opensea: signed transaction material refused");if((e.from?ce(fk(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ce(fk(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let s=e.data??e.calldata,a=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(s==null&&a){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");s=Rj.encodeFunctionData("fulfillAdvancedOrder",[a.advancedOrder,a.criteriaResolvers,a.fulfillerConduitKey,a.recipient])}let c=String(s??"").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=jj(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function md(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 $g(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Ge(e,4,async c=>{let{chainId:l,...u}=md(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(Ne(),Ou)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),s=null,a=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();a=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),s=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(Ne(),Ou)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{a=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{a=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+a;s=u>m?u:m}return s!=null&&a!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=a.toString(),c.maxFeePerGas=s.toString(),c.worstCaseFeeWei=(d*s).toString()}),{simulated:!0,gasEstimates:i}}function nH(e,t){if(Tk(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(Pk(e))throw new Error("opensea: signed transaction material refused");let n=Rk(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=>Lk(r,t))}function rH(e,t,n={}){return U({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function Bg(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function Dg(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function oH(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(s=>String(s?.chain||t).toLowerCase()===t&&s?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=ce(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Xa(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");tH(e);let{chain:n,chainId:r}=Ga(e.chain),o=ce(e.buyer||e.minter||e.address,"buyer"),i=ce(e.contract,"NFT contract"),s=Ak(e.quantity),a=Ft(e.priceWei,"priceWei"),c=Ft(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=kk(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 Zi(d,t),m=oH(p,n,i),f=a*BigInt(s);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await x(`${ur(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:dr(t),body:{minter:o,quantity:s},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,y=Array.isArray(g)?g:g?[g]:[];if(!y.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let b=new Set(y.map($=>ce($,"SeaDrop mint target"))),w=nH(h,{buyer:o,chainId:r,targets:b});if(w.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let S,v,k=null,A;try{S=dd.decodeFunctionData("mintPublic",w[0].data),v="public",A=dd.encodeFunctionData("mintPublic",[S[0],S[1],S[2],S[3]])}catch{try{S=dd.decodeFunctionData("mintAllowList",w[0].data),v="allowlist";let $=S[4],j=[...S[5]].map(String);if(j.length<1||j.length>64||j.some(K=>!/^0x[0-9a-fA-F]{64}$/.test(K)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let C=BigInt($.startTime),B=BigInt($.endTime),V=BigInt(Math.floor(l/1e3));if(C>V||B<=V)throw new Error("opensea: allowlist mint stage is not open");if(BigInt($.mintPrice)!==a)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt($.maxTotalMintableByWallet)<BigInt(s))throw new Error("opensea: allowlist wallet cap is below requested quantity");A=dd.encodeFunctionData("mintAllowList",[S[0],S[1],S[2],S[3],$,j]),k={mintPrice:BigInt($.mintPrice).toString(),maxTotalMintableByWallet:BigInt($.maxTotalMintableByWallet).toString(),startTime:C.toString(),endTime:B.toString(),dropStageIndex:BigInt($.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt($.maxTokenSupplyForStage).toString(),feeBps:Number($.feeBps),restrictFeeRecipients:!!$.restrictFeeRecipients,proof:j}}catch($){throw/opensea:/.test(String($?.message||""))?$:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=ce(S[0],"mint NFT contract"),I=ce(S[1],"mint fee recipient"),N=ce(S[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(N!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(S[3])!==BigInt(s))throw new Error("opensea: mint calldata quantity mismatch");if(A.toLowerCase()!==w[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=w.reduce(($,j)=>$+j.valueWei,0n);if(T!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(T>c)throw new Error("opensea: mint total exceeds total cap");let D=await $g(w,r,{...t,provider:e.provider||t.provider});if(D.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let X=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},H=uk({chainId:r,tx:w[0],policy:X});return rH({action:"mint",mintType:v,...k?{stage:k}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:s,priceWei:a.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:w[0].to,feeRecipient:I,expiry:u,transactions:w.map(md),gasWar:H,...D},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Di,Date.parse(u),k?Number(BigInt(k.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function iH(e={}){let t=vk(e.chain);if(wk.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?dk(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=dk(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:ce(e.contract,"NFT contract"),token_id:o,quantity:Uj(e.quantity??1,"quantity"),price:{amount:Dj(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ce(e.price?.currency??e.currency??Qi,"price currency")},start_time:n.text,end_time:r.text}}function hk(e,t){return e?.[t]||(e?.action===t?e:null)}function aH(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(w=>hk(w,"createListingsAction")).find(Boolean)||o.find(w=>/createListings/i.test(String(w?.action||""))),s=i?.signatureRequest?.message??i?.typedData,a;try{a=typeof s=="string"?JSON.parse(s):s}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!a||a.primaryType!=="OrderComponents"||!a.domain||!a.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=a.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=ce(c.verifyingContract,"listing protocol"),u=a.message;if(ce(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(ce(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||ce(w.token,"listing payment token")!==Qi)throw new Error("opensea: executable listings currently require native fixed-price consideration");let S=BigInt(w.startAmount),v=BigInt(w.endAmount);if(S<=0n||S!==v)throw new Error("opensea: listing consideration must be fixed and positive");ce(w.recipient,"listing consideration recipient"),p+=S}let m=Pj(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=Rg.hashStruct("OrderComponents",Ji,u),y=o.map(w=>hk(w,"itemApprovalAction")).find(Boolean)||o.find(w=>/setApprovalForAll/i.test(String(w?.action||""))),b=null;if(y){let w=y.transaction||y.itemApprovalAction?.transaction,S=Lk(w,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=mk.decodeFunctionData("setApprovalForAll",S.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let k=ce(v[0],"listing approval operator");if(v[1]!==!0||S.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(mk.encodeFunctionData("setApprovalForAll",[k,!0]).toLowerCase()!==S.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");b={...S,operator:k}}return{protocolAddress:l,typedData:{domain:c,types:Ji,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:b}}async function Ja(e={},t={}){if(!Hn(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=ce(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(iH);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let s=e.useCreatorFee!==!1,a={address:n,items:o,use_creator_fee:s};e.taker&&(a.taker=ce(e.taker,"taker"));let c=await x(`${ur(t)}/listings/actions`,{method:"POST",headers:dr(t),body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Ga(o[0].chain),u=aH(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await $g(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return U({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(md),useCreatorFee:s,taker:a.taker||null,feeDisclosure:s?"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 Ug(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Ga(e.chain),o=ce(e.seller||e.address||e.owner,"seller"),i=ce(e.protocolAddress,"reviewed Seaport protocol address"),s=ce(e.contract,"NFT contract"),a=za(e.tokenId),c=Ak(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,I]of Object.entries(Ji)){let N=l.types?.[E];if(!Array.isArray(N)||N.length!==I.length||N.some((T,D)=>T?.name!==I[D].name||T?.type!==I[D].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(Ji).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=ce(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ce(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(ce(f.token,"cancellation NFT contract")!==s)throw new Error("opensea: cancellation NFT contract mismatch");if(za(f.identifierOrCriteria)!==a)throw new Error("opensea: cancellation tokenId mismatch");let h=Ft(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=Ft(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||ce(E.token,"cancellation payment token")!==Qi)throw new Error("opensea: cancellation requires native fixed-price consideration");let I=Ft(E.startAmount,"cancellation consideration startAmount",{positive:!0}),N=Ft(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(I!==N)throw new Error("opensea: cancellation consideration must be fixed and positive");ce(E.recipient,"cancellation consideration recipient")}let y=Ft(m.startTime,"cancellation startTime");if(Ft(m.endTime,"cancellation endTime",{positive:!0})<=y)throw new Error("opensea: cancellation listing time bounds invalid");let w=Rg.hashStruct("OrderComponents",Ji,m),S=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(S)||S!==w.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=sH.encodeFunctionData("cancel",[[m]]),k=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],A=await $g(k,r,{...t,provider:e.provider||t.provider});if(A.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return U({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:s,tokenId:a,quantity:c,protocolAddress:p,orderHash:w,typedData:{domain:d,types:Ji,primaryType:"OrderComponents",message:m},transactions:k.map(md),...A,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}var gk,yk,Rj,dd,bk,Lj,wk,Qi,Mj,$j,Wa,Wj,Ji,mk,sH,Xo=_(()=>{q();gt();oe();Cg();gk="https://api.opensea.io/api/v2",yk="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)",Rj=new pd([`function ${yk}`]),dd=new pd(["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"]),bk=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"]),Lj=new Set(bk),wk=new Set(["solana","flow"]),Qi="0x0000000000000000000000000000000000000000",Mj=Qi,$j="0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73";Wa=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});Wj=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"}]});Ji={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"}]},mk=new pd(["function setApprovalForAll(address operator,bool approved)"]),sH=new pd(["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 cH(e,t){return`0x${jg.getAmountsOut}`+fn(e)+fn(64)+fn(t.length)+t.map(Qa).join("")}function lH(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 qg(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function uH(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Hg)throw new Error(`slippageBps ${n} exceeds the ${Hg} 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 Mk(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await J(t,"eth_call",[{to:o,data:cH(i,s)},"latest"],a);return lH(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=qg(c.scanner);if(!l)return{chainId:t,evidence:se.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=a||[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,s,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:se.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:se.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=qg(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:te.UNKNOWN,evidence:se.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:te.UNKNOWN,evidence:se.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],a);if(!u)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.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:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],a);if(!p)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.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=te.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=te.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=te.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:se.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=qg(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(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:f},d);if(h.evidence!==se.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=uH(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=BigInt(Math.floor(Date.now()/1e3)+Number(l)),b=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,w=b?`0x${jg.swapExactETHForTokens}`+fn(g)+fn(128)+Qa(a)+fn(y)+fn(f.length)+f.map(Qa).join(""):`0x${jg.swapExactTokensForTokens}`+fn(s)+fn(g)+fn(160)+Qa(a)+fn(y)+fn(f.length)+f.map(Qa).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:w,value:b?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Hg,deadline:y.toString()},requires:b?[]:[{step:"approve",token:f[0],spender:m,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 jg,fn,Qa,Hg,$k=_(()=>{Ne();Vo();jg={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},fn=e=>BigInt(e).toString(16).padStart(64,"0"),Qa=e=>e.slice(2).toLowerCase().padStart(64,"0");Hg=100});function pH(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Vg)throw new Error(`slippageBps ${n} exceeds the ${Vg} 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 zg(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Uk(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${Bk.quoteExactInputSingle}`+Za(s)+Za(a)+Jo(c)+Jo(l)+Jo(0),p=await J(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:s,tokenOut:a,amountIn:c},l){let u=await Promise.all(dH.map(async p=>{let m=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},l);return{fee:p,amountOut:m?m.toString():null,out:m}})),d=null;for(let p of u)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:u.map(({fee:p,amountOut:m})=>({fee:p,amountOut:m}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let l=zg(c.scanner,"quoter");if(!l)return{chainId:t,evidence:se.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!Dk.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:s,amountIn:a},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:se.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:se.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let l=zg(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(v=>String(v).toLowerCase()),d=null;!a&&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:te.UNKNOWN,evidence:se.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=a||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(f&&p===String(f).toLowerCase())return{chainId:t,token:i,verdict:te.UNKNOWN,evidence:se.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:te.UNKNOWN,evidence:se.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:s},c);if(!h.best){let v=u.find(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:s},c);if(k.best){let A=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c);if(A.best){let E=A.best.amountOut,I=Number(E*10000n/BigInt(s)),N=te.PASS,T="round trip vs dollar book completes with expected fee/impact loss";return I<5e3?(N=te.FAIL,T=`round trip vs dollar book returns only ${(I/100).toFixed(2)}% -- punitive tax or no real liquidity`):I<9e3&&(N=te.CAUTION,T=`round trip vs dollar book returns ${(I/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:N,reason:T,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:I,buyFee:k.best.fee,sellFee:A.best.fee,evidence:se.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:l,tokenIn:i,tokenOut:f,amountIn:h.best.amountOut},c);if(!g.best){let v=u.find(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:s},c),A=k.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c):{best:null};if(k.best&&A.best){let E=A.best.amountOut,I=Number(E*10000n/BigInt(s)),N=te.PASS,T="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return I<5e3?(N=te.FAIL,T=`dollar-book round trip returns only ${(I/100).toFixed(2)}%`):I<9e3&&(N=te.CAUTION,T=`dollar-book round trip returns ${(I/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:N,reason:T,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:I,buyFee:k.best.fee,sellFee:A.best.fee,evidence:se.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:te.FAIL,evidence:se.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 y=g.best.amountOut,b=Number(y*10000n/BigInt(s)),w=te.PASS,S="round trip completes with expected fee/impact loss";return b<5e3?(w=te.FAIL,S=`round trip returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(w=te.CAUTION,S=`round trip returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:w,reason:S,amountIn:String(s),bought:h.best.amountOut.toString(),returned:y.toString(),retentionBps:b,buyFee:h.best.fee,sellFee:g.best.fee,evidence:se.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:l=50,fee:u},d={}){let p=zg(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(!Dk.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(m.evidence!==se.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=pH(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(),y=`0x${Bk.exactInputSingle}`+Za(i)+Za(s)+Jo(f)+Za(c)+Jo(a)+Jo(h)+Jo(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:y,value:g?String(a):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:Vg,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,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."}}}}var dH,Bk,Jo,Za,Dk,Vg,Fk=_(()=>{Ne();Vo();dH=[100,500,3e3,1e4],Bk={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Jo=e=>BigInt(e).toString(16).padStart(64,"0"),Za=e=>e.slice(2).toLowerCase().padStart(64,"0"),Dk=/^0x[0-9a-fA-F]{40}$/,Vg=100});function qk(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function jk(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 fH(e){let{chainId:t}=e;async function n(r,o,i){return J(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Aa(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:se.LIVE}},async nativeBalance(r,o={}){let i=await qo(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:se.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await ka({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:se.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:se.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([n(r,hd.decimals,o).catch(()=>null),n(r,hd.symbol,o).catch(()=>null),n(r,hd.name,o).catch(()=>null),n(r,hd.totalSupply,o).catch(()=>null)]),l=qk(i?.result??i),u=l!==null||s?.result||a?.result,d={chainId:t,address:r,decimals:l===null?null:Number(l),symbol:jk(s?.result??s),name:jk(a?.result??a),totalSupply:(qk(c?.result??c)??null)?.toString()??null,evidence:u?se.LIVE:se.UNKNOWN};return u||(d.warning="no ERC-20 metadata returned -- may not be a token contract"),d},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:se.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await jn(r,o).catch(()=>null),c=(s?.pairs||s?.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=ih(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:sx(r,l),evidence:l.length?se.LIVE:se.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let p=r;p<=o;p+=a){let m=Math.min(p+a-1,o);u.push([p,m])}let d=await Ge(u,4,async([p,m])=>{let f={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${m.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let h=await J(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));return{start:p,end:m,res:h}});for(let{start:p,end:m,res:f}of d){if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[p,m],error:f.error,evidence:se.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:se.LIVE}},async scoreRisk(r,o={}){let i=[],s=te.PASS,a=u=>{let d={[te.PASS]:0,[te.CAUTION]:1,[te.UNKNOWN]:2,[te.FAIL]:3};d[u]>d[s]&&(s=u)},[c,l]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==se.LIVE?(i.push({check:"erc20-metadata",result:te.UNKNOWN,detail:c.warning}),a(te.UNKNOWN)):i.push({check:"erc20-metadata",result:te.PASS,detail:`${c.symbol} / ${c.decimals}d`}),l.evidence===se.UNAVAILABLE)i.push({check:"liquidity",result:te.UNKNOWN,detail:l.reason}),a(te.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:te.FAIL,detail:"no pool with liquidity found"}),a(te.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:te.CAUTION,detail:`top pool only $${d}`}),a(te.CAUTION)):i.push({check:"liquidity",result:te.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:te.CAUTION,detail:"pool under 24h old"}),a(te.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:te.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}),a(u.verdict)}else i.push({check:"sellability",result:te.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."}),a(te.UNKNOWN);return{chainId:t,token:r,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Wg(e){let n={...fH(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Uk({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await n.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Mk({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(n))o[i]=s.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 hd,Hk=_(()=>{Ne();nr();q();Vo();$k();Fk();sh();hd={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});var Kr,zk=_(()=>{Kr=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}}]}])});var Gg={};lt(Gg,{CHAIN_CONFIGS:()=>Kr,registerBuiltinScanners:()=>gd,registerCustomChain:()=>mH});function gd(){return Kr.map(e=>Lh(Wg(e)))}function mH(e){return Lh(Wg(e))}var ts=_(()=>{Hk();Vo();zk()});var Gk={};lt(Gk,{clearProvidersForTest:()=>wH,getProvider:()=>rs,listProviders:()=>ec,registerProvider:()=>P});function Wk(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Wk(t);return Object.freeze(e)}function P(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(Vk&&Kg.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return ns.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),ns.get(t)}function rs(e){return ns.get(e)||null}function ec({venue:e,op:t}={}){let n=[...ns.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function wH(){ns.clear()}function SH(){Kg.clear();for(let[e,t]of ns)Kg.add(e),Wk(t);Vk=!0}var ns,hH,gH,yH,Yg,bH,Kg,Vk,Xg=_(()=>{Ui();Hi();Og();Xo();ts();ns=new Map,hH=Object.keys(St).map(Number),gH=Object.keys(Gt).map(Number),yH=Object.keys(Yi).map(Number),Yg=Kr.map(e=>e.chainId),bH=[...new Set(Object.values(Wa))],Kg=new Set,Vk=!1;P({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});P({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, user vault equities, and HLP tracking."});P({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});P({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});P({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});P({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});P({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});P({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});P({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});P({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});P({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});P({id:"bitcoin-mint-funding",venue:"onchain-mint",chainIds:[],auth:"none",ops:["health","annotateOutpoints","selectFundingInputs","liveFeeRate","planInscriptionFunding"],execution:"read",baseEnv:[],description:"Bitcoin/Ordinals mint funding safety. btcUtxos returns every UTXO an address owns and prepareOrdinalsMint validates PSBT structure but never checks whether an input holds an inscription \u2014 this is the missing step between them. Classifies outpoints against an ordinals index and EXCLUDES before selecting, so an inscription is never spent as fee-paying change and burned. An unreachable index degrades to 'nothing is provably safe' rather than 'everything looks clean'. Prices fees from the marginal rate of a projected block, and refuses an inscription too heavy to relay before any UTXO is touched."});P({id:"solana-mint-submit",venue:"onchain-mint",chainIds:[],auth:"none",ops:["health","freshBlockhash","deriveComputeUnitPrice","planMintFee","measureComputeUnits","constraints","planRpcEnvelope","planBundleEnvelope","planRetryEnvelope","bundleStatus"],execution:"read",baseEnv:[],description:"Solana mint submission adapter. Prepare-only: builds sendTransaction and Jito sendBundle requests for already-signed bytes and never broadcasts, because solanaRpc refuses every send* method by design. Derives the compute-unit price from live getRecentPrioritizationFees samples rather than any hardcoded figure, pins blockhash fetches to 'confirmed' (the 'finalized' default silently burns ~21% of the ~60s window), and refuses a re-signed retry \u2014 Solana has no nonce, so a re-signed transaction can land alongside the original and mint twice."});P({id:"mint-race",venue:"onchain-mint",chainIds:[1,10,56,137,8453,42161,81457,7777777],auth:"none",ops:["health","probeOpen","measureLatency","inclusionStrategy","raceIntel"],execution:"read",baseEnv:[],description:"Mint race intelligence: probe every sale-state flag in one concurrent round trip instead of five sequential ones, measure RPC round-trip latency against a contested-mint threshold, and classify whether a chain's inclusion is won by priority fee (builder auction) or by raw latency (centralized sequencer). Read-only: never prepares, signs, or broadcasts."});P({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen","evaluateTrigger"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});P({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});P({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])P({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});P({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});P({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Yg,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Kr.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});P({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});P({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});P({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});P({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});P({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});P({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API quote + unsigned Solana swap prepare, routed through `oracle route swap solana`"});P({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});P({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});P({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});P({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});P({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});P({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});P({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});P({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair","latestTokenProfiles","communityTakeovers","latestTokenBoosts","topTokenBoosts","tokenPairs","batchTokens"],execution:"read-only",baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener keyless read-only token profiles, community takeovers, boosts, and token/pair discovery"});P({id:"bubblemaps",venue:"token-intelligence",chainIds:[1,56,137,999,4663,8453,42161,43114],auth:"apiKey",ops:["health","chains","search","metadata","holders","metrics","map"],execution:"read-only",baseEnv:["BUBBLEMAPS_API_KEY"],description:"Official Bubblemaps Data API v0 token-holder maps, clusters, concentration metrics, and source-backed interactive artifacts."});P({id:"uniswap-v3",venue:"dex",chainIds:hH,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});P({id:"lp-exit",venue:"dex",chainIds:yH,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});P({id:"lp-liquidity-ranker",venue:"dex",chainIds:Yg,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});P({id:"lp-destination-discovery",venue:"dex",chainIds:Yg,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});P({id:"uniswap-v4",venue:"dex",chainIds:gH,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."});P({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."});P({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."});P({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});P({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});P({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});P({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});P({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});P({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});P({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});P({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});P({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});P({id:"opensea-nft",venue:"nft",chainIds:bH,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});P({id:"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."});P({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."});P({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."});P({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});P({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});P({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});P({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});P({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});P({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});P({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});P({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});P({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});P({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});P({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});P({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});P({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});P({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});P({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});P({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});P({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Address state exposes transaction counts; per-asset sums can be absent for unconfidential multi-asset addresses and are blinded for confidential addresses."});P({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});P({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});P({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});P({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});P({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});P({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, type-specific 0x1::coin::balance views, and legacy CoinStore enumeration. Generic enumeration does not cover newer Fungible Asset stores. Read-only; the transaction submit door is never called."});P({id:"canton-scan",venue:"canton",chainIds:[],auth:"none",ops:["health","guide","dso","party","holdings","rounds"],execution:"read-only",localSignerSurfaces:[],baseEnv:["CANTON_SCAN_URL","CANTON_NETWORK","CANTON_MIGRATION_ID"],description:"Canton Network Scan reads for Canton Coin (CC / Amulet) plus static onboarding steps. Not EVM: no chainId, no JSON-RPC, no ERC-20, no Uniswap. Scan sees CC and DSO/governance only. Quote/prepare/sign stay unimplemented."});P({id:"near-rpc",venue:"near",chainIds:[],auth:"none",ops:["health","guide","account","ftBalance","tx"],execution:"read-only",localSignerSurfaces:[],baseEnv:["NEAR_RPC_URL","NEAR_TESTNET_RPC_URL","NEAR_NETWORK"],description:"NEAR Protocol reads over public JSON-RPC: node health, account NEAR balance/storage, NEP-141 token balance (ft_balance_of + ft_metadata), and transaction status by hash + sender. Not EVM: named accounts, yoctoNEAR units, NEP-141 not ERC-20. Only status/query/tx leave the module; send_tx and broadcast_tx_* are refused before any network call. Quote/prepare/sign stay unimplemented."});P({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});P({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});P({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});P({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});P({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});P({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});P({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});P({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});P({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});P({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});P({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});P({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});P({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});P({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});P({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});P({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});P({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});P({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});P({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});P({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});P({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});P({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});P({id:"solana-token-risk",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",baseEnv:[],description:"GoPlus official Solana token security: mint/freeze authority, transfer hooks, metadata mutability, holder concentration (keyless read-only)"});P({id:"robinhood-wallet-history",venue:"explorer",chainIds:[4663],auth:"none",ops:["health","transactions","tokenBalances","history"],execution:"read-only",baseEnv:[],description:"Robinhood Chain (4663) wallet transaction history and token balances via the official Blockscout explorer (keyless read-only)"});P({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});P({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});P({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});P({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});P({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});P({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});P({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});P({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});P({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});P({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});P({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});P({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});P({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});P({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});P({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});P({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});P({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});P({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});P({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});P({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});P({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});P({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});P({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});P({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});P({id:"launch-radar",venue:"launch-radar",chainIds:[],auth:"none",ops:["health","status","snapshot","candidates","rpcHealth","evaluateStrategy"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_CONFIG_DIR","LAUNCH_RADAR_STORE_PATH"],description:"Read-only Launch Radar data plane: durable shadow-cycle status/snapshot from local disk, plus pure candidate normalization, RPC-sample ranking, and strategy-policy evaluation over caller-supplied inputs. Shadow-only, unfunded, no signer, no broadcast."});P({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});P({id:"news-rss",venue:"oracle-news",chainIds:[],auth:"none",ops:["health","latest","search"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Curated official crypto news wires (CoinDesk, The Block, Decrypt, Blockworks, Bankless, DL News, Hyperliquid blog) parsed from RSS/Atom with no npm dependency. Curated roster, NOT a firehose: feed URLs are fixed and SSRF-guarded, and every response grades each feed ok/degraded/unavailable so a dead wire never reads as no news. Items cap at 200 with complete:false and rowsOmitted."});P({id:"social-farcaster",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","channel","search","user"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Keyless Farcaster read through the public Warpcast API (api.farcaster.xyz). Probed live: Neynar free and the Neynar hub both answer 402, so the Warpcast public endpoints are used. No keyless channel timeline exists, so channel is a channel-scoped search. Unauthenticated endpoint with an undocumented rate limit; failures return unavailable with zero rows, never a quiet feed."});P({id:"social-x-public",venue:"oracle-social",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"search",type:"bearerToken",env:"ORACLE_X_BEARER_TOKEN"},ops:["health","search"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_X_BEARER_TOKEN"],description:"Capability-honest X reader. X has no keyless read tier and this never scrapes: without ORACLE_X_BEARER_TOKEN every op returns ok:false with the unset reason and makes NO network call. With a token it calls /2/tweets/search/recent. The token is read only from the caller-supplied env object, never from disk, and never when allowAmbientCredentials is false."});P({id:"news-digest",venue:"oracle-news",chainIds:[],auth:"none",ops:["health","latest"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Cross-plane news digest: fans out to news-rss, social-farcaster, and social-x-public, dedupes by normalized URL, filters by entity match, sorts by publishedAt desc, and reports per-source ok/degraded/unavailable. A blind source is reported as unavailable, never as an absence of news; when every plane is blind the digest returns ok:false."});P({id:"onchain-investigator",venue:"oracle-intel",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"wallet",optInField:"includeOpenSea",type:"apiKey",env:"OPENSEA_API_KEY"},ops:["health","capabilities","wallet","analyze","nftOverlap"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRONGRID_API_KEY","TRON_PRO_API_KEY","TONCENTER_API_KEY","TON_API_KEY","APTOS_API_KEY","OPENSEA_API_KEY"],allowCallerOptions:!1,opPolicies:{health:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},capabilities:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},wallet:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},analyze:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},nftOverlap:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1}},description:"Bounded, report-only on-chain evidence collection through fixed family/network endpoints, literal-opt-in one-page OpenSea v2 enrichment, and deterministic offline coordination/NFT-overlap analysis. Optional ambient keys only raise trusted-provider rate limits. Wallet addresses, snapshots, and evidence reports are sensitive and never cacheable. OpenSea reads only OPENSEA_API_KEY after opt-in and has no inventory cursor. No caller URL, RPC, transport, signer, prepare, broadcast, scam claim, or identity claim surface."});SH()});var Xk={};lt(Xk,{READ_ONLY_DATA_OPS:()=>AH,STATE_CREATING_DATA_OPS:()=>xH,classifyDataOp:()=>os,isPrepareDataOp:()=>kH,isReadOnlyDataOp:()=>IH,isStateCreatingDataOp:()=>_H});function kH(e){return String(e||"").toLowerCase().startsWith("prepare")}function os(e){let t=String(e||"").trim().toLowerCase();return t?vH.has(t)?"state":EH.has(t)?"read":"unknown":"unknown"}function IH(e){return os(e)==="read"}function _H(e){return os(e)!=="read"}var Kk,Yk,vH,EH,xH,AH,Jg=_(()=>{Kk=["approveSpender","arm","armFill","armPayment","buildNative","cancelIntent","cancelListing","cancelOrder","createIntent","createListing","createOffer","createOrder","createTrigger","evaluateTrigger","lock","loop","prepare","prepareAgentURIUpdate","prepareBracket","prepareBrokerBuy","prepareBuilderApproval","prepareBuy","prepareCancel","prepareClockIn","prepareDelegate","prepareDeploy","prepareIdentityRegistration","prepareIsolatedMargin","prepareLeverage","prepareList","prepareMint","prepareOrder","preparePurchase","prepareRemove","prepareSell","prepareSettlement","prepareSpecificBuy","prepareStakeDeposit","prepareStakeWithdraw","prepareSwap","prepareTransfer","prepareUnwrap","prepareVault","registerPack","revokePack"],Yk=["account","accountNfts","accountPnl","accountState","activeProposals","activity","address","addressInfo","allMids","analyze","annotateOutpoints","apy","apyAll","apyBreakdown","apyIndividual","assetInfo","assetProof","assetsByOwner","auction","balances","basis","batchTokens","bestListing","bestListings","bestOffer","blockHeight","blockInfo","blockNumber","blockStats","blocks","book","brokerDesk","builderProfit","bundleStatus","call","candidates","candleSnapshot","capabilities","chainId","chainParameters","chains","channel","checkOpen","clearinghouse","clockInStatus","coin","coinBalances","collection","collectionFloors","collectionStat","collectionStats","communityTakeovers","constraints","dailyStats","decode","delegations","delegatorSummary","denomTrace","depeg","deriveComputeUnitPrice","details","dexVolumes","difficulty","discover","dso","erc20Allowance","erc20Balance","ethUsdc","eval","evaluateStrategy","events","exploitFeed","feedDirectory","fees","finalityProviders","floor","floorListings","freshBlockhash","frontendOpenOrders","ftBalance","funding","fundingAll","fundingHistory","fundingSpread","gallery","gate","getBalance","goplus","governors","guide","hashrate","health","healthAll","history","holders","holdings","inclusionStrategy","info","inscriptionChildren","inscriptionInfo","inscriptions","inspect","inspectHook","inspectIdentity","intent","inventory","item","jettonBalances","keywordMentions","l1BlockNumber","l2Book","latest","latestBlockhash","latestPrice","latestPrices","latestTokenBoosts","latestTokenProfiles","leaderboards","legs","liquidationLadder","list","listIntents","listListings","listNative","listPacks","listings","liveFeeRate","lstList","map","markPrice","markPx","marketReserves","markets","marketsInfo","match","measureLatency","meta","metaAndAssetCtxs","metadata","metrics","midpoint","narratives","networkInfo","networks","nftOverlap","nodeCountries","nodeRankings","normalize","ohlcv","openInterest","openOrders","openapi","oracleDeviation","oraclePx","ordBlockInfo","order","orderStatus","orderbook","outcomeMeta","overview","pair","party","plan","planBundleEnvelope","planInscriptionFunding","planMintFee","measureComputeUnits","planRetryEnvelope","planRpcEnvelope","pnl","pool","poolSearch","poolShare","poolStats","pools","portfolio","position","positions","poxCycles","preflight","price","priceGas","priceStats","prices","pricesBySymbol","probeOpen","proposal","proposals","protocols","qualify","quote","quoteBrokerBuy","quotePath","quoteSell","quoteSpecificBuy","raceIntel","rank","read","recentBundles","recentTrades","reserves","resources","rewardStats","rewards","rounds","route","rpcHealth","runeBalances","runeInfo","satInfo","scan","scanAllMarkets","scanAllMarketsArb","scanBrokerLoot","scanCollection","scanCrossVenueArb","score","search","searchAssets","see","selectFundingInputs","simulate","smartAccounts","snapshot","spaces","spot","spotBalance","spotMeta","spotPx","spread","stablecoins","stackingInfo","statistics","stats","status","strategies","strategyMetrics","suggestedFees","summaries","swapQuote","tallyProposals","ticker","tickers","time","tipFloor","tipHeight","token","tokenAccounts","tokenBalances","tokenList","tokenListings","tokenPairs","tokens","topTokenBoosts","tracker","trades","traitSnipe","transactionReceipt","transactions","trc20Balances","trc20Transfers","trendingCas","trendingTokens","tvl","tx","user","userEquities","userFills","userState","utxos","validatorDetail","validators","valueGraph","vaultDetail","vaultEquity","vaults","venues","verify","verifyOrder","voterStatus","votes","votingPower","wallet","walletContents","watch","withdrawable","yields"],vH=new Set(Kk.map(e=>e.toLowerCase())),EH=new Set(Yk.map(e=>e.toLowerCase())),xH=Object.freeze([...Kk]),AH=Object.freeze([...Yk])});function yd(e={}){return e.execution==="unavailable"||!!e.deprecated}var Pde,Jk=_(()=>{Pde=Object.freeze(["live","needs_key","deprecated","soft_fail","hard_down"])});import{types as is}from"node:util";function qt(e){if(!e||typeof e!="object"||is.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Nt(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&is.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function pr(e,t,n="provider response",r=null,o=0){if(typeof t!="string"||t.length===0)return e;if(o>64)throw new Error(`${n} exceeds the credential guard nesting bound`);let i=r??{nodes:0,active:new Set};if(i.nodes+=1,i.nodes>2e5)throw new Error(`${n} exceeds the credential guard node bound`);if(e==null)return e;if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error(`${n} reflected an attached credential`);return e}if(!e||typeof e!="object"||is.isProxy(e)||i.active.has(e))throw new Error(`${n} is not credential-guardable own-data JSON`);i.active.add(e);try{if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){let a=Object.getOwnPropertyDescriptor(e,String(s));if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);pr(a.value,t,n,i,o+1)}return e}if(!qt(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let s of Object.keys(e)){if(s.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,s);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);pr(a.value,t,n,i,o+1)}return e}finally{i.active.delete(e)}}function Fe(e,t="provider response",n=0){if(n>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(is.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=Fe(s.value,t,n+1)}return o}if(!qt(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Fe(i.value,t,n+1)}return r}function ss(e,t){let n=t&&typeof t=="object"&&!is.isProxy(t)?t:null,r=n?Object.getOwnPropertyDescriptor(n,"status"):null,o=r&&Object.hasOwn(r,"value")&&Number.isInteger(r.value)&&r.value>=400&&r.value<=599?r.value:null,i=a=>{if(!n)return;let c=Object.getOwnPropertyDescriptor(n,a);return c&&Object.hasOwn(c,"value")?c.value:void 0},s=i("oversize")===!0?"provider-response-too-large":i("oracleTimeout")===!0||i("name")==="AbortError"||i("name")==="TimeoutError"?"provider-timeout":null;return(o!==null||s!==null)&&Object.defineProperty(e,Qk,{value:Object.freeze({status:o,code:s}),enumerable:!1,configurable:!1,writable:!1}),e}function Zk(e){if(!e||typeof e!="object"||is.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,Qk);if(!t||!Object.hasOwn(t,"value")||!t.value||typeof t.value!="object")return null;let n=Number.isInteger(t.value.status)&&t.value.status>=400&&t.value.status<=599?t.value.status:null,r=OH.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var Qk,OH,mn=_(()=>{Qk=Symbol("oracle.provider-failure-metadata"),OH=new Set(["provider-response-too-large","provider-timeout"])});function NH({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"?Zg:Qg}async function Ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=NH(t);return Fe(await x(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function eI(e={}){let t=await Ce({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function _n(e={}){return Ce({type:"allMids"},e)}async function as(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return Ce({type:"l2Book",coin:String(e)},t)}async function tc(e={}){return Ce({type:"outcomeMeta"},e)}async function bd(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return Ce({type:"spotClearinghouseState",user:e},t)}async function wd(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Ce({type:"userFills",user:e},t)}async function tI(e={}){return Ce({type:"meta"},e)}async function jt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Ce(t,e)}async function Sd({coin:e,interval:t="1h",startTime:n,endTime:r},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:n??Date.now()-24*3600*1e3,endTime:r??Date.now()}};return Ce(i,o)}async function nI({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return Ce({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function rI(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return Ce({type:"openOrders",user:e},t)}async function oI(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return Ce({type:"frontendOpenOrders",user:e},t)}async function cs(e,t={}){if(!e)throw new Error("hlUserState requires user");return Ce({type:"clearinghouseState",user:e},t)}async function vd(e={}){return Ce({type:"spotMeta"},e)}var Qg,Zg,Xt=_(()=>{q();mn();Qg="https://api.hyperliquid.xyz/info",Zg="https://api.hyperliquid-testnet.xyz/info"});function ey(e,t){let n=String(e||"").trim();if(!CH.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function iI(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function sI(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 PH(e){return[...e].sort((t,n)=>(iI(n.tvl)??-1)-(iI(t.tvl)??-1))}function ty(e){return e.hlInfo||Ce}function ny(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function ry(e={},t={}){let n=await ty(t)({type:"vaultSummaries"},t),r=PH((Array.isArray(n)?n:[]).map(sI));return ny({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Ed(e={},t={}){let r={type:"vaultDetails",vaultAddress:ey(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=ey(e.user,"user"));let o=await ty(t)(r,t);return ny({provider:"hl-vaults",vault:sI(o||{}),raw:o})}async function rc(e={},t={}){let n=ey(e.user||e.address,"user"),r=await ty(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 ny({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function oy(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Ed({...e,vaultAddress:nc},t);if(n==="summaries")return ry(e,t);if(n==="details")return Ed(e,t);if(n==="mine")return rc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function aI(e={}){try{let t=await oy({mode:"hlp"},e);return{ok:t.vault.vaultAddress===nc&&!!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}}}var CH,nc,xd=_(()=>{Xt();CH=/^0x[0-9a-fA-F]{40}$/,nc="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"});import{AbiCoder as LH}from"ethers";function oc(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 ic(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 Qo(e,t){return e.length?MH.encode(e,t):"0x"}function fr(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 $H(e,t=0){let n=fr(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Yr(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:iy});let r=await J(iy,"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 Xr(e){return{provider:"hl-precompiles",chainId:iy,...sy,...e}}async function Ad(e={}){let t=await Yr(yt.l1BlockNumber,"0x",e);return Xr({op:"l1BlockNumber",precompile:yt.l1BlockNumber,l1BlockNumber:fr(t).toString(),raw:t})}async function ay(e={},t={}){let n=ic(e.index??e.assetId??0,"index",32),r=await Yr(yt.markPx,Qo(["uint32"],[n]),t);return Xr({op:"markPx",precompile:yt.markPx,index:n,markPx:fr(r).toString(),raw:r})}async function cy(e={},t={}){let n=ic(e.index??e.assetId??0,"index",32),r=await Yr(yt.oraclePx,Qo(["uint32"],[n]),t);return Xr({op:"oraclePx",precompile:yt.oraclePx,index:n,oraclePx:fr(r).toString(),raw:r})}async function ly(e={},t={}){let n=ic(e.index??e.assetId??0,"index",32),r=await Yr(yt.spotPx,Qo(["uint32"],[n]),t);return Xr({op:"spotPx",precompile:yt.spotPx,index:n,spotPx:fr(r).toString(),raw:r})}async function uy(e={},t={}){let n=oc(e.user,"user"),r=ic(e.perp??e.assetId??0,"perp",16),o=await Yr(yt.position,Qo(["address","uint16"],[n,r]),t);return Xr({op:"position",precompile:yt.position,user:n,perp:r,szi:$H(o,0),raw:o})}async function dy(e={},t={}){let n=oc(e.user,"user"),r=ic(e.token??0,"token",64),o=await Yr(yt.spotBalance,Qo(["address","uint64"],[n,r]),t);return Xr({op:"spotBalance",precompile:yt.spotBalance,user:n,token:r,total:fr(o,0).toString(),hold:fr(o,1).toString(),raw:o})}async function py(e={},t={}){let n=oc(e.user,"user"),r=oc(e.vaultAddress??e.vault??nc,"vault"),o=await Yr(yt.vaultEquity,Qo(["address","address"],[n,r]),t);return Xr({op:"vaultEquity",precompile:yt.vaultEquity,user:n,vaultAddress:r,hlp:r===nc,equity:fr(o,0).toString(),raw:o})}async function fy(e={},t={}){let n=oc(e.user,"user"),r=await Yr(yt.withdrawable,Qo(["address"],[n]),t);return Xr({op:"withdrawable",precompile:yt.withdrawable,user:n,withdrawable:fr(r).toString(),raw:r})}async function cI(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return Ad(t);if(n==="markPx")return ay(e,t);if(n==="oraclePx")return cy(e,t);if(n==="spotPx")return ly(e,t);if(n==="position")return uy(e,t);if(n==="spotBalance")return dy(e,t);if(n==="vaultEquity"||n==="hlp")return py(e,t);if(n==="withdrawable")return fy(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function lI(e={}){try{let t=await Ad(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...sy,l1BlockNumber:t.l1BlockNumber,precompiles:yt}}catch(t){return{ok:!1,provider:"hl-precompiles",...sy,error:String(t?.message||t).slice(0,160)}}}var iy,yt,sy,MH,uI=_(()=>{Ne();xd();iy=999,yt=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),sy=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),MH=LH.defaultAbiCoder()});function dI(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Id(e={},t,n){let r=String(t||""),o=dI(e);if(o){let s=sc(o[r]);if(s==null)throw new Error(`${n}: held spot required for ${r}`);return s}let i=sc(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function _d(e={},t=[],n){let r=dI(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(sc(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&sc(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(sc(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}function sc(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=my?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>kd.length||t.length===kd.length&&t>kd||t===kd&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=my?r:null}var my,kd,hy=_(()=>{my=Number.MAX_SAFE_INTEGER,kd=String(my)});async function fI(e={}){let t=Date.now();if(ac.dexs&&t-ac.at<6e4&&!e.fetchImpl)return ac.dexs;let n=await Ce({type:"perpDexs"},e);return ac={at:t,dexs:Array.isArray(n)?n:[]},ac.dexs}async function mI(e="",t={}){let n=e||"",r=Date.now(),o=pI.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await Ce({type:"metaAndAssetCtxs",dex:e},t):await jt(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:s,ctxs:a};return pI.set(n,c),c}function FH(e){let t=String(e??"").trim();if(!t)return t;let n=t.toLowerCase().replace(/[\s._-]+/g,"");return UH[n]??t}function Qr(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=hI+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Jr(e,t){let n=gy(e),r=gy(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=hI+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 gy(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 yy(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Qr(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Jr(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:qH(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=Jr(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 p=FH(l),m=await fI(t),f=m.findIndex(v=>v&&v.name===p);if(f<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:h,ctxs:g}=await mI(p,t),y=h.findIndex(v=>v.name===`${p}:${d}`);if(y<0)throw new Error(`hl-assets: ${n} not in dex ${p} meta`);let b=h[y];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let w=DH+f*1e4+y,S=g[y]||{};return{kind:"hip3",coin:b.name||n,assetId:w,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:p,dexName:m[f]?.fullName||p,dexIndex:f,indexInMeta:y,markPx:S.markPx??null}}let{universe:r,ctxs:o}=await mI("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await fI(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 yy({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=r[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:c.markPx??null}}function qH(e,t){let n=gy(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var hI,DH,ac,pI,UH,Od=_(()=>{Xt();hI=1e8,DH=1e5,ac={at:0,dexs:null},pI=new Map;UH=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});function ut(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 hn(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Zo(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=ut(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 gn(e,t="amount"){let n=Zo(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function rt(e,t,n="amount"){let r=ut(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,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((s||"0")+a.padEnd(t,"0"));return o?-c:c}var ls=_(()=>{});function WH(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 gI(e,t){let n=ut(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 zn(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=>zn(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)}:${zn(e[r],t)}`).join(",")}}`}function GH(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)||zn(n,"declared order type")!==zn({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(zn(n,"declared order type")!==zn({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||zn(n,"declared order type")!==zn({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 KH(e,t,n){let r=gI(e.s,"signed size"),o=gI(e.p,"signed price"),i=r.decimals+o.decimals,s=r.raw*o.raw,a=rt(t.notionalUsd,i,"hl: notionalUsd");if(a<=0n||s!==a)throw new Error("hl: signed notional must match");let c=rt(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>c)throw new Error("hl: notional exceeds cap")}function YH(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=Zr(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(hn(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(a=>String(a).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=Zo(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=rt(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function yI(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(ut(e.s,"hl: signed size")!==ut(t.size,"hl: size"))throw new Error("hl: signed size must match");if(ut(e.p,"hl: signed price")!==ut(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(zn(e.t,"signed order type")!==zn(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 bI(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(ut(e.s,"hl: bracket protection size")!==ut(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(ut(e.p,"hl: bracket protection price")!==ut(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(ut(i.triggerPx,"hl: triggerPx")!==ut(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function XH(e){let t=String(e||"").replace(/\/$/,"");if(!jH.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function by(e){return Qr(e)!=null}function JH(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(by(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 QH(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(s=>{if(typeof s=="string"){let[a,c]=String(s).split(":");return a===e&&Number(c)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(by(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 wI(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=Zr(n.kind,"kind",48),o=zH[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=XH(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 s=Number(n.nonce);if(!Number.isSafeInteger(s)||s<=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!==VH[r])throw new Error("hl: action type must match kind");let a=n.notionalUsd??0;if(HH.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=Zr(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=Qr(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(JH(c,t),QH(c,l,t),r==="hip4-order"&&!by(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");GH(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");yI(u[0],n,l);let f=1;d!=null&&bI(u[f++],n,l,d,"tp"),p!=null&&bI(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");yI(u[0],n,l)}KH(u[0],n,t),YH(n,t),a=ut(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=Zr(n.usd,"margin usd",64),d=rt(u,6,"hl: margin usd");if(Zo(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=rt(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");a=WH(f,6)}}if(r==="builder-fee-approval"){let c=Zr(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Zr(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=Zr(n.maxFeeRate,"maxFeeRate",32);if(Zr(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=rt(u.slice(0,-1),12,"hl: builder fee percent"),p=rt(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==s)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(a??n.action.wei??0),notional:String(a??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??a??0),coin:n.coin||null,submitTo:i})}var jH,HH,zH,VH,Zr,SI=_(()=>{ls();Od();jH=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),HH=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),zH=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"}),VH=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"}),Zr=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function e8(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 Nd(e,t={},n={}){let r=String(e?.kind||""),o=ZH[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()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:e8(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+s,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:a,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return wI(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 ZH,wy=_(()=>{SI();ZH=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"})});var Ny={};lt(Ny,{HL_BUILDER_ADDRESS_ENV:()=>Td,HL_BUILDER_DEFAULT_FEE_BPS:()=>t8,HL_BUILDER_FEE_ENV:()=>vy,HL_BUILDER_FEE_TIERS:()=>cc,HL_BUILDER_MAX_FEE_BPS:()=>Sy,HL_PERP_MAX_SIG_FIGS:()=>vI,HL_PERP_PRICE_DECIMALS:()=>EI,HL_SIGNATURE_CHAIN_ID:()=>Cd,MARGIN_MODE:()=>lc,ORDER_TYPES:()=>Ht,TIF:()=>uc,formatPerpPrice:()=>mr,formatPerpSize:()=>II,hlBuilderFeeBpsForKind:()=>kI,hlPerpAssetInfo:()=>eo,hlPrepareApproveAgent:()=>c8,hlPrepareBracketOrder:()=>Oy,hlPrepareBuilderApproval:()=>ky,hlPrepareCancelOrder:()=>dc,hlPreparePerpOrder:()=>to,hlPrepareUpdateIsolatedMargin:()=>_y,hlPrepareUpdateLeverage:()=>Iy,resolveBuilderFee:()=>xy});function xI(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 n8(e,t){let n=xI(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function r8(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 AI(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 kI(e="perp"){if(e==="perp"||e==="main")return cc.perp;if(e==="spot")return cc.spot;if(e==="hip3")return cc.hip3;if(e==="outcome"||e==="hip4")return cc.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function xy({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Td]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Td} must be an EVM address`);let o=Fh(e);if(!o||o!==r)return null;let i=e?.[vy],s=kI(n),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${vy} must be a positive number in 0.1 bps increments`);if(a>Sy)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${Sy} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${n}`);let c=Math.round(a*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:a,percent:`${l}%`}}}async function o8(e,t={},n={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await Ce({type:"maxBuilderFee",user:r,builder:e.disclosure.address},n));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function i8(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||zu;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Ay(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,s=""]=r.replace(/^-/,"").split(".");if(s.length<=t){let f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let a=s.slice(0,t),c=Number(s[t]),l=BigInt(i+a),u=s.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 s8(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))),s=Math.max(0,t-1-i);return Ay(r,s,n)}function mr(e,t,n={}){let r=EI-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Ay(s8(e,vI,n),r,n)}function II(e,t){let n=Ay(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 a8(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,s=r.decimals+o.decimals,a=i.toString().padStart(s+1,"0");if(s===0)return a;let c=a.slice(0,-s),l=a.slice(-s).replace(/0+$/,"");return l?`${c}.${l}`:c}async function eo(e={},t={}){let n=await yy(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,dexName:n.dexName??null,outcome:n.outcome??null,side:n.side??null}}function Ey(e,{tif:t=uc.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Ht.LIMIT:return{limit:{tif:t}};case Ht.MARKET:return{limit:{tif:uc.IOC}};case Ht.STOP_MARKET:case Ht.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:mr(n,o),tpsl:e===Ht.STOP_MARKET?"sl":"tp"}};case Ht.STOP_LIMIT:case Ht.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:mr(n,o),tpsl:e===Ht.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function ei(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Cd,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 us(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=Nd(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,U(r,{provider:e.provider||"hl-perps",kind:e.kind})}function ky(e={},t={}){let n=xy({env:t.env});if(!n)throw new Error(`hl-perps: ${Td} 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:Cd,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return us({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...ei(o,r,t)},e,t)}function c8(e={},t={}){let n=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("hl-perps: agentAddress required");let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Cd,agentAddress:n.toLowerCase(),agentName:o,nonce:r};return U({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:n.toLowerCase(),agentName:o,...ei(i,r,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function to(e={},t={}){let n=await eo(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??Ht.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=AI(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=II(e.size??e.sz,n.szDecimals),a;if(r===Ht.MARKET){let b=Number(n.markPx);if(!Number.isFinite(b)){let k=await _n(t);b=Number(k?.[n.coin]??k?.[String(n.assetId)]??NaN)}if(!Number.isFinite(b))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 S=o?b*(1+w/1e4):b*(1-w/1e4);a=mr(S,n.szDecimals,{roundDown:o});let v=Math.abs(Number(a)/b-1)*1e4;if(v>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.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");a=mr(e.price??e.limitPx,n.szDecimals)}let c=Ey(r,{tif:e.tif??(r===Ht.MARKET?uc.IOC:uc.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:a,s,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=xy({env:t.env,kind:n.kind}),p=await i8(d,e,t),m=p.exempt?null:d,f=await o8(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),y=a8(s,a);return us({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,dexName:n.dexName??null,side:o?"buy":"sell",orderType:r,price:a,size:s,reduceOnly:i,notionalUsd:y,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...ei(u,g,t)},e,t)}async function dc(e={},t={}){let n=await eo(r8(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=xI(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return us({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...ei(i,Number(e.nonce??Date.now()),t)},e,t)}async function Iy(e={},t={}){let n=await eo(e,t),r=n8(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||lc.CROSS).toLowerCase();if(o!==lc.CROSS&&o!==lc.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===lc.CROSS,leverage:r};return us({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,...ei(i,Number(e.nonce??Date.now()),t)},e,t)}async function _y(e={},t={}){let n=await eo(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=rt(o,6,"hl-perps: usd"),s=AI(e,{defaultBuy:!0}),a={type:"updateIsolatedMargin",asset:n.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return us({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:s,usd:o,...ei(a,Number(e.nonce??Date.now()),t)},e,t)}async function Oy(e={},t={}){let n=await to(e,t),r=await eo(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:mr(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:Ey(Ht.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:mr(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:Ey(Ht.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return us({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:mr(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:mr(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...ei(s,Number(e.nonce??Date.now()),t)},e,t)}var vI,EI,Cd,t8,Sy,Td,vy,cc,Ht,uc,lc,pc=_(()=>{Xt();Od();ls();oe();wy();Dh();Ra();vI=5,EI=6,Cd="0x66eee",t8=2,Sy=10,Td="ORACLE_HL_BUILDER_ADDRESS",vy="ORACLE_HL_BUILDER_FEE_BPS",cc=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Ht=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),uc=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),lc=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function _I(){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 hr(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function OI(e){let t=hr(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function l8(e,t,n=4){let r=hr(e),o=hr(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 s=10**i;return String(Math.floor(r/o*s+1e-12)/s)}function NI(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]||{},s=n[o]||{},a=String(i.name||"").trim(),c=hr(s.funding),l=hr(s.markPx??s.oraclePx),u=hr(s.openInterest)??0;!a||c==null||!(l>0)||r.push({coin:a,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:hr(s.oraclePx),openInterest:u,fundingAprPct:OI(c)})}return r}function TI(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=hr(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=OI(n),o=n>0,i={coin:e.coin,notionalUsd:hr(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?l8(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 Ty(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await jt(t),i=NI(o).filter(s=>s.funding>0&&s.openInterest>=r).sort((s,a)=>a.funding-s.funding||a.openInterest-s.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 Cy(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 jt(t),i=NI(o).find(s=>s.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return TI(i,r)}async function Py(e={},t={}){PI(e,t,"hl-delta-neutral");let n=RI(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Cy(e,t);if(r.verdict==="skip")return U({...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=Id(e,r.coin,"hl-delta-neutral");if(!CI.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(()=>(pc(),Ny)),s=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(s?.signed===!0||s?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let a=s?.localSignerEnvelope||null,c=s?.localSignerBlockedReason||null;return U({...r,prepared:!!a,surface:"hl",hedge:s,localSignerEnvelope:a,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:a?"awaiting-hl-signer":"blocked",oraclePrepared:!!a},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}function PI(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 u8(e,t,n){PI(e,t,n)}function d8(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=RI(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"&&_d(e,n,"hl-delta-neutral"),t==="live"&&!CI.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 RI(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 LI(e={},t={}){u8(e,t,"hl-delta-neutral");let n=d8(e),r=await Ty({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],s=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let a of r.candidates){if(o.size&&!o.has(a.coin))continue;let c=TI(a,s);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 Py({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:s,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(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var CI,MI=_(()=>{Xt();oe();hy();CI=/^0x[0-9a-fA-F]{40}$/});function ds(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function Ry(e){let t=String(e||"").replace(/\/$/,"");if(!f8.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function BI(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=$I(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=Ry(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let s=Number(Zo(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: accountIndex required");let a=Number(Zo(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: clientOrderIndex required");ds(n.orderType,0,"orderType"),ds(n.timeInForce,1,"timeInForce"),ds(n.reduceOnly,0,"reduceOnly"),ds(n.triggerPrice,0,"triggerPrice"),ds(n.orderExpiry,-1,"orderExpiry");let c=$I(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=gn(n.baseAmount,"lighter: baseAmount"),d=gn(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,y=u*d,b=rt(n.notionalUsd,g,"lighter: notionalUsd");if(b<=0n)throw new Error("lighter: notionalUsd required");if(y!==b)throw new Error("lighter: notionalUsd must match size and price");let w=rt(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(y>w)throw new Error("lighter: notional exceeds cap");let S=ut(n.notionalUsd,"lighter: notionalUsd");return ds(n.txType,fc,"txType"),Object.freeze({unit:"usd",value:String(S),notional:String(S),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(S)})}var f8,fc,$I,Ly=_(()=>{ls();f8=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),fc=14,$I=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e}});function m8(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 DI(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=Ry(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:m8(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??fc,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return BI(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}var UI=_(()=>{Ly()});function h8(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?jI:qI}function HI(){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 no(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function g8(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 zI(e){let t=no(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function y8(e,t,n=4){let r=no(e),o=no(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 s=10**i;return Math.floor(r/o*s+1e-12)}function FI(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function My(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 s of r){let a=FI(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of n){if(String(s.exchange||"")!=="lighter")continue;let a=FI(s.market_id);if(a==null)continue;let c=o.get(a),l=no(c?.mark_price??c?.index_price),u=no(s.rate),d=String(s.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:a,funding:u,markPx:l,openInterest:no(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:zI(u)})}return i}function VI(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=no(e.funding);if(n==null)throw new Error("lighter: funding required");let r=zI(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:no(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?y8(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 $y(e={}){let t=h8(e),n=new AbortController,r={fetchImpl:e.fetchImpl,retries:0,signal:n.signal};try{let[o,i]=await Promise.all([x(`${t}/api/v1/funding-rates`,r),x(`${t}/api/v1/orderBookDetails`,r)]);return{funding:o,books:i}}catch(o){throw n.abort(o),o}}async function WI(e={}){let{funding:t,books:n}=await $y(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:My(t,n)}}async function By(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await $y(t),i=My(r,o).filter(s=>s.funding>0).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(s=>s.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function Dy(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 $y(t),s=My(o,i).find(a=>a.symbol===n);if(!s)throw new Error(`lighter: ${n} not in Lighter funding`);return VI(s,r)}async function Uy(e={},t={}){KI(e,t,"lighter");let n=YI(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 Dy(e,t);if(o.verdict==="skip")return U({...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=Id(e,o.coin,"lighter");if(!GI.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 a=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=g8(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:fc,submitTo:`${a?jI:qI}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=DI(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return U({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}function KI(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 b8(e,t,n){KI(e,t,n)}function w8(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=YI(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"&&_d(e,n,"lighter"),t==="live"&&!GI.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let s=e.accountIndex;if(t==="live"&&(typeof s!="number"||!Number.isSafeInteger(s)||s<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:s}}function YI(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 XI(e={},t={}){b8(e,t,"lighter");let n=w8(e),r=await By({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],s=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let a of r.candidates){if(o.size&&!o.has(a.symbol)&&!o.has(a.coin))continue;let c=VI(a,s);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 Uy({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:s,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(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var qI,jI,GI,Fy=_(()=>{q();oe();UI();Ly();hy();qI="https://mainnet.zklighter.elliot.ai",jI="https://testnet.zklighter.elliot.ai";GI=/^0x[0-9a-fA-F]{40}$/});function mc(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||v8).replace(/\/$/,"")}function JI(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||E8).replace(/\/$/,"")}async function qy(e={}){return x(`${mc(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function QI(e={}){let t=await qy(e);return{ok:t!=null&&t!=="",time:t}}async function ZI({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,s])=>[i,String(s)]))});return x(`${JI(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function e_(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${mc(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function t_(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${mc(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function n_(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${mc(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function r_(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 x(`${mc(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function o_({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,s])=>[i,String(s)]))});return x(`${JI(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}var v8,E8,i_=_(()=>{q();v8="https://clob.polymarket.com",E8="https://gamma-api.polymarket.com"});import{createHash as s_}from"node:crypto";function A8(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||jy).trim()}function Pe(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 k8(e,t){return t?[...e,{commitment:t}]:e}async function gr(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=Fe(await x(A8(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!qt(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let i=Nt(o,"error");if(i)throw new Error(`solana-rpc ${e}: ${Nt(i,"message")||JSON.stringify(i)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return Nt(o,"result")}async function hc(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await gr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:ti,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function a_(e={}){try{let[t,n]=await Promise.all([gr("getHealth",[],e),hc({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:ti,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:ti,error:String(t?.message||t),exec:!1}}}async function Pd(e={},t={}){let n=Pe(e.address||e.owner,"address"),r=await gr("getBalance",k8([n],e.commitment),t);return{provider:"solana-rpc",cluster:ti,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function I8(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 gc(e={},t={}){let n=Pe(e.owner||e.address,"owner"),r=e.mint?{mint:Pe(e.mint,"mint")}:{programId:Pe(e.programId||Hy,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await gr("getTokenAccountsByOwner",[n,r,o],t),s=Array.isArray(i?.value)?i.value.map(I8):[];return{provider:"solana-rpc",cluster:ti,owner:n,filter:r,slot:i?.context?.slot??null,accounts:s,raw:i}}async function c_(e={},t={}){let n=Pe(e.address||e.account,"address"),r=Math.min(1e3,Math.max(1,Math.trunc(Number(e.limit)||20))),o={limit:r};e.before&&(o.before=String(e.before)),e.until&&(o.until=String(e.until)),e.commitment&&(o.commitment=String(e.commitment)),e.minContextSlot!=null&&(o.minContextSlot=Number(e.minContextSlot));let i=await gr("getSignaturesForAddress",[n,o],t);if(!Array.isArray(i))throw new Error("solana-rpc getSignaturesForAddress returned an invalid response");let s=i.slice(0,r);return{provider:"solana-rpc",cluster:ti,address:n,limit:r,cursor:e.before?String(e.before):null,nextCursor:s.length===r?s[s.length-1]?.signature??null:null,pageComplete:i.length<r,count:s.length,truncated:i.length>s.length,signatures:s,raw:s}}function _8(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 O8(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 s=e[o++];if(n|=(s&127)<<r,(s&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function N8(e){let t=Buffer.from(e,"base64");try{let n=O8(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return s_("sha256").update(t.subarray(r)).digest("hex")}catch{return s_("sha256").update(t).digest("hex")}}async function l_(e={},t={}){let n=_8(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await gr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:ti,ok:i.err==null,transactionHash:N8(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}var ti,jy,Hy,ni=_(()=>{q();mn();ti="mainnet-beta",jy="https://api.mainnet-beta.solana.com",Hy="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"});function On(e={}){return String(e.network||process.env.BTC_NETWORK||C8).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Rd(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):On(e)==="testnet"?Wy:Vy}function zy(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 yn(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 P8(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 u_(e,t={}){let n=`${Rd(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 yc(e,t={}){let n=`${Rd(t)}${e.startsWith("/")?e:`/${e}`}`;return Fe(await x(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function d_(e={}){try{let t=await u_("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:On(e),baseUrl:zy(Rd(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:On(e),baseUrl:zy(Rd(e)),error:zy(t?.message||t),exec:!1}}}async function p_(e={}){let t=await u_("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:On(e),tipHeight:Number(t)}}async function f_(e={}){try{let t=await yc("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:On(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:On(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ld(e={},t={}){let n=yn(e.address||e.addr,"address"),r=await yc(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),a=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:On(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function m_(e={},t={}){let n=yn(e.address||e.addr,"address"),r=await yc(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:On(t),address:n,count:o.length,totalSats:String(o.reduce((i,s)=>i+Number(s.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function h_(e={},t={}){let n=yn(e.address||e.addr,"address"),r=Math.min(25,Math.max(1,Math.trunc(Number(e.limit)||20))),o=e.cursor||e.lastSeenTxid||null;if(o!=null&&!/^[0-9a-f]{64}$/i.test(String(o)))throw new Error("bitcoin-esplora: transaction cursor must be a 64-char txid");let i=o?`/address/${n}/txs/chain/${String(o).toLowerCase()}`:`/address/${n}/txs`,s=await yc(i,t);if(!Array.isArray(s))throw new Error("bitcoin-esplora address history returned an invalid response");let a=s.slice(0,r),c=s.length>a.length,l=!c&&s.length===25?a[a.length-1]?.txid??null:null;return{provider:"bitcoin-esplora",network:On(t),address:n,limit:r,cursor:o==null?null:String(o).toLowerCase(),nextCursor:l,pageComplete:!c&&s.length<25,count:a.length,truncated:c,transactions:a,raw:a}}async function g_(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 yc(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:On(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 y_(e={},t={}){let n=P8(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:On(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}var C8,Vy,Wy,ps=_(()=>{q();mn();C8="mainnet",Vy="https://mempool.space/api",Wy="https://mempool.space/testnet/api"});function Md(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}function b_(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=Md(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,s=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=L8.includes(o)&&(i==="https:"||s)}}catch{n=!1}return Ue({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function fs(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:b_(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 w_(e={}){let t=Md(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 s=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:b_(e),signal:AbortSignal.timeout(8e3)});if(r={ok:s.status>0&&s.status<500,path:o,status:s.status},s.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 $d(e={},t={}){let n=yn(e.address||e.addr,"address"),r=Md(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 s of o)try{let a=await fs(s,t),c=M8(a);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:s}}catch(a){i=a}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function M8(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 ms(e={},t={}){let n=yn(e.address||e.addr,"address"),r=Md(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}`],s=null;for(let a of i)try{let c=await fs(a,t),l=$8(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:a}}catch(c){s=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(s?.message||s||"all indexer paths failed")}}async function S_(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||Gy,o=await fs(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function v_(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||Gy,o=Number(e.page||0),i=await fs(`${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 E_(e={},t={}){let n=t.ordinalsBase||Gy,r=e.height??await fs(`${n}/r/blockheight`,t),o=await fs(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function $8(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}))}var Gy,L8,Bd=_(()=>{ps();gt();Gy="https://ordinals.com";L8=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"]});function Ky(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function q8(e){return D8.some(t=>e.startsWith(t))||U8.has(e)}function j8(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Ky(t);return q8(n)?!1:F8.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function H8(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 Yy(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=>Yy(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(j8(c)){o.push(c);continue}o.push(...Yy(l,t+1,n,r))}let s=Object.keys(e).map(Ky).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Ky(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),H8(e)&&o.push("v/r/s"),o}function yr(e,t){let n=Yy(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 D8,U8,F8,Dd=_(()=>{D8=["unsigned","notsigned","tosign","signable"],U8=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),F8=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"])});function x_(e={}){return Te({provider:"satflow",defaultUrl:z8,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Ud(e={}){return x_(e).baseUrl}function Jy(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function V8(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Jy(e)},x_(e).trusted)}async function ro(e,{method:t="GET",body:n,opts:r={}}={}){if(!Jy(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Ud(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:V8(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await a.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return l}async function A_(e={}){if(!!!Jy(e))return{ok:!1,provider:"satflow",baseUrl:Ud(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 ro("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Ud(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:Ud(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function k_(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 ro(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function I_(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 ro(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function __(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 ro(`/item?${r}`,{opts:t})}}async function Fd(e={},t={}){let n=yn(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 ro(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function O_(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 ro(`/orders/floor?${r}`,{opts:t})}}function N_(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))W8.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}function Xy(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 Y8(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=yn(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=yn(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),s=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(s))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:s,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function T_(e={},t={}){let n=N_(e,G8);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=Xy(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let s=await ro("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),a=Xy(s)??Xy(s?.intent);if(a==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(a>o)throw new Error(`satflow: purchase price ${a} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);yr("satflow",s);let c=s?.unsignedPSBTBase64||s?.unsignedPsbtBase64||s?.unsigned_psbt||null,l=null,u=null;try{l=Y8(e,{psbt:c,priceSats:a,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return U({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:a.toString(),maxSats:o.toString(),intent:s,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 qd(e={},t={}){let n=N_(e,K8);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 ro("/intent/sell",{method:"POST",body:n,opts:t});return yr("satflow",r),U({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."})}var z8,W8,G8,K8,Qy=_(()=>{ps();gt();oe();Dd();z8="https://api.satflow.com/v1";W8=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);G8=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"]),K8=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"])});function L_(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Hd).replace(/\/$/,"")}function bc(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 M_(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>J8)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function jd(e,t){return e==null?t:!!e}function Q8(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 Z8(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 $_(e){let t=Buffer.from(e,"base64"),n=Z8(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 wc(e={},{quotedAtMs:t=Date.now(),ttlMs:n=C_}={}){let r=Pe(e.inputMint,"inputMint"),o=Pe(e.outputMint,"outputMint"),i=bc(e.inAmount,"inAmount"),s=bc(e.outAmount,"outAmount"),a=bc(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=M_(e.slippageBps??50),l=(BigInt(s)-BigInt(s)*BigInt(c)/10000n).toString();if(a!==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:s,otherAmountThreshold:a,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||C_,1e3),3e4)}}function eb({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Zy)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=$_(n),s=bc(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:s}}}function P_(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=t9.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 B_(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(`${Hd}/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(),s=Object.entries(i),a=s.filter(([p])=>P_(p)),c=[],l=s.filter(([p])=>!P_(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Hd}/program-id-to-label`,verified:a.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:s.length,verified:a.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<a.length;p+=90){let m=a.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[y,b]=m[g];h&&h.executable===!0&&e9.has(h.owner)?c.push({programId:y,label:b,owner:h.owner}):l.push({programId:y,label:b,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<a.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:`${Hd}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:s.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 D_(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await zd({inputMint:Zy,outputMint:R_,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 zd(e={},t={}){let n=Pe(e.inputMint||e.fromMint||Zy,"inputMint"),r=Pe(e.outputMint||e.toMint||R_,"outputMint"),o=bc(e.amount||e.inAmount,"amount"),i=M_(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${L_(t)}/quote`);s.searchParams.set("inputMint",n),s.searchParams.set("outputMint",r),s.searchParams.set("amount",o),s.searchParams.set("slippageBps",String(i)),s.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&s.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&s.searchParams.set("platformFeeBps",String(e.platformFeeBps));let a=await x(s.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=wc({...a,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:a,solanaGuard:c}}function n9(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function U_(e={},t={}){let n=Pe(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:wc(e.quoteResponse,t)}:await zd(e,t),o=r.quote,i=r.solanaGuard||wc(o,t);if(jd(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let s=await x(`${L_(t)}/swap`,{method:"POST",body:n9({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:jd(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:jd(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:jd(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Q8(s?.swapTransaction);$_(a),yr("jupiter",s);let c=s?.quoteResponse??s?.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=eb({userPublicKey:n,guard:i,swapTransaction:a,args:e,response:s})}catch(m){p=String(m?.message||m).slice(0,200)}return U({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:a,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:s?.lastValidBlockHeight??null,prioritizationFeeLamports:s?.prioritizationFeeLamports??null,computeUnitLimit:s?.computeUnitLimit??null,raw:s},{provider:"jupiter",kind:"jupiter-swap"})}var Hd,Zy,R_,J8,C_,e9,t9,tb=_(()=>{q();ni();oe();Dd();Hd="https://lite-api.jup.ag/swap/v1",Zy="So11111111111111111111111111111111111111112",R_="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",J8=100,C_=2e4;e9=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),t9="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"});function i9(e=80){let t=j_(e,1,500,80);return Math.min(t*8,4e3)}function j_(e,t,n,r){let o=Number(e);return Number.isFinite(o)?Math.min(n,Math.max(t,Math.trunc(o))):r}function Re(e){if(typeof e=="boolean"||e===null||e===void 0||e===""||typeof e!="number"&&typeof e!="string")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ri(e){return typeof e=="boolean"?e:null}function Tt(e,t=128){if(typeof e!="string")return null;let n=e.replace(/[\u0000-\u001f\u007f-\u009f]/gu," ").trim();return n?n.length>t?n.slice(0,t):n:null}function Y(e,t){if(e===null||typeof e!="object")return;let n=Object.getOwnPropertyDescriptor(e,t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function hs(e,t){return Array.isArray(e)?e.length>t?e.slice(0,t):e:[]}function gs(e,t){let n=Tt(e,128);return n?s9(n,t)?n.toLowerCase():n:null}function s9(e,t){if(/^0x[0-9a-fA-F]+$/.test(e))return!0;let n=typeof t=="string"?t.trim().toLowerCase():"";return n!==""&&a9.has(n)}function F_(e,t){let n=t>>>0;for(let r=0;r<e.length;r+=1){let o=e.charCodeAt(r);n=Math.imul(n^o&255,16777619)>>>0,n=Math.imul(n^o>>>8&255,16777619)>>>0}return n>>>0}function nb(e){let t=e.map(n=>`${String(n).length}:${String(n)}`).join("|");return`${F_(t,2166136261).toString(16).padStart(8,"0")}${F_(t,2654435761).toString(16).padStart(8,"0")}`}function Vd(e,t){let n=gs(t,e);return n?`n-${nb([String(e??""),n])}`:null}function c9(e,t){let n=[...new Set((t||[]).filter(r=>typeof r=="string"&&r))].sort();return n.length?`c-${nb([String(e??""),...n])}`:null}function l9(e,t,n,r,o){return`e-${nb([String(e??""),t,n,String(r??""),String(o??"")])}`}function H_(e){if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))H_(e[t]);return e}function u9({chain:e,address:t,name:n,symbol:r,decimals:o,isIndexed:i}){return{chain:Tt(e,32),address:Tt(t,128),name:Tt(n),symbol:Tt(r,32),decimals:Re(o),isIndexed:i==null?null:ri(i)}}function rb(e){let t=Y(e,"scores"),n=Y(e,"supply_stats");return{bubblemapsScore:Re(Y(t,"bubblemaps_score")),giniIndex:Re(Y(t,"gini_index")),herfindahlHirschmanIndex:Re(Y(t,"herfindahl_hirschman_index")),nakamotoCoefficient:Re(Y(t,"nakamoto_coefficient")),supplyShares:{cexs:Re(Y(n,"cexs")),dexs:Re(Y(n,"dexs")),contracts:Re(Y(n,"contracts")),freshWallets:Re(Y(n,"fresh_wallets")),top10Adjusted:Re(Y(n,"top_10_adjusted")),bundles:Re(Y(n,"bundles"))}}}function q_(e,t,n){let r=Y(t,"address"),o=Vd(e,r);if(!o)return null;let i=Y(t,"address_details"),s=Y(t,"holder_data");return{id:o,address:Tt(r,128),label:Tt(Y(i,"label")),kind:n,share:Re(Y(s,"share")),amount:Re(Y(s,"amount")),rank:Re(Y(s,"rank")),degree:Re(Y(i,"degree")),clusterId:null,flags:{isContract:ri(Y(i,"is_contract")),isCex:ri(Y(i,"is_cex")),isDex:ri(Y(i,"is_dex")),isSupernode:ri(Y(i,"is_supernode")),isPaidLabel:ri(Y(i,"is_paid_label")),isShownOnMap:Y(t,"is_shown_on_map")===void 0?!0:ri(Y(t,"is_shown_on_map"))},relations:{inward:Re(Y(i,"inward_relations")),outward:Re(Y(i,"outward_relations"))}}}function d9(e,t,n){let r=Vd(e,Y(t,"from_address")),o=Vd(e,Y(t,"to_address"));if(!r||!o||!n.has(r)||!n.has(o)||r===o)return null;let i=Y(t,"data"),s=Y(i,"token_key"),a=Tt(Y(s,"chain"),32),c=Tt(Y(s,"address"),128),l=Tt(Y(t,"rel_type"),64)||"GROUPED_TRANSFER";return{id:l9(e,r,o,l,`${a??""}:${c??""}`),source:r,target:o,type:l,value:Re(Y(i,"total_value")),count:Re(Y(i,"total_transfers")),firstAt:Re(Y(i,"first_date")),lastAt:Re(Y(i,"last_date")),token:a||c?{chain:a,address:c}:null}}function p9(e,t,n){let r=[];for(let s of hs(t,500)){let a=hs(Y(s,"holders"),500),c=[],l=new Set;for(let d of a){let p=Vd(e,d);!p||l.has(p)||!n.has(p)||(l.add(p),c.push(p))}if(!c.length)continue;let u=c9(e,c);u&&r.push({id:u,share:Re(Y(s,"share")),amount:Re(Y(s,"amount")),holderCount:Re(Y(s,"holder_count")),memberCount:c.length,members:c})}r.sort((s,a)=>(a.share??-1)-(s.share??-1)||(s.id<a.id?-1:s.id>a.id?1:0));let o=[],i=new Set;for(let s of r)i.has(s.id)||(i.add(s.id),o.push(s));for(let s of o)for(let a of s.members){let c=n.get(a);c&&c.clusterId===null&&(c.clusterId=s.id)}return o}function z_(e={}){let t=Tt(Y(e,"chain"),32),n=Tt(Y(e,"tokenAddress"),128),r=Y(e,"payload"),o=j_(Y(e,"maxNodes"),1,500,80),i=i9(o),s=Y(e,"token")||{},a=Y(r,"metadata"),c=Y(r,"nodes"),l=rb(Y(r,"metrics")),u=[],d=new Map,p=A=>{!A||d.has(A.id)||u.length>=o||(d.set(A.id,A),u.push(A))};for(let A of hs(Y(c,"top_holders"),500))p(q_(t,A,"holder"));for(let A of hs(Y(c,"magic_nodes"),500))p(q_(t,A,"magic"));let m=new Set(d.keys()),f=hs(Y(r,"relationships"),4e3),h=[],g=new Set,y=0;for(let A of f){if(h.length>=i){y+=1;continue}let E=d9(t,A,m);if(!E){y+=1;continue}g.has(E.id)||(g.add(E.id),h.push(E))}let b=p9(t,Y(r,"clusters"),d),w=Tt(Y(a,"dt_update"),64),S=Re(Y(a,"ts_update")),v=Re(Y(e,"limit")),k=u.length>=o&&hs(Y(c,"top_holders"),500).length>o;return H_({kind:o9,version:1,token:u9({chain:t,address:n,name:Y(s,"name"),symbol:Y(s,"symbol"),decimals:Y(s,"decimals"),isIndexed:Y(s,"isIndexed")}),metrics:l,nodes:u,edges:h,clusters:b,source:{provider:"bubblemaps",api:"data-api-v0",endpoint:Tt(Y(e,"endpoint"),256),updatedAt:w,updatedTs:S,fetchedAt:Tt(Y(e,"fetchedAt"),64),execution:"read-only"},coverage:{nodes:u.length,edges:h.length,clusters:b.length,maxNodes:o,maxEdges:i,requestedLimit:v,droppedEdges:y,truncated:k,interactive:u.length>0,reason:u.length>0?null:"no holders returned"}})}var o9,a9,V_=_(()=>{o9="bubble-map";a9=new Set(["eth","ethereum","bsc","poly","polygon","matic","arbi","arbitrum","avax","avalanche","base","op","optimism","ftm","fantom","cro","cronos","linea","scroll","zksync","blast","mantle","sonic","hyper","hyperevm","sei","berachain","bera"])});function bn(e,t){let n=String(e?.message??e??"unknown error");return typeof t=="string"&&t.length>=4&&(n=n.split(t).join("[redacted]")),n=n.replace(v9," ").replace(m9,"//[redacted]@").replace(h9,"[redacted]").replace(g9,"[redacted]").replace(f9,"?[redacted]").replace(y9,"[redacted]").replace(S9,"[redacted]").replace(b9,"[redacted]").replace(w9,"[redacted]"),n.trim().slice(0,200)}var f9,m9,h9,g9,y9,b9,w9,S9,v9,Wd=_(()=>{f9=/\?[^\s]*/gu,m9=/\/\/[^\s/@:]+:[^\s/@]+@/gu,h9=/\b(?:authorization|proxy-authorization)\s*[:=]\s*(?:bearer|basic|token)?\s*\S+/giu,g9=/\b(?:bearer|basic|token)\s+[A-Za-z0-9._~+/=-]{8,}/giu,y9=/\b(?:sk|pk|api|key|token|secret|auth|access|private)[-_][A-Za-z0-9._-]{8,}/giu,b9=/\b[A-Fa-f0-9]{24,}\b/gu,w9=/\b[A-Za-z0-9+/]{40,}={0,2}\b/gu,S9=/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/giu,v9=/[\u0000-\u001f\u007f]/gu});function Q_(e,t,n){let r=ge(n?.chain),o=ge(n?.address);return r&&r!==e?!0:!o||o===t?!1:A9.has(e)?!0:o.toLowerCase()!==t.toLowerCase()}function Z_(e,t){let r=(e&&typeof e=="object"&&e.env&&typeof e.env=="object"?e.env:process.env)?.[t];return typeof r=="string"?r:""}function eO(e={}){let t=typeof e.apiKey=="string"?e.apiKey:"";return pn(t||Z_(e,ib))}function T9(e={}){return Te({provider:ys,defaultUrl:E9,hosts:["api.bubblemaps.io"],url:Z_(e,I9)})}function Gd(e){let t=typeof e=="string"?e.trim().toLowerCase():"";if(!J_.has(t))throw new Error(`bubblemaps: unsupported chain "${String(e).slice(0,32)}" (supported: ${Y_.join(", ")})`);return t}function Kd(e){let t=typeof e=="string"?e.trim():"";if(!t||t.length>_9||/[\s/?#%\\]/u.test(t))throw new Error("bubblemaps: tokenAddress must be a bounded address string");if(t==="."||t==="..")throw new Error("bubblemaps: tokenAddress must be a bounded address string");return t}function tO(e){if(e==null||e==="")return x9;let t=Number(e);if(!k9.has(t))throw new Error(`bubblemaps: limit must be one of ${X_.join(", ")}`);return t}function C9(e){if(!e)throw new Error(`bubblemaps: ${ib} is not set`);return e}function ob(e){return typeof e=="boolean"?e:null}function Sc(e){if(typeof e!="number"&&typeof e!="string"||typeof e=="string"&&e.trim()==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ge(e){return typeof e!="string"||e.trim()===""?null:e}function P9(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=e.nodes;if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r.top_holders;if(!Array.isArray(o)||o.length>0&&!o.some(s=>ge(s?.address)!==null))return!1;let i=R9(e,t,n);return!(!W_(e.relationships,s=>L9(s,i,n))||!W_(e.clusters,s=>M9(s,i,n)))}function R9(e,t,n){let r=Number.isInteger(t)&&t>0?Math.min(t,500):80,o=e?.nodes,i=new Set;for(let s of["top_holders","magic_nodes"]){let a=Array.isArray(o?.[s])?o[s]:[];for(let c of a){if(i.size>=r)return i;let l=gs(ge(c?.address),n);l!==null&&i.add(l)}}return i}function W_(e,t){return Array.isArray(e)?e.length===0||e.some(t):!1}function L9(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=gs(ge(e.from_address),n),o=gs(ge(e.to_address),n);return r===null||o===null||r===o?!1:t.has(r)&&t.has(o)}function M9(e,t,n){return!e||typeof e!="object"||Array.isArray(e)||!Array.isArray(e.holders)?!1:e.holders.some(r=>{let o=gs(ge(r),n);return o!==null&&t.has(o)})}function U9(e){return Number.isInteger(e)?Math.min(Math.max(e,$9),B9):D9}async function oi(e,t,n={}){let r=C9(eO(n)),o=T9(n),i=new URLSearchParams;for(let[l,u]of Object.entries(t||{}))u!=null&&i.set(l,String(u));let s=i.toString(),a=`${o.baseUrl}${e}${s?`?${s}`:""}`,c=Ue({Accept:"application/json"},{"X-ApiKey":r},o.trusted);if(!o.trusted)throw new Error(`bubblemaps: refusing to send credentials to non-official host ${o.host}`);try{return await x(a,{method:"GET",headers:c,fetchImpl:n.fetchImpl,timeoutMs:U9(n.timeoutMs),maxResponseBytes:N9})}catch(l){throw new Error(`bubblemaps: ${bn(l,r)}`)}}async function nO(e={}){let t=eO(e);if(!t)return{ok:!1,provider:ys,configured:!1,execution:"read-only",error:`${ib} not set \u2014 get a key at https://pro.bubblemaps.io`};try{let n=await oi("/v0/chains",{},e);if(!Array.isArray(n))return{ok:!1,provider:ys,configured:!0,execution:"read-only",api:"data-api-v0",error:"bubblemaps: chains response was not a list"};let r=n.filter(o=>ge(o?.id)!==null).length;return{ok:r>0,provider:ys,configured:!0,execution:"read-only",api:"data-api-v0",chains:r}}catch(n){return{ok:!1,provider:ys,configured:!0,execution:"read-only",error:bn(n,t)}}}async function rO(e={},t={}){let n=await oi("/v0/chains",{},t);if(!Array.isArray(n))throw new Error("bubblemaps: chains response was not a list");return n.filter(r=>ge(r?.id)!==null).map(r=>{let o=ge(r?.id);return{id:o,name:ge(r?.name),supported:o===null?null:J_.has(o)}})}async function oO(e={},t={}){let n=typeof e.query=="string"?e.query.trim():"";if(n.length<2||n.length>O9)throw new Error("bubblemaps: query must be 2-128 characters");let r=await oi("/v0/tokens/search",{query:n},t);if(!Array.isArray(r))throw new Error("bubblemaps: search response was not a list");let o=r.filter(i=>ge(i?.token_key?.address)!==null);if(r.length>0&&o.length===0)throw new Error("bubblemaps: search response carried no readable token rows");return o.map(i=>({chain:ge(i?.token_key?.chain),address:ge(i?.token_key?.address),name:ge(i?.metadata?.name),symbol:ge(i?.metadata?.symbol),indexed:typeof i?.metadata?.is_indexed=="boolean"?i.metadata.is_indexed:null}))}async function iO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=await oi(`/v0/tokens/metadata/${n}/${encodeURIComponent(r)}`,{return_token_stats:e.includeStats===!0?"true":"false"},t),i=ge(o?.token_key?.chain)!==null||ge(o?.token_key?.address)!==null||ge(o?.metadata?.name)!==null||ge(o?.metadata?.symbol)!==null||typeof o?.metadata?.is_indexed=="boolean"||Sc(o?.stats?.transfers_count)!==null||ge(o?.stats?.min_date)!==null||ge(o?.stats?.max_date)!==null;if(!o||typeof o!="object"||Array.isArray(o)||!i)throw new Error("bubblemaps: metadata response carried no readable token evidence");if(Q_(n,r,o.token_key))throw new Error("bubblemaps: metadata response describes a different token");return{chain:ge(o?.token_key?.chain)??n,address:ge(o?.token_key?.address)??r,name:ge(o?.metadata?.name),symbol:ge(o?.metadata?.symbol),indexed:typeof o?.metadata?.is_indexed=="boolean"?o.metadata.is_indexed:null,stats:o?.stats?{transfersCount:Sc(o.stats.transfers_count),firstTransferAt:ge(o.stats.min_date),lastTransferAt:ge(o.stats.max_date)}:null}}async function sO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=tO(e.limit),i=await oi(`/v0/tokens/holders/${n}/${encodeURIComponent(r)}`,{limit:o,return_metadata:e.includeMetadata===!1?"false":"true"},t);if(!Array.isArray(i))throw new Error("bubblemaps: holders response was not a list");let s=i.filter(a=>ge(a?.address)!==null);if(i.length>0&&s.length===0)throw new Error("bubblemaps: holder response carried no readable holder rows");return s.slice(0,o).map(a=>({address:ge(a?.address),label:ge(a?.address_details?.label),rank:Sc(a?.holder_data?.rank),share:Sc(a?.holder_data?.share),amount:Sc(a?.holder_data?.amount),isContract:ob(a?.address_details?.is_contract),isCex:ob(a?.address_details?.is_cex),isDex:ob(a?.address_details?.is_dex)})).map(F9)}function F9(e){return Object.freeze(e)}async function aO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=await oi(`/v0/tokens/metrics/${n}/${encodeURIComponent(r)}`,{},t),i=rb(o);if(![i.bubblemapsScore,i.giniIndex,i.herfindahlHirschmanIndex,i.nakamotoCoefficient,...Object.values(i.supplyShares||{})].some(a=>a!==null))throw new Error("bubblemaps: metrics response carried no readable metric");return{chain:n,address:r,provider:ys,execution:"read-only",metrics:i}}async function cO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=tO(e.limit),i=e.maxNodes===void 0?Math.min(o,80):Math.min(Math.max(1,Math.trunc(Number(e.maxNodes)||0)),500,o),s=`/v0/tokens/map/${n}/${encodeURIComponent(r)}`,a=await oi(s,{limit:o,return_nodes:"true",return_relationships:"true",return_clusters:"true",use_magic_nodes:e.magicNodes===!1?"false":"true",use_time_nodes:e.timeNodes===!1?"false":"true"},t);if(Q_(n,r,a?.token_key))throw new Error("bubblemaps: map response describes a different token");if(!P9(a,i,n))throw new Error("bubblemaps: map response carried no readable holder collection");return z_({chain:n,tokenAddress:r,payload:a,token:e.token,maxNodes:i,limit:o,endpoint:s,fetchedAt:new Date().toISOString()})}var E9,ys,Y_,X_,x9,J_,A9,k9,ib,I9,_9,O9,N9,$9,B9,D9,lO=_(()=>{q();gt();V_();Wd();E9="https://api.bubblemaps.io",ys="bubblemaps",Y_=Object.freeze(["eth","base","solana","tron","bsc","sonic","ton","avalanche","polygon","monad","hyperevm","arbitrum","robinhood"]),X_=Object.freeze([80,250,500]),x9=80,J_=new Set(Y_),A9=new Set(["solana","tron","ton"]);k9=new Set(X_),ib="BUBBLEMAPS_API_KEY",I9="BUBBLEMAPS_API_URL",_9=128,O9=128,N9=8*1024*1024;$9=1e3,B9=6e4,D9=3e4});import{getAddress as j9}from"ethers";function vc(e,t){let n=String(e??"").trim();if(!n)throw new Error(`${t} is required`);if(pO.test(n))try{return j9(n)}catch{throw new Error(`${t} is not a valid EVM address`)}return n}function Xd(e,t){let n=e?.[t];if(typeof n!="function")throw new Error(`lp-liquidity-ranker: opts.${t} must be a function`);return n}function z9(e){if(!e||typeof e!="object")throw new Error("candidate must be an object");let t=Number(e.chainId);if(!Number.isInteger(t)||t<=0)throw new Error("chainId must be a positive integer");let n=String(e.venue??"").trim().toLowerCase();if(!n)throw new Error("venue is required");let r=vc(e.poolAddress,"poolAddress"),o=e.token;if(!o||typeof o!="object")throw new Error("token is required");let i=String(o.symbol??"").trim();if(!i)throw new Error("token.symbol is required");let s=vc(o.address,"token.address"),a=null;if(o.decimals!=null&&(a=Number(o.decimals),!Number.isInteger(a)||a<0||a>255))throw new Error("token.decimals must be a uint8 when provided");let c=Number(e.liquidityUsd);if(!Number.isFinite(c)||c<0)throw new Error("liquidityUsd must be a non-negative finite number");let l=n==="uniswap-v4"||e.isV4===!0,u=null;if(e.hook!=null){if(typeof e.hook!="object")throw new Error("hook must be an object when provided");u=Object.freeze({address:e.hook.address!=null?vc(e.hook.address,"hook.address"):dO,dynamicFee:e.hook.dynamicFee===!0,reviewed:e.hook.reviewed===!0})}let d=e.id!=null?String(e.id):`${n}:${t}:${r}`;return Object.freeze({id:d,chainId:t,venue:n,poolAddress:r,token:Object.freeze({symbol:i,address:s,decimals:a}),liquidityUsd:c,isV4:l,hook:u})}function V9(e){if(!ab.includes(e.venue))return`unsupported venue "${e.venue}"; supported: ${ab.join(", ")}`;if(e.isV4){if(!e.hook)return"uniswap-v4 candidate is missing hook disclosure; failing closed";if(e.hook.dynamicFee)return"uniswap-v4 pool uses a dynamic fee; fee is not knowable in advance, failing closed";if(e.hook.address!==dO&&!e.hook.reviewed)return`uniswap-v4 pool has an unreviewed hook (${e.hook.address}); failing closed`}return null}async function W9(e,t,n){let r=Xd(n,"resolveTokenIdentity"),o;try{o=await r({chainId:e.chainId,address:e.token.address,symbol:e.token.symbol})}catch(l){return{ok:!1,reason:`identity resolution failed: ${l?.message??l}`}}if(!o||typeof o!="object")return{ok:!1,reason:"identity unresolved"};if(o.ambiguous)return{ok:!1,reason:o.reason??"ambiguous token identity"};if(!o.canonicalId)return{ok:!1,reason:"identity resolver returned no canonicalId"};if(o.canonicalId!==t.canonicalId)return{ok:!1,reason:`token resolves to canonical id "${o.canonicalId}", expected "${t.canonicalId}"`};let i=Number(o.homeChainId);if(!Number.isInteger(i)||i<=0)return{ok:!1,reason:"identity resolver returned no homeChainId"};let s;try{s=vc(o.canonicalAddress,"identity resolver canonicalAddress")}catch(l){return{ok:!1,reason:l.message}}let a=e.token.address;return(pO.test(s)?s===a:s.toLowerCase()===String(a).toLowerCase())?{ok:!0,canonicalId:o.canonicalId,homeChainId:i,canonicalAddress:s,decimals:o.decimals??e.token.decimals??null}:{ok:!1,reason:`token address ${e.token.address} on chain ${e.chainId} does not match the canonical address ${s}; possible wrapped variant or spoof`}}async function G9(e,t,n){let r={},o=[];for(let[a,c]of Yd){let l=Xd(n,c),u;try{u=await l(e,t)}catch(p){return{ok:!1,reason:`${c} failed for ${e.id}: ${p?.message??p}`}}if(u==null||!Number.isFinite(Number(u))){r[a]=null,o.push(a);continue}let d=Number(u);if(d<0)return{ok:!1,reason:`${c} returned a negative cost for ${e.id}`};r[a]=d}let i=Yd.reduce((a,[c])=>a+(r[c]??0),0),s=o.length===0;return{ok:!0,costs:Object.freeze(r),missingLegs:Object.freeze(o),grossOnly:!s,measuredCostUsd:i,totalCostUsd:s?i:null,netUsd:s?t.amountUsd-i:null}}function sb(e){return Object.freeze({id:e.id,chainId:e.chainId,venue:e.venue,poolAddress:e.poolAddress,token:e.token,liquidityUsd:e.liquidityUsd,canonicalId:e.identity.canonicalId,homeChainId:e.identity.homeChainId})}function uO(e,t){let n=null;for(let r of e){if(!n){n=r;continue}let o=t(r),i=t(n);(o>i||o===i&&r.id<n.id)&&(n=r)}return n}async function K9(e={},t={}){let n=String(e.canonicalId??"").trim();if(!n)throw new Error("lp-liquidity-ranker: canonicalId is required");let r=Number(e.amountUsd);if(!Number.isFinite(r)||r<=0)throw new Error("lp-liquidity-ranker: amountUsd must be a positive finite number");if(!Array.isArray(e.candidates)||e.candidates.length===0)throw new Error("lp-liquidity-ranker: candidates must be a non-empty array");let o=e.materialityThresholdBps??H9;if(!Number.isInteger(o)||o<0)throw new Error("lp-liquidity-ranker: materialityThresholdBps must be a non-negative integer");Xd(t,"resolveTokenIdentity");for(let[,h]of Yd)Xd(t,h);let i=Object.freeze({canonicalId:n,amountUsd:r,materialityThresholdBps:o}),s=[],a=[],c=new Set,l=null;for(let h=0;h<e.candidates.length;h+=1){let g=e.candidates[h],y=g?.id!=null?String(g.id):`candidates[${h}]`,b;try{b=z9(g)}catch(k){s.push({id:y,reason:k.message});continue}if(c.has(b.id)){s.push({id:b.id,reason:"duplicate candidate id"});continue}c.add(b.id);let w=V9(b);if(w){s.push({id:b.id,reason:w});continue}let S=await W9(b,i,t);if(!S.ok){s.push({id:b.id,reason:S.reason});continue}if(l==null)l=S.homeChainId;else if(S.homeChainId!==l){s.push({id:b.id,reason:`ambiguous home chain for canonical token "${n}": got ${S.homeChainId}, expected ${l}`});continue}let v=await G9(b,i,t);if(!v.ok){s.push({id:b.id,reason:v.reason});continue}a.push({...b,identity:S,...v})}let u=[];if(a.length===0)return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:0,rejected:Object.freeze(s),deepestLiquidity:null,netBest:null,netRankingComplete:!1,preparationEligible:!1,runnersUp:Object.freeze([]),warnings:Object.freeze(["no candidate passed identity, venue, or cost validation"])});let d=uO(a,h=>h.liquidityUsd),p=a.filter(h=>!h.grossOnly&&h.netUsd!=null),m=uO(p,h=>h.netUsd);for(let h of a)h.grossOnly&&u.push(`${h.id}: gas/fees not fully accounted (missing: ${h.missingLegs.join(", ")}); missing costs were not treated as zero`);m?d.id!==m.id&&u.push(`${d.id} has the deepest liquidity ($${d.liquidityUsd}) but ${m.id} nets more after costs; these are intentionally different answers`):u.push("net-best migration is unavailable until every ranking cost leg is measured; missing gas is never treated as zero and deepest liquidity is not claimed as net-best"),p.length<a.length&&u.push("partial-cost candidates were excluded from net ranking; missing gas was not treated as zero");let f=a.filter(h=>h.id!==m?.id).sort((h,g)=>h.netUsd==null&&g.netUsd==null?h.id<g.id?-1:1:h.netUsd==null?1:g.netUsd==null?-1:g.netUsd-h.netUsd||(h.id<g.id?-1:1)).map(h=>{let g=m!=null&&h.netUsd!=null,y=g?m.netUsd-h.netUsd:null,b=g?Math.round(y/r*1e4):null;return Object.freeze({...sb(h),netUsd:h.netUsd,totalCostUsd:h.totalCostUsd,grossOnly:h.grossOnly,missingLegs:h.missingLegs,marginUsd:y,marginBps:b,material:b!=null&&b>o})});return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:a.length,rejected:Object.freeze(s),deepestLiquidity:sb(d),netBest:m?Object.freeze({...sb(m),netUsd:m.netUsd,totalCostUsd:m.totalCostUsd,costs:m.costs,grossOnly:!1,missingLegs:m.missingLegs}):null,netRankingComplete:!!m&&p.length===a.length,preparationEligible:!1,runnersUp:Object.freeze(f),warnings:Object.freeze(u)})}async function fO(e={}){let t=String(e.canonicalId??"").trim(),n=Number(e.homeChainId);if(!t)throw new Error("lp-liquidity-ranker: canonicalId is required");if(!Number.isInteger(n)||n<=0)throw new Error("lp-liquidity-ranker: homeChainId must be a positive integer");if(!Array.isArray(e.canonicalAssets)||e.canonicalAssets.length===0)throw new Error("lp-liquidity-ranker: canonicalAssets must be a non-empty array");let r=new Map;for(let c of e.canonicalAssets){let l=Number(c?.chainId);if(!Number.isInteger(l)||l<=0)throw new Error("lp-liquidity-ranker: canonical asset chainId must be positive");if(r.has(l))throw new Error(`lp-liquidity-ranker: duplicate canonical asset for chain ${l}`);let u=vc(c?.address,"canonical asset address"),d=c?.decimals==null?null:Number(c.decimals);if(d!=null&&(!Number.isInteger(d)||d<0||d>255))throw new Error("lp-liquidity-ranker: canonical asset decimals must be a uint8");r.set(l,Object.freeze({canonicalAddress:u,decimals:d}))}let o={resolveTokenIdentity:async({chainId:c})=>{let l=r.get(Number(c));return l?{canonicalId:t,homeChainId:n,...l}:{ambiguous:!0,reason:`no exact canonical asset mapping for chain ${c}`}}},i=(e.candidates??[]).map(c=>({...c,costs:c?.costs&&typeof c.costs=="object"?{...c.costs}:{}})),s=new Map(i.map(c=>[String(c?.id??`${String(c?.venue??"").toLowerCase()}:${Number(c?.chainId)}:${String(c?.poolAddress??"")}`),c.costs]));for(let[c,l]of Yd)o[l]=async u=>s.get(u.id)?.[c]??null;let a=await K9({...e,canonicalId:t,candidates:i},o);return Object.freeze({...a,evidenceMode:"caller-supplied",warnings:Object.freeze(["canonical mappings, pool liquidity, and migration costs were caller-supplied and not independently live-verified",...a.warnings])})}async function mO(){return Object.freeze({ok:!0,execution:"analysis-only",supportedVenues:ab,note:"Deepest liquidity and net-best migration are reported separately; no signing or broadcasting."})}var ab,dO,pO,H9,Yd,hO=_(()=>{ab=Object.freeze(["uniswap-v2","uniswap-v3","uniswap-v4","aerodrome","curve","balancer","meteora-dlmm","pancakeswap","sushiswap"]),dO="0x0000000000000000000000000000000000000000",pO=/^0x[0-9a-fA-F]{40}$/,H9=25,Yd=Object.freeze([["removalGasUsd","estimateRemovalGasUsd"],["swapCostUsd","estimateSwapCostUsd"],["bridgeCostUsd","estimateBridgeCostUsd"],["addLiquidityGasUsd","estimateAddLiquidityGasUsd"],["priceImpactUsd","estimatePriceImpactUsd"]])});function Z9(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function ez(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=Z9(n);if(J9.has(r)||Q9.some(o=>r.includes(o)))return!0}return!1}function gO(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}function nz(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function rz(e){let t=e.match(tz)||[];for(let n of t){let r=nz(n),o=gO(r),i=o?gO(o):null;for(let s of[r,o,i])if(s&&ez(s))return!0}return!1}function oo(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function io(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of oz){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function je(e){return typeof e!="string"||e.length===0?!1:X9.some(t=>t.test(e))?!0:rz(e)}var X9,J9,Q9,tz,oz,so=_(()=>{X9=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),J9=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Q9=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);tz=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;oz=Object.freeze([Object.freeze([120,112,114,118]),Object.freeze([115,107,45]),Object.freeze([103,104,112,95]),Object.freeze([103,104,111,95]),Object.freeze([103,104,117,95]),Object.freeze([103,104,115,95]),Object.freeze([103,104,114,95]),Object.freeze([103,105,116,104,117,98,95,112,97,116,95]),Object.freeze([97,107,105,97]),Object.freeze([97,115,105,97])])});function az(e,t){if(!e||typeof e!="object"||!String(e.source??"").trim())throw new Error(`lp-destination-discovery: ${t}.provenance.source is required`);if(Object.keys(e).filter(a=>!iz.has(a)).length)throw new Error(`lp-destination-discovery: ${t}.provenance contains unsupported fields`);let r=String(e.source).trim();if(r.length>512||je(r))throw new Error(`lp-destination-discovery: ${t}.provenance.source is unsafe`);let o=e.evidenceHash==null?null:String(e.evidenceHash).trim();if(o!=null&&!/^[0-9a-f]{64}$/i.test(o))throw new Error(`lp-destination-discovery: ${t}.provenance.evidenceHash must be a sha256 digest`);let i=e.txHash==null?null:String(e.txHash).trim();if(i!=null&&!/^0x[0-9a-f]{64}$/i.test(i))throw new Error(`lp-destination-discovery: ${t}.provenance.txHash must be an EVM transaction hash`);let s=e.reviewedAt==null?null:String(e.reviewedAt).trim();if(s!=null&&!Number.isFinite(Date.parse(s)))throw new Error(`lp-destination-discovery: ${t}.provenance.reviewedAt must be ISO time`);return Object.freeze({source:r,reviewedAt:s,evidenceHash:o,txHash:i})}function bO(e,t){if(!e||typeof e!="object")throw new Error(`lp-destination-discovery: ${t} is required`);let n=Number(e.chainId),r=String(e.token0??"").trim(),o=String(e.token1??"").trim();if(!Number.isInteger(n)||n<=0)throw new Error(`lp-destination-discovery: ${t}.chainId must be positive`);if(!yO.test(r)||!yO.test(o)||br(r)===br(o))throw new Error(`lp-destination-discovery: ${t} requires distinct exact token0/token1 addresses`);return Object.freeze({...e,chainId:n,token0:r,token1:o,provenance:az(e.provenance,t)})}function cz(e,t){if(!String(e.dexId??"").toLowerCase().includes("v4"))return{eligible:!0,reason:null};let n=t.v4;if(!n)return{eligible:!1,reason:"Uniswap V4 metadata is unreviewed"};if(n.dynamicFee===!0)return{eligible:!1,reason:"Uniswap V4 dynamic fee is not preparation-eligible"};let r=br(n.hook);return r&&r!=="0x0000000000000000000000000000000000000000"&&n.reviewed!==!0?{eligible:!1,reason:"Uniswap V4 hook is unreviewed"}:{eligible:!0,reason:null}}function lz(e){let t=e?.best;if(!t||t.quality!=="FULL")return null;let n=Number(t.gasUsd),r=Number(t.feeUsd);return t.gasUsd==null||t.feeUsd==null||!Number.isFinite(n)||!Number.isFinite(r)?null:n+r}async function wO({source:e,destination:t,amountIn:n,index:r},o,i){if(n==null)return{requested:!1,measured:!1,costUsd:null,quote:null};let s=e[`token${r}`],a=t[`token${r}`];if(e.chainId===t.chainId&&br(s)===br(a))return{requested:!0,measured:!0,costUsd:0,quote:null,kind:"none",amountIn:String(n)};let c=e.chainId===t.chainId?{chainId:e.chainId,tokenIn:s,tokenOut:a,amountIn:String(n)}:{fromChainId:e.chainId,toChainId:t.chainId,tokenIn:s,tokenOut:a,amountIn:String(n)},l=e.chainId===t.chainId?"swap":"bridge";try{let u=l==="swap"?await o.bestSwapRoute(c,i):await o.bestBridgeRoute(c,i),d=lz(u);return{requested:!0,measured:d!=null,costUsd:d,quote:u,kind:l,amountIn:String(n)}}catch(u){return{requested:!0,measured:!1,costUsd:null,quote:null,kind:l,amountIn:String(n),error:u?.message??String(u)}}}function uz(e){let t=e.minLiquidityBpsOfDeepest??sz;if(!Number.isInteger(t)||t<1||t>1e4)throw new Error("lp-destination-discovery: minLiquidityBpsOfDeepest must be an integer from 1 to 10000");if(e.minLiquidityUsd==null)return{bps:t,minLiquidityUsd:null};let n=Number(e.minLiquidityUsd);if(!Number.isFinite(n)||n<0)throw new Error("lp-destination-discovery: minLiquidityUsd must be a non-negative number");return{bps:t,minLiquidityUsd:n}}function dz(e,t,n){if(e.venueReviewEligible===!1)return{destinationEligible:!1,destinationIneligibleReason:e.ineligibleReason};if(e.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is unknown"};let r=Number(e.liquidityUsd);if(!Number.isFinite(r)||r<=0)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is not positive"};if(n.minLiquidityUsd!=null&&r<n.minLiquidityUsd)return{destinationEligible:!1,destinationIneligibleReason:`liquidity $${r} is below the $${n.minLiquidityUsd} floor`};if(!t||t.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"no eligible deepest pool"};let o=Number(t.liquidityUsd)*n.bps/1e4;return r<o?{destinationEligible:!1,destinationIneligibleReason:`shallower than the deepest eligible pool ($${r} < $${o} required)`}:{destinationEligible:!0,destinationIneligibleReason:null}}function SO(e,t,n="max"){return[...e].sort((r,o)=>(n==="max"?t(o)-t(r):t(r)-t(o))||String(r.poolAddress).localeCompare(String(o.poolAddress)))[0]??null}async function vO(e={},t={}){let n=bO(e.sourcePair,"sourcePair");if(!Array.isArray(e.destinationPairs))throw new Error("lp-destination-discovery: destinationPairs must be an array");let r=e.destinationPairs.map((E,I)=>bO(E,`destinationPairs[${I}]`)),o=new Map;for(let E of r){if(o.has(E.chainId))throw new Error(`lp-destination-discovery: duplicate destination mapping for chain ${E.chainId}`);o.set(E.chainId,E)}let i=uz(e),s=t.chainConfigs??(await Promise.resolve().then(()=>(ts(),Gg))).CHAIN_CONFIGS,a=e.amounts?.token0!=null||e.amounts?.token1!=null,c=a&&r.some(E=>E.chainId===n.chainId&&(br(E.token0)!==br(n.token0)||br(E.token1)!==br(n.token1))),l=a&&r.some(E=>E.chainId!==n.chainId),u=c&&!t.bestSwapRoute||l&&!t.bestBridgeRoute?await Promise.resolve().then(()=>(xg(),GA)):null,d={discoverExactPairPools:t.discoverExactPairPools??Ex,bestSwapRoute:t.bestSwapRoute??u?.bestSwapRoute,bestBridgeRoute:t.bestBridgeRoute??u?.bestBridgeRoute},p=e.limit??10,m=await Promise.all(s.map(async E=>{let I=o.get(Number(E.chainId));if(!E.dexscreenerSlug)return{chainId:E.chainId,chain:E.name??E.key??null,status:"unavailable",reason:"DexScreener coverage slug is not configured",pools:[]};if(!I)return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"unavailable",reason:"no explicit provenanced destination token0/token1 mapping",pools:[]};try{let N=await d.discoverExactPairPools({chainSlug:E.dexscreenerSlug,token0:I.token0,token1:I.token1,limit:p,dexIds:I.dexIds},t);return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"available",mapping:I,pools:N}}catch(N){return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"unavailable",reason:N?.message??String(N),mapping:I,pools:[]}}})),f=m.flatMap(E=>E.pools.map(I=>({...I,chainId:Number(E.chainId),mapping:E.mapping}))),h=e.amounts??{},g=await Promise.all(f.map(async E=>{let[I,N]=await Promise.all([wO({source:n,destination:E.mapping,amountIn:h.token0,index:0},d,t),wO({source:n,destination:E.mapping,amountIn:h.token1,index:1},d,t)]),D=!(I.requested||N.requested)||[I,N].filter($=>$.requested).every($=>$.measured),X=D?[I,N].reduce(($,j)=>$+(j.costUsd??0),0):null,H=cz(E,E.mapping);return Object.freeze({...E,mappingProvenance:E.mapping.provenance,legs:Object.freeze([I,N]),fullyMeasured:D,costUsd:X,preparationEligible:!1,venueReviewEligible:H.eligible,ineligibleReason:H.reason})})),y=SO(g.filter(E=>E.liquidityUsd!=null),E=>Number(E.liquidityUsd)),b=g.map(E=>Object.freeze({...E,...dz(E,y,i)})),w=b.find(E=>E.destinationEligible&&y&&E.poolAddress===y.poolAddress&&E.chainId===y.chainId)??null,S=b.filter(E=>E.fullyMeasured&&E.destinationEligible),v=SO(S,E=>E.costUsd,"min"),k=b.filter(E=>E.destinationEligible===!1&&E.destinationIneligibleReason?.includes("shallower")),A=y&&b.some(E=>E.poolAddress===y.poolAddress&&E.chainId===y.chainId&&E.destinationEligible===!1);return Object.freeze({ok:!0,analysisOnly:!0,sourcePair:n,coverage:Object.freeze(m),routes:Object.freeze(b),deepestLiquidity:y,recommendedDestination:w,migrationCostBest:v,netBest:null,rankedOn:"liquidity",netRankingComplete:!1,preparationEligible:!1,liquidityFloor:Object.freeze(i),warnings:Object.freeze([...S.length<b.filter(E=>E.fullyMeasured).length?["partial-cost or thin-book routes were excluded from migration-cost comparison; missing gas was not treated as zero and thinner pools are not destinations"]:[],...k.length?[`${k.length} shallower pool(s) are not destination-eligible; a thinner V3 book is never recommended over a deeper V4 book`]:[],...A?["deepest book is not destination-eligible (unreviewed/dynamic-fee V4 or liquidity floor); thinner pools are still not recommended"]:[],"net-best migration is unavailable until destination token values and final add-liquidity gas/impact are measured; deepest liquidity is not claimed as net-best"])})}async function EO(){let{CHAIN_CONFIGS:e}=await Promise.resolve().then(()=>(ts(),Gg));return{ok:!0,execution:"analysis-only",configuredChains:e.length}}var yO,iz,sz,br,xO=_(()=>{nr();so();yO=/^0x[0-9a-fA-F]{40}$/,iz=new Set(["source","reviewedAt","evidenceHash","txHash"]),sz=1e4,br=e=>String(e??"").trim().toLowerCase()});import{Interface as IO,getAddress as Ec,isAddress as fz}from"ethers";function NO(e){let t=Number(e),n=ao[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(ao).join(", ")})`);return{chainId:t,...n}}function kO(e,t){let n=ao[Number(t)];if(!e||e===_O||e===OO||/^eth$/i.test(String(e)))return Ec(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ec(n.weth);if(/^usdc$/i.test(r))return Ec(n.usdc);if(!fz(r))throw new Error(`invalid token address: ${e}`);return Ec(r)}async function Jd(e={},t={}){let{chainId:n,quoter:r,router:o}=NO(e.chainId??8453),i=kO(e.tokenIn||"WETH",n),s=kO(e.tokenOut||ao[n].usdc,n),a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...mz],u=await Promise.all(c.map(async p=>{let m=AO.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:s,amountIn:a,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await J(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=AO.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return we({venue:"aerodrome",chainId:n,chain:ao[n].name,quoter:r,router:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function TO(e={},t={}){let n=Number(e.chainId??8453),r=NO(n),o=Ec(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===_O||i===OO||/^eth$/i.test(i),a=await Jd(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=hz.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,tickSpacing:a.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]);return U({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:s?a.amountIn:"0",slippageGuard:De(a.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function CO(e={}){let t=Number(e.chainId??8453);try{let n=await Jd({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:ao[t]?.router,quoter:ao[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function PO(){return Object.entries(ao).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}var ao,mz,AO,hz,_O,OO,RO=_(()=>{Ne();Ot();oe();ao={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},mz=[1,50,100,200,2e3],AO=new IO(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),hz=new IO(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),_O="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",OO="0x0000000000000000000000000000000000000000"});function bz(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>yz)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 wr(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function $O(e,t){let n=wr(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 wz(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 Sz(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=wr(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:wr(e.network,`accepts[${t}].network`),amount:$O(e.amount,`accepts[${t}].amount`),asset:wr(e.asset,`accepts[${t}].asset`),payTo:wr(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:wz(e.extra)})}function cb(e){let t=bz(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>LO)throw new Error(`x402: accepts must contain 1-${LO} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:wr(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(Sz));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 MO(e,t){return String(e)===String(t)}function vz(e,t={}){let n=cb(e),r=wr(t.network,"network"),o=wr(t.asset,"asset"),i=wr(t.payTo,"payTo"),s=BigInt($O(t.maxAmount,"maxAmount")),a=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&MO(l.asset,o)&&MO(l.payTo,i));if(a.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=a.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)>s)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${s}`);return c}function BO(e={}){return e.paymentRequired??e.header??e.body}function DO(e={}){return cb(BO(e))}function UO(e={},t={}){let n=cb(BO(e)),r=vz(n,e);return U({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 FO(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}var yz,LO,qO=_(()=>{oe();yz=96*1024,LO=50});function lb(e={}){return Te({provider:"bankr",defaultUrl:xz,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function jO(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function Az(e={}){let t=jO(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function HO(e={},t=!1){let n=Az(e),r=lb(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function zO(e,t={}){return x(`${lb(t).baseUrl}${e}`,{headers:HO(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function ub(e={}){return zO("/wallet/me",e)}async function VO(e={}){return zO("/wallet/portfolio",e)}function xc(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function kz(e){let t=xc(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 WO(e={},t={}){let n={fromChain:xc(e.fromChain,"fromChain"),fromToken:xc(e.fromToken,"fromToken"),toChain:xc(e.toChain,"toChain"),toToken:xc(e.toToken,"toToken"),amount:kz(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 x(`${lb(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:HO(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function GO(e={}){if(!jO(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await ub(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var xz,KO=_(()=>{q();gt();xz="https://api.bankr.bot"});async function Ac(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||_z,s=Date.now();return new Promise((a,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?a({ok:!0,partial:!0,ms:Date.now()-s,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,a({ok:!0,ms:Date.now()-s,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function YO(e={}){try{let t=await Ac({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 XO(e={}){let t=await Ac({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function JO(e,t={}){if(!e)throw new Error("coin required");let n=await Ac({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var _z,QO=_(()=>{_z=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws"});async function Qd(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 s=t.url||Nz,a=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(s),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-a,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 y;try{y=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{y={raw:String(g.data).slice(0,300)}}d.push(y),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-a,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function ZO(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Qd([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 eN(e,t={}){if(!e)throw new Error("assetId required");let n=await Qd([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}var Nz,tN=_(()=>{Nz=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market"});function db(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||Cz).replace(/\/$/,"")}function Zd(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||Pz).replace(/\/$/,"")}function kc(e){return{error:String(e.message||e).slice(0,200)}}function Jt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ic(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function ep(e={}){try{let t=await x(`${db(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function tp(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await x(`${db(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Jt(o?.price??o?.lastPrice),volume24h:Jt(o?.volume),quoteVolume24h:Jt(o?.quoteVolume),raw:o}}catch(r){return kc(r)}}async function nN(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${Zd(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${db(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,s=await x(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return Oc({venue:"binance",market:o?"perp":"spot",symbol:n,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return kc(i)}}async function _c(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await x(`${Zd(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||Rz,s=Jt(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Jt(o?.markPrice),indexPrice:Jt(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Jt(o?.nextFundingTime),raw:o??null}}catch(r){return kc(r)}}async function rN(e={},t={}){let n=await _c(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function oN(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await x(`${Zd(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Jt(r?.openInterest),time:Jt(r?.time),raw:r??null}}catch(r){return kc(r)}}async function iN(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await x(`${Zd(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(s=>({fundingTime:Jt(s?.fundingTime),fundingRate:Jt(s?.fundingRate)}))}}catch(o){return kc(o)}}function Oc({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let s=m=>(Array.isArray(m)?m:[]).map(f=>{let h=Jt(Array.isArray(f)?f[0]:f?.price),g=Jt(Array.isArray(f)?f[1]:f?.size);return h==null||g==null?null:{price:h,size:g}}).filter(Boolean),a=s(r),c=s(o),l=a[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:a,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}var Cz,Pz,Rz,Nc=_(()=>{q();Cz="https://api.binance.com",Pz="https://fapi.binance.com",Rz=8});function bs(e={}){return(e.baseUrl||process.env.OKX_API_URL||Lz).replace(/\/$/,"")}function Tc(e){return{error:String(e.message||e).slice(0,200)}}function zt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Cc(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function ws(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function np(e={}){try{let t=await x(`${bs(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:ws(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function rp(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Cc(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await x(`${bs(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ws(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:zt(i.last),bestBid:zt(i.bidPx),bestAsk:zt(i.askPx),volume24h:zt(i.vol24h),quoteVolume24h:zt(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return Tc(o)}}async function aN(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Cc(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await x(`${bs(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=ws(i)[0];return s?Oc({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${r}`}}catch(i){return Tc(i)}}async function op(e={},t={}){let n=Cc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await x(`${bs(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=ws(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||Mz,s=zt(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:s,nextFundingRate:zt(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:zt(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return Tc(r)}}async function ip(e={},t={}){let n=Cc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await x(`${bs(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ws(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:zt(i.markPx),time:zt(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return Tc(o)}}async function cN(e={},t={}){let n=Cc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await x(`${bs(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ws(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:zt(i.oiCcy??i.oi),openInterestContracts:zt(i.oi),openInterestUsd:zt(i.oiUsd),time:zt(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return Tc(o)}}var Lz,Mz,pb=_(()=>{q();Nc();Lz="https://www.okx.com",Mz=8});function Pc(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||$z).replace(/\/$/,"")}function Rc(e){return{error:String(e.message||e).slice(0,200)}}function dt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function sp(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function fb(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function Lc(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function ap(e={}){try{let t=await x(`${Pc(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!Lc(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function uN(e,t){let n=fb(e.market),r=sp(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await x(`${Pc(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Lc(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function cp(e={},t={}){try{let n=await uN(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:dt(r.lastPrice),bestBid:dt(r.bid1Price),bestAsk:dt(r.ask1Price),markPrice:dt(r.markPrice),indexPrice:dt(r.indexPrice),volume24h:dt(r.volume24h),quoteVolume24h:dt(r.turnover24h),raw:r}}catch(n){return Rc(n)}}async function dN(e={},t={}){let n=fb(e.market),r=sp(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await x(`${Pc(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Lc(i);return s?Oc({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${r}`}}catch(i){return Rc(i)}}async function Mc(e={},t={}){try{let n=await uN({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||Bz,s=dt(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:dt(r.markPrice),indexPrice:dt(r.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:dt(r.nextFundingTime),openInterest:dt(r.openInterest),raw:r}}catch(n){return Rc(n)}}async function pN(e={},t={}){let n=await Mc(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function fN(e={},t={}){let n=sp(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=fb(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await x(`${Pc(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=Lc(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:dt(c.openInterest),time:dt(c.timestamp),history:(Array.isArray(a)?a:[]).map(l=>({openInterest:dt(l?.openInterest),timestamp:dt(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(s){return Rc(s)}}async function mN(e={},t={}){let n=sp(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await x(`${Pc(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Lc(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:s.length,history:s.map(a=>({fundingRate:dt(a?.fundingRate),fundingTime:dt(a?.fundingRateTimestamp)}))}}catch(o){return Rc(o)}}var $z,Bz,mb=_(()=>{q();Nc();$z="https://api.bybit.com",Bz=8});function $c(e){return{error:String(e.message||e).slice(0,200)}}function Et(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Dz(e,t){return e==null||!t?null:e*(8760/t)*100}function gb(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function Uz(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):hb,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=hb.filter(i=>r.has(i));return o.length?o:hb}async function Fz(e={},t={}){let n=gb(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await jt(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let s=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(s<0)return{error:`hyperliquid has no perp for ${n}`};let a=i[s]||{},c=Et(a.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Et(a.markPx),indexPrice:Et(a.oraclePx),midPrice:Et(a.midPx),fundingRate:c,fundingIntervalHours:gN,fundingAprPct:Dz(c,gN),openInterest:Et(a.openInterest)}}catch(r){return $c(r)}}async function qz(e={},t={}){let n=gb(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await _n(t),o=Et(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return $c(r)}}async function jz(e={},t={}){let[n,r]=await Promise.all([op(e,t).catch($c),ip(e,t).catch($c)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Et(r.markPrice),...r?.error?{markError:r.error}:{}}}async function co(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,$c(n)]}}async function yb(e={},t={}){let n=gb(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=Uz(e),i=[];o.includes("binance")&&(i.push(co("binance:perp",_c({coin:n,quote:r},t))),i.push(co("binance:spot",tp({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(co("okx:perp",jz({coin:n,quote:r},t))),i.push(co("okx:spot",rp({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(co("bybit:perp",Mc({coin:n,quote:r},t))),i.push(co("bybit:spot",cp({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(co("hyperliquid:perp",Fz({coin:n},t))),i.push(co("hyperliquid:spot",qz({coin:n},t))));let s=await Promise.all(i),a={};for(let[c,l]of s){let[u,d]=c.split(":");a[u]=a[u]||{},a[u][d]=l}return{coin:n,quote:r,venues:o,legs:a}}function yN(e){return!e||e.error?null:Et(e.price)??Et(e.mid)??null}function Hz(e){return!e||e.error?null:Et(e.markPrice)??Et(e.midPrice)??null}async function bb(e={},t={}){let n=await yb(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:s}=n,a=[];for(let f of i){let h=yN(s[f]?.spot);h!=null&&h>0&&a.push(h)}let c=[...a].sort((f,h)=>f-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let f of i){let h=s[f]?.perp,g=s[f]?.spot,y=Hz(h),b=yN(g),w=b??l,S=y!=null&&w?(y-w)/w*1e4:null;u.push({venue:f,symbol:h?.symbol??g?.symbol??r,markPrice:y,spotPrice:b,spotSource:b!=null?f:l!=null?"cross-venue-median":null,basisBps:S,fundingRate:h&&!h.error?Et(h.fundingRate):null,fundingIntervalHours:h&&!h.error?Et(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?Et(h.fundingAprPct):null,openInterest:h&&!h.error?Et(h.openInterest):null,errors:[h?.error,g?.error].filter(Boolean)})}let d=zz(u),p=u.filter(f=>f.markPrice!=null),m=u.filter(f=>f.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:m.length?m.reduce((f,h)=>h.basisBps>f.basisBps?h:f):null,cheapestBasis:m.length?m.reduce((f,h)=>h.basisBps<f.basisBps?h:f):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function zz(e=[]){let t=e.filter(r=>Et(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,l=a>0?i.venue:s.venue;n.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function bN(e={},t={}){let n=await bb(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function wN(e={}){try{let t=await Promise.all([ep(e).catch(()=>({ok:!1})),np(e).catch(()=>({ok:!1})),ap(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var hb,gN,SN=_(()=>{Nc();pb();mb();Xt();hb=["binance","okx","bybit","hyperliquid"],gN=1});import Ie from"node:fs";import lp from"node:path";import{createHash as Wz,randomUUID as vN}from"node:crypto";function lo(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(lo).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${lo(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function EN(e){return Wz("sha256").update(lo(e)).digest("hex")}function up(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 dp(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function xN(e){Ie.mkdirSync(e,{recursive:!0,mode:448});try{Ie.chmodSync(e,448)}catch{}}function Sb(e){try{let t=Ie.statSync(e);return{...JSON.parse(Ie.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function Ss({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:s=3e4,lockWaitMs:a=2e3,lockIdFactory:c=()=>vN()}={}){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(s)||s<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(a)||a<0||a>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let w=n();return r(w),{schemaVersion:wb,kind:t,generation:0,data:w}}function d(w){let S;try{S=JSON.parse(w)}catch(A){throw new Nn(`corrupt ${t} snapshot: invalid JSON (${A.message})`,"STORE_CORRUPT")}if(!S||typeof S!="object"||Array.isArray(S))throw new Nn(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(S.schemaVersion!==wb)throw new Nn(`unsupported ${t} schemaVersion ${String(S.schemaVersion)}`,"STORE_SCHEMA");if(S.kind!==t||!Number.isSafeInteger(S.generation)||S.generation<0)throw new Nn(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...k}=S;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||EN(k)!==v)throw new Nn(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(S.data)}catch(A){throw new Nn(`corrupt ${t} snapshot: ${A.message}`,"STORE_CORRUPT")}return k}function p(){if(!Ie.existsSync(e))return u();let w=Ie.statSync(e);if(!w.isFile()||w.size>i)throw new Nn(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{Ie.chmodSync(e,384)}catch{}return d(Ie.readFileSync(e,"utf8"))}function m(){xN(lp.dirname(e));let w=up(o),S=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:S,pid:process.pid,acquiredAt:w})}
|
|
7
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Hn(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||Bj()}function Sk(e={}){return Te({provider:"opensea",defaultUrl:gk,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function ur(e={}){return Sk(e).baseUrl}function dr(e={}){return Ue({accept:"application/json"},{"x-api-key":Hn(e)},Sk(e).trusted)}function vk(e){let t=String(e||"ethereum").trim().toLowerCase();if(!Lj.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ce(e,t="address"){try{return Cj(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Ek(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!wk.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ce(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 Dj(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 Uj(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 dk(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 Fj(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,quantity:e.quantity==null&&e.balance==null?null:String(e.quantity??e.balance),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"}}}function qj(e={}){return{base:ur(e),headers:dr(e),fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs}}async function Lg(e={}){if(!Hn(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Zi("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 Zi(e,t={}){if(!e)throw new Error("collection slug required");if(!Hn(t))throw new Error("OPENSEA_API_KEY required");return x(`${ur(t)}/collections/${encodeURIComponent(e)}`,{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function xk(e,t={}){if(!e)throw new Error("collection slug required");if(!Hn(t))throw new Error("OPENSEA_API_KEY required");return x(`${ur(t)}/collections/${encodeURIComponent(e)}/stats`,{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Mg(e,t={}){let n=await Zi(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;if(o==null){let d=await xk(e,t);r=d?.total||d?.stats||d||{},o=r.floor_price??r.floorPrice??null}let i=(Array.isArray(n.contracts)?n.contracts:[]).map(d=>({chain:String(d?.chain||d?.chain_identifier||n.chain||"").trim().toLowerCase(),address:String(d?.address||d?.contract_address||d?.contract||"").trim()})).filter(d=>d.chain&&d.address),s=String(t.expectedChain||"").trim().toLowerCase(),a=String(t.expectedContract||"").trim(),c=null;if(s&&a){let d=p=>s==="solana"?p:p.toLowerCase();if(c=i.find(p=>p.chain===s&&d(p.address)===d(a))||null,!c)throw new Error("opensea: collection identity does not match held contract")}let l=c?.chain||String(n.chain||"").trim().toLowerCase()||i[0]?.chain||"",u=String(n.floor_price_symbol||n.floorPriceSymbol||r.floor_price_symbol||r.floorPriceSymbol||"").trim().toUpperCase()||null;return{slug:n.collection||e,name:n.name||null,floor:o,chain:l||null,contracts:i,currency:u,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:i,fees:n.fees,category:n.category}}}async function es(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=vk(e.chain),r=Ek(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),s=[],a=e.next?String(e.next):null,c=0;do{let l=new URL(`${ur(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),a&&l.searchParams.set("next",a);let u=await x(l.toString(),{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])s.push(Fj(d,n,r));a=u?.next?String(u.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function Va(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Ek(e.address||e.owner),r=await x(`${ur(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:dr(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}}function Ga(e){let t=String(e||"").trim().toLowerCase(),n=Wa[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Ft(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 jj(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 za(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function Ak(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 kk(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 Hj(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function zj(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=ce(e?.token,t);if(n===0&&r!==Qi)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Qi)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function Vj(e,t){let n=Ft(e?.startAmount,`${t} startAmount`),r=Ft(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 Pg(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(Hj);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 s of r){let a=zj(s,`${t} payment token`);if(o==null)o=a;else if(a!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=Vj(s,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}function Yt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function pk(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 Ik(e,t){return{itemType:Number(Yt(e?.itemType,`${t} itemType`)),token:ce(e?.token,`${t} token`),identifierOrCriteria:Yt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Yt(e?.startAmount,`${t} startAmount`),endAmount:Yt(e?.endAmount,`${t} endAmount`)}}function Gj(e,t){return{...Ik(e,t),recipient:ce(e?.recipient,`${t} recipient`)}}function Kj(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:ce(e.offerer,`${t} offerer`),zone:ce(e.zone,`${t} zone`),offer:n.map((o,i)=>Ik(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>Gj(o,`${t} consideration[${i}]`)),orderType:Number(Yt(e.orderType,`${t} orderType`)),startTime:Yt(e.startTime,`${t} startTime`),endTime:Yt(e.endTime,`${t} endTime`),zoneHash:pk(e.zoneHash,`${t} zoneHash`),salt:Yt(e.salt,`${t} salt`),conduitKey:pk(e.conduitKey,`${t} conduitKey`),counter:Yt(e.counter,`${t} counter`)}}function _k(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=Kj(t,n);if(Rg.hashStruct("OrderComponents",Wj,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function Ok(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=ce(e?.token,`${t} contract`),o=za(e?.identifierOrCriteria),i=Ft(e?.startAmount,`${t} startAmount`,{positive:!0}),s=Ft(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==s)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 Yj(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 Ok(r[0],`${t} offer NFT`)}function Xj(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(s=>[4,5].includes(Number(s?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(s=>[2,3].includes(Number(s?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=Ok(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 Jj(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ce(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 Qj(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 Nk(e,t,n,r){let o=Yt(t?.startTime,`${r} startTime`),i=Yt(t?.endTime,`${r} endTime`),s=BigInt(Math.floor(n/1e3));if(BigInt(o)>s)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=s)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let a=kk(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&Qj(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return a}function Zj(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(Wa[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,s=Yj(i,"listing"),a=s.contract;if(t.contract&&a!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=s.tokenId;Jj(e.asset,a,c,"listing");let l=Ft(e.price?.current?.value,"listing price",{positive:!0}),u=_k(e,i,"listing"),d=Pg(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:ce(e.protocol_address,"listing protocol address"),contract:a,tokenId:c,quantity:s.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:Nk(e,i,n,"listing"),counter:Yt(i?.counter,"listing counter")}}async function fd(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Ga(e.chain);n.contract=e.contract?ce(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(`${ur(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let s=await x(i.toString(),{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=Array.isArray(s?.listings)?s.listings:[];if(!a.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:a.map(l=>Zj(l,n,c)),next:s?.next?String(s.next):null,exec:!1,readOnly:!0}}async function Ka(e={},t={}){let n=za(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 s=1;s<=r;s+=1){let a=await fd({...e,tokenId:void 0,limit:50,next:o},t),c=a.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:s,exact:!0,exec:!1,readOnly:!0};if(!a.next||i.has(a.next))break;i.add(a.next),o=a.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function eH(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||{},a=Xj(i,n,"offer").contract;if(t.contract&&a!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Ft(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Pg(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=Pg(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:_k(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ce(e.protocol_address,"offer protocol address"),contract:a,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:Nk(e,i,r,"offer"),counter:Yt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Ya(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Ga(e.chain);n.contract=e.contract?ce(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=za(e.tokenId),i=await x(`${ur(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:dr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!s)throw new Error("opensea: no active exact NFT offer returned");let a=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return eH(s,n,o,a)}function tH(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 Tk(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"&&Tk(n))}function Ck(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function Pk(e){return!e||typeof e!="object"?!1:Ck(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&Pk(t))}function Rk(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"&&Rk(o,t,n);return t}function fk(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Lk(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Ck(e))throw new Error("opensea: signed transaction material refused");if((e.from?ce(fk(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ce(fk(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let s=e.data??e.calldata,a=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(s==null&&a){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");s=Rj.encodeFunctionData("fulfillAdvancedOrder",[a.advancedOrder,a.criteriaResolvers,a.fulfillerConduitKey,a.recipient])}let c=String(s??"").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=jj(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function md(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 $g(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Ge(e,4,async c=>{let{chainId:l,...u}=md(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(Ne(),Ou)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),s=null,a=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();a=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),s=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(Ne(),Ou)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{a=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{a=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+a;s=u>m?u:m}return s!=null&&a!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=a.toString(),c.maxFeePerGas=s.toString(),c.worstCaseFeeWei=(d*s).toString()}),{simulated:!0,gasEstimates:i}}function nH(e,t){if(Tk(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(Pk(e))throw new Error("opensea: signed transaction material refused");let n=Rk(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=>Lk(r,t))}function rH(e,t,n={}){return U({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function Bg(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function Dg(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function oH(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(s=>String(s?.chain||t).toLowerCase()===t&&s?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=ce(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Xa(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");tH(e);let{chain:n,chainId:r}=Ga(e.chain),o=ce(e.buyer||e.minter||e.address,"buyer"),i=ce(e.contract,"NFT contract"),s=Ak(e.quantity),a=Ft(e.priceWei,"priceWei"),c=Ft(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=kk(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 Zi(d,t),m=oH(p,n,i),f=a*BigInt(s);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await x(`${ur(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:dr(t),body:{minter:o,quantity:s},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,y=Array.isArray(g)?g:g?[g]:[];if(!y.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let b=new Set(y.map($=>ce($,"SeaDrop mint target"))),w=nH(h,{buyer:o,chainId:r,targets:b});if(w.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let S,v,k=null,A;try{S=dd.decodeFunctionData("mintPublic",w[0].data),v="public",A=dd.encodeFunctionData("mintPublic",[S[0],S[1],S[2],S[3]])}catch{try{S=dd.decodeFunctionData("mintAllowList",w[0].data),v="allowlist";let $=S[4],j=[...S[5]].map(String);if(j.length<1||j.length>64||j.some(K=>!/^0x[0-9a-fA-F]{64}$/.test(K)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let C=BigInt($.startTime),B=BigInt($.endTime),V=BigInt(Math.floor(l/1e3));if(C>V||B<=V)throw new Error("opensea: allowlist mint stage is not open");if(BigInt($.mintPrice)!==a)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt($.maxTotalMintableByWallet)<BigInt(s))throw new Error("opensea: allowlist wallet cap is below requested quantity");A=dd.encodeFunctionData("mintAllowList",[S[0],S[1],S[2],S[3],$,j]),k={mintPrice:BigInt($.mintPrice).toString(),maxTotalMintableByWallet:BigInt($.maxTotalMintableByWallet).toString(),startTime:C.toString(),endTime:B.toString(),dropStageIndex:BigInt($.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt($.maxTokenSupplyForStage).toString(),feeBps:Number($.feeBps),restrictFeeRecipients:!!$.restrictFeeRecipients,proof:j}}catch($){throw/opensea:/.test(String($?.message||""))?$:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=ce(S[0],"mint NFT contract"),I=ce(S[1],"mint fee recipient"),N=ce(S[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(N!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(S[3])!==BigInt(s))throw new Error("opensea: mint calldata quantity mismatch");if(A.toLowerCase()!==w[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=w.reduce(($,j)=>$+j.valueWei,0n);if(T!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(T>c)throw new Error("opensea: mint total exceeds total cap");let D=await $g(w,r,{...t,provider:e.provider||t.provider});if(D.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let X=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},H=uk({chainId:r,tx:w[0],policy:X});return rH({action:"mint",mintType:v,...k?{stage:k}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:s,priceWei:a.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:w[0].to,feeRecipient:I,expiry:u,transactions:w.map(md),gasWar:H,...D},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Di,Date.parse(u),k?Number(BigInt(k.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function iH(e={}){let t=vk(e.chain);if(wk.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?dk(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=dk(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:ce(e.contract,"NFT contract"),token_id:o,quantity:Uj(e.quantity??1,"quantity"),price:{amount:Dj(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ce(e.price?.currency??e.currency??Qi,"price currency")},start_time:n.text,end_time:r.text}}function hk(e,t){return e?.[t]||(e?.action===t?e:null)}function aH(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(w=>hk(w,"createListingsAction")).find(Boolean)||o.find(w=>/createListings/i.test(String(w?.action||""))),s=i?.signatureRequest?.message??i?.typedData,a;try{a=typeof s=="string"?JSON.parse(s):s}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!a||a.primaryType!=="OrderComponents"||!a.domain||!a.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=a.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=ce(c.verifyingContract,"listing protocol"),u=a.message;if(ce(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(ce(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||ce(w.token,"listing payment token")!==Qi)throw new Error("opensea: executable listings currently require native fixed-price consideration");let S=BigInt(w.startAmount),v=BigInt(w.endAmount);if(S<=0n||S!==v)throw new Error("opensea: listing consideration must be fixed and positive");ce(w.recipient,"listing consideration recipient"),p+=S}let m=Pj(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=Rg.hashStruct("OrderComponents",Ji,u),y=o.map(w=>hk(w,"itemApprovalAction")).find(Boolean)||o.find(w=>/setApprovalForAll/i.test(String(w?.action||""))),b=null;if(y){let w=y.transaction||y.itemApprovalAction?.transaction,S=Lk(w,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=mk.decodeFunctionData("setApprovalForAll",S.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let k=ce(v[0],"listing approval operator");if(v[1]!==!0||S.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(mk.encodeFunctionData("setApprovalForAll",[k,!0]).toLowerCase()!==S.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");b={...S,operator:k}}return{protocolAddress:l,typedData:{domain:c,types:Ji,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:b}}async function Ja(e={},t={}){if(!Hn(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=ce(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(iH);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let s=e.useCreatorFee!==!1,a={address:n,items:o,use_creator_fee:s};e.taker&&(a.taker=ce(e.taker,"taker"));let c=await x(`${ur(t)}/listings/actions`,{method:"POST",headers:dr(t),body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Ga(o[0].chain),u=aH(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await $g(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return U({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(md),useCreatorFee:s,taker:a.taker||null,feeDisclosure:s?"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 Ug(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Ga(e.chain),o=ce(e.seller||e.address||e.owner,"seller"),i=ce(e.protocolAddress,"reviewed Seaport protocol address"),s=ce(e.contract,"NFT contract"),a=za(e.tokenId),c=Ak(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,I]of Object.entries(Ji)){let N=l.types?.[E];if(!Array.isArray(N)||N.length!==I.length||N.some((T,D)=>T?.name!==I[D].name||T?.type!==I[D].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(Ji).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=ce(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ce(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(ce(f.token,"cancellation NFT contract")!==s)throw new Error("opensea: cancellation NFT contract mismatch");if(za(f.identifierOrCriteria)!==a)throw new Error("opensea: cancellation tokenId mismatch");let h=Ft(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=Ft(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||ce(E.token,"cancellation payment token")!==Qi)throw new Error("opensea: cancellation requires native fixed-price consideration");let I=Ft(E.startAmount,"cancellation consideration startAmount",{positive:!0}),N=Ft(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(I!==N)throw new Error("opensea: cancellation consideration must be fixed and positive");ce(E.recipient,"cancellation consideration recipient")}let y=Ft(m.startTime,"cancellation startTime");if(Ft(m.endTime,"cancellation endTime",{positive:!0})<=y)throw new Error("opensea: cancellation listing time bounds invalid");let w=Rg.hashStruct("OrderComponents",Ji,m),S=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(S)||S!==w.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=sH.encodeFunctionData("cancel",[[m]]),k=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],A=await $g(k,r,{...t,provider:e.provider||t.provider});if(A.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return U({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:s,tokenId:a,quantity:c,protocolAddress:p,orderHash:w,typedData:{domain:d,types:Ji,primaryType:"OrderComponents",message:m},transactions:k.map(md),...A,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}var gk,yk,Rj,dd,bk,Lj,wk,Qi,Mj,$j,Wa,Wj,Ji,mk,sH,Xo=_(()=>{q();gt();oe();Cg();gk="https://api.opensea.io/api/v2",yk="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)",Rj=new pd([`function ${yk}`]),dd=new pd(["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"]),bk=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"]),Lj=new Set(bk),wk=new Set(["solana","flow"]),Qi="0x0000000000000000000000000000000000000000",Mj=Qi,$j="0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73";Wa=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});Wj=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"}]});Ji={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"}]},mk=new pd(["function setApprovalForAll(address operator,bool approved)"]),sH=new pd(["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 cH(e,t){return`0x${jg.getAmountsOut}`+fn(e)+fn(64)+fn(t.length)+t.map(Qa).join("")}function lH(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 qg(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function uH(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Hg)throw new Error(`slippageBps ${n} exceeds the ${Hg} 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 Mk(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await J(t,"eth_call",[{to:o,data:cH(i,s)},"latest"],a);return lH(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=qg(c.scanner);if(!l)return{chainId:t,evidence:se.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=a||[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,s,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:se.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:se.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=qg(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:te.UNKNOWN,evidence:se.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:te.UNKNOWN,evidence:se.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],a);if(!u)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.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:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],a);if(!p)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.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=te.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=te.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=te.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:se.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=qg(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(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:f},d);if(h.evidence!==se.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=uH(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=BigInt(Math.floor(Date.now()/1e3)+Number(l)),b=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,w=b?`0x${jg.swapExactETHForTokens}`+fn(g)+fn(128)+Qa(a)+fn(y)+fn(f.length)+f.map(Qa).join(""):`0x${jg.swapExactTokensForTokens}`+fn(s)+fn(g)+fn(160)+Qa(a)+fn(y)+fn(f.length)+f.map(Qa).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:w,value:b?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Hg,deadline:y.toString()},requires:b?[]:[{step:"approve",token:f[0],spender:m,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 jg,fn,Qa,Hg,$k=_(()=>{Ne();Vo();jg={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},fn=e=>BigInt(e).toString(16).padStart(64,"0"),Qa=e=>e.slice(2).toLowerCase().padStart(64,"0");Hg=100});function pH(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Vg)throw new Error(`slippageBps ${n} exceeds the ${Vg} 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 zg(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Uk(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${Bk.quoteExactInputSingle}`+Za(s)+Za(a)+Jo(c)+Jo(l)+Jo(0),p=await J(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:s,tokenOut:a,amountIn:c},l){let u=await Promise.all(dH.map(async p=>{let m=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},l);return{fee:p,amountOut:m?m.toString():null,out:m}})),d=null;for(let p of u)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:u.map(({fee:p,amountOut:m})=>({fee:p,amountOut:m}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let l=zg(c.scanner,"quoter");if(!l)return{chainId:t,evidence:se.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!Dk.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:s,amountIn:a},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:se.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:se.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let l=zg(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(v=>String(v).toLowerCase()),d=null;!a&&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:te.UNKNOWN,evidence:se.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=a||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(f&&p===String(f).toLowerCase())return{chainId:t,token:i,verdict:te.UNKNOWN,evidence:se.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:te.UNKNOWN,evidence:se.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:s},c);if(!h.best){let v=u.find(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:s},c);if(k.best){let A=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c);if(A.best){let E=A.best.amountOut,I=Number(E*10000n/BigInt(s)),N=te.PASS,T="round trip vs dollar book completes with expected fee/impact loss";return I<5e3?(N=te.FAIL,T=`round trip vs dollar book returns only ${(I/100).toFixed(2)}% -- punitive tax or no real liquidity`):I<9e3&&(N=te.CAUTION,T=`round trip vs dollar book returns ${(I/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:N,reason:T,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:I,buyFee:k.best.fee,sellFee:A.best.fee,evidence:se.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:l,tokenIn:i,tokenOut:f,amountIn:h.best.amountOut},c);if(!g.best){let v=u.find(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:s},c),A=k.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c):{best:null};if(k.best&&A.best){let E=A.best.amountOut,I=Number(E*10000n/BigInt(s)),N=te.PASS,T="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return I<5e3?(N=te.FAIL,T=`dollar-book round trip returns only ${(I/100).toFixed(2)}%`):I<9e3&&(N=te.CAUTION,T=`dollar-book round trip returns ${(I/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:N,reason:T,amountIn:String(s),bought:k.best.amountOut.toString(),returned:E.toString(),retentionBps:I,buyFee:k.best.fee,sellFee:A.best.fee,evidence:se.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:te.FAIL,evidence:se.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 y=g.best.amountOut,b=Number(y*10000n/BigInt(s)),w=te.PASS,S="round trip completes with expected fee/impact loss";return b<5e3?(w=te.FAIL,S=`round trip returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(w=te.CAUTION,S=`round trip returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:w,reason:S,amountIn:String(s),bought:h.best.amountOut.toString(),returned:y.toString(),retentionBps:b,buyFee:h.best.fee,sellFee:g.best.fee,evidence:se.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:l=50,fee:u},d={}){let p=zg(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(!Dk.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(m.evidence!==se.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=pH(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(),y=`0x${Bk.exactInputSingle}`+Za(i)+Za(s)+Jo(f)+Za(c)+Jo(a)+Jo(h)+Jo(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:y,value:g?String(a):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:Vg,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,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."}}}}var dH,Bk,Jo,Za,Dk,Vg,Fk=_(()=>{Ne();Vo();dH=[100,500,3e3,1e4],Bk={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Jo=e=>BigInt(e).toString(16).padStart(64,"0"),Za=e=>e.slice(2).toLowerCase().padStart(64,"0"),Dk=/^0x[0-9a-fA-F]{40}$/,Vg=100});function qk(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function jk(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 fH(e){let{chainId:t}=e;async function n(r,o,i){return J(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Aa(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:se.LIVE}},async nativeBalance(r,o={}){let i=await qo(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:se.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await ka({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:se.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:se.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([n(r,hd.decimals,o).catch(()=>null),n(r,hd.symbol,o).catch(()=>null),n(r,hd.name,o).catch(()=>null),n(r,hd.totalSupply,o).catch(()=>null)]),l=qk(i?.result??i),u=l!==null||s?.result||a?.result,d={chainId:t,address:r,decimals:l===null?null:Number(l),symbol:jk(s?.result??s),name:jk(a?.result??a),totalSupply:(qk(c?.result??c)??null)?.toString()??null,evidence:u?se.LIVE:se.UNKNOWN};return u||(d.warning="no ERC-20 metadata returned -- may not be a token contract"),d},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:se.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await jn(r,o).catch(()=>null),c=(s?.pairs||s?.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=ih(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:sx(r,l),evidence:l.length?se.LIVE:se.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let p=r;p<=o;p+=a){let m=Math.min(p+a-1,o);u.push([p,m])}let d=await Ge(u,4,async([p,m])=>{let f={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${m.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let h=await J(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));return{start:p,end:m,res:h}});for(let{start:p,end:m,res:f}of d){if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[p,m],error:f.error,evidence:se.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:se.LIVE}},async scoreRisk(r,o={}){let i=[],s=te.PASS,a=u=>{let d={[te.PASS]:0,[te.CAUTION]:1,[te.UNKNOWN]:2,[te.FAIL]:3};d[u]>d[s]&&(s=u)},[c,l]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==se.LIVE?(i.push({check:"erc20-metadata",result:te.UNKNOWN,detail:c.warning}),a(te.UNKNOWN)):i.push({check:"erc20-metadata",result:te.PASS,detail:`${c.symbol} / ${c.decimals}d`}),l.evidence===se.UNAVAILABLE)i.push({check:"liquidity",result:te.UNKNOWN,detail:l.reason}),a(te.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:te.FAIL,detail:"no pool with liquidity found"}),a(te.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:te.CAUTION,detail:`top pool only $${d}`}),a(te.CAUTION)):i.push({check:"liquidity",result:te.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:te.CAUTION,detail:"pool under 24h old"}),a(te.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:te.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}),a(u.verdict)}else i.push({check:"sellability",result:te.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."}),a(te.UNKNOWN);return{chainId:t,token:r,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Wg(e){let n={...fH(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Uk({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await n.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Mk({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(n))o[i]=s.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 hd,Hk=_(()=>{Ne();nr();q();Vo();$k();Fk();sh();hd={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});var Kr,zk=_(()=>{Kr=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}}]}])});var Gg={};lt(Gg,{CHAIN_CONFIGS:()=>Kr,registerBuiltinScanners:()=>gd,registerCustomChain:()=>mH});function gd(){return Kr.map(e=>Lh(Wg(e)))}function mH(e){return Lh(Wg(e))}var ts=_(()=>{Hk();Vo();zk()});var Gk={};lt(Gk,{clearProvidersForTest:()=>wH,getProvider:()=>rs,listProviders:()=>ec,registerProvider:()=>P});function Wk(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Wk(t);return Object.freeze(e)}function P(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(Vk&&Kg.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return ns.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),ns.get(t)}function rs(e){return ns.get(e)||null}function ec({venue:e,op:t}={}){let n=[...ns.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function wH(){ns.clear()}function SH(){Kg.clear();for(let[e,t]of ns)Kg.add(e),Wk(t);Vk=!0}var ns,hH,gH,yH,Yg,bH,Kg,Vk,Xg=_(()=>{Ui();Hi();Og();Xo();ts();ns=new Map,hH=Object.keys(St).map(Number),gH=Object.keys(Gt).map(Number),yH=Object.keys(Yi).map(Number),Yg=Kr.map(e=>e.chainId),bH=[...new Set(Object.values(Wa))],Kg=new Set,Vk=!1;P({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});P({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, user vault equities, and HLP tracking."});P({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});P({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});P({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});P({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});P({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});P({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});P({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});P({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});P({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});P({id:"bitcoin-mint-funding",venue:"onchain-mint",chainIds:[],auth:"none",ops:["health","annotateOutpoints","selectFundingInputs","liveFeeRate","planInscriptionFunding"],execution:"read",baseEnv:[],description:"Bitcoin/Ordinals mint funding safety. btcUtxos returns every UTXO an address owns and prepareOrdinalsMint validates PSBT structure but never checks whether an input holds an inscription \u2014 this is the missing step between them. Classifies outpoints against an ordinals index and EXCLUDES before selecting, so an inscription is never spent as fee-paying change and burned. An unreachable index degrades to 'nothing is provably safe' rather than 'everything looks clean'. Prices fees from the marginal rate of a projected block, and refuses an inscription too heavy to relay before any UTXO is touched."});P({id:"solana-mint-submit",venue:"onchain-mint",chainIds:[],auth:"none",ops:["health","freshBlockhash","deriveComputeUnitPrice","planMintFee","measureComputeUnits","constraints","planRpcEnvelope","planBundleEnvelope","planRetryEnvelope","bundleStatus"],execution:"read",baseEnv:[],description:"Solana mint submission adapter. Prepare-only: builds sendTransaction and Jito sendBundle requests for already-signed bytes and never broadcasts, because solanaRpc refuses every send* method by design. Derives the compute-unit price from live getRecentPrioritizationFees samples rather than any hardcoded figure, pins blockhash fetches to 'confirmed' (the 'finalized' default silently burns ~21% of the ~60s window), and refuses a re-signed retry \u2014 Solana has no nonce, so a re-signed transaction can land alongside the original and mint twice."});P({id:"mint-race",venue:"onchain-mint",chainIds:[1,10,56,137,8453,42161,81457,7777777],auth:"none",ops:["health","probeOpen","measureLatency","inclusionStrategy","raceIntel"],execution:"read",baseEnv:[],description:"Mint race intelligence: probe every sale-state flag in one concurrent round trip instead of five sequential ones, measure RPC round-trip latency against a contested-mint threshold, and classify whether a chain's inclusion is won by priority fee (builder auction) or by raw latency (centralized sequencer). Read-only: never prepares, signs, or broadcasts."});P({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen","evaluateTrigger"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});P({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});P({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])P({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});P({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});P({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Yg,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Kr.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});P({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});P({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});P({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});P({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});P({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});P({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API quote + unsigned Solana swap prepare, routed through `oracle route swap solana`"});P({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});P({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});P({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});P({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});P({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});P({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});P({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});P({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair","latestTokenProfiles","communityTakeovers","latestTokenBoosts","topTokenBoosts","tokenPairs","batchTokens"],execution:"read-only",baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener keyless read-only token profiles, community takeovers, boosts, and token/pair discovery"});P({id:"bubblemaps",venue:"token-intelligence",chainIds:[1,56,137,999,4663,8453,42161,43114],auth:"apiKey",ops:["health","chains","search","metadata","holders","metrics","map"],execution:"read-only",baseEnv:["BUBBLEMAPS_API_KEY"],description:"Official Bubblemaps Data API v0 token-holder maps, clusters, concentration metrics, and source-backed interactive artifacts."});P({id:"uniswap-v3",venue:"dex",chainIds:hH,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});P({id:"lp-exit",venue:"dex",chainIds:yH,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});P({id:"lp-liquidity-ranker",venue:"dex",chainIds:Yg,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});P({id:"lp-destination-discovery",venue:"dex",chainIds:Yg,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});P({id:"uniswap-v4",venue:"dex",chainIds:gH,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."});P({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."});P({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."});P({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});P({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});P({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});P({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});P({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});P({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});P({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});P({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});P({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});P({id:"opensea-nft",venue:"nft",chainIds:bH,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});P({id:"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."});P({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."});P({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."});P({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});P({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});P({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});P({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});P({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});P({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});P({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});P({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});P({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});P({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});P({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});P({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});P({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});P({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});P({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});P({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});P({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Address state exposes transaction counts; per-asset sums can be absent for unconfidential multi-asset addresses and are blinded for confidential addresses."});P({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});P({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});P({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});P({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});P({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});P({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, type-specific 0x1::coin::balance views, and legacy CoinStore enumeration. Generic enumeration does not cover newer Fungible Asset stores. Read-only; the transaction submit door is never called."});P({id:"canton-scan",venue:"canton",chainIds:[],auth:"none",ops:["health","guide","dso","party","holdings","rounds"],execution:"read-only",localSignerSurfaces:[],baseEnv:["CANTON_SCAN_URL","CANTON_NETWORK","CANTON_MIGRATION_ID"],description:"Canton Network Scan reads for Canton Coin (CC / Amulet) plus static onboarding steps. Not EVM: no chainId, no JSON-RPC, no ERC-20, no Uniswap. Scan sees CC and DSO/governance only. Quote/prepare/sign stay unimplemented."});P({id:"near-rpc",venue:"near",chainIds:[],auth:"none",ops:["health","guide","account","ftBalance","tx"],execution:"read-only",localSignerSurfaces:[],baseEnv:["NEAR_RPC_URL","NEAR_TESTNET_RPC_URL","NEAR_NETWORK"],description:"NEAR Protocol reads over public JSON-RPC: node health, account NEAR balance/storage, NEP-141 token balance (ft_balance_of + ft_metadata), and transaction status by hash + sender. Not EVM: named accounts, yoctoNEAR units, NEP-141 not ERC-20. Only status/query/tx leave the module; send_tx and broadcast_tx_* are refused before any network call. Quote/prepare/sign stay unimplemented."});P({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});P({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});P({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});P({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});P({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});P({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});P({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});P({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});P({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});P({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});P({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});P({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});P({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});P({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});P({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});P({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});P({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});P({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});P({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});P({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});P({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});P({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});P({id:"solana-token-risk",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",baseEnv:[],description:"GoPlus official Solana token security: mint/freeze authority, transfer hooks, metadata mutability, holder concentration (keyless read-only)"});P({id:"robinhood-wallet-history",venue:"explorer",chainIds:[4663],auth:"none",ops:["health","transactions","tokenBalances","history"],execution:"read-only",baseEnv:[],description:"Robinhood Chain (4663) wallet transaction history and token balances via the official Blockscout explorer (keyless read-only)"});P({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});P({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});P({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});P({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});P({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});P({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});P({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});P({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});P({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});P({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});P({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});P({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});P({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});P({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});P({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});P({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});P({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});P({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});P({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});P({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});P({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});P({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});P({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});P({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});P({id:"launch-radar",venue:"launch-radar",chainIds:[],auth:"none",ops:["health","status","snapshot","candidates","rpcHealth","evaluateStrategy"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_CONFIG_DIR","LAUNCH_RADAR_STORE_PATH"],description:"Read-only Launch Radar data plane: durable shadow-cycle status/snapshot from local disk, plus pure candidate normalization, RPC-sample ranking, and strategy-policy evaluation over caller-supplied inputs. Shadow-only, unfunded, no signer, no broadcast."});P({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});P({id:"news-rss",venue:"oracle-news",chainIds:[],auth:"none",ops:["health","latest","search"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Curated official crypto news wires (CoinDesk, The Block, Decrypt, Blockworks, Bankless, DL News, Hyperliquid blog) parsed from RSS/Atom with no npm dependency. Curated roster, NOT a firehose: feed URLs are fixed and SSRF-guarded, and every response grades each feed ok/degraded/unavailable so a dead wire never reads as no news. Items cap at 200 with complete:false and rowsOmitted."});P({id:"social-farcaster",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","channel","search","user"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Keyless Farcaster read through the public Warpcast API (api.farcaster.xyz). Probed live: Neynar free and the Neynar hub both answer 402, so the Warpcast public endpoints are used. No keyless channel timeline exists, so channel is a channel-scoped search. Unauthenticated endpoint with an undocumented rate limit; failures return unavailable with zero rows, never a quiet feed."});P({id:"social-x-public",venue:"oracle-social",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"search",type:"bearerToken",env:"ORACLE_X_BEARER_TOKEN"},ops:["health","search"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_X_BEARER_TOKEN"],description:"Capability-honest X reader. X has no keyless read tier and this never scrapes: without ORACLE_X_BEARER_TOKEN every op returns ok:false with the unset reason and makes NO network call. With a token it calls /2/tweets/search/recent. The token is read only from the caller-supplied env object, never from disk, and never when allowAmbientCredentials is false."});P({id:"news-digest",venue:"oracle-news",chainIds:[],auth:"none",ops:["health","latest"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Cross-plane news digest: fans out to news-rss, social-farcaster, and social-x-public, dedupes by normalized URL, filters by entity match, sorts by publishedAt desc, and reports per-source ok/degraded/unavailable. A blind source is reported as unavailable, never as an absence of news; when every plane is blind the digest returns ok:false."});P({id:"onchain-investigator",venue:"oracle-intel",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"wallet",optInField:"includeOpenSea",type:"apiKey",env:"OPENSEA_API_KEY"},ops:["health","capabilities","wallet","analyze","nftOverlap"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRONGRID_API_KEY","TRON_PRO_API_KEY","TONCENTER_API_KEY","TON_API_KEY","APTOS_API_KEY","OPENSEA_API_KEY"],allowCallerOptions:!1,opPolicies:{health:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},capabilities:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},wallet:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},analyze:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},nftOverlap:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1}},description:"Bounded, report-only on-chain evidence collection through fixed family/network endpoints, literal-opt-in one-page OpenSea v2 enrichment, and deterministic offline coordination/NFT-overlap analysis. Optional ambient keys only raise trusted-provider rate limits. Wallet addresses, snapshots, and evidence reports are sensitive and never cacheable. OpenSea reads only OPENSEA_API_KEY after opt-in and has no inventory cursor. No caller URL, RPC, transport, signer, prepare, broadcast, scam claim, or identity claim surface."});SH()});var Xk={};lt(Xk,{READ_ONLY_DATA_OPS:()=>AH,STATE_CREATING_DATA_OPS:()=>xH,classifyDataOp:()=>os,isPrepareDataOp:()=>kH,isReadOnlyDataOp:()=>IH,isStateCreatingDataOp:()=>_H});function kH(e){return String(e||"").toLowerCase().startsWith("prepare")}function os(e){let t=String(e||"").trim().toLowerCase();return t?vH.has(t)?"state":EH.has(t)?"read":"unknown":"unknown"}function IH(e){return os(e)==="read"}function _H(e){return os(e)!=="read"}var Kk,Yk,vH,EH,xH,AH,Jg=_(()=>{Kk=["approveSpender","arm","armFill","armPayment","buildNative","cancelIntent","cancelListing","cancelOrder","createIntent","createListing","createOffer","createOrder","createTrigger","evaluateTrigger","lock","loop","prepare","prepareAgentURIUpdate","prepareBracket","prepareBrokerBuy","prepareBuilderApproval","prepareBuy","prepareCancel","prepareClockIn","prepareDelegate","prepareDeploy","prepareIdentityRegistration","prepareIsolatedMargin","prepareLeverage","prepareList","prepareMint","prepareOrder","preparePurchase","prepareRemove","prepareSell","prepareSettlement","prepareSpecificBuy","prepareStakeDeposit","prepareStakeWithdraw","prepareSwap","prepareTransfer","prepareUnwrap","prepareVault","registerPack","revokePack"],Yk=["account","accountNfts","accountPnl","accountState","activeProposals","activity","address","addressInfo","allMids","analyze","annotateOutpoints","apy","apyAll","apyBreakdown","apyIndividual","assetInfo","assetProof","assetsByOwner","auction","balances","basis","batchTokens","bestListing","bestListings","bestOffer","blockHeight","blockInfo","blockNumber","blockStats","blocks","book","brokerDesk","builderProfit","bundleStatus","call","candidates","candleSnapshot","capabilities","chainId","chainParameters","chains","channel","checkOpen","clearinghouse","clockInStatus","coin","coinBalances","collection","collectionFloors","collectionStat","collectionStats","communityTakeovers","constraints","dailyStats","decode","delegations","delegatorSummary","denomTrace","depeg","deriveComputeUnitPrice","details","dexVolumes","difficulty","discover","dso","erc20Allowance","erc20Balance","ethUsdc","eval","evaluateStrategy","events","exploitFeed","feedDirectory","fees","finalityProviders","floor","floorListings","freshBlockhash","frontendOpenOrders","ftBalance","funding","fundingAll","fundingHistory","fundingSpread","gallery","gate","getBalance","goplus","governors","guide","hashrate","health","healthAll","history","holders","holdings","inclusionStrategy","info","inscriptionChildren","inscriptionInfo","inscriptions","inspect","inspectHook","inspectIdentity","intent","inventory","item","jettonBalances","keywordMentions","l1BlockNumber","l2Book","latest","latestBlockhash","latestPrice","latestPrices","latestTokenBoosts","latestTokenProfiles","leaderboards","legs","liquidationLadder","list","listIntents","listListings","listNative","listPacks","listings","liveFeeRate","lstList","map","markPrice","markPx","marketReserves","markets","marketsInfo","match","measureLatency","meta","metaAndAssetCtxs","metadata","metrics","midpoint","narratives","networkInfo","networks","nftOverlap","nodeCountries","nodeRankings","normalize","ohlcv","openInterest","openOrders","openapi","oracleDeviation","oraclePx","ordBlockInfo","order","orderStatus","orderbook","outcomeMeta","overview","pair","party","plan","planBundleEnvelope","planInscriptionFunding","planMintFee","measureComputeUnits","planRetryEnvelope","planRpcEnvelope","pnl","pool","poolSearch","poolShare","poolStats","pools","portfolio","position","positions","poxCycles","preflight","price","priceGas","priceStats","prices","pricesBySymbol","probeOpen","proposal","proposals","protocols","qualify","quote","quoteBrokerBuy","quotePath","quoteSell","quoteSpecificBuy","raceIntel","rank","read","recentBundles","recentTrades","reserves","resources","rewardStats","rewards","rounds","route","rpcHealth","runeBalances","runeInfo","satInfo","scan","scanAllMarkets","scanAllMarketsArb","scanBrokerLoot","scanCollection","scanCrossVenueArb","score","search","searchAssets","see","selectFundingInputs","simulate","smartAccounts","snapshot","spaces","spot","spotBalance","spotMeta","spotPx","spread","stablecoins","stackingInfo","statistics","stats","status","strategies","strategyMetrics","suggestedFees","summaries","swapQuote","tallyProposals","ticker","tickers","time","tipFloor","tipHeight","token","tokenAccounts","tokenBalances","tokenList","tokenListings","tokenPairs","tokens","topTokenBoosts","tracker","trades","traitSnipe","transactionReceipt","transactions","trc20Balances","trc20Transfers","trendingCas","trendingTokens","tvl","tx","user","userEquities","userFills","userState","utxos","validatorDetail","validators","valueGraph","vaultDetail","vaultEquity","vaults","venues","verify","verifyOrder","voterStatus","votes","votingPower","wallet","walletContents","watch","withdrawable","yields"],vH=new Set(Kk.map(e=>e.toLowerCase())),EH=new Set(Yk.map(e=>e.toLowerCase())),xH=Object.freeze([...Kk]),AH=Object.freeze([...Yk])});function yd(e={}){return e.execution==="unavailable"||!!e.deprecated}var Pde,Jk=_(()=>{Pde=Object.freeze(["live","needs_key","deprecated","soft_fail","hard_down"])});import{types as is}from"node:util";function qt(e){if(!e||typeof e!="object"||is.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Nt(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&is.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function pr(e,t,n="provider response",r=null,o=0){if(typeof t!="string"||t.length===0)return e;if(o>64)throw new Error(`${n} exceeds the credential guard nesting bound`);let i=r??{nodes:0,active:new Set};if(i.nodes+=1,i.nodes>2e5)throw new Error(`${n} exceeds the credential guard node bound`);if(e==null)return e;if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error(`${n} reflected an attached credential`);return e}if(!e||typeof e!="object"||is.isProxy(e)||i.active.has(e))throw new Error(`${n} is not credential-guardable own-data JSON`);i.active.add(e);try{if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){let a=Object.getOwnPropertyDescriptor(e,String(s));if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);pr(a.value,t,n,i,o+1)}return e}if(!qt(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let s of Object.keys(e)){if(s.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,s);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);pr(a.value,t,n,i,o+1)}return e}finally{i.active.delete(e)}}function Fe(e,t="provider response",n=0){if(n>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(is.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=Fe(s.value,t,n+1)}return o}if(!qt(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Fe(i.value,t,n+1)}return r}function ss(e,t){let n=t&&typeof t=="object"&&!is.isProxy(t)?t:null,r=n?Object.getOwnPropertyDescriptor(n,"status"):null,o=r&&Object.hasOwn(r,"value")&&Number.isInteger(r.value)&&r.value>=400&&r.value<=599?r.value:null,i=a=>{if(!n)return;let c=Object.getOwnPropertyDescriptor(n,a);return c&&Object.hasOwn(c,"value")?c.value:void 0},s=i("oversize")===!0?"provider-response-too-large":i("oracleTimeout")===!0||i("name")==="AbortError"||i("name")==="TimeoutError"?"provider-timeout":null;return(o!==null||s!==null)&&Object.defineProperty(e,Qk,{value:Object.freeze({status:o,code:s}),enumerable:!1,configurable:!1,writable:!1}),e}function Zk(e){if(!e||typeof e!="object"||is.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,Qk);if(!t||!Object.hasOwn(t,"value")||!t.value||typeof t.value!="object")return null;let n=Number.isInteger(t.value.status)&&t.value.status>=400&&t.value.status<=599?t.value.status:null,r=OH.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var Qk,OH,mn=_(()=>{Qk=Symbol("oracle.provider-failure-metadata"),OH=new Set(["provider-response-too-large","provider-timeout"])});function NH({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"?Zg:Qg}async function Ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=NH(t);return Fe(await x(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function eI(e={}){let t=await Ce({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function _n(e={}){return Ce({type:"allMids"},e)}async function as(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return Ce({type:"l2Book",coin:String(e)},t)}async function tc(e={}){return Ce({type:"outcomeMeta"},e)}async function bd(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return Ce({type:"spotClearinghouseState",user:e},t)}async function wd(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Ce({type:"userFills",user:e},t)}async function tI(e={}){return Ce({type:"meta"},e)}async function jt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Ce(t,e)}async function Sd({coin:e,interval:t="1h",startTime:n,endTime:r},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:n??Date.now()-24*3600*1e3,endTime:r??Date.now()}};return Ce(i,o)}async function nI({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return Ce({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function rI(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return Ce({type:"openOrders",user:e},t)}async function oI(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return Ce({type:"frontendOpenOrders",user:e},t)}async function cs(e,t={}){if(!e)throw new Error("hlUserState requires user");return Ce({type:"clearinghouseState",user:e},t)}async function vd(e={}){return Ce({type:"spotMeta"},e)}var Qg,Zg,Xt=_(()=>{q();mn();Qg="https://api.hyperliquid.xyz/info",Zg="https://api.hyperliquid-testnet.xyz/info"});function ey(e,t){let n=String(e||"").trim();if(!CH.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function iI(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function sI(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 PH(e){return[...e].sort((t,n)=>(iI(n.tvl)??-1)-(iI(t.tvl)??-1))}function ty(e){return e.hlInfo||Ce}function ny(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function ry(e={},t={}){let n=await ty(t)({type:"vaultSummaries"},t),r=PH((Array.isArray(n)?n:[]).map(sI));return ny({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Ed(e={},t={}){let r={type:"vaultDetails",vaultAddress:ey(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=ey(e.user,"user"));let o=await ty(t)(r,t);return ny({provider:"hl-vaults",vault:sI(o||{}),raw:o})}async function rc(e={},t={}){let n=ey(e.user||e.address,"user"),r=await ty(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 ny({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function oy(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Ed({...e,vaultAddress:nc},t);if(n==="summaries")return ry(e,t);if(n==="details")return Ed(e,t);if(n==="mine")return rc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function aI(e={}){try{let t=await oy({mode:"hlp"},e);return{ok:t.vault.vaultAddress===nc&&!!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}}}var CH,nc,xd=_(()=>{Xt();CH=/^0x[0-9a-fA-F]{40}$/,nc="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"});import{AbiCoder as LH}from"ethers";function oc(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 ic(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 Qo(e,t){return e.length?MH.encode(e,t):"0x"}function fr(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 $H(e,t=0){let n=fr(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Yr(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:iy});let r=await J(iy,"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 Xr(e){return{provider:"hl-precompiles",chainId:iy,...sy,...e}}async function Ad(e={}){let t=await Yr(yt.l1BlockNumber,"0x",e);return Xr({op:"l1BlockNumber",precompile:yt.l1BlockNumber,l1BlockNumber:fr(t).toString(),raw:t})}async function ay(e={},t={}){let n=ic(e.index??e.assetId??0,"index",32),r=await Yr(yt.markPx,Qo(["uint32"],[n]),t);return Xr({op:"markPx",precompile:yt.markPx,index:n,markPx:fr(r).toString(),raw:r})}async function cy(e={},t={}){let n=ic(e.index??e.assetId??0,"index",32),r=await Yr(yt.oraclePx,Qo(["uint32"],[n]),t);return Xr({op:"oraclePx",precompile:yt.oraclePx,index:n,oraclePx:fr(r).toString(),raw:r})}async function ly(e={},t={}){let n=ic(e.index??e.assetId??0,"index",32),r=await Yr(yt.spotPx,Qo(["uint32"],[n]),t);return Xr({op:"spotPx",precompile:yt.spotPx,index:n,spotPx:fr(r).toString(),raw:r})}async function uy(e={},t={}){let n=oc(e.user,"user"),r=ic(e.perp??e.assetId??0,"perp",16),o=await Yr(yt.position,Qo(["address","uint16"],[n,r]),t);return Xr({op:"position",precompile:yt.position,user:n,perp:r,szi:$H(o,0),raw:o})}async function dy(e={},t={}){let n=oc(e.user,"user"),r=ic(e.token??0,"token",64),o=await Yr(yt.spotBalance,Qo(["address","uint64"],[n,r]),t);return Xr({op:"spotBalance",precompile:yt.spotBalance,user:n,token:r,total:fr(o,0).toString(),hold:fr(o,1).toString(),raw:o})}async function py(e={},t={}){let n=oc(e.user,"user"),r=oc(e.vaultAddress??e.vault??nc,"vault"),o=await Yr(yt.vaultEquity,Qo(["address","address"],[n,r]),t);return Xr({op:"vaultEquity",precompile:yt.vaultEquity,user:n,vaultAddress:r,hlp:r===nc,equity:fr(o,0).toString(),raw:o})}async function fy(e={},t={}){let n=oc(e.user,"user"),r=await Yr(yt.withdrawable,Qo(["address"],[n]),t);return Xr({op:"withdrawable",precompile:yt.withdrawable,user:n,withdrawable:fr(r).toString(),raw:r})}async function cI(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return Ad(t);if(n==="markPx")return ay(e,t);if(n==="oraclePx")return cy(e,t);if(n==="spotPx")return ly(e,t);if(n==="position")return uy(e,t);if(n==="spotBalance")return dy(e,t);if(n==="vaultEquity"||n==="hlp")return py(e,t);if(n==="withdrawable")return fy(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function lI(e={}){try{let t=await Ad(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...sy,l1BlockNumber:t.l1BlockNumber,precompiles:yt}}catch(t){return{ok:!1,provider:"hl-precompiles",...sy,error:String(t?.message||t).slice(0,160)}}}var iy,yt,sy,MH,uI=_(()=>{Ne();xd();iy=999,yt=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),sy=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),MH=LH.defaultAbiCoder()});function dI(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Id(e={},t,n){let r=String(t||""),o=dI(e);if(o){let s=sc(o[r]);if(s==null)throw new Error(`${n}: held spot required for ${r}`);return s}let i=sc(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function _d(e={},t=[],n){let r=dI(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(sc(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&sc(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(sc(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}function sc(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=my?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>kd.length||t.length===kd.length&&t>kd||t===kd&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=my?r:null}var my,kd,hy=_(()=>{my=Number.MAX_SAFE_INTEGER,kd=String(my)});async function fI(e={}){let t=Date.now();if(ac.dexs&&t-ac.at<6e4&&!e.fetchImpl)return ac.dexs;let n=await Ce({type:"perpDexs"},e);return ac={at:t,dexs:Array.isArray(n)?n:[]},ac.dexs}async function mI(e="",t={}){let n=e||"",r=Date.now(),o=pI.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await Ce({type:"metaAndAssetCtxs",dex:e},t):await jt(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:s,ctxs:a};return pI.set(n,c),c}function FH(e){let t=String(e??"").trim();if(!t)return t;let n=t.toLowerCase().replace(/[\s._-]+/g,"");return UH[n]??t}function Qr(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=hI+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Jr(e,t){let n=gy(e),r=gy(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=hI+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 gy(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 yy(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Qr(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Jr(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:qH(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=Jr(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 p=FH(l),m=await fI(t),f=m.findIndex(v=>v&&v.name===p);if(f<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:h,ctxs:g}=await mI(p,t),y=h.findIndex(v=>v.name===`${p}:${d}`);if(y<0)throw new Error(`hl-assets: ${n} not in dex ${p} meta`);let b=h[y];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let w=DH+f*1e4+y,S=g[y]||{};return{kind:"hip3",coin:b.name||n,assetId:w,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:p,dexName:m[f]?.fullName||p,dexIndex:f,indexInMeta:y,markPx:S.markPx??null}}let{universe:r,ctxs:o}=await mI("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await fI(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 yy({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=r[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:c.markPx??null}}function qH(e,t){let n=gy(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var hI,DH,ac,pI,UH,Od=_(()=>{Xt();hI=1e8,DH=1e5,ac={at:0,dexs:null},pI=new Map;UH=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});function ut(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 hn(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Zo(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=ut(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 gn(e,t="amount"){let n=Zo(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function rt(e,t,n="amount"){let r=ut(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,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((s||"0")+a.padEnd(t,"0"));return o?-c:c}var ls=_(()=>{});function WH(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 gI(e,t){let n=ut(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 zn(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=>zn(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)}:${zn(e[r],t)}`).join(",")}}`}function GH(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)||zn(n,"declared order type")!==zn({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(zn(n,"declared order type")!==zn({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||zn(n,"declared order type")!==zn({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 KH(e,t,n){let r=gI(e.s,"signed size"),o=gI(e.p,"signed price"),i=r.decimals+o.decimals,s=r.raw*o.raw,a=rt(t.notionalUsd,i,"hl: notionalUsd");if(a<=0n||s!==a)throw new Error("hl: signed notional must match");let c=rt(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>c)throw new Error("hl: notional exceeds cap")}function YH(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=Zr(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(hn(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(a=>String(a).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=Zo(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=rt(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function yI(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(ut(e.s,"hl: signed size")!==ut(t.size,"hl: size"))throw new Error("hl: signed size must match");if(ut(e.p,"hl: signed price")!==ut(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(zn(e.t,"signed order type")!==zn(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 bI(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(ut(e.s,"hl: bracket protection size")!==ut(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(ut(e.p,"hl: bracket protection price")!==ut(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(ut(i.triggerPx,"hl: triggerPx")!==ut(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function XH(e){let t=String(e||"").replace(/\/$/,"");if(!jH.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function by(e){return Qr(e)!=null}function JH(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(by(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 QH(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(s=>{if(typeof s=="string"){let[a,c]=String(s).split(":");return a===e&&Number(c)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(by(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 wI(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=Zr(n.kind,"kind",48),o=zH[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=XH(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 s=Number(n.nonce);if(!Number.isSafeInteger(s)||s<=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!==VH[r])throw new Error("hl: action type must match kind");let a=n.notionalUsd??0;if(HH.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=Zr(n.coin,"coin",64),l=n.assetId??n.assetIndex;if(!Number.isSafeInteger(l)||l<0)throw new Error("hl: assetId required");if(r==="perp-bracket"&&l>=1e8)throw new Error("hl: brackets are not supported on outcome markets");if(r==="hip4-order"||l>=1e8){let u=Qr(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(JH(c,t),QH(c,l,t),r==="hip4-order"&&!by(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");GH(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");yI(u[0],n,l);let f=1;d!=null&&bI(u[f++],n,l,d,"tp"),p!=null&&bI(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");yI(u[0],n,l)}KH(u[0],n,t),YH(n,t),a=ut(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=Zr(n.usd,"margin usd",64),d=rt(u,6,"hl: margin usd");if(Zo(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=rt(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");a=WH(f,6)}}if(r==="builder-fee-approval"){let c=Zr(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Zr(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=Zr(n.maxFeeRate,"maxFeeRate",32);if(Zr(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=rt(u.slice(0,-1),12,"hl: builder fee percent"),p=rt(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==s)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(a??n.action.wei??0),notional:String(a??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??a??0),coin:n.coin||null,submitTo:i})}var jH,HH,zH,VH,Zr,SI=_(()=>{ls();Od();jH=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),HH=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),zH=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"}),VH=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"}),Zr=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function e8(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 Nd(e,t={},n={}){let r=String(e?.kind||""),o=ZH[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()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:e8(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+s,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:a,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return wI(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 ZH,wy=_(()=>{SI();ZH=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"})});var Ny={};lt(Ny,{HL_BUILDER_ADDRESS_ENV:()=>Td,HL_BUILDER_DEFAULT_FEE_BPS:()=>t8,HL_BUILDER_FEE_ENV:()=>vy,HL_BUILDER_FEE_TIERS:()=>cc,HL_BUILDER_MAX_FEE_BPS:()=>Sy,HL_PERP_MAX_SIG_FIGS:()=>vI,HL_PERP_PRICE_DECIMALS:()=>EI,HL_SIGNATURE_CHAIN_ID:()=>Cd,MARGIN_MODE:()=>lc,ORDER_TYPES:()=>Ht,TIF:()=>uc,formatPerpPrice:()=>mr,formatPerpSize:()=>II,hlBuilderFeeBpsForKind:()=>kI,hlPerpAssetInfo:()=>eo,hlPrepareApproveAgent:()=>c8,hlPrepareBracketOrder:()=>Oy,hlPrepareBuilderApproval:()=>ky,hlPrepareCancelOrder:()=>dc,hlPreparePerpOrder:()=>to,hlPrepareUpdateIsolatedMargin:()=>_y,hlPrepareUpdateLeverage:()=>Iy,resolveBuilderFee:()=>xy});function xI(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 n8(e,t){let n=xI(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function r8(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 AI(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 kI(e="perp"){if(e==="perp"||e==="main")return cc.perp;if(e==="spot")return cc.spot;if(e==="hip3")return cc.hip3;if(e==="outcome"||e==="hip4")return cc.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function xy({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Td]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Td} must be an EVM address`);let o=Fh(e);if(!o||o!==r)return null;let i=e?.[vy],s=kI(n),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${vy} must be a positive number in 0.1 bps increments`);if(a>Sy)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${Sy} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${n}`);let c=Math.round(a*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:a,percent:`${l}%`}}}async function o8(e,t={},n={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await Ce({type:"maxBuilderFee",user:r,builder:e.disclosure.address},n));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function i8(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||zu;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Ay(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,s=""]=r.replace(/^-/,"").split(".");if(s.length<=t){let f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let a=s.slice(0,t),c=Number(s[t]),l=BigInt(i+a),u=s.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 s8(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))),s=Math.max(0,t-1-i);return Ay(r,s,n)}function mr(e,t,n={}){let r=EI-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Ay(s8(e,vI,n),r,n)}function II(e,t){let n=Ay(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 a8(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,s=r.decimals+o.decimals,a=i.toString().padStart(s+1,"0");if(s===0)return a;let c=a.slice(0,-s),l=a.slice(-s).replace(/0+$/,"");return l?`${c}.${l}`:c}async function eo(e={},t={}){let n=await yy(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,dexName:n.dexName??null,outcome:n.outcome??null,side:n.side??null}}function Ey(e,{tif:t=uc.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Ht.LIMIT:return{limit:{tif:t}};case Ht.MARKET:return{limit:{tif:uc.IOC}};case Ht.STOP_MARKET:case Ht.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:mr(n,o),tpsl:e===Ht.STOP_MARKET?"sl":"tp"}};case Ht.STOP_LIMIT:case Ht.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:mr(n,o),tpsl:e===Ht.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function ei(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Cd,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 us(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=Nd(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,U(r,{provider:e.provider||"hl-perps",kind:e.kind})}function ky(e={},t={}){let n=xy({env:t.env});if(!n)throw new Error(`hl-perps: ${Td} 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:Cd,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return us({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...ei(o,r,t)},e,t)}function c8(e={},t={}){let n=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("hl-perps: agentAddress required");let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Cd,agentAddress:n.toLowerCase(),agentName:o,nonce:r};return U({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:n.toLowerCase(),agentName:o,...ei(i,r,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function to(e={},t={}){let n=await eo(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??Ht.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=AI(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=II(e.size??e.sz,n.szDecimals),a;if(r===Ht.MARKET){let b=Number(n.markPx);if(!Number.isFinite(b)){let k=await _n(t);b=Number(k?.[n.coin]??k?.[String(n.assetId)]??NaN)}if(!Number.isFinite(b))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 S=o?b*(1+w/1e4):b*(1-w/1e4);a=mr(S,n.szDecimals,{roundDown:o});let v=Math.abs(Number(a)/b-1)*1e4;if(v>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.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");a=mr(e.price??e.limitPx,n.szDecimals)}let c=Ey(r,{tif:e.tif??(r===Ht.MARKET?uc.IOC:uc.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:a,s,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=xy({env:t.env,kind:n.kind}),p=await i8(d,e,t),m=p.exempt?null:d,f=await o8(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),y=a8(s,a);return us({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,dexName:n.dexName??null,side:o?"buy":"sell",orderType:r,price:a,size:s,reduceOnly:i,notionalUsd:y,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...ei(u,g,t)},e,t)}async function dc(e={},t={}){let n=await eo(r8(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=xI(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return us({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...ei(i,Number(e.nonce??Date.now()),t)},e,t)}async function Iy(e={},t={}){let n=await eo(e,t),r=n8(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||lc.CROSS).toLowerCase();if(o!==lc.CROSS&&o!==lc.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===lc.CROSS,leverage:r};return us({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,...ei(i,Number(e.nonce??Date.now()),t)},e,t)}async function _y(e={},t={}){let n=await eo(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=rt(o,6,"hl-perps: usd"),s=AI(e,{defaultBuy:!0}),a={type:"updateIsolatedMargin",asset:n.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return us({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:s,usd:o,...ei(a,Number(e.nonce??Date.now()),t)},e,t)}async function Oy(e={},t={}){let n=await to(e,t),r=await eo(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:mr(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:Ey(Ht.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:mr(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:Ey(Ht.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return us({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:mr(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:mr(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...ei(s,Number(e.nonce??Date.now()),t)},e,t)}var vI,EI,Cd,t8,Sy,Td,vy,cc,Ht,uc,lc,pc=_(()=>{Xt();Od();ls();oe();wy();Dh();Ra();vI=5,EI=6,Cd="0x66eee",t8=2,Sy=10,Td="ORACLE_HL_BUILDER_ADDRESS",vy="ORACLE_HL_BUILDER_FEE_BPS",cc=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Ht=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),uc=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),lc=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function _I(){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 hr(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function OI(e){let t=hr(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function l8(e,t,n=4){let r=hr(e),o=hr(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 s=10**i;return String(Math.floor(r/o*s+1e-12)/s)}function NI(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]||{},s=n[o]||{},a=String(i.name||"").trim(),c=hr(s.funding),l=hr(s.markPx??s.oraclePx),u=hr(s.openInterest)??0;!a||c==null||!(l>0)||r.push({coin:a,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:hr(s.oraclePx),openInterest:u,fundingAprPct:OI(c)})}return r}function TI(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=hr(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=OI(n),o=n>0,i={coin:e.coin,notionalUsd:hr(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?l8(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 Ty(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await jt(t),i=NI(o).filter(s=>s.funding>0&&s.openInterest>=r).sort((s,a)=>a.funding-s.funding||a.openInterest-s.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 Cy(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 jt(t),i=NI(o).find(s=>s.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return TI(i,r)}async function Py(e={},t={}){PI(e,t,"hl-delta-neutral");let n=RI(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Cy(e,t);if(r.verdict==="skip")return U({...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=Id(e,r.coin,"hl-delta-neutral");if(!CI.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(()=>(pc(),Ny)),s=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(s?.signed===!0||s?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let a=s?.localSignerEnvelope||null,c=s?.localSignerBlockedReason||null;return U({...r,prepared:!!a,surface:"hl",hedge:s,localSignerEnvelope:a,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:a?"awaiting-hl-signer":"blocked",oraclePrepared:!!a},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}function PI(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 u8(e,t,n){PI(e,t,n)}function d8(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=RI(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"&&_d(e,n,"hl-delta-neutral"),t==="live"&&!CI.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 RI(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 LI(e={},t={}){u8(e,t,"hl-delta-neutral");let n=d8(e),r=await Ty({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],s=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let a of r.candidates){if(o.size&&!o.has(a.coin))continue;let c=TI(a,s);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 Py({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:s,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(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var CI,MI=_(()=>{Xt();oe();hy();CI=/^0x[0-9a-fA-F]{40}$/});function ds(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function Ry(e){let t=String(e||"").replace(/\/$/,"");if(!f8.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function BI(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=$I(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=Ry(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let s=Number(Zo(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: accountIndex required");let a=Number(Zo(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: clientOrderIndex required");ds(n.orderType,0,"orderType"),ds(n.timeInForce,1,"timeInForce"),ds(n.reduceOnly,0,"reduceOnly"),ds(n.triggerPrice,0,"triggerPrice"),ds(n.orderExpiry,-1,"orderExpiry");let c=$I(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=gn(n.baseAmount,"lighter: baseAmount"),d=gn(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,y=u*d,b=rt(n.notionalUsd,g,"lighter: notionalUsd");if(b<=0n)throw new Error("lighter: notionalUsd required");if(y!==b)throw new Error("lighter: notionalUsd must match size and price");let w=rt(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(y>w)throw new Error("lighter: notional exceeds cap");let S=ut(n.notionalUsd,"lighter: notionalUsd");return ds(n.txType,fc,"txType"),Object.freeze({unit:"usd",value:String(S),notional:String(S),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(S)})}var f8,fc,$I,Ly=_(()=>{ls();f8=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),fc=14,$I=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e}});function m8(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 DI(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=Ry(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:m8(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??fc,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return BI(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}var UI=_(()=>{Ly()});function h8(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?jI:qI}function HI(){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 no(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function g8(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 zI(e){let t=no(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function y8(e,t,n=4){let r=no(e),o=no(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 s=10**i;return Math.floor(r/o*s+1e-12)}function FI(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function My(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 s of r){let a=FI(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of n){if(String(s.exchange||"")!=="lighter")continue;let a=FI(s.market_id);if(a==null)continue;let c=o.get(a),l=no(c?.mark_price??c?.index_price),u=no(s.rate),d=String(s.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:a,funding:u,markPx:l,openInterest:no(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:zI(u)})}return i}function VI(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=no(e.funding);if(n==null)throw new Error("lighter: funding required");let r=zI(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:no(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?y8(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 $y(e={}){let t=h8(e),n=new AbortController,r={fetchImpl:e.fetchImpl,retries:0,signal:n.signal};try{let[o,i]=await Promise.all([x(`${t}/api/v1/funding-rates`,r),x(`${t}/api/v1/orderBookDetails`,r)]);return{funding:o,books:i}}catch(o){throw n.abort(o),o}}async function WI(e={}){let{funding:t,books:n}=await $y(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:My(t,n)}}async function By(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await $y(t),i=My(r,o).filter(s=>s.funding>0).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(s=>s.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function Dy(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 $y(t),s=My(o,i).find(a=>a.symbol===n);if(!s)throw new Error(`lighter: ${n} not in Lighter funding`);return VI(s,r)}async function Uy(e={},t={}){KI(e,t,"lighter");let n=YI(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 Dy(e,t);if(o.verdict==="skip")return U({...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=Id(e,o.coin,"lighter");if(!GI.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 a=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=g8(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:fc,submitTo:`${a?jI:qI}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=DI(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return U({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}function KI(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 b8(e,t,n){KI(e,t,n)}function w8(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=YI(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"&&_d(e,n,"lighter"),t==="live"&&!GI.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let s=e.accountIndex;if(t==="live"&&(typeof s!="number"||!Number.isSafeInteger(s)||s<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:s}}function YI(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 XI(e={},t={}){b8(e,t,"lighter");let n=w8(e),r=await By({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],s=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let a of r.candidates){if(o.size&&!o.has(a.symbol)&&!o.has(a.coin))continue;let c=VI(a,s);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 Uy({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:s,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(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var qI,jI,GI,Fy=_(()=>{q();oe();UI();Ly();hy();qI="https://mainnet.zklighter.elliot.ai",jI="https://testnet.zklighter.elliot.ai";GI=/^0x[0-9a-fA-F]{40}$/});function mc(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||v8).replace(/\/$/,"")}function JI(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||E8).replace(/\/$/,"")}async function qy(e={}){return x(`${mc(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function QI(e={}){let t=await qy(e);return{ok:t!=null&&t!=="",time:t}}async function ZI({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,s])=>[i,String(s)]))});return x(`${JI(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function e_(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${mc(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function t_(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${mc(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function n_(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${mc(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function r_(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 x(`${mc(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function o_({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,s])=>[i,String(s)]))});return x(`${JI(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}var v8,E8,i_=_(()=>{q();v8="https://clob.polymarket.com",E8="https://gamma-api.polymarket.com"});import{createHash as s_}from"node:crypto";function A8(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||jy).trim()}function Pe(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 k8(e,t){return t?[...e,{commitment:t}]:e}async function gr(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=Fe(await x(A8(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!qt(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let i=Nt(o,"error");if(i)throw new Error(`solana-rpc ${e}: ${Nt(i,"message")||JSON.stringify(i)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return Nt(o,"result")}async function hc(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await gr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:ti,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function a_(e={}){try{let[t,n]=await Promise.all([gr("getHealth",[],e),hc({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:ti,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:ti,error:String(t?.message||t),exec:!1}}}async function Pd(e={},t={}){let n=Pe(e.address||e.owner,"address"),r=await gr("getBalance",k8([n],e.commitment),t);return{provider:"solana-rpc",cluster:ti,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function I8(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 gc(e={},t={}){let n=Pe(e.owner||e.address,"owner"),r=e.mint?{mint:Pe(e.mint,"mint")}:{programId:Pe(e.programId||Hy,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await gr("getTokenAccountsByOwner",[n,r,o],t),s=Array.isArray(i?.value)?i.value.map(I8):[];return{provider:"solana-rpc",cluster:ti,owner:n,filter:r,slot:i?.context?.slot??null,accounts:s,raw:i}}async function c_(e={},t={}){let n=Pe(e.address||e.account,"address"),r=Math.min(1e3,Math.max(1,Math.trunc(Number(e.limit)||20))),o={limit:r};e.before&&(o.before=String(e.before)),e.until&&(o.until=String(e.until)),e.commitment&&(o.commitment=String(e.commitment)),e.minContextSlot!=null&&(o.minContextSlot=Number(e.minContextSlot));let i=await gr("getSignaturesForAddress",[n,o],t);if(!Array.isArray(i))throw new Error("solana-rpc getSignaturesForAddress returned an invalid response");let s=i.slice(0,r);return{provider:"solana-rpc",cluster:ti,address:n,limit:r,cursor:e.before?String(e.before):null,nextCursor:s.length===r?s[s.length-1]?.signature??null:null,pageComplete:i.length<r,count:s.length,truncated:i.length>s.length,signatures:s,raw:s}}function _8(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 O8(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 s=e[o++];if(n|=(s&127)<<r,(s&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function N8(e){let t=Buffer.from(e,"base64");try{let n=O8(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return s_("sha256").update(t.subarray(r)).digest("hex")}catch{return s_("sha256").update(t).digest("hex")}}async function l_(e={},t={}){let n=_8(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await gr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:ti,ok:i.err==null,transactionHash:N8(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}var ti,jy,Hy,ni=_(()=>{q();mn();ti="mainnet-beta",jy="https://api.mainnet-beta.solana.com",Hy="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"});function On(e={}){return String(e.network||process.env.BTC_NETWORK||C8).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Rd(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):On(e)==="testnet"?Wy:Vy}function zy(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 yn(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 P8(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 u_(e,t={}){let n=`${Rd(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 yc(e,t={}){let n=`${Rd(t)}${e.startsWith("/")?e:`/${e}`}`;return Fe(await x(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function d_(e={}){try{let t=await u_("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:On(e),baseUrl:zy(Rd(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:On(e),baseUrl:zy(Rd(e)),error:zy(t?.message||t),exec:!1}}}async function p_(e={}){let t=await u_("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:On(e),tipHeight:Number(t)}}async function f_(e={}){try{let t=await yc("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:On(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:On(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ld(e={},t={}){let n=yn(e.address||e.addr,"address"),r=await yc(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),a=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:On(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function m_(e={},t={}){let n=yn(e.address||e.addr,"address"),r=await yc(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:On(t),address:n,count:o.length,totalSats:String(o.reduce((i,s)=>i+Number(s.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function h_(e={},t={}){let n=yn(e.address||e.addr,"address"),r=Math.min(25,Math.max(1,Math.trunc(Number(e.limit)||20))),o=e.cursor||e.lastSeenTxid||null;if(o!=null&&!/^[0-9a-f]{64}$/i.test(String(o)))throw new Error("bitcoin-esplora: transaction cursor must be a 64-char txid");let i=o?`/address/${n}/txs/chain/${String(o).toLowerCase()}`:`/address/${n}/txs`,s=await yc(i,t);if(!Array.isArray(s))throw new Error("bitcoin-esplora address history returned an invalid response");let a=s.slice(0,r),c=s.length>a.length,l=!c&&s.length===25?a[a.length-1]?.txid??null:null;return{provider:"bitcoin-esplora",network:On(t),address:n,limit:r,cursor:o==null?null:String(o).toLowerCase(),nextCursor:l,pageComplete:!c&&s.length<25,count:a.length,truncated:c,transactions:a,raw:a}}async function g_(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 yc(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:On(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 y_(e={},t={}){let n=P8(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:On(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}var C8,Vy,Wy,ps=_(()=>{q();mn();C8="mainnet",Vy="https://mempool.space/api",Wy="https://mempool.space/testnet/api"});function Md(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}function b_(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=Md(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,s=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=L8.includes(o)&&(i==="https:"||s)}}catch{n=!1}return Ue({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function fs(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:b_(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 w_(e={}){let t=Md(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 s=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:b_(e),signal:AbortSignal.timeout(8e3)});if(r={ok:s.status>0&&s.status<500,path:o,status:s.status},s.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 $d(e={},t={}){let n=yn(e.address||e.addr,"address"),r=Md(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 s of o)try{let a=await fs(s,t),c=M8(a);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:s}}catch(a){i=a}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function M8(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 ms(e={},t={}){let n=yn(e.address||e.addr,"address"),r=Md(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}`],s=null;for(let a of i)try{let c=await fs(a,t),l=$8(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:a}}catch(c){s=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(s?.message||s||"all indexer paths failed")}}async function S_(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||Gy,o=await fs(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function v_(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||Gy,o=Number(e.page||0),i=await fs(`${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 E_(e={},t={}){let n=t.ordinalsBase||Gy,r=e.height??await fs(`${n}/r/blockheight`,t),o=await fs(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function $8(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}))}var Gy,L8,Bd=_(()=>{ps();gt();Gy="https://ordinals.com";L8=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"]});function Ky(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function q8(e){return D8.some(t=>e.startsWith(t))||U8.has(e)}function j8(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Ky(t);return q8(n)?!1:F8.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function H8(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 Yy(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=>Yy(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(j8(c)){o.push(c);continue}o.push(...Yy(l,t+1,n,r))}let s=Object.keys(e).map(Ky).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Ky(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),H8(e)&&o.push("v/r/s"),o}function yr(e,t){let n=Yy(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 D8,U8,F8,Dd=_(()=>{D8=["unsigned","notsigned","tosign","signable"],U8=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),F8=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"])});function x_(e={}){return Te({provider:"satflow",defaultUrl:z8,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Ud(e={}){return x_(e).baseUrl}function Jy(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function V8(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Jy(e)},x_(e).trusted)}async function ro(e,{method:t="GET",body:n,opts:r={}}={}){if(!Jy(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Ud(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:V8(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await a.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return l}async function A_(e={}){if(!!!Jy(e))return{ok:!1,provider:"satflow",baseUrl:Ud(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 ro("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Ud(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:Ud(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function k_(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 ro(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function I_(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 ro(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function __(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 ro(`/item?${r}`,{opts:t})}}async function Fd(e={},t={}){let n=yn(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 ro(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function O_(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 ro(`/orders/floor?${r}`,{opts:t})}}function N_(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))W8.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}function Xy(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 Y8(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=yn(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=yn(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),s=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(s))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:s,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function T_(e={},t={}){let n=N_(e,G8);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=Xy(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let s=await ro("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),a=Xy(s)??Xy(s?.intent);if(a==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(a>o)throw new Error(`satflow: purchase price ${a} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);yr("satflow",s);let c=s?.unsignedPSBTBase64||s?.unsignedPsbtBase64||s?.unsigned_psbt||null,l=null,u=null;try{l=Y8(e,{psbt:c,priceSats:a,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return U({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:a.toString(),maxSats:o.toString(),intent:s,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 qd(e={},t={}){let n=N_(e,K8);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 ro("/intent/sell",{method:"POST",body:n,opts:t});return yr("satflow",r),U({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."})}var z8,W8,G8,K8,Qy=_(()=>{ps();gt();oe();Dd();z8="https://api.satflow.com/v1";W8=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);G8=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"]),K8=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"])});function L_(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Hd).replace(/\/$/,"")}function bc(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 M_(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>J8)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function jd(e,t){return e==null?t:!!e}function Q8(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 Z8(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 $_(e){let t=Buffer.from(e,"base64"),n=Z8(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 wc(e={},{quotedAtMs:t=Date.now(),ttlMs:n=C_}={}){let r=Pe(e.inputMint,"inputMint"),o=Pe(e.outputMint,"outputMint"),i=bc(e.inAmount,"inAmount"),s=bc(e.outAmount,"outAmount"),a=bc(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=M_(e.slippageBps??50),l=(BigInt(s)-BigInt(s)*BigInt(c)/10000n).toString();if(a!==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:s,otherAmountThreshold:a,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||C_,1e3),3e4)}}function eb({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Zy)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=$_(n),s=bc(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:s}}}function P_(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=t9.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 B_(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(`${Hd}/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(),s=Object.entries(i),a=s.filter(([p])=>P_(p)),c=[],l=s.filter(([p])=>!P_(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Hd}/program-id-to-label`,verified:a.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:s.length,verified:a.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<a.length;p+=90){let m=a.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[y,b]=m[g];h&&h.executable===!0&&e9.has(h.owner)?c.push({programId:y,label:b,owner:h.owner}):l.push({programId:y,label:b,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<a.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:`${Hd}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:s.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 D_(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await zd({inputMint:Zy,outputMint:R_,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 zd(e={},t={}){let n=Pe(e.inputMint||e.fromMint||Zy,"inputMint"),r=Pe(e.outputMint||e.toMint||R_,"outputMint"),o=bc(e.amount||e.inAmount,"amount"),i=M_(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${L_(t)}/quote`);s.searchParams.set("inputMint",n),s.searchParams.set("outputMint",r),s.searchParams.set("amount",o),s.searchParams.set("slippageBps",String(i)),s.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&s.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&s.searchParams.set("platformFeeBps",String(e.platformFeeBps));let a=await x(s.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=wc({...a,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:a,solanaGuard:c}}function n9(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function U_(e={},t={}){let n=Pe(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:wc(e.quoteResponse,t)}:await zd(e,t),o=r.quote,i=r.solanaGuard||wc(o,t);if(jd(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let s=await x(`${L_(t)}/swap`,{method:"POST",body:n9({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:jd(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:jd(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:jd(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Q8(s?.swapTransaction);$_(a),yr("jupiter",s);let c=s?.quoteResponse??s?.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=eb({userPublicKey:n,guard:i,swapTransaction:a,args:e,response:s})}catch(m){p=String(m?.message||m).slice(0,200)}return U({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:a,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:s?.lastValidBlockHeight??null,prioritizationFeeLamports:s?.prioritizationFeeLamports??null,computeUnitLimit:s?.computeUnitLimit??null,raw:s},{provider:"jupiter",kind:"jupiter-swap"})}var Hd,Zy,R_,J8,C_,e9,t9,tb=_(()=>{q();ni();oe();Dd();Hd="https://lite-api.jup.ag/swap/v1",Zy="So11111111111111111111111111111111111111112",R_="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",J8=100,C_=2e4;e9=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),t9="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"});function i9(e=80){let t=j_(e,1,500,80);return Math.min(t*8,4e3)}function j_(e,t,n,r){let o=Number(e);return Number.isFinite(o)?Math.min(n,Math.max(t,Math.trunc(o))):r}function Re(e){if(typeof e=="boolean"||e===null||e===void 0||e===""||typeof e!="number"&&typeof e!="string")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ri(e){return typeof e=="boolean"?e:null}function Tt(e,t=128){if(typeof e!="string")return null;let n=e.replace(/[\u0000-\u001f\u007f-\u009f]/gu," ").trim();return n?n.length>t?n.slice(0,t):n:null}function Y(e,t){if(e===null||typeof e!="object")return;let n=Object.getOwnPropertyDescriptor(e,t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function hs(e,t){return Array.isArray(e)?e.length>t?e.slice(0,t):e:[]}function gs(e,t){let n=Tt(e,128);return n?s9(n,t)?n.toLowerCase():n:null}function s9(e,t){if(/^0x[0-9a-fA-F]+$/.test(e))return!0;let n=typeof t=="string"?t.trim().toLowerCase():"";return n!==""&&a9.has(n)}function F_(e,t){let n=t>>>0;for(let r=0;r<e.length;r+=1){let o=e.charCodeAt(r);n=Math.imul(n^o&255,16777619)>>>0,n=Math.imul(n^o>>>8&255,16777619)>>>0}return n>>>0}function nb(e){let t=e.map(n=>`${String(n).length}:${String(n)}`).join("|");return`${F_(t,2166136261).toString(16).padStart(8,"0")}${F_(t,2654435761).toString(16).padStart(8,"0")}`}function Vd(e,t){let n=gs(t,e);return n?`n-${nb([String(e??""),n])}`:null}function c9(e,t){let n=[...new Set((t||[]).filter(r=>typeof r=="string"&&r))].sort();return n.length?`c-${nb([String(e??""),...n])}`:null}function l9(e,t,n,r,o){return`e-${nb([String(e??""),t,n,String(r??""),String(o??"")])}`}function H_(e){if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))H_(e[t]);return e}function u9({chain:e,address:t,name:n,symbol:r,decimals:o,isIndexed:i}){return{chain:Tt(e,32),address:Tt(t,128),name:Tt(n),symbol:Tt(r,32),decimals:Re(o),isIndexed:i==null?null:ri(i)}}function rb(e){let t=Y(e,"scores"),n=Y(e,"supply_stats");return{bubblemapsScore:Re(Y(t,"bubblemaps_score")),giniIndex:Re(Y(t,"gini_index")),herfindahlHirschmanIndex:Re(Y(t,"herfindahl_hirschman_index")),nakamotoCoefficient:Re(Y(t,"nakamoto_coefficient")),supplyShares:{cexs:Re(Y(n,"cexs")),dexs:Re(Y(n,"dexs")),contracts:Re(Y(n,"contracts")),freshWallets:Re(Y(n,"fresh_wallets")),top10Adjusted:Re(Y(n,"top_10_adjusted")),bundles:Re(Y(n,"bundles"))}}}function q_(e,t,n){let r=Y(t,"address"),o=Vd(e,r);if(!o)return null;let i=Y(t,"address_details"),s=Y(t,"holder_data");return{id:o,address:Tt(r,128),label:Tt(Y(i,"label")),kind:n,share:Re(Y(s,"share")),amount:Re(Y(s,"amount")),rank:Re(Y(s,"rank")),degree:Re(Y(i,"degree")),clusterId:null,flags:{isContract:ri(Y(i,"is_contract")),isCex:ri(Y(i,"is_cex")),isDex:ri(Y(i,"is_dex")),isSupernode:ri(Y(i,"is_supernode")),isPaidLabel:ri(Y(i,"is_paid_label")),isShownOnMap:Y(t,"is_shown_on_map")===void 0?!0:ri(Y(t,"is_shown_on_map"))},relations:{inward:Re(Y(i,"inward_relations")),outward:Re(Y(i,"outward_relations"))}}}function d9(e,t,n){let r=Vd(e,Y(t,"from_address")),o=Vd(e,Y(t,"to_address"));if(!r||!o||!n.has(r)||!n.has(o)||r===o)return null;let i=Y(t,"data"),s=Y(i,"token_key"),a=Tt(Y(s,"chain"),32),c=Tt(Y(s,"address"),128),l=Tt(Y(t,"rel_type"),64)||"GROUPED_TRANSFER";return{id:l9(e,r,o,l,`${a??""}:${c??""}`),source:r,target:o,type:l,value:Re(Y(i,"total_value")),count:Re(Y(i,"total_transfers")),firstAt:Re(Y(i,"first_date")),lastAt:Re(Y(i,"last_date")),token:a||c?{chain:a,address:c}:null}}function p9(e,t,n){let r=[];for(let s of hs(t,500)){let a=hs(Y(s,"holders"),500),c=[],l=new Set;for(let d of a){let p=Vd(e,d);!p||l.has(p)||!n.has(p)||(l.add(p),c.push(p))}if(!c.length)continue;let u=c9(e,c);u&&r.push({id:u,share:Re(Y(s,"share")),amount:Re(Y(s,"amount")),holderCount:Re(Y(s,"holder_count")),memberCount:c.length,members:c})}r.sort((s,a)=>(a.share??-1)-(s.share??-1)||(s.id<a.id?-1:s.id>a.id?1:0));let o=[],i=new Set;for(let s of r)i.has(s.id)||(i.add(s.id),o.push(s));for(let s of o)for(let a of s.members){let c=n.get(a);c&&c.clusterId===null&&(c.clusterId=s.id)}return o}function z_(e={}){let t=Tt(Y(e,"chain"),32),n=Tt(Y(e,"tokenAddress"),128),r=Y(e,"payload"),o=j_(Y(e,"maxNodes"),1,500,80),i=i9(o),s=Y(e,"token")||{},a=Y(r,"metadata"),c=Y(r,"nodes"),l=rb(Y(r,"metrics")),u=[],d=new Map,p=A=>{!A||d.has(A.id)||u.length>=o||(d.set(A.id,A),u.push(A))};for(let A of hs(Y(c,"top_holders"),500))p(q_(t,A,"holder"));for(let A of hs(Y(c,"magic_nodes"),500))p(q_(t,A,"magic"));let m=new Set(d.keys()),f=hs(Y(r,"relationships"),4e3),h=[],g=new Set,y=0;for(let A of f){if(h.length>=i){y+=1;continue}let E=d9(t,A,m);if(!E){y+=1;continue}g.has(E.id)||(g.add(E.id),h.push(E))}let b=p9(t,Y(r,"clusters"),d),w=Tt(Y(a,"dt_update"),64),S=Re(Y(a,"ts_update")),v=Re(Y(e,"limit")),k=u.length>=o&&hs(Y(c,"top_holders"),500).length>o;return H_({kind:o9,version:1,token:u9({chain:t,address:n,name:Y(s,"name"),symbol:Y(s,"symbol"),decimals:Y(s,"decimals"),isIndexed:Y(s,"isIndexed")}),metrics:l,nodes:u,edges:h,clusters:b,source:{provider:"bubblemaps",api:"data-api-v0",endpoint:Tt(Y(e,"endpoint"),256),updatedAt:w,updatedTs:S,fetchedAt:Tt(Y(e,"fetchedAt"),64),execution:"read-only"},coverage:{nodes:u.length,edges:h.length,clusters:b.length,maxNodes:o,maxEdges:i,requestedLimit:v,droppedEdges:y,truncated:k,interactive:u.length>0,reason:u.length>0?null:"no holders returned"}})}var o9,a9,V_=_(()=>{o9="bubble-map";a9=new Set(["eth","ethereum","bsc","poly","polygon","matic","arbi","arbitrum","avax","avalanche","base","op","optimism","ftm","fantom","cro","cronos","linea","scroll","zksync","blast","mantle","sonic","hyper","hyperevm","sei","berachain","bera"])});function bn(e,t){let n=String(e?.message??e??"unknown error");return typeof t=="string"&&t.length>=4&&(n=n.split(t).join("[redacted]")),n=n.replace(v9," ").replace(m9,"//[redacted]@").replace(h9,"[redacted]").replace(g9,"[redacted]").replace(f9,"?[redacted]").replace(y9,"[redacted]").replace(S9,"[redacted]").replace(b9,"[redacted]").replace(w9,"[redacted]"),n.trim().slice(0,200)}var f9,m9,h9,g9,y9,b9,w9,S9,v9,Wd=_(()=>{f9=/\?[^\s]*/gu,m9=/\/\/[^\s/@:]+:[^\s/@]+@/gu,h9=/\b(?:authorization|proxy-authorization)\s*[:=]\s*(?:bearer|basic|token)?\s*\S+/giu,g9=/\b(?:bearer|basic|token)\s+[A-Za-z0-9._~+/=-]{8,}/giu,y9=/\b(?:sk|pk|api|key|token|secret|auth|access|private)[-_][A-Za-z0-9._-]{8,}/giu,b9=/\b[A-Fa-f0-9]{24,}\b/gu,w9=/\b[A-Za-z0-9+/]{40,}={0,2}\b/gu,S9=/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/giu,v9=/[\u0000-\u001f\u007f]/gu});function Q_(e,t,n){let r=ge(n?.chain),o=ge(n?.address);return r&&r!==e?!0:!o||o===t?!1:A9.has(e)?!0:o.toLowerCase()!==t.toLowerCase()}function Z_(e,t){let r=(e&&typeof e=="object"&&e.env&&typeof e.env=="object"?e.env:process.env)?.[t];return typeof r=="string"?r:""}function eO(e={}){let t=typeof e.apiKey=="string"?e.apiKey:"";return pn(t||Z_(e,ib))}function T9(e={}){return Te({provider:ys,defaultUrl:E9,hosts:["api.bubblemaps.io"],url:Z_(e,I9)})}function Gd(e){let t=typeof e=="string"?e.trim().toLowerCase():"";if(!J_.has(t))throw new Error(`bubblemaps: unsupported chain "${String(e).slice(0,32)}" (supported: ${Y_.join(", ")})`);return t}function Kd(e){let t=typeof e=="string"?e.trim():"";if(!t||t.length>_9||/[\s/?#%\\]/u.test(t))throw new Error("bubblemaps: tokenAddress must be a bounded address string");if(t==="."||t==="..")throw new Error("bubblemaps: tokenAddress must be a bounded address string");return t}function tO(e){if(e==null||e==="")return x9;let t=Number(e);if(!k9.has(t))throw new Error(`bubblemaps: limit must be one of ${X_.join(", ")}`);return t}function C9(e){if(!e)throw new Error(`bubblemaps: ${ib} is not set`);return e}function ob(e){return typeof e=="boolean"?e:null}function Sc(e){if(typeof e!="number"&&typeof e!="string"||typeof e=="string"&&e.trim()==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ge(e){return typeof e!="string"||e.trim()===""?null:e}function P9(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=e.nodes;if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r.top_holders;if(!Array.isArray(o)||o.length>0&&!o.some(s=>ge(s?.address)!==null))return!1;let i=R9(e,t,n);return!(!W_(e.relationships,s=>L9(s,i,n))||!W_(e.clusters,s=>M9(s,i,n)))}function R9(e,t,n){let r=Number.isInteger(t)&&t>0?Math.min(t,500):80,o=e?.nodes,i=new Set;for(let s of["top_holders","magic_nodes"]){let a=Array.isArray(o?.[s])?o[s]:[];for(let c of a){if(i.size>=r)return i;let l=gs(ge(c?.address),n);l!==null&&i.add(l)}}return i}function W_(e,t){return Array.isArray(e)?e.length===0||e.some(t):!1}function L9(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=gs(ge(e.from_address),n),o=gs(ge(e.to_address),n);return r===null||o===null||r===o?!1:t.has(r)&&t.has(o)}function M9(e,t,n){return!e||typeof e!="object"||Array.isArray(e)||!Array.isArray(e.holders)?!1:e.holders.some(r=>{let o=gs(ge(r),n);return o!==null&&t.has(o)})}function U9(e){return Number.isInteger(e)?Math.min(Math.max(e,$9),B9):D9}async function oi(e,t,n={}){let r=C9(eO(n)),o=T9(n),i=new URLSearchParams;for(let[l,u]of Object.entries(t||{}))u!=null&&i.set(l,String(u));let s=i.toString(),a=`${o.baseUrl}${e}${s?`?${s}`:""}`,c=Ue({Accept:"application/json"},{"X-ApiKey":r},o.trusted);if(!o.trusted)throw new Error(`bubblemaps: refusing to send credentials to non-official host ${o.host}`);try{return await x(a,{method:"GET",headers:c,fetchImpl:n.fetchImpl,timeoutMs:U9(n.timeoutMs),maxResponseBytes:N9})}catch(l){throw new Error(`bubblemaps: ${bn(l,r)}`)}}async function nO(e={}){let t=eO(e);if(!t)return{ok:!1,provider:ys,configured:!1,execution:"read-only",error:`${ib} not set \u2014 get a key at https://pro.bubblemaps.io`};try{let n=await oi("/v0/chains",{},e);if(!Array.isArray(n))return{ok:!1,provider:ys,configured:!0,execution:"read-only",api:"data-api-v0",error:"bubblemaps: chains response was not a list"};let r=n.filter(o=>ge(o?.id)!==null).length;return{ok:r>0,provider:ys,configured:!0,execution:"read-only",api:"data-api-v0",chains:r}}catch(n){return{ok:!1,provider:ys,configured:!0,execution:"read-only",error:bn(n,t)}}}async function rO(e={},t={}){let n=await oi("/v0/chains",{},t);if(!Array.isArray(n))throw new Error("bubblemaps: chains response was not a list");return n.filter(r=>ge(r?.id)!==null).map(r=>{let o=ge(r?.id);return{id:o,name:ge(r?.name),supported:o===null?null:J_.has(o)}})}async function oO(e={},t={}){let n=typeof e.query=="string"?e.query.trim():"";if(n.length<2||n.length>O9)throw new Error("bubblemaps: query must be 2-128 characters");let r=await oi("/v0/tokens/search",{query:n},t);if(!Array.isArray(r))throw new Error("bubblemaps: search response was not a list");let o=r.filter(i=>ge(i?.token_key?.address)!==null);if(r.length>0&&o.length===0)throw new Error("bubblemaps: search response carried no readable token rows");return o.map(i=>({chain:ge(i?.token_key?.chain),address:ge(i?.token_key?.address),name:ge(i?.metadata?.name),symbol:ge(i?.metadata?.symbol),indexed:typeof i?.metadata?.is_indexed=="boolean"?i.metadata.is_indexed:null}))}async function iO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=await oi(`/v0/tokens/metadata/${n}/${encodeURIComponent(r)}`,{return_token_stats:e.includeStats===!0?"true":"false"},t),i=ge(o?.token_key?.chain)!==null||ge(o?.token_key?.address)!==null||ge(o?.metadata?.name)!==null||ge(o?.metadata?.symbol)!==null||typeof o?.metadata?.is_indexed=="boolean"||Sc(o?.stats?.transfers_count)!==null||ge(o?.stats?.min_date)!==null||ge(o?.stats?.max_date)!==null;if(!o||typeof o!="object"||Array.isArray(o)||!i)throw new Error("bubblemaps: metadata response carried no readable token evidence");if(Q_(n,r,o.token_key))throw new Error("bubblemaps: metadata response describes a different token");return{chain:ge(o?.token_key?.chain)??n,address:ge(o?.token_key?.address)??r,name:ge(o?.metadata?.name),symbol:ge(o?.metadata?.symbol),indexed:typeof o?.metadata?.is_indexed=="boolean"?o.metadata.is_indexed:null,stats:o?.stats?{transfersCount:Sc(o.stats.transfers_count),firstTransferAt:ge(o.stats.min_date),lastTransferAt:ge(o.stats.max_date)}:null}}async function sO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=tO(e.limit),i=await oi(`/v0/tokens/holders/${n}/${encodeURIComponent(r)}`,{limit:o,return_metadata:e.includeMetadata===!1?"false":"true"},t);if(!Array.isArray(i))throw new Error("bubblemaps: holders response was not a list");let s=i.filter(a=>ge(a?.address)!==null);if(i.length>0&&s.length===0)throw new Error("bubblemaps: holder response carried no readable holder rows");return s.slice(0,o).map(a=>({address:ge(a?.address),label:ge(a?.address_details?.label),rank:Sc(a?.holder_data?.rank),share:Sc(a?.holder_data?.share),amount:Sc(a?.holder_data?.amount),isContract:ob(a?.address_details?.is_contract),isCex:ob(a?.address_details?.is_cex),isDex:ob(a?.address_details?.is_dex)})).map(F9)}function F9(e){return Object.freeze(e)}async function aO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=await oi(`/v0/tokens/metrics/${n}/${encodeURIComponent(r)}`,{},t),i=rb(o);if(![i.bubblemapsScore,i.giniIndex,i.herfindahlHirschmanIndex,i.nakamotoCoefficient,...Object.values(i.supplyShares||{})].some(a=>a!==null))throw new Error("bubblemaps: metrics response carried no readable metric");return{chain:n,address:r,provider:ys,execution:"read-only",metrics:i}}async function cO(e={},t={}){let n=Gd(e.chain),r=Kd(e.tokenAddress),o=tO(e.limit),i=e.maxNodes===void 0?Math.min(o,80):Math.min(Math.max(1,Math.trunc(Number(e.maxNodes)||0)),500,o),s=`/v0/tokens/map/${n}/${encodeURIComponent(r)}`,a=await oi(s,{limit:o,return_nodes:"true",return_relationships:"true",return_clusters:"true",use_magic_nodes:e.magicNodes===!1?"false":"true",use_time_nodes:e.timeNodes===!1?"false":"true"},t);if(Q_(n,r,a?.token_key))throw new Error("bubblemaps: map response describes a different token");if(!P9(a,i,n))throw new Error("bubblemaps: map response carried no readable holder collection");return z_({chain:n,tokenAddress:r,payload:a,token:e.token,maxNodes:i,limit:o,endpoint:s,fetchedAt:new Date().toISOString()})}var E9,ys,Y_,X_,x9,J_,A9,k9,ib,I9,_9,O9,N9,$9,B9,D9,lO=_(()=>{q();gt();V_();Wd();E9="https://api.bubblemaps.io",ys="bubblemaps",Y_=Object.freeze(["eth","base","solana","tron","bsc","sonic","ton","avalanche","polygon","monad","hyperevm","arbitrum","robinhood"]),X_=Object.freeze([80,250,500]),x9=80,J_=new Set(Y_),A9=new Set(["solana","tron","ton"]);k9=new Set(X_),ib="BUBBLEMAPS_API_KEY",I9="BUBBLEMAPS_API_URL",_9=128,O9=128,N9=8*1024*1024;$9=1e3,B9=6e4,D9=3e4});import{getAddress as j9}from"ethers";function vc(e,t){let n=String(e??"").trim();if(!n)throw new Error(`${t} is required`);if(pO.test(n))try{return j9(n)}catch{throw new Error(`${t} is not a valid EVM address`)}return n}function Xd(e,t){let n=e?.[t];if(typeof n!="function")throw new Error(`lp-liquidity-ranker: opts.${t} must be a function`);return n}function z9(e){if(!e||typeof e!="object")throw new Error("candidate must be an object");let t=Number(e.chainId);if(!Number.isInteger(t)||t<=0)throw new Error("chainId must be a positive integer");let n=String(e.venue??"").trim().toLowerCase();if(!n)throw new Error("venue is required");let r=vc(e.poolAddress,"poolAddress"),o=e.token;if(!o||typeof o!="object")throw new Error("token is required");let i=String(o.symbol??"").trim();if(!i)throw new Error("token.symbol is required");let s=vc(o.address,"token.address"),a=null;if(o.decimals!=null&&(a=Number(o.decimals),!Number.isInteger(a)||a<0||a>255))throw new Error("token.decimals must be a uint8 when provided");let c=Number(e.liquidityUsd);if(!Number.isFinite(c)||c<0)throw new Error("liquidityUsd must be a non-negative finite number");let l=n==="uniswap-v4"||e.isV4===!0,u=null;if(e.hook!=null){if(typeof e.hook!="object")throw new Error("hook must be an object when provided");u=Object.freeze({address:e.hook.address!=null?vc(e.hook.address,"hook.address"):dO,dynamicFee:e.hook.dynamicFee===!0,reviewed:e.hook.reviewed===!0})}let d=e.id!=null?String(e.id):`${n}:${t}:${r}`;return Object.freeze({id:d,chainId:t,venue:n,poolAddress:r,token:Object.freeze({symbol:i,address:s,decimals:a}),liquidityUsd:c,isV4:l,hook:u})}function V9(e){if(!ab.includes(e.venue))return`unsupported venue "${e.venue}"; supported: ${ab.join(", ")}`;if(e.isV4){if(!e.hook)return"uniswap-v4 candidate is missing hook disclosure; failing closed";if(e.hook.dynamicFee)return"uniswap-v4 pool uses a dynamic fee; fee is not knowable in advance, failing closed";if(e.hook.address!==dO&&!e.hook.reviewed)return`uniswap-v4 pool has an unreviewed hook (${e.hook.address}); failing closed`}return null}async function W9(e,t,n){let r=Xd(n,"resolveTokenIdentity"),o;try{o=await r({chainId:e.chainId,address:e.token.address,symbol:e.token.symbol})}catch(l){return{ok:!1,reason:`identity resolution failed: ${l?.message??l}`}}if(!o||typeof o!="object")return{ok:!1,reason:"identity unresolved"};if(o.ambiguous)return{ok:!1,reason:o.reason??"ambiguous token identity"};if(!o.canonicalId)return{ok:!1,reason:"identity resolver returned no canonicalId"};if(o.canonicalId!==t.canonicalId)return{ok:!1,reason:`token resolves to canonical id "${o.canonicalId}", expected "${t.canonicalId}"`};let i=Number(o.homeChainId);if(!Number.isInteger(i)||i<=0)return{ok:!1,reason:"identity resolver returned no homeChainId"};let s;try{s=vc(o.canonicalAddress,"identity resolver canonicalAddress")}catch(l){return{ok:!1,reason:l.message}}let a=e.token.address;return(pO.test(s)?s===a:s.toLowerCase()===String(a).toLowerCase())?{ok:!0,canonicalId:o.canonicalId,homeChainId:i,canonicalAddress:s,decimals:o.decimals??e.token.decimals??null}:{ok:!1,reason:`token address ${e.token.address} on chain ${e.chainId} does not match the canonical address ${s}; possible wrapped variant or spoof`}}async function G9(e,t,n){let r={},o=[];for(let[a,c]of Yd){let l=Xd(n,c),u;try{u=await l(e,t)}catch(p){return{ok:!1,reason:`${c} failed for ${e.id}: ${p?.message??p}`}}if(u==null||!Number.isFinite(Number(u))){r[a]=null,o.push(a);continue}let d=Number(u);if(d<0)return{ok:!1,reason:`${c} returned a negative cost for ${e.id}`};r[a]=d}let i=Yd.reduce((a,[c])=>a+(r[c]??0),0),s=o.length===0;return{ok:!0,costs:Object.freeze(r),missingLegs:Object.freeze(o),grossOnly:!s,measuredCostUsd:i,totalCostUsd:s?i:null,netUsd:s?t.amountUsd-i:null}}function sb(e){return Object.freeze({id:e.id,chainId:e.chainId,venue:e.venue,poolAddress:e.poolAddress,token:e.token,liquidityUsd:e.liquidityUsd,canonicalId:e.identity.canonicalId,homeChainId:e.identity.homeChainId})}function uO(e,t){let n=null;for(let r of e){if(!n){n=r;continue}let o=t(r),i=t(n);(o>i||o===i&&r.id<n.id)&&(n=r)}return n}async function K9(e={},t={}){let n=String(e.canonicalId??"").trim();if(!n)throw new Error("lp-liquidity-ranker: canonicalId is required");let r=Number(e.amountUsd);if(!Number.isFinite(r)||r<=0)throw new Error("lp-liquidity-ranker: amountUsd must be a positive finite number");if(!Array.isArray(e.candidates)||e.candidates.length===0)throw new Error("lp-liquidity-ranker: candidates must be a non-empty array");let o=e.materialityThresholdBps??H9;if(!Number.isInteger(o)||o<0)throw new Error("lp-liquidity-ranker: materialityThresholdBps must be a non-negative integer");Xd(t,"resolveTokenIdentity");for(let[,h]of Yd)Xd(t,h);let i=Object.freeze({canonicalId:n,amountUsd:r,materialityThresholdBps:o}),s=[],a=[],c=new Set,l=null;for(let h=0;h<e.candidates.length;h+=1){let g=e.candidates[h],y=g?.id!=null?String(g.id):`candidates[${h}]`,b;try{b=z9(g)}catch(k){s.push({id:y,reason:k.message});continue}if(c.has(b.id)){s.push({id:b.id,reason:"duplicate candidate id"});continue}c.add(b.id);let w=V9(b);if(w){s.push({id:b.id,reason:w});continue}let S=await W9(b,i,t);if(!S.ok){s.push({id:b.id,reason:S.reason});continue}if(l==null)l=S.homeChainId;else if(S.homeChainId!==l){s.push({id:b.id,reason:`ambiguous home chain for canonical token "${n}": got ${S.homeChainId}, expected ${l}`});continue}let v=await G9(b,i,t);if(!v.ok){s.push({id:b.id,reason:v.reason});continue}a.push({...b,identity:S,...v})}let u=[];if(a.length===0)return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:0,rejected:Object.freeze(s),deepestLiquidity:null,netBest:null,netRankingComplete:!1,preparationEligible:!1,runnersUp:Object.freeze([]),warnings:Object.freeze(["no candidate passed identity, venue, or cost validation"])});let d=uO(a,h=>h.liquidityUsd),p=a.filter(h=>!h.grossOnly&&h.netUsd!=null),m=uO(p,h=>h.netUsd);for(let h of a)h.grossOnly&&u.push(`${h.id}: gas/fees not fully accounted (missing: ${h.missingLegs.join(", ")}); missing costs were not treated as zero`);m?d.id!==m.id&&u.push(`${d.id} has the deepest liquidity ($${d.liquidityUsd}) but ${m.id} nets more after costs; these are intentionally different answers`):u.push("net-best migration is unavailable until every ranking cost leg is measured; missing gas is never treated as zero and deepest liquidity is not claimed as net-best"),p.length<a.length&&u.push("partial-cost candidates were excluded from net ranking; missing gas was not treated as zero");let f=a.filter(h=>h.id!==m?.id).sort((h,g)=>h.netUsd==null&&g.netUsd==null?h.id<g.id?-1:1:h.netUsd==null?1:g.netUsd==null?-1:g.netUsd-h.netUsd||(h.id<g.id?-1:1)).map(h=>{let g=m!=null&&h.netUsd!=null,y=g?m.netUsd-h.netUsd:null,b=g?Math.round(y/r*1e4):null;return Object.freeze({...sb(h),netUsd:h.netUsd,totalCostUsd:h.totalCostUsd,grossOnly:h.grossOnly,missingLegs:h.missingLegs,marginUsd:y,marginBps:b,material:b!=null&&b>o})});return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:a.length,rejected:Object.freeze(s),deepestLiquidity:sb(d),netBest:m?Object.freeze({...sb(m),netUsd:m.netUsd,totalCostUsd:m.totalCostUsd,costs:m.costs,grossOnly:!1,missingLegs:m.missingLegs}):null,netRankingComplete:!!m&&p.length===a.length,preparationEligible:!1,runnersUp:Object.freeze(f),warnings:Object.freeze(u)})}async function fO(e={}){let t=String(e.canonicalId??"").trim(),n=Number(e.homeChainId);if(!t)throw new Error("lp-liquidity-ranker: canonicalId is required");if(!Number.isInteger(n)||n<=0)throw new Error("lp-liquidity-ranker: homeChainId must be a positive integer");if(!Array.isArray(e.canonicalAssets)||e.canonicalAssets.length===0)throw new Error("lp-liquidity-ranker: canonicalAssets must be a non-empty array");let r=new Map;for(let c of e.canonicalAssets){let l=Number(c?.chainId);if(!Number.isInteger(l)||l<=0)throw new Error("lp-liquidity-ranker: canonical asset chainId must be positive");if(r.has(l))throw new Error(`lp-liquidity-ranker: duplicate canonical asset for chain ${l}`);let u=vc(c?.address,"canonical asset address"),d=c?.decimals==null?null:Number(c.decimals);if(d!=null&&(!Number.isInteger(d)||d<0||d>255))throw new Error("lp-liquidity-ranker: canonical asset decimals must be a uint8");r.set(l,Object.freeze({canonicalAddress:u,decimals:d}))}let o={resolveTokenIdentity:async({chainId:c})=>{let l=r.get(Number(c));return l?{canonicalId:t,homeChainId:n,...l}:{ambiguous:!0,reason:`no exact canonical asset mapping for chain ${c}`}}},i=(e.candidates??[]).map(c=>({...c,costs:c?.costs&&typeof c.costs=="object"?{...c.costs}:{}})),s=new Map(i.map(c=>[String(c?.id??`${String(c?.venue??"").toLowerCase()}:${Number(c?.chainId)}:${String(c?.poolAddress??"")}`),c.costs]));for(let[c,l]of Yd)o[l]=async u=>s.get(u.id)?.[c]??null;let a=await K9({...e,canonicalId:t,candidates:i},o);return Object.freeze({...a,evidenceMode:"caller-supplied",warnings:Object.freeze(["canonical mappings, pool liquidity, and migration costs were caller-supplied and not independently live-verified",...a.warnings])})}async function mO(){return Object.freeze({ok:!0,execution:"analysis-only",supportedVenues:ab,note:"Deepest liquidity and net-best migration are reported separately; no signing or broadcasting."})}var ab,dO,pO,H9,Yd,hO=_(()=>{ab=Object.freeze(["uniswap-v2","uniswap-v3","uniswap-v4","aerodrome","curve","balancer","meteora-dlmm","pancakeswap","sushiswap"]),dO="0x0000000000000000000000000000000000000000",pO=/^0x[0-9a-fA-F]{40}$/,H9=25,Yd=Object.freeze([["removalGasUsd","estimateRemovalGasUsd"],["swapCostUsd","estimateSwapCostUsd"],["bridgeCostUsd","estimateBridgeCostUsd"],["addLiquidityGasUsd","estimateAddLiquidityGasUsd"],["priceImpactUsd","estimatePriceImpactUsd"]])});function Z9(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function ez(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=Z9(n);if(J9.has(r)||Q9.some(o=>r.includes(o)))return!0}return!1}function gO(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}function nz(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function rz(e){let t=e.match(tz)||[];for(let n of t){let r=nz(n),o=gO(r),i=o?gO(o):null;for(let s of[r,o,i])if(s&&ez(s))return!0}return!1}function oo(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function io(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of oz){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function je(e){return typeof e!="string"||e.length===0?!1:X9.some(t=>t.test(e))?!0:rz(e)}var X9,J9,Q9,tz,oz,so=_(()=>{X9=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),J9=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Q9=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);tz=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;oz=Object.freeze([Object.freeze([120,112,114,118]),Object.freeze([115,107,45]),Object.freeze([103,104,112,95]),Object.freeze([103,104,111,95]),Object.freeze([103,104,117,95]),Object.freeze([103,104,115,95]),Object.freeze([103,104,114,95]),Object.freeze([103,105,116,104,117,98,95,112,97,116,95]),Object.freeze([97,107,105,97]),Object.freeze([97,115,105,97])])});function az(e,t){if(!e||typeof e!="object"||!String(e.source??"").trim())throw new Error(`lp-destination-discovery: ${t}.provenance.source is required`);if(Object.keys(e).filter(a=>!iz.has(a)).length)throw new Error(`lp-destination-discovery: ${t}.provenance contains unsupported fields`);let r=String(e.source).trim();if(r.length>512||je(r))throw new Error(`lp-destination-discovery: ${t}.provenance.source is unsafe`);let o=e.evidenceHash==null?null:String(e.evidenceHash).trim();if(o!=null&&!/^[0-9a-f]{64}$/i.test(o))throw new Error(`lp-destination-discovery: ${t}.provenance.evidenceHash must be a sha256 digest`);let i=e.txHash==null?null:String(e.txHash).trim();if(i!=null&&!/^0x[0-9a-f]{64}$/i.test(i))throw new Error(`lp-destination-discovery: ${t}.provenance.txHash must be an EVM transaction hash`);let s=e.reviewedAt==null?null:String(e.reviewedAt).trim();if(s!=null&&!Number.isFinite(Date.parse(s)))throw new Error(`lp-destination-discovery: ${t}.provenance.reviewedAt must be ISO time`);return Object.freeze({source:r,reviewedAt:s,evidenceHash:o,txHash:i})}function bO(e,t){if(!e||typeof e!="object")throw new Error(`lp-destination-discovery: ${t} is required`);let n=Number(e.chainId),r=String(e.token0??"").trim(),o=String(e.token1??"").trim();if(!Number.isInteger(n)||n<=0)throw new Error(`lp-destination-discovery: ${t}.chainId must be positive`);if(!yO.test(r)||!yO.test(o)||br(r)===br(o))throw new Error(`lp-destination-discovery: ${t} requires distinct exact token0/token1 addresses`);return Object.freeze({...e,chainId:n,token0:r,token1:o,provenance:az(e.provenance,t)})}function cz(e,t){if(!String(e.dexId??"").toLowerCase().includes("v4"))return{eligible:!0,reason:null};let n=t.v4;if(!n)return{eligible:!1,reason:"Uniswap V4 metadata is unreviewed"};if(n.dynamicFee===!0)return{eligible:!1,reason:"Uniswap V4 dynamic fee is not preparation-eligible"};let r=br(n.hook);return r&&r!=="0x0000000000000000000000000000000000000000"&&n.reviewed!==!0?{eligible:!1,reason:"Uniswap V4 hook is unreviewed"}:{eligible:!0,reason:null}}function lz(e){let t=e?.best;if(!t||t.quality!=="FULL")return null;let n=Number(t.gasUsd),r=Number(t.feeUsd);return t.gasUsd==null||t.feeUsd==null||!Number.isFinite(n)||!Number.isFinite(r)?null:n+r}async function wO({source:e,destination:t,amountIn:n,index:r},o,i){if(n==null)return{requested:!1,measured:!1,costUsd:null,quote:null};let s=e[`token${r}`],a=t[`token${r}`];if(e.chainId===t.chainId&&br(s)===br(a))return{requested:!0,measured:!0,costUsd:0,quote:null,kind:"none",amountIn:String(n)};let c=e.chainId===t.chainId?{chainId:e.chainId,tokenIn:s,tokenOut:a,amountIn:String(n)}:{fromChainId:e.chainId,toChainId:t.chainId,tokenIn:s,tokenOut:a,amountIn:String(n)},l=e.chainId===t.chainId?"swap":"bridge";try{let u=l==="swap"?await o.bestSwapRoute(c,i):await o.bestBridgeRoute(c,i),d=lz(u);return{requested:!0,measured:d!=null,costUsd:d,quote:u,kind:l,amountIn:String(n)}}catch(u){return{requested:!0,measured:!1,costUsd:null,quote:null,kind:l,amountIn:String(n),error:u?.message??String(u)}}}function uz(e){let t=e.minLiquidityBpsOfDeepest??sz;if(!Number.isInteger(t)||t<1||t>1e4)throw new Error("lp-destination-discovery: minLiquidityBpsOfDeepest must be an integer from 1 to 10000");if(e.minLiquidityUsd==null)return{bps:t,minLiquidityUsd:null};let n=Number(e.minLiquidityUsd);if(!Number.isFinite(n)||n<0)throw new Error("lp-destination-discovery: minLiquidityUsd must be a non-negative number");return{bps:t,minLiquidityUsd:n}}function dz(e,t,n){if(e.venueReviewEligible===!1)return{destinationEligible:!1,destinationIneligibleReason:e.ineligibleReason};if(e.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is unknown"};let r=Number(e.liquidityUsd);if(!Number.isFinite(r)||r<=0)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is not positive"};if(n.minLiquidityUsd!=null&&r<n.minLiquidityUsd)return{destinationEligible:!1,destinationIneligibleReason:`liquidity $${r} is below the $${n.minLiquidityUsd} floor`};if(!t||t.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"no eligible deepest pool"};let o=Number(t.liquidityUsd)*n.bps/1e4;return r<o?{destinationEligible:!1,destinationIneligibleReason:`shallower than the deepest eligible pool ($${r} < $${o} required)`}:{destinationEligible:!0,destinationIneligibleReason:null}}function SO(e,t,n="max"){return[...e].sort((r,o)=>(n==="max"?t(o)-t(r):t(r)-t(o))||String(r.poolAddress).localeCompare(String(o.poolAddress)))[0]??null}async function vO(e={},t={}){let n=bO(e.sourcePair,"sourcePair");if(!Array.isArray(e.destinationPairs))throw new Error("lp-destination-discovery: destinationPairs must be an array");let r=e.destinationPairs.map((E,I)=>bO(E,`destinationPairs[${I}]`)),o=new Map;for(let E of r){if(o.has(E.chainId))throw new Error(`lp-destination-discovery: duplicate destination mapping for chain ${E.chainId}`);o.set(E.chainId,E)}let i=uz(e),s=t.chainConfigs??(await Promise.resolve().then(()=>(ts(),Gg))).CHAIN_CONFIGS,a=e.amounts?.token0!=null||e.amounts?.token1!=null,c=a&&r.some(E=>E.chainId===n.chainId&&(br(E.token0)!==br(n.token0)||br(E.token1)!==br(n.token1))),l=a&&r.some(E=>E.chainId!==n.chainId),u=c&&!t.bestSwapRoute||l&&!t.bestBridgeRoute?await Promise.resolve().then(()=>(xg(),GA)):null,d={discoverExactPairPools:t.discoverExactPairPools??Ex,bestSwapRoute:t.bestSwapRoute??u?.bestSwapRoute,bestBridgeRoute:t.bestBridgeRoute??u?.bestBridgeRoute},p=e.limit??10,m=await Promise.all(s.map(async E=>{let I=o.get(Number(E.chainId));if(!E.dexscreenerSlug)return{chainId:E.chainId,chain:E.name??E.key??null,status:"unavailable",reason:"DexScreener coverage slug is not configured",pools:[]};if(!I)return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"unavailable",reason:"no explicit provenanced destination token0/token1 mapping",pools:[]};try{let N=await d.discoverExactPairPools({chainSlug:E.dexscreenerSlug,token0:I.token0,token1:I.token1,limit:p,dexIds:I.dexIds},t);return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"available",mapping:I,pools:N}}catch(N){return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"unavailable",reason:N?.message??String(N),mapping:I,pools:[]}}})),f=m.flatMap(E=>E.pools.map(I=>({...I,chainId:Number(E.chainId),mapping:E.mapping}))),h=e.amounts??{},g=await Promise.all(f.map(async E=>{let[I,N]=await Promise.all([wO({source:n,destination:E.mapping,amountIn:h.token0,index:0},d,t),wO({source:n,destination:E.mapping,amountIn:h.token1,index:1},d,t)]),D=!(I.requested||N.requested)||[I,N].filter($=>$.requested).every($=>$.measured),X=D?[I,N].reduce(($,j)=>$+(j.costUsd??0),0):null,H=cz(E,E.mapping);return Object.freeze({...E,mappingProvenance:E.mapping.provenance,legs:Object.freeze([I,N]),fullyMeasured:D,costUsd:X,preparationEligible:!1,venueReviewEligible:H.eligible,ineligibleReason:H.reason})})),y=SO(g.filter(E=>E.liquidityUsd!=null),E=>Number(E.liquidityUsd)),b=g.map(E=>Object.freeze({...E,...dz(E,y,i)})),w=b.find(E=>E.destinationEligible&&y&&E.poolAddress===y.poolAddress&&E.chainId===y.chainId)??null,S=b.filter(E=>E.fullyMeasured&&E.destinationEligible),v=SO(S,E=>E.costUsd,"min"),k=b.filter(E=>E.destinationEligible===!1&&E.destinationIneligibleReason?.includes("shallower")),A=y&&b.some(E=>E.poolAddress===y.poolAddress&&E.chainId===y.chainId&&E.destinationEligible===!1);return Object.freeze({ok:!0,analysisOnly:!0,sourcePair:n,coverage:Object.freeze(m),routes:Object.freeze(b),deepestLiquidity:y,recommendedDestination:w,migrationCostBest:v,netBest:null,rankedOn:"liquidity",netRankingComplete:!1,preparationEligible:!1,liquidityFloor:Object.freeze(i),warnings:Object.freeze([...S.length<b.filter(E=>E.fullyMeasured).length?["partial-cost or thin-book routes were excluded from migration-cost comparison; missing gas was not treated as zero and thinner pools are not destinations"]:[],...k.length?[`${k.length} shallower pool(s) are not destination-eligible; a thinner V3 book is never recommended over a deeper V4 book`]:[],...A?["deepest book is not destination-eligible (unreviewed/dynamic-fee V4 or liquidity floor); thinner pools are still not recommended"]:[],"net-best migration is unavailable until destination token values and final add-liquidity gas/impact are measured; deepest liquidity is not claimed as net-best"])})}async function EO(){let{CHAIN_CONFIGS:e}=await Promise.resolve().then(()=>(ts(),Gg));return{ok:!0,execution:"analysis-only",configuredChains:e.length}}var yO,iz,sz,br,xO=_(()=>{nr();so();yO=/^0x[0-9a-fA-F]{40}$/,iz=new Set(["source","reviewedAt","evidenceHash","txHash"]),sz=1e4,br=e=>String(e??"").trim().toLowerCase()});import{Interface as IO,getAddress as Ec,isAddress as fz}from"ethers";function NO(e){let t=Number(e),n=ao[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(ao).join(", ")})`);return{chainId:t,...n}}function kO(e,t){let n=ao[Number(t)];if(!e||e===_O||e===OO||/^eth$/i.test(String(e)))return Ec(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ec(n.weth);if(/^usdc$/i.test(r))return Ec(n.usdc);if(!fz(r))throw new Error(`invalid token address: ${e}`);return Ec(r)}async function Jd(e={},t={}){let{chainId:n,quoter:r,router:o}=NO(e.chainId??8453),i=kO(e.tokenIn||"WETH",n),s=kO(e.tokenOut||ao[n].usdc,n),a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...mz],u=await Promise.all(c.map(async p=>{let m=AO.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:s,amountIn:a,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await J(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=AO.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return we({venue:"aerodrome",chainId:n,chain:ao[n].name,quoter:r,router:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function TO(e={},t={}){let n=Number(e.chainId??8453),r=NO(n),o=Ec(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===_O||i===OO||/^eth$/i.test(i),a=await Jd(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=hz.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,tickSpacing:a.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]);return U({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:s?a.amountIn:"0",slippageGuard:De(a.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function CO(e={}){let t=Number(e.chainId??8453);try{let n=await Jd({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:ao[t]?.router,quoter:ao[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function PO(){return Object.entries(ao).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}var ao,mz,AO,hz,_O,OO,RO=_(()=>{Ne();Ot();oe();ao={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},mz=[1,50,100,200,2e3],AO=new IO(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),hz=new IO(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),_O="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",OO="0x0000000000000000000000000000000000000000"});function bz(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>yz)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 wr(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function $O(e,t){let n=wr(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 wz(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 Sz(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=wr(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:wr(e.network,`accepts[${t}].network`),amount:$O(e.amount,`accepts[${t}].amount`),asset:wr(e.asset,`accepts[${t}].asset`),payTo:wr(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:wz(e.extra)})}function cb(e){let t=bz(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>LO)throw new Error(`x402: accepts must contain 1-${LO} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:wr(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(Sz));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 MO(e,t){return String(e)===String(t)}function vz(e,t={}){let n=cb(e),r=wr(t.network,"network"),o=wr(t.asset,"asset"),i=wr(t.payTo,"payTo"),s=BigInt($O(t.maxAmount,"maxAmount")),a=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&MO(l.asset,o)&&MO(l.payTo,i));if(a.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=a.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)>s)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${s}`);return c}function BO(e={}){return e.paymentRequired??e.header??e.body}function DO(e={}){return cb(BO(e))}function UO(e={},t={}){let n=cb(BO(e)),r=vz(n,e);return U({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 FO(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}var yz,LO,qO=_(()=>{oe();yz=96*1024,LO=50});function lb(e={}){return Te({provider:"bankr",defaultUrl:xz,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function jO(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function Az(e={}){let t=jO(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function HO(e={},t=!1){let n=Az(e),r=lb(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function zO(e,t={}){return x(`${lb(t).baseUrl}${e}`,{headers:HO(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function ub(e={}){return zO("/wallet/me",e)}async function VO(e={}){return zO("/wallet/portfolio",e)}function xc(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function kz(e){let t=xc(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 WO(e={},t={}){let n={fromChain:xc(e.fromChain,"fromChain"),fromToken:xc(e.fromToken,"fromToken"),toChain:xc(e.toChain,"toChain"),toToken:xc(e.toToken,"toToken"),amount:kz(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 x(`${lb(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:HO(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function GO(e={}){if(!jO(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await ub(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var xz,KO=_(()=>{q();gt();xz="https://api.bankr.bot"});async function Ac(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||_z,s=Date.now();return new Promise((a,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?a({ok:!0,partial:!0,ms:Date.now()-s,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,a({ok:!0,ms:Date.now()-s,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function YO(e={}){try{let t=await Ac({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 XO(e={}){let t=await Ac({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function JO(e,t={}){if(!e)throw new Error("coin required");let n=await Ac({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var _z,QO=_(()=>{_z=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws"});async function Qd(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 s=t.url||Nz,a=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(s),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-a,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 y;try{y=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{y={raw:String(g.data).slice(0,300)}}d.push(y),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-a,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function ZO(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Qd([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 eN(e,t={}){if(!e)throw new Error("assetId required");let n=await Qd([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}var Nz,tN=_(()=>{Nz=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market"});function db(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||Cz).replace(/\/$/,"")}function Zd(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||Pz).replace(/\/$/,"")}function kc(e){return{error:String(e.message||e).slice(0,200)}}function Jt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ic(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function ep(e={}){try{let t=await x(`${db(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function tp(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await x(`${db(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Jt(o?.price??o?.lastPrice),volume24h:Jt(o?.volume),quoteVolume24h:Jt(o?.quoteVolume),raw:o}}catch(r){return kc(r)}}async function nN(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${Zd(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${db(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,s=await x(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return Oc({venue:"binance",market:o?"perp":"spot",symbol:n,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return kc(i)}}async function _c(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await x(`${Zd(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||Rz,s=Jt(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Jt(o?.markPrice),indexPrice:Jt(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Jt(o?.nextFundingTime),raw:o??null}}catch(r){return kc(r)}}async function rN(e={},t={}){let n=await _c(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function oN(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await x(`${Zd(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Jt(r?.openInterest),time:Jt(r?.time),raw:r??null}}catch(r){return kc(r)}}async function iN(e={},t={}){let n=Ic(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await x(`${Zd(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(s=>({fundingTime:Jt(s?.fundingTime),fundingRate:Jt(s?.fundingRate)}))}}catch(o){return kc(o)}}function Oc({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let s=m=>(Array.isArray(m)?m:[]).map(f=>{let h=Jt(Array.isArray(f)?f[0]:f?.price),g=Jt(Array.isArray(f)?f[1]:f?.size);return h==null||g==null?null:{price:h,size:g}}).filter(Boolean),a=s(r),c=s(o),l=a[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:a,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}var Cz,Pz,Rz,Nc=_(()=>{q();Cz="https://api.binance.com",Pz="https://fapi.binance.com",Rz=8});function bs(e={}){return(e.baseUrl||process.env.OKX_API_URL||Lz).replace(/\/$/,"")}function Tc(e){return{error:String(e.message||e).slice(0,200)}}function zt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Cc(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function ws(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function np(e={}){try{let t=await x(`${bs(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:ws(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function rp(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Cc(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await x(`${bs(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ws(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:zt(i.last),bestBid:zt(i.bidPx),bestAsk:zt(i.askPx),volume24h:zt(i.vol24h),quoteVolume24h:zt(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return Tc(o)}}async function aN(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=Cc(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await x(`${bs(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=ws(i)[0];return s?Oc({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${r}`}}catch(i){return Tc(i)}}async function op(e={},t={}){let n=Cc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await x(`${bs(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=ws(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||Mz,s=zt(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:s,nextFundingRate:zt(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:zt(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return Tc(r)}}async function ip(e={},t={}){let n=Cc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await x(`${bs(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ws(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:zt(i.markPx),time:zt(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return Tc(o)}}async function cN(e={},t={}){let n=Cc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await x(`${bs(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ws(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:zt(i.oiCcy??i.oi),openInterestContracts:zt(i.oi),openInterestUsd:zt(i.oiUsd),time:zt(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return Tc(o)}}var Lz,Mz,pb=_(()=>{q();Nc();Lz="https://www.okx.com",Mz=8});function Pc(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||$z).replace(/\/$/,"")}function Rc(e){return{error:String(e.message||e).slice(0,200)}}function dt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function sp(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function fb(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function Lc(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function ap(e={}){try{let t=await x(`${Pc(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!Lc(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function uN(e,t){let n=fb(e.market),r=sp(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await x(`${Pc(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Lc(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function cp(e={},t={}){try{let n=await uN(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:dt(r.lastPrice),bestBid:dt(r.bid1Price),bestAsk:dt(r.ask1Price),markPrice:dt(r.markPrice),indexPrice:dt(r.indexPrice),volume24h:dt(r.volume24h),quoteVolume24h:dt(r.turnover24h),raw:r}}catch(n){return Rc(n)}}async function dN(e={},t={}){let n=fb(e.market),r=sp(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await x(`${Pc(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Lc(i);return s?Oc({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${r}`}}catch(i){return Rc(i)}}async function Mc(e={},t={}){try{let n=await uN({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||Bz,s=dt(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:dt(r.markPrice),indexPrice:dt(r.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:dt(r.nextFundingTime),openInterest:dt(r.openInterest),raw:r}}catch(n){return Rc(n)}}async function pN(e={},t={}){let n=await Mc(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function fN(e={},t={}){let n=sp(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=fb(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await x(`${Pc(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=Lc(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:dt(c.openInterest),time:dt(c.timestamp),history:(Array.isArray(a)?a:[]).map(l=>({openInterest:dt(l?.openInterest),timestamp:dt(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(s){return Rc(s)}}async function mN(e={},t={}){let n=sp(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await x(`${Pc(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Lc(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:s.length,history:s.map(a=>({fundingRate:dt(a?.fundingRate),fundingTime:dt(a?.fundingRateTimestamp)}))}}catch(o){return Rc(o)}}var $z,Bz,mb=_(()=>{q();Nc();$z="https://api.bybit.com",Bz=8});function $c(e){return{error:String(e.message||e).slice(0,200)}}function Et(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Dz(e,t){return e==null||!t?null:e*(8760/t)*100}function gb(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function Uz(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):hb,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=hb.filter(i=>r.has(i));return o.length?o:hb}async function Fz(e={},t={}){let n=gb(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await jt(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let s=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(s<0)return{error:`hyperliquid has no perp for ${n}`};let a=i[s]||{},c=Et(a.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Et(a.markPx),indexPrice:Et(a.oraclePx),midPrice:Et(a.midPx),fundingRate:c,fundingIntervalHours:gN,fundingAprPct:Dz(c,gN),openInterest:Et(a.openInterest)}}catch(r){return $c(r)}}async function qz(e={},t={}){let n=gb(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await _n(t),o=Et(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return $c(r)}}async function jz(e={},t={}){let[n,r]=await Promise.all([op(e,t).catch($c),ip(e,t).catch($c)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Et(r.markPrice),...r?.error?{markError:r.error}:{}}}async function co(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,$c(n)]}}async function yb(e={},t={}){let n=gb(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=Uz(e),i=[];o.includes("binance")&&(i.push(co("binance:perp",_c({coin:n,quote:r},t))),i.push(co("binance:spot",tp({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(co("okx:perp",jz({coin:n,quote:r},t))),i.push(co("okx:spot",rp({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(co("bybit:perp",Mc({coin:n,quote:r},t))),i.push(co("bybit:spot",cp({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(co("hyperliquid:perp",Fz({coin:n},t))),i.push(co("hyperliquid:spot",qz({coin:n},t))));let s=await Promise.all(i),a={};for(let[c,l]of s){let[u,d]=c.split(":");a[u]=a[u]||{},a[u][d]=l}return{coin:n,quote:r,venues:o,legs:a}}function yN(e){return!e||e.error?null:Et(e.price)??Et(e.mid)??null}function Hz(e){return!e||e.error?null:Et(e.markPrice)??Et(e.midPrice)??null}async function bb(e={},t={}){let n=await yb(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:s}=n,a=[];for(let f of i){let h=yN(s[f]?.spot);h!=null&&h>0&&a.push(h)}let c=[...a].sort((f,h)=>f-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let f of i){let h=s[f]?.perp,g=s[f]?.spot,y=Hz(h),b=yN(g),w=b??l,S=y!=null&&w?(y-w)/w*1e4:null;u.push({venue:f,symbol:h?.symbol??g?.symbol??r,markPrice:y,spotPrice:b,spotSource:b!=null?f:l!=null?"cross-venue-median":null,basisBps:S,fundingRate:h&&!h.error?Et(h.fundingRate):null,fundingIntervalHours:h&&!h.error?Et(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?Et(h.fundingAprPct):null,openInterest:h&&!h.error?Et(h.openInterest):null,errors:[h?.error,g?.error].filter(Boolean)})}let d=zz(u),p=u.filter(f=>f.markPrice!=null),m=u.filter(f=>f.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:m.length?m.reduce((f,h)=>h.basisBps>f.basisBps?h:f):null,cheapestBasis:m.length?m.reduce((f,h)=>h.basisBps<f.basisBps?h:f):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function zz(e=[]){let t=e.filter(r=>Et(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,l=a>0?i.venue:s.venue;n.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function bN(e={},t={}){let n=await bb(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function wN(e={}){try{let t=await Promise.all([ep(e).catch(()=>({ok:!1})),np(e).catch(()=>({ok:!1})),ap(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var hb,gN,SN=_(()=>{Nc();pb();mb();Xt();hb=["binance","okx","bybit","hyperliquid"],gN=1});import Ie from"node:fs";import lp from"node:path";import{createHash as Wz,randomUUID as vN}from"node:crypto";function lo(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(lo).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${lo(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function EN(e){return Wz("sha256").update(lo(e)).digest("hex")}function up(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 dp(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function xN(e){Ie.mkdirSync(e,{recursive:!0,mode:448});try{Ie.chmodSync(e,448)}catch{}}function Sb(e){try{let t=Ie.statSync(e);return{...JSON.parse(Ie.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function Ss({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:s=3e4,lockWaitMs:a=2e3,lockIdFactory:c=()=>vN()}={}){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(s)||s<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(a)||a<0||a>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let w=n();return r(w),{schemaVersion:wb,kind:t,generation:0,data:w}}function d(w){let S;try{S=JSON.parse(w)}catch(A){throw new Nn(`corrupt ${t} snapshot: invalid JSON (${A.message})`,"STORE_CORRUPT")}if(!S||typeof S!="object"||Array.isArray(S))throw new Nn(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(S.schemaVersion!==wb)throw new Nn(`unsupported ${t} schemaVersion ${String(S.schemaVersion)}`,"STORE_SCHEMA");if(S.kind!==t||!Number.isSafeInteger(S.generation)||S.generation<0)throw new Nn(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...k}=S;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||EN(k)!==v)throw new Nn(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(S.data)}catch(A){throw new Nn(`corrupt ${t} snapshot: ${A.message}`,"STORE_CORRUPT")}return k}function p(){if(!Ie.existsSync(e))return u();let w=Ie.statSync(e);if(!w.isFile()||w.size>i)throw new Nn(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{Ie.chmodSync(e,384)}catch{}return d(Ie.readFileSync(e,"utf8"))}function m(){xN(lp.dirname(e));let w=up(o),S=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:S,pid:process.pid,acquiredAt:w})}
|
|
8
8
|
`,k=()=>{let N;try{return N=Ie.openSync(l,"wx",384),Ie.writeFileSync(N,v,"utf8"),Ie.fsyncSync(N),Ie.closeSync(N),{lockId:S}}catch(T){let D=N!==void 0;if(D)try{Ie.closeSync(N)}catch{}if(D)try{Ie.unlinkSync(l)}catch{}if(T?.code!=="EEXIST")throw T;return null}},E=up(o)+a,I=new Int32Array(new SharedArrayBuffer(4));for(;;){let N=k();if(N)return N;let T=up(o),D=Sb(l),X=!1;if(D){let $=T-Number(D.acquiredAt??D.mtimeMs);X=Number.isFinite($)&&$>=s}else try{X=T-Ie.statSync(l).mtimeMs>=s}catch{X=!1}if(X){let $=Sb(l);if(D?$?.lockId===D.lockId:$===null){try{Ie.unlinkSync(l)}catch(C){if(C?.code!=="ENOENT")throw C}continue}}let H=E-T;if(H<=0)throw new Nn(`${t} store is busy`,"STORE_BUSY");Atomics.wait(I,0,0,Math.min(10,H))}}function f(w){if(Sb(l)?.lockId===w.lockId)try{Ie.unlinkSync(l)}catch(v){if(v?.code!=="ENOENT")throw v}}function h(w){r(w.data);let S={...w,integrity:EN(w)},v=`${lo(S)}
|
|
9
9
|
`;if(Buffer.byteLength(v)>i)throw new Nn(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let k=lp.dirname(e);xN(k);let A=lp.join(k,`.${lp.basename(e)}.${process.pid}.${vN()}.tmp`),E;try{E=Ie.openSync(A,"wx",384),Ie.writeFileSync(E,v,"utf8"),Ie.fsyncSync(E),Ie.closeSync(E),E=void 0,Ie.renameSync(A,e);try{Ie.chmodSync(e,384)}catch{}try{let I=Ie.openSync(k,"r");try{Ie.fsyncSync(I)}finally{Ie.closeSync(I)}}catch{}}finally{if(E!==void 0)try{Ie.closeSync(E)}catch{}try{Ie.unlinkSync(A)}catch(I){if(I?.code!=="ENOENT")throw I}}}function g(){return dp(p().data)}function y(){let w=p();return{schemaVersion:w.schemaVersion,kind:w.kind,generation:w.generation,data:dp(w.data)}}function b(w){if(typeof w!="function")throw new TypeError("mutator must be a function");let S=m();try{let v=p(),k=dp(v.data),A=w(k,{generation:v.generation,now:up(o)});return r(k),h({schemaVersion:wb,kind:t,generation:v.generation+1,data:k}),dp(A)}finally{f(S)}}return Object.freeze({filePath:e,read:g,inspect:y,mutate:b})}var wb,Nn,pp=_(()=>{wb=1,Nn=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}}});import{wordlists as Gz}from"ethers";function Jz(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Xz.has(t.length)&&t.every(n=>Gz.en.getWordIndex(n)>=0)}function tV(e){let t=AN(e);return eV.has(t)||Zz.test(t)}function AN(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function nV(e){let t=AN(e);return[...Kz].some(n=>t.includes(n))}function rV(e,t,n){if(typeof t=="string"){if(Yz.some(r=>r.test(t))||Jz(t))throw new Bc(n);if(Qz.test(t)&&!tV(e))throw new Bc(n)}}function vb(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return rV(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)=>vb(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(nV(o))throw new Bc(i);e[o]!==void 0&&(r[o]=vb(e[o],i,o))}return r}function Sr(e){return vb(e)}var Kz,Yz,Xz,Qz,Zz,eV,Bc,Dc=_(()=>{Kz=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Yz=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Xz=new Set([12,15,18,21,24]);Qz=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Zz=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,eV=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Bc=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import kN from"node:path";import{homedir as oV}from"node:os";import{createHash as iV,randomUUID as sV}from"node:crypto";function ie(e,t){throw new Ab(e,t)}function ai(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ai(t);Object.freeze(e)}return e}function Fc(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&ie(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||fV.test(o))&&ie(`${t} is invalid`),r?o.toLowerCase():o}function Ct(e,t){let n=Fc(e,t,{max:128});return uV.test(n)||ie(`${t} must be a bounded id`),n}function Uc(e,t,{positive:n=!1}={}){typeof e=="number"&&ie(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return lV.test(r)||ie(`${t} must be a canonical integer string`),n&&r==="0"&&ie(`${t} must be positive`),r}function si(e,t){let n=Fc(e,t,{max:42,lower:!0});return dV.test(n)||ie(`${t} must be a 20-byte EVM address`),n}function _N(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ie(`${t} must be a plain object`),e}function ii(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ie("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Eb(e){return new Date(e).toISOString()}function hV(e){return iV("sha256").update(lo(e),"utf8").digest("hex")}function gV(e=process.env){let t=e.ORACLE_CONFIG_DIR||kN.join(oV(),".config","oracle");return kN.join(t,"local-marketplace.v1.json")}function fp(e){let t=e.status==="submitted";return ai({schemaVersion:mp,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:mV.has(e.status)?e.status:ie("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>ai({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:IN,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function yV(e){(!e||e.schemaVersion!==mp||!Array.isArray(e.listings))&&ie("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&ie("marketplace capacity exceeded","STORE_LIMIT")}function xb(e,t){return ai({schemaVersion:mp,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:IN,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function bV(e,t,n){typeof e=="string"&&ie("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=_N(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&ie("generic signHash is refused","SIGNHASH_REFUSED");let o=si(r.from??r.offerer??t.seller,"artifact.from"),i=si(r.to??r.recipient??n.buyer,"artifact.to"),s=Uc(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&ie("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&ie("artifact.to must match the buyer","ARTIFACT_MISMATCH"),s!==t.chainId&&ie("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&ie("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function wV(e,t){if(e==null)return{action:"arm"};let n=_N(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ie("generic signHash is refused","SIGNHASH_REFUSED");let r=Fc(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&ie("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&ie("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&ie("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&ie("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&ie("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&ie("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function ON({filePath:e=gV(),clock:t=()=>Date.now(),idFactory:n=()=>sV()}={}){let r=Ss({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:mp,listings:[]}),validateData:yV});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 s(h={}){Sr(h);let g=Ct(h.tenantId,"tenantId"),y=si(h.seller,"seller"),b=Fc(h.asset,"asset",{max:128}),w=Uc(h.amount,"amount",{positive:!0}),S=Uc(h.price,"price",{positive:!0}),v=Uc(h.chainId,"chainId",{positive:!0}),k=ii(t),A=Eb(k),E=h.expiresAt==null?Eb(k+864e5):Fc(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(E))||Date.parse(E)<=k)&&ie("expiresAt must be after now");let I=Ct(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(N=>{N.listings.some(X=>X.listingId===I)&&ie("listingId already exists","DUPLICATE");let T={listingId:I,tenantId:g,seller:y,asset:b,amount:w,price:S,chainId:v,status:"open",createdAt:A,expiresAt:E,offers:[],custody:"none",execution:"armed-local"},D={...T,listingHash:hV(T)};return N.listings.push(D),fp(D)})}function a({tenantId:h}={}){let g=Ct(h,"tenantId"),y=ii(t);return ai(r.read().listings.filter(b=>o(b,g)).map(b=>fp(i({...b,offers:b.offers.map(w=>({...w}))},y))))}function c({tenantId:h,listingId:g,actor:y}={}){let b=Ct(h,"tenantId"),w=Ct(g,"listingId"),S=si(y,"actor"),v=ii(t);return r.mutate(k=>{let A=k.listings.find(E=>o(E,b)&&E.listingId===w);return A||ie("listing not found","NOT_FOUND"),i(A,v),A.seller!==S&&ie("only the seller can cancel","FORBIDDEN"),A.status!=="open"&&ie("listing is not open","NOT_OPEN"),A.status="cancelled",fp(A)})}function l(h={}){Sr(h);let g=Ct(h.tenantId,"tenantId"),y=Ct(h.listingId,"listingId"),b=si(h.buyer,"buyer"),w=Uc(h.amount,"amount",{positive:!0}),S=ii(t),v=Ct(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(k=>{let A=k.listings.find(E=>o(E,g)&&E.listingId===y);return A||ie("listing not found","NOT_FOUND"),i(A,S),A.status!=="open"&&ie("listing is not open","NOT_OPEN"),A.seller===b&&ie("seller cannot offer on their own listing","FORBIDDEN"),A.offers.some(E=>E.offerId===v)&&ie("offerId already exists","DUPLICATE"),A.offers.push({offerId:v,buyer:b,amount:w,status:"open",createdAt:Eb(S)}),fp(A)})}function u(h,{tenantId:g,listingId:y,offerId:b,actor:w,now:S,allowed:v=["open","armed"]}){let k=h.listings.find(E=>o(E,g)&&E.listingId===y);k||ie("listing not found","NOT_FOUND"),i(k,S),v.includes(k.status)||ie("listing is not open","NOT_OPEN"),k.seller!==w&&ie("only the seller can arm a fill","FORBIDDEN");let A=k.offers.find(E=>E.offerId===b);return(!A||!["open","armed"].includes(A.status))&&ie("offer not found","NOT_FOUND"),{row:k,offer:A}}function d({tenantId:h,listingId:g,offerId:y,actor:b}={}){let w=Ct(h,"tenantId"),S=Ct(g,"listingId"),v=Ct(y,"offerId"),k=si(b,"actor"),A=ii(t);return r.mutate(E=>{let{row:I,offer:N}=u(E,{tenantId:w,listingId:S,offerId:v,actor:k,now:A});return I.status="armed",N.status="armed",xb(I,N)})}async function p({tenantId:h,listingId:g,offerId:y,actor:b,instruction:w,executor:S}={}){let v=Ct(h,"tenantId"),k=Ct(g,"listingId"),A=Ct(y,"offerId"),E=si(b,"actor"),I=ii(t),N=r.mutate(C=>{let{row:B,offer:V}=u(C,{tenantId:v,listingId:k,offerId:A,actor:E,now:I,allowed:["open","armed"]}),K=wV(w,B);return B.status="armed",V.status="armed",{armed:xb(B,V),instruction:K,listingHash:B.listingHash}});if(N.instruction.action==="arm")return N.armed;let T=r.read().listings.find(C=>C.listingId===k&&C.tenantId===v),D=T?.offers.find(C=>C.offerId===A),X=bV(N.instruction.artifact,T,D);(!S||typeof S.executeConfirmedArtifact!="function")&&ie("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof S.signHash=="function"&&ie("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await S.executeConfirmedArtifact(X,N.instruction.nonce,S),$=H?.receipt?.transactionHash??H?.transactionHash;(typeof $!="string"||!pV.test($))&&ie("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let j=H?.receipt?.status??H?.status;return j!==1&&j!=="0x1"&&ie("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(C=>{let{row:B,offer:V}=u(C,{tenantId:v,listingId:k,offerId:A,actor:E,now:ii(t),allowed:["armed"]});return B.status="submitted",V.status="submitted",B.transactionHash=$.toLowerCase(),ai({...xb(B,V),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:B.transactionHash,review:`Local P2 fill ${B.listingId} signed and broadcast through the instructed local signer. transactionHash=${B.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Ct(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&ie("consult text required"),ai({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 cV}return Object.freeze({createListing:s,listListings:a,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}var mp,IN,mfe,aV,hfe,cV,lV,uV,dV,pV,fV,mV,Ab,NN=_(()=>{pp();Dc();mp=1,IN="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",mfe=Object.freeze(["listing","offer","arm","instruct"]),aV=Object.freeze(["open","cancelled","expired","armed","submitted"]),hfe=Object.freeze(["arm","sign-and-broadcast"]),cV=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."}),lV=/^(?:0|[1-9][0-9]*)$/,uV=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,dV=/^0x[a-fA-F0-9]{40}$/,pV=/^0x[a-fA-F0-9]{64}$/,fV=/[\u0000-\u001f\u007f]/,mV=new Set(aV),Ab=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}}});import TN from"node:path";import{homedir as SV}from"node:os";import{createHash as vV,randomUUID as EV}from"node:crypto";function ae(e,t){throw new _b(e,t)}function qc(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))qc(t);Object.freeze(e)}return e}function jc(e,t,{max:n=256}={}){typeof e!="string"&&ae(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||_V.test(r))&&ae(`${t} is invalid`),r}function vr(e,t){let n=jc(e,t,{max:128});return AV.test(n)||ae(`${t} must be a bounded id`),n}function hp(e,t,{positive:n=!1}={}){typeof e=="number"&&ae(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return xV.test(r)||ae(`${t} must be a canonical integer string`),n&&r==="0"&&ae(`${t} must be positive`),r}function ci(e,t){let n=jc(e,t,{max:42}).toLowerCase();return kV.test(n)||ae(`${t} must be a 20-byte EVM address`),n}function OV(e){let t=jc(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{ae("resource must be an https URL")}return n.protocol!=="https:"&&ae("resource must be https"),(n.username||n.password)&&ae("resource must not contain credentials"),n.toString()}function PN(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ae(`${t} must be a plain object`),e}function NV(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ae("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function TV(e){return new Date(e).toISOString()}function CV(e=process.env){let t=e.ORACLE_CONFIG_DIR||TN.join(SV(),".config","oracle");return TN.join(t,"local-x402.v1.json")}function kb(e){let t=e.status==="submitted";return qc({schemaVersion:gp,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:CN,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function PV(e){(!e||e.schemaVersion!==gp||!Array.isArray(e.intents))&&ae("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&ae("x402 capacity exceeded","STORE_LIMIT")}function Ib(e){return qc({schemaVersion:gp,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:CN,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function RV(e,t){typeof e=="string"&&ae("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=PN(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&ae("generic signHash is refused","SIGNHASH_REFUSED");let r=ci(n.from??t.payer,"artifact.from"),o=ci(n.to??t.payTo,"artifact.to"),i=hp(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&ae("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&ae("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&ae("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let s=BigInt(t.maxBudget);return BigInt(i)>s&&ae("amount exceeds maxBudget","BUDGET"),n}function LV(e,t){if(e==null)return{action:"arm"};let n=PN(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ae("generic signHash is refused","SIGNHASH_REFUSED");let r=jc(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&ae("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&ae("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&ae("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&ae("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function RN({filePath:e=CV(),clock:t=()=>Date.now(),idFactory:n=()=>EV()}={}){let r=Ss({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:gp,intents:[]}),validateData:PV});function o(l={}){Sr(l);let u=vr(l.tenantId,"tenantId"),d=ci(l.payer,"payer"),p=ci(l.payTo,"payTo"),m=OV(l.resource),f=hp(l.amount,"amount",{positive:!0}),h=hp(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&ae("amount exceeds maxBudget","BUDGET");let g=jc(l.asset??"USDC","asset",{max:32}),y=hp(l.chainId,"chainId",{positive:!0}),b=NV(t),w=vr(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(S=>{S.intents.some(A=>A.intentId===w)&&ae("intentId already exists","DUPLICATE");let v={intentId:w,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:y,status:"open",createdAt:TV(b),custody:"none",execution:"armed-local"},k={...v,intentHash:vV("sha256").update(lo(v),"utf8").digest("hex")};return S.intents.push(k),kb(k)})}function i({tenantId:l}={}){let u=vr(l,"tenantId");return qc(r.read().intents.filter(d=>d.tenantId===u).map(kb))}function s({tenantId:l,intentId:u,actor:d}={}){let p=vr(l,"tenantId"),m=vr(u,"intentId"),f=ci(d,"actor");return r.mutate(h=>{let g=h.intents.find(y=>y.tenantId===p&&y.intentId===m);return g||ae("intent not found","NOT_FOUND"),g.payer!==f&&ae("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&ae("intent is not open","NOT_OPEN"),g.status="cancelled",kb(g)})}function a({tenantId:l,intentId:u,actor:d}={}){let p=vr(l,"tenantId"),m=vr(u,"intentId"),f=ci(d,"actor");return r.mutate(h=>{let g=h.intents.find(y=>y.tenantId===p&&y.intentId===m);return g||ae("intent not found","NOT_FOUND"),g.payer!==f&&ae("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||ae("intent is not open","NOT_OPEN"),g.status="armed",Ib(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=vr(l,"tenantId"),h=vr(u,"intentId"),g=ci(d,"actor"),y=r.mutate(A=>{let E=A.intents.find(N=>N.tenantId===f&&N.intentId===h);E||ae("intent not found","NOT_FOUND"),E.payer!==g&&ae("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(E.status)||ae("intent is not open","NOT_OPEN");let I=LV(p,E);return E.status="armed",{armed:Ib(E),instruction:I}});if(y.instruction.action==="arm")return y.armed;let b=r.read().intents.find(A=>A.tenantId===f&&A.intentId===h),w=RV(y.instruction.artifact,b);(!m||typeof m.executeConfirmedArtifact!="function")&&ae("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&ae("generic signHash executors are refused","SIGNHASH_REFUSED");let S=await m.executeConfirmedArtifact(w,y.instruction.nonce,m),v=S?.receipt?.transactionHash??S?.transactionHash;(typeof v!="string"||!IV.test(v))&&ae("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let k=S?.receipt?.status??S?.status;return k!==1&&k!=="0x1"&&ae("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(A=>{let E=A.intents.find(I=>I.tenantId===f&&I.intentId===h);return(!E||E.status!=="armed")&&ae("intent is not armed","NOT_OPEN"),E.status="submitted",E.transactionHash=v.toLowerCase(),qc({...Ib(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:s,armPayment:a,instructPay:c})}var gp,CN,Efe,xV,AV,kV,IV,_V,_b,LN=_(()=>{pp();Dc();gp=1,CN="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",Efe=Object.freeze(["open","cancelled","armed","submitted"]),xV=/^(?:0|[1-9][0-9]*)$/,AV=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,kV=/^0x[a-fA-F0-9]{40}$/,IV=/^0x[a-fA-F0-9]{64}$/,_V=/[\u0000-\u001f\u007f]/,_b=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}}});import MN from"node:path";import{homedir as MV}from"node:os";import{randomUUID as $V}from"node:crypto";function ot(e,t){throw new Nb(e,t)}function Cb(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Cb(t);Object.freeze(e)}return e}function uo(e,t,{max:n=256}={}){typeof e!="string"&&ot(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||UV.test(r))&&ot(`${t} is invalid`),r}function Hc(e,t){let n=uo(e,t,{max:128});return DV.test(n)||ot(`${t} must be a bounded id`),n}function $N(e,t){let n=uo(e,t,{max:64}).toLowerCase();return FV.test(n)||ot(`${t} must be 64 lowercase hex`),n}function HV(e,t){let n=uo(e,t,{max:2048}),r;try{r=new URL(n)}catch{ot(`${t} must be an https URL`)}return r.protocol!=="https:"&&ot(`${t} must be https`),(r.username||r.password)&&ot(`${t} must not contain credentials`),r.toString()}function zV(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&ot("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=uo(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!qV.test(r)||r==="0.0.0.0")&&ot(`outboundHosts[${n}] is not an allowlisted host`),r}))}function BN(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ot("clock invalid","CLOCK_INVALID"),n}function DN(e){return new Date(e).toISOString()}function VV(e=process.env){let t=e.ORACLE_CONFIG_DIR||MN.join(MV(),".config","oracle");return MN.join(t,"local-pack-registry.v1.json")}function Ob(e){return Cb({schemaVersion:Tb,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:BV,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function WV(e){(!e||e.schemaVersion!==Tb||!Array.isArray(e.packs))&&ot("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&ot("pack registry capacity exceeded","STORE_LIMIT")}function UN({filePath:e=VV(),clock:t=()=>Date.now(),idFactory:n=()=>$V()}={}){let r=Ss({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Tb,packs:[]}),validateData:WV});function o(l={}){Sr(l);let u=Hc(l.tenantId,"tenantId"),d=uo(l.name,"name",{max:128}),p=uo(l.version,"version",{max:64}),m=uo(l.publisher,"publisher",{max:128}),f=$N(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:$N(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:HV(l.homepage,"homepage"),y=zV(l.outboundHosts),b=uo(l.spendScope??"none","spendScope",{max:16});jV.has(b)||ot("spendScope must be read, prepare, or none"),b!=="none"&&b!=="read"&&ot("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let w=BN(t),S=Hc(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(A=>A.packId===S||A.tenantId===u&&A.name===d&&A.version===p&&A.status==="listed")&&ot("pack already listed","DUPLICATE");let k={packId:S,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:y,spendScope:b,status:"listed",createdAt:DN(w),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(k),Ob(k)})}function i({tenantId:l}={}){let u=Hc(l,"tenantId");return Cb(r.read().packs.filter(d=>d.tenantId===u).map(Ob))}function s({tenantId:l,packId:u}={}){let d=Hc(l,"tenantId"),p=Hc(u,"packId"),m=BN(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||ot("pack not found","NOT_FOUND"),h.status!=="listed"&&ot("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=DN(m),Ob(h)})}function a(){ot("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){ot("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:s,loadPack:a,executePack:c})}var Tb,BV,Cfe,DV,UV,FV,qV,jV,Nb,FN=_(()=>{pp();Dc();Tb=1,BV="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",Cfe=Object.freeze(["listed","revoked"]),DV=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,UV=/[\u0000-\u001f\u007f]/,FV=/^[a-f0-9]{64}$/,qV=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,jV=new Set(["read","prepare","none"]),Nb=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}}});import{Interface as HN,getAddress as Pb,isAddress as GV}from"ethers";function JV(e){let t=Number(e??4663),n=zN[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function qN(e,t){if(/^weth$/i.test(String(e||"")))return Pb(zN[t].weth);if(!GV(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Pb(e)}function QV(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function jN(e,t,n,r,o,i){let s=r.encodeFunctionData(o,i),a=await e(t,"eth_call",[{to:n,data:s},"latest"]);if(!a||a==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,a)}async function VN(e,t={},n={}){try{let r=JV(t.chainId),o=qN(t.tokenIn,r.chainId),i=qN(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let s=QV(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),a=Number(t.tickSpacing??2e3);if(!Number.isInteger(a)||a<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||J,l=await jN(c,r.chainId,r.factory,YV,"getPool",[o,i,a]),u=Pb(l[0]);if(u.toLowerCase()===KV)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:s,tickSpacing:a,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:s,tickSpacing:a,sqrtPriceLimitX96:0n},m=await jN(c,r.chainId,r.quoter,XV,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:a,sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...f,amountIn:s.toString(),amountOut:m[0].toString()}:{...f,amountIn:m[0].toString(),amountOut:s.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function WN(e={},t={}){return VN("exact-input",e,t)}async function GN(e={},t={}){return VN("exact-output",e,t)}var KV,zN,YV,XV,KN=_(()=>{Ne();KV="0x0000000000000000000000000000000000000000",zN=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),YV=new HN(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),XV=new HN(["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)"])});import{getAddress as ZV,Interface as Es,keccak256 as Lb}from"ethers";import{createHash as Mb,createHmac as e7,timingSafeEqual as nT}from"node:crypto";function ee(e,t){try{return ZV(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function xr(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 Zt(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 de(e,t,n,r,o=[],i="latest"){let s=n.encodeFunctionData(r,o),a=await e(ne,"eth_call",[{to:ee(t,"contract"),data:s},i]);return n.decodeFunctionResult(r,a)}function oT(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 JN(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>YN)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${YN}`);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)!==ne)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${ne}`);return{name:n.name||n.collectionName||null,chainId:ne,collection:ee(n.collection||n.collectionAddress,"Anvil collection"),market:ee(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?ee(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 c7(e,t,n=[],r={}){if(Number(e)!==ne)throw new Error(`stonkbrokers: Anvil supports chain ${ne} only`);if(!r7.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await x(n7,{method:"POST",headers:{origin:yp,referer:`${yp}/`,"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 Tn(e={}){return e.rpcCall||((t,n,r)=>c7(t,n,r,e))}async function xs(e={},t={}){if(e.snapshot){let a=JN(e.snapshot),c={kind:"anvil-markets",chainId:ne,total:a.length,contentHash:Mb("sha256").update(vs(a)).digest("hex")},l=Bb(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(a,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),a}let n=a=>{let c=String(a?.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 x(t7,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:o7,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=JN(r),i={kind:"anvil-markets",chainId:ne,total:o.length,contentHash:Mb("sha256").update(vs(o)).digest("hex")},s=Bb(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:s.valid,evidence:s.evidence,error:s.error},enumerable:!1}),o}function bp(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 iT({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 xs({},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 s=s7[e];if(!s)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let a=Tn(n),c=bp(await a(ne,"eth_blockNumber",[])),l=await a(ne,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||bp(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 a(ne,"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=Lb(p).toLowerCase();if(m!==s)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:a,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:m,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+i7}}function sT(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:ne,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 Vc(e={},t={}){let n=ee(e.market,"Anvil market"),r=ee(e.collection,"NFT collection"),o=xr(e.tokenId),i=await iT({market:n,collection:r},t),{rpc:s,blockRef:a}=i,[c,l,u,d,p,m]=await Promise.all([de(s,n,xt,"quoteSpecificBuy",[BigInt(o)],a),de(s,n,xt,"inventory",[BigInt(o)],a),de(s,r,Sn,"ownerOf",[BigInt(o)],a),de(s,n,xt,"collection",[],a),de(s,n,xt,"token",[],a),de(s,n,xt,"robinhoodSwapFeeWei",[],a)]),f=ee(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=ee(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await de(s,h,rT,"decimals",[],a))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let y=BigInt(m[0]).toString(),b=sT(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:y}),w=!!c[4],S=!!l[0],v=ee(u[0],"NFT owner")===n,k=w&&S&&v;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:ne,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:y,fees:oT(c[2],c[3]),available:k,evidence:{quoteAvailable:w,inventory:S,ownerIsMarket:v,marketCollection:f,attestation:b},reason:k?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function wp(e={},t={}){let n=ee(e.market,"Anvil market"),r=ee(e.collection,"NFT collection"),o=await iT({market:n,collection:r},t),{rpc:i,blockRef:s}=o,[a,c,l,u]=await Promise.all([de(i,n,xt,"quoteSellNFT",[],s),de(i,n,xt,"collection",[],s),de(i,n,xt,"token",[],s),de(i,n,xt,"robinhoodSwapFeeWei",[],s)]),d=ee(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=ee(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await de(i,p,rT,"decimals",[],s))[0]);if(!Number.isSafeInteger(m)||m<0||m>255)throw new Error("stonkbrokers: invalid payment token decimals");let f=BigInt(u[0]).toString(),h=sT(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:ne,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(a[0]).toString(),grossPayoutRaw:BigInt(a[1]).toString(),nativeSwapFeeWei:f,fees:oT(a[2],a[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function aT(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 Er(e,t){let n=Zt(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function cT({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:s,nonce:a}){let c={chainId:ne,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Er(o,"gasLimit").toString(),maxFeePerGas:Er(i,"maxFeePerGasWei").toString(),nonce:Number(a),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return s!=null&&s!==""&&(c.maxPriorityFeePerGas=Er(s,"maxPriorityFeePerGasWei").toString()),c}function lT(e,t){return U({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 uT(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=ee(e.buyer,"buyer"),r=ee(e.market,"Anvil market"),o=ee(e.collection,"NFT collection"),i=xr(e.tokenId),s=Er(e.maxTotalCostRaw,"maxTotalCostRaw"),a=Zt(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 Vc({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>s||BigInt(l.nativeSwapFeeWei)>a)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=Er(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=ee(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,y={blockHash:g.blockHash,requireCanonical:!0},b=BigInt((await de(Tn(t),f,a7,"allowance",[n,r],y))[0]);if(b<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let w={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},S=[cT({...w,to:r,data:xt.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],v={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},k={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:g,anvilQuote:v,preconditions:{allowanceVerified:!0,allowanceRaw:b.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:aT(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:ne,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:v,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:S}};return lT(k,l)}async function dT(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=Tn(t),r=ee(e.seller,"seller"),o=ee(e.market,"Anvil market"),i=ee(e.collection,"NFT collection"),s=xr(e.tokenId),a=Er(e.minPayoutRaw,"minPayoutRaw"),c=Zt(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 wp({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([de(n,i,Sn,"ownerOf",[BigInt(s)],p).then(N=>ee(N[0],"NFT owner")),de(n,i,Sn,"getApproved",[BigInt(s)],p).then(N=>ee(N[0],"NFT approval")),de(n,i,Sn,"isApprovedForAll",[r,o],p).then(N=>!!N[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)<a||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let g=BigInt(u.netPayoutRaw),y=Er(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(y!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let b=Number(t.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),S=ee(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),k={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},A=[cT({...k,to:o,data:xt.encodeFunctionData("sellNFT",[BigInt(s),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},I={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:s,paymentToken:S,paymentTokenDecimals:v,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:y.toString()},tradeId:aT(e.tradeId),slippageBps:0,expiresAtMs:b+w,fee:{oracleFeeBps:0},artifact:{chainId:ne,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:s,paymentToken:S,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:A}};return lT(I,u)}async function l7(e={},t={}){if(Array.isArray(e.tokenIds)){let b=e.tokenIds.map(v=>xr(v)),w={kind:"anvil-inventory",chainId:ne,market:ee(e.market,"Anvil market"),collection:ee(e.collection,"NFT collection"),total:b.length,contentHash:Mb("sha256").update(vs(b)).digest("hex")},S=Bb(e.inventoryCompletenessEvidence,w,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:b,total:b.length,scanned:b.length,complete:S.valid,continuation:S.valid?null:{offset:b.length,evidenceRequired:!0},completenessEvidence:S.evidence,completenessError:S.error}}let n=Tn(t),r=ee(e.market,"Anvil market"),o=bp(await n(ne,"eth_blockNumber",[])),i=await n(ne,"eth_getBlockByNumber",[o,!1]),s=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(s)||bp(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let a={blockHash:s,requireCanonical:!0},c=await de(n,r,xt,"inventoryLength",[],a),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>li)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${li}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>li))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${li}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:s,boundedMaximum:li};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await de(n,r,xt,"oldestTokenId",[],a))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let b=f.toString();g.add(b),h.push(b),f=BigInt((await de(n,r,xt,"getNextTokenId",[f],a))[0])}let y=h.length===l;return{ids:h,total:l,scanned:h.length,complete:y,continuation:y?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function u7(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 d7(e,t,n){let r=Tn(n);try{let o=String((await de(r,e,Sn,"tokenURI",[BigInt(t)]))[0]),i=u7(o);if(i)return i;let s=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await x(s,{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 de(r,e,Sn,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function pT(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 p7(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),s=String(r?.op||"eq").trim().toLowerCase();if(s==="exists")return i!=null;if(i==null)return!1;let a=i.value;if(s==="eq")return String(a).toLowerCase()===String(r.value).toLowerCase();if(s==="in")return Array.isArray(r.values)&&r.values.some(u=>String(a).toLowerCase()===String(u).toLowerCase());let c=Number(a),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(s==="gte")return c>=l;if(s==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${s}`)})}async function Sp(e={},t={}){let n=ee(e.market,"Anvil market"),r=ee(e.collection,"NFT collection"),o=await l7({...e,market:n},t),i=o.ids,s=Math.min(Math.max(Number(e.minStars??4)||4,1),5),a=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=Tn(t),p=(await Ge(i,a,async h=>{try{let g=await de(u,r,Sn,"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>=s),f=(await Ge(p,a,async h=>{try{let g=await Vc({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:ne,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 Ge(i,a,async u=>{try{let[d,p]=await Promise.all([d7(r,u,t),Vc({market:n,collection:r,tokenId:u},t)]),m=pT(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?p7(d,f):e.includeAll===!0?!0:m!=null&&m>=s)?{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:ne,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 fT(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function QN(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 mT(e={}){return{maxMarkets:QN(e,"maxMarkets",li),maxItemsPerMarket:QN(e,"maxItemsPerMarket",li)}}function hT(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function zc(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,s=Number.isSafeInteger(n)&&n>=0&&n===r,a=!!(s&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:s,complete:a,truncated:!a,continuation:a?null:t?.continuation??{offset:i}}}function gT(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(a=>a.complete===!0),s=t.filter(a=>a.complete!==!0).map(a=>({market:a.market,continuation:a.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?s.length?{markets:s}:null:{snapshotEvidenceRequired:!0,...s.length?{markets:s}:{}}:{marketOffset:n}}}async function yT(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=mT(e),o=await xs(e,t),i=hT(o,e,n),s=t.scanCollection||Sp,a=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ge(i,a,async l=>{let u=fT(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 s(d,t);return{...l,status:"ok",scan:p,...zc(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...zc(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:ne,marketCount:i.length,...gT(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 bT(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=mT(e),o=await xs(e,t),i=o.snapshotCoverage?.complete===!0,s=hT(o,e,n),a=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Db,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ge(s,l,async d=>{let p=fT(e,d.collection),m=String(p.slug||a[d.collection]||a[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...zc(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=zc(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),...zc(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:ne,marketCount:s.length,...gT(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 ZN(e,t){return e>t?"ARB":"PASS"}async function f7(e={},t={}){let n=String(e.direction||""),r=Zt(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=ee(e.paymentToken,"Anvil payment token"),i={chainId:ne,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},s={...t,rpcCall:Tn(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||GN)({chainId:ne,tokenIn:Qt,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},s);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:Qt,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||Oh)({...i,tokenIn:Qt,tokenOut:o,amountOut:r.toString()},s);return{direction:n,paymentToken:o,quoteToken:Qt,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 a=await(t.up33QuoteExactIn||WN)({chainId:ne,tokenIn:o,tokenOut:Qt,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},s);if(!a?.error&&a?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:Qt,amountInRaw:r.toString(),amountOutWei:String(a.amountOut),source:`up33:${a.pool}`,venue:a.venue||"up33-v3",tickSpacing:a.tickSpacing,pool:a.pool,quoter:a.quoter,gasEstimate:a.gasEstimate};let c=await(t.uniV4QuoteExactIn||jr)({...i,tokenIn:o,tokenOut:Qt,amountIn:r.toString()},s);return{direction:n,paymentToken:o,quoteToken:Qt,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 eT(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=ee(e.quoteToken,"conversion quote token");if(n!==Qt)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=Zt(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=Zt(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function m7(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 vs(e){return Array.isArray(e)?`[${e.map(vs).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${vs(e[t])}`).join(",")}}`:JSON.stringify(e)}function wT(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:e7("sha256",n).update(vs(r)).digest("hex")}}function h7(e,t){return wT(e,t)}function Bb(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=h7(e,r).mac,s=Buffer.from(o,"hex"),a=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||s.length!==a.length||!nT(s,a))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 g7(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:m7(e,t)}function Rb(e,t,n,r,o,i){let s=g7(e,t,o.calldataHash,o.leg);try{if(!s||typeof s!="object")throw new Error(`${r} evidence is required`);if(Number(s.chainId)!==ne)throw new Error(`${r} evidence chainId mismatch`);if(String(s.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(s.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(s.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 a=String(s.mac||"").toLowerCase(),c=wT(s,i).mac,l=Buffer.from(a,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(a)||l.length!==u.length||!nT(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(s.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(s.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(s.blockHash||"").toLowerCase()!==o.blockHash||String(s.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(s.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&ee(s.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(s.quotedAtMs),p=Number(s.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=s.amountWei??s.amount??s.gasCostWei??s.gasPriceWei,f=Zt(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Er(s.gasLimit,`${r} evidence gasLimit`),g=Er(s.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let y=s.simulation;if(!y||typeof y!="object"||Array.isArray(y))throw new Error(`${r} simulation evidence is required`);if(Number(y.chainId)!==ne)throw new Error(`${r} simulation chainId mismatch`);if(String(y.route||"")!==t||String(y.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(y.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(y.blockHash||"").toLowerCase()!==o.blockHash||String(y.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(y.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(ee(y.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let w=ee(y.sender,`${r} simulation sender`),S=ee(y.owner,`${r} simulation owner`);if(!o.owner||w!==o.owner||S!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Zt(y.valueWei,`${r} simulation valueWei`))!==String(Zt(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(y.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&ee(y.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(y.success!==!0||y.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(y.result??"")))throw new Error(`${r} simulation did not return a successful result`);let v=Number(y.quotedAtMs),k=Number(y.expiresAtMs);if(!Number.isFinite(v)||!Number.isFinite(k)||v>n||k<=n||k<=v)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...s,amountWei:f.toString()},error:null}}catch(a){return{amount:null,evidence:null,error:String(a.message||a)}}}function tT(e){let t=ee(e,"OpenSea payment token");if(t!==$b&&t!==Qt)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Db(e={},t={}){let n=await Sp(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=ee(e.owner,"execution owner")}catch{}let s=(y,b,w,S={})=>({calldataHash:y==null?null:String(y).toLowerCase(),blockNumber:String(b?.blockNumber??""),blockHash:String(b?.blockHash||"").toLowerCase(),leg:w,owner:i,...S}),a=(y,b,w,S,v)=>Rb(e.gasEvidence??e.gasCostEvidence,y,r,`${b} gas`,s(w,S,b,v),o),c=(y,b)=>{let w=null;try{w=ee(y?.target,"conversion target")}catch{}let S=s(y?.calldataHash,y,"conversion",{target:w,valueWei:String(y?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(S.calldataHash)||!/^0x[0-9a-f]{64}$/.test(S.blockHash)||!/^\d+$/.test(S.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let v=Rb(e.conversionGasEvidence??e.conversionGasCostEvidence,b,r,"conversion gas",S,o);if(v.amount!=null||y?.gasEstimate==null)return v;let k=Rb(e.gasPriceEvidence,b,r,"gas price",{...S,leg:"conversion-gas-price"},o);if(k.amount==null)return{amount:null,evidence:null,error:k.error};let A=Zt(y.gasEstimate,"conversion gasEstimate");return{amount:A*k.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:b,leg:"conversion",gasEstimate:A.toString(),gasPriceEvidence:k.evidence},error:null}},l=(y,b,w,S,v)=>{try{let k=String(b?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(k))throw new Error("exact Seaport order hash is required");let A=ee(b?.protocolAddress,"Seaport protocol address"),E=String(b?.executionCalldataHash||"").toLowerCase(),I=/^0x[0-9a-f]{64}$/.test(E)?E:null,N=S==="seaport-fulfillment"&&v===$b?String(b?.priceWei??""):"0",T={orderHash:k,protocolAddress:A,target:A,valueWei:N},D=a(y,S,I,w,T);if(D.amount==null)throw new Error(D.error);if(D.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let X=D.evidence?.approvalRequired;if(typeof X!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof b?.approvalRequired=="boolean"&&b.approvalRequired!==X)throw new Error("Seaport approval requirement evidence mismatch");let H=[D];if(X){let j=String(b?.approvalCalldataHash||"").toLowerCase(),C=/^0x[0-9a-f]{64}$/.test(j)?j:null,B=S==="seaport-offer-acceptance"?n.collection:v;H.push(a(y,"seaport-approval",C,w,{...T,target:B,valueWei:"0"}))}if(v===$b){let j=y==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",C=String(b?.prerequisiteCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(C)?C:null,V=j==="wrap-native-to-weth"?String(b?.sellerNetWei??""):"0";H.push(a(y,j,B,w,{...T,target:Qt,valueWei:V}))}let $=H.find(j=>j.amount==null);if($)throw new Error($.error);return{amount:H.reduce((j,C)=>j+C.amount,0n),evidence:H.map(j=>j.evidence),error:null}}catch(k){return{amount:null,evidence:null,error:String(k.message||k)}}},u=Zt(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Ka,p=t.openSeaBestOffer||Ya,m=t.paymentTokenConversion||(y=>f7({...y,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await wp({market:n.market,collection:n.collection},t),h=[];for(let y of n.candidates){let b=null;try{b=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:y.tokenId},t)}catch{}let w=y.quote,S=Lb(xt.encodeFunctionData("buySpecificNFT",[BigInt(y.tokenId),BigInt(w.totalCostRaw)])).toLowerCase(),v=a("anvil-to-opensea","anvil-call",S,w.evidence.attestation,{target:n.market,valueWei:w.nativeSwapFeeWei}),k=null,A=null;if(b)try{k=tT(b.paymentToken)}catch(C){A=String(C.message||C)}let E=A||!b?{amount:null,evidence:null,error:A||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",b,w.evidence.attestation,"seaport-offer-acceptance",k),I={route:"anvil-to-opensea",tokenId:y.tokenId,stars:y.stars,paymentToken:w.paymentToken,amountUnits:w.amountUnits,anvilTotalCostRaw:w.totalCostRaw,anvilBaseCostRaw:w.baseCostRaw,anvilFeeRaw:w.fees.totalFeeRaw,paymentTokenDecimals:w.paymentTokenDecimals,nativeSwapFeeWei:w.nativeSwapFeeWei,openSeaGrossOfferWei:b?.grossOfferWei==null?null:String(b.grossOfferWei),openSeaSellingValueWei:b?.sellerNetWei==null?null:String(b.sellerNetWei),openSeaFeeWei:b?.feeWei==null?null:String(b.feeWei),openSeaPaymentToken:k,gasCostWei:v.amount==null?null:v.amount.toString(),gasEvidence:v.evidence,marketplaceGasCostWei:E.amount==null?null:E.amount.toString(),marketplaceGasEvidence:E.evidence,conversionGasCostWei:null};if(b?.sellerNetWei==null||!w.available)h.push({...I,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(A)h.push({...I,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${A}`});else if(v.amount==null)h.push({...I,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${v.error}`});else if(E.amount==null)h.push({...I,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({...I,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let C=eT(await m({chainId:ne,direction:"acquire-exact-output",amountRaw:w.totalCostRaw,paymentToken:w.paymentToken,quoteToken:Qt}),{direction:"acquire-exact-output",amountRaw:w.totalCostRaw}),B=c(C,"anvil-to-opensea");if(B.amount==null)h.push({...I,conversion:C,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${B.error}`});else{let V=v.amount+E.amount+B.amount,K=BigInt(b.sellerNetWei)-BigInt(C.amountInWei)-BigInt(w.nativeSwapFeeWei)-V;h.push({...I,conversionGasCostWei:B.amount.toString(),conversionGasEvidence:B.evidence,totalExecutionGasWei:V.toString(),anvilCostInWethWei:C.amountInWei,conversion:C,netWei:K.toString(),decision:ZN(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(C){h.push({...I,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(C.message||C)}`})}let N=null;try{N=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:y.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!N)continue;let T=Lb(xt.encodeFunctionData("sellNFT",[BigInt(y.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),D=a("opensea-to-anvil","anvil-call",T,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),X=null,H=null;try{X=tT(N.paymentToken)}catch(C){H=String(C.message||C)}let $=H?{amount:null,evidence:null,error:H}:l("opensea-to-anvil",N,f.evidence.attestation,"seaport-fulfillment",X),j={route:"opensea-to-anvil",tokenId:y.tokenId,stars:y.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(N.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:X,gasCostWei:D.amount==null?null:D.amount.toString(),gasEvidence:D.evidence,marketplaceGasCostWei:$.amount==null?null:$.amount.toString(),marketplaceGasEvidence:$.evidence,conversionGasCostWei:null};if(H){h.push({...j,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${H}`});continue}if(D.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${D.error}`});continue}if($.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${$.error}`});continue}if(typeof m!="function"){h.push({...j,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let C=eT(await m({chainId:ne,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:Qt}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),B=c(C,"opensea-to-anvil");if(B.amount==null)h.push({...j,conversion:C,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${B.error}`});else{let V=D.amount+$.amount+B.amount,K=BigInt(C.amountOutWei)-BigInt(N.priceWei)-BigInt(f.nativeSwapFeeWei)-V;h.push({...j,conversionGasCostWei:B.amount.toString(),conversionGasEvidence:B.evidence,totalExecutionGasWei:V.toString(),anvilPayoutInWethWei:C.amountOutWei,conversion:C,netWei:K.toString(),decision:ZN(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(C){h.push({...j,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(C.message||C)}`})}}let g=n.complete===!0?h:h.map(y=>y.decision==="ARB"?{...y,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:y);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:ne,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((y,b)=>{let w=BigInt(y.netWei??"-1"),S=BigInt(b.netWei??"-1");return S>w?1:S<w?-1:0}),arbCount:g.filter(y=>y.decision==="ARB").length,exec:!1,readOnly:!0}}async function vp(e={},t={}){let n=Tn(t),r=xr(e.brokerTokenId,"brokerTokenId"),[o,i,s]=await Promise.all([de(n,wn.ammVault,XN,"quoteSpecificBuy",[BigInt(r)]),de(n,wn.ammVault,XN,"inventory",[BigInt(r)]),de(n,wn.nft,Sn,"ownerOf",[BigInt(r)])]),a={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:ee(s[0],"broker owner")===wn.ammVault},c=a.quoteAvailable&&a.inventory&&a.ownerIsAmm;return{provider:"stonkbrokers",chainId:ne,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:a,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function ST(e,t){try{return ee((await de(t,wn.nft,Sn,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return ee((await de(t,wn.nft,Sn,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function vT(e={},t={}){let n=Tn(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ge(Array.isArray(e.candidates)?e.candidates:[],8,async s=>{let a=xr(s.brokerTokenId,"brokerTokenId"),c=xr(s.nestedTokenId,"nestedTokenId"),l=ee(s.tba,"TBA"),u=ee(s.nestedCollection,"nested collection"),d=pT({attributes:s.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([ST(a,n),de(n,u,Sn,"ownerOf",[BigInt(c)]).then(g=>ee(g[0],"nested owner")),vp({brokerTokenId:a},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:a,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:s.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((s,a)=>a.stars-s.stars);return{provider:"stonkbrokers",chainId:ne,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function ET(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=ee(e.buyer,"buyer"),r=xr(e.brokerTokenId,"brokerTokenId"),o=Zt(e.maxTokenCostWei,"maxTokenCostWei"),i=Zt(e.maxEthFeeWei,"maxEthFeeWei"),s=await vp({brokerTokenId:r},t);if(!s.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(s.tokenCostWei)>o||BigInt(s.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return U({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:ne,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:wn.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:s.tokenCostWei,quotedEthFeeWei:s.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function Wc(e={},t={}){let n=Tn(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?wn.overtimeBooster:wn.stockBooster,[i,s,a,c,l,u]=await Promise.all([de(n,o,po,"pendingEth"),de(n,o,po,"minDropWei"),de(n,o,po,"roundActive"),de(n,o,po,"currentRound"),de(n,o,po,"roundState").catch(()=>null),de(n,o,po,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(s[0]),m=!!a[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:ne,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=>ee(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function xT(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?wn.overtimeBooster:wn.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?po.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):po.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return U({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:ne,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:ne,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function AT(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(a=>xr(a,"brokerTokenId")):[],r=Tn(t),o=await Ge(n,8,async a=>{let[c,l]=await Promise.all([de(r,wn.nft,Sn,"ownerOf",[BigInt(a)]).then(u=>ee(u[0],"broker owner")),ST(a,r)]);return{brokerTokenId:a,owner:c,tba:l}}),[i,s]=await Promise.all([Wc({which:"stock"},t),Wc({which:"overtime"},t).catch(a=>({error:String(a.message||a)}))]);return{provider:"stonkbrokers",chainId:ne,owner:e.owner?ee(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:s},exec:!1,readOnly:!0}}async function kT(e={},t={}){try{let n=await xs(e,t);return{ok:!0,chainId:ne,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:ne,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function IT(e={},t={}){try{let n=await Wc({which:"stock"},t);return{ok:!0,chainId:ne,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:ne,error:String(n.message||n).slice(0,180)}}}var ne,yp,t7,n7,r7,Qt,$b,li,o7,YN,i7,s7,wn,xt,a7,rT,XN,Sn,po,_T=_(()=>{q();Xo();Hi();KN();oe();ne=4663,yp="https://anvil.clutch.market",t7=`${yp}/api/markets/snapshot?chainId=${ne}`,n7=`${yp}/api/rpc?chainId=${ne}`,r7=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Qt="0x0bd7d308f8e1639fab988df18a8011f41eacad73",$b="0x0000000000000000000000000000000000000000",li=1e5,o7=256e3,YN=256,i7=3e4,s7=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"}),wn=Object.freeze({chainId:ne,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),xt=new Es(["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"]),a7=new Es(["function allowance(address owner,address spender) view returns (uint256)"]),rT=new Es(["function decimals() view returns (uint8)"]),XN=new Es(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),Sn=new Es(["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)"]),po=new Es(["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)"])});import{createHash as b7}from"node:crypto";function Gc(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 Ub(e,t,n){for(let r of Object.keys(e)){if(x7.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 As(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 NT(e,t,{service:n=!1}={}){let r=As(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 Fb(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 xp(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function qb(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 jb(e){let t=xp(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Fb(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function CT(){let e=[];try{let t=xp(process.env.ORACLE_ERC8004_CHAIN_ID);jb(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 k7(e){return JSON.parse(JSON.stringify(e))}function Ap(e){let t=Gc(e,"registration file");if(Ub(t,S7,"registration"),t.type!==Ep)throw new Error("erc8004: registration-v1 type required");let n={type:Ep,name:As(t.name,"name",128),description:As(t.description,"description",4096),image:NT(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((s,a)=>{let c=Gc(s,`services[${a}]`);Ub(c,v7,`services[${a}]`);let l=As(c.name,`services[${a}].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:NT(c.endpoint,`services[${a}].endpoint`,{service:!0})};c.version!=null&&(d.version=As(c.version,`services[${a}].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[${a}].${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((s,a)=>{let c=Gc(s,`registrations[${a}]`);Ub(c,E7,`registrations[${a}]`);let l=qb(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[${a}].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>OT.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(s=>!OT.has(s)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>A7)throw new Error("erc8004: registration metadata oversized");return k7(n)}function I7(e){if(Gc(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ep)throw new Error("erc8004: registration-v1 type required");return Ap({type:Ep,...e})}function _7(e){let t=Ap(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Kc(e){return BigInt(e).toString(16).padStart(64,"0")}function PT(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Kc(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function O7(e){return`${ui.register}${Kc(32)}${PT(e)}`}function N7(e,t){return`${ui.setAgentURI}${Kc(e)}${Kc(64)}${PT(t)}`}function T7(e,t){return`${e}${Kc(t)}`}function C7(e){return b7("sha256").update(e,"utf8").digest("hex")}function Hb(e,t){Gc(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 RT(e,t,{kind:n,uri:r,selector:o,data:i,id:s}){let a=xp(e.chainId),c=Fb(e.owner,"owner"),l=jb(a),u=Number(t?.nowMs??Date.now());return U({chainId:a,registry:l,owner:c,taker:c,...s==null?{}:{agentId:Number(s)},agentURI:r,agentURIHash:C7(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:a,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function LT(e={},t={}){Hb(e,new Set(["chainId","owner","registration"]));let n=_7(I7(e.registration));return RT(e,t,{kind:"erc8004-register",uri:n,selector:ui.register,data:O7(n)})}function MT(e={},t={}){Hb(e,new Set(["chainId","owner","agentId","agentURI"]));let n=qb(e.agentId),r=$T(e.agentURI);return RT(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:ui.setAgentURI,data:N7(n,r),id:n})}function $T(e){let t=As(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 Ap(o),t}function TT(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 Fb(`0x${e.slice(-40)}`,t)}function P7(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 BT(e={},t={}){Hb(e,new Set(["chainId","agentId"]));let n=xp(e.chainId),r=qb(e.agentId),o=jb(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:T7(d,r)},"latest"]),[s,a,c]=await Promise.all([i(ui.ownerOf),i(ui.tokenURI),i(ui.getAgentWallet)]),l=$T(P7(a,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Ap(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:TT(s,"owner"),tokenURI:l,agentURI:l,agentWallet:TT(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}var Ep,w7,ui,S7,v7,E7,OT,x7,A7,DT=_(()=>{oe();Ep="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",w7=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"}]),ui=Object.freeze(Object.fromEntries(w7.map(e=>[e.name,e.selector]))),S7=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),v7=new Set(["name","endpoint","version","skills","domains"]),E7=new Set(["agentId","agentRegistry"]),OT=new Set(["reputation","crypto-economic","tee-attestation"]),x7=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,A7=64*1024});async function FT(e={}){let t={chainId:UT,rpc:null,dex:null};try{t.rpc=await $i(UT,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Oa("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 qT(e="HYPE",t={}){let r=(await Oa(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 jT(e,t={}){return jn(e,t)}var UT,HT=_(()=>{nr();Ne();UT=999});function zT(e={}){return Te({provider:"magiceden",defaultUrl:M7,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Is(e={}){return zT(e).baseUrl}function di(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function _s(e={}){let t=di(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},zT(e).trusted)}function zb(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 ks(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 $7(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 B7(e){return Math.round(ks(e,"priceSol")*Yc)}function D7(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 U7({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function F7(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=U7(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function VT(e={}){try{let t=await Vb({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!di(e),readTier:"keyless",prepareTier:di(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!di(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Vb(e={},t={}){let n=zb(e.symbol||e.collection),r=await x(`${Is(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:_s(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/Yc:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Yc:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Yc:null,exec:!1,raw:r}}function WT(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*Yc):null,tokenSize:e.tokenSize??1}}async function GT(e={},t={}){let n=zb(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(`${Is(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 s=await x(i.toString(),{headers:_s(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=(Array.isArray(s)?s:[]).map(WT);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:a.length,listings:a,exec:!1}}async function KT(e={},t={}){let n=Pe(e.tokenMint||e.mint,"tokenMint"),r=await x(`${Is(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:_s(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(WT);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function YT(e={},t={}){if(!di(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=Pe(e.buyer||e.userPublicKey,"buyer"),r=Pe(e.seller,"seller"),o=Pe(e.tokenMint,"tokenMint"),i=Pe(e.tokenATA||e.tokenAddress,"tokenATA"),s=Pe(e.auctionHouse,"auctionHouse"),a=ks(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?a:ks(e.maxPriceSol,"maxPriceSol");if(a>c)throw new Error(`magiceden: listing price ${a} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Is(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",s),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await x(l.toString(),{headers:_s(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});yr("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 U({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:a,maxPriceSol:c,lamports:B7(a),transaction:p,transactionEncoding:"base64",raw:u})}async function kp(e={},t={}){if(!di(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=Pe(e.seller||e.userPublicKey,"seller"),r=Pe(e.tokenMint,"tokenMint"),o=Pe(e.tokenATA||e.tokenAddress,"tokenATA"),i=Pe(e.auctionHouse,"auctionHouse"),s=ks(e.priceSol??e.price,"priceSol"),a=D7(e.expiry),c=F7(e,{tokenMint:r,priceSol:s,expiry:a}),l=new URL(`${Is(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(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",Pe(e.sellerReferral,"sellerReferral")),a!=null&&l.searchParams.set("expiry",String(a));let u=await x(l.toString(),{headers:_s(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});yr("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 U({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:s,expiry:a,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function XT(e={},t={}){if(!di(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=Pe(e.buyer||e.userPublicKey,"buyer"),r=zb(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=ks(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:ks(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let s=new URL(`${Is(t)}/instructions/mint`);s.searchParams.set("symbol",r),s.searchParams.set("wallet",n),s.searchParams.set("nftAmount",String(i));let a=await x(s.toString(),{headers:_s(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=$7(a);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`);yr("magiceden",a);let u=a?.v0?.tx?.data??a?.tx?.data??null;if(!Array.isArray(u))throw a?.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 U({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:a})}var M7,Yc,Wb=_(()=>{q();ni();gt();oe();Dd();M7="https://api-mainnet.magiceden.dev/v2",Yc=1e9});function z7(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 Jc(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Ts(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 Xc(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>Os)throw new Error(`hl-staking: ${t} has more than ${Os} decimals`);let i=BigInt(r)*Gb+BigInt((o+"0".repeat(Os)).slice(0,Os)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>H7)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Ns(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Ar(e){let t=BigInt(String(e||"0")),n=t/Gb,r=(t%Gb).toString().padStart(Os,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function QT(e={}){try{let t=await Yb(e);return{ok:t.count>0,provider:"hl-staking",chain:Jc(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 Yb(e={}){let t=await Ce({type:"validatorSummaries"},e),r=(Array.isArray(t)?t:[]).map(o=>({validator:o.validator??null,name:o.name??null,isActive:o.isActive??null,isJailed:o.isJailed??null,commission:o.commission??null,stake:o.stake??null,nRecentBlocks:o.nRecentBlocks??null}));return{provider:"hl-staking",count:r.length,validators:r,exec:!1,raw:t}}async function Xb(e={},t={}){let n=Ts(e.user||e.address,"user"),r=await Ce({type:"delegatorSummary",user:n},t);return{provider:"hl-staking",user:n,delegatedWei:r?.delegated??null,undelegatedWei:r?.undelegated??null,totalPendingWithdrawalWei:r?.totalPendingWithdrawal??null,nPendingWithdrawals:r?.nPendingWithdrawals??null,delegatedHype:r?.delegated!=null?String(r.delegated):null,undelegatedHype:r?.undelegated!=null?String(r.undelegated):null,exec:!1,raw:r}}async function Jb(e={},t={}){let n=Ts(e.user||e.address,"user"),r=await Ce({type:"delegations",user:n},t),o=Array.isArray(r)?r:[];return{provider:"hl-staking",user:n,count:o.length,delegations:o.map(i=>({validator:i.validator??null,amount:i.amount??null,lockedUntilTimestamp:i.lockedUntilTimestamp??null})),exec:!1,raw:r}}async function ZT(e={},t={}){let n=Ts(e.user||e.address,"user"),r=await Ce({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function e1(e={},t={}){let n=Ts(e.user||e.address,"user"),r=await Ce({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Qb(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 Ip(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||j7)}function V7(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ip(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Zb({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:s,caps:a,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:Jc(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:z7(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:V7(i),types:n,primaryType:r,message:o},caps:a||null,notes:s,exec:!1};try{l.localSignerEnvelope=Nd(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,U(l,{provider:"hl-staking",kind:e})}function t1(e={},t={}){let n=Xc(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Xc(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Ar(n)} HYPE exceeds maxHype cap ${Ar(r)} HYPE`);let o=Qb(e),i=Jc(t),s={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ip(t),wei:Ns(n),nonce:o};return Zb({kind:"hype-stake-deposit",action:s,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:Ns(n),nonce:o},opts:t,args:e,caps:{amountHype:Ar(n),maxHype:r?Ar(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 n1(e={},t={}){let n=Xc(e.amountHype??e.amount,"amountHype"),r=Qb(e),o=Jc(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ip(t),wei:Ns(n),nonce:r};return Zb({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:Ns(n),nonce:r},opts:t,args:e,caps:{amountHype:Ar(n)},notes:[`Starts the ${JT} 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 r1(e={},t={}){let n=Ts(e.validator,"validator"),r=Xc(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 s=o?e.isUndelegate:i?e.undelegate:!1,a=e.maxHype==null?null:Xc(e.maxHype,"maxHype");if(!s&&a&&BigInt(r)>BigInt(a))throw new Error(`hl-staking: delegate amount ${Ar(r)} HYPE exceeds maxHype cap ${Ar(a)} HYPE`);let c=Qb(e),l=Jc(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ip(t),validator:n,wei:Ns(r),isUndelegate:s,nonce:c};return Zb({kind:s?"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:Ns(r),isUndelegate:s,nonce:c},opts:t,args:e,caps:{amountHype:Ar(r),maxHype:a?Ar(a):null,validator:n},notes:s?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Kb} 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 ${Kb} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function o1(e={},t={}){let n=Ts(e.user||e.address,"user"),r=await Xb({user:n},t),o=await Jb({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:JT,validatorLockupDays:Kb,exec:!1}}var Os,Gb,j7,JT,Kb,H7,i1=_(()=>{oe();wy();q();Xt();Os=8,Gb=10n**BigInt(Os),j7="0xa4b1",JT=7,Kb=1,H7=2n**64n-1n});async function e0(e={}){let t=Date.now();try{let n=await _n(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}}}function At(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Y7(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Cs(e={},t={}){let[n,r]=await Promise.all([jt(t),_n(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],a=o.map((c,l)=>{let u=i[l]||{},d=At(u.markPx),p=At(u.prevDayPx),m=At(u.openInterest),f=At(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:At(u.oraclePx),midPx:At(u.midPx)??At(r?.[c.name]),prevDayPx:p,change24hPct:Y7(d,p),dayNtlVolumeUsd:At(u.dayNtlVlm),premium:At(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(G7/K7)*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:a.length,markets:a,totals:{openInterestUsd:a.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:a.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function s1(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Cs(e,t),s=(a,c=-1)=>r.filter(l=>l[a]!=null).sort((l,u)=>(l[a]-u[a])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:s("change24hPct"),losers:s("change24hPct",1),byVolume:s("dayNtlVolumeUsd"),byOpenInterest:s("openInterestUsd"),fundingHighest:s("fundingRateAprPct"),fundingLowest:s("fundingRateAprPct",1)}}async function a1(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(),s=i-o,[a,c,l]=await Promise.all([Cs({},t),Sd({coin:n,interval:r,startTime:s,endTime:i},t).catch(()=>[]),as(n,t).catch(()=>null)]),u=a.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:At(h.o),high:At(h.h),low:At(h.l),close:At(h.c),volume:At(h.v)})),p=l?.levels??[],m=At(p?.[0]?.[0]?.px),f=At(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 c1(e={},t={}){let n=await vd(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}))}}var G7,K7,t0=_(()=>{Xt();G7=24*365,K7=8});var Qc,l1=_(()=>{Qc=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"})});import{Interface as n0,getAddress as g1,isAddress as J7}from"ethers";function Rs(e){let t=Number(e??42161),n=d1[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(d1).join(", ")})`);return{chainId:t,...n}}function Op(e,t={}){let n=Rs(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function vn(e,t){if(!J7(e))throw new Error(`${t} must be a valid EVM address`);return g1(e)}function he(e){return g1(e).toLowerCase()}function Ps(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 pi(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 tW(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 nW(e){let t=String(e||"marketIncrease").trim();if(!(t in f1))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:f1[t]}}function rW(e){let t=String(e||"noSwap").trim();if(!(t in m1))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:m1[t]}}function oW(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function iW(e,t){let n=he(t);return e.find(r=>he(r.marketToken||r.market||r.address)===n)||null}function sW(e,t){let n=he(t);return e.find(r=>he(r.tokenAddress||r.address)===n)||null}function aW({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Ps(e?.minPrice,"gmx minPrice"),i=Ps(e?.maxPrice,"gmx maxPrice"),s=BigInt(r),a=10000n;return n==="marketIncrease"?(t?i*(a+s)/a:o*(a-s)/a).toString():(t?o*(a-s)/a:i*(a+s)/a).toString()}function cW(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function lW(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Vn(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 uW(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:Vn(t,"account",s=>he(s)),market:Vn(t,"market",s=>he(s)),initialCollateralToken:Vn(t,"initialCollateralToken",s=>he(s)),key:Vn(o,"key",s=>String(s).toLowerCase()),reason:Vn(i,"reason",s=>String(s)),sizeDeltaUsd:Vn(n,"sizeDeltaUsd",s=>BigInt(s).toString()),initialCollateralDeltaAmount:Vn(n,"initialCollateralDeltaAmount",s=>BigInt(s).toString()),executionFee:Vn(n,"executionFee",s=>BigInt(s).toString()),acceptablePrice:Vn(n,"acceptablePrice",s=>BigInt(s).toString()),isLong:Vn(r,"isLong",s=>!!s)}}function dW(e={},t){if(he(e.address)!==he(t.eventEmitter))return null;let n;try{n=Z7.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=eW[r];if(!o)return null;let i=uW(n.args.eventData||{}),s=(i.key||String(n.args.topic1||"")).toLowerCase(),a=i.account||lW(n.args.topic2);return{eventName:r,status:o,orderKey:s,account:a?he(a):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 h1(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function pW(e=[],{chainId:t}={}){let n=Rs(t);return(Array.isArray(e)?e:[]).map(r=>dW(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function b1(e={},t={}){return x(`${Op(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function r0(e={},t={}){return x(`${Op(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function w1(e={},t={}){return x(`${Op(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fo(e={},t={}){return x(`${Op(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function S1(e={}){let t=await fo({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function v1(e={},t={}){let n=Rs(e.chainId??42161),r=vn(e.account||e.owner||e.user,"gmx account"),o=pi(e.start??0,"gmx start"),i=pi(e.end??e.limit??20,"gmx end"),s=y1.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||J)(n.chainId,"eth_call",[{to:n.reader,data:s},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:he(n.reader),dataStore:he(n.dataStore),account:he(r),raw:c}}async function E1(e={},t={}){let n=Rs(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=y1.encodeFunctionData("getOrder",[n.dataStore,r]),s=await(t.rpcCall||J)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:he(n.reader),dataStore:he(n.dataStore),key:r,raw:s}}async function x1(e={},t={}){let n=Rs(e.chainId??42161),r=t.receipt||await Ia({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=pW(r.logs||[],{chainId:n.chainId}),s=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,a=s?i.filter(u=>u.orderKey===s):i;if(a.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:s?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=a.reduce((u,d)=>h1(d.status)>=h1(u.status)?d:u,a[0]),l=e.expectedAccount||e.account?he(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:he(n.eventEmitter),events:a,receipt:r}}async function Np(e={},t={}){let n=Rs(e.chainId??42161),r=nW(e.orderType||e.type),o=rW(e.decreasePositionSwapType),i=vn(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),s=vn(e.receiver||i,"gmx receiver"),a=vn(e.cancellationReceiver||s,"gmx cancellationReceiver"),c=e.callbackContract?vn(e.callbackContract,"gmx callbackContract"):p1,l=e.uiFeeReceiver?vn(e.uiFeeReceiver,"gmx uiFeeReceiver"):p1,u=vn(e.market||e.marketToken,"gmx market"),d=vn(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Ps(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):pi(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=Ps(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=Ps(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 y=tW(e.maxSlippageBps??e.slippageBps,50),b=e.isLong==null?!0:!!e.isLong,[w,S]=await Promise.all([r0({chainId:n.chainId},t),fo({chainId:n.chainId},t)]),v=iW(oW(w,"markets"),u);if(!v)throw new Error("gmx market not found in public registry");if(v.isListed===!1)throw new Error("gmx market is not listed");let k=vn(v.indexToken,"gmx market indexToken"),A=vn(v.longToken,"gmx market longToken"),E=vn(v.shortToken,"gmx market shortToken"),I=he(d);if(![he(A),he(E)].includes(I))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let N=cW(v,b);if(N>0n&&m>N)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=sW(S,k);if(!T)throw new Error("gmx index ticker not found");let D=e.acceptablePrice?Ps(e.acceptablePrice,"gmx acceptablePrice").toString():aW({ticker:T,isLong:b,typeKey:r.key,maxSlippageBps:y}),X=(e.swapPath||[]).map($t=>vn($t,"gmx swapPath market"));if(X.length>3)throw new Error("gmx swapPath too long for guarded slice");let H=pi(e.triggerPrice??"0","gmx triggerPrice"),$=pi(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=pi(e.minOutputAmount??"0","gmx minOutputAmount"),C=pi(e.validFromTime??"0","gmx validFromTime"),B=!!e.shouldUnwrapNativeToken,V=e.autoCancel==null?!0:!!e.autoCancel,K=String(e.referralCode||Q7);if(!/^0x[0-9a-fA-F]{64}$/.test(K))throw new Error("gmx referralCode must be bytes32 hex");let Oe=Array.isArray(e.dataList)?e.dataList:[];for(let $t of Oe)if(!/^0x[0-9a-fA-F]{64}$/.test(String($t)))throw new Error("gmx dataList entries must be bytes32 hex");let Ee={addresses:{receiver:s,cancellationReceiver:a,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:X},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt(D),executionFee:f,callbackGasLimit:$,minOutputAmount:j,validFromTime:C},orderType:r.code,decreasePositionSwapType:o.code,isLong:b,shouldUnwrapNativeToken:B,autoCancel:V,referralCode:K,dataList:Oe},xe=[];r.key==="marketIncrease"&&p>0n&&xe.push(_p.encodeFunctionData("sendTokens",[d,n.orderVault,p])),xe.push(_p.encodeFunctionData("sendWnt",[n.orderVault,f])),xe.push(_p.encodeFunctionData("createOrder",[Ee]));let qe=_p.encodeFunctionData("multicall",[xe]),un={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:he(i),receiver:he(s),exchangeRouter:he(n.exchangeRouter),router:he(n.router),orderVault:he(n.orderVault),market:he(u),indexToken:he(k),initialCollateralToken:he(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:D,maxSlippageBps:y,isLong:b,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return U({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:he(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:he(d),spender:he(n.router),amount:p.toString()}:null,gmxGuard:un,transaction:{chainId:n.chainId,from:he(i),to:he(n.exchangeRouter),data:qe,value:f.toString(),gmxGuard:un}},{provider:"gmx",kind:"gmx-order"})}var u1,d1,p1,Q7,f1,m1,_p,y1,Z7,eW,Tp=_(()=>{q();Ne();oe();u1=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),d1=Object.freeze({42161:{name:"arbitrum",api:u1[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:u1[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),p1="0x0000000000000000000000000000000000000000",Q7=`0x${"0".repeat(64)}`,f1=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),m1=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),_p=new n0(["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"]),y1=new n0(["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)"]),Z7=new n0(["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)"]),eW=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"})});import{mkdirSync as mW,readFileSync as hW,readdirSync as gW,renameSync as yW,writeFileSync as bW}from"node:fs";import{homedir as wW}from"node:os";import{join as Pp}from"node:path";function Le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ls(e){return e==null||e===0?0:e>0?1:-1}function Zc(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function EW(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Pp(wW(),".config","oracle")}function I1(e={}){return Pp(EW(e),"hl-entry-states")}function Cp(e,t,n){return n==null&&e.push(t),n}function xW(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(s=>String(s?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function kr(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function AW(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(s=>({t:Le(s.time),rate:Le(s.fundingRate)})).filter(s=>s.t!=null&&s.rate!=null).sort((s,a)=>s.t-a.t);if(!o.length)return kr("hl-info.fundingHistory","empty");let i=0;for(let s=1;s<o.length;s+=1)Ls(o[s].rate)!==Ls(o[s-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 kW(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return kr("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let s=i.circulating||{},a=Le(s.peggedUSD??s.usd??i.circulatingPrevDay?.peggedUSD);a!=null&&(r+=a,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:kr("defillama.stablecoins","no peggedUSD")}function A1(e,t){let n=Le(e);if(n==null)return null;if(t!=null&&t>0){for(let r of[1,1e12,1e22,1e30]){let o=n/r;if(o>t*.5&&o<t*1.5)return o}return null}return n>1e20?n/1e22:n>1e12?n/1e30:n}function IW(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),s=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],a=o.find(p=>s.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!a)return kr("gmx.tickers","no matching symbol");let c=A1(a.minPrice,n),l=A1(a.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return kr("gmx.tickers","unreadable price");let d=n!=null&&n>0?Zc(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?kr("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(a.tokenSymbol||a.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function _W({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?kr("hl-info.fundingHistory","not fetched"):AW(r,{coin:e,asOfMs:n}),llamaStables:o==null?kr("defillama.stablecoins","not fetched"):kW(o,n),gmxTicker:i==null?kr("gmx.tickers","not fetched"):IW(i,{coin:e,hlMark:t,asOfMs:n})}}function k1(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let a of r){let c=Le(a?.px),l=Le(a?.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 s=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:s}}function OW(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 s=Le(i.szi),a=Le(i.positionValue)!=null&&s?Math.abs(Le(i.positionValue)/s):null,c=Le(i.entryPx),l=Le(i.liquidationPx),u=s==null?null:s>0?"long":s<0?"short":null,d=null,p=a??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 s==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:s,entryPx:c,liquidationPx:l,leverage:Le(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function NW({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:s=Date.now(),fundingHistory:a=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:mo,venue:"hyperliquid",coin:null,asOfMs:s,unknown:["coin"],verdict:"no"};let d=xW(n,e);if(!d)return{schema:mo,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:s,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Cp(u,"markPx",Le(m.markPx)),h=Cp(u,"oraclePx",Le(m.oraclePx)),g=Le(m.midPx),y=Le(m.premium),b=Cp(u,"fundingRate",Le(m.funding)),w=Cp(u,"openInterestCoin",Le(m.openInterest)),S=Le(m.dayNtlVlm),v=Array.isArray(m.impactPxs)?m.impactPxs:[],k=Le(v[0]),A=Le(v[1]),E=b==null?null:b*(vW/SW)*100,I=w==null||f==null?null:w*f,N=i==null||i===0||w==null?null:(w-i)/i*100;N==null&&u.push("oiDeltaPct");let T=r?.levels,D=Array.isArray(T)?T[0]:[],X=Array.isArray(T)?T[1]:[],H=Le(D?.[0]?.px),$=Le(X?.[0]?.px);H==null&&u.push("book.bidPx"),$==null&&u.push("book.askPx");let j=k1(X,Number(t)||0,"buy"),C=k1(D,Number(t)||0,"sell");j.fillable||u.push("book.buyFillable"),C.fillable||u.push("book.sellFillable");let B=g??f,V=j.avgFillPx==null||B==null?null:Zc(j.avgFillPx,B),K=C.avgFillPx==null||B==null?null:Zc(B,C.avgFillPx),Oe=OW(o,e);for(let un of Oe.unknown||[])u.push(un);let Ee=Le(m.prevDayPx),xe=f==null||Ee==null||Ee===0?null:(f-Ee)/Ee*100;xe==null&&u.push("change24hPct");let qe=_W({coin:String(p.name),hlMark:f,asOfMs:s,fundingHistory:a,llamaStables:c,gmxTickers:l});return qe.fundingPath.unknown&&u.push("overlays.fundingPath"),qe.llamaStables.unknown&&u.push("overlays.llamaStables"),qe.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:mo,venue:"hyperliquid",coin:String(p.name),asOfMs:s,markPx:f,oraclePx:h,midPx:g,premium:y,markOracleBps:Zc(f,h),fundingRate:b,fundingAprPct:E,openInterestCoin:w,openInterestUsd:I,oiDeltaPct:N,dayNtlVolumeUsd:S,change24hPct:xe,impactBidPx:k,impactAskPx:A,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:$,spreadBps:H==null||$==null?null:Zc($,H),notionalUsd:Number(t)||0,buy:j,sell:C,buySlipBps:V,sellSlipBps:K},position:Oe,overlays:qe,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function _1(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 s=n==="long"?e.book?.buy:e.book?.sell;if(!s)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!s.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${s.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 a=e.position?.liqDistancePct;e.position?.present?a==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:a<5?"counter":"aligned",note:`${a.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 TW(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 CW({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==mo||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=TW(n),s=_1(e,t);if(!s.side)throw new Error("entry snapshot refused: side must be long or short");let a={schema:mo,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:s.side,receipt:i,see:e,qualify:s,actionMode:Qc.ALERT_ONLY},c=I1({...o,configDir:r||o.configDir});mW(c,{recursive:!0,mode:448});let l=Pp(c,`${a.id}.json`),u=`${l}.${process.pid}.tmp`;return bW(u,`${JSON.stringify(a,null,2)}
|
|
10
10
|
`,{mode:384}),yW(u,l),a}function o0(e={}){let t=I1(e),n=[];try{n=gW(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(hW(Pp(t,r),"utf8")))}function PW(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Qc.ALERT_ONLY};let r=e.see,o=t;Ls(r.fundingRate)!==Ls(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),Ls(r.premium)!==Ls(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,s=o.position?.liqDistancePct;i!=null&&s!=null&&(s<5||s<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:s});let a=e.side,c=a==="long"?r.book?.buy:r.book?.sell,l=a==="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:mo,id:e.id,coin:e.see.coin,side:e.side,actionMode:Qc.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function O1(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await jt(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 el(e={},t={}){let n=e.coin,r=Le(e.notionalUsd)??1e4,o=Date.now(),[i,s,a,c,l,u]=await Promise.all([jt(t),n?as(n,t).catch(()=>null):Promise.resolve(null),e.user?cs(e.user,t).catch(()=>null):Promise.resolve(null),n?nI({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),od({},t).catch(()=>null),fo({chainId:42161},t).catch(()=>null)]);return NW({coin:n,notionalUsd:r,meta:i,book:s,userState:a,priorOiCoin:Le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function N1(e={},t={}){let n=e.see&&e.see.schema===mo?e.see:await el(e,t);return{see:n,..._1(n,e.side)}}async function T1(e={},t={}){let n=e.see&&e.see.schema===mo?e.see:await el(e,t);return CW({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function C1(e={},t={}){let n=e.locked||o0(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Qc.ALERT_ONLY};let r=await el({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return PW(n,r)}var mo,SW,vW,P1=_(()=>{l1();Wo();Tp();Xt();mo="oracle.hl.entry-state.v1",SW=8,vW=24*365});async function R1(e={}){let t=await tc(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function L1(e={},t={}){let n=e.coin,r=e.outcome==null?null:Jr(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=$1(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=i0(i)));let s=n==null?null:Qr(n);if(n!=null&&!s)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??s?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await tc(t))?.outcomes||[]).find(f=>{try{return Jr(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=i0(p);if(i!=null&&i!==m)throw new Error("hl-outcome: sideName does not match outcome side");if(s&&s.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=Jr(r,i).coin}if(s=Qr(n),!s)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&s.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&s.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let a=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,a==null?delete c.side:c.side=a,to(c,t)}async function M1(e={},t={}){let n=e.coin,r=e.outcome==null?null:Jr(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=$1(e.outcomeSide):(o=e.side,o!=null&&(o=i0(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Jr(r,o).coin}let i=Qr(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 s={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete s.side,dc(s,t)}function $1(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function i0(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")}var B1=_(()=>{Xt();Od();pc()});function MW(e){let t=typeof e=="bigint"?e:gn(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 D1(e,t){let n=gn(e.makerAmount,"poly: makerAmount"),r=gn(e.takerAmount,"poly: takerAmount");return MW(t==="BUY"?n:r)}var Sme,U1=_(()=>{ls();Sme="0x"+"00".repeat(32)});function q1(e){let t=String(e||"").replace(/\/$/,"");if(!$W.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function j1(e){let t=hn(e,"poly: exchange").toLowerCase();if(!BW.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function H1(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=F1(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(hn(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(q1(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(j1(o.verifyingContract),j1(n.exchange),hn(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==hn(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?UW:DW;if(hn(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let s=n.message||n.value;if(!s||typeof s!="object")throw new Error("poly: signed order message required");let a=n.types?.Order;if(!Array.isArray(a)||a.length!==tl.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let A=0;A<tl.length;A+=1)if(a[A]?.name!==tl[A][0]||a[A]?.type!==tl[A][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(hn(s.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(hn(s.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(s.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof s.builder!="string"||s.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(s.side!==0&&s.side!==1)throw new Error("poly: side must be BUY or SELL");let l=F1(n.tokenId,"tokenId",80);if(hn(s.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(s.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=gn(s.makerAmount,"poly: makerAmount"),m=gn(s.takerAmount,"poly: takerAmount"),f=gn(n.makerAmount,"poly: prepared makerAmount"),h=gn(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,y=d==="BUY"?m:p,b=rt(n.quantity,6,"poly: quantity");if(b<=0n||b!==y)throw new Error("poly: quantity must match CLOB v2 amounts");let w=rt(n.price,6,"poly: price");if(w<=0n||w>=1000000n)throw new Error("poly: price must be within (0,1)");if(y*w!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(rt(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=D1(s,d);if(rt(v,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let k=t.maxNotionalUsd??t.maxNotionalUsdc;if(k!=null){let A=rt(k,6,"poly: maxNotionalUsd");if(g>A)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:v,submitTo:q1(n.submitTo)})}var $W,tl,Ame,BW,DW,UW,F1,z1=_(()=>{U1();ls();$W=new Set(["https://clob.polymarket.com/order"]),tl=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Ame=Object.freeze(tl.map(e=>e[0])),BW=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),DW="0xe111180000d2663c0091e4f400237545b87b996b",UW="0xe2222d279d744050d28e00520010520000310f59",F1=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e}});function FW(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 V1(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)),s={version:1,surface:"poly",action:"order",owner:FW({...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 H1(s,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),s}var W1=_(()=>{z1()});import{createHmac as Cme,randomInt as qW}from"node:crypto";import{keccak256 as Rme,concat as Lme,zeroPadValue as Mme,getCreate2Address as $me,AbiCoder as Bme}from"ethers";function Rp(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Lp(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function Y1(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Q1(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function WW(e,t,n,r){let o=Q1(Number(n),r.price);if(e==="BUY"){let c=Lp(Number(t),r.size),l=c*o;return Rp(l)>r.amount&&(l=Y1(l,r.amount+4),Rp(l)>r.amount&&(l=Lp(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let s=Lp(Number(t),r.size),a=s*o;return Rp(a)>r.amount&&(a=Y1(a,r.amount+4),Rp(a)>r.amount&&(a=Lp(a,r.amount))),{rawMakerAmt:s,rawTakerAmt:a}}function X1(e){let t=Number(e).toFixed(s0),[n,r=""]=t.split(".");return(n+r.padEnd(s0,"0").slice(0,s0)).replace(/^0+/,"")||"0"}function GW(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:s,negRisk:a=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=G1,builder:p=G1}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!s)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=K1[String(c)]||K1["0.01"],g=Q1(m,h.price),{rawMakerAmt:y,rawTakerAmt:b}=WW(n,f,g,h),w=X1(y),S=X1(b),v=String(qW(1,2**31-1)),k=Date.now().toString(),A=n==="BUY"?0:1,E=a?HW:jW,I={salt:v,maker:i,signer:s,tokenId:String(t),makerAmount:w,takerAmount:S,side:A,signatureType:u,timestamp:k,metadata:d,builder:p},N={...zW,verifyingContract:E},T=n==="BUY"?y:b;return{domain:N,types:VW,value:I,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?b:y),notionalUsdc:T,exchange:E,negRisk:a}}function Z1(){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 eC(e={},t={}){let n=GW(e),r={provider:"poly-clob",kind:"poly-order",chainId:J1,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=V1(r,e,t)}catch{r.oraclePrepared=!1}return U(r,{provider:"poly-clob",kind:"poly-order"})}var J1,jW,HW,G1,s0,zW,VW,K1,tC=_(()=>{oe();W1();J1=137,jW="0xE111180000d2663C0091e4f400237545B87B996B",HW="0xe2222d279d744050d28e00520010520000310F59",G1="0x0000000000000000000000000000000000000000000000000000000000000000",s0=6,zW={name:"Polymarket CTF Exchange",version:"2",chainId:J1},VW={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"}]},K1={"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}}});import{existsSync as rC,readFileSync as YW}from"node:fs";import{dirname as nC,join as a0}from"node:path";import{fileURLToPath as XW}from"node:url";function JW(e){let t=nC(XW(e));for(let n=0;n<8;n+=1){let r=a0(t,"package.json");if(rC(r))try{let i=JSON.parse(YW(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=nC(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Mp(e,t){let n=JW(t),r=a0(n,e);return rC(r)?r:a0(n,"dist","assets",e)}var c0=_(()=>{});import{isAddress as QW}from"ethers";function eG(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:oC,tag:`v${oC}`}),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 $p(e){let t=fi[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function nl(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function rl(e,t){let n=String(e||"");if(!QW(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function iC(e,t){let n=$p(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,s,a]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");nl(i,"safe-erc20: supply"),rl(s,"safe-erc20: initialHolder"),rl(a,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,s,a,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(nl(i,"safe-erc721-drop: cap"),rl(s,"safe-erc721-drop: treasury"),nl(a,"safe-erc721-drop: mintPrice"),nl(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");rl(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;rl(r,"safe-vesting: beneficiary");for(let[s,a]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(s);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${a} must be uint64`)}nl(i,"safe-vesting: durationSeconds")}return n}function sC(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var oC,ZW,fi,Bp=_(()=>{oC="5.0.2",ZW={"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"]}};fi=Object.freeze(Object.fromEntries(Object.entries(ZW).map(([e,t])=>[e,eG(e,t)])))});import{spawnSync as lC}from"node:child_process";import{existsSync as aC,mkdtempSync as tG,readFileSync as nG,rmSync as rG}from"node:fs";import{tmpdir as oG}from"node:os";import{join as l0}from"node:path";function uC(e){let t=e.HOME||"";return`${t}/.local/bin:${t}/.foundry/bin:${e.PATH||""}`}function cG(e=process.env){return e.SLITHER_BIN?e.SLITHER_BIN:lC("slither",["--version"],{encoding:"utf8",env:{...e,PATH:uC(e)}}).status===0?"slither":null}function cC(e){return String(e||"").split(`
|