@oracle-agent/oracle 0.28.29 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/assets/skills/oracle-action-semantics/SKILL.md +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +15 -21
- package/dist/bin/oracle-gateway.mjs +39 -39
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +10 -10
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/cli/commands/chat.mjs +161 -161
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +138 -139
- package/dist/cli/commands/farm.mjs +22 -22
- package/dist/cli/commands/follow.mjs +14 -14
- package/dist/cli/commands/model.mjs +165 -165
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/resolve.mjs +6 -6
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +13 -13
- package/dist/cli/commands/snipe.mjs +8 -8
- package/dist/cli/commands/strategy.mjs +3 -3
- package/dist/cli/commands/swap.mjs +17 -17
- package/dist/cli/commands/venues.mjs +3 -3
- package/dist/data/desk-data.mjs +21 -21
- package/dist/data/names.mjs +2 -2
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +32 -32
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +10 -10
- package/dist/nft/universal-mint-router.mjs +3 -3
- package/dist/router/index.mjs +2 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +3 -3
- package/package.json +1 -1
package/dist/data/desk-data.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
var Ck=Object.defineProperty;var Ee=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Es=(e,t)=>{for(var n in t)Ck(e,n,{get:t[n],enumerable:!0})};import cn from"node:net";import
|
|
2
|
-
`),c=Lk("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function zk(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,mp):Math.min(250*2**e,mp)+Math.floor(Math.random()*100)}function Rr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Os(e,t,n){return Rr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Lr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Wk(e){return e?e.byteLength??e.length??0:0}async function hp(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Lr(e),!r))throw Os(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!r)throw Os(n,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let s=[],c=0,l=!1;try{for(;;){let{value:d,done:p}=await a.read();if(p)break;if(d&&(s.push(Buffer.from(d)),c+=Wk(d),c>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Os(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function gp(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Gk(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:s,untrustedUrl:c=!1,maxResponseBytes:l=null,importUndici:u,validateResponse:d}){let p=new AbortController,f=setTimeout(()=>p.abort(),i),m=null,h=t,b=a?{lookupFn:a}:{};if(c&&!s&&!Ps(h))throw Rr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let x=async(w,{status:g=null}={})=>{let y=await _s(w,b);if(!y.ok)throw Rr(g==null?`HTTP refused ${w}: ${y.error}`:`HTTP redirect to ${w} ${y.error}`,g==null?{}:{status:g});let v=new URL(w).hostname;if(s){if(m&&(await m.close(),m=null),!m)try{m=await Ts({requireUndici:!0,...u?{importUndici:u}:{}})}catch(S){throw Rr(g==null?`HTTP refused ${w}: ${S?.message||S}`:`HTTP redirect to ${w} refused: ${S?.message||S}`,g==null?{}:{status:g})}m.pin(v,y.addresses),h=m.fetch}else up(h,v,y.addresses);return y};try{let w=String(e),g={...r||{}};c&&await x(w);for(let y=0;y<=fp;y+=1){let v=await h(w,{method:n,headers:g,body:o,signal:p.signal,redirect:"manual"});if(Mk.has(v.status)){if(n!=="GET"&&n!=="HEAD"){let C=await hp(v,l??Fk,{url:w,truncate:!0}),L=new Error(`HTTP ${v.status} ${n} ${w} redirected non-idempotent request`);throw L.status=v.status,L.body=gp(C)??C.slice(0,300),L}if(y===fp)throw Lr(v),new Error(`HTTP redirect loop for ${e}`);let I=v.headers?.get?.("location"),_;try{_=qk(I,w)}catch(C){throw Lr(v),C}let T=!Hk(_,w);if(Lr(v),T&&(g=Dk(g)),c)await x(_,{status:v.status});else if(T){let C=await _s(_,b);if(!C.ok){let L=new Error(`HTTP redirect from ${w} ${C.error}`);throw L.status=v.status,L.retryable=!1,L}s&&C.addresses?.length&&(m||(m=await Ts(u?{importUndici:u}:{})),m&&(m.pin(new URL(_).hostname,C.addresses),h=m.fetch))}w=_;continue}if(typeof d=="function")try{await d(v,{url:w})}catch(I){throw Lr(v),Rr(I?.message||String(I))}let S=await hp(v,l,{url:w,onOversize:()=>p.abort()}),E=gp(S);if(!v.ok){let I=new Error(`HTTP ${v.status} ${n} ${w}`);throw I.status=v.status,I.retryAfter=v.headers?.get?.("retry-after")??null,I.body=E??S.slice(0,300),I}return E??S}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.close()}}async function k(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},a=t.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let s=Number.isInteger(t.retries)?Math.max(t.retries,0):Bk,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=Number(t.maxResponseBytes),m=Number.isFinite(f)&&f>0?Math.floor(f):null,h=async()=>{let y;for(let v=0;v<=s;v++)try{return await Gk(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:m,importUndici:d,validateResponse:p})}catch(S){y=S;let E=S?.status,I=S?.name==="AbortError",_=new Set([408,425,429]),T=S?.retryable===!1?!1:E!=null?_.has(E)||$k.has(E)&&pp.has(o):!I&&pp.has(o);if(v===s||!T)throw S;await Vk(zk(v,S?.retryAfter))}throw y};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let x=jk(o,e,i,{untrustedUrl:u,maxResponseBytes:m}),w=Ns.get(x);if(w)return w;let g=h().finally(()=>Ns.delete(x));return Ns.set(x,g),g}async function xe(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Me(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;a<r.length;){let s=a++;i[s]=await n(r[s],s)}})),i}var $k,pp,Bk,mp,yp,Mk,fp,Fk,Ns,Vk,$=Ee(()=>{dp();$k=new Set([408,425,429,500,502,503,504]),pp=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Bk=2,mp=4e3,yp=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Mk=new Set([301,302,303,307,308]),fp=3,Fk=64*1024;Ns=new Map;Vk=e=>new Promise(t=>setTimeout(t,e))});function Ls(e){return bp.get(Number(e))||null}function wp(e,t=process.env){let n=Ls(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function xp(e){return bp.has(Number(e))}var Rs,bp,vp=Ee(()=>{Rs={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},bp=new Map(Object.values(Rs).map(e=>[e.chainId,e]))});var fi={};Es(fi,{PUBLIC_RPC_FALLBACKS:()=>Bs,erc20Allowance:()=>Us,erc20BalanceOf:()=>Br,resolveRpcUrl:()=>Ms,rpcBlockNumber:()=>$r,rpcCall:()=>U,rpcChainId:()=>Fs,rpcGasPrice:()=>Zk,rpcGetBalance:()=>ln,rpcHealth:()=>Fn,rpcHealthAll:()=>Ds,transactionReceipt:()=>Mr});import{Interface as Kk,getAddress as Yk}from"ethers";function Bt(e,t){try{return Yk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Xk(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function $s(e){return e==null?null:Number.parseInt(String(e),16)}function Ms(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=wp(e,n);return r||Bs[Number(e)]||null}function Jk(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Qk.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function U(e,t,n=[],r={}){let o=String(t||"");Jk(o);let i=Ms(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await k(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function Fn(e,t={}){let n=await U(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await U(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Ls(e)?.name||null}}async function $r(e,t={}){let n=await U(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Fs(e,t={}){let n=await U(e,"eth_chainId",[],t);return parseInt(n,16)}async function Zk(e,t={}){let n=await U(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function ln(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await U(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Us(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Bt(e.token||e.tokenAddress,"token"),o=Bt(e.owner,"owner"),i=Bt(e.spender,"spender"),a=mi.encodeFunctionData("allowance",[o,i]),s=await U(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=mi.decodeFunctionResult("allowance",s),l=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Br(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Bt(e.token||e.tokenAddress,"token"),o=Bt(e.account||e.owner||e.address,"account"),i=mi.encodeFunctionData("balanceOf",[o]),a=await U(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=mi.decodeFunctionResult("balanceOf",a),c=BigInt(s[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Mr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Xk(e.txHash||e.hash||e.transactionHash),o=await U(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=$s(o.status),a=i===1,s=i===1?"success":i===0?"reverted":"unknown",c=a?null:s==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?Bt(e.expectedTo,"expectedTo"):null,u=o.to?Bt(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:s,reason:c,statusCode:i,to:u,from:o.from?Bt(o.from,"receipt.from"):null,blockNumber:$s(o.blockNumber),transactionIndex:$s(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Ds(e={}){let t=e.chainIds||Object.values(Rs).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!xp(r)&&!Bs[r]&&!Ms(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Fn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var mi,Bs,Qk,he=Ee(()=>{$();vp();mi=new Kk(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Bs={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"};Qk=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{createHash as gE,createHmac as yE,timingSafeEqual as oM}from"node:crypto";function Vs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Vs).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Vs(e[n])}`).join(",")}}`}function Op(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Rp(e=process.env){return Op(process.env)||Op(e)}function xE(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function dn(e){let t=xE(e);return gE("sha256").update(Vs(t)).digest("hex")}function vE(e,t=Rp()){return t?yE("sha256",t).update(String(e)).digest("hex"):""}function N(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let a=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(a&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let s={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:a?e.oraclePrepared:!0};if(!s.provider)throw new Error("stampPrepared: provider required");if(!s.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Ws:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>wE)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:bE},f=dn(p),m=Rp(r),h=m?vE(f,m):void 0,b={...p,prepareHash:f};return h&&(b.prepareMac=h),b}var bE,Ws,wE,Z=Ee(()=>{bE=2,Ws=300*1e3,wE=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function MI({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"?BI:$I}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=MI(t);return k(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Mm(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 St(e={}){return ce({type:"allMids"},e)}async function jn(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ce({type:"l2Book",coin:String(e)},t)}async function eo(e={}){return ce({type:"outcomeMeta"},e)}async function Li(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ce({type:"spotClearinghouseState",user:e},t)}async function Fm(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ce({type:"userFills",user:e},t)}async function Um(e={}){return ce({type:"meta"},e)}async function Qe(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ce(t,e)}async function $i({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 Dm({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 qm(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ce({type:"openOrders",user:e},t)}async function Hm(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ce({type:"frontendOpenOrders",user:e},t)}async function zn(e,t={}){if(!e)throw new Error("hlUserState requires user");return ce({type:"clearinghouseState",user:e},t)}async function Bi(e={}){return ce({type:"spotMeta"},e)}var $I,BI,at=Ee(()=>{$();$I="https://api.hyperliquid.xyz/info",BI="https://api.hyperliquid-testnet.xyz/info"});async function Xm(e={}){let t=Date.now();if(io.dexs&&t-io.at<6e4&&!e.fetchImpl)return io.dexs;let n=await ce({type:"perpDexs"},e);return io={at:t,dexs:Array.isArray(n)?n:[]},io.dexs}async function Qm(e="",t={}){let n=e||"",r=Date.now(),o=Ym.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ce({type:"metaAndAssetCtxs",dex:e},t):await Qe(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return Ym.set(n,c),c}function Dt(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=Jm+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Ut(e,t){let n=Rc(e),r=Rc(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=Jm+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 Rc(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 Lc(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Dt(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Ut(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:GI(e.outcomeSide,"outcomeSide"),p=u??l?.outcome;if(e.outcome!=null&&e.coin==null&&d==null)throw new Error("hl-assets: outcomeSide required");let f=d??l?.side;if(f==null)throw new Error("hl-assets: outcomeSide required");if(p==null)throw new Error("hl-assets: outcome identity required");let m=Ut(p,f);if(l&&(l.outcome!==m.outcome||l.side!==m.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:m.coin,assetId:m.assetId,encoding:m.encoding,outcome:m.outcome,side:m.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 f=(await Xm(t)).findIndex(y=>y&&y.name===l);if(f<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:m,ctxs:h}=await Qm(l,t),b=m.findIndex(y=>y.name===n||y.name===`${l}:${d}`||y.name.endsWith(`:${d}`));if(b<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let x=m[b];if(x.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let w=WI+f*1e4+b,g=h[b]||{};return{kind:"hip3",coin:x.name||n,assetId:w,szDecimals:x.szDecimals??0,maxLeverage:x.maxLeverage??null,dex:l,dexIndex:f,indexInMeta:b,markPx:g.markPx??null}}let{universe:r,ctxs:o}=await Qm("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Xm(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 Lc({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let s=r[a];if(s.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[a]||{};return{kind:"main",coin:s.name,assetId:a,szDecimals:s.szDecimals??0,maxLeverage:s.maxLeverage??null,dex:"",markPx:c.markPx??null}}function GI(e,t){let n=Rc(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var Jm,WI,io,Ym,Hi=Ee(()=>{at();Jm=1e8,WI=1e5,io={at:0,dexs:null},Ym=new Map});function Ie(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function Je(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function yn(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let n=Ie(e,t);if(n==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(n)&&!/^0x[0-9a-fA-F]+$/.test(n))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(n)}`);try{return BigInt(n)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(n)}`)}}function Ze(e,t="amount"){let n=yn(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Se(e,t,n="amount"){let r=Ie(e,n);if(!/^-?\d*(\.\d+)?$/.test(r)||r===""||r==="."||r==="-")throw new Error(`${n} must be a decimal number, got ${JSON.stringify(r)}`);let o=r.startsWith("-"),i=o?r.slice(1):r,[a="0",s=""]=i.split(".");if(s.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((a||"0")+s.padEnd(t,"0"));return o?-c:c}var Vn=Ee(()=>{});function JI(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 Zm(e,t){let n=Ie(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(n))throw new Error(`hl: ${t} must be a positive decimal`);let[r,o=""]=n.split("."),i=BigInt(r+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function ht(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=>ht(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)}:${ht(e[r],t)}`).join(",")}}`}function ZI(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)||ht(n,"declared order type")!==ht({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(ht(n,"declared order type")!==ht({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||ht(n,"declared order type")!==ht({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 eA(e,t,n){let r=Zm(e.s,"signed size"),o=Zm(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Se(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Se(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function tA(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=qt(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(Je(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=yn(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Se(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function ef(e,t,n){if(!Number.isSafeInteger(e.a)||e.a!==n)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(Ie(e.s,"hl: signed size")!==Ie(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ie(e.p,"hl: signed price")!==Ie(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(ht(e.t,"signed order type")!==ht(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 tf(e,t,n,r,o){if(!Number.isSafeInteger(e.a)||e.a!==n)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(Ie(e.s,"hl: bracket protection size")!==Ie(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ie(e.p,"hl: bracket protection price")!==Ie(r,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(Ie(i.triggerPx,"hl: triggerPx")!==Ie(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function nA(e){let t=String(e||"").replace(/\/$/,"");if(!KI.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function $c(e){return Dt(e)!=null}function rA(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if($c(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 oA(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(a=>{if(typeof a=="string"){let[s,c]=String(a).split(":");return s===e&&Number(c)===t}return String(a?.coin)===e&&Number(a?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if($c(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 nf(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=qt(n.kind,"kind",48),o=XI[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=nA(n.submitTo);if(Object.prototype.hasOwnProperty.call(n,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(n,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let a=Number(n.nonce);if(!Number.isSafeInteger(a)||a<=0)throw new Error("hl: nonce must be a positive integer");if(!n.action||typeof n.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(n.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(n.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(n.action.type!==QI[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(YI.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=qt(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=Dt(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(rA(c,t),oA(c,l,t),r==="hip4-order"&&!$c(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");ZI(n);let u=n.action.orders;if(r==="perp-bracket"){let d=n.takeProfitPx,p=n.stopLossPx,f=1+(d==null?0:1)+(p==null?0:1);if(f<2||u.length!==f||n.grouping!=="normalTpsl"||n.action.grouping!==n.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");ef(u[0],n,l);let m=1;d!=null&&tf(u[m++],n,l,d,"tp"),p!=null&&tf(u[m],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");ef(u[0],n,l)}eA(u[0],n,t),tA(n,t),s=Ie(n.notionalUsd,"hl: notionalUsd")}if(r==="perp-leverage"){let u=n.leverage;if(!Number.isSafeInteger(u)||u<1)throw new Error("hl: leverage must be a positive integer");let d=t.maxLeverage==null?50:t.maxLeverage;if(typeof d!="number"||!Number.isSafeInteger(d)||d<1)throw new Error("hl: maxLeverage must be a positive integer");if(u>d)throw new Error("hl: leverage exceeds cap")}if(r==="perp-cancel"){let u=n.action.cancels;if(!Array.isArray(u)||u.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(u[0].a)||u[0].a!==l)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(n.orderId)||n.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(u[0].o)||u[0].o!==n.orderId)throw new Error("hl: signed cancel order id must match")}if(r==="perp-leverage"){if(!Number.isSafeInteger(n.action.asset)||n.action.asset!==l)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(n.action.leverage)||n.action.leverage!==n.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(n.marginMode))throw new Error("hl: declared margin mode required");let u=n.marginMode==="cross";if(typeof n.action.isCross!="boolean"||n.action.isCross!==u)throw new Error("hl: signed isCross must match declared margin mode")}if(r==="perp-isolated-margin"){if(!Number.isSafeInteger(n.action.asset)||n.action.asset!==l)throw new Error("hl: signed margin asset must match assetId");let u=qt(n.usd,"margin usd",64),d=Se(u,6,"hl: margin usd");if(yn(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 f=Se(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),m=d<0n?-d:d;if(m>f)throw new Error("hl: margin notional exceeds cap");s=JI(m,6)}}if(r==="builder-fee-approval"){let c=qt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(qt(n.action.builder,"signed builder",42).toLowerCase()!==c)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(m=>String(m).toLowerCase()):[]).includes(c))throw new Error("hl: builder not allowed");let u=qt(n.maxFeeRate,"maxFeeRate",32);if(qt(n.action.maxFeeRate,"signed maxFeeRate",32)!==u)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(u))throw new Error("hl: builder fee rate must be a percent");let d=Se(u.slice(0,-1),12,"hl: builder fee percent"),p=Se(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==a)throw new Error("hl: signed builder nonce must match");let f=i.includes("testnet")?"Testnet":"Mainnet";if(n.hyperliquidChain!==f||n.action.hyperliquidChain!==n.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(n.signatureChainId!=="0x66eee"||n.action.signatureChainId!==n.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(r.startsWith("hype-stake")||r==="hype-delegate"||r==="hype-undelegate"){if(r==="hype-delegate"||r==="hype-undelegate"){let c=r==="hype-undelegate";if(typeof n.action.isUndelegate!="boolean"||n.action.isUndelegate!==c)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(n.action.wei??n.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(s??n.action.wei??0),notional:String(s??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??s??0),coin:n.coin||null,submitTo:i})}var KI,YI,XI,QI,qt,rf=Ee(()=>{Vn();Hi();KI=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),YI=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),XI=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"}),QI=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"}),qt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function aA(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 ji(e,t={},n={}){let r=String(e?.kind||""),o=iA[r];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(n.nowMs??Date.now()),a=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),s=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:aA(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+a,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:r,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:s,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return nf(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 iA,Bc=Ee(()=>{rf();iA=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as sA,JsonRpcProvider as cA}from"ethers";function fA(e){return mA.test(String(e||""))}async function zi(e,{contract:t=lA,rpc:n=dA,chainId:r=uA,balanceOf:o}={}){if(!fA(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new cA(n,r,{staticNetwork:!0}),a=new sA(t,pA,i);return BigInt(await a.balanceOf(e))}var lA,uA,dA,pA,mA,Mc=Ee(()=>{lA="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",uA=999,dA="https://rpc.hyperliquid.xyz/evm",pA=["function balanceOf(address owner) view returns (uint256)"],mA=/^0x[a-fA-F0-9]{40}$/});import{existsSync as hA,readFileSync as gA,lstatSync as yA}from"node:fs";import{homedir as of}from"node:os";import{join as Fc}from"node:path";function xA(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(af,t)?af[t]:wA}function IA(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[sf])return String(e[sf]);let t=e.ORACLE_CONFIG_DIR||Fc(of(),".config","oracle");return Fc(t,"fee-recipient")}return Fc(of(),".config","oracle","fee-recipient")}function Uc(e=process.env){try{let t=IA(e);if(!hA(t)||yA(t).isSymbolicLink())return"";let n=gA(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function AA(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),bA)}function _A({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[SA]||"").trim(),o=String(e[kA]||EA).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=xA(t),a=AA(e[vA],{fallback:r?i:0}),s=Math.min(a,i);if(!s)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(r))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=Uc(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:s,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function Vi({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=_A({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let a=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(a))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await zi(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function cf(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function lf(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var bA,wA,af,vA,SA,kA,sf,EA,Wi=Ee(()=>{Mc();bA=100,wA=5,af=Object.freeze({swap:5,bridge:5,perps:0,nft:0});vA="ORACLE_INTEGRATOR_FEE_BPS",SA="ORACLE_INTEGRATOR_FEE_RECIPIENT",kA="ORACLE_INTEGRATOR_ID",sf="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",EA="oracle"});var Xc={};Es(Xc,{HL_BUILDER_ADDRESS_ENV:()=>Gi,HL_BUILDER_DEFAULT_FEE_BPS:()=>TA,HL_BUILDER_FEE_ENV:()=>qc,HL_BUILDER_FEE_TIERS:()=>ao,HL_BUILDER_MAX_FEE_BPS:()=>Dc,HL_PERP_MAX_SIG_FIGS:()=>uf,HL_PERP_PRICE_DECIMALS:()=>df,HL_SIGNATURE_CHAIN_ID:()=>jc,MARGIN_MODE:()=>so,ORDER_TYPES:()=>qe,TIF:()=>co,formatPerpPrice:()=>Et,formatPerpSize:()=>hf,hlBuilderFeeBpsForKind:()=>ff,hlPerpAssetInfo:()=>Ht,hlPrepareBracketOrder:()=>Yc,hlPrepareBuilderApproval:()=>Wc,hlPrepareCancelOrder:()=>lo,hlPreparePerpOrder:()=>Kn,hlPrepareUpdateIsolatedMargin:()=>Kc,hlPrepareUpdateLeverage:()=>Gc,resolveBuilderFee:()=>zc});function pf(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 CA(e,t){let n=pf(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function PA(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 mf(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 ff(e="perp"){if(e==="perp"||e==="main")return ao.perp;if(e==="spot")return ao.spot;if(e==="hip3")return ao.hip3;if(e==="outcome"||e==="hip4")return ao.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function zc({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Gi]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Gi} must be an EVM address`);let o=Uc(e);if(!o||o!==r)return null;let i=e?.[qc],a=ff(n),s=i==null?a:Number(i);if(!Number.isFinite(s)||s<=0||Math.abs(s*10-Math.round(s*10))>1e-9)throw new Error(`hl-perps: ${qc} must be a positive number in 0.1 bps increments`);if(s>Dc)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${Dc} bps cap`);if(s>a)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${a} bps product tier for ${n}`);let c=Math.round(s*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:s,percent:`${l}%`}}}async function NA(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 OA(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||zi;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Vc(e,t,{roundDown:n=null}={}){let r=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof r!="string"||!/^-?\d+(\.\d+)?$/.test(r))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=r.startsWith("-"),[i,a=""]=r.replace(/^-/,"").split(".");if(a.length<=t){let m=a.replace(/0+$/,"");return(o?"-":"")+(m?`${i}.${m}`:i)}let s=a.slice(0,t),c=Number(a[t]),l=BigInt(i+s),u=a.slice(t).replace(/0+$/,"")!=="";n===!0||(n===!1?u&&(l+=1n):c>=5&&(l+=1n));let d=l.toString().padStart(t+1,"0"),f=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+f}function RA(e,t,n={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let r=typeof e=="number"?String(e):e;if(!r.includes("."))return r;let o=Number(r);if(!Number.isFinite(o)||o===0)return r;let i=Math.floor(Math.log10(Math.abs(o))),a=Math.max(0,t-1-i);return Vc(r,a,n)}function Et(e,t,n={}){let r=df-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Vc(RA(e,uf,n),r,n)}function hf(e,t){let n=Vc(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 LA(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[f,m=""]=p.split(".");return{raw:BigInt(f+m),decimals:m.length}},r=n(e,"size"),o=n(t,"price"),i=r.raw*o.raw,a=r.decimals+o.decimals,s=i.toString().padStart(a+1,"0");if(a===0)return s;let c=s.slice(0,-a),l=s.slice(-a).replace(/0+$/,"");return l?`${c}.${l}`:c}async function Ht(e={},t={}){let n=await Lc(e,t);return{coin:n.coin,assetId:n.assetId,szDecimals:n.szDecimals,maxLeverage:n.maxLeverage,markPx:n.markPx,kind:n.kind,dex:n.dex??null,outcome:n.outcome??null,side:n.side??null}}function Hc(e,{tif:t=co.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case qe.LIMIT:return{limit:{tif:t}};case qe.MARKET:return{limit:{tif:co.IOC}};case qe.STOP_MARKET:case qe.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:Et(n,o),tpsl:e===qe.STOP_MARKET?"sl":"tp"}};case qe.STOP_LIMIT:case qe.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:Et(n,o),tpsl:e===qe.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Wn(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:jc,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 Gn(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=ji(r,t,n),r.prepared=!0,r.signing="awaiting-hl-signer"}catch(o){r.prepared=!1,r.localSignerEnvelope=null,r.localSignerBlockedReason=String(o?.message||o).slice(0,200),r.signing="blocked"}return r.oraclePrepared=!!r.localSignerEnvelope,N(r,{provider:e.provider||"hl-perps",kind:e.kind})}function Wc(e={},t={}){let n=zc({env:t.env});if(!n)throw new Error(`hl-perps: ${Gi} 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:jc,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Gn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Wn(o,r,t)},e,t)}async function Kn(e={},t={}){let n=await Ht(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??qe.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=mf(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=hf(e.size??e.sz,n.szDecimals),s;if(r===qe.MARKET){let w=Number(n.markPx);if(!Number.isFinite(w)){let S=await St(t);w=Number(S?.[n.coin]??S?.[String(n.assetId)]??NaN)}if(!Number.isFinite(w))throw new Error("hl-perps: no mark price available for a market order");let g=Number(e.maxSlippageBps??50);if(!Number.isInteger(g)||g<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(g>100)throw new Error(`hl-perps: maxSlippageBps ${g} exceeds the hard 100 bps cap`);let y=o?w*(1+g/1e4):w*(1-g/1e4);s=Et(y,n.szDecimals,{roundDown:o});let v=Math.abs(Number(s)/w-1)*1e4;if(v>g+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.toFixed(2)} bps from mark, above the ${g} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=Et(e.price??e.limitPx,n.szDecimals)}let c=Hc(r,{tif:e.tif??(r===qe.MARKET?co.IOC:co.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:s,s:a,r:i,t:c};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");l.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let u={type:"order",orders:[l],grouping:e.grouping??"na"},d=zc({env:t.env,kind:n.kind}),p=await OA(d,e,t),f=p.exempt?null:d,m=await NA(f,e,t),h=m.approved?f:null;h&&(u.builder=h.wire);let b=Number(e.nonce??Date.now()),x=LA(a,s);return Gn({provider:"hl-perps",venue:"hyperliquid",kind:n.kind==="outcome"?"hip4-order":n.kind==="hip3"?"hip3-order":"perp-order",coin:n.coin,assetId:n.assetId,assetKind:n.kind,outcome:n.outcome??null,outcomeSide:n.side??null,dex:n.dex??null,side:o?"buy":"sell",orderType:r,price:s,size:a,reduceOnly:i,notionalUsd:x,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:f&&!h?{...d.disclosure,...m}:null,...Wn(u,b,t)},e,t)}async function lo(e={},t={}){let n=await Ht(PA(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=pf(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Gn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Wn(i,Number(e.nonce??Date.now()),t)},e,t)}async function Gc(e={},t={}){let n=await Ht(e,t),r=CA(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||so.CROSS).toLowerCase();if(o!==so.CROSS&&o!==so.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===so.CROSS,leverage:r};return Gn({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,...Wn(i,Number(e.nonce??Date.now()),t)},e,t)}async function Kc(e={},t={}){let n=await Ht(e,t),r=e.usd??e.amountUsd;if(r==null)throw new Error("hl-perps: usd amount required");if(typeof r!="number"&&typeof r!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof r=="number"?String(r):r;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=Se(o,6,"hl-perps: usd"),a=mf(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Gn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Wn(s,Number(e.nonce??Date.now()),t)},e,t)}async function Yc(e={},t={}){let n=await Kn(e,t),r=await Ht(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:Et(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:Hc(qe.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:Et(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:Hc(qe.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let a={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return Gn({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:Et(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:Et(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Wn(a,Number(e.nonce??Date.now()),t)},e,t)}var uf,df,jc,TA,Dc,Gi,qc,ao,qe,co,so,Ki=Ee(()=>{at();Hi();Vn();Z();Bc();Mc();Wi();uf=5,df=6,jc="0x66eee",TA=2,Dc=10,Gi="ORACLE_HL_BUILDER_ADDRESS",qc="ORACLE_HL_BUILDER_FEE_BPS",ao=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),qe=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),co=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),so=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as Xy,readFileSync as CP}from"node:fs";import{dirname as Yy,join as xu}from"node:path";import{fileURLToPath as PP}from"node:url";function NP(e){let t=Yy(PP(e));for(let n=0;n<8;n+=1){let r=xu(t,"package.json");if(Xy(r))try{let i=JSON.parse(CP(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Yy(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Ba(e,t){let n=NP(t),r=xu(n,e);return Xy(r)?r:xu(n,"dist","assets",e)}var vu=Ee(()=>{});import{isAddress as OP}from"ethers";function LP(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Qy,tag:`v${Qy}`}),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 Ma(e){let t=_n[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function qo(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Ho(e,t){let n=String(e||"");if(!OP(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function Jy(e,t){let n=Ma(e);if(!Array.isArray(t))throw new Error(`${e}: constructor args must be an array`);if(t.length!==n.constructor.length)throw new Error(`${e}: expected ${n.constructor.length} constructor args`);if(e==="safe-erc20"){let[r,o,i,a,s]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");qo(i,"safe-erc20: supply"),Ho(a,"safe-erc20: initialHolder"),Ho(s,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,a,s,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(qo(i,"safe-erc721-drop: cap"),Ho(a,"safe-erc721-drop: treasury"),qo(s,"safe-erc721-drop: mintPrice"),qo(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Ho(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Ho(r,"safe-vesting: beneficiary");for(let[a,s]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(a);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${s} must be uint64`)}qo(i,"safe-vesting: durationSeconds")}return n}function Zy(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Qy,RP,_n,Fa=Ee(()=>{Qy="5.0.2",RP={"safe-erc20":{contractName:"SafeERC20",source:"src/SafeERC20.sol",constructor:["string name","string symbol","uint256 initialSupply","address initialHolder","address initialOwner"],authority:["initialOwner may pause transfers and use Ownable2Step"],monitor:["OwnershipTransferStarted","OwnershipTransferred","Paused","Unpaused","Transfer"]},"safe-erc721-drop":{contractName:"SafeERC721Drop",source:"src/SafeERC721Drop.sol",constructor:["string name","string symbol","uint256 cap","address treasury","uint256 mintPrice","uint256 perWalletCap","address initialOwner"],authority:["initialOwner may withdraw the full balance to immutable treasury","no mint, proxy, upgrade, or delegatecall authority"],monitor:["Transfer","OwnershipTransferred","Withdrawal"]},"safe-vesting":{contractName:"SafeVesting",source:"src/SafeVesting.sol",constructor:["address beneficiary","uint64 startTimestamp","uint64 durationSeconds"],authority:["beneficiary is the immutable OpenZeppelin owner/recipient identity","ownership transfer and renunciation are disabled","no separate administrator, proxy, upgrade, or delegatecall authority"],monitor:["EtherReleased","ERC20Released"]}};_n=Object.freeze(Object.fromEntries(Object.entries(RP).map(([e,t])=>[e,LP(e,t)])))});import{spawnSync as Su}from"node:child_process";import{existsSync as Tn,readFileSync as Ua,readdirSync as eb,statSync as tb}from"node:fs";import{join as bt}from"node:path";import{createHash as $P}from"node:crypto";function qa(){return Tn(jo)?eb(jo).filter(e=>_n[e]&&tb(bt(jo,e)).isDirectory()).map(e=>{let t=bt(jo,e),n=bt(t,"SECURITY.md");return{id:e,path:t,metadata:Ma(e),securityNotice:Tn(n)?Ua(n,"utf8").slice(0,500):null,disclaimer:Da}}):[]}function nb(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",bt(e,".foundry/bin/forge")];for(let n of t)if(Su(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function BP(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Su("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function hr(e,t,n){let r=Su(e,t,{cwd:n,encoding:"utf8",env:{...process.env,PATH:`${process.env.HOME||""}/.foundry/bin:${process.env.PATH||""}`},timeout:12e4});return{ok:r.status===0,status:r.status,stdout:r.stdout||"",stderr:r.stderr||""}}function MP(e){let t=$P("sha256");function n(r){let o=tb(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of eb(r).sort())n(bt(r,i))}else o.isFile()&&(r.endsWith(".sol")||r.endsWith(".toml")||r.endsWith(".md")||r.endsWith(".txt"))&&(t.update(r.slice(e.length)),t.update(Ua(r)))}return n(e),t.digest("hex")}function zo(e,t={}){let n=Ma(e),r=t.allowSkipStatic!==!1,o=bt(jo,e);if(!Tn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=nb();if(!i)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!Tn(bt(o,"lib","forge-std"))){let f=hr(i,["install","foundry-rs/forge-std","--no-git"],o);if(!f.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
3
|
-
${
|
|
4
|
-
${
|
|
1
|
+
var Ck=Object.defineProperty;var Ee=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Es=(e,t)=>{for(var n in t)Ck(e,n,{get:t[n],enumerable:!0})};import cn from"node:net";import Nk from"node:dns";function mi(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=u=>{if(!u)return[];let d=u.split(":"),p=d.at(-1);if(p?.includes(".")){let m=p.split(".").map(Number);if(m.length!==4||m.some(f=>!Number.isInteger(f)||f<0||f>255))return null;d.splice(d.length-1,1,(m[0]<<8|m[1]).toString(16),(m[2]<<8|m[3]).toString(16))}return d.some(m=>!/^[0-9a-f]{1,4}$/.test(m))?null:d.map(m=>Number.parseInt(m,16))},[r,o]=t.split("::"),i=n(r),a=n(o);if(!i||!a)return null;let s=t.includes("::"),c=8-i.length-a.length;if(!s&&c!==0||s&&c<1)return null;let l=[...i,...Array(Math.max(0,c)).fill(0),...a];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function Is(e,t,n){let r=Math.floor(n/8),o=n%8;for(let a=0;a<r;a+=1)if(e[a]!==t[a])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function As(e){if(cn.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(cn.isIPv6(e)){let t=mi(e);if(!t)return!1;let n=mi("::ffff:0:0");return Is(t,n,96)?As([...t.slice(12)].join(".")):Is(t,mi("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Is(t,mi(o),i)):!1}return!1}function Rk(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let n=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ok.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=cn.isIP(n);return r!==0&&!As(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function _s(e,{lookupFn:t=Nk.promises.lookup}={}){let n=Rk(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:cn.isIPv6(n.host)?6:4}]};let r;try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!As(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Ts({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let d=await t();n=d.Agent,r=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=d=>(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(cn.isIPv6(p.address)?6:4)})),s=(d,p,m)=>{i.set(o(d),a(typeof p=="string"?[{address:p,family:m}]:p))},c=d=>{let p=o(d);if(cn.isIP(p))return[{address:p,family:cn.isIPv6(p)?6:4}];let m=i.get(p);if(!m||!m.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return m},l=new n({connect:{lookup(d,p,m){let f;try{f=c(d)}catch(h){return m(h)}return p?.all?m(null,f):m(null,f[0].address,f[0].family)}}}),u=Lk((d,p={})=>r(d,{...p,dispatcher:l}),s);return{dispatcher:l,fetch:u,pin:s,resolve:c,async close(){try{await l.destroy()}catch{}}}}function Lk(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[Ps]=Object.freeze({pin:t}),e}function Cs(e){return typeof e=="function"&&typeof e[Ps]?.pin=="function"}function dp(e,t,n){if(!Cs(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ps].pin(t,n)}var Ok,Ps,pp=Ee(()=>{Ok=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ps=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as $k}from"node:crypto";function Dk(e){let t=String(e||"").toLowerCase();return bp.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function qk(e){let t={};for(let[n,r]of Object.entries(e||{}))Dk(n)||(t[n]=r);return t}function Hk(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let n=new URL(String(e),String(t));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${n.protocol}`);return n.toString()}function jk(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function zk(e,t,n,r={}){let o={};for(let[u,d]of Object.entries(n||{}))o[u.toLowerCase()]=d;let i=Object.keys(o).filter(u=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(u)),s=[...new Set([...bp,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
|
|
2
|
+
`),c=$k("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function Vk(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,fp):Math.min(250*2**e,fp)+Math.floor(Math.random()*100)}function Rr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Os(e,t,n){return Rr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Lr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Gk(e){return e?e.byteLength??e.length??0:0}async function gp(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Lr(e),!r))throw Os(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!r)throw Os(n,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let s=[],c=0,l=!1;try{for(;;){let{value:d,done:p}=await a.read();if(p)break;if(d&&(s.push(Buffer.from(d)),c+=Gk(d),c>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Os(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function yp(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Kk(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:s,untrustedUrl:c=!1,maxResponseBytes:l=null,importUndici:u,validateResponse:d,signal:p}){let m=new AbortController,f=setTimeout(()=>m.abort(),i),h=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,m.signal]):p:m.signal,g=null,w=t,x=a?{lookupFn:a}:{};if(c&&!s&&!Cs(w))throw Rr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let b=async(y,{status:v=null}={})=>{let k=await _s(y,x);if(!k.ok)throw Rr(v==null?`HTTP refused ${y}: ${k.error}`:`HTTP redirect to ${y} ${k.error}`,v==null?{}:{status:v});let S=new URL(y).hostname;if(s){if(g&&(await g.close(),g=null),!g)try{g=await Ts({requireUndici:!0,...u?{importUndici:u}:{}})}catch(I){throw Rr(v==null?`HTTP refused ${y}: ${I?.message||I}`:`HTTP redirect to ${y} refused: ${I?.message||I}`,v==null?{}:{status:v})}g.pin(S,k.addresses),w=g.fetch}else dp(w,S,k.addresses);return k};try{let y=String(e),v={...r||{}};c&&await b(y);for(let k=0;k<=hp;k+=1){let S=await w(y,{method:n,headers:v,body:o,signal:h,redirect:"manual"});if(Fk.has(S.status)){if(n!=="GET"&&n!=="HEAD"){let D=await gp(S,l??Uk,{url:y,truncate:!0}),H=new Error(`HTTP ${S.status} ${n} ${y} redirected non-idempotent request`);throw H.status=S.status,H.body=yp(D)??D.slice(0,300),H}if(k===hp)throw Lr(S),new Error(`HTTP redirect loop for ${e}`);let _=S.headers?.get?.("location"),C;try{C=Hk(_,y)}catch(D){throw Lr(S),D}let L=!jk(C,y);if(Lr(S),L&&(v=qk(v)),c)await b(C,{status:S.status});else if(L){let D=await _s(C,x);if(!D.ok){let H=new Error(`HTTP redirect from ${y} ${D.error}`);throw H.status=S.status,H.retryable=!1,H}s&&D.addresses?.length&&(g||(g=await Ts(u?{importUndici:u}:{})),g&&(g.pin(new URL(C).hostname,D.addresses),w=g.fetch))}y=C;continue}if(typeof d=="function")try{await d(S,{url:y})}catch(_){throw Lr(S),Rr(_?.message||String(_))}let I=await gp(S,l,{url:y,onOversize:()=>m.abort()}),T=yp(I);if(!S.ok){let _=new Error(`HTTP ${S.status} ${n} ${y}`);throw _.status=S.status,_.retryAfter=S.headers?.get?.("retry-after")??null,_.body=T??I.slice(0,300),_}return T??I}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),g&&await g.close()}}async function E(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},a=t.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let s=Number.isInteger(t.retries)?Math.max(t.retries,0):Mk,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,m=t.signal,f=Number(t.maxResponseBytes),h=Number.isFinite(f)&&f>0?Math.floor(f):null,g=async()=>{let v;for(let k=0;k<=s;k++){m?.throwIfAborted?.();try{return await Kk(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:h,importUndici:d,validateResponse:p,signal:m})}catch(S){v=S;let I=S?.status,T=S?.name==="AbortError"||S?.name==="TimeoutError"||m?.aborted,_=new Set([408,425,429]),C=S?.retryable===!1?!1:I!=null?_.has(I)||Bk.has(I)&&mp.has(o):!T&&mp.has(o);if(k===s||!C)throw S;let L=Vk(k,S?.retryAfter);m?await new Promise((D,H)=>{let O=setTimeout(D,L);m.addEventListener("abort",()=>{clearTimeout(O),H(m.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Wk(L)}}throw v};if(!(t.dedupe!==!1&&!m&&o==="GET"&&a==null))return g();let x=zk(o,e,i,{untrustedUrl:u,maxResponseBytes:h}),b=Ns.get(x);if(b)return b;let y=g().finally(()=>Ns.delete(x));return Ns.set(x,y),y}async function xe(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Me(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;a<r.length;){let s=a++;i[s]=await n(r[s],s)}})),i}var Bk,mp,Mk,fp,bp,Fk,hp,Uk,Ns,Wk,$=Ee(()=>{pp();Bk=new Set([408,425,429,500,502,503,504]),mp=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Mk=2,fp=4e3,bp=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Fk=new Set([301,302,303,307,308]),hp=3,Uk=64*1024;Ns=new Map;Wk=e=>new Promise(t=>setTimeout(t,e))});function Ls(e){return wp.get(Number(e))||null}function xp(e,t=process.env){let n=Ls(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function vp(e){return wp.has(Number(e))}var Rs,wp,Sp=Ee(()=>{Rs={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},wp=new Map(Object.values(Rs).map(e=>[e.chainId,e]))});var hi={};Es(hi,{PUBLIC_RPC_FALLBACKS:()=>Bs,erc20Allowance:()=>Us,erc20BalanceOf:()=>Br,resolveRpcUrl:()=>Ms,rpcBlockNumber:()=>$r,rpcCall:()=>U,rpcChainId:()=>Fs,rpcGasPrice:()=>eE,rpcGetBalance:()=>ln,rpcHealth:()=>Fn,rpcHealthAll:()=>Ds,transactionReceipt:()=>Mr});import{Interface as Yk,getAddress as Xk}from"ethers";function Bt(e,t){try{return Xk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Qk(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function $s(e){return e==null?null:Number.parseInt(String(e),16)}function Ms(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=xp(e,n);return r||Bs[Number(e)]||null}function Zk(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Jk.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function U(e,t,n=[],r={}){let o=String(t||"");Zk(o);let i=Ms(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await E(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function Fn(e,t={}){let n=await U(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await U(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Ls(e)?.name||null}}async function $r(e,t={}){let n=await U(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Fs(e,t={}){let n=await U(e,"eth_chainId",[],t);return parseInt(n,16)}async function eE(e,t={}){let n=await U(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function ln(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await U(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Us(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Bt(e.token||e.tokenAddress,"token"),o=Bt(e.owner,"owner"),i=Bt(e.spender,"spender"),a=fi.encodeFunctionData("allowance",[o,i]),s=await U(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=fi.decodeFunctionResult("allowance",s),l=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Br(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Bt(e.token||e.tokenAddress,"token"),o=Bt(e.account||e.owner||e.address,"account"),i=fi.encodeFunctionData("balanceOf",[o]),a=await U(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=fi.decodeFunctionResult("balanceOf",a),c=BigInt(s[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Mr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Qk(e.txHash||e.hash||e.transactionHash),o=await U(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=$s(o.status),a=i===1,s=i===1?"success":i===0?"reverted":"unknown",c=a?null:s==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?Bt(e.expectedTo,"expectedTo"):null,u=o.to?Bt(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:s,reason:c,statusCode:i,to:u,from:o.from?Bt(o.from,"receipt.from"):null,blockNumber:$s(o.blockNumber),transactionIndex:$s(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Ds(e={}){let t=e.chainIds||Object.values(Rs).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!vp(r)&&!Bs[r]&&!Ms(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Fn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var fi,Bs,Jk,he=Ee(()=>{$();Sp();fi=new Yk(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Bs={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"};Jk=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{createHash as yE,createHmac as bE,timingSafeEqual as iM}from"node:crypto";function Vs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Vs).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Vs(e[n])}`).join(",")}}`}function Rp(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Lp(e=process.env){return Rp(process.env)||Rp(e)}function vE(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function dn(e){let t=vE(e);return yE("sha256").update(Vs(t)).digest("hex")}function SE(e,t=Lp()){return t?bE("sha256",t).update(String(e)).digest("hex"):""}function N(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let a=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(a&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let s={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:a?e.oraclePrepared:!0};if(!s.provider)throw new Error("stampPrepared: provider required");if(!s.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Ws:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>xE)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:wE},m=dn(p),f=Lp(r),h=f?SE(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var wE,Ws,xE,Z=Ee(()=>{wE=2,Ws=300*1e3,xE=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function FI({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"?MI:BI}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=FI(t);return E(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Fm(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 St(e={}){return ce({type:"allMids"},e)}async function jn(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ce({type:"l2Book",coin:String(e)},t)}async function eo(e={}){return ce({type:"outcomeMeta"},e)}async function $i(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ce({type:"spotClearinghouseState",user:e},t)}async function Um(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ce({type:"userFills",user:e},t)}async function Dm(e={}){return ce({type:"meta"},e)}async function Qe(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ce(t,e)}async function Bi({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 qm({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 Hm(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ce({type:"openOrders",user:e},t)}async function jm(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ce({type:"frontendOpenOrders",user:e},t)}async function zn(e,t={}){if(!e)throw new Error("hlUserState requires user");return ce({type:"clearinghouseState",user:e},t)}async function Mi(e={}){return ce({type:"spotMeta"},e)}var BI,MI,at=Ee(()=>{$();BI="https://api.hyperliquid.xyz/info",MI="https://api.hyperliquid-testnet.xyz/info"});async function Qm(e={}){let t=Date.now();if(io.dexs&&t-io.at<6e4&&!e.fetchImpl)return io.dexs;let n=await ce({type:"perpDexs"},e);return io={at:t,dexs:Array.isArray(n)?n:[]},io.dexs}async function Jm(e="",t={}){let n=e||"",r=Date.now(),o=Xm.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ce({type:"metaAndAssetCtxs",dex:e},t):await Qe(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return Xm.set(n,c),c}function Dt(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=Zm+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Ut(e,t){let n=Rc(e),r=Rc(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=Zm+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 Rc(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 Lc(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Dt(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Ut(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:KI(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=Ut(p,m);if(l&&(l.outcome!==f.outcome||l.side!==f.side))throw new Error("hl-assets: coin does not match outcome side");let h=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:f.coin,assetId:f.assetId,encoding:f.encoding,outcome:f.outcome,side:f.side,szDecimals:h,maxLeverage:1,dex:null,markPx:null}}let n=String(e.coin||e.symbol||e.name||"").trim();if(!n)throw new Error("hl-assets: coin required");if(n.includes(":")){let[l,...u]=n.split(":"),d=u.join(":");if(!l||!d)throw new Error(`hl-assets: bad builder coin ${n}`);let m=(await Qm(t)).findIndex(y=>y&&y.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await Jm(l,t),g=f.findIndex(y=>y.name===n||y.name===`${l}:${d}`||y.name.endsWith(`:${d}`));if(g<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let w=f[g];if(w.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let x=GI+m*1e4+g,b=h[g]||{};return{kind:"hip3",coin:w.name||n,assetId:x,szDecimals:w.szDecimals??0,maxLeverage:w.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:b.markPx??null}}let{universe:r,ctxs:o}=await Jm("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Qm(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 Lc({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let s=r[a];if(s.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[a]||{};return{kind:"main",coin:s.name,assetId:a,szDecimals:s.szDecimals??0,maxLeverage:s.maxLeverage??null,dex:"",markPx:c.markPx??null}}function KI(e,t){let n=Rc(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var Zm,GI,io,Xm,ji=Ee(()=>{at();Zm=1e8,GI=1e5,io={at:0,dexs:null},Xm=new Map});function Ie(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function Je(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function yn(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let n=Ie(e,t);if(n==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(n)&&!/^0x[0-9a-fA-F]+$/.test(n))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(n)}`);try{return BigInt(n)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(n)}`)}}function Ze(e,t="amount"){let n=yn(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Se(e,t,n="amount"){let r=Ie(e,n);if(!/^-?\d*(\.\d+)?$/.test(r)||r===""||r==="."||r==="-")throw new Error(`${n} must be a decimal number, got ${JSON.stringify(r)}`);let o=r.startsWith("-"),i=o?r.slice(1):r,[a="0",s=""]=i.split(".");if(s.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((a||"0")+s.padEnd(t,"0"));return o?-c:c}var Vn=Ee(()=>{});function ZI(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 ef(e,t){let n=Ie(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(n))throw new Error(`hl: ${t} must be a positive decimal`);let[r,o=""]=n.split("."),i=BigInt(r+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function ht(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=>ht(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)}:${ht(e[r],t)}`).join(",")}}`}function eA(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)||ht(n,"declared order type")!==ht({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(ht(n,"declared order type")!==ht({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||ht(n,"declared order type")!==ht({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 tA(e,t,n){let r=ef(e.s,"signed size"),o=ef(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Se(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Se(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function nA(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=qt(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(Je(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=yn(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Se(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function tf(e,t,n){if(!Number.isSafeInteger(e.a)||e.a!==n)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(Ie(e.s,"hl: signed size")!==Ie(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ie(e.p,"hl: signed price")!==Ie(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(ht(e.t,"signed order type")!==ht(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 nf(e,t,n,r,o){if(!Number.isSafeInteger(e.a)||e.a!==n)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(Ie(e.s,"hl: bracket protection size")!==Ie(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ie(e.p,"hl: bracket protection price")!==Ie(r,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(Ie(i.triggerPx,"hl: triggerPx")!==Ie(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function rA(e){let t=String(e||"").replace(/\/$/,"");if(!YI.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function $c(e){return Dt(e)!=null}function oA(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if($c(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 iA(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(a=>{if(typeof a=="string"){let[s,c]=String(a).split(":");return s===e&&Number(c)===t}return String(a?.coin)===e&&Number(a?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if($c(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 rf(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=qt(n.kind,"kind",48),o=QI[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=rA(n.submitTo);if(Object.prototype.hasOwnProperty.call(n,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(n,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let a=Number(n.nonce);if(!Number.isSafeInteger(a)||a<=0)throw new Error("hl: nonce must be a positive integer");if(!n.action||typeof n.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(n.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(n.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(n.action.type!==JI[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(XI.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=qt(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=Dt(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(oA(c,t),iA(c,l,t),r==="hip4-order"&&!$c(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");eA(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");tf(u[0],n,l);let f=1;d!=null&&nf(u[f++],n,l,d,"tp"),p!=null&&nf(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");tf(u[0],n,l)}tA(u[0],n,t),nA(n,t),s=Ie(n.notionalUsd,"hl: notionalUsd")}if(r==="perp-leverage"){let u=n.leverage;if(!Number.isSafeInteger(u)||u<1)throw new Error("hl: leverage must be a positive integer");let d=t.maxLeverage==null?50:t.maxLeverage;if(typeof d!="number"||!Number.isSafeInteger(d)||d<1)throw new Error("hl: maxLeverage must be a positive integer");if(u>d)throw new Error("hl: leverage exceeds cap")}if(r==="perp-cancel"){let u=n.action.cancels;if(!Array.isArray(u)||u.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(u[0].a)||u[0].a!==l)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(n.orderId)||n.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(u[0].o)||u[0].o!==n.orderId)throw new Error("hl: signed cancel order id must match")}if(r==="perp-leverage"){if(!Number.isSafeInteger(n.action.asset)||n.action.asset!==l)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(n.action.leverage)||n.action.leverage!==n.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(n.marginMode))throw new Error("hl: declared margin mode required");let u=n.marginMode==="cross";if(typeof n.action.isCross!="boolean"||n.action.isCross!==u)throw new Error("hl: signed isCross must match declared margin mode")}if(r==="perp-isolated-margin"){if(!Number.isSafeInteger(n.action.asset)||n.action.asset!==l)throw new Error("hl: signed margin asset must match assetId");let u=qt(n.usd,"margin usd",64),d=Se(u,6,"hl: margin usd");if(yn(n.action.ntli,"hl: signed margin ntli")!==d)throw new Error("hl: signed margin amount must match usd");if(typeof n.isBuy!="boolean"||n.action.isBuy!==n.isBuy)throw new Error("hl: signed margin isBuy must match");let m=Se(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=ZI(f,6)}}if(r==="builder-fee-approval"){let c=qt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(qt(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=qt(n.maxFeeRate,"maxFeeRate",32);if(qt(n.action.maxFeeRate,"signed maxFeeRate",32)!==u)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(u))throw new Error("hl: builder fee rate must be a percent");let d=Se(u.slice(0,-1),12,"hl: builder fee percent"),p=Se(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==a)throw new Error("hl: signed builder nonce must match");let m=i.includes("testnet")?"Testnet":"Mainnet";if(n.hyperliquidChain!==m||n.action.hyperliquidChain!==n.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(n.signatureChainId!=="0x66eee"||n.action.signatureChainId!==n.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(r.startsWith("hype-stake")||r==="hype-delegate"||r==="hype-undelegate"){if(r==="hype-delegate"||r==="hype-undelegate"){let c=r==="hype-undelegate";if(typeof n.action.isUndelegate!="boolean"||n.action.isUndelegate!==c)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(n.action.wei??n.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(s??n.action.wei??0),notional:String(s??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??s??0),coin:n.coin||null,submitTo:i})}var YI,XI,QI,JI,qt,of=Ee(()=>{Vn();ji();YI=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),XI=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),QI=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"}),JI=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"}),qt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function sA(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 zi(e,t={},n={}){let r=String(e?.kind||""),o=aA[r];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(n.nowMs??Date.now()),a=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),s=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:sA(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+a,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:r,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:s,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return rf(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 aA,Bc=Ee(()=>{of();aA=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as cA,JsonRpcProvider as lA}from"ethers";function hA(e){return fA.test(String(e||""))}async function Vi(e,{contract:t=uA,rpc:n=pA,chainId:r=dA,balanceOf:o}={}){if(!hA(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new lA(n,r,{staticNetwork:!0}),a=new cA(t,mA,i);return BigInt(await a.balanceOf(e))}var uA,dA,pA,mA,fA,Mc=Ee(()=>{uA="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",dA=999,pA="https://rpc.hyperliquid.xyz/evm",mA=["function balanceOf(address owner) view returns (uint256)"],fA=/^0x[a-fA-F0-9]{40}$/});import{existsSync as gA,readFileSync as yA,lstatSync as bA}from"node:fs";import{homedir as af}from"node:os";import{join as Fc}from"node:path";function vA(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(sf,t)?sf[t]:xA}function AA(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[cf])return String(e[cf]);let t=e.ORACLE_CONFIG_DIR||Fc(af(),".config","oracle");return Fc(t,"fee-recipient")}return Fc(af(),".config","oracle","fee-recipient")}function Uc(e=process.env){try{let t=AA(e);if(!gA(t)||bA(t).isSymbolicLink())return"";let n=yA(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function _A(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),wA)}function TA({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[kA]||"").trim(),o=String(e[EA]||IA).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=vA(t),a=_A(e[SA],{fallback:r?i:0}),s=Math.min(a,i);if(!s)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(r))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=Uc(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:s,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function Wi({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=TA({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let a=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(a))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Vi(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function lf(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function uf(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var wA,xA,sf,SA,kA,EA,cf,IA,Gi=Ee(()=>{Mc();wA=100,xA=5,sf=Object.freeze({swap:5,bridge:5,perps:0,nft:0});SA="ORACLE_INTEGRATOR_FEE_BPS",kA="ORACLE_INTEGRATOR_FEE_RECIPIENT",EA="ORACLE_INTEGRATOR_ID",cf="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",IA="oracle"});var Xc={};Es(Xc,{HL_BUILDER_ADDRESS_ENV:()=>Ki,HL_BUILDER_DEFAULT_FEE_BPS:()=>PA,HL_BUILDER_FEE_ENV:()=>qc,HL_BUILDER_FEE_TIERS:()=>ao,HL_BUILDER_MAX_FEE_BPS:()=>Dc,HL_PERP_MAX_SIG_FIGS:()=>df,HL_PERP_PRICE_DECIMALS:()=>pf,HL_SIGNATURE_CHAIN_ID:()=>jc,MARGIN_MODE:()=>so,ORDER_TYPES:()=>qe,TIF:()=>co,formatPerpPrice:()=>Et,formatPerpSize:()=>gf,hlBuilderFeeBpsForKind:()=>hf,hlPerpAssetInfo:()=>Ht,hlPrepareBracketOrder:()=>Yc,hlPrepareBuilderApproval:()=>Wc,hlPrepareCancelOrder:()=>lo,hlPreparePerpOrder:()=>Kn,hlPrepareUpdateIsolatedMargin:()=>Kc,hlPrepareUpdateLeverage:()=>Gc,resolveBuilderFee:()=>zc});function mf(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 CA(e,t){let n=mf(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function NA(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 ff(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 hf(e="perp"){if(e==="perp"||e==="main")return ao.perp;if(e==="spot")return ao.spot;if(e==="hip3")return ao.hip3;if(e==="outcome"||e==="hip4")return ao.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function zc({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Ki]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Ki} must be an EVM address`);let o=Uc(e);if(!o||o!==r)return null;let i=e?.[qc],a=hf(n),s=i==null?a:Number(i);if(!Number.isFinite(s)||s<=0||Math.abs(s*10-Math.round(s*10))>1e-9)throw new Error(`hl-perps: ${qc} must be a positive number in 0.1 bps increments`);if(s>Dc)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${Dc} bps cap`);if(s>a)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${a} bps product tier for ${n}`);let c=Math.round(s*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:s,percent:`${l}%`}}}async function OA(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 RA(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||Vi;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Vc(e,t,{roundDown:n=null}={}){let r=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof r!="string"||!/^-?\d+(\.\d+)?$/.test(r))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=r.startsWith("-"),[i,a=""]=r.replace(/^-/,"").split(".");if(a.length<=t){let f=a.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let s=a.slice(0,t),c=Number(a[t]),l=BigInt(i+s),u=a.slice(t).replace(/0+$/,"")!=="";n===!0||(n===!1?u&&(l+=1n):c>=5&&(l+=1n));let d=l.toString().padStart(t+1,"0"),m=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+m}function LA(e,t,n={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let r=typeof e=="number"?String(e):e;if(!r.includes("."))return r;let o=Number(r);if(!Number.isFinite(o)||o===0)return r;let i=Math.floor(Math.log10(Math.abs(o))),a=Math.max(0,t-1-i);return Vc(r,a,n)}function Et(e,t,n={}){let r=pf-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Vc(LA(e,df,n),r,n)}function gf(e,t){let n=Vc(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 $A(e,t){let n=(u,d)=>{let p=String(u).trim();if(!/^\d+(?:\.\d+)?$/.test(p))throw new Error(`hl-perps: ${d} must be a positive decimal`);let[m,f=""]=p.split(".");return{raw:BigInt(m+f),decimals:f.length}},r=n(e,"size"),o=n(t,"price"),i=r.raw*o.raw,a=r.decimals+o.decimals,s=i.toString().padStart(a+1,"0");if(a===0)return s;let c=s.slice(0,-a),l=s.slice(-a).replace(/0+$/,"");return l?`${c}.${l}`:c}async function Ht(e={},t={}){let n=await Lc(e,t);return{coin:n.coin,assetId:n.assetId,szDecimals:n.szDecimals,maxLeverage:n.maxLeverage,markPx:n.markPx,kind:n.kind,dex:n.dex??null,outcome:n.outcome??null,side:n.side??null}}function Hc(e,{tif:t=co.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case qe.LIMIT:return{limit:{tif:t}};case qe.MARKET:return{limit:{tif:co.IOC}};case qe.STOP_MARKET:case qe.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:Et(n,o),tpsl:e===qe.STOP_MARKET?"sl":"tp"}};case qe.STOP_LIMIT:case qe.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:Et(n,o),tpsl:e===qe.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Wn(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:jc,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 Gn(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=zi(r,t,n),r.prepared=!0,r.signing="awaiting-hl-signer"}catch(o){r.prepared=!1,r.localSignerEnvelope=null,r.localSignerBlockedReason=String(o?.message||o).slice(0,200),r.signing="blocked"}return r.oraclePrepared=!!r.localSignerEnvelope,N(r,{provider:e.provider||"hl-perps",kind:e.kind})}function Wc(e={},t={}){let n=zc({env:t.env});if(!n)throw new Error(`hl-perps: ${Ki} 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:jc,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Gn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Wn(o,r,t)},e,t)}async function Kn(e={},t={}){let n=await Ht(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??qe.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=ff(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=gf(e.size??e.sz,n.szDecimals),s;if(r===qe.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let k=await St(t);x=Number(k?.[n.coin]??k?.[String(n.assetId)]??NaN)}if(!Number.isFinite(x))throw new Error("hl-perps: no mark price available for a market order");let b=Number(e.maxSlippageBps??50);if(!Number.isInteger(b)||b<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(b>100)throw new Error(`hl-perps: maxSlippageBps ${b} exceeds the hard 100 bps cap`);let y=o?x*(1+b/1e4):x*(1-b/1e4);s=Et(y,n.szDecimals,{roundDown:o});let v=Math.abs(Number(s)/x-1)*1e4;if(v>b+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.toFixed(2)} bps from mark, above the ${b} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=Et(e.price??e.limitPx,n.szDecimals)}let c=Hc(r,{tif:e.tif??(r===qe.MARKET?co.IOC:co.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:s,s:a,r:i,t:c};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");l.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let u={type:"order",orders:[l],grouping:e.grouping??"na"},d=zc({env:t.env,kind:n.kind}),p=await RA(d,e,t),m=p.exempt?null:d,f=await OA(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),w=$A(a,s);return Gn({provider:"hl-perps",venue:"hyperliquid",kind:n.kind==="outcome"?"hip4-order":n.kind==="hip3"?"hip3-order":"perp-order",coin:n.coin,assetId:n.assetId,assetKind:n.kind,outcome:n.outcome??null,outcomeSide:n.side??null,dex:n.dex??null,side:o?"buy":"sell",orderType:r,price:s,size:a,reduceOnly:i,notionalUsd:w,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...Wn(u,g,t)},e,t)}async function lo(e={},t={}){let n=await Ht(NA(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=mf(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Gn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Wn(i,Number(e.nonce??Date.now()),t)},e,t)}async function Gc(e={},t={}){let n=await Ht(e,t),r=CA(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||so.CROSS).toLowerCase();if(o!==so.CROSS&&o!==so.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===so.CROSS,leverage:r};return Gn({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,...Wn(i,Number(e.nonce??Date.now()),t)},e,t)}async function Kc(e={},t={}){let n=await Ht(e,t),r=e.usd??e.amountUsd;if(r==null)throw new Error("hl-perps: usd amount required");if(typeof r!="number"&&typeof r!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof r=="number"?String(r):r;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=Se(o,6,"hl-perps: usd"),a=ff(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Gn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Wn(s,Number(e.nonce??Date.now()),t)},e,t)}async function Yc(e={},t={}){let n=await Kn(e,t),r=await Ht(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:Et(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:Hc(qe.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:Et(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:Hc(qe.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let a={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return Gn({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:Et(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:Et(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Wn(a,Number(e.nonce??Date.now()),t)},e,t)}var df,pf,jc,PA,Dc,Ki,qc,ao,qe,co,so,Yi=Ee(()=>{at();ji();Vn();Z();Bc();Mc();Gi();df=5,pf=6,jc="0x66eee",PA=2,Dc=10,Ki="ORACLE_HL_BUILDER_ADDRESS",qc="ORACLE_HL_BUILDER_FEE_BPS",ao=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),qe=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),co=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),so=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as Qy,readFileSync as CC}from"node:fs";import{dirname as Xy,join as vu}from"node:path";import{fileURLToPath as NC}from"node:url";function OC(e){let t=Xy(NC(e));for(let n=0;n<8;n+=1){let r=vu(t,"package.json");if(Qy(r))try{let i=JSON.parse(CC(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Xy(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Ba(e,t){let n=OC(t),r=vu(n,e);return Qy(r)?r:vu(n,"dist","assets",e)}var Su=Ee(()=>{});import{isAddress as RC}from"ethers";function $C(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Jy,tag:`v${Jy}`}),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 Ma(e){let t=_n[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Ho(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function jo(e,t){let n=String(e||"");if(!RC(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function Zy(e,t){let n=Ma(e);if(!Array.isArray(t))throw new Error(`${e}: constructor args must be an array`);if(t.length!==n.constructor.length)throw new Error(`${e}: expected ${n.constructor.length} constructor args`);if(e==="safe-erc20"){let[r,o,i,a,s]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");Ho(i,"safe-erc20: supply"),jo(a,"safe-erc20: initialHolder"),jo(s,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,a,s,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(Ho(i,"safe-erc721-drop: cap"),jo(a,"safe-erc721-drop: treasury"),Ho(s,"safe-erc721-drop: mintPrice"),Ho(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");jo(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;jo(r,"safe-vesting: beneficiary");for(let[a,s]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(a);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${s} must be uint64`)}Ho(i,"safe-vesting: durationSeconds")}return n}function eb(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Jy,LC,_n,Fa=Ee(()=>{Jy="5.0.2",LC={"safe-erc20":{contractName:"SafeERC20",source:"src/SafeERC20.sol",constructor:["string name","string symbol","uint256 initialSupply","address initialHolder","address initialOwner"],authority:["initialOwner may pause transfers and use Ownable2Step"],monitor:["OwnershipTransferStarted","OwnershipTransferred","Paused","Unpaused","Transfer"]},"safe-erc721-drop":{contractName:"SafeERC721Drop",source:"src/SafeERC721Drop.sol",constructor:["string name","string symbol","uint256 cap","address treasury","uint256 mintPrice","uint256 perWalletCap","address initialOwner"],authority:["initialOwner may withdraw the full balance to immutable treasury","no mint, proxy, upgrade, or delegatecall authority"],monitor:["Transfer","OwnershipTransferred","Withdrawal"]},"safe-vesting":{contractName:"SafeVesting",source:"src/SafeVesting.sol",constructor:["address beneficiary","uint64 startTimestamp","uint64 durationSeconds"],authority:["beneficiary is the immutable OpenZeppelin owner/recipient identity","ownership transfer and renunciation are disabled","no separate administrator, proxy, upgrade, or delegatecall authority"],monitor:["EtherReleased","ERC20Released"]}};_n=Object.freeze(Object.fromEntries(Object.entries(LC).map(([e,t])=>[e,$C(e,t)])))});import{spawnSync as ku}from"node:child_process";import{existsSync as Tn,readFileSync as Ua,readdirSync as tb,statSync as nb}from"node:fs";import{join as bt}from"node:path";import{createHash as BC}from"node:crypto";function qa(){return Tn(zo)?tb(zo).filter(e=>_n[e]&&nb(bt(zo,e)).isDirectory()).map(e=>{let t=bt(zo,e),n=bt(t,"SECURITY.md");return{id:e,path:t,metadata:Ma(e),securityNotice:Tn(n)?Ua(n,"utf8").slice(0,500):null,disclaimer:Da}}):[]}function rb(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",bt(e,".foundry/bin/forge")];for(let n of t)if(ku(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function MC(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:ku("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function hr(e,t,n){let r=ku(e,t,{cwd:n,encoding:"utf8",env:{...process.env,PATH:`${process.env.HOME||""}/.foundry/bin:${process.env.PATH||""}`},timeout:12e4});return{ok:r.status===0,status:r.status,stdout:r.stdout||"",stderr:r.stderr||""}}function FC(e){let t=BC("sha256");function n(r){let o=nb(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of tb(r).sort())n(bt(r,i))}else o.isFile()&&(r.endsWith(".sol")||r.endsWith(".toml")||r.endsWith(".md")||r.endsWith(".txt"))&&(t.update(r.slice(e.length)),t.update(Ua(r)))}return n(e),t.digest("hex")}function Vo(e,t={}){let n=Ma(e),r=t.allowSkipStatic!==!1,o=bt(zo,e);if(!Tn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=rb();if(!i)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!Tn(bt(o,"lib","forge-std"))){let m=hr(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
3
|
+
${m.stderr}`)}if(!Tn(bt(o,"lib","openzeppelin-contracts"))){let m=hr(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
4
|
+
${m.stderr}`)}let a=bt(o,"lib","openzeppelin-contracts","package.json"),s=Tn(a)?JSON.parse(Ua(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=hr(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
5
5
|
${c.stderr}`.slice(0,2e3));let l=hr(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
|
|
6
6
|
${l.stdout}
|
|
7
|
-
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=
|
|
8
|
-
${
|
|
9
|
-
${
|
|
10
|
-
${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=bt(o,"out",`${a}.sol`,`${a}.json`);if(!Tn(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(Ua(s,"utf8"));return{gate:n,metadata:n.metadata,contractName:a,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:s}}var
|
|
7
|
+
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=MC();if(d){let m=hr(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
|
|
8
|
+
${m.stdout}
|
|
9
|
+
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=FC(o);return{ok:!0,templateId:e,metadata:n,path:o,forgeTests:{ok:!0,tool:"forge",summary:"forge test passed"},forgeBuild:{ok:!0,tool:"forge",summary:"forge build passed"},staticAnalysis:u,sourceHash:p,disclaimer:Da,firmAudit:!1}}function ob(e,t={}){let n=Vo(e,t),r=rb(),o=n.path,i=hr(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
|
|
10
|
+
${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=bt(o,"out",`${a}.sol`,`${a}.json`);if(!Tn(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(Ua(s,"utf8"));return{gate:n,metadata:n.metadata,contractName:a,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:s}}var zo,Da,Ha=Ee(()=>{Su();Fa();zo=Ba("protocols/templates",import.meta.url),Da="Template + Foundry tests + optional static analysis. NOT a paid security-firm audit. Do not put mainnet TVL on forks without an independent Solidity audit."});import{createHash as Eu}from"node:crypto";import{secp256k1 as Wo}from"@noble/curves/secp256k1.js";import{bech32m as sb}from"@scure/base";function rt(e,t){throw new Error(`${e}: ${t}`)}function pb(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||rt("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Iu(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{rt(t,`must be an integer from ${n} to ${r}`)}}function jC(e){let t=String(e||"");if(!t||[...t].some(o=>!cb.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(cb.indexOf(o));let r=[];for(;n>0n;)r.unshift(Number(n&255n)),n>>=8n;for(let o of t){if(o!=="1")break;r.unshift(0)}return Uint8Array.from(r)}function lb(e,t){let n=String(e||"").trim(),r=jC(n);return(!r||r.length!==32)&&rt(t,"must be a 32-byte base58 Solana public key"),n}function ub(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||rt(t,"must be a compressed secp256k1 public key");try{Wo.Point.fromHex(n)}catch{rt(t,"must encode a valid secp256k1 curve point")}return n}function zC(e){if(e<253)return Buffer.from([e]);if(e<=65535){let t=Buffer.alloc(3);return t[0]=253,t.writeUInt16LE(e,1),t}rt("bitcoin-tapscript-vault","script too large")}function _u(e,t){let n=Eu("sha256").update(e).digest();return Eu("sha256").update(n).update(n).update(t).digest()}function db(e){return _u("TapLeaf",Buffer.concat([Buffer.from([192]),zC(e.length),e]))}function VC(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return _u("TapBranch",Buffer.concat([n,r]))}function ja(e){return Wo.Point.fromHex(e).x.toString(16).padStart(64,"0")}function mb(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function WC(e,t){let n=[];return e.forEach((r,o)=>n.push(mb(ja(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function GC(e){let t=Number(e),n=[];for(;t>0;)n.push(t&255),t>>=8;return n[n.length-1]&128&&n.push(0),Buffer.from([n.length,...n])}function KC(e,t){return Buffer.concat([GC(t),Buffer.from([178,117]),mb(ja(e)),Buffer.from([172])])}function YC(e,t,n){let r=Wo.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${_u("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%Wo.Point.Fn.ORDER,s=o.add(Wo.Point.BASE.multiply(a)),c=Buffer.from(s.x.toString(16).padStart(64,"0"),"hex"),l=n==="mainnet"?"bc":n==="regtest"?"bcrt":"tb";return{address:sb.encode(l,[1,...sb.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function ut(e,t){return Object.freeze({path:e,content:t.endsWith(`
|
|
11
11
|
`)?t:`${t}
|
|
12
|
-
`})}function
|
|
12
|
+
`})}function XC(e){let t=Eu("sha256");for(let n of[...e].sort((r,o)=>r.path.localeCompare(o.path)))t.update(n.path).update("\0").update(n.content).update("\0");return t.digest("hex")}function QC(e){let t=pb(e.projectName),n=lb(e.authority,"solana-safe-vault authority"),r=Iu(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||rt("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=lb(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&rt("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
|
|
13
13
|
use anchor_lang::system_program::{transfer, Transfer};
|
|
14
14
|
|
|
15
15
|
declare_id!("${i}");
|
|
@@ -131,21 +131,21 @@ anchor-lang = "0.31.1"
|
|
|
131
131
|
- Unlock delay: ${r} slots after the most recent deposit
|
|
132
132
|
- No upgrade authority is created by this source; deployment authority handling is external
|
|
133
133
|
- Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
|
|
134
|
-
`)];return{family:"solana",network:o,projectName:t,protocolModel:za["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:s,gate:{sourceChecks:{ok:a.includes("address = vault.authority")&&a.includes("checked_add")&&a.includes('seeds = [b"vault"')&&!a.includes("invoke_signed_unchecked"),checks:["authority constraint","checked slot arithmetic","PDA seed binding","no unchecked CPI"]},compiler:{tool:"anchor",requiredBeforeDeploy:!0,run:!1},tests:{tool:"anchor test",requiredBeforeDeploy:!0,run:!1},simulation:{cluster:o,requiredBeforeDeploy:!0,run:!1},firmAudit:!1,disclaimer:
|
|
134
|
+
`)];return{family:"solana",network:o,projectName:t,protocolModel:za["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:s,gate:{sourceChecks:{ok:a.includes("address = vault.authority")&&a.includes("checked_add")&&a.includes('seeds = [b"vault"')&&!a.includes("invoke_signed_unchecked"),checks:["authority constraint","checked slot arithmetic","PDA seed binding","no unchecked CPI"]},compiler:{tool:"anchor",requiredBeforeDeploy:!0,run:!1},tests:{tool:"anchor test",requiredBeforeDeploy:!0,run:!1},simulation:{cluster:o,requiredBeforeDeploy:!0,run:!1},firmAudit:!1,disclaimer:Au},deploymentPrepared:!1}}function JC(e){let t=pb(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||rt("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,x)=>ub(w,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&rt("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Iu(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=ub(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&rt("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=Iu(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(ja).join(",")})`,c=`and_v(v:older(${a}),pk(${ja(i)}))`,l=`taproot_tree(${s},${c})`,u=WC(r,o),d=KC(i,Number(a)),p=VC(db(u),db(d)),m=YC(r[0],p,n),f=`tr(${m.internalKey},{${s},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(a),miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[ut("policy/miniscript.txt",l),ut("policy/descriptor.txt",f),ut("policy/manifest.json",JSON.stringify(h,null,2)),ut("tests/policy-vectors.json",JSON.stringify({cooperative:{requiredSignatures:o,csvBlocks:0,expected:"spendable"},insufficientCooperative:{requiredSignatures:Math.max(0,o-1),csvBlocks:0,expected:"rejected"},earlyRecovery:{recoverySignature:!0,csvBlocks:Math.max(0,Number(a)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(a),expected:"spendable"}},null,2)),ut("SECURITY.md",`# Security model
|
|
135
135
|
|
|
136
136
|
- Cooperative path: ${o}-of-${r.length}
|
|
137
137
|
- Recovery path: ${i} after ${a} blocks (BIP68 relative locktime)
|
|
138
138
|
- This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
|
|
139
139
|
- Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
|
|
140
|
-
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:za["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:m,address:f.address,scriptPubKey:f.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:a.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:a.toString()},files:b,gate:{sourceChecks:{ok:o<=r.length&&a>0n&&new Set([...r,i]).size===r.length+1,checks:["bounded threshold","unique keys","positive BIP68 delay","separate recovery key"]},compiler:{tool:"rust-miniscript or equivalent",requiredBeforeFunding:!0,run:!1},tests:{tool:"regtest/signet policy satisfaction",requiredBeforeFunding:!0,run:!1},simulation:{network:n==="mainnet"?"signet or regtest required first":n,requiredBeforeFunding:!0,run:!1},firmAudit:!1,disclaimer:Iu},psbtPrepared:!1,fundingPrepared:!1}}function Wo(){return Object.values(za).map(e=>({...e,disclaimer:Iu}))}async function Go(e={}){let t=String(e.templateId||"").trim(),n=za[t];n||rt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?XP(e):QP(e),o=YP(r.files);return N({provider:"protocol-templates",kind:"native-protocol-build",templateId:t,supportStatus:n.supportStatus,prepareOnly:!0,firmAudit:!1,artifactHash:o,...r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,note:"Deterministic native protocol source bundle only. Compile, test, simulate, and separately prepare deployment/funding before user signature."},{provider:"protocol-templates",kind:"native-protocol-build"})}var Iu,sb,za,_u=Ee(()=>{Z();Iu="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",sb="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",za=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})})});var Sk={};Es(Sk,{CONTRACTS_EVAL_HERE:()=>IB,runContractsEval:()=>EB});import Ss from"node:fs";import an from"node:path";import{spawnSync as dB}from"node:child_process";import{fileURLToPath as pB}from"node:url";function xB(){let e=process.env.HOME||"";for(let t of["forge",an.join(e,".foundry/bin/forge")])if(dB(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function vk(e,t=[]){if(!Ss.existsSync(e))return t;for(let n of Ss.readdirSync(e)){let r=an.join(e,n);if(Ss.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;vk(r,t)}else n.endsWith(".sol")&&!r.includes(`${an.sep}lib${an.sep}`)&&t.push(r)}return t}function vB(){let e=[];for(let t of Object.keys(_n)){let n=an.join(mB,t),r=vk(an.join(n,"src")),o=[];for(let i of r){let a=Ss.readFileSync(i,"utf8");for(let s of fB)s.test(a)&&o.push(`${an.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function SB(){return xB()?Object.keys(_n).map(e=>{try{let t=zo(e,{allowSkipStatic:!0});return{language:"Solidity",templateId:e,ok:t.ok===!0&&t.forgeTests?.ok===!0,forge:t.forgeTests,firmAudit:t.firmAudit===!1}}catch(t){return{language:"Solidity",templateId:e,ok:!1,error:String(t?.message||t).slice(0,240)}}}):Object.keys(_n).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function kB(){let e=[],t=Wo();e.push({language:"catalog",ok:t.some(o=>o.family==="solana")&&t.some(o=>o.family==="bitcoin"),templates:t.map(o=>o.id)});let n=await Go({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:hB,programId:gB,unlockDelaySlots:1200});e.push({language:"Rust / Anchor",templateId:"solana-safe-vault",ok:n.oraclePrepared===!0&&n.signingReady===!1&&n.broadcastReady===!1&&n.firmAudit===!1,artifactHash:n.artifactHash});let r=await Go({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[yB,bB],recoveryPubkey:wB,recoveryDelayBlocks:144});return e.push({language:"Miniscript / Tapscript",templateId:"bitcoin-tapscript-vault",ok:r.oraclePrepared===!0&&r.psbtPrepared===!1&&r.broadcastReady===!1&&r.firmAudit===!1,artifactHash:r.artifactHash}),e}async function EB(){let e=vB(),t=SB(),n=await kB(),r=[...e,...t,...n],o=r.filter(a=>a.ok!==!0&&a.skipped!==!0).length,i=r.filter(a=>a.skipped===!0).length;return{ok:o===0,total:r.length,pass:r.length-o-i,fail:o,skipped:i,languages:["Solidity","Rust / Anchor","Miniscript / Tapscript"],firmAudit:!1,cases:r}}var mB,fB,hB,gB,yB,bB,wB,IB,kk=Ee(()=>{Fa();Ha();_u();vu();mB=Ba("protocols/templates",import.meta.url),fB=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],hB="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",gB="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",yB="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",bB="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",wB="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";IB=an.dirname(pB(import.meta.url))});he();import{Interface as $p,getAddress as Dr,isAddress as Bp}from"ethers";$();var eE=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"]);function Sp(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 qs(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),a=String(r||"").toLowerCase(),s=(t||[]).map((c,l)=>{let u=Sp(o,c),d=String(u.address||"").toLowerCase(),p=String(u.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,h=String(c.dex||c.dexId||"").toLowerCase(),b=0;return i.has(d)||eE.has(p)?b=300:a&&d===a&&(b=100),h.includes("v4")?b+=20:h.includes("v3")?b+=10:(h.includes("v2")||h.includes("raydium")||h.includes("orca")||h.includes("meteora"))&&(b+=8),{pool:c,score:b*1e12+m,index:l,otherAddr:d,liquidityUsd:m}});return s.sort((c,l)=>l.score-c.score||c.index-l.index),s.map(c=>c.pool)}function kp(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Sp(e,n[0]).address||null}var tE="https://api.dexscreener.com",nE=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),it=e=>String(e??"").toLowerCase(),rE=e=>Array.isArray(e)?e:e==null?[]:[e];function oE(e,t,n){let r=it(t),o=it(n),i=it(e?.baseToken?.address),a=it(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function iE(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function hi(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||tE).replace(/\/$/,"")}async function Ep(e={}){let n=(await k(`${hi(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function un(e,t={}){if(!e)throw new Error("tokenAddress required");return k(`${hi(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Fr(e,t={}){if(!e)throw new Error("query required");return k(`${hi(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ip(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return k(`${hi(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function Ap({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Ur({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Ur({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=it(nE[Number(e)]||e),a=new Set(rE(r).filter(Boolean).map(it)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>un(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 f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${it(f?.chainId)}:${it(f?.dexId)}:${it(f?.pairAddress)}`;l.has(m)||(l.add(m),u.push(f))}return u.filter(p=>it(p?.chainId)===i).filter(p=>oE(p,t,n)).filter(p=>!a.size||a.has(it(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:iE(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}import{createHash as uE,createHmac as Cp,timingSafeEqual as dE}from"node:crypto";import{readFileSync as sE}from"node:fs";import{homedir as cE}from"node:os";import{join as gi}from"node:path";function lE(){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=cE();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||gi(t,".config","oracle")).trim();return[e,gi(n,"exec.env")].filter(Boolean)}return[e,gi(t,".config","oracle","exec.env"),gi(t,".config","mad-desk","exec.env")].filter(Boolean)}function _p(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of lE())try{let i=sE(o,"utf8"),a=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(a&&(r=a[1].trim(),r))break}catch{}if(!String(r||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return r}var yi=100,Tp=2e4;function bi(e){return Array.isArray(e)?`[${e.map(bi).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${bi(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Pp(e,{required:t=!1}={}){try{return _p(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function js(e){let{signature:t,...n}=e;return n}function Np(e,{secret:t}={}){let n=Pp(t);return n?{...e,signature:Cp("sha256",n).update(bi(js(e))).digest("hex")}:e}function pE(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 uE("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function fe(e,{chainId:t,venue:n,data:r,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(n||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=Pp(o);if(i){let f=Cp("sha256",i).update(bi(js(e))).digest("hex");if(!mE(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let a=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(a)||a<0||a>yi||!Number.isInteger(s)||s<0||s>yi||a>s)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),l=BigInt(e.minAmountOut??0);if(c<=0n||l<=0n)throw new Error("auto-slippage guard amounts must be positive");let u=c*BigInt(1e4-a),d=u/10000n;if(u%10000n!==0n&&(d+=1n),l<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=hE(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 Np({...js(e),calldataHash:pE(r)},{secret:o})}function mE(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:dE(n,r)}function Hs(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function fE(e){let t=e==null?yi: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,yi)}function Fe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Hs(e,0),a=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,s=Math.min(60,Math.abs(Hs(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Hs(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=fE(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function zs({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:a=!1,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l=Tp,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Fe({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:a,requestedCapBps:s});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(l)||Tp)),h=d*BigInt(1e4-p.selectedBps),b=h/10000n;if(h%10000n!==0n&&(b+=1n),b>d&&(b=d),d>0n&&b<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let x=Number((d-b)*10000n/(d===0n?1n:d));if(x>p.capBps)throw new Error(`auto-slippage: realised floor implies ${x} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Np({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:b.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:u})}function hE(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let n=t.slice(0,10).toLowerCase(),r=[];for(let i=10;i+64<=t.length;i+=64)r.push(t.slice(i,i+64));let o=i=>r[i]==null?null:BigInt("0x"+r[i]);switch(n){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function re(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=zs({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}Z();var je={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},SE=[100,500,3e3,1e4],kE="0xddca3f43",wi=new $p(["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)"]),Lp=new $p(["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)"]),Mp="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Fp="0x0000000000000000000000000000000000000000",Gs=[100,500,2500,1e4],EE={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Gs}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Gs}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Gs}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Ys(e,t){let n=Number(e),r=je[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(je).join(", ")})`);let o=EE[n]||{};if(!t){if(!r.quoter||!r.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${n} (${r.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:n,venue:r.name,...r}}let i=String(t).toLowerCase();if(i===r.name&&r.quoter&&r.router)return{chainId:n,venue:r.name,...r};let a=o,s=a[i];if(!s){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(a)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:s.quoter,router:s.router,feeTiers:s.feeTiers||null}}function Ks(e,t){let n=je[Number(t)];if(!e||e===Mp||e===Fp||/^eth$/i.test(String(e)))return Dr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Dr(n.weth);if(/^usdc$/i.test(r))return Dr(n.usdc);if(!Bp(r))throw new Error(`invalid token address: ${e}`);return Dr(r)}function IE(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 AE(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 Un(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Ys(e.chainId??8453,e.venue),a=Ks(e.tokenIn||"WETH",n),s=Ks(e.tokenOut||je[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=i&&i.length?i:SE,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let S of u){let E=wi.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:S,sqrtPriceLimitX96:0n}]);try{let I=await U(n,"eth_call",[{to:r,data:E},"latest"],t);if(!I||I==="0x"){d.push({fee:S,ok:!1,error:"empty result"});continue}let _=wi.decodeFunctionResult("quoteExactInputSingle",I),T={fee:S,ok:!0,amountOut:_[0].toString(),sqrtPriceX96After:_[1].toString(),initializedTicksCrossed:Number(_[2]),gasEstimate:_[3].toString()};d.push(T),(!p||BigInt(T.amountOut)>BigInt(p.amountOut))&&(p=T)}catch(I){d.push({fee:S,ok:!1,error:String(I.message||I).slice(0,160)})}}if(!p){let S=d.map(E=>`${E.fee}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${S}`)}let f=e.liquidityUsd==null?await Ur({chainId:n,tokenA:a,tokenB:s,dexIds:IE(e.venue)},t).catch(()=>[]):[],m={};for(let S of f.slice(0,8))if(!(!S.pairAddress||!Bp(S.pairAddress)))try{let E=await U(n,"eth_call",[{to:S.pairAddress,data:kE},"latest"],t),I=E&&E!=="0x"&&E.length<=66?Number.parseInt(E,16):NaN;if(!Number.isFinite(I)||I<=0||I>1e6)continue;(m[I]==null||S.liquidityUsd>m[I].liquidityUsd)&&(m[I]=S)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let S=BigInt(p.amountOut),I=d.filter(_=>_.ok&&Number((S-BigInt(_.amountOut))*10000n/S)<=h).filter(_=>m[_.fee]?.liquidityUsd!=null).sort((_,T)=>m[T.fee].liquidityUsd-m[_.fee].liquidityUsd)[0];I&&I.fee!==p.fee&&(b={priceBestFee:p.fee,chosenFee:I.fee,chosenPoolUsd:m[I.fee].liquidityUsd,bandBps:h},p=I)}let x=m[p.fee]??null,w=f[0]??null,g=x??w,y=e.liquidityUsd??x?.liquidityUsd??w?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":x?"pool":w?"pair":null;return re({venue:"uniswap-v3",chainId:n,chain:je[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:y,liquiditySource:g,liquidityAttribution:v,liquidityPick:b,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:y,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Up(e={},t={}){let{chainId:n,quoter:r,router:o}=Ys(e.chainId??8453),i=(e.tokens||[]).map(p=>Ks(p,n)),a=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required");let c=AE(i,a),l=wi.encodeFunctionData("quoteExactInput",[c,s]),u=await U(n,"eth_call",[{to:r,data:l},"latest"],t),d=wi.decodeFunctionResult("quoteExactInput",u);return re({venue:"uniswap-v3",chainId:n,chain:je[n].name,quoter:r,tokens:i,fees:a,path:c,amountIn:s.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:n,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Xs(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Un({chainId:n,tokenIn:je[n].weth,tokenOut:je[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Dp(e={},t={}){let n=Number(e.chainId??8453),r=Ys(n,e.venue),o=Dr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Mp||i===Fp||/^eth$/i.test(i),s=await Un(e,t),c=Lp.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,fee:s.fee,recipient:o,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]),l=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,p=Lp.encodeFunctionData("multicall",[d,[c]]);return N({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:a?s.amountIn:"0",slippageGuard:fe(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function qp(e={}){let t=Number(e.chainId??8453);try{let n=await Xs({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 Hp(){return Object.entries(je).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}he();import{AbiCoder as TE,Interface as Qs,getAddress as mt,isAddress as Js,keccak256 as CE}from"ethers";Z();var qr=TE.defaultAbiCoder(),Oe="0x0000000000000000000000000000000000000000",ft={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"}},zp=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],vi=new Qs(["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)"]),PE=new Qs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),xi=new Qs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),jp=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"]]),NE=(1n<<14n)-1n,Zs=8388608;function Vp(e){let t=zr(e),n=Number(BigInt(t)&NE),r=Object.fromEntries(jp.map(([a,s])=>[s,!!(n&1<<a)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([a,s])=>r[a]&&!r[s]).map(([a,s])=>`${a} requires ${s}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(jp.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}var OE="0x10",RE="0x060c0f",LE="0x000000000022D473030F116dDEE9F6B43aC78BA3",$E="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function jr(e){let t=Number(e),n=ft[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(ft).join(", ")})`);return{chainId:t,...n}}function zr(e){if(e==null||e==="")return Oe;let t=String(e);if(!Js(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return mt(t)}function Dn(e,t){let n=ft[Number(t)];if(Hr(e))return mt(n.weth);let r=String(e);if(/^weth$/i.test(r))return mt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return mt(n.usdc);if(!Js(r))throw new Error(`invalid token address: ${e}`);return mt(r)}function Hr(e){let t=String(e||"").trim().toLowerCase();return!t||t===$E.toLowerCase()||t===Oe.toLowerCase()||t==="eth"}function ec({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=mt(e),a=mt(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=zr(o);return CE(qr.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function tc({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=mt(e),a=mt(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:zr(o)},zeroForOne:l}}function BE({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Vp(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),a=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,s=[],c="none";return e!==Oe&&(c="low",s.push("nonzero hook requires independent contract review")),r&&(c="medium",s.push("pool uses a dynamic LP fee")),a&&(c="medium",s.push("hook runs during swap or donate flow")),i&&(c="high",s.push("hook can return custom accounting deltas")),o.valid||(c="critical",s.push(...o.violations)),r&&e===Oe&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Oe&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Oe&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Oe,returnsDelta:i,reasons:Object.freeze(s)})}async function Wp(e={},t={}){let n=jr(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Dn(e.tokenIn||"WETH",n.chainId),o=Dn(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),a=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(a)||a<-8388608||a>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let s=zr(e.hooks),{poolKey:c}=tc({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=ec(c),u=t.rpcCall||U,d=xi.encodeFunctionData("getSlot0",[l]),p=xi.encodeFunctionData("getLiquidity",[l]),[f,m,h]=await Promise.all([u(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),u(n.chainId,"eth_call",[{to:n.stateView,data:p},"latest"],t),s===Oe?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),b=xi.decodeFunctionResult("getSlot0",f),x=xi.decodeFunctionResult("getLiquidity",m)[0],w=b[0],g=w>0n,y=s===Oe?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&Zs),S=BE({hook:s,codePresent:y,initialized:g,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:g,sqrtPriceX96:w.toString(),tick:Number(b[1]),protocolFee:Number(b[2]),lpFee:Number(b[3]),liquidity:x.toString(),dynamicFee:v}),hook:Object.freeze({address:s,codePresent:y,codeBytes:y?(h.length-2)/2:0,permissions:Vp(s)}),risk:S})}var Gp=["uniswap-v4","uniswapv4"];async function Vr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=jr(e.chainId??8453),a=Dn(e.tokenIn||"WETH",n),s=Dn(e.tokenOut||ft[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...zp],u=e.hooks||Oe,d=[],p=null;for(let E of l){let{poolKey:I,zeroForOne:_}=tc({tokenIn:a,tokenOut:s,fee:E.fee,tickSpacing:E.tickSpacing,hooks:u}),T=vi.encodeFunctionData("quoteExactInputSingle",[{poolKey:I,zeroForOne:_,exactAmount:c,hookData:"0x"}]);try{let C=await(t.rpcCall||U)(n,"eth_call",[{to:r,data:T},"latest"],t);if(!C||C==="0x"){d.push({...E,ok:!1,error:"empty result"});continue}let L=vi.decodeFunctionResult("quoteExactInputSingle",C),X={fee:E.fee,tickSpacing:E.tickSpacing,ok:!0,amountOut:L[0].toString(),gasEstimate:L[1].toString(),poolKey:I,zeroForOne:_,poolId:ec({...I})};d.push(X),(!p||BigInt(X.amountOut)>BigInt(p.amountOut))&&(p=X)}catch(C){d.push({...E,ok:!1,error:String(C.message||C).slice(0,160)})}}if(!p){let E=d.map(I=>`${I.fee}/${I.tickSpacing}:${I.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${E}`)}let f=e.liquidityUsd==null?await Ur({chainId:n,tokenA:a,tokenB:s,dexIds:Gp},t).catch(()=>[]):[],m=new Map;for(let E of f){let I=String(E.pairAddress||"").toLowerCase();I&&m.set(I,E)}let h=E=>m.get(String(E.poolId||"").toLowerCase())??null,b=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&b>0&&BigInt(p.amountOut)>0n){let E=BigInt(p.amountOut),_=d.filter(T=>T.ok&&Number((E-BigInt(T.amountOut))*10000n/E)<=b).filter(T=>h(T)?.liquidityUsd!=null).sort((T,C)=>h(C).liquidityUsd-h(T).liquidityUsd)[0];_&&_.poolId!==p.poolId&&(x={priceBestFee:p.fee,chosenFee:_.fee,chosenPoolUsd:h(_).liquidityUsd,bandBps:b},p=_)}let w=h(p),g=f[0]??null,y=w??g,v=e.liquidityUsd??w?.liquidityUsd??g?.liquidityUsd??null,S=e.liquidityUsd!=null?"caller":w?"pool":g?"pair":null;return re({venue:"uniswap-v4",chainId:n,chain:ft[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:v,liquiditySource:y,liquidityAttribution:S,liquidityPick:x,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Js(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&&!Hr(e.tokenIn)&&!Hr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Oe&&!(p.fee&Zs)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Kp(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=jr(e.chainId??8453),a=Dn(e.tokenIn||"WETH",n),s=Dn(e.tokenOut||ft[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}]:[...zp],u=e.hooks||Oe,d=[],p=null;for(let m of l){let{poolKey:h,zeroForOne:b}=tc({tokenIn:a,tokenOut:s,fee:m.fee,tickSpacing:m.tickSpacing,hooks:u}),x=vi.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:b,exactAmount:c,hookData:"0x"}]);try{let w=await(t.rpcCall||U)(n,"eth_call",[{to:r,data:x},"latest"],t);if(!w||w==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let g=vi.decodeFunctionResult("quoteExactOutputSingle",w),y={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:g[0].toString(),gasEstimate:g[1].toString(),poolKey:h,zeroForOne:b,poolId:ec({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(w){d.push({...m,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!p){let m=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${m}`)}let f=e.liquidityUsd==null?await Ap({chainId:n,tokenA:a,tokenB:s,dexIds:Gp},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:ft[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Yp(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(y=>Object.hasOwn(e,y)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=jr(r);if(zr(e.hooks)!==Oe)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Zs)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=mt(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let s=Number(e.slippageBps);if(!Number.isInteger(s)||s<0||s>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(Hr(e.tokenIn)||Hr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await Vr(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let u=BigInt(l.amountOut)*BigInt(1e4-s)/10000n,d={currency0:l.zeroForOne?l.tokenIn:l.tokenOut,currency1:l.zeroForOne?l.tokenOut:l.tokenIn,fee:l.fee,tickSpacing:l.tickSpacing,hooks:l.hooks},f=qr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,l.zeroForOne,BigInt(l.amountIn),u,0n,"0x"]]),m=qr.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=qr.encode(["address","uint256"],[l.tokenOut,u]),b=qr.encode(["bytes","bytes[]"],[RE,[f,m,h]]),w=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,g=PE.encodeFunctionData("execute",[OE,[b],w]);return N({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:w,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:LE,amount:l.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:g,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Xp(){return Object.entries(ft).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 Qp(e={}){let t=jr(e.chainId??8453),n=await U(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}$();import{readFileSync as qE,existsSync as HE}from"node:fs";import{getAddress as jE,Interface as ki,TypedDataEncoder as ic,parseUnits as zE}from"ethers";var Jp="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function ze({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let a=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(a===String(t).replace(/\/$/,""))return{baseUrl:a,trusted:!0,host:Zp(t)};let s;try{s=new URL(a)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(s.protocol!=="http:"&&s.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=s.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Zp(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return s.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:c}}if(String(process.env[Jp]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Jp}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Zp(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Ue(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}Z();var FE=/^(0|[1-9][0-9]*)$/,nc=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function pn(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!FE.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 UE(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function DE(e={}){return e.maxFeePerGas!=null?pn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?pn(e.gasPrice,"gasPrice"):null}function rc(e={}){try{let t=UE(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=pn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=pn(n.gasLimit??n.gas,"gasLimit"),s=DE(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=pn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=pn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:pn(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=a*s;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&s>c?{ok:!1,status:"BLOCK",reason:`unit fee ${s} exceeds cap ${c}`,chainId:t,unitFeeWei:s.toString(),maxFeePerGasWei:c.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString(),unitFeeWei:s.toString(),maxFeePerGasWei:c?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function em(e={}){let t=rc(e);if(!t.ok)throw new nc(t);return t}var VE="https://api.opensea.io/api/v2",WE="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)",GE=new ki([`function ${WE}`]),Si=new ki(["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"]),KE=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"]),YE=new Set(KE),am=new Set(["solana","flow"]),Wr="0x0000000000000000000000000000000000000000";function XE(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!HE(e))return"";try{for(let t of qE(e,"utf8").split(`
|
|
141
|
-
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function vt(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||XE()}function sm(e={}){return ze({provider:"opensea",defaultUrl:VE,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function mn(e={}){return sm(e).baseUrl}function fn(e={}){return Ue({accept:"application/json"},{"x-api-key":vt(e)},sm(e).trusted)}function cm(e){let t=String(e||"ethereum").trim().toLowerCase();if(!YE.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Y(e,t="address"){try{return jE(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function lm(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!am.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return Y(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 QE(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 JE(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 tm(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 ZE(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function um(e={}){if(!vt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Kr("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 Kr(e,t={}){if(!e)throw new Error("collection slug required");if(!vt(t))throw new Error("OPENSEA_API_KEY required");return k(`${mn(t)}/collections/${encodeURIComponent(e)}`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function dm(e,t={}){let n=await Kr(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function Yr(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=cm(e.chain),r=lm(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${mn(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await k(l.toString(),{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(ZE(d,n,r));s=u?.next?String(u.next):null,c+=1}while(s&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:a.length,pages:c,complete:!s,next:s,nfts:a,exec:!1,readOnly:!0}}async function Ei(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=lm(e.address||e.owner),r=await k(`${mn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var Ii=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});function Xr(e){let t=String(e||"").trim().toLowerCase(),n=Ii[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function De(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 eI(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 Gr(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function pm(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 mm(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 tI(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function nI(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=Y(e?.token,t);if(n===0&&r!==Wr)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Wr)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function rI(e,t){let n=De(e?.startAmount,`${t} startAmount`),r=De(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 oc(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(tI);if(!r.length){if(n)throw new Error(`opensea: ${t} contains no native or ERC20 payment item`);return{paymentToken:null,totalWei:0n,count:0}}let o=null,i=0n;for(let a of r){let s=nI(a,`${t} payment token`);if(o==null)o=s;else if(s!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=rI(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var oI=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});function Ve(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function nm(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 fm(e,t){return{itemType:Number(Ve(e?.itemType,`${t} itemType`)),token:Y(e?.token,`${t} token`),identifierOrCriteria:Ve(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Ve(e?.startAmount,`${t} startAmount`),endAmount:Ve(e?.endAmount,`${t} endAmount`)}}function iI(e,t){return{...fm(e,t),recipient:Y(e?.recipient,`${t} recipient`)}}function aI(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:Y(e.offerer,`${t} offerer`),zone:Y(e.zone,`${t} zone`),offer:n.map((o,i)=>fm(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>iI(o,`${t} consideration[${i}]`)),orderType:Number(Ve(e.orderType,`${t} orderType`)),startTime:Ve(e.startTime,`${t} startTime`),endTime:Ve(e.endTime,`${t} endTime`),zoneHash:nm(e.zoneHash,`${t} zoneHash`),salt:Ve(e.salt,`${t} salt`),conduitKey:nm(e.conduitKey,`${t} conduitKey`),counter:Ve(e.counter,`${t} counter`)}}function hm(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=aI(t,n);if(ic.hashStruct("OrderComponents",oI,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function gm(e,t){let n=Number(e?.itemType);if([4,5].includes(n))throw new Error(`opensea: ${t} is a criteria item, not a fixed token`);if(![2,3].includes(n))throw new Error(`opensea: ${t} must be an ERC-721 or ERC-1155 item`);let r=Y(e?.token,`${t} contract`),o=Gr(e?.identifierOrCriteria),i=De(e?.startAmount,`${t} startAmount`,{positive:!0}),a=De(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)throw new Error(`opensea: ${t} must be a fixed quantity, not a decaying range`);if(n===2&&i!==1n)throw new Error(`opensea: ${t} ERC-721 quantity must be exactly 1`);if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`opensea: ${t} quantity exceeds safe integer range`);return{itemType:n,contract:r,tokenId:o,quantity:Number(i)}}function sI(e,t){let n=Array.isArray(e?.offer)?e.offer:[];if(n.some(o=>[4,5].includes(Number(o?.itemType))))throw new Error(`opensea: ${t} uses a criteria offer item, not a fixed token`);let r=n.filter(o=>[2,3].includes(Number(o?.itemType)));if(r.length!==1||n.length!==1)throw new Error(`opensea: ${t} must offer exactly one fixed ERC-721 or ERC-1155 item`);return gm(r[0],`${t} offer NFT`)}function cI(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(a=>[4,5].includes(Number(a?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(a=>[2,3].includes(Number(a?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=gm(o[0],`${n} consideration NFT`);if(i.tokenId!==t)throw new Error(`opensea: ${n} consideration token does not match the requested token`);return i}function lI(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&Y(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 uI(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 ym(e,t,n,r){let o=Ve(t?.startTime,`${r} startTime`),i=Ve(t?.endTime,`${r} endTime`),a=BigInt(Math.floor(n/1e3));if(BigInt(o)>a)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=a)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let s=mm(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&uI(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function dI(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(Ii[r]!==t.chainId)throw new Error("opensea: OpenSea listing chain id mismatch");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active listing");let i=e.protocol_data?.parameters,a=sI(i,"listing"),s=a.contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=a.tokenId;lI(e.asset,s,c,"listing");let l=De(e.price?.current?.value,"listing price",{positive:!0}),u=hm(e,i,"listing"),d=oc(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:Y(e.protocol_address,"listing protocol address"),contract:s,tokenId:c,quantity:a.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:ym(e,i,n,"listing"),counter:Ve(i?.counter,"listing counter")}}async function ac(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=Xr(e.chain);n.contract=e.contract?Y(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(`${mn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await k(i.toString(),{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=Array.isArray(a?.listings)?a.listings:[];if(!s.length)throw new Error("opensea: no active best listings returned");let c=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return{provider:"opensea-nft",source:"opensea-best-listings",chain:n.chain,chainId:n.chainId,slug:r,contract:n.contract,listings:s.map(l=>dI(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Ai(e={},t={}){let n=Gr(e.tokenId),r=Math.min(Math.max(Number(e.maxPages??20)||20,1),25),o=e.next?String(e.next):null,i=new Set;for(let a=1;a<=r;a+=1){let s=await ac({...e,tokenId:void 0,limit:50,next:o},t),c=s.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:a,exact:!0,exec:!1,readOnly:!0};if(!s.next||i.has(s.next))break;i.add(s.next),o=s.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function pI(e,t,n,r){if(!e||typeof e!="object")throw new Error("opensea: invalid best offer");if(String(e.chain||"").trim().toLowerCase()!==t.chain)throw new Error("opensea: OpenSea returned an offer for the wrong chain");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active offer");let i=e.protocol_data?.parameters||{},s=cI(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=De(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=oc(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=oc(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(),f=(c-d.totalWei).toString();return{provider:"opensea-nft",source:"opensea-best-exact-offer",orderHash:hm(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:Y(e.protocol_address,"offer protocol address"),contract:s,tokenId:n,grossOfferWei:c.toString(),sellerNetWei:f,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:ym(e,i,r,"offer"),counter:Ve(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function _i(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=Xr(e.chain);n.contract=e.contract?Y(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Gr(e.tokenId),i=await k(`${mn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!a)throw new Error("opensea: no active exact NFT offer returned");let s=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return pI(a,n,o,s)}function mI(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 bm(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"&&bm(n))}function wm(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function xm(e){return!e||typeof e!="object"?!1:wm(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&xm(t))}function vm(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"&&vm(o,t,n);return t}function rm(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Sm(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(wm(e))throw new Error("opensea: signed transaction material refused");if((e.from?Y(rm(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=Y(rm(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,s=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&s){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=GE.encodeFunctionData("fulfillAdvancedOrder",[s.advancedOrder,s.criteriaResolvers,s.fulfillerConduitKey,s.recipient])}let c=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(c))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");c.endsWith(l.slice(2))||(c+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let d=eI(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Ti(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 sc(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=[];for(let c of e){let{chainId:l,...u}=Ti(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");await r.call(u);let d=await r.estimateGas(u);i.push(BigInt(d).toString())}else{let{rpcCall:d}=await Promise.resolve().then(()=>(he(),fi)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let f=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(f).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(he(),fi)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),f=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>f?u:f}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function fI(e,t){if(bm(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(xm(e))throw new Error("opensea: signed transaction material refused");let n=vm(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=>Sm(r,t))}function hI(e,t,n={}){return N({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function km(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function Em(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function gI(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=Y(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Ci(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");mI(e);let{chain:n,chainId:r}=Xr(e.chain),o=Y(e.buyer||e.minter||e.address,"buyer"),i=Y(e.contract,"NFT contract"),a=pm(e.quantity),s=De(e.priceWei,"priceWei"),c=De(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=mm(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 Kr(d,t),f=gI(p,n,i),m=s*BigInt(a);if(m>c)throw new Error("opensea: mint total exceeds total cap");let h=await k(`${mn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:fn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),b=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,x=Array.isArray(b)?b:b?[b]:[];if(!x.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let w=new Set(x.map(O=>Y(O,"SeaDrop mint target"))),g=fI(h,{buyer:o,chainId:r,targets:w});if(g.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,v,S=null,E;try{y=Si.decodeFunctionData("mintPublic",g[0].data),v="public",E=Si.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Si.decodeFunctionData("mintAllowList",g[0].data),v="allowlist";let O=y[4],q=[...y[5]].map(String);if(q.length<1||q.length>64||q.some(ve=>!/^0x[0-9a-fA-F]{64}$/.test(ve)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let B=BigInt(O.startTime),z=BigInt(O.endTime),pe=BigInt(Math.floor(l/1e3));if(B>pe||z<=pe)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(O.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(O.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");E=Si.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],O,q]),S={mintPrice:BigInt(O.mintPrice).toString(),maxTotalMintableByWallet:BigInt(O.maxTotalMintableByWallet).toString(),startTime:B.toString(),endTime:z.toString(),dropStageIndex:BigInt(O.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(O.maxTokenSupplyForStage).toString(),feeBps:Number(O.feeBps),restrictFeeRecipients:!!O.restrictFeeRecipients,proof:q}}catch(O){throw/opensea:/.test(String(O?.message||""))?O:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let I=Y(y[0],"mint NFT contract"),_=Y(y[1],"mint fee recipient"),T=Y(y[2],"mint recipient");if(I!==f)throw new Error("opensea: mint calldata collection mismatch");if(T!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(E.toLowerCase()!==g[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let C=g.reduce((O,q)=>O+q.valueWei,0n);if(C!==m)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(C>c)throw new Error("opensea: mint total exceeds total cap");let L=await sc(g,r,{...t,provider:e.provider||t.provider});if(L.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},Q=em({chainId:r,tx:g[0],policy:X});return hI({action:"mint",mintType:v,...S?{stage:S}:{},chain:n,chainId:r,slug:d,buyer:o,contract:f,quantity:a,priceWei:s.toString(),totalWei:C.toString(),maxTotalWei:c.toString(),mintTarget:g[0].to,feeRecipient:_,expiry:u,transactions:g.map(Ti),gasWar:Q,...L},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Ws,Date.parse(u),S?Number(BigInt(S.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function yI(e={}){let t=cm(e.chain);if(am.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?tm(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=tm(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:Y(e.contract,"NFT contract"),token_id:o,quantity:JE(e.quantity??1,"quantity"),price:{amount:QE(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:Y(e.price?.currency??e.currency??Wr,"price currency")},start_time:n.text,end_time:r.text}}var qn={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"}]},om=new ki(["function setApprovalForAll(address operator,bool approved)"]),bI=new ki(["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 im(e,t){return e?.[t]||(e?.action===t?e:null)}function wI(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(g=>im(g,"createListingsAction")).find(Boolean)||o.find(g=>/createListings/i.test(String(g?.action||""))),a=i?.signatureRequest?.message??i?.typedData,s;try{s=typeof a=="string"?JSON.parse(a):a}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!s||s.primaryType!=="OrderComponents"||!s.domain||!s.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=s.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=Y(c.verifyingContract,"listing protocol"),u=s.message;if(Y(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(Y(d.token,"listing collection")!==n.contract||String(d.identifierOrCriteria)!==n.token_id)throw new Error("opensea: listing NFT mismatch");if(String(d.startAmount)!==String(n.quantity)||String(d.endAmount)!==String(n.quantity))throw new Error("opensea: listing quantity mismatch");if(Number(u.orderType)!==2)throw new Error("opensea: only FULL_RESTRICTED listings are executable");if(!Array.isArray(u.consideration)||!u.consideration.length)throw new Error("opensea: listing consideration required");let p=0n;for(let g of u.consideration){if(Number(g.itemType)!==0||Y(g.token,"listing payment token")!==Wr)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(g.startAmount),v=BigInt(g.endAmount);if(y<=0n||y!==v)throw new Error("opensea: listing consideration must be fixed and positive");Y(g.recipient,"listing consideration recipient"),p+=y}let f=zE(n.price.amount,18);if(p!==f)throw new Error("opensea: listing price mismatch");let m=BigInt(Math.floor(Date.parse(n.start_time)/1e3)),h=BigInt(Math.floor(Date.parse(n.end_time)/1e3));if(BigInt(u.startTime)!==m||BigInt(u.endTime)!==h)throw new Error("opensea: listing time bounds mismatch");let b=ic.hashStruct("OrderComponents",qn,u),x=o.map(g=>im(g,"itemApprovalAction")).find(Boolean)||o.find(g=>/setApprovalForAll/i.test(String(g?.action||""))),w=null;if(x){let g=x.transaction||x.itemApprovalAction?.transaction,y=Sm(g,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=om.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let S=Y(v[0],"listing approval operator");if(v[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(om.encodeFunctionData("setApprovalForAll",[S,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");w={...y,operator:S}}return{protocolAddress:l,typedData:{domain:c,types:qn,primaryType:"OrderComponents",message:u},orderHash:b,priceWei:p,approval:w}}async function Pi(e={},t={}){if(!vt(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=Y(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(yI);if(new Set(o.map(f=>f.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let a=e.useCreatorFee!==!1,s={address:n,items:o,use_creator_fee:a};e.taker&&(s.taker=Y(e.taker,"taker"));let c=await k(`${mn(t)}/listings/actions`,{method:"POST",headers:fn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Xr(o[0].chain),u=wI(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await sc(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return N({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,chainId:l,kind:"nft-list",action:"list",prepareReady:!0,executionReady:p.simulated===!0,signingReady:p.simulated===!0,broadcastReady:p.simulated===!0,requiresUserSignature:!0,requiresSeparateApproval:d.length>0,seller:n,contract:o[0].contract,tokenId:o[0].token_id,quantity:o[0].quantity,priceWei:u.priceWei.toString(),typedData:u.typedData,orderHash:u.orderHash,submission:{chain:o[0].chain,protocol:"seaport",protocolAddress:u.protocolAddress},transactions:d.map(Ti),useCreatorFee:a,taker:s.taker||null,feeDisclosure:a?"Creator fees requested and bound into exact Seaport consideration recipients.":"Creator fees disabled by explicit request; every remaining consideration recipient is still bound.",...p})}async function Im(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Xr(e.chain),o=Y(e.seller||e.address||e.owner,"seller"),i=Y(e.protocolAddress,"reviewed Seaport protocol address"),a=Y(e.contract,"NFT contract"),s=Gr(e.tokenId),c=pm(e.quantity),l=e.typedData;if(!l||l.primaryType!=="OrderComponents"||!l.domain||!l.message)throw new Error("opensea: exact Seaport OrderComponents typedData required for cancellation");for(let[I,_]of Object.entries(qn)){let T=l.types?.[I];if(!Array.isArray(T)||T.length!==_.length||T.some((C,L)=>C?.name!==_[L].name||C?.type!==_[L].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(I=>I!=="EIP712Domain").sort().join(",")!==Object.keys(qn).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=Y(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let f=l.message;if(Y(f.offerer,"listing seller")!==o)throw new Error("opensea: cancellation seller mismatch");if(!Array.isArray(f.offer)||f.offer.length!==1||!Array.isArray(f.consideration)||!f.consideration.length)throw new Error("opensea: cancellation requires one exact previously prepared listing order");if(Number(f.orderType)!==2)throw new Error("opensea: cancellation requires a FULL_RESTRICTED listing order");let m=f.offer[0];if(![2,3].includes(Number(m.itemType)))throw new Error("opensea: cancellation offer must be ERC721 or ERC1155");if(Y(m.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Gr(m.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=De(m.startAmount,"cancellation offer startAmount",{positive:!0}),b=De(m.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||b!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let I of f.consideration){if(Number(I.itemType)!==0||Y(I.token,"cancellation payment token")!==Wr)throw new Error("opensea: cancellation requires native fixed-price consideration");let _=De(I.startAmount,"cancellation consideration startAmount",{positive:!0}),T=De(I.endAmount,"cancellation consideration endAmount",{positive:!0});if(_!==T)throw new Error("opensea: cancellation consideration must be fixed and positive");Y(I.recipient,"cancellation consideration recipient")}let x=De(f.startTime,"cancellation startTime");if(De(f.endTime,"cancellation endTime",{positive:!0})<=x)throw new Error("opensea: cancellation listing time bounds invalid");let g=ic.hashStruct("OrderComponents",qn,f),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==g.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=bI.encodeFunctionData("cancel",[[f]]),S=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],E=await sc(S,r,{...t,provider:e.provider||t.provider});if(E.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return N({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:a,tokenId:s,quantity:c,protocolAddress:p,orderHash:g,typedData:{domain:d,types:qn,primaryType:"OrderComponents",message:f},transactions:S.map(Ti),...E,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}he();var Ni=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),G=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),H=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),vI=/^0x[0-9a-fA-F]{40}$/;function SI(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let a=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${a} must be an object`);continue}vI.test(i.address||"")||t.push(`${a}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${a}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${a}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${a}.verified.method is required`),i.verified.source||t.push(`${a}.verified.source is required`),i.verified.date||n.push(`${a}.verified.date missing -- add one so staleness is visible`)):t.push(`${a} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))Ni.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 kI(e){let{ok:t,errors:n,warnings:r}=SI(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
140
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:za["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:a.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:a.toString()},files:g,gate:{sourceChecks:{ok:o<=r.length&&a>0n&&new Set([...r,i]).size===r.length+1,checks:["bounded threshold","unique keys","positive BIP68 delay","separate recovery key"]},compiler:{tool:"rust-miniscript or equivalent",requiredBeforeFunding:!0,run:!1},tests:{tool:"regtest/signet policy satisfaction",requiredBeforeFunding:!0,run:!1},simulation:{network:n==="mainnet"?"signet or regtest required first":n,requiredBeforeFunding:!0,run:!1},firmAudit:!1,disclaimer:Au},psbtPrepared:!1,fundingPrepared:!1}}function Go(){return Object.values(za).map(e=>({...e,disclaimer:Au}))}async function Ko(e={}){let t=String(e.templateId||"").trim(),n=za[t];n||rt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?QC(e):JC(e),o=XC(r.files);return N({provider:"protocol-templates",kind:"native-protocol-build",templateId:t,supportStatus:n.supportStatus,prepareOnly:!0,firmAudit:!1,artifactHash:o,...r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,note:"Deterministic native protocol source bundle only. Compile, test, simulate, and separately prepare deployment/funding before user signature."},{provider:"protocol-templates",kind:"native-protocol-build"})}var Au,cb,za,Tu=Ee(()=>{Z();Au="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",cb="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",za=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})})});var kk={};Es(kk,{CONTRACTS_EVAL_HERE:()=>AB,runContractsEval:()=>IB});import Ss from"node:fs";import an from"node:path";import{spawnSync as pB}from"node:child_process";import{fileURLToPath as mB}from"node:url";function vB(){let e=process.env.HOME||"";for(let t of["forge",an.join(e,".foundry/bin/forge")])if(pB(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function Sk(e,t=[]){if(!Ss.existsSync(e))return t;for(let n of Ss.readdirSync(e)){let r=an.join(e,n);if(Ss.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;Sk(r,t)}else n.endsWith(".sol")&&!r.includes(`${an.sep}lib${an.sep}`)&&t.push(r)}return t}function SB(){let e=[];for(let t of Object.keys(_n)){let n=an.join(fB,t),r=Sk(an.join(n,"src")),o=[];for(let i of r){let a=Ss.readFileSync(i,"utf8");for(let s of hB)s.test(a)&&o.push(`${an.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function kB(){return vB()?Object.keys(_n).map(e=>{try{let t=Vo(e,{allowSkipStatic:!0});return{language:"Solidity",templateId:e,ok:t.ok===!0&&t.forgeTests?.ok===!0,forge:t.forgeTests,firmAudit:t.firmAudit===!1}}catch(t){return{language:"Solidity",templateId:e,ok:!1,error:String(t?.message||t).slice(0,240)}}}):Object.keys(_n).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function EB(){let e=[],t=Go();e.push({language:"catalog",ok:t.some(o=>o.family==="solana")&&t.some(o=>o.family==="bitcoin"),templates:t.map(o=>o.id)});let n=await Ko({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:gB,programId:yB,unlockDelaySlots:1200});e.push({language:"Rust / Anchor",templateId:"solana-safe-vault",ok:n.oraclePrepared===!0&&n.signingReady===!1&&n.broadcastReady===!1&&n.firmAudit===!1,artifactHash:n.artifactHash});let r=await Ko({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[bB,wB],recoveryPubkey:xB,recoveryDelayBlocks:144});return e.push({language:"Miniscript / Tapscript",templateId:"bitcoin-tapscript-vault",ok:r.oraclePrepared===!0&&r.psbtPrepared===!1&&r.broadcastReady===!1&&r.firmAudit===!1,artifactHash:r.artifactHash}),e}async function IB(){let e=SB(),t=kB(),n=await EB(),r=[...e,...t,...n],o=r.filter(a=>a.ok!==!0&&a.skipped!==!0).length,i=r.filter(a=>a.skipped===!0).length;return{ok:o===0,total:r.length,pass:r.length-o-i,fail:o,skipped:i,languages:["Solidity","Rust / Anchor","Miniscript / Tapscript"],firmAudit:!1,cases:r}}var fB,hB,gB,yB,bB,wB,xB,AB,Ek=Ee(()=>{Fa();Ha();Tu();Su();fB=Ba("protocols/templates",import.meta.url),hB=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],gB="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",yB="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",bB="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",wB="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",xB="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";AB=an.dirname(mB(import.meta.url))});he();import{Interface as Bp,getAddress as Dr,isAddress as Mp}from"ethers";$();var tE=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"]);function kp(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 qs(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),a=String(r||"").toLowerCase(),s=(t||[]).map((c,l)=>{let u=kp(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)||tE.has(p)?g=300:a&&d===a&&(g=100),h.includes("v4")?g+=20:h.includes("v3")?g+=10:(h.includes("v2")||h.includes("raydium")||h.includes("orca")||h.includes("meteora"))&&(g+=8),{pool:c,score:g*1e12+f,index:l,otherAddr:d,liquidityUsd:f}});return s.sort((c,l)=>l.score-c.score||c.index-l.index),s.map(c=>c.pool)}function Ep(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&kp(e,n[0]).address||null}var nE="https://api.dexscreener.com",rE=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),it=e=>String(e??"").toLowerCase(),oE=e=>Array.isArray(e)?e:e==null?[]:[e];function iE(e,t,n){let r=it(t),o=it(n),i=it(e?.baseToken?.address),a=it(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function aE(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function gi(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||nE).replace(/\/$/,"")}async function Ip(e={}){let n=(await E(`${gi(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function un(e,t={}){if(!e)throw new Error("tokenAddress required");return E(`${gi(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Fr(e,t={}){if(!e)throw new Error("query required");return E(`${gi(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ap(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return E(`${gi(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function _p({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Ur({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Ur({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=it(rE[Number(e)]||e),a=new Set(oE(r).filter(Boolean).map(it)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>un(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=`${it(m?.chainId)}:${it(m?.dexId)}:${it(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>it(p?.chainId)===i).filter(p=>iE(p,t,n)).filter(p=>!a.size||a.has(it(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:aE(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}import{createHash as dE,createHmac as Cp,timingSafeEqual as pE}from"node:crypto";import{readFileSync as cE}from"node:fs";import{homedir as lE}from"node:os";import{join as yi}from"node:path";function uE(){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=lE();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||yi(t,".config","oracle")).trim();return[e,yi(n,"exec.env")].filter(Boolean)}return[e,yi(t,".config","oracle","exec.env"),yi(t,".config","mad-desk","exec.env")].filter(Boolean)}function Tp(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of uE())try{let i=cE(o,"utf8"),a=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(a&&(r=a[1].trim(),r))break}catch{}if(!String(r||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return r}var bi=100,Pp=2e4;function wi(e){return Array.isArray(e)?`[${e.map(wi).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wi(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Np(e,{required:t=!1}={}){try{return Tp(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function js(e){let{signature:t,...n}=e;return n}function Op(e,{secret:t}={}){let n=Np(t);return n?{...e,signature:Cp("sha256",n).update(wi(js(e))).digest("hex")}:e}function mE(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 dE("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function fe(e,{chainId:t,venue:n,data:r,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(n||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=Np(o);if(i){let m=Cp("sha256",i).update(wi(js(e))).digest("hex");if(!fE(e.signature,m))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let a=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(a)||a<0||a>bi||!Number.isInteger(s)||s<0||s>bi||a>s)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),l=BigInt(e.minAmountOut??0);if(c<=0n||l<=0n)throw new Error("auto-slippage guard amounts must be positive");let u=c*BigInt(1e4-a),d=u/10000n;if(u%10000n!==0n&&(d+=1n),l<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=gE(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 Op({...js(e),calldataHash:mE(r)},{secret:o})}function fE(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:pE(n,r)}function Hs(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function hE(e){let t=e==null?bi: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,bi)}function Fe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Hs(e,0),a=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,s=Math.min(60,Math.abs(Hs(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Hs(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=hE(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function zs({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:a=!1,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l=Pp,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Fe({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:a,requestedCapBps:s});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let m=Number(c);if(!Number.isFinite(m))throw new Error("auto-slippage: quotedAtMs must be a finite number");let f=Math.min(3e4,Math.max(1e3,Number(l)||Pp)),h=d*BigInt(1e4-p.selectedBps),g=h/10000n;if(h%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let w=Number((d-g)*10000n/(d===0n?1n:d));if(w>p.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Op({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 gE(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let n=t.slice(0,10).toLowerCase(),r=[];for(let i=10;i+64<=t.length;i+=64)r.push(t.slice(i,i+64));let o=i=>r[i]==null?null:BigInt("0x"+r[i]);switch(n){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function re(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=zs({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}Z();var je={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},kE=[100,500,3e3,1e4],EE="0xddca3f43",xi=new Bp(["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)"]),$p=new Bp(["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)"]),Fp="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Up="0x0000000000000000000000000000000000000000",Gs=[100,500,2500,1e4],IE={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Gs}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Gs}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Gs}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Ys(e,t){let n=Number(e),r=je[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(je).join(", ")})`);let o=IE[n]||{};if(!t){if(!r.quoter||!r.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${n} (${r.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:n,venue:r.name,...r}}let i=String(t).toLowerCase();if(i===r.name&&r.quoter&&r.router)return{chainId:n,venue:r.name,...r};let a=o,s=a[i];if(!s){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(a)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:s.quoter,router:s.router,feeTiers:s.feeTiers||null}}function Ks(e,t){let n=je[Number(t)];if(!e||e===Fp||e===Up||/^eth$/i.test(String(e)))return Dr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Dr(n.weth);if(/^usdc$/i.test(r))return Dr(n.usdc);if(!Mp(r))throw new Error(`invalid token address: ${e}`);return Dr(r)}function AE(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 _E(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 Un(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Ys(e.chainId??8453,e.venue),a=Ks(e.tokenIn||"WETH",n),s=Ks(e.tokenOut||je[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=i&&i.length?i:kE,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let k of u){let S=xi.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let I=await U(n,"eth_call",[{to:r,data:S},"latest"],t);if(!I||I==="0x"){d.push({fee:k,ok:!1,error:"empty result"});continue}let T=xi.decodeFunctionResult("quoteExactInputSingle",I),_={fee:k,ok:!0,amountOut:T[0].toString(),sqrtPriceX96After:T[1].toString(),initializedTicksCrossed:Number(T[2]),gasEstimate:T[3].toString()};d.push(_),(!p||BigInt(_.amountOut)>BigInt(p.amountOut))&&(p=_)}catch(I){d.push({fee:k,ok:!1,error:String(I.message||I).slice(0,160)})}}if(!p){let k=d.map(S=>`${S.fee}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${k}`)}let m=e.liquidityUsd==null?await Ur({chainId:n,tokenA:a,tokenB:s,dexIds:AE(e.venue)},t).catch(()=>[]):[],f={};for(let k of m.slice(0,8))if(!(!k.pairAddress||!Mp(k.pairAddress)))try{let S=await U(n,"eth_call",[{to:k.pairAddress,data:EE},"latest"],t),I=S&&S!=="0x"&&S.length<=66?Number.parseInt(S,16):NaN;if(!Number.isFinite(I)||I<=0||I>1e6)continue;(f[I]==null||k.liquidityUsd>f[I].liquidityUsd)&&(f[I]=k)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let k=BigInt(p.amountOut),I=d.filter(T=>T.ok&&Number((k-BigInt(T.amountOut))*10000n/k)<=h).filter(T=>f[T.fee]?.liquidityUsd!=null).sort((T,_)=>f[_.fee].liquidityUsd-f[T.fee].liquidityUsd)[0];I&&I.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:I.fee,chosenPoolUsd:f[I.fee].liquidityUsd,bandBps:h},p=I)}let w=f[p.fee]??null,x=m[0]??null,b=w??x,y=e.liquidityUsd??w?.liquidityUsd??x?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":w?"pool":x?"pair":null;return re({venue:"uniswap-v3",chainId:n,chain:je[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:y,liquiditySource:b,liquidityAttribution:v,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:y,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Dp(e={},t={}){let{chainId:n,quoter:r,router:o}=Ys(e.chainId??8453),i=(e.tokens||[]).map(p=>Ks(p,n)),a=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required");let c=_E(i,a),l=xi.encodeFunctionData("quoteExactInput",[c,s]),u=await U(n,"eth_call",[{to:r,data:l},"latest"],t),d=xi.decodeFunctionResult("quoteExactInput",u);return re({venue:"uniswap-v3",chainId:n,chain:je[n].name,quoter:r,tokens:i,fees:a,path:c,amountIn:s.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:n,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Xs(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Un({chainId:n,tokenIn:je[n].weth,tokenOut:je[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function qp(e={},t={}){let n=Number(e.chainId??8453),r=Ys(n,e.venue),o=Dr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Fp||i===Up||/^eth$/i.test(i),s=await Un(e,t),c=$p.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,fee:s.fee,recipient:o,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]),l=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,p=$p.encodeFunctionData("multicall",[d,[c]]);return N({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:a?s.amountIn:"0",slippageGuard:fe(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Hp(e={}){let t=Number(e.chainId??8453);try{let n=await Xs({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 jp(){return Object.entries(je).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}he();import{AbiCoder as PE,Interface as Qs,getAddress as mt,isAddress as Js,keccak256 as CE}from"ethers";Z();var qr=PE.defaultAbiCoder(),Oe="0x0000000000000000000000000000000000000000",ft={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"}},Vp=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Si=new Qs(["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)"]),NE=new Qs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),vi=new Qs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),zp=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"]]),OE=(1n<<14n)-1n,Zs=8388608;function Wp(e){let t=zr(e),n=Number(BigInt(t)&OE),r=Object.fromEntries(zp.map(([a,s])=>[s,!!(n&1<<a)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([a,s])=>r[a]&&!r[s]).map(([a,s])=>`${a} requires ${s}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(zp.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}var RE="0x10",LE="0x060c0f",$E="0x000000000022D473030F116dDEE9F6B43aC78BA3",BE="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function jr(e){let t=Number(e),n=ft[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(ft).join(", ")})`);return{chainId:t,...n}}function zr(e){if(e==null||e==="")return Oe;let t=String(e);if(!Js(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return mt(t)}function Dn(e,t){let n=ft[Number(t)];if(Hr(e))return mt(n.weth);let r=String(e);if(/^weth$/i.test(r))return mt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return mt(n.usdc);if(!Js(r))throw new Error(`invalid token address: ${e}`);return mt(r)}function Hr(e){let t=String(e||"").trim().toLowerCase();return!t||t===BE.toLowerCase()||t===Oe.toLowerCase()||t==="eth"}function ec({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=mt(e),a=mt(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=zr(o);return CE(qr.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function tc({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=mt(e),a=mt(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:zr(o)},zeroForOne:l}}function ME({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Wp(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),a=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,s=[],c="none";return e!==Oe&&(c="low",s.push("nonzero hook requires independent contract review")),r&&(c="medium",s.push("pool uses a dynamic LP fee")),a&&(c="medium",s.push("hook runs during swap or donate flow")),i&&(c="high",s.push("hook can return custom accounting deltas")),o.valid||(c="critical",s.push(...o.violations)),r&&e===Oe&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Oe&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Oe&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Oe,returnsDelta:i,reasons:Object.freeze(s)})}async function Gp(e={},t={}){let n=jr(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Dn(e.tokenIn||"WETH",n.chainId),o=Dn(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),a=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(a)||a<-8388608||a>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let s=zr(e.hooks),{poolKey:c}=tc({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=ec(c),u=t.rpcCall||U,d=vi.encodeFunctionData("getSlot0",[l]),p=vi.encodeFunctionData("getLiquidity",[l]),[m,f,h]=await Promise.all([u(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),u(n.chainId,"eth_call",[{to:n.stateView,data:p},"latest"],t),s===Oe?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),g=vi.decodeFunctionResult("getSlot0",m),w=vi.decodeFunctionResult("getLiquidity",f)[0],x=g[0],b=x>0n,y=s===Oe?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&Zs),k=ME({hook:s,codePresent:y,initialized:b,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:b,sqrtPriceX96:x.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:w.toString(),dynamicFee:v}),hook:Object.freeze({address:s,codePresent:y,codeBytes:y?(h.length-2)/2:0,permissions:Wp(s)}),risk:k})}var Kp=["uniswap-v4","uniswapv4"];async function Vr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=jr(e.chainId??8453),a=Dn(e.tokenIn||"WETH",n),s=Dn(e.tokenOut||ft[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Vp],u=e.hooks||Oe,d=[],p=null;for(let S of l){let{poolKey:I,zeroForOne:T}=tc({tokenIn:a,tokenOut:s,fee:S.fee,tickSpacing:S.tickSpacing,hooks:u}),_=Si.encodeFunctionData("quoteExactInputSingle",[{poolKey:I,zeroForOne:T,exactAmount:c,hookData:"0x"}]);try{let C=await(t.rpcCall||U)(n,"eth_call",[{to:r,data:_},"latest"],t);if(!C||C==="0x"){d.push({...S,ok:!1,error:"empty result"});continue}let L=Si.decodeFunctionResult("quoteExactInputSingle",C),D={fee:S.fee,tickSpacing:S.tickSpacing,ok:!0,amountOut:L[0].toString(),gasEstimate:L[1].toString(),poolKey:I,zeroForOne:T,poolId:ec({...I})};d.push(D),(!p||BigInt(D.amountOut)>BigInt(p.amountOut))&&(p=D)}catch(C){d.push({...S,ok:!1,error:String(C.message||C).slice(0,160)})}}if(!p){let S=d.map(I=>`${I.fee}/${I.tickSpacing}:${I.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${S}`)}let m=e.liquidityUsd==null?await Ur({chainId:n,tokenA:a,tokenB:s,dexIds:Kp},t).catch(()=>[]):[],f=new Map;for(let S of m){let I=String(S.pairAddress||"").toLowerCase();I&&f.set(I,S)}let h=S=>f.get(String(S.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let S=BigInt(p.amountOut),T=d.filter(_=>_.ok&&Number((S-BigInt(_.amountOut))*10000n/S)<=g).filter(_=>h(_)?.liquidityUsd!=null).sort((_,C)=>h(C).liquidityUsd-h(_).liquidityUsd)[0];T&&T.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:T.fee,chosenPoolUsd:h(T).liquidityUsd,bandBps:g},p=T)}let x=h(p),b=m[0]??null,y=x??b,v=e.liquidityUsd??x?.liquidityUsd??b?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":x?"pool":b?"pair":null;return re({venue:"uniswap-v4",chainId:n,chain:ft[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:v,liquiditySource:y,liquidityAttribution:k,liquidityPick:w,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Js(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&&!Hr(e.tokenIn)&&!Hr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Oe&&!(p.fee&Zs)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Yp(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=jr(e.chainId??8453),a=Dn(e.tokenIn||"WETH",n),s=Dn(e.tokenOut||ft[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}]:[...Vp],u=e.hooks||Oe,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=tc({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),w=Si.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||U)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let b=Si.decodeFunctionResult("quoteExactOutputSingle",x),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:b[0].toString(),gasEstimate:b[1].toString(),poolKey:h,zeroForOne:g,poolId:ec({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await _p({chainId:n,tokenA:a,tokenB:s,dexIds:Kp},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:ft[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Xp(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(y=>Object.hasOwn(e,y)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=jr(r);if(zr(e.hooks)!==Oe)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Zs)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=mt(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let s=Number(e.slippageBps);if(!Number.isInteger(s)||s<0||s>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(Hr(e.tokenIn)||Hr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await Vr(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let u=BigInt(l.amountOut)*BigInt(1e4-s)/10000n,d={currency0:l.zeroForOne?l.tokenIn:l.tokenOut,currency1:l.zeroForOne?l.tokenOut:l.tokenIn,fee:l.fee,tickSpacing:l.tickSpacing,hooks:l.hooks},m=qr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,l.zeroForOne,BigInt(l.amountIn),u,0n,"0x"]]),f=qr.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=qr.encode(["address","uint256"],[l.tokenOut,u]),g=qr.encode(["bytes","bytes[]"],[LE,[m,f,h]]),x=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,b=NE.encodeFunctionData("execute",[RE,[g],x]);return N({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:x,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:$E,amount:l.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:b,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Qp(){return Object.entries(ft).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 Jp(e={}){let t=jr(e.chainId??8453),n=await U(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}$();import{readFileSync as HE,existsSync as jE}from"node:fs";import{getAddress as zE,Interface as Ei,TypedDataEncoder as ic,parseUnits as VE}from"ethers";var Zp="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function ze({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let a=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(a===String(t).replace(/\/$/,""))return{baseUrl:a,trusted:!0,host:em(t)};let s;try{s=new URL(a)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(s.protocol!=="http:"&&s.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=s.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([em(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return s.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:c}}if(String(process.env[Zp]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Zp}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function em(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Ue(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}Z();var UE=/^(0|[1-9][0-9]*)$/,nc=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function pn(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!UE.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 DE(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function qE(e={}){return e.maxFeePerGas!=null?pn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?pn(e.gasPrice,"gasPrice"):null}function rc(e={}){try{let t=DE(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=pn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=pn(n.gasLimit??n.gas,"gasLimit"),s=qE(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=pn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=pn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:pn(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=a*s;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&s>c?{ok:!1,status:"BLOCK",reason:`unit fee ${s} exceeds cap ${c}`,chainId:t,unitFeeWei:s.toString(),maxFeePerGasWei:c.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString(),unitFeeWei:s.toString(),maxFeePerGasWei:c?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function tm(e={}){let t=rc(e);if(!t.ok)throw new nc(t);return t}var WE="https://api.opensea.io/api/v2",GE="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)",KE=new Ei([`function ${GE}`]),ki=new Ei(["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"]),YE=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"]),XE=new Set(YE),sm=new Set(["solana","flow"]),Wr="0x0000000000000000000000000000000000000000";function QE(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!jE(e))return"";try{for(let t of HE(e,"utf8").split(`
|
|
141
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function vt(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||QE()}function cm(e={}){return ze({provider:"opensea",defaultUrl:WE,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function mn(e={}){return cm(e).baseUrl}function fn(e={}){return Ue({accept:"application/json"},{"x-api-key":vt(e)},cm(e).trusted)}function lm(e){let t=String(e||"ethereum").trim().toLowerCase();if(!XE.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Q(e,t="address"){try{return zE(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function um(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!sm.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return Q(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function JE(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 ZE(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 nm(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 eI(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function dm(e={}){if(!vt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Kr("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 Kr(e,t={}){if(!e)throw new Error("collection slug required");if(!vt(t))throw new Error("OPENSEA_API_KEY required");return E(`${mn(t)}/collections/${encodeURIComponent(e)}`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function pm(e,t={}){let n=await Kr(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function Yr(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=lm(e.chain),r=um(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${mn(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await E(l.toString(),{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(eI(d,n,r));s=u?.next?String(u.next):null,c+=1}while(s&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:a.length,pages:c,complete:!s,next:s,nfts:a,exec:!1,readOnly:!0}}async function Ii(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=um(e.address||e.owner),r=await E(`${mn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var Ai=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});function Xr(e){let t=String(e||"").trim().toLowerCase(),n=Ai[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function De(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 tI(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 Gr(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function mm(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 fm(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 nI(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function rI(e,t){let n=Number(e?.itemType);if(![0,1].includes(n))throw new Error(`opensea: ${t} is not a native or ERC20 payment item`);let r=Q(e?.token,t);if(n===0&&r!==Wr)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Wr)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function oI(e,t){let n=De(e?.startAmount,`${t} startAmount`),r=De(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 oc(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(nI);if(!r.length){if(n)throw new Error(`opensea: ${t} contains no native or ERC20 payment item`);return{paymentToken:null,totalWei:0n,count:0}}let o=null,i=0n;for(let a of r){let s=rI(a,`${t} payment token`);if(o==null)o=s;else if(s!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=oI(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var iI=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});function Ve(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function rm(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(n))throw new Error(`opensea: ${t} must be a 32-byte hex value`);return n}function hm(e,t){return{itemType:Number(Ve(e?.itemType,`${t} itemType`)),token:Q(e?.token,`${t} token`),identifierOrCriteria:Ve(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Ve(e?.startAmount,`${t} startAmount`),endAmount:Ve(e?.endAmount,`${t} endAmount`)}}function aI(e,t){return{...hm(e,t),recipient:Q(e?.recipient,`${t} recipient`)}}function sI(e,t){if(!e||typeof e!="object")throw new Error(`opensea: ${t} has no canonical Seaport protocol parameters`);let n=Array.isArray(e.offer)?e.offer:null,r=Array.isArray(e.consideration)?e.consideration:null;if(!n||!n.length)throw new Error(`opensea: ${t} canonical offer array is missing`);if(!r||!r.length)throw new Error(`opensea: ${t} canonical consideration array is missing`);return{offerer:Q(e.offerer,`${t} offerer`),zone:Q(e.zone,`${t} zone`),offer:n.map((o,i)=>hm(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>aI(o,`${t} consideration[${i}]`)),orderType:Number(Ve(e.orderType,`${t} orderType`)),startTime:Ve(e.startTime,`${t} startTime`),endTime:Ve(e.endTime,`${t} endTime`),zoneHash:rm(e.zoneHash,`${t} zoneHash`),salt:Ve(e.salt,`${t} salt`),conduitKey:rm(e.conduitKey,`${t} conduitKey`),counter:Ve(e.counter,`${t} counter`)}}function gm(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=sI(t,n);if(ic.hashStruct("OrderComponents",iI,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function ym(e,t){let n=Number(e?.itemType);if([4,5].includes(n))throw new Error(`opensea: ${t} is a criteria item, not a fixed token`);if(![2,3].includes(n))throw new Error(`opensea: ${t} must be an ERC-721 or ERC-1155 item`);let r=Q(e?.token,`${t} contract`),o=Gr(e?.identifierOrCriteria),i=De(e?.startAmount,`${t} startAmount`,{positive:!0}),a=De(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)throw new Error(`opensea: ${t} must be a fixed quantity, not a decaying range`);if(n===2&&i!==1n)throw new Error(`opensea: ${t} ERC-721 quantity must be exactly 1`);if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`opensea: ${t} quantity exceeds safe integer range`);return{itemType:n,contract:r,tokenId:o,quantity:Number(i)}}function cI(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 ym(r[0],`${t} offer NFT`)}function lI(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(a=>[4,5].includes(Number(a?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(a=>[2,3].includes(Number(a?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=ym(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 uI(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&Q(e.contract,`${r} display contract`)!==t)throw new Error(`opensea: ${r} display asset contract disagrees with the canonical Seaport offer`);if(e.identifier!=null&&String(e.identifier).trim()!==""&&String(e.identifier).trim()!==n)throw new Error(`opensea: ${r} display asset token disagrees with the canonical Seaport offer`)}}function dI(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 bm(e,t,n,r){let o=Ve(t?.startTime,`${r} startTime`),i=Ve(t?.endTime,`${r} endTime`),a=BigInt(Math.floor(n/1e3));if(BigInt(o)>a)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=a)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let s=fm(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&dI(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function pI(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(Ai[r]!==t.chainId)throw new Error("opensea: OpenSea listing chain id mismatch");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active listing");let i=e.protocol_data?.parameters,a=cI(i,"listing"),s=a.contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=a.tokenId;uI(e.asset,s,c,"listing");let l=De(e.price?.current?.value,"listing price",{positive:!0}),u=gm(e,i,"listing"),d=oc(i?.consideration,"listing consideration");if(d.totalWei!==l)throw new Error("opensea: listing consideration total does not equal the quoted listing price");return{orderHash:u,chain:t.chain,chainId:t.chainId,protocolAddress:Q(e.protocol_address,"listing protocol address"),contract:s,tokenId:c,quantity:a.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:bm(e,i,n,"listing"),counter:Ve(i?.counter,"listing counter")}}async function ac(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=Xr(e.chain);n.contract=e.contract?Q(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Number(e.limit??12);if(!Number.isSafeInteger(o)||o<1||o>50)throw new Error("opensea: listing limit must be 1 through 50");let i=new URL(`${mn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await E(i.toString(),{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=Array.isArray(a?.listings)?a.listings:[];if(!s.length)throw new Error("opensea: no active best listings returned");let c=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return{provider:"opensea-nft",source:"opensea-best-listings",chain:n.chain,chainId:n.chainId,slug:r,contract:n.contract,listings:s.map(l=>pI(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function _i(e={},t={}){let n=Gr(e.tokenId),r=Math.min(Math.max(Number(e.maxPages??20)||20,1),25),o=e.next?String(e.next):null,i=new Set;for(let a=1;a<=r;a+=1){let s=await ac({...e,tokenId:void 0,limit:50,next:o},t),c=s.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:a,exact:!0,exec:!1,readOnly:!0};if(!s.next||i.has(s.next))break;i.add(s.next),o=s.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function mI(e,t,n,r){if(!e||typeof e!="object")throw new Error("opensea: invalid best offer");if(String(e.chain||"").trim().toLowerCase()!==t.chain)throw new Error("opensea: OpenSea returned an offer for the wrong chain");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active offer");let i=e.protocol_data?.parameters||{},s=lI(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=De(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=oc(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=oc(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:gm(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:Q(e.protocol_address,"offer protocol address"),contract:s,tokenId:n,grossOfferWei:c.toString(),sellerNetWei:m,feeWei:p,paymentToken:u,currency:String(e.price?.current?.currency||e.price?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??e.price?.decimals??18),expiry:bm(e,i,r,"offer"),counter:Ve(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Ti(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");let n=Xr(e.chain);n.contract=e.contract?Q(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Gr(e.tokenId),i=await E(`${mn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!a)throw new Error("opensea: no active exact NFT offer returned");let s=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return mI(a,n,o,s)}function fI(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 wm(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"&&wm(n))}function xm(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function vm(e){return!e||typeof e!="object"?!1:xm(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&vm(t))}function Sm(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"&&Sm(o,t,n);return t}function om(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function km(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(xm(e))throw new Error("opensea: signed transaction material refused");if((e.from?Q(om(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=Q(om(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,s=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&s){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=KE.encodeFunctionData("fulfillAdvancedOrder",[s.advancedOrder,s.criteriaResolvers,s.fulfillerConduitKey,s.recipient])}let c=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(c))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");c.endsWith(l.slice(2))||(c+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let d=tI(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Pi(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 sc(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=[];for(let c of e){let{chainId:l,...u}=Pi(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");await r.call(u);let d=await r.estimateGas(u);i.push(BigInt(d).toString())}else{let{rpcCall:d}=await Promise.resolve().then(()=>(he(),hi)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let m=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(m).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(he(),hi)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>m?u:m}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function hI(e,t){if(wm(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(vm(e))throw new Error("opensea: signed transaction material refused");let n=Sm(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=>km(r,t))}function gI(e,t,n={}){return N({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function Em(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function Im(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function yI(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=Q(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Ci(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");fI(e);let{chain:n,chainId:r}=Xr(e.chain),o=Q(e.buyer||e.minter||e.address,"buyer"),i=Q(e.contract,"NFT contract"),a=mm(e.quantity),s=De(e.priceWei,"priceWei"),c=De(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=fm(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 Kr(d,t),m=yI(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await E(`${mn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:fn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(g)?g:g?[g]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let x=new Set(w.map(O=>Q(O,"SeaDrop mint target"))),b=hI(h,{buyer:o,chainId:r,targets:x});if(b.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,v,k=null,S;try{y=ki.decodeFunctionData("mintPublic",b[0].data),v="public",S=ki.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=ki.decodeFunctionData("mintAllowList",b[0].data),v="allowlist";let O=y[4],j=[...y[5]].map(String);if(j.length<1||j.length>64||j.some(ve=>!/^0x[0-9a-fA-F]{64}$/.test(ve)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let B=BigInt(O.startTime),W=BigInt(O.endTime),pe=BigInt(Math.floor(l/1e3));if(B>pe||W<=pe)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(O.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(O.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");S=ki.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],O,j]),k={mintPrice:BigInt(O.mintPrice).toString(),maxTotalMintableByWallet:BigInt(O.maxTotalMintableByWallet).toString(),startTime:B.toString(),endTime:W.toString(),dropStageIndex:BigInt(O.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(O.maxTokenSupplyForStage).toString(),feeBps:Number(O.feeBps),restrictFeeRecipients:!!O.restrictFeeRecipients,proof:j}}catch(O){throw/opensea:/.test(String(O?.message||""))?O:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let I=Q(y[0],"mint NFT contract"),T=Q(y[1],"mint fee recipient"),_=Q(y[2],"mint recipient");if(I!==m)throw new Error("opensea: mint calldata collection mismatch");if(_!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(S.toLowerCase()!==b[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let C=b.reduce((O,j)=>O+j.valueWei,0n);if(C!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(C>c)throw new Error("opensea: mint total exceeds total cap");let L=await sc(b,r,{...t,provider:e.provider||t.provider});if(L.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let D=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},H=tm({chainId:r,tx:b[0],policy:D});return gI({action:"mint",mintType:v,...k?{stage:k}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:C.toString(),maxTotalWei:c.toString(),mintTarget:b[0].to,feeRecipient:T,expiry:u,transactions:b.map(Pi),gasWar:H,...L},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Ws,Date.parse(u),k?Number(BigInt(k.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function bI(e={}){let t=lm(e.chain);if(sm.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?nm(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=nm(e.endTime||e.end_time,"endTime");if(r.ms<=n.ms)throw new Error("opensea: endTime must be after startTime");let o=String(e.tokenId??e.token_id??"").trim();if(!/^\d+$/.test(o))throw new Error("opensea: tokenId must be an unsigned integer string");return{chain:t,contract:Q(e.contract,"NFT contract"),token_id:o,quantity:ZE(e.quantity??1,"quantity"),price:{amount:JE(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:Q(e.price?.currency??e.currency??Wr,"price currency")},start_time:n.text,end_time:r.text}}var qn={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"}]},im=new Ei(["function setApprovalForAll(address operator,bool approved)"]),wI=new Ei(["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 am(e,t){return e?.[t]||(e?.action===t?e:null)}function xI(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(b=>am(b,"createListingsAction")).find(Boolean)||o.find(b=>/createListings/i.test(String(b?.action||""))),a=i?.signatureRequest?.message??i?.typedData,s;try{s=typeof a=="string"?JSON.parse(a):a}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!s||s.primaryType!=="OrderComponents"||!s.domain||!s.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=s.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=Q(c.verifyingContract,"listing protocol"),u=s.message;if(Q(u.offerer,"listing seller")!==t)throw new Error("opensea: listing seller mismatch");if(!Array.isArray(u.offer)||u.offer.length!==1)throw new Error("opensea: executable listing requires exactly one NFT offer");let d=u.offer[0];if(![2,3].includes(Number(d.itemType)))throw new Error("opensea: listing offer must be ERC721 or ERC1155");if(Q(d.token,"listing collection")!==n.contract||String(d.identifierOrCriteria)!==n.token_id)throw new Error("opensea: listing NFT mismatch");if(String(d.startAmount)!==String(n.quantity)||String(d.endAmount)!==String(n.quantity))throw new Error("opensea: listing quantity mismatch");if(Number(u.orderType)!==2)throw new Error("opensea: only FULL_RESTRICTED listings are executable");if(!Array.isArray(u.consideration)||!u.consideration.length)throw new Error("opensea: listing consideration required");let p=0n;for(let b of u.consideration){if(Number(b.itemType)!==0||Q(b.token,"listing payment token")!==Wr)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(b.startAmount),v=BigInt(b.endAmount);if(y<=0n||y!==v)throw new Error("opensea: listing consideration must be fixed and positive");Q(b.recipient,"listing consideration recipient"),p+=y}let m=VE(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=ic.hashStruct("OrderComponents",qn,u),w=o.map(b=>am(b,"itemApprovalAction")).find(Boolean)||o.find(b=>/setApprovalForAll/i.test(String(b?.action||""))),x=null;if(w){let b=w.transaction||w.itemApprovalAction?.transaction,y=km(b,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=im.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let k=Q(v[0],"listing approval operator");if(v[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(im.encodeFunctionData("setApprovalForAll",[k,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:k}}return{protocolAddress:l,typedData:{domain:c,types:qn,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function Ni(e={},t={}){if(!vt(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=Q(e.seller||e.address||e.owner,"seller"),r=Array.isArray(e.items)&&e.items.length?e.items:[e];if(r.length!==1)throw new Error("opensea: executable listing preparation supports exactly one NFT per envelope");let o=r.map(bI);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let a=e.useCreatorFee!==!1,s={address:n,items:o,use_creator_fee:a};e.taker&&(s.taker=Q(e.taker,"taker"));let c=await E(`${mn(t)}/listings/actions`,{method:"POST",headers:fn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Xr(o[0].chain),u=xI(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await sc(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return N({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,chainId:l,kind:"nft-list",action:"list",prepareReady:!0,executionReady:p.simulated===!0,signingReady:p.simulated===!0,broadcastReady:p.simulated===!0,requiresUserSignature:!0,requiresSeparateApproval:d.length>0,seller:n,contract:o[0].contract,tokenId:o[0].token_id,quantity:o[0].quantity,priceWei:u.priceWei.toString(),typedData:u.typedData,orderHash:u.orderHash,submission:{chain:o[0].chain,protocol:"seaport",protocolAddress:u.protocolAddress},transactions:d.map(Pi),useCreatorFee:a,taker:s.taker||null,feeDisclosure:a?"Creator fees requested and bound into exact Seaport consideration recipients.":"Creator fees disabled by explicit request; every remaining consideration recipient is still bound.",...p})}async function Am(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Xr(e.chain),o=Q(e.seller||e.address||e.owner,"seller"),i=Q(e.protocolAddress,"reviewed Seaport protocol address"),a=Q(e.contract,"NFT contract"),s=Gr(e.tokenId),c=mm(e.quantity),l=e.typedData;if(!l||l.primaryType!=="OrderComponents"||!l.domain||!l.message)throw new Error("opensea: exact Seaport OrderComponents typedData required for cancellation");for(let[I,T]of Object.entries(qn)){let _=l.types?.[I];if(!Array.isArray(_)||_.length!==T.length||_.some((C,L)=>C?.name!==T[L].name||C?.type!==T[L].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(I=>I!=="EIP712Domain").sort().join(",")!==Object.keys(qn).sort().join(","))throw new Error("opensea: cancellation requires canonical Seaport types");let d=l.domain;if(d.name!=="Seaport"||d.version!=="1.6"||Number(d.chainId)!==r)throw new Error("opensea: cancellation domain mismatch");let p=Q(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(Q(m.offerer,"listing seller")!==o)throw new Error("opensea: cancellation seller mismatch");if(!Array.isArray(m.offer)||m.offer.length!==1||!Array.isArray(m.consideration)||!m.consideration.length)throw new Error("opensea: cancellation requires one exact previously prepared listing order");if(Number(m.orderType)!==2)throw new Error("opensea: cancellation requires a FULL_RESTRICTED listing order");let f=m.offer[0];if(![2,3].includes(Number(f.itemType)))throw new Error("opensea: cancellation offer must be ERC721 or ERC1155");if(Q(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Gr(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=De(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=De(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let I of m.consideration){if(Number(I.itemType)!==0||Q(I.token,"cancellation payment token")!==Wr)throw new Error("opensea: cancellation requires native fixed-price consideration");let T=De(I.startAmount,"cancellation consideration startAmount",{positive:!0}),_=De(I.endAmount,"cancellation consideration endAmount",{positive:!0});if(T!==_)throw new Error("opensea: cancellation consideration must be fixed and positive");Q(I.recipient,"cancellation consideration recipient")}let w=De(m.startTime,"cancellation startTime");if(De(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let b=ic.hashStruct("OrderComponents",qn,m),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==b.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=wI.encodeFunctionData("cancel",[[m]]),k=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],S=await sc(k,r,{...t,provider:e.provider||t.provider});if(S.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return N({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:a,tokenId:s,quantity:c,protocolAddress:p,orderHash:b,typedData:{domain:d,types:qn,primaryType:"OrderComponents",message:m},transactions:k.map(Pi),...S,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}he();var Oi=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),Y=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),z=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),SI=/^0x[0-9a-fA-F]{40}$/;function kI(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let a=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${a} must be an object`);continue}SI.test(i.address||"")||t.push(`${a}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${a}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${a}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${a}.verified.method is required`),i.verified.source||t.push(`${a}.verified.source is required`),i.verified.date||n.push(`${a}.verified.date missing -- add one so staleness is visible`)):t.push(`${a} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))Oi.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 EI(e){let{ok:t,errors:n,warnings:r}=kI(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
142
142
|
- ${n.join(`
|
|
143
|
-
- `)}`);let o=e.capabilities||{},i=Ni.filter(s=>typeof o[s]=="function"),a={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(s=>({...s})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Ni.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Ni)i.includes(s)?a[s]=async(...c)=>o[s](...c,{scanner:a}):a[s]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${s}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(a)}var cc=new Map;function Am(e){let t=kI(e);return cc.set(t.chainId,t),t}function _m(e){return cc.get(Number(e))||null}function Tm(){return[...cc.values()]}he();var uc={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Xe=e=>BigInt(e).toString(16).padStart(64,"0"),Qr=e=>e.slice(2).toLowerCase().padStart(64,"0");function EI(e,t){return`0x${uc.getAmountsOut}`+Xe(e)+Xe(64)+Xe(t.length)+t.map(Qr).join("")}function II(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 lc(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var dc=100;function AI(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>dc)throw new Error(`slippageBps ${n} exceeds the ${dc} 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 Cm(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await U(t,"eth_call",[{to:o,data:EI(i,a)},"latest"],s);return II(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=lc(c.scanner);if(!l)return{chainId:t,evidence:G.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=s||[o,i];if(u.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(l,a,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(a),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:G.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:G.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:a},s={}){let c=lc(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:H.UNKNOWN,evidence:G.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:H.UNKNOWN,evidence:G.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let u=await r(c,i,[l,o],s);if(!u)return{chainId:t,token:o,verdict:H.FAIL,evidence:G.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:H.FAIL,evidence:G.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],s);if(!p)return{chainId:t,token:o,verdict:H.FAIL,evidence:G.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 f=p[p.length-1],m=Number(f*10000n/BigInt(i)),h=H.PASS,b="round trip completes with expected fee/impact loss";return m<5e3?(h=H.FAIL,b=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=H.CAUTION,b=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:b,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:G.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:a,recipient:s,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,f=lc(p);if(!f)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(s||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:a,path:m},d);if(h.evidence!==G.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let b=AI(h.amountOut,c);if(b<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let x=BigInt(Math.floor(Date.now()/1e3)+Number(l)),w=n&&m[0].toLowerCase()===n.toLowerCase()&&d.useNative,g=w?`0x${uc.swapExactETHForTokens}`+Xe(b)+Xe(128)+Qr(s)+Xe(x)+Xe(m.length)+m.map(Qr).join(""):`0x${uc.swapExactTokensForTokens}`+Xe(a)+Xe(b)+Xe(160)+Qr(s)+Xe(x)+Xe(m.length)+m.map(Qr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:g,value:w?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:b.toString(),slippageBps:c,maxSlippageBps:dc,deadline:x.toString()},requires:w?[]:[{step:"approve",token:m[0],spender:f,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}he();var _I=[100,500,3e3,1e4],Pm={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},hn=e=>BigInt(e).toString(16).padStart(64,"0"),Jr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Nm=/^0x[0-9a-fA-F]{40}$/,mc=100;function TI(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>mc)throw new Error(`slippageBps ${n} exceeds the ${mc} 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 pc(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Om(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${Pm.quoteExactInputSingle}`+Jr(a)+Jr(s)+hn(c)+hn(l)+hn(0),p=await U(t,"eth_call",[{to:i,data:d},"latest"],u).catch(()=>null),f=p?.result??p;if(!f||f==="0x"||f.length<66)return null;let m=BigInt(`0x${f.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:a,tokenOut:s,amountIn:c},l){let u=[],d=null;for(let p of _I){let f=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:f?f.toString():null}),f&&(!d||f>d.amountOut)&&(d={fee:p,amountOut:f})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=pc(c.scanner,"quoter");if(!l)return{chainId:t,evidence:G.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,a])if(!Nm.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:a,amountIn:s},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:a,amountIn:String(s),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:G.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:a,triedFeeTiers:d,evidence:G.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:a,base:s},c={}){let l=pc(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(v=>String(v).toLowerCase()),d=null;!s&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(n||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:H.UNKNOWN,evidence:G.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 m=s||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:H.UNKNOWN,evidence:G.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||!m)return{chainId:t,token:i,verdict:H.UNKNOWN,evidence:G.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:m,tokenOut:i,amountIn:a},c);if(!h.best){let v=u.find(S=>S&&S!==String(m).toLowerCase()&&S!==String(i).toLowerCase());if(v){let S=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c);if(S.best){let E=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:S.best.amountOut},c);if(E.best){let I=E.best.amountOut,_=Number(I*10000n/BigInt(a)),T=H.PASS,C="round trip vs dollar book completes with expected fee/impact loss";return _<5e3?(T=H.FAIL,C=`round trip vs dollar book returns only ${(_/100).toFixed(2)}% -- punitive tax or no real liquidity`):_<9e3&&(T=H.CAUTION,C=`round trip vs dollar book returns ${(_/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:T,reason:C,amountIn:String(a),bought:S.best.amountOut.toString(),returned:I.toString(),retentionBps:_,buyFee:S.best.fee,sellFee:E.best.fee,evidence:G.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:H.FAIL,evidence:G.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let b=await o({quoter:l,tokenIn:i,tokenOut:m,amountIn:h.best.amountOut},c);if(!b.best){let v=u.find(S=>S&&S!==String(m).toLowerCase()&&S!==String(i).toLowerCase());if(v){let S=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c),E=S.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:S.best.amountOut},c):{best:null};if(S.best&&E.best){let I=E.best.amountOut,_=Number(I*10000n/BigInt(a)),T=H.PASS,C="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return _<5e3?(T=H.FAIL,C=`dollar-book round trip returns only ${(_/100).toFixed(2)}%`):_<9e3&&(T=H.CAUTION,C=`dollar-book round trip returns ${(_/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:T,reason:C,amountIn:String(a),bought:S.best.amountOut.toString(),returned:I.toString(),retentionBps:_,buyFee:S.best.fee,sellFee:E.best.fee,evidence:G.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:H.FAIL,evidence:G.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 x=b.best.amountOut,w=Number(x*10000n/BigInt(a)),g=H.PASS,y="round trip completes with expected fee/impact loss";return w<5e3?(g=H.FAIL,y=`round trip returns only ${(w/100).toFixed(2)}% -- punitive tax or no real liquidity`):w<9e3&&(g=H.CAUTION,y=`round trip returns ${(w/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:g,reason:y,amountIn:String(a),bought:h.best.amountOut.toString(),returned:x.toString(),retentionBps:w,buyFee:h.best.fee,sellFee:b.best.fee,evidence:G.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:a,amountIn:s,recipient:c,slippageBps:l=50,fee:u},d={}){let p=pc(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(!Nm.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:a,amountIn:s},d);if(f.evidence!==G.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=u??f.fee,h=TI(f.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let b=!!(d.useNative||f.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),x=`0x${Pm.exactInputSingle}`+Jr(i)+Jr(a)+hn(m)+Jr(c)+hn(s)+hn(h)+hn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:x,value:b?String(s):"0x0"},guard:{quotedOut:f.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:mc,fee:m},requires:b?[]:[{step:"approve",token:i,spender:p,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Oi={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Rm(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Lm(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 CI(e){let{chainId:t}=e;async function n(r,o,i){return U(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await $r(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:G.LIVE}},async nativeBalance(r,o={}){let i=await ln(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:G.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await Br({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:G.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:G.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,a,s,c]=await Promise.all([n(r,Oi.decimals,o).catch(()=>null),n(r,Oi.symbol,o).catch(()=>null),n(r,Oi.name,o).catch(()=>null),n(r,Oi.totalSupply,o).catch(()=>null)]),l=Rm(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:Lm(a?.result??a),name:Lm(s?.result??s),totalSupply:(Rm(c?.result??c)??null)?.toString()??null,evidence:u?G.LIVE:G.UNKNOWN,warning:u?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:G.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await un(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=qs(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:kp(r,l),evidence:l.length?G.LIVE:G.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:a,chunkSize:s=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let d=r;d<=o;d+=s){let p=Math.min(d+s-1,o);u.push([d,p])}for(let[d,p]of u){let f={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(f.address=i),a&&(f.topics=a);let m=await U(t,"eth_getLogs",[f],c).catch(h=>({error:String(h?.message||h)}));if(m?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:m.error,evidence:G.UNKNOWN};for(let h of m?.result??m??[])l.push(h)}return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!0,chunks:u.length,evidence:G.LIVE}},async scoreRisk(r,o={}){let i=[],a=H.PASS,s=u=>{let d={[H.PASS]:0,[H.CAUTION]:1,[H.UNKNOWN]:2,[H.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==G.LIVE?(i.push({check:"erc20-metadata",result:H.UNKNOWN,detail:c.warning}),s(H.UNKNOWN)):i.push({check:"erc20-metadata",result:H.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===G.UNAVAILABLE)i.push({check:"liquidity",result:H.UNKNOWN,detail:l.reason}),s(H.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:H.FAIL,detail:"no pool with liquidity found"}),s(H.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:H.CAUTION,detail:`top pool only $${d}`}),s(H.CAUTION)):i.push({check:"liquidity",result:H.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:H.CAUTION,detail:"pool under 24h old"}),s(H.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:H.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),s(u.verdict)}else i.push({check:"sellability",result:H.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),s(H.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function $m(e){let n={...CI(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Om({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,a)=>(await n.resolvePools(i,a)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Cm({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,a]of Object.entries(n))o[i]=a.bind(n);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var Hn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function fc(){return Hn.map(e=>Am($m(e)))}var Zr=new Map,PI=Object.keys(je).map(Number),NI=Object.keys(ft).map(Number),OI=Hn.map(e=>e.chainId),RI=[...new Set(Object.values(Ii))],hc=new Set,Bm=!1;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(Bm&&hc.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Zr.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Zr.get(t)}function gc(e){return Zr.get(e)||null}function Ri({venue:e,op:t}={}){let n=[...Zr.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function LI(){hc.clear();for(let e of Zr.keys())hc.add(e);Bm=!0}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:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});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:OI,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Hn.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 v1 quote + local-signer Solana swap handoff"});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"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});P({id:"uniswap-v3",venue:"dex",chainIds:PI,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:"uniswap-v4",venue:"dex",chainIds:NI,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"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});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:RI,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"],execution:"prepare",baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 agent identity registration and inspection using an exact configured registry; the connected wallet signs and pays network gas"});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","chains","quote","prepare"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});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."});LI();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. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});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:"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:"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:"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)"});$();at();at();var UI=/^0x[0-9a-fA-F]{40}$/,to="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function yc(e,t){let n=String(e||"").trim();if(!UI.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function jm(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function zm(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 DI(e){return[...e].sort((t,n)=>(jm(n.tvl)??-1)-(jm(t.tvl)??-1))}function bc(e){return e.hlInfo||ce}function wc(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function xc(e={},t={}){let n=await bc(t)({type:"vaultSummaries"},t),r=DI((Array.isArray(n)?n:[]).map(zm));return wc({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Mi(e={},t={}){let r={type:"vaultDetails",vaultAddress:yc(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=yc(e.user,"user"));let o=await bc(t)(r,t);return wc({provider:"hl-vaults",vault:zm(o||{}),raw:o})}async function vc(e={},t={}){let n=yc(e.user||e.address,"user"),r=await bc(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 wc({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Sc(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Mi({...e,vaultAddress:to},t);if(n==="summaries")return xc(e,t);if(n==="details")return Mi(e,t);if(n==="mine")return vc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Vm(e={}){try{let t=await Sc({mode:"hlp"},e);return{ok:t.vault.vaultAddress===to&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1,execution:"read-only",armed:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1,execution:"read-only",armed:!1}}}he();import{AbiCoder as HI}from"ethers";var kc=999;var _e=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Ec=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),jI=HI.defaultAbiCoder();function no(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-precompiles: ${t} must be a 0x EVM address`);return n.toLowerCase()}function ro(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 gn(e,t){return e.length?jI.encode(e,t):"0x"}function kt(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 zI(e,t=0){let n=kt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Mt(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:kc});let r=await U(kc,"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 Ft(e){return{provider:"hl-precompiles",chainId:kc,...Ec,...e}}async function Fi(e={}){let t=await Mt(_e.l1BlockNumber,"0x",e);return Ft({op:"l1BlockNumber",precompile:_e.l1BlockNumber,l1BlockNumber:kt(t).toString(),raw:t})}async function Ic(e={},t={}){let n=ro(e.index??e.assetId??0,"index",32),r=await Mt(_e.markPx,gn(["uint32"],[n]),t);return Ft({op:"markPx",precompile:_e.markPx,index:n,markPx:kt(r).toString(),raw:r})}async function Ac(e={},t={}){let n=ro(e.index??e.assetId??0,"index",32),r=await Mt(_e.oraclePx,gn(["uint32"],[n]),t);return Ft({op:"oraclePx",precompile:_e.oraclePx,index:n,oraclePx:kt(r).toString(),raw:r})}async function _c(e={},t={}){let n=ro(e.index??e.assetId??0,"index",32),r=await Mt(_e.spotPx,gn(["uint32"],[n]),t);return Ft({op:"spotPx",precompile:_e.spotPx,index:n,spotPx:kt(r).toString(),raw:r})}async function Tc(e={},t={}){let n=no(e.user,"user"),r=ro(e.perp??e.assetId??0,"perp",16),o=await Mt(_e.position,gn(["address","uint16"],[n,r]),t);return Ft({op:"position",precompile:_e.position,user:n,perp:r,szi:zI(o,0),raw:o})}async function Cc(e={},t={}){let n=no(e.user,"user"),r=ro(e.token??0,"token",64),o=await Mt(_e.spotBalance,gn(["address","uint64"],[n,r]),t);return Ft({op:"spotBalance",precompile:_e.spotBalance,user:n,token:r,total:kt(o,0).toString(),hold:kt(o,1).toString(),raw:o})}async function Pc(e={},t={}){let n=no(e.user,"user"),r=no(e.vaultAddress??e.vault??to,"vault"),o=await Mt(_e.vaultEquity,gn(["address","address"],[n,r]),t);return Ft({op:"vaultEquity",precompile:_e.vaultEquity,user:n,vaultAddress:r,hlp:r===to,equity:kt(o,0).toString(),raw:o})}async function Nc(e={},t={}){let n=no(e.user,"user"),r=await Mt(_e.withdrawable,gn(["address"],[n]),t);return Ft({op:"withdrawable",precompile:_e.withdrawable,user:n,withdrawable:kt(r).toString(),raw:r})}async function Wm(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return Fi(t);if(n==="markPx")return Ic(e,t);if(n==="oraclePx")return Ac(e,t);if(n==="spotPx")return _c(e,t);if(n==="position")return Tc(e,t);if(n==="spotBalance")return Cc(e,t);if(n==="vaultEquity"||n==="hlp")return Pc(e,t);if(n==="withdrawable")return Nc(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Gm(e={}){try{let t=await Fi(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Ec,l1BlockNumber:t.l1BlockNumber,precompiles:_e}}catch(t){return{ok:!1,provider:"hl-precompiles",...Ec,error:String(t?.message||t).slice(0,160)}}}at();Z();function Km(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Di(e={},t,n){let r=String(t||""),o=Km(e);if(o){let a=oo(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=oo(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function qi(e={},t=[],n){let r=Km(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(oo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&oo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(oo(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Oc=Number.MAX_SAFE_INTEGER,Ui=String(Oc);function oo(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Oc?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>Ui.length||t.length===Ui.length&&t>Ui||t===Ui&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Oc?r:null}function gf(){return{ok:!0,provider:"hl-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated hl signer. Not automated."}}function It(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function yf(e){let t=It(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function $A(e,t,n=4){let r=It(e),o=It(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function bf(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},a=n[o]||{},s=String(i.name||"").trim(),c=It(a.funding),l=It(a.markPx??a.oraclePx),u=It(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:It(a.oraclePx),openInterest:u,fundingAprPct:yf(c)})}return r}function wf(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=It(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=yf(n),o=n>0,i={coin:e.coin,notionalUsd:It(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?$A(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 Qc(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await Qe(t),i=bf(o).filter(a=>a.funding>0&&a.openInterest>=r).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function Jc(e={},t={}){let n=String(e.coin||"").trim();if(!n)throw new Error("hl-delta-neutral: coin required");let r=Number(e.notionalUsd??e.notional??1e3),o=await Qe(t),i=bf(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return wf(i,r)}async function Zc(e={},t={}){vf(e,t,"hl-delta-neutral");let n=Sf(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Jc(e,t);if(r.verdict==="skip")return N({...r,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=Di(e,r.coin,"hl-delta-neutral");if(!xf.test(String(e.owner||"")))throw new Error("hl-delta-neutral: prepare requires owner");if(Number(r.perpSize)-o>1e-12)throw new Error("hl-delta-neutral: hedge cannot exceed held spot");let{hlPreparePerpOrder:i}=await Promise.resolve().then(()=>(Ki(),Xc)),a=await i({coin:r.coin,side:r.perpSide,size:r.perpSize,type:e.orderType||"limit",price:e.price??r.markPx,owner:e.owner,maxNotionalUsd:n},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(a?.signed===!0||a?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let s=a?.localSignerEnvelope||null,c=a?.localSignerBlockedReason||null;return N({...r,prepared:!!s,surface:"hl",hedge:a,localSignerEnvelope:s,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:s?"awaiting-hl-signer":"blocked",oraclePrepared:!!s},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var xf=/^0x[0-9a-fA-F]{40}$/;function vf(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 BA(e,t,n){vf(e,t,n)}function MA(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=Sf(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&n.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&qi(e,n,"hl-delta-neutral"),t==="live"&&!xf.test(String(e.owner||"")))throw new Error("hl-delta-neutral: live loop requires owner");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,intervalMs:Math.max(3e4,Number(e.intervalMs??3e5)||3e5)}}function Sf(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 kf(e={},t={}){BA(e,t,"hl-delta-neutral");let n=MA(e),r=await Qc({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.coin))continue;let c=wf(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let l=await Zc({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}$();Z();Vn();var UA=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),uo=14,Ef=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Yn(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function el(e){let t=String(e||"").replace(/\/$/,"");if(!UA.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function If(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=Ef(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=el(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(yn(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(yn(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Yn(n.orderType,0,"orderType"),Yn(n.timeInForce,1,"timeInForce"),Yn(n.reduceOnly,0,"reduceOnly"),Yn(n.triggerPrice,0,"triggerPrice"),Yn(n.orderExpiry,-1,"orderExpiry");let c=Ef(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=Ze(n.baseAmount,"lighter: baseAmount"),d=Ze(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),f=Number(d),m=Number(n.sizeDecimals??0),h=Number(n.priceDecimals??0);if(!Number.isInteger(m)||m<0||m>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let b=m+h,x=u*d,w=Se(n.notionalUsd,b,"lighter: notionalUsd");if(w<=0n)throw new Error("lighter: notionalUsd required");if(x!==w)throw new Error("lighter: notionalUsd must match size and price");let g=Se(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,b,"lighter: maxNotionalUsd");if(x>g)throw new Error("lighter: notional exceeds cap");let y=Ie(n.notionalUsd,"lighter: notionalUsd");return Yn(n.txType,uo,"txType"),Object.freeze({unit:"usd",value:String(y),notional:String(y),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:f,submitTo:o,actionType:"create-order",amount:String(y)})}function DA(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 Af(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=el(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:DA(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??uo,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return If(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var Tf="https://mainnet.zklighter.elliot.ai",Cf="https://testnet.zklighter.elliot.ai";function qA(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?Cf:Tf}function Pf(){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 jt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function HA(e,t){let n=e.toString().padStart(t+1,"0");if(t===0)return n;let r=n.slice(0,-t),o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}function Nf(e){let t=jt(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function jA(e,t,n=4){let r=jt(e),o=jt(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let a=10**i;return Math.floor(r/o*a+1e-12)}function _f(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Of(e,t){let n=Array.isArray(e?.funding_rates)?e.funding_rates:[],r=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let a of r){let s=_f(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=_f(a.market_id);if(s==null)continue;let c=o.get(s),l=jt(c?.mark_price??c?.index_price),u=jt(a.rate),d=String(a.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:s,funding:u,markPx:l,openInterest:jt(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:Nf(u)})}return i}function Rf(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=jt(e.funding);if(n==null)throw new Error("lighter: funding required");let r=Nf(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:jt(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?jA(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 Lf(e={}){let t=qA(e),n=e.fetchImpl,r=await k(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await k(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function tl(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Lf(t),i=Of(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function nl(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 Lf(t),a=Of(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return Rf(a,r)}async function rl(e={},t={}){Bf(e,t,"lighter");let n=Mf(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 nl(e,t);if(o.verdict==="skip")return N({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=Di(e,o.coin,"lighter");if(!$f.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=HA(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:uo,submitTo:`${s?Cf:Tf}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=Af(u,{...e,maxNotionalUsd:n},t)}catch(m){p=String(m?.message||m).slice(0,200)}return N({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var $f=/^0x[0-9a-fA-F]{40}$/;function Bf(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 zA(e,t,n){Bf(e,t,n)}function VA(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=Mf(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&n.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&qi(e,n,"lighter"),t==="live"&&!$f.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let a=e.accountIndex;if(t==="live"&&(typeof a!="number"||!Number.isSafeInteger(a)||a<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:a}}function Mf(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 Ff(e={},t={}){zA(e,t,"lighter");let n=VA(e),r=await tl({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.symbol)&&!o.has(s.coin))continue;let c=Rf(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let l=await rl({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}$();var GA="https://clob.polymarket.com",KA="https://gamma-api.polymarket.com";function po(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||GA).replace(/\/$/,"")}function Uf(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||KA).replace(/\/$/,"")}async function ol(e={}){return k(`${po(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Df(e={}){let t=await ol(e);return{ok:t!=null&&t!=="",time:t}}async function qf({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return k(`${Uf(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Hf(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${po(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function jf(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${po(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function zf(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${po(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Vf(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return k(`${po(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Wf({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return k(`${Uf(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}he();$();import{createHash as Gf}from"node:crypto";var Xn="mainnet-beta",XA="https://api.mainnet-beta.solana.com",il="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function QA(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||XA).trim()}function de(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}function JA(e,t){return t?[...e,{commitment:t}]:e}async function mo(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await k(QA(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function al(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await mo("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Xn,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Kf(e={}){try{let[t,n]=await Promise.all([mo("getHealth",[],e),al({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Xn,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Xn,error:String(t?.message||t),exec:!1}}}async function Yi(e={},t={}){let n=de(e.address||e.owner,"address"),r=await mo("getBalance",JA([n],e.commitment),t);return{provider:"solana-rpc",cluster:Xn,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function ZA(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 fo(e={},t={}){let n=de(e.owner||e.address,"owner"),r=e.mint?{mint:de(e.mint,"mint")}:{programId:de(e.programId||il,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await mo("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(ZA):[];return{provider:"solana-rpc",cluster:Xn,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function e1(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 t1(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let a=e[o++];if(n|=(a&127)<<r,(a&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function n1(e){let t=Buffer.from(e,"base64");try{let n=t1(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Gf("sha256").update(t.subarray(r)).digest("hex")}catch{return Gf("sha256").update(t).digest("hex")}}async function Yf(e={},t={}){let n=e1(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await mo("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Xn,ok:i.err==null,transactionHash:n1(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}$();var o1="mainnet",i1="https://mempool.space/api",a1="https://mempool.space/testnet/api";function gt(e={}){return String(e.network||process.env.BTC_NETWORK||o1).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function cl(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):gt(e)==="testnet"?a1:i1}function sl(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 st(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 s1(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 ll(e,t={}){let n=`${cl(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 Xi(e,t={}){let n=await ll(e,t);try{return JSON.parse(n)}catch{return n}}async function Xf(e={}){try{let t=await ll("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:gt(e),baseUrl:sl(cl(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:gt(e),baseUrl:sl(cl(e)),error:sl(t?.message||t),exec:!1}}}async function Qf(e={}){let t=await ll("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:gt(e),tipHeight:Number(t)}}async function Jf(e={}){try{let t=await Xi("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:gt(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:gt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Qi(e={},t={}){let n=st(e.address||e.addr,"address"),r=await Xi(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:gt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Zf(e={},t={}){let n=st(e.address||e.addr,"address"),r=await Xi(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:gt(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function eh(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 Xi(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:gt(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 th(e={},t={}){let n=s1(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:gt(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 ul="https://ordinals.com";function Ji(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var l1=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function nh(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=Ji(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,a=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=l1.includes(o)&&(i==="https:"||a)}}catch{n=!1}return Ue({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Qn(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:nh(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 rh(e={}){let t=Ji(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let a=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:nh(e),signal:AbortSignal.timeout(8e3)});if(r={ok:a.status>0&&a.status<500,path:o,status:a.status},a.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function Zi(e={},t={}){let n=st(e.address||e.addr,"address"),r=Ji(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let a of o)try{let s=await Qn(a,t),c=u1(s);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:a}}catch(s){i=s}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function u1(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 Jn(e={},t={}){let n=st(e.address||e.addr,"address"),r=Ji(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],a=null;for(let s of i)try{let c=await Qn(s,t),l=d1(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:s}}catch(c){a=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(a?.message||a||"all indexer paths failed")}}async function oh(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||ul,o=await Qn(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function ih(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||ul,o=Number(e.page||0),i=await Qn(`${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 ah(e={},t={}){let n=t.ordinalsBase||ul,r=e.height??await Qn(`${n}/r/blockheight`,t),o=await Qn(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function d1(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}))}Z();var m1=["unsigned","notsigned","tosign","signable"],f1=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),h1=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function dl(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function g1(e){return m1.some(t=>e.startsWith(t))||f1.has(e)}function y1(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=dl(t);return g1(n)?!1:h1.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function b1(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 pl(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=>pl(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(y1(c)){o.push(c);continue}o.push(...pl(l,t+1,n,r))}let a=Object.keys(e).map(dl).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(dl(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),b1(e)&&o.push("v/r/s"),o}function At(e,t){let n=pl(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 w1="https://api.satflow.com/v1";function sh(e={}){return ze({provider:"satflow",defaultUrl:w1,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function ea(e={}){return sh(e).baseUrl}function fl(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function x1(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":fl(e)},sh(e).trusted)}async function zt(e,{method:t="GET",body:n,opts:r={}}={}){if(!fl(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${ea(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:x1(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await s.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!s.ok)throw new Error(`satflow ${t} ${e}: HTTP ${s.status} ${String(c).slice(0,200)}`);return l}async function ch(e={}){if(!!!fl(e))return{ok:!1,provider:"satflow",baseUrl:ea(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 zt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:ea(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:ea(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function lh(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 zt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function uh(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 zt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function dh(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 zt(`/item?${r}`,{opts:t})}}async function ta(e={},t={}){let n=st(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 zt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function ph(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 zt(`/orders/floor?${r}`,{opts:t})}}var v1=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function mh(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))v1.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var S1=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"]),k1=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function ml(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}function E1(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=st(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=st(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function fh(e={},t={}){let n=mh(e,S1);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=ml(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await zt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=ml(a)??ml(a?.intent);if(s==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(s>o)throw new Error(`satflow: purchase price ${s} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);At("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=E1(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return N({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:s.toString(),maxSats:o.toString(),intent:a,unsignedPsbt:c,localSignerEnvelope:l,localSignerBlockedReason:u,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function na(e={},t={}){let n=mh(e,k1);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 zt("/intent/sell",{method:"POST",body:n,opts:t});return At("satflow",r),N({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}$();Z();var oa="https://lite-api.jup.ag/swap/v1",gl="So11111111111111111111111111111111111111112",yh="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",A1=100,hh=2e4;function bh(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||oa).replace(/\/$/,"")}function ho(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 wh(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>A1)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function ra(e,t){return e==null?t:!!e}function _1(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 T1(e,t=0){let n=0,r=0,o=t;for(;o<e.length&&o-t<3;){let i=e[o++];if(n|=(i&127)<<r,(i&128)===0)return{value:n,offset:o};r+=7}return null}function xh(e){let t=Buffer.from(e,"base64"),n=T1(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 hl(e={},{quotedAtMs:t=Date.now(),ttlMs:n=hh}={}){let r=de(e.inputMint,"inputMint"),o=de(e.outputMint,"outputMint"),i=ho(e.inAmount,"inAmount"),a=ho(e.outAmount,"outAmount"),s=ho(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=wh(e.slippageBps??50),l=(BigInt(a)-BigInt(a)*BigInt(c)/10000n).toString();if(s!==l)throw new Error("jupiter: otherAmountThreshold does not match serialized min-out");return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:a,otherAmountThreshold:s,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||hh,1e3),3e4)}}function C1({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==gl)throw new Error("jupiter: local signer supports native SOL input only");if(BigInt(o?.prioritizationFeeLamports??0)!==0n)throw new Error("jupiter: local signer requires zero priority fee until exact fee accounting is supplied");let i=xh(n),a=ho(r.exactFeeLamports??o.exactFeeLamports??"5000","exactFeeLamports");return{version:1,surface:"sol",action:"swap",owner:e,destination:t.outputMint,tradeId:r.tradeId||`jupiter-${t.inputMint.slice(0,6)}-${t.outputMint.slice(0,6)}-${t.inAmount}`,slippageBps:t.slippageBps,expiresAtMs:t.expiresAtMs,fee:{oracleFeeBps:5},artifact:{cluster:r.cluster||"mainnet",provider:"jupiter",inputMint:t.inputMint,outputMint:t.outputMint,inAmount:t.inAmount,outAmount:t.outAmount,otherAmountThreshold:t.otherAmountThreshold,slippageBps:t.slippageBps,jupiterProgram:r.jupiterProgram||o.jupiterProgram||"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",messageBase64:i,exactFeeLamports:a}}}var P1=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),N1="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function gh(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=N1.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 vh(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(`${oa}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),a=Object.entries(i),s=a.filter(([p])=>gh(p)),c=[],l=a.filter(([p])=>!gh(p)).map(([p,f])=>({programId:p,label:f,reason:"malformed program id"}));if(e.verify===!1)return{source:`${oa}/program-id-to-label`,verified:s.map(([p,f])=>({programId:p,label:f})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:a.length,verified:s.length}};let u=async p=>{let m=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(m.error)throw new Error(m.error.message);return m.result};for(let p=0;p<s.length;p+=90){let f=s.slice(p,p+90),m=null;for(let h=0;h<3&&!m;h++)try{m=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[f.map(([b])=>b),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(b=>setTimeout(b,2e3*(h+1)))}if(!m){for(let[h,b]of f)l.push({programId:h,label:b,reason:"rpc batch failed after 3 attempts"});continue}m.value.forEach((h,b)=>{let[x,w]=f[b];h&&h.executable===!0&&P1.has(h.owner)?c.push({programId:x,label:w,owner:h.owner}):l.push({programId:x,label:w,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${oa}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:a.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,f)=>p.label.localeCompare(f.label)),unresolved:l}}async function Sh(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await ia({inputMint:gl,outputMint:yh,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 ia(e={},t={}){let n=de(e.inputMint||e.fromMint||gl,"inputMint"),r=de(e.outputMint||e.toMint||yh,"outputMint"),o=ho(e.amount||e.inAmount,"amount"),i=wh(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${bh(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await k(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=hl({...s,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:s,solanaGuard:c}}function O1(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function kh(e={},t={}){let n=de(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:hl(e.quoteResponse,t)}:await ia(e,t),o=r.quote,i=r.solanaGuard||hl(o,t);if(ra(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await k(`${bh(t)}/swap`,{method:"POST",body:O1({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:ra(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:ra(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:ra(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=_1(a?.swapTransaction);xh(s),At("jupiter",a);let c=a?.quoteResponse??a?.quote??null,l=["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"],u=!1;if(c&&typeof c=="object"){for(let f of l){let m=o?.[f],h=c?.[f];if(m==null||h==null)throw new Error(`jupiter: echoed quote is incomplete \u2014 missing ${f}`);if(String(m)!==String(h))throw new Error(`jupiter: swap response ${f} (${h}) does not match the quoted ${f} (${m}) \u2014 refusing to prepare`)}u=!0}let d=null,p=null;try{d=C1({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(f){p=String(f?.message||f).slice(0,200)}return N({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}$();var L1="https://coins.llama.fi",$1="https://api.llama.fi",B1="https://yields.llama.fi",M1="https://stablecoins.llama.fi";function F1(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||L1).replace(/\/$/,"")}function Eh(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||$1).replace(/\/$/,"")}async function bn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return k(`${F1(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ih(e={}){let n=(await bn(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Ah(e={}){return k(`${Eh(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function _h(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||B1).replace(/\/$/,""),r=await k(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(a=>String(a.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(a=>String(a.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(a=>!!a.stablecoin==!!e.stablecoin)),o.sort((a,s)=>Number(s.tvlUsd||0)-Number(a.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...r,data:o.slice(0,i)}}async function aa(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||M1).replace(/\/$/,""),r=e.includePrices!==!1;return k(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Th(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return k(`${Eh(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Ch(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await bn(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}$();var Vt="0x000000000000000000000000000000000000dEaD";function yl(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Vt}Z();Wi();var D1="https://li.quest/v1";function wl(e={}){return(e.baseUrl||process.env.LIFI_API_URL||D1).replace(/\/$/,"")}var bl="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",q1="0x0000000000000000000000000000000000000000";function H1(e){let t=String(e||bl).toLowerCase();return t===bl.toLowerCase()||t===q1}function Ph(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 Nh(e={}){let t=await k(`${wl(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 go(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=bl,toToken:i,fromAmount:a,fromAddress:s=Vt}=e;if(n==null||!i||!a)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(a),fromAddress:s}),l=Fe({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 Vi({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[b,x]of Object.entries(cf(u)))c.set(b,x);let d=await k(`${wl(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 f=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=re(d,{chainId:Number(n),venue:f,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(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:u}}async function Oh(e={},t={}){let n=await go(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!H1(e.fromToken)){let a=n?.estimate?.approvalAddress||n?.approvalAddress;if(!a)throw new Error("lifi: ERC20 route missing approvalAddress");let s=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:Ph(s,"approval token"),spender:Ph(a,"approval spender"),amount:String(e.fromAmount)}}return N({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:fe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Rh(e={}){return k(`${wl(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}he();import{Interface as Bh,getAddress as yo,isAddress as z1}from"ethers";Z();var Wt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},V1=[1,50,100,200,2e3],Lh=new Bh(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),W1=new Bh(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Mh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Fh="0x0000000000000000000000000000000000000000";function Uh(e){let t=Number(e),n=Wt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Wt).join(", ")})`);return{chainId:t,...n}}function $h(e,t){let n=Wt[Number(t)];if(!e||e===Mh||e===Fh||/^eth$/i.test(String(e)))return yo(n.weth);let r=String(e);if(/^weth$/i.test(r))return yo(n.weth);if(/^usdc$/i.test(r))return yo(n.usdc);if(!z1(r))throw new Error(`invalid token address: ${e}`);return yo(r)}async function sa(e={},t={}){let{chainId:n,quoter:r,router:o}=Uh(e.chainId??8453),i=$h(e.tokenIn||"WETH",n),a=$h(e.tokenOut||Wt[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...V1],l=[],u=null;for(let d of c){let p=Lh.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let f=await U(n,"eth_call",[{to:r,data:p},"latest"],t);if(!f||f==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let m=Lh.decodeFunctionResult("quoteExactInputSingle",f),h={tickSpacing:d,ok:!0,amountOut:m[0].toString(),sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(f){l.push({tickSpacing:d,ok:!1,error:String(f.message||f).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return re({venue:"aerodrome",chainId:n,chain:Wt[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Dh(e={},t={}){let n=Number(e.chainId??8453),r=Uh(n),o=yo(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Mh||i===Fh||/^eth$/i.test(i),s=await sa(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=W1.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return N({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:a?s.amountIn:"0",slippageGuard:fe(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function qh(e={}){let t=Number(e.chainId??8453);try{let n=await sa({chainId:t,tokenIn:"WETH",tokenOut:"USDC",amountIn:"1000000000000000"},e),r=Number(n.amountOut)/1e6;return{ok:!0,chainId:t,tickSpacing:n.tickSpacing,amountOutUsdc:r,midPxHint:r/.001,router:Wt[t]?.router,quoter:Wt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Hh(){return Object.entries(Wt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}$();Z();var K1="https://api.0x.org";function jh(e={}){return ze({provider:"zerox",defaultUrl:K1,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function zh(e={}){return jh(e).baseUrl}function ca(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Vh(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":ca(e)},jh(e).trusted)}async function Wh(e={}){if(!ca(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await xl({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 xl(e={},t={}){if(!ca(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let s=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return a&&s.set("taker",a),k(`${zh(t)}/swap/allowance-holder/price?${s}`,{headers:Vh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function bo(e={},t={}){if(!ca(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let s=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`0x: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(s.selectedBps)});a&&c.set("taker",a);let l=await k(`${zh(t)}/swap/allowance-holder/quote?${c}`,{headers:Vh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?re(l,{chainId:n,venue:l?.transaction?.to||l?.to||"0x",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...l,autoSlippagePolicy:s}}async function Gh(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await bo(e,t),r=n?.transaction;if(!r?.to||!r?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=n?.issues?.allowance?.spender||n?.allowanceTarget;return N({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:n?.issues?.allowance?.actual!=null&&BigInt(n.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:r.to,data:r.data,value:r.value??"0x0",...r.gas!=null?{gasLimit:r.gas}:{},slippageGuard:fe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}$();Z();var X1="https://across.to/api",Q1="https://api.hop.exchange/v1",J1="https://api.relay.link",Z1={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function Kh(e={}){try{return{ok:!0,estimatedFillTimeSec:(await vl({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function vl(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:a}=e;if(!n||o==null||i==null||!a)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let s=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(a)}),c=(t.baseUrl||process.env.ACROSS_API_URL||X1).replace(/\/$/,"");return k(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Yh(e={}){try{let t=await Sl({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 Sl(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let a=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),s=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a});if(!s.executable)throw new Error(`hop: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(s.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||Q1).replace(/\/$/,""),u=await k(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?re(u,{chainId:Number(e.originChainId||e.chainId||Z1[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a}):{...u,autoSlippagePolicy:s}}async function Xh(e={}){try{let t=await la({user:Vt,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 la(e={},t={}){let{user:n=Vt,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:a="0x0000000000000000000000000000000000000000",amount:s,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!s)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=Fe({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||J1).replace(/\/$/,""),d=await k(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:a,amount:String(s),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:re(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Qh(e={},t={}){let n=await la(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(s=>(s.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:s.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(s=>String(s.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let a=o.map(s=>({chainId:r,from:s.from||e.user,to:s.to,data:s.data,value:s.value??"0x0",...s.gasLimit!=null||s.gas!=null?{gasLimit:s.gasLimit??s.gas}:{},slippageGuard:fe(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return N({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}$();import{TypedDataEncoder as t_,getAddress as wo,isAddress as n_}from"ethers";var h6=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function kl(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Jh(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}Z();var e0={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"},r_=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),o_=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Il={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},t0={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Zh=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"}]}),E6=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function Al(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=e0[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function ua(e,t){let n=String(e||"").trim();if(!n_(n))throw new Error(`cowswap: ${t} must be an address`);return wo(n).toLowerCase()}function El(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 i_(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 a_(e){let t=r_[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:wo(t)}}function s_(e={},t,n){let r=ua(e.sellToken,"sellToken"),o=ua(e.buyToken,"buyToken"),i=ua(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=i_(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:El(e.sellAmount,"sellAmount"),buyAmount:El(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:El(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function n0(e={}){try{let t=await Zn({chainId:1,sellToken:Il[1],buyToken:t0[1],sellAmountBeforeFee:"1000000000000000",from:Vt},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 Zn(e={},t={}){let n=Number(e.chainId??1),r=yl(e.from||e.owner),o=e.sellToken||Il[n],i=e.buyToken||t0[n],a=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||a==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Il[n],!o))throw new Error("no WETH mapping for chain");let s={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:a,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await k(`${Al(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?re(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function r0(e={},t={}){let n=Number(e.chainId??1),r=ua(yl(e.from||e.owner||e.signer),"owner"),o=await Zn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=s_(o?.quote||o,n,r),a=a_(n),s={domain:a,types:Zh,primaryType:"Order",message:i},c=t_.hash(a,Zh,i),l=o_[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return N({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:wo(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:s,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:a.verifyingContract.toLowerCase(),vaultRelayer:wo(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:wo(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function o0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return k(`${Al(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function i0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return k(`${Al(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function a0(){return Object.keys(e0).map(Number)}$();Z();var l_="https://api.1inch.dev/swap/v6.0";function s0(e={}){return ze({provider:"oneinch",defaultUrl:l_,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function _l(e={}){return s0(e).baseUrl}function xo(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Tl(e={}){let t=xo(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},s0(e).trusted)}async function c0(e={}){if(!xo(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Cl({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 Cl(e={},t={}){if(!xo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let a=new URLSearchParams({src:r,dst:o,amount:String(i)}),s=await k(`${_l(t)}/${n}/quote?${a}`,{headers:Tl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?re(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function u_(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Pl(e={},t={}){if(!xo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return k(`${_l(t)}/${n}/approve/spender`,{headers:Tl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function l0(e={},t={}){if(!xo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,a=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!a)throw new Error("oneinchPrepare requires src, dst, amount, from");let s=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`1inch: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:a,slippage:String(s.selectedBps/100)});e.receiver&&c.set("receiver",e.receiver),e.referrer&&c.set("referrer",e.referrer),e.disableEstimate!=null&&c.set("disableEstimate",String(!!e.disableEstimate)),e.allowPartialFill!=null&&c.set("allowPartialFill",String(!!e.allowPartialFill)),e.includeProtocols&&c.set("includeProtocols",String(e.includeProtocols)),e.excludeProtocols&&c.set("excludeProtocols",String(e.excludeProtocols));let l=await k(`${_l(t)}/${n}/swap?${c}`,{headers:Tl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),u=l?.tx;if(!u?.to||!u?.data)throw new Error("1inch: swap returned no executable tx");if(u.from&&String(u.from).toLowerCase()!==String(a).toLowerCase())throw new Error("1inch: transaction sender mismatch");let d=l?.dstAmount||l?.toTokenAmount||l?.buyAmount;if(!d)throw new Error("1inch: swap response missing dstAmount");let p=re(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),f=null;if(!u_(r)){let m=l?.spender||l?.approvalAddress||(await Pl({chainId:n},t))?.address;if(!m)throw new Error("1inch: ERC-20 route missing approval spender");f={token:r,spender:m,amount:String(i)}}return N({provider:"oneinch",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:p,autoSlippage:p.autoSlippage,requiresApproval:f,transaction:{chainId:n,from:u.from||a,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:fe(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}Z();var p_=96*1024,u0=50;function m_(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>p_)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 _t(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function p0(e,t){let n=_t(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 f_(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 h_(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=_t(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:_t(e.network,`accepts[${t}].network`),amount:p0(e.amount,`accepts[${t}].amount`),asset:_t(e.asset,`accepts[${t}].asset`),payTo:_t(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:f_(e.extra)})}function Nl(e){let t=m_(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>u0)throw new Error(`x402: accepts must contain 1-${u0} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:_t(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(h_));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 d0(e,t){return String(e)===String(t)}function g_(e,t={}){let n=Nl(e),r=_t(t.network,"network"),o=_t(t.asset,"asset"),i=_t(t.payTo,"payTo"),a=BigInt(p0(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&d0(l.asset,o)&&d0(l.payTo,i));if(s.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=s.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>a)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${a}`);return c}function m0(e={}){return e.paymentRequired??e.header??e.body}function f0(e={}){return Nl(m0(e))}function h0(e={},t={}){let n=Nl(m0(e)),r=g_(n,e);return N({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function g0(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}$();var b_="https://api.bankr.bot";function Ol(e={}){return ze({provider:"bankr",defaultUrl:b_,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function y0(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function w_(e={}){let t=y0(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function b0(e={},t=!1){let n=w_(e),r=Ol(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function w0(e,t={}){return k(`${Ol(t).baseUrl}${e}`,{headers:b0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function Rl(e={}){return w0("/wallet/me",e)}async function x0(e={}){return w0("/wallet/portfolio",e)}function vo(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function x_(e){let t=vo(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 v0(e={},t={}){let n={fromChain:vo(e.fromChain,"fromChain"),fromToken:vo(e.fromToken,"fromToken"),toChain:vo(e.toChain,"toChain"),toToken:vo(e.toToken,"toToken"),amount:x_(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return k(`${Ol(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:b0(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function S0(e={}){if(!y0(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await Rl(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var S_=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function So(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||S_,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),f=setTimeout(()=>{m(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function m(){clearTimeout(f);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let b;try{b=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{b={raw:String(h.data).slice(0,200)}}u.push(b),b.channel&&b.channel!=="subscriptionResponse"?d+=1:b.data&&b.channel==="subscriptionResponse"||b.channel||(d+=1),d>=r&&(m(),l||(l=!0,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{m(),l||(l=!0,c(new Error("hl ws error")))})})}async function k0(e={}){try{let t=await So({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 E0(e={}){let t=await So({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function I0(e,t={}){if(!e)throw new Error("coin required");let n=await So({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var E_=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function da(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let a=t.url||E_,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,f=new i(a),m=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(m);try{f.close()}catch{}}f.addEventListener("open",()=>{f.send(JSON.stringify({assets_ids:n,type:"market"}))}),f.addEventListener("message",b=>{let x;try{x=JSON.parse(typeof b.data=="string"?b.data:String(b.data))}catch{x={raw:String(b.data).slice(0,300)}}d.push(x),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),f.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function A0(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await da([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 _0(e,t={}){if(!e)throw new Error("assetId required");let n=await da([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import O0 from"node:path";import{homedir as F_}from"node:os";import{createHash as U_,randomUUID as D_}from"node:crypto";import ae from"node:fs";import pa from"node:path";import{createHash as A_,randomUUID as T0}from"node:crypto";var Ll=1,ct=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Gt(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(Gt).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Gt(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function C0(e){return A_("sha256").update(Gt(e)).digest("hex")}function ma(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 fa(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function P0(e){ae.mkdirSync(e,{recursive:!0,mode:448});try{ae.chmodSync(e,448)}catch{}}function $l(e){try{let t=ae.statSync(e);return{...JSON.parse(ae.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function er({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:a=3e4,lockWaitMs:s=2e3,lockIdFactory:c=()=>T0()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(a)||a<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(s)||s<0||s>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let g=n();return r(g),{schemaVersion:Ll,kind:t,generation:0,data:g}}function d(g){let y;try{y=JSON.parse(g)}catch(E){throw new ct(`corrupt ${t} snapshot: invalid JSON (${E.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new ct(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==Ll)throw new ct(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new ct(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...S}=y;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||C0(S)!==v)throw new ct(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(E){throw new ct(`corrupt ${t} snapshot: ${E.message}`,"STORE_CORRUPT")}return S}function p(){if(!ae.existsSync(e))return u();let g=ae.statSync(e);if(!g.isFile()||g.size>i)throw new ct(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ae.chmodSync(e,384)}catch{}return d(ae.readFileSync(e,"utf8"))}function f(){P0(pa.dirname(e));let g=ma(o),y=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:g})}
|
|
144
|
-
`,
|
|
145
|
-
`;if(Buffer.byteLength(v)>i)throw new ct(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let S=pa.dirname(e);P0(S);let E=pa.join(S,`.${pa.basename(e)}.${process.pid}.${T0()}.tmp`),I;try{I=ae.openSync(E,"wx",384),ae.writeFileSync(I,v,"utf8"),ae.fsyncSync(I),ae.closeSync(I),I=void 0,ae.renameSync(E,e);try{ae.chmodSync(e,384)}catch{}try{let _=ae.openSync(S,"r");try{ae.fsyncSync(_)}finally{ae.closeSync(_)}}catch{}}finally{if(I!==void 0)try{ae.closeSync(I)}catch{}try{ae.unlinkSync(E)}catch(_){if(_?.code!=="ENOENT")throw _}}}function b(){return fa(p().data)}function x(){let g=p();return{schemaVersion:g.schemaVersion,kind:g.kind,generation:g.generation,data:fa(g.data)}}function w(g){if(typeof g!="function")throw new TypeError("mutator must be a function");let y=f();try{let v=p(),S=fa(v.data),E=g(S,{generation:v.generation,now:ma(o)});return r(S),h({schemaVersion:Ll,kind:t,generation:v.generation+1,data:S}),fa(E)}finally{m(y)}}return Object.freeze({filePath:e,read:b,inspect:x,mutate:w})}import{wordlists as __}from"ethers";var T_=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),C_=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],P_=new Set([12,15,18,21,24]);function N_(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return P_.has(t.length)&&t.every(n=>__.en.getWordIndex(n)>=0)}var O_=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,R_=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,L_=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function $_(e){let t=N0(e);return L_.has(t)||R_.test(t)}var ko=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function N0(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function B_(e){let t=N0(e);return[...T_].some(n=>t.includes(n))}function M_(e,t,n){if(typeof t=="string"){if(C_.some(r=>r.test(t))||N_(t))throw new ko(n);if(O_.test(t)&&!$_(e))throw new ko(n)}}function Bl(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return M_(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)=>Bl(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(B_(o))throw new ko(i);e[o]!==void 0&&(r[o]=Bl(e[o],i,o))}return r}function Tt(e){return Bl(e)}var ga=1,R0="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",j6=Object.freeze(["listing","offer","arm","instruct"]),q_=Object.freeze(["open","cancelled","expired","armed","submitted"]),z6=Object.freeze(["arm","sign-and-broadcast"]),H_=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."}),j_=/^(?:0|[1-9][0-9]*)$/,z_=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,V_=/^0x[a-fA-F0-9]{40}$/,W_=/^0x[a-fA-F0-9]{64}$/,G_=/[\u0000-\u001f\u007f]/,K_=new Set(q_),Ul=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function V(e,t){throw new Ul(e,t)}function vn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))vn(t);Object.freeze(e)}return e}function Io(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&V(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||G_.test(o))&&V(`${t} is invalid`),r?o.toLowerCase():o}function Re(e,t){let n=Io(e,t,{max:128});return z_.test(n)||V(`${t} must be a bounded id`),n}function Eo(e,t,{positive:n=!1}={}){typeof e=="number"&&V(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return j_.test(r)||V(`${t} must be a canonical integer string`),n&&r==="0"&&V(`${t} must be positive`),r}function xn(e,t){let n=Io(e,t,{max:42,lower:!0});return V_.test(n)||V(`${t} must be a 20-byte EVM address`),n}function L0(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&V(`${t} must be a plain object`),e}function wn(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&V("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Ml(e){return new Date(e).toISOString()}function Y_(e){return U_("sha256").update(Gt(e),"utf8").digest("hex")}function X_(e=process.env){let t=e.ORACLE_CONFIG_DIR||O0.join(F_(),".config","oracle");return O0.join(t,"local-marketplace.v1.json")}function ha(e){let t=e.status==="submitted";return vn({schemaVersion:ga,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:K_.has(e.status)?e.status:V("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>vn({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:R0,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function Q_(e){(!e||e.schemaVersion!==ga||!Array.isArray(e.listings))&&V("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&V("marketplace capacity exceeded","STORE_LIMIT")}function Fl(e,t){return vn({schemaVersion:ga,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:R0,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function J_(e,t,n){typeof e=="string"&&V("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=L0(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&V("generic signHash is refused","SIGNHASH_REFUSED");let o=xn(r.from??r.offerer??t.seller,"artifact.from"),i=xn(r.to??r.recipient??n.buyer,"artifact.to"),a=Eo(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&V("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&V("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&V("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&V("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function Z_(e,t){if(e==null)return{action:"arm"};let n=L0(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&V("generic signHash is refused","SIGNHASH_REFUSED");let r=Io(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&V("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&V("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&V("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&V("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&V("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&V("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function $0({filePath:e=X_(),clock:t=()=>Date.now(),idFactory:n=()=>D_()}={}){let r=er({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:ga,listings:[]}),validateData:Q_});function o(h,b){return h.tenantId===b}function i(h,b){return h.status==="open"&&Date.parse(h.expiresAt)<=b&&(h.status="expired"),h}function a(h={}){Tt(h);let b=Re(h.tenantId,"tenantId"),x=xn(h.seller,"seller"),w=Io(h.asset,"asset",{max:128}),g=Eo(h.amount,"amount",{positive:!0}),y=Eo(h.price,"price",{positive:!0}),v=Eo(h.chainId,"chainId",{positive:!0}),S=wn(t),E=Ml(S),I=h.expiresAt==null?Ml(S+864e5):Io(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(I))||Date.parse(I)<=S)&&V("expiresAt must be after now");let _=Re(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(T=>{T.listings.some(X=>X.listingId===_)&&V("listingId already exists","DUPLICATE");let C={listingId:_,tenantId:b,seller:x,asset:w,amount:g,price:y,chainId:v,status:"open",createdAt:E,expiresAt:I,offers:[],custody:"none",execution:"armed-local"},L={...C,listingHash:Y_(C)};return T.listings.push(L),ha(L)})}function s({tenantId:h}={}){let b=Re(h,"tenantId"),x=wn(t);return vn(r.read().listings.filter(w=>o(w,b)).map(w=>ha(i({...w,offers:w.offers.map(g=>({...g}))},x))))}function c({tenantId:h,listingId:b,actor:x}={}){let w=Re(h,"tenantId"),g=Re(b,"listingId"),y=xn(x,"actor"),v=wn(t);return r.mutate(S=>{let E=S.listings.find(I=>o(I,w)&&I.listingId===g);return E||V("listing not found","NOT_FOUND"),i(E,v),E.seller!==y&&V("only the seller can cancel","FORBIDDEN"),E.status!=="open"&&V("listing is not open","NOT_OPEN"),E.status="cancelled",ha(E)})}function l(h={}){Tt(h);let b=Re(h.tenantId,"tenantId"),x=Re(h.listingId,"listingId"),w=xn(h.buyer,"buyer"),g=Eo(h.amount,"amount",{positive:!0}),y=wn(t),v=Re(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(S=>{let E=S.listings.find(I=>o(I,b)&&I.listingId===x);return E||V("listing not found","NOT_FOUND"),i(E,y),E.status!=="open"&&V("listing is not open","NOT_OPEN"),E.seller===w&&V("seller cannot offer on their own listing","FORBIDDEN"),E.offers.some(I=>I.offerId===v)&&V("offerId already exists","DUPLICATE"),E.offers.push({offerId:v,buyer:w,amount:g,status:"open",createdAt:Ml(y)}),ha(E)})}function u(h,{tenantId:b,listingId:x,offerId:w,actor:g,now:y,allowed:v=["open","armed"]}){let S=h.listings.find(I=>o(I,b)&&I.listingId===x);S||V("listing not found","NOT_FOUND"),i(S,y),v.includes(S.status)||V("listing is not open","NOT_OPEN"),S.seller!==g&&V("only the seller can arm a fill","FORBIDDEN");let E=S.offers.find(I=>I.offerId===w);return(!E||!["open","armed"].includes(E.status))&&V("offer not found","NOT_FOUND"),{row:S,offer:E}}function d({tenantId:h,listingId:b,offerId:x,actor:w}={}){let g=Re(h,"tenantId"),y=Re(b,"listingId"),v=Re(x,"offerId"),S=xn(w,"actor"),E=wn(t);return r.mutate(I=>{let{row:_,offer:T}=u(I,{tenantId:g,listingId:y,offerId:v,actor:S,now:E});return _.status="armed",T.status="armed",Fl(_,T)})}async function p({tenantId:h,listingId:b,offerId:x,actor:w,instruction:g,executor:y}={}){let v=Re(h,"tenantId"),S=Re(b,"listingId"),E=Re(x,"offerId"),I=xn(w,"actor"),_=wn(t),T=r.mutate(B=>{let{row:z,offer:pe}=u(B,{tenantId:v,listingId:S,offerId:E,actor:I,now:_,allowed:["open","armed"]}),ve=Z_(g,z);return z.status="armed",pe.status="armed",{armed:Fl(z,pe),instruction:ve,listingHash:z.listingHash}});if(T.instruction.action==="arm")return T.armed;let C=r.read().listings.find(B=>B.listingId===S&&B.tenantId===v),L=C?.offers.find(B=>B.offerId===E),X=J_(T.instruction.artifact,C,L);(!y||typeof y.executeConfirmedArtifact!="function")&&V("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&V("generic signHash executors are refused","SIGNHASH_REFUSED");let Q=await y.executeConfirmedArtifact(X,T.instruction.nonce,y),O=Q?.receipt?.transactionHash??Q?.transactionHash;(typeof O!="string"||!W_.test(O))&&V("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let q=Q?.receipt?.status??Q?.status;return q!==1&&q!=="0x1"&&V("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(B=>{let{row:z,offer:pe}=u(B,{tenantId:v,listingId:S,offerId:E,actor:I,now:wn(t),allowed:["armed"]});return z.status="submitted",pe.status="submitted",z.transactionHash=O.toLowerCase(),vn({...Fl(z,pe),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:z.transactionHash,review:`Local P2 fill ${z.listingId} signed and broadcast through the instructed local signer. transactionHash=${z.transactionHash}`})})}function f({tenantId:h,text:b}={}){return Re(h,"tenantId"),(typeof b!="string"||b.trim()==="")&&V("consult text required"),vn({accepted:!1,reason:"untrusted consult text cannot create, fill, or cancel listings",custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1})}function m(){return H_}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:f,agentCard:m})}import B0 from"node:path";import{homedir as eT}from"node:os";import{createHash as tT,randomUUID as nT}from"node:crypto";var ba=1,M0="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",Q6=Object.freeze(["open","cancelled","armed","submitted"]),rT=/^(?:0|[1-9][0-9]*)$/,oT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,iT=/^0x[a-fA-F0-9]{40}$/,aT=/^0x[a-fA-F0-9]{64}$/,sT=/[\u0000-\u001f\u007f]/,Hl=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function K(e,t){throw new Hl(e,t)}function Ao(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ao(t);Object.freeze(e)}return e}function _o(e,t,{max:n=256}={}){typeof e!="string"&&K(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||sT.test(r))&&K(`${t} is invalid`),r}function Ct(e,t){let n=_o(e,t,{max:128});return oT.test(n)||K(`${t} must be a bounded id`),n}function ya(e,t,{positive:n=!1}={}){typeof e=="number"&&K(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return rT.test(r)||K(`${t} must be a canonical integer string`),n&&r==="0"&&K(`${t} must be positive`),r}function Sn(e,t){let n=_o(e,t,{max:42}).toLowerCase();return iT.test(n)||K(`${t} must be a 20-byte EVM address`),n}function cT(e){let t=_o(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{K("resource must be an https URL")}return n.protocol!=="https:"&&K("resource must be https"),(n.username||n.password)&&K("resource must not contain credentials"),n.toString()}function F0(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&K(`${t} must be a plain object`),e}function lT(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&K("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function uT(e){return new Date(e).toISOString()}function dT(e=process.env){let t=e.ORACLE_CONFIG_DIR||B0.join(eT(),".config","oracle");return B0.join(t,"local-x402.v1.json")}function Dl(e){let t=e.status==="submitted";return Ao({schemaVersion:ba,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:M0,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function pT(e){(!e||e.schemaVersion!==ba||!Array.isArray(e.intents))&&K("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&K("x402 capacity exceeded","STORE_LIMIT")}function ql(e){return Ao({schemaVersion:ba,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:M0,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function mT(e,t){typeof e=="string"&&K("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=F0(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&K("generic signHash is refused","SIGNHASH_REFUSED");let r=Sn(n.from??t.payer,"artifact.from"),o=Sn(n.to??t.payTo,"artifact.to"),i=ya(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&K("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&K("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&K("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&K("amount exceeds maxBudget","BUDGET"),n}function fT(e,t){if(e==null)return{action:"arm"};let n=F0(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&K("generic signHash is refused","SIGNHASH_REFUSED");let r=_o(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&K("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&K("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&K("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&K("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function U0({filePath:e=dT(),clock:t=()=>Date.now(),idFactory:n=()=>nT()}={}){let r=er({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:ba,intents:[]}),validateData:pT});function o(l={}){Tt(l);let u=Ct(l.tenantId,"tenantId"),d=Sn(l.payer,"payer"),p=Sn(l.payTo,"payTo"),f=cT(l.resource),m=ya(l.amount,"amount",{positive:!0}),h=ya(l.maxBudget??m,"maxBudget",{positive:!0});BigInt(m)>BigInt(h)&&K("amount exceeds maxBudget","BUDGET");let b=_o(l.asset??"USDC","asset",{max:32}),x=ya(l.chainId,"chainId",{positive:!0}),w=lT(t),g=Ct(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(E=>E.intentId===g)&&K("intentId already exists","DUPLICATE");let v={intentId:g,tenantId:u,payer:d,payTo:p,resource:f,amount:m,maxBudget:h,asset:b,chainId:x,status:"open",createdAt:uT(w),custody:"none",execution:"armed-local"},S={...v,intentHash:tT("sha256").update(Gt(v),"utf8").digest("hex")};return y.intents.push(S),Dl(S)})}function i({tenantId:l}={}){let u=Ct(l,"tenantId");return Ao(r.read().intents.filter(d=>d.tenantId===u).map(Dl))}function a({tenantId:l,intentId:u,actor:d}={}){let p=Ct(l,"tenantId"),f=Ct(u,"intentId"),m=Sn(d,"actor");return r.mutate(h=>{let b=h.intents.find(x=>x.tenantId===p&&x.intentId===f);return b||K("intent not found","NOT_FOUND"),b.payer!==m&&K("only the payer can cancel","FORBIDDEN"),b.status!=="open"&&K("intent is not open","NOT_OPEN"),b.status="cancelled",Dl(b)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=Ct(l,"tenantId"),f=Ct(u,"intentId"),m=Sn(d,"actor");return r.mutate(h=>{let b=h.intents.find(x=>x.tenantId===p&&x.intentId===f);return b||K("intent not found","NOT_FOUND"),b.payer!==m&&K("only the payer can arm","FORBIDDEN"),["open","armed"].includes(b.status)||K("intent is not open","NOT_OPEN"),b.status="armed",ql(b)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:f}={}){let m=Ct(l,"tenantId"),h=Ct(u,"intentId"),b=Sn(d,"actor"),x=r.mutate(E=>{let I=E.intents.find(T=>T.tenantId===m&&T.intentId===h);I||K("intent not found","NOT_FOUND"),I.payer!==b&&K("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(I.status)||K("intent is not open","NOT_OPEN");let _=fT(p,I);return I.status="armed",{armed:ql(I),instruction:_}});if(x.instruction.action==="arm")return x.armed;let w=r.read().intents.find(E=>E.tenantId===m&&E.intentId===h),g=mT(x.instruction.artifact,w);(!f||typeof f.executeConfirmedArtifact!="function")&&K("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof f.signHash=="function"&&K("generic signHash executors are refused","SIGNHASH_REFUSED");let y=await f.executeConfirmedArtifact(g,x.instruction.nonce,f),v=y?.receipt?.transactionHash??y?.transactionHash;(typeof v!="string"||!aT.test(v))&&K("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let S=y?.receipt?.status??y?.status;return S!==1&&S!=="0x1"&&K("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(E=>{let I=E.intents.find(_=>_.tenantId===m&&_.intentId===h);return(!I||I.status!=="armed")&&K("intent is not armed","NOT_OPEN"),I.status="submitted",I.transactionHash=v.toLowerCase(),Ao({...ql(I),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:I.transactionHash,review:`Oracle local x402 ${I.intentId} signed and broadcast. transactionHash=${I.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import D0 from"node:path";import{homedir as hT}from"node:os";import{randomUUID as gT}from"node:crypto";var Vl=1,yT="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",aF=Object.freeze(["listed","revoked"]),bT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,wT=/[\u0000-\u001f\u007f]/,xT=/^[a-f0-9]{64}$/,vT=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,ST=new Set(["read","prepare","none"]),zl=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function ke(e,t){throw new zl(e,t)}function Wl(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Wl(t);Object.freeze(e)}return e}function Kt(e,t,{max:n=256}={}){typeof e!="string"&&ke(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||wT.test(r))&&ke(`${t} is invalid`),r}function To(e,t){let n=Kt(e,t,{max:128});return bT.test(n)||ke(`${t} must be a bounded id`),n}function q0(e,t){let n=Kt(e,t,{max:64}).toLowerCase();return xT.test(n)||ke(`${t} must be 64 lowercase hex`),n}function kT(e,t){let n=Kt(e,t,{max:2048}),r;try{r=new URL(n)}catch{ke(`${t} must be an https URL`)}return r.protocol!=="https:"&&ke(`${t} must be https`),(r.username||r.password)&&ke(`${t} must not contain credentials`),r.toString()}function ET(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&ke("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Kt(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!vT.test(r)||r==="0.0.0.0")&&ke(`outboundHosts[${n}] is not an allowlisted host`),r}))}function H0(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ke("clock invalid","CLOCK_INVALID"),n}function j0(e){return new Date(e).toISOString()}function IT(e=process.env){let t=e.ORACLE_CONFIG_DIR||D0.join(hT(),".config","oracle");return D0.join(t,"local-pack-registry.v1.json")}function jl(e){return Wl({schemaVersion:Vl,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:yT,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function AT(e){(!e||e.schemaVersion!==Vl||!Array.isArray(e.packs))&&ke("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&ke("pack registry capacity exceeded","STORE_LIMIT")}function z0({filePath:e=IT(),clock:t=()=>Date.now(),idFactory:n=()=>gT()}={}){let r=er({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Vl,packs:[]}),validateData:AT});function o(l={}){Tt(l);let u=To(l.tenantId,"tenantId"),d=Kt(l.name,"name",{max:128}),p=Kt(l.version,"version",{max:64}),f=Kt(l.publisher,"publisher",{max:128}),m=q0(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:q0(l.sbomDigest,"sbomDigest"),b=l.homepage==null?null:kT(l.homepage,"homepage"),x=ET(l.outboundHosts),w=Kt(l.spendScope??"none","spendScope",{max:16});ST.has(w)||ke("spendScope must be read, prepare, or none"),w!=="none"&&w!=="read"&&ke("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let g=H0(t),y=To(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(E=>E.packId===y||E.tenantId===u&&E.name===d&&E.version===p&&E.status==="listed")&&ke("pack already listed","DUPLICATE");let S={packId:y,tenantId:u,name:d,version:p,publisher:f,manifestDigest:m,sbomDigest:h,homepage:b,outboundHosts:x,spendScope:w,status:"listed",createdAt:j0(g),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(S),jl(S)})}function i({tenantId:l}={}){let u=To(l,"tenantId");return Wl(r.read().packs.filter(d=>d.tenantId===u).map(jl))}function a({tenantId:l,packId:u}={}){let d=To(l,"tenantId"),p=To(u,"packId"),f=H0(t);return r.mutate(m=>{let h=m.packs.find(b=>b.tenantId===d&&b.packId===p);return h||ke("pack not found","NOT_FOUND"),h.status!=="listed"&&ke("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=j0(f),jl(h)})}function s(){ke("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){ke("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}$();import{getAddress as RT,Interface as nr,keccak256 as Yl}from"ethers";import{createHash as Xl,createHmac as LT,timingSafeEqual as ig}from"node:crypto";he();import{Interface as G0,getAddress as Gl,isAddress as _T}from"ethers";var TT="0x0000000000000000000000000000000000000000",K0=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),CT=new G0(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),PT=new G0(["function quoteExactInputSingle((address tokenIn,address tokenOut,uint256 amountIn,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)","function quoteExactOutputSingle((address tokenIn,address tokenOut,uint256 amount,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountIn,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)"]);function NT(e){let t=Number(e??4663),n=K0[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function V0(e,t){if(/^weth$/i.test(String(e||"")))return Gl(K0[t].weth);if(!_T(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Gl(e)}function OT(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function W0(e,t,n,r,o,i){let a=r.encodeFunctionData(o,i),s=await e(t,"eth_call",[{to:n,data:a},"latest"]);if(!s||s==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,s)}async function Y0(e,t={},n={}){try{let r=NT(t.chainId),o=V0(t.tokenIn,r.chainId),i=V0(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=OT(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),s=Number(t.tickSpacing??2e3);if(!Number.isInteger(s)||s<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||U,l=await W0(c,r.chainId,r.factory,CT,"getPool",[o,i,s]),u=Gl(l[0]);if(u.toLowerCase()===TT)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:a,tickSpacing:s,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:a,tickSpacing:s,sqrtPriceLimitX96:0n},f=await W0(c,r.chainId,r.quoter,PT,d,[p]),m={provider:"up33",venue:"up33-v3",chainId:r.chainId,chain:r.name,factory:r.factory,quoter:r.quoter,router:r.router,pool:u.toLowerCase(),tokenIn:o.toLowerCase(),tokenOut:i.toLowerCase(),tickSpacing:s,sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...m,amountIn:a.toString(),amountOut:f[0].toString()}:{...m,amountIn:f[0].toString(),amountOut:a.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function X0(e={},t={}){return Y0("exact-input",e,t)}async function Q0(e={},t={}){return Y0("exact-output",e,t)}Z();var j=4663,wa="https://anvil.clutch.market",$T=`${wa}/api/markets/snapshot?chainId=${j}`,BT=`${wa}/api/rpc?chainId=${j}`,MT=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),We="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Ql="0x0000000000000000000000000000000000000000",kn=1e5,FT=256e3,J0=256,UT=3e4,DT=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"}),et=Object.freeze({chainId:j,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Pe=new nr(["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"]),qT=new nr(["function allowance(address owner,address spender) view returns (uint256)"]),ag=new nr(["function decimals() view returns (uint8)"]),Z0=new nr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),tt=new nr(["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)"]),Yt=new nr(["function pendingEth() view returns (uint256)","function minDropWei() view returns (uint256)","function roundActive() view returns (bool)","function currentRound() view returns (uint256)","function roundState() view returns (uint256 roundId,bool active,uint256 cursor,uint256 remaining,uint256[3] amounts,uint256[3] paid)","function getStockTokens() view returns (address[3])","function startDropPublic(uint256 minOutBps)","function continueDrop(uint256 batchSize)"]);function D(e,t){try{return RT(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Nt(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 Ge(e,t,n=null){let r=e==null&&n!=null?n:e,o=String(r??"").trim();if(!/^\d+$/.test(o))throw new Error(`stonkbrokers: ${t} must be an unsigned integer`);return BigInt(o)}async function ee(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(j,"eth_call",[{to:D(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function sg(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 eg(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>J0)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${J0}`);return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new Error("stonkbrokers: Anvil snapshot rows must be objects");if(Number(n.chainId)!==j)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${j}`);return{name:n.name||n.collectionName||null,chainId:j,collection:D(n.collection||n.collectionAddress,"Anvil collection"),market:D(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?D(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 HT(e,t,n=[],r={}){if(Number(e)!==j)throw new Error(`stonkbrokers: Anvil supports chain ${j} only`);if(!MT.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await k(BT,{method:"POST",headers:{origin:wa,referer:`${wa}/`,"user-agent":"Mozilla/5.0"},body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??2e4,retries:0});if(o?.error)throw new Error(`stonkbrokers: Anvil RPC ${o.error.message||"failed"}`);if(o?.result==null)throw new Error("stonkbrokers: Anvil RPC returned no result");return o.result}function lt(e={}){return e.rpcCall||((t,n,r)=>HT(t,n,r,e))}async function rr(e={},t={}){if(e.snapshot){let s=eg(e.snapshot),c={kind:"anvil-markets",chainId:j,total:s.length,contentHash:Xl("sha256").update(tr(s)).digest("hex")},l=Jl(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(s,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),s}let n=s=>{let c=String(s?.headers?.get?.("content-type")||"").split(";",1)[0].trim().toLowerCase();if(c!=="application/json"&&!c.endsWith("+json"))throw new Error("stonkbrokers: Anvil snapshot content-type must be JSON")},r=await k($T,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:FT,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=eg(r),i={kind:"anvil-markets",chainId:j,total:o.length,contentHash:Xl("sha256").update(tr(o)).digest("hex")},a=Jl(e.snapshotCompletenessEvidence??r.completenessEvidence,i,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(o,"snapshotCoverage",{value:{complete:a.valid,evidence:a.evidence,error:a.error},enumerable:!1}),o}function xa(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 cg({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 rr({},n)).find(m=>m.market===e);if(!i)throw new Error("stonkbrokers: market is missing from the trusted Anvil snapshot");if(i.collection!==t)throw new Error("stonkbrokers: trusted Anvil snapshot collection mismatch");if(!i.tokenAddress)throw new Error("stonkbrokers: trusted Anvil snapshot payment token is missing");let a=DT[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=lt(n),c=xa(await s(j,"eth_blockNumber",[])),l=await s(j,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||xa(l?.number)!==c)throw new Error("stonkbrokers: Anvil RPC returned an invalid block attestation");let d=Object.freeze({blockHash:u,requireCanonical:!0}),p=String(await s(j,"eth_getCode",[e,d])).toLowerCase();if(!/^0x[0-9a-f]+$/.test(p)||p==="0x")throw new Error("stonkbrokers: Anvil market runtime is empty");let f=Yl(p).toLowerCase();if(f!==a)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:s,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:f,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+UT}}function lg(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:j,market:e.record.market,collection:e.record.collection,paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r,snapshotFetchedAtMs:e.snapshotFetchedAtMs,snapshotExpiresAtMs:e.snapshotExpiresAtMs,blockNumber:BigInt(e.blockNumber).toString(),blockHash:e.blockHash,runtimeCodeHash:e.runtimeCodeHash})}async function Po(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=Nt(e.tokenId),i=await cg({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,f]=await Promise.all([ee(a,n,Pe,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Pe,"inventory",[BigInt(o)],s),ee(a,r,tt,"ownerOf",[BigInt(o)],s),ee(a,n,Pe,"collection",[],s),ee(a,n,Pe,"token",[],s),ee(a,n,Pe,"robinhoodSwapFeeWei",[],s)]),m=D(d[0],"Anvil market collection");if(m!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=D(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let b=Number((await ee(a,h,ag,"decimals",[],s))[0]);if(!Number.isSafeInteger(b)||b<0||b>255)throw new Error("stonkbrokers: invalid payment token decimals");let x=BigInt(f[0]).toString(),w=lg(i,{paymentToken:h,paymentTokenDecimals:b,nativeSwapFeeWei:x}),g=!!c[4],y=!!l[0],v=D(u[0],"NFT owner")===n,S=g&&y&&v;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:j,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:b,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:x,fees:sg(c[2],c[3]),available:S,evidence:{quoteAvailable:g,inventory:y,ownerIsMarket:v,marketCollection:m,attestation:w},reason:S?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function va(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=await cg({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Pe,"quoteSellNFT",[],a),ee(i,n,Pe,"collection",[],a),ee(i,n,Pe,"token",[],a),ee(i,n,Pe,"robinhoodSwapFeeWei",[],a)]),d=D(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=D(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let f=Number((await ee(i,p,ag,"decimals",[],a))[0]);if(!Number.isSafeInteger(f)||f<0||f>255)throw new Error("stonkbrokers: invalid payment token decimals");let m=BigInt(u[0]).toString(),h=lg(o,{paymentToken:p,paymentTokenDecimals:f,nativeSwapFeeWei:m});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:j,market:n,collection:r,paymentToken:p,paymentTokenDecimals:f,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(s[0]).toString(),grossPayoutRaw:BigInt(s[1]).toString(),nativeSwapFeeWei:m,fees:sg(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function ug(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 Pt(e,t){let n=Ge(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function dg({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:j,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Pt(o,"gasLimit").toString(),maxFeePerGas:Pt(i,"maxFeePerGasWei").toString(),nonce:Number(s),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return a!=null&&a!==""&&(c.maxPriorityFeePerGas=Pt(a,"maxPriorityFeePerGasWei").toString()),c}function pg(e,t){return N({provider:"anvil-nft",kind:"anvil-nft-execution",execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:"pending-local-signer",broadcast:"pending-local-signer",simulation:"required-again-at-local-signer",localSignerEnvelope:e,quote:t},{provider:"anvil-nft",kind:"anvil-nft-execution"})}async function mg(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=D(e.buyer,"buyer"),r=D(e.market,"Anvil market"),o=D(e.collection,"NFT collection"),i=Nt(e.tokenId),a=Pt(e.maxTotalCostRaw,"maxTotalCostRaw"),s=Ge(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 Po({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>a||BigInt(l.nativeSwapFeeWei)>s)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=Pt(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()),f=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),m=D(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),b=l.evidence.attestation,x={blockHash:b.blockHash,requireCanonical:!0},w=BigInt((await ee(lt(t),m,qT,"allowance",[n,r],x))[0]);if(w<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let g={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[dg({...g,to:r,data:Pe.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},S={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:m,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:b,anvilQuote:v,preconditions:{allowanceVerified:!0,allowanceRaw:w.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:ug(e.tradeId),slippageBps:0,expiresAtMs:p+f,fee:{oracleFeeBps:0},artifact:{chainId:j,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:m,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:b,anvilQuote:v,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:y}};return pg(S,l)}async function fg(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=lt(t),r=D(e.seller,"seller"),o=D(e.market,"Anvil market"),i=D(e.collection,"NFT collection"),a=Nt(e.tokenId),s=Pt(e.minPayoutRaw,"minPayoutRaw"),c=Ge(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 va({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[f,m,h]=await Promise.all([ee(n,i,tt,"ownerOf",[BigInt(a)],p).then(T=>D(T[0],"NFT owner")),ee(n,i,tt,"getApproved",[BigInt(a)],p).then(T=>D(T[0],"NFT approval")),ee(n,i,tt,"isApprovedForAll",[r,o],p).then(T=>!!T[0])]);if(f!==r)throw new Error("stonkbrokers: seller does not own exact NFT");if(m!==o&&!h)throw new Error("stonkbrokers: pre-existing NFT approval is required");if(BigInt(u.netPayoutRaw)<s||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let b=BigInt(u.netPayoutRaw),x=Pt(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(x!==b)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let w=Number(t.nowMs??Date.now()),g=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=D(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),S={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},E=[dg({...S,to:o,data:Pe.encodeFunctionData("sellNFT",[BigInt(a),b]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],I={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},_={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:y,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:b.toString(),minPayoutRaw:b.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:I,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:m,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:x.toString()},tradeId:ug(e.tradeId),slippageBps:0,expiresAtMs:w+g,fee:{oracleFeeBps:0},artifact:{chainId:j,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:I,exactQuoteNetPayoutRaw:b.toString(),minPayoutRaw:b.toString(),transactions:E}};return pg(_,u)}async function jT(e={},t={}){if(Array.isArray(e.tokenIds)){let w=e.tokenIds.map(v=>Nt(v)),g={kind:"anvil-inventory",chainId:j,market:D(e.market,"Anvil market"),collection:D(e.collection,"NFT collection"),total:w.length,contentHash:Xl("sha256").update(tr(w)).digest("hex")},y=Jl(e.inventoryCompletenessEvidence,g,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:w,total:w.length,scanned:w.length,complete:y.valid,continuation:y.valid?null:{offset:w.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=lt(t),r=D(e.market,"Anvil market"),o=xa(await n(j,"eth_blockNumber",[])),i=await n(j,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||xa(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Pe,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>kn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${kn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>kn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${kn}`);let p=u?Math.min(d,l):l,f={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:kn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:f};let m=BigInt((await ee(n,r,Pe,"oldestTokenId",[],s))[0]),h=[],b=new Set;for(;h.length<l&&h.length<p&&!b.has(m.toString());){let w=m.toString();b.add(w),h.push(w),m=BigInt((await ee(n,r,Pe,"getNextTokenId",[m],s))[0])}let x=h.length===l;return{ids:h,total:l,scanned:h.length,complete:x,continuation:x?null:{offset:h.length,tokenId:m.toString()},completenessEvidence:f}}function zT(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 VT(e,t,n){let r=lt(n);try{let o=String((await ee(r,e,tt,"tokenURI",[BigInt(t)]))[0]),i=zT(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await k(a,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,lookupFn:n.lookupFn,untrustedUrl:!0,maxResponseBytes:256e3})}catch(o){if(n.allowRarityOfFallback===!1)throw o;let i=await ee(r,e,tt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function hg(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 WT(e,t=[]){let n=Array.isArray(e?.attributes)?e.attributes:[];return t.every(r=>{let o=String(r?.traitType??r?.trait_type??"").trim().toLowerCase();if(!o)throw new Error("stonkbrokers: trait filter requires traitType");let i=n.find(u=>String(u?.trait_type??u?.traitType??"").trim().toLowerCase()===o),a=String(r?.op||"eq").trim().toLowerCase();if(a==="exists")return i!=null;if(i==null)return!1;let s=i.value;if(a==="eq")return String(s).toLowerCase()===String(r.value).toLowerCase();if(a==="in")return Array.isArray(r.values)&&r.values.some(u=>String(s).toLowerCase()===String(u).toLowerCase());let c=Number(s),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(a==="gte")return c>=l;if(a==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${a}`)})}async function Sa(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=await jT({...e,market:n},t),i=o.ids,a=Math.min(Math.max(Number(e.minStars??4)||4,1),5),s=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=lt(t),p=(await Me(i,s,async h=>{try{let b=await ee(u,r,tt,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(b[0])+1}}catch(b){return e.includeErrors?{tokenId:h,stars:null,error:String(b.message||b)}:null}})).filter(h=>h&&h.stars>=a),m=(await Me(p,s,async h=>{try{let b=await Po({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:b.available,quote:b,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(b){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(b.message||b)}:null}})).filter(Boolean).sort((h,b)=>Number(b.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(b.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:j,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:m.length,candidates:m,exec:!1,readOnly:!0}}let l=(await Me(i,s,async u=>{try{let[d,p]=await Promise.all([VT(r,u,t),Po({market:n,collection:r,tokenId:u},t)]),f=hg(d,e.traitType||"Stars"),m=Array.isArray(e.traitFilters)?e.traitFilters:[];return(m.length?WT(d,m):e.includeAll===!0?!0:f!=null&&f>=a)?{tokenId:u,stars:f,traits:d.attributes||[],available:p.available,quote:p,decision:"WATCH",reason:"trait evidence is ranking-only until exact exit liquidity clears net-profit gates"}:null}catch(d){return e.includeErrors?{tokenId:u,available:!1,error:String(d.message||d)}:null}})).filter(Boolean).sort((u,d)=>Number(d.stars||0)-Number(u.stars||0)||(BigInt(u.tokenId)<BigInt(d.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-traits",chainId:j,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:l.length,candidates:l,exec:!1,readOnly:!0}}function gg(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function tg(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 yg(e={}){return{maxMarkets:tg(e,"maxMarkets",kn),maxItemsPerMarket:tg(e,"maxItemsPerMarket",kn)}}function bg(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Co(e,t){let n=Number(t?.inventoryTotal??e.inventoryCount??0),r=Number(e.inventoryCount??0),o=Number(t?.inventoryScanned??t?.scanned??0),i=Number.isFinite(o)?Math.min(Math.max(o,0),n):0,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function wg(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(s=>s.complete===!0),a=t.filter(s=>s.complete!==!0).map(s=>({market:s.market,continuation:s.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?a.length?{markets:a}:null:{snapshotEvidenceRequired:!0,...a.length?{markets:a}:{}}:{marketOffset:n}}}async function xg(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=yg(e),o=await rr(e,t),i=bg(o,e,n),a=t.scanCollection||Sa,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Me(i,s,async l=>{let u=gg(e,l.collection);try{let d={...e,...u,market:l.market,collection:l.collection,includeAll:u.includeAll??!u.raritySource};r!=null&&(d.maxItems=r);let p=await a(d,t);return{...l,status:"ok",scan:p,...Co(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Co(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:j,marketCount:i.length,...wg(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 vg(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=yg(e),o=await rr(e,t),i=o.snapshotCoverage?.complete===!0,a=bg(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Zl,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Me(a,l,async d=>{let p=gg(e,d.collection),f=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!f)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Co(d,null)};try{let m={...e,...p,market:d.market,collection:d.collection,slug:f,includeAll:p.includeAll??!p.raritySource};r!=null&&(m.maxItems=r);let h=await c(m,t),b=Co(d,h);return{...d,decision:i&&b.complete&&h.arbCount>0?"ARB":"WATCH",slug:f,scan:h,...b}}catch(m){return{...d,decision:"WATCH",slug:f,reason:String(m.message||m).slice(0,240),...Co(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:j,marketCount:a.length,...wg(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 ng(e,t){return e>t?"ARB":"PASS"}async function GT(e={},t={}){let n=String(e.direction||""),r=Ge(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=D(e.paymentToken,"Anvil payment token"),i={chainId:j,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:lt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||Q0)({chainId:j,tokenIn:We,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:We,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||Kp)({...i,tokenIn:We,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:We,amountOutRaw:r.toString(),amountInWei:String(u.amountIn),source:`uniswap-v4:${u.poolId}`,venue:u.venue||"uniswap-v4",fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks||null,poolId:u.poolId,gasEstimate:u.gasEstimate}}if(n!=="liquidate-exact-input")throw new Error("stonkbrokers: unsupported conversion direction");let s=await(t.up33QuoteExactIn||X0)({chainId:j,tokenIn:o,tokenOut:We,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:We,amountInRaw:r.toString(),amountOutWei:String(s.amountOut),source:`up33:${s.pool}`,venue:s.venue||"up33-v3",tickSpacing:s.tickSpacing,pool:s.pool,quoter:s.quoter,gasEstimate:s.gasEstimate};let c=await(t.uniV4QuoteExactIn||Vr)({...i,tokenIn:o,tokenOut:We,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:We,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 rg(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=D(e.quoteToken,"conversion quote token");if(n!==We)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=Ge(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=Ge(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function KT(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 tr(e){return Array.isArray(e)?`[${e.map(tr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${tr(e[t])}`).join(",")}}`:JSON.stringify(e)}function Sg(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:LT("sha256",n).update(tr(r)).digest("hex")}}function YT(e,t){return Sg(e,t)}function Jl(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=YT(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!ig(a,s))throw new Error("completeness evidence authentication failed");for(let[u,d]of Object.entries(t))if(String(e[u])!==String(d))throw new Error(`completeness evidence ${u} mismatch`);let c=Number(e.quotedAtMs),l=Number(e.expiresAtMs);if(!Number.isFinite(c)||!Number.isFinite(l)||c>n||l<=n||l<=c)throw new Error("completeness evidence is stale or has invalid freshness bounds");if(!String(e.source||"").trim())throw new Error("completeness evidence source is required");return{valid:!0,evidence:e,error:null}}catch(o){return{valid:!1,evidence:null,error:String(o.message||o)}}}function XT(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:KT(e,t)}function Kl(e,t,n,r,o,i){let a=XT(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==j)throw new Error(`${r} evidence chainId mismatch`);if(String(a.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(a.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(a.source||"").trim())throw new Error(`${r} evidence source is required`);if(!i||String(i).length<16)throw new Error(`${r} trusted attestation secret is unavailable`);let s=String(a.mac||"").toLowerCase(),c=Sg(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!ig(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(a.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(a.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(a.blockHash||"").toLowerCase()!==o.blockHash||String(a.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(a.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&D(a.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(a.quotedAtMs),p=Number(a.expiresAtMs);if(!Number.isFinite(d)||!Number.isFinite(p)||d>n||p<=n||p<=d)throw new Error(`${r} evidence is stale or has invalid freshness bounds`);let f=a.amountWei??a.amount??a.gasCostWei??a.gasPriceWei,m=Ge(f,`${r} evidence amountWei`);if(m<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Pt(a.gasLimit,`${r} evidence gasLimit`),b=Pt(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*b!==m)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let x=a.simulation;if(!x||typeof x!="object"||Array.isArray(x))throw new Error(`${r} simulation evidence is required`);if(Number(x.chainId)!==j)throw new Error(`${r} simulation chainId mismatch`);if(String(x.route||"")!==t||String(x.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(x.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(x.blockHash||"").toLowerCase()!==o.blockHash||String(x.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(x.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(D(x.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let g=D(x.sender,`${r} simulation sender`),y=D(x.owner,`${r} simulation owner`);if(!o.owner||g!==o.owner||y!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Ge(x.valueWei,`${r} simulation valueWei`))!==String(Ge(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(x.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&D(x.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(x.success!==!0||x.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(x.result??"")))throw new Error(`${r} simulation did not return a successful result`);let v=Number(x.quotedAtMs),S=Number(x.expiresAtMs);if(!Number.isFinite(v)||!Number.isFinite(S)||v>n||S<=n||S<=v)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:m,evidence:{...a,amountWei:m.toString()},error:null}}catch(s){return{amount:null,evidence:null,error:String(s.message||s)}}}function og(e){let t=D(e,"OpenSea payment token");if(t!==Ql&&t!==We)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Zl(e={},t={}){let n=await Sa(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=D(e.owner,"execution owner")}catch{}let a=(x,w,g,y={})=>({calldataHash:x==null?null:String(x).toLowerCase(),blockNumber:String(w?.blockNumber??""),blockHash:String(w?.blockHash||"").toLowerCase(),leg:g,owner:i,...y}),s=(x,w,g,y,v)=>Kl(e.gasEvidence??e.gasCostEvidence,x,r,`${w} gas`,a(g,y,w,v),o),c=(x,w)=>{let g=null;try{g=D(x?.target,"conversion target")}catch{}let y=a(x?.calldataHash,x,"conversion",{target:g,valueWei:String(x?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(y.calldataHash)||!/^0x[0-9a-f]{64}$/.test(y.blockHash)||!/^\d+$/.test(y.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let v=Kl(e.conversionGasEvidence??e.conversionGasCostEvidence,w,r,"conversion gas",y,o);if(v.amount!=null||x?.gasEstimate==null)return v;let S=Kl(e.gasPriceEvidence,w,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(S.amount==null)return{amount:null,evidence:null,error:S.error};let E=Ge(x.gasEstimate,"conversion gasEstimate");return{amount:E*S.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:w,leg:"conversion",gasEstimate:E.toString(),gasPriceEvidence:S.evidence},error:null}},l=(x,w,g,y,v)=>{try{let S=String(w?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(S))throw new Error("exact Seaport order hash is required");let E=D(w?.protocolAddress,"Seaport protocol address"),I=String(w?.executionCalldataHash||"").toLowerCase(),_=/^0x[0-9a-f]{64}$/.test(I)?I:null,T=y==="seaport-fulfillment"&&v===Ql?String(w?.priceWei??""):"0",C={orderHash:S,protocolAddress:E,target:E,valueWei:T},L=s(x,y,_,g,C);if(L.amount==null)throw new Error(L.error);if(L.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let X=L.evidence?.approvalRequired;if(typeof X!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof w?.approvalRequired=="boolean"&&w.approvalRequired!==X)throw new Error("Seaport approval requirement evidence mismatch");let Q=[L];if(X){let q=String(w?.approvalCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(q)?q:null,z=y==="seaport-offer-acceptance"?n.collection:v;Q.push(s(x,"seaport-approval",B,g,{...C,target:z,valueWei:"0"}))}if(v===Ql){let q=x==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",B=String(w?.prerequisiteCalldataHash||"").toLowerCase(),z=/^0x[0-9a-f]{64}$/.test(B)?B:null,pe=q==="wrap-native-to-weth"?String(w?.sellerNetWei??""):"0";Q.push(s(x,q,z,g,{...C,target:We,valueWei:pe}))}let O=Q.find(q=>q.amount==null);if(O)throw new Error(O.error);return{amount:Q.reduce((q,B)=>q+B.amount,0n),evidence:Q.map(q=>q.evidence),error:null}}catch(S){return{amount:null,evidence:null,error:String(S.message||S)}}},u=Ge(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Ai,p=t.openSeaBestOffer||_i,f=t.paymentTokenConversion||(x=>GT({...x,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),m=await va({market:n.market,collection:n.collection},t),h=[];for(let x of n.candidates){let w=null;try{w=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:x.tokenId},t)}catch{}let g=x.quote,y=Yl(Pe.encodeFunctionData("buySpecificNFT",[BigInt(x.tokenId),BigInt(g.totalCostRaw)])).toLowerCase(),v=s("anvil-to-opensea","anvil-call",y,g.evidence.attestation,{target:n.market,valueWei:g.nativeSwapFeeWei}),S=null,E=null;if(w)try{S=og(w.paymentToken)}catch(B){E=String(B.message||B)}let I=E||!w?{amount:null,evidence:null,error:E||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",w,g.evidence.attestation,"seaport-offer-acceptance",S),_={route:"anvil-to-opensea",tokenId:x.tokenId,stars:x.stars,paymentToken:g.paymentToken,amountUnits:g.amountUnits,anvilTotalCostRaw:g.totalCostRaw,anvilBaseCostRaw:g.baseCostRaw,anvilFeeRaw:g.fees.totalFeeRaw,paymentTokenDecimals:g.paymentTokenDecimals,nativeSwapFeeWei:g.nativeSwapFeeWei,openSeaGrossOfferWei:w?.grossOfferWei==null?null:String(w.grossOfferWei),openSeaSellingValueWei:w?.sellerNetWei==null?null:String(w.sellerNetWei),openSeaFeeWei:w?.feeWei==null?null:String(w.feeWei),openSeaPaymentToken:S,gasCostWei:v.amount==null?null:v.amount.toString(),gasEvidence:v.evidence,marketplaceGasCostWei:I.amount==null?null:I.amount.toString(),marketplaceGasEvidence:I.evidence,conversionGasCostWei:null};if(w?.sellerNetWei==null||!g.available)h.push({..._,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(E)h.push({..._,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${E}`});else if(v.amount==null)h.push({..._,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${v.error}`});else if(I.amount==null)h.push({..._,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${I.error}`});else if(typeof f!="function")h.push({..._,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let B=rg(await f({chainId:j,direction:"acquire-exact-output",amountRaw:g.totalCostRaw,paymentToken:g.paymentToken,quoteToken:We}),{direction:"acquire-exact-output",amountRaw:g.totalCostRaw}),z=c(B,"anvil-to-opensea");if(z.amount==null)h.push({..._,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${z.error}`});else{let pe=v.amount+I.amount+z.amount,ve=BigInt(w.sellerNetWei)-BigInt(B.amountInWei)-BigInt(g.nativeSwapFeeWei)-pe;h.push({..._,conversionGasCostWei:z.amount.toString(),conversionGasEvidence:z.evidence,totalExecutionGasWei:pe.toString(),anvilCostInWethWei:B.amountInWei,conversion:B,netWei:ve.toString(),decision:ng(ve,u),reason:ve>u?"exact inventory, exact conversion, native fee, gas, and exact OpenSea seller net clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(B){h.push({..._,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}let T=null;try{T=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:x.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!T)continue;let C=Yl(Pe.encodeFunctionData("sellNFT",[BigInt(x.tokenId),BigInt(m.netPayoutRaw)])).toLowerCase(),L=s("opensea-to-anvil","anvil-call",C,m.evidence.attestation,{target:n.market,valueWei:m.nativeSwapFeeWei}),X=null,Q=null;try{X=og(T.paymentToken)}catch(B){Q=String(B.message||B)}let O=Q?{amount:null,evidence:null,error:Q}:l("opensea-to-anvil",T,m.evidence.attestation,"seaport-fulfillment",X),q={route:"opensea-to-anvil",tokenId:x.tokenId,stars:x.stars,paymentToken:m.paymentToken,amountUnits:m.amountUnits,openSeaBuyPriceWei:String(T.priceWei),anvilGrossPayoutRaw:m.grossPayoutRaw,anvilNetPayoutRaw:m.netPayoutRaw,anvilFeeRaw:m.fees.totalFeeRaw,paymentTokenDecimals:m.paymentTokenDecimals,nativeSwapFeeWei:m.nativeSwapFeeWei,openSeaPaymentToken:X,gasCostWei:L.amount==null?null:L.amount.toString(),gasEvidence:L.evidence,marketplaceGasCostWei:O.amount==null?null:O.amount.toString(),marketplaceGasEvidence:O.evidence,conversionGasCostWei:null};if(Q){h.push({...q,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${Q}`});continue}if(L.amount==null){h.push({...q,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${L.error}`});continue}if(O.amount==null){h.push({...q,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${O.error}`});continue}if(typeof f!="function"){h.push({...q,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let B=rg(await f({chainId:j,direction:"liquidate-exact-input",amountRaw:m.netPayoutRaw,paymentToken:m.paymentToken,quoteToken:We}),{direction:"liquidate-exact-input",amountRaw:m.netPayoutRaw}),z=c(B,"opensea-to-anvil");if(z.amount==null)h.push({...q,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${z.error}`});else{let pe=L.amount+O.amount+z.amount,ve=BigInt(B.amountOutWei)-BigInt(T.priceWei)-BigInt(m.nativeSwapFeeWei)-pe;h.push({...q,conversionGasCostWei:z.amount.toString(),conversionGasEvidence:z.evidence,totalExecutionGasWei:pe.toString(),anvilPayoutInWethWei:B.amountOutWei,conversion:B,netWei:ve.toString(),decision:ng(ve,u),reason:ve>u?"exact OpenSea listing, exact conversion, native fee, gas, and current Anvil payout clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(B){h.push({...q,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}}let b=n.complete===!0?h:h.map(x=>x.decision==="ARB"?{...x,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:x);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:j,collection:n.collection,market:n.market,slug:String(e.slug||""),gasCostWei:null,conversionGasCostWei:null,gasPriceWei:null,inventoryTotal:n.inventoryTotal,inventoryScanned:n.inventoryScanned,complete:n.complete,truncated:n.truncated,continuation:n.continuation,minNetWei:u.toString(),opportunities:b.sort((x,w)=>{let g=BigInt(x.netWei??"-1"),y=BigInt(w.netWei??"-1");return y>g?1:y<g?-1:0}),arbCount:b.filter(x=>x.decision==="ARB").length,exec:!1,readOnly:!0}}async function ka(e={},t={}){let n=lt(t),r=Nt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,et.ammVault,Z0,"quoteSpecificBuy",[BigInt(r)]),ee(n,et.ammVault,Z0,"inventory",[BigInt(r)]),ee(n,et.nft,tt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:D(a[0],"broker owner")===et.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:j,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:s,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function kg(e,t){try{return D((await ee(t,et.nft,tt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return D((await ee(t,et.nft,tt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Eg(e={},t={}){let n=lt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Me(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Nt(a.brokerTokenId,"brokerTokenId"),c=Nt(a.nestedTokenId,"nestedTokenId"),l=D(a.tba,"TBA"),u=D(a.nestedCollection,"nested collection"),d=hg({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,f,m]=await Promise.all([kg(s,n),ee(n,u,tt,"ownerOf",[BigInt(c)]).then(b=>D(b[0],"nested owner")),ka({brokerTokenId:s},t)]),h=p===l&&f===l&&m.available;return{brokerTokenId:s,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:a.traits||[],available:h,quote:m,decision:"WATCH",reason:h?"rarity is ranking-only until exit-liquidity evidence clears profit gates":"nested custody or parent availability is stale"}})).filter(Boolean).sort((a,s)=>s.stars-a.stars);return{provider:"stonkbrokers",chainId:j,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function Ig(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=D(e.buyer,"buyer"),r=Nt(e.brokerTokenId,"brokerTokenId"),o=Ge(e.maxTokenCostWei,"maxTokenCostWei"),i=Ge(e.maxEthFeeWei,"maxEthFeeWei"),a=await ka({brokerTokenId:r},t);if(!a.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(a.tokenCostWei)>o||BigInt(a.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return N({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:j,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:et.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:a.tokenCostWei,quotedEthFeeWei:a.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function No(e={},t={}){let n=lt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?et.overtimeBooster:et.stockBooster,[i,a,s,c,l,u]=await Promise.all([ee(n,o,Yt,"pendingEth"),ee(n,o,Yt,"minDropWei"),ee(n,o,Yt,"roundActive"),ee(n,o,Yt,"currentRound"),ee(n,o,Yt,"roundState").catch(()=>null),ee(n,o,Yt,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),f=!!s[0],m=!f&&d>=p,h=f;return{provider:"stonkbrokers",chainId:j,which:r,booster:o,pendingWei:d.toString(),minDropWei:p.toString(),roundActive:f,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(b=>D(b,"stock token")):[],canStart:m,canContinue:h,action:h?"continueDrop":m?"startDropPublic":"wait",exec:!1,readOnly:!0}}function Ag(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?et.overtimeBooster:et.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Yt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Yt.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return N({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:j,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:j,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function _g(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>Nt(s,"brokerTokenId")):[],r=lt(t),o=await Me(n,8,async s=>{let[c,l]=await Promise.all([ee(r,et.nft,tt,"ownerOf",[BigInt(s)]).then(u=>D(u[0],"broker owner")),kg(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([No({which:"stock"},t),No({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:j,owner:e.owner?D(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Tg(e={},t={}){try{let n=await rr(e,t);return{ok:!0,chainId:j,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:j,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Cg(e={},t={}){try{let n=await No({which:"stock"},t);return{ok:!0,chainId:j,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:j,error:String(n.message||n).slice(0,180)}}}Z();import{createHash as JT}from"node:crypto";var Ea="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",ZT=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"}]),En=Object.freeze(Object.fromEntries(ZT.map(e=>[e.name,e.selector]))),eC=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),tC=new Set(["name","endpoint","version","skills","domains"]),nC=new Set(["agentId","agentRegistry"]),Pg=new Set(["reputation","crypto-economic","tee-attestation"]),rC=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,oC=64*1024;function Oo(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 eu(e,t,n){for(let r of Object.keys(e)){if(rC.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 or(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 Ng(e,t,{service:n=!1}={}){let r=or(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 tu(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 Ia(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function nu(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 ru(e){let t=Ia(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return tu(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Rg(){let e=[];try{let t=Ia(process.env.ORACLE_ERC8004_CHAIN_ID);ru(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 iC(e){return JSON.parse(JSON.stringify(e))}function Aa(e){let t=Oo(e,"registration file");if(eu(t,eC,"registration"),t.type!==Ea)throw new Error("erc8004: registration-v1 type required");let n={type:Ea,name:or(t.name,"name",128),description:or(t.description,"description",4096),image:Ng(t.image,"image")};if(!Array.isArray(t.services)||t.services.length>32)throw new Error("erc8004: services must be a bounded array");let r=new Set;if(n.services=t.services.map((a,s)=>{let c=Oo(a,`services[${s}]`);eu(c,tC,`services[${s}]`);let l=or(c.name,`services[${s}].name`,64);if(/^(?:x|twitter)$/i.test(l)||/(?:^|\.)x\.com(?:\/|$)|twitter\.com/i.test(String(c.endpoint)))throw new Error("erc8004: X/Twitter services are excluded");let u=l.toLowerCase();if(r.has(u))throw new Error(`erc8004: duplicate service ${l}`);r.add(u);let d={name:l,endpoint:Ng(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=or(c.version,`services[${s}].version`,64));for(let p of["skills","domains"])if(c[p]!=null){if(!Array.isArray(c[p])||c[p].length>64||c[p].some(f=>typeof f!="string"||f.length>128))throw new Error(`erc8004: malformed services[${s}].${p}`);d[p]=[...c[p]]}return d}),typeof t.x402Support!="boolean"||typeof t.active!="boolean")throw new Error("erc8004: x402Support and active must be boolean");if(n.x402Support=t.x402Support,n.active=t.active,!Array.isArray(t.registrations)||t.registrations.length>32)throw new Error("erc8004: registrations must be a bounded array");let o=new Set;if(n.registrations=t.registrations.map((a,s)=>{let c=Oo(a,`registrations[${s}]`);eu(c,nC,`registrations[${s}]`);let l=nu(c.agentId),u=/^eip155:([1-9][0-9]*):(0x[0-9a-fA-F]{40})$/.exec(String(c.agentRegistry||""));if(!u)throw new Error(`erc8004: malformed registrations[${s}].agentRegistry`);let d=`eip155:${Number(u[1])}:${u[2].toLowerCase()}`,p=`${d}:${l}`;if(o.has(p))throw new Error("erc8004: duplicate registration");return o.add(p),{agentId:Number(l),agentRegistry:d}}),t.supportedTrust!=null){if(!Array.isArray(t.supportedTrust)||t.supportedTrust.length>Pg.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!Pg.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>oC)throw new Error("erc8004: registration metadata oversized");return iC(n)}function aC(e){if(Oo(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ea)throw new Error("erc8004: registration-v1 type required");return Aa({type:Ea,...e})}function sC(e){let t=Aa(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Ro(e){return BigInt(e).toString(16).padStart(64,"0")}function Lg(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Ro(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function cC(e){return`${En.register}${Ro(32)}${Lg(e)}`}function lC(e,t){return`${En.setAgentURI}${Ro(e)}${Ro(64)}${Lg(t)}`}function uC(e,t){return`${e}${Ro(t)}`}function dC(e){return JT("sha256").update(e,"utf8").digest("hex")}function ou(e,t){Oo(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 $g(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Ia(e.chainId),c=tu(e.owner,"owner"),l=ru(s),u=Number(t?.nowMs??Date.now());return N({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:dC(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:s,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function Bg(e={},t={}){ou(e,new Set(["chainId","owner","registration"]));let n=sC(aC(e.registration));return $g(e,t,{kind:"erc8004-register",uri:n,selector:En.register,data:cC(n)})}function Mg(e={},t={}){ou(e,new Set(["chainId","owner","agentId","agentURI"]));let n=nu(e.agentId),r=Fg(e.agentURI);return $g(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:En.setAgentURI,data:lC(n,r),id:n})}function Fg(e){let t=or(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 Aa(o),t}function Og(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 tu(`0x${e.slice(-40)}`,t)}function pC(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 Ug(e={},t={}){ou(e,new Set(["chainId","agentId"]));let n=Ia(e.chainId),r=nu(e.agentId),o=ru(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:uC(d,r)},"latest"]),[a,s,c]=await Promise.all([i(En.ownerOf),i(En.tokenURI),i(En.getAgentWallet)]),l=Fg(pC(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Aa(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Og(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Og(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}he();var Dg=999;async function qg(e={}){let t={chainId:Dg,rpc:null,dex:null};try{t.rpc=await Fn(Dg,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Fr("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 Hg(e="HYPE",t={}){let r=(await Fr(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 jg(e,t={}){return un(e,t)}$();Z();var hC="https://api-mainnet.magiceden.dev/v2",Lo=1e9;function zg(e={}){return ze({provider:"magiceden",defaultUrl:hC,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function ar(e={}){return zg(e).baseUrl}function In(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function sr(e={}){let t=In(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},zg(e).trusted)}function iu(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 ir(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 gC(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 yC(e){return Math.round(ir(e,"priceSol")*Lo)}function bC(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 wC({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function xC(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=wC(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Vg(e={}){try{let t=await au({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!In(e),readTier:"keyless",prepareTier:In(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!In(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function au(e={},t={}){let n=iu(e.symbol||e.collection),r=await k(`${ar(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:sr(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/Lo:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Lo:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Lo:null,exec:!1,raw:r}}function Wg(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*Lo):null,tokenSize:e.tokenSize??1}}async function Gg(e={},t={}){let n=iu(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(`${ar(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let a=await k(i.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Wg);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Kg(e={},t={}){let n=de(e.tokenMint||e.mint,"tokenMint"),r=await k(`${ar(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Wg);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Yg(e={},t={}){if(!In(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=de(e.seller,"seller"),o=de(e.tokenMint,"tokenMint"),i=de(e.tokenATA||e.tokenAddress,"tokenATA"),a=de(e.auctionHouse,"auctionHouse"),s=ir(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:ir(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${ar(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",a),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await k(l.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});At("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: buy_now returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return N({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-buy",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,seller:r,tokenMint:o,priceSol:s,maxPriceSol:c,lamports:yC(s),transaction:p,transactionEncoding:"base64",raw:u})}async function _a(e={},t={}){if(!In(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=de(e.seller||e.userPublicKey,"seller"),r=de(e.tokenMint,"tokenMint"),o=de(e.tokenATA||e.tokenAddress,"tokenATA"),i=de(e.auctionHouse,"auctionHouse"),a=ir(e.priceSol??e.price,"priceSol"),s=bC(e.expiry),c=xC(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${ar(t)}/instructions/sell`);l.searchParams.set("seller",n),l.searchParams.set("auctionHouseAddress",i),l.searchParams.set("tokenMint",r),l.searchParams.set("tokenAccount",o),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",de(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await k(l.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});At("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: sell returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return N({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-list",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,seller:n,tokenMint:r,priceSol:a,expiry:s,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function Xg(e={},t={}){if(!In(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=iu(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=ir(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:ir(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${ar(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await k(a.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=gC(s);if(c==null)throw new Error("magiceden: mint price not present in the API response \u2014 refusing to prepare an unverifiable spend");let l=c*i;if(l>o)throw new Error(`magiceden: mint cost ${l} SOL exceeds maxPriceSol cap ${o} SOL`);At("magiceden",s);let u=s?.v0?.tx?.data??s?.tx?.data??null;if(!Array.isArray(u))throw s?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: mint returned no unsigned transaction payload");let d=Buffer.from(u).toString("base64");return N({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-mint",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,symbol:r,nftAmount:i,priceSol:c,totalSol:l,maxPriceSol:o,transaction:d,transactionEncoding:"base64",raw:s})}Z();Bc();$();at();var cr=8,su=10n**BigInt(cr),SC="0xa4b1",Qg=7,cu=1,kC=2n**64n-1n;function EC(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 Bo(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function ur(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 $o(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>cr)throw new Error(`hl-staking: ${t} has more than ${cr} decimals`);let i=BigInt(r)*su+BigInt((o+"0".repeat(cr)).slice(0,cr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>kC)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function lr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Ot(e){let t=BigInt(String(e||"0")),n=t/su,r=(t%su).toString().padStart(cr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Jg(e={}){try{let t=await lu(e);return{ok:t.count>0,provider:"hl-staking",chain:Bo(e),validators:t.count,exec:!1}}catch(t){return{ok:!1,provider:"hl-staking",error:String(t?.message||t).slice(0,160),exec:!1}}}async function lu(e={}){let t=await ce({type:"validatorSummaries"},e),r=(Array.isArray(t)?t:[]).map(o=>({validator:o.validator??null,name:o.name??null,isActive:o.isActive??null,isJailed:o.isJailed??null,commission:o.commission??null,stake:o.stake??null,nRecentBlocks:o.nRecentBlocks??null}));return{provider:"hl-staking",count:r.length,validators:r,exec:!1,raw:t}}async function uu(e={},t={}){let n=ur(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 du(e={},t={}){let n=ur(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 Zg(e={},t={}){let n=ur(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 ey(e={},t={}){let n=ur(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 pu(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 Ta(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||SC)}function IC(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ta(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function mu({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:a,caps:s,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:Bo(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:EC(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:IC(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=ji(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,N(l,{provider:"hl-staking",kind:e})}function ty(e={},t={}){let n=$o(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:$o(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Ot(n)} HYPE exceeds maxHype cap ${Ot(r)} HYPE`);let o=pu(e),i=Bo(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ta(t),wei:lr(n),nonce:o};return mu({kind:"hype-stake-deposit",action:a,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:lr(n),nonce:o},opts:t,args:e,caps:{amountHype:Ot(n),maxHype:r?Ot(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 ny(e={},t={}){let n=$o(e.amountHype??e.amount,"amountHype"),r=pu(e),o=Bo(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ta(t),wei:lr(n),nonce:r};return mu({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:lr(n),nonce:r},opts:t,args:e,caps:{amountHype:Ot(n)},notes:[`Starts the ${Qg} 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 ry(e={},t={}){let n=ur(e.validator,"validator"),r=$o(e.amountHype??e.amount,"amountHype"),o=Object.prototype.hasOwnProperty.call(e,"isUndelegate"),i=Object.prototype.hasOwnProperty.call(e,"undelegate");if(o&&typeof e.isUndelegate!="boolean")throw new Error("hl-staking: isUndelegate must be a boolean");if(i&&typeof e.undelegate!="boolean")throw new Error("hl-staking: undelegate must be a boolean");if(o&&i&&e.isUndelegate!==e.undelegate)throw new Error("hl-staking: isUndelegate and undelegate must match");let a=o?e.isUndelegate:i?e.undelegate:!1,s=e.maxHype==null?null:$o(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${Ot(r)} HYPE exceeds maxHype cap ${Ot(s)} HYPE`);let c=pu(e),l=Bo(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ta(t),validator:n,wei:lr(r),isUndelegate:a,nonce:c};return mu({kind:a?"hype-undelegate":"hype-delegate",action:u,primaryType:"HyperliquidTransaction:TokenDelegate",types:{"HyperliquidTransaction:TokenDelegate":[{name:"hyperliquidChain",type:"string"},{name:"validator",type:"address"},{name:"wei",type:"uint64"},{name:"isUndelegate",type:"bool"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:l,validator:n,wei:lr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:Ot(r),maxHype:s?Ot(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${cu} 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 ${cu} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function oy(e={},t={}){let n=ur(e.user||e.address,"user"),r=await uu({user:n},t),o=await du({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Qg,validatorLockupDays:cu,exec:!1}}at();async function fu(e={}){let t=Date.now();try{let n=await St(e);return{provider:"hl-markets",ok:!0,venue:"hyperliquid",symbols:Object.keys(n||{}).length,latencyMs:Date.now()-t}}catch(n){return{provider:"hl-markets",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}var _C=24*365,TC=8;function Ne(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function CC(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Ca(e={},t={}){let[n,r]=await Promise.all([Qe(t),St(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],s=o.map((c,l)=>{let u=i[l]||{},d=Ne(u.markPx),p=Ne(u.prevDayPx),f=Ne(u.openInterest),m=Ne(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Ne(u.oraclePx),midPx:Ne(u.midPx)??Ne(r?.[c.name]),prevDayPx:p,change24hPct:CC(d,p),dayNtlVolumeUsd:Ne(u.dayNtlVlm),premium:Ne(u.premium),fundingRate:m,fundingRateAprPct:m==null?null:m*(_C/TC)*100,openInterestCoin:f,openInterestUsd:f==null||d==null?null:f*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:s.length,markets:s,totals:{openInterestUsd:s.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:s.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function iy(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Ca(e,t),a=(s,c=-1)=>r.filter(l=>l[s]!=null).sort((l,u)=>(l[s]-u[s])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:a("change24hPct"),losers:a("change24hPct",1),byVolume:a("dayNtlVolumeUsd"),byOpenInterest:a("openInterestUsd"),fundingHighest:a("fundingRateAprPct"),fundingLowest:a("fundingRateAprPct",1)}}async function ay(e={},t={}){let n=String(e.coin||e.symbol||"").trim().toUpperCase();if(!n)throw new Error("hl-markets: coin required");let r=String(e.interval||"1h"),o=Number(e.lookbackMs)||1440*60*1e3,i=Date.now(),a=i-o,[s,c,l]=await Promise.all([Ca({},t),$i({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),jn(n,t).catch(()=>null)]),u=s.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:Ne(h.o),high:Ne(h.h),low:Ne(h.l),close:Ne(h.c),volume:Ne(h.v)})),p=l?.levels??[],f=Ne(p?.[0]?.[0]?.px),m=Ne(p?.[1]?.[0]?.px);return{provider:"hl-info",venue:"hyperliquid",kind:"coin-datapoints",asOfMs:Date.now(),coin:n,market:u,book:{bestBid:f,bestAsk:m,spread:f==null||m==null?null:m-f,spreadBps:f==null||m==null||m===0?null:(m-f)/m*1e4},candles:{interval:r,count:d.length,series:d}}}async function sy(e={},t={}){let n=await Bi(t),r=n?.tokens??[],o=n?.universe??[];return{provider:"hl-info",venue:"hyperliquid",kind:"spot-datapoints",asOfMs:Date.now(),tokenCount:r.length,pairCount:o.length,tokens:r.map(i=>({name:i.name,index:i.index,szDecimals:i.szDecimals??null,weiDecimals:i.weiDecimals??null,tokenId:i.tokenId??null,isCanonical:!!i.isCanonical})),pairs:o.map(i=>({name:i.name,index:i.index,tokens:i.tokens,isCanonical:!!i.isCanonical}))}}import{mkdirSync as KC,readFileSync as YC,readdirSync as XC,renameSync as QC,writeFileSync as JC}from"node:fs";import{homedir as ZC}from"node:os";import{join as Ra}from"node:path";var Mo=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});$();he();Z();import{Interface as hu,getAddress as fy,isAddress as NC}from"ethers";var cy=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),ly=Object.freeze({42161:{name:"arbitrum",api:cy[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:cy[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),uy="0x0000000000000000000000000000000000000000",OC=`0x${"0".repeat(64)}`,dy=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),py=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Pa=new hu(["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"]),hy=new hu(["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)"]),RC=new hu(["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)"]),LC=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function pr(e){let t=Number(e??42161),n=ly[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(ly).join(", ")})`);return{chainId:t,...n}}function Na(e,t={}){let n=pr(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function nt(e,t){if(!NC(e))throw new Error(`${t} must be a valid EVM address`);return fy(e)}function ne(e){return fy(e).toLowerCase()}function dr(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 An(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 $C(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 BC(e){let t=String(e||"marketIncrease").trim();if(!(t in dy))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:dy[t]}}function MC(e){let t=String(e||"noSwap").trim();if(!(t in py))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:py[t]}}function FC(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function UC(e,t){let n=ne(t);return e.find(r=>ne(r.marketToken||r.market||r.address)===n)||null}function DC(e,t){let n=ne(t);return e.find(r=>ne(r.tokenAddress||r.address)===n)||null}function qC({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=dr(e?.minPrice,"gmx minPrice"),i=dr(e?.maxPrice,"gmx maxPrice"),a=BigInt(r),s=10000n;return n==="marketIncrease"?(t?i*(s+a)/s:o*(s-a)/s).toString():(t?o*(s-a)/s:i*(s+a)/s).toString()}function HC(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function jC(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function yt(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 zC(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:yt(t,"account",a=>ne(a)),market:yt(t,"market",a=>ne(a)),initialCollateralToken:yt(t,"initialCollateralToken",a=>ne(a)),key:yt(o,"key",a=>String(a).toLowerCase()),reason:yt(i,"reason",a=>String(a)),sizeDeltaUsd:yt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:yt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:yt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:yt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:yt(r,"isLong",a=>!!a)}}function VC(e={},t){if(ne(e.address)!==ne(t.eventEmitter))return null;let n;try{n=RC.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=LC[r];if(!o)return null;let i=zC(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||jC(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?ne(s):null,market:i.market,initialCollateralToken:i.initialCollateralToken,sizeDeltaUsd:i.sizeDeltaUsd,initialCollateralDeltaAmount:i.initialCollateralDeltaAmount,executionFee:i.executionFee,acceptablePrice:i.acceptablePrice,isLong:i.isLong,reason:i.reason,logIndex:e.logIndex==null?null:Number.parseInt(String(e.logIndex),16)}}function my(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function WC(e=[],{chainId:t}={}){let n=pr(t);return(Array.isArray(e)?e:[]).map(r=>VC(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function gy(e={},t={}){return k(`${Na(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function gu(e={},t={}){return k(`${Na(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yy(e={},t={}){return k(`${Na(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function mr(e={},t={}){return k(`${Na(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function by(e={}){let t=await mr({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function wy(e={},t={}){let n=pr(e.chainId??42161),r=nt(e.account||e.owner||e.user,"gmx account"),o=An(e.start??0,"gmx start"),i=An(e.end??e.limit??20,"gmx end"),a=hy.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),account:ne(r),raw:c}}async function xy(e={},t={}){let n=pr(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=hy.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),key:r,raw:a}}async function vy(e={},t={}){let n=pr(e.chainId??42161),r=t.receipt||await Mr({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=WC(r.logs||[],{chainId:n.chainId}),a=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,s=a?i.filter(u=>u.orderKey===a):i;if(s.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:a?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=s.reduce((u,d)=>my(d.status)>=my(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?ne(e.expectedAccount||e.account):null;return l&&c.account!==l?{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,reason:`account mismatch: expected ${l}, got ${c.account||"null"}`,orderKey:c.orderKey,account:c.account,events:i,receipt:r}:{ok:!0,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,orderKey:c.orderKey,account:c.account,market:c.market,eventEmitter:ne(n.eventEmitter),events:s,receipt:r}}async function Sy(e={},t={}){let n=pr(e.chainId??42161),r=BC(e.orderType||e.type),o=MC(e.decreasePositionSwapType),i=nt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=nt(e.receiver||i,"gmx receiver"),s=nt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?nt(e.callbackContract,"gmx callbackContract"):uy,l=e.uiFeeReceiver?nt(e.uiFeeReceiver,"gmx uiFeeReceiver"):uy,u=nt(e.market||e.marketToken,"gmx market"),d=nt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?dr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):An(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),f=dr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),m=dr(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(m>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let b=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(f>b)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let x=$C(e.maxSlippageBps??e.slippageBps,50),w=e.isLong==null?!0:!!e.isLong,[g,y]=await Promise.all([gu({chainId:n.chainId},t),mr({chainId:n.chainId},t)]),v=UC(FC(g,"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 S=nt(v.indexToken,"gmx market indexToken"),E=nt(v.longToken,"gmx market longToken"),I=nt(v.shortToken,"gmx market shortToken"),_=ne(d);if(![ne(E),ne(I)].includes(_))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let T=HC(v,w);if(T>0n&&f>T)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let C=DC(y,S);if(!C)throw new Error("gmx index ticker not found");let L=e.acceptablePrice?dr(e.acceptablePrice,"gmx acceptablePrice").toString():qC({ticker:C,isLong:w,typeKey:r.key,maxSlippageBps:x}),X=(e.swapPath||[]).map(me=>nt(me,"gmx swapPath market"));if(X.length>3)throw new Error("gmx swapPath too long for guarded slice");let Q=An(e.triggerPrice??"0","gmx triggerPrice"),O=An(e.callbackGasLimit??"0","gmx callbackGasLimit"),q=An(e.minOutputAmount??"0","gmx minOutputAmount"),B=An(e.validFromTime??"0","gmx validFromTime"),z=!!e.shouldUnwrapNativeToken,pe=e.autoCancel==null?!0:!!e.autoCancel,ve=String(e.referralCode||OC);if(!/^0x[0-9a-fA-F]{64}$/.test(ve))throw new Error("gmx referralCode must be bytes32 hex");let xt=Array.isArray(e.dataList)?e.dataList:[];for(let me of xt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(me)))throw new Error("gmx dataList entries must be bytes32 hex");let $t={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:X},numbers:{sizeDeltaUsd:f,initialCollateralDeltaAmount:p,triggerPrice:Q,acceptablePrice:BigInt(L),executionFee:m,callbackGasLimit:O,minOutputAmount:q,validFromTime:B},orderType:r.code,decreasePositionSwapType:o.code,isLong:w,shouldUnwrapNativeToken:z,autoCancel:pe,referralCode:ve,dataList:xt},R=[];r.key==="marketIncrease"&&p>0n&&R.push(Pa.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(Pa.encodeFunctionData("sendWnt",[n.orderVault,m])),R.push(Pa.encodeFunctionData("createOrder",[$t]));let F=Pa.encodeFunctionData("multicall",[R]),J={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:ne(i),receiver:ne(a),exchangeRouter:ne(n.exchangeRouter),router:ne(n.router),orderVault:ne(n.orderVault),market:ne(u),indexToken:ne(S),initialCollateralToken:ne(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:f.toString(),executionFee:m.toString(),acceptablePrice:L,maxSlippageBps:x,isLong:w,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return N({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:ne(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:ne(d),spender:ne(n.router),amount:p.toString()}:null,gmxGuard:J,transaction:{chainId:n.chainId,from:ne(i),to:ne(n.exchangeRouter),data:F,value:m.toString(),gmxGuard:J}},{provider:"gmx",kind:"gmx-order"})}at();var Xt="oracle.hl.entry-state.v1",eP=8,tP=24*365;function le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function fr(e){return e==null||e===0?0:e>0?1:-1}function Fo(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function nP(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Ra(ZC(),".config","oracle")}function Iy(e={}){return Ra(nP(e),"hl-entry-states")}function Oa(e,t,n){return n==null&&e.push(t),n}function rP(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(a=>String(a?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function Rt(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function oP(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:le(a.time),rate:le(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return Rt("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)fr(o[a].rate)!==fr(o[a-1].rate)&&(i+=1);return{source:"hl-info.fundingHistory",asOfMs:n??o[o.length-1].t,unknown:!1,coin:t||null,samples:o.length,firstRate:o[0].rate,lastRate:o[o.length-1].rate,signFlips:i,windowMs:o[o.length-1].t-o[0].t}}function iP(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return Rt("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=le(a.peggedUSD??a.usd??i.circulatingPrevDay?.peggedUSD);s!=null&&(r+=s,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:Rt("defillama.stablecoins","no peggedUSD")}function ky(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 aP(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),a=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],s=o.find(p=>a.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!s)return Rt("gmx.tickers","no matching symbol");let c=ky(s.minPrice,n),l=ky(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return Rt("gmx.tickers","unreadable price");let d=n!=null&&n>0?Fo(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?Rt("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(s.tokenSymbol||s.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function sP({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?Rt("hl-info.fundingHistory","not fetched"):oP(r,{coin:e,asOfMs:n}),llamaStables:o==null?Rt("defillama.stablecoins","not fetched"):iP(o,n),gmxTicker:i==null?Rt("gmx.tickers","not fetched"):aP(i,{coin:e,hlMark:t,asOfMs:n})}}function Ey(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=le(s?.px),l=le(s?.sz);if(c==null||l==null||c<=0||l<=0)continue;let u=c*l,d=Math.min(u,Math.max(0,t-o));if(d<=0||(i+=d/c,o+=d,o>=t))break}let a=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:a}}function cP(e,t){if(!e)return{present:!1,unknown:["userState"]};let n=String(t).toUpperCase(),i=(e.assetPositions||e.clearinghouseState?.assetPositions||[]).find(m=>String(m?.position?.coin||"").toUpperCase()===n)?.position;if(!i)return{present:!1,unknown:[]};let a=le(i.szi),s=le(i.positionValue)!=null&&a?Math.abs(le(i.positionValue)/a):null,c=le(i.entryPx),l=le(i.liquidationPx),u=a==null?null:a>0?"long":a<0?"short":null,d=null,p=s??c;l!=null&&p!=null&&p!==0&&u==="long"?d=(p-l)/p*100:l!=null&&p!=null&&p!==0&&u==="short"&&(d=(l-p)/p*100);let f=[];return a==null&&f.push("position.szi"),c==null&&f.push("position.entryPx"),l==null&&f.push("position.liquidationPx"),d==null&&f.push("position.liqDistancePct"),{present:!0,side:u,szi:a,entryPx:c,liquidationPx:l,leverage:le(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:f}}function lP({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:a=Date.now(),fundingHistory:s=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:Xt,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=rP(n,e);if(!d)return{schema:Xt,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:f}=d,m=Oa(u,"markPx",le(f.markPx)),h=Oa(u,"oraclePx",le(f.oraclePx)),b=le(f.midPx),x=le(f.premium),w=Oa(u,"fundingRate",le(f.funding)),g=Oa(u,"openInterestCoin",le(f.openInterest)),y=le(f.dayNtlVlm),v=Array.isArray(f.impactPxs)?f.impactPxs:[],S=le(v[0]),E=le(v[1]),I=w==null?null:w*(tP/eP)*100,_=g==null||m==null?null:g*m,T=i==null||i===0||g==null?null:(g-i)/i*100;T==null&&u.push("oiDeltaPct");let C=r?.levels,L=Array.isArray(C)?C[0]:[],X=Array.isArray(C)?C[1]:[],Q=le(L?.[0]?.px),O=le(X?.[0]?.px);Q==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let q=Ey(X,Number(t)||0,"buy"),B=Ey(L,Number(t)||0,"sell");q.fillable||u.push("book.buyFillable"),B.fillable||u.push("book.sellFillable");let z=b??m,pe=q.avgFillPx==null||z==null?null:Fo(q.avgFillPx,z),ve=B.avgFillPx==null||z==null?null:Fo(z,B.avgFillPx),xt=cP(o,e);for(let J of xt.unknown||[])u.push(J);let $t=le(f.prevDayPx),R=m==null||$t==null||$t===0?null:(m-$t)/$t*100;R==null&&u.push("change24hPct");let F=sP({coin:String(p.name),hlMark:m,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return F.fundingPath.unknown&&u.push("overlays.fundingPath"),F.llamaStables.unknown&&u.push("overlays.llamaStables"),F.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Xt,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:m,oraclePx:h,midPx:b,premium:x,markOracleBps:Fo(m,h),fundingRate:w,fundingAprPct:I,openInterestCoin:g,openInterestUsd:_,oiDeltaPct:T,dayNtlVolumeUsd:y,change24hPct:R,impactBidPx:S,impactAskPx:E,maxLeverage:p.maxLeverage??null,book:{bidPx:Q,askPx:O,spreadBps:Q==null||O==null?null:Fo(O,Q),notionalUsd:Number(t)||0,buy:q,sell:B,buySlipBps:pe,sellSlipBps:ve},position:xt,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function Ay(e,t){let n=String(t||"").toLowerCase();if(n!=="long"&&n!=="short")return{side:null,verdict:"no",factors:[{key:"side",status:"unverifiable",note:"side must be long or short"}]};if(!e?.coin||e.verdict==="no")return{side:n,verdict:"no",factors:[{key:"market",status:"unverifiable",note:"no live market"}]};let r=[],o=e.fundingRate;o==null?r.push({key:"funding",status:"unverifiable",note:"fundingRate unknown"}):n==="long"?r.push({key:"funding",status:o>0?"counter":(o<0,"aligned"),note:o>0?"longs pay":"shorts pay / flat",fundingAprPct:e.fundingAprPct}):r.push({key:"funding",status:o<0?"counter":"aligned",note:o<0?"shorts pay":"longs pay / flat",fundingAprPct:e.fundingAprPct});let i=e.premium??(e.markOracleBps==null?null:e.markOracleBps/1e4);i==null?r.push({key:"premium",status:"unverifiable",note:"mark vs oracle unknown"}):n==="long"?r.push({key:"premium",status:i>0?"counter":"aligned",note:i>0?"mark rich to oracle":"mark cheap / flat"}):r.push({key:"premium",status:i<0?"counter":"aligned",note:i<0?"mark cheap to oracle":"mark rich / flat"});let a=n==="long"?e.book?.buy:e.book?.sell;if(!a)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!a.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${a.requestedNotionalUsd} usd`});else{let m=n==="long"?e.book.buySlipBps:e.book.sellSlipBps;r.push({key:"book",status:m!=null&&m>20?"counter":"aligned",note:m==null?"fillable, slip unknown":`slip ${m.toFixed(1)} bps`})}let s=e.position?.liqDistancePct;e.position?.present?s==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:s<5?"counter":"aligned",note:`${s.toFixed(2)}% to liq`}):r.push({key:"liqDistancePct",status:"unverifiable",note:"no position / no user"}),e.oiDeltaPct==null&&r.push({key:"oiDeltaPct",status:"unverifiable",note:"no prior OI \u2014 HL /info has no 24h OI"});let c=e.overlays?.fundingPath;!c||c.unknown?r.push({key:"fundingPath",status:"unverifiable",note:c?.reason||"funding history unknown"}):r.push({key:"fundingPath",status:c.signFlips>0?"unverifiable":"aligned",note:c.signFlips>0?`${c.signFlips} funding sign flip(s) in window`:`carry stable n=${c.samples}`});let l=e.overlays?.gmxTicker;!l||l.unknown?r.push({key:"gmxBasis",status:"unverifiable",note:l?.reason||"gmx ticker unknown"}):l.basisBps!=null&&Math.abs(l.basisBps)>80?r.push({key:"gmxBasis",status:"counter",note:`HL vs GMX ${l.basisBps.toFixed(1)} bps`}):r.push({key:"gmxBasis",status:"aligned",note:l.basisBps==null?"gmx print, no HL mark":`HL vs GMX ${l.basisBps.toFixed(1)} bps`});let u=r.some(m=>m.key==="book"&&m.status==="counter"&&/cannot fill/.test(m.note)),d=r.some(m=>m.status==="counter"),p=r.some(m=>m.status==="unverifiable");return{side:n,verdict:u?"no":d||p?"wait":"go",factors:r,seeUnknown:e.unknown||[]}}function uP(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 dP({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Xt||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=uP(n),a=Ay(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Xt,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Mo.ALERT_ONLY},c=Iy({...o,configDir:r||o.configDir});KC(c,{recursive:!0,mode:448});let l=Ra(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return JC(u,`${JSON.stringify(s,null,2)}
|
|
146
|
-
`,{mode:384}),QC(u,l),s}function yu(e={}){let t=Iy(e),n=[];try{n=XC(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(YC(Ra(t,r),"utf8")))}function pP(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Mo.ALERT_ONLY};let r=e.see,o=t;fr(r.fundingRate)!==fr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),fr(r.premium)!==fr(o.premium)&&r.premium!=null&&o.premium!=null&&n.push({key:"premiumSign",level:"hold",from:r.premium,to:o.premium});let i=r.position?.liqDistancePct,a=o.position?.liqDistancePct;i!=null&&a!=null&&(a<5||a<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:a});let s=e.side,c=s==="long"?r.book?.buy:r.book?.sell,l=s==="long"?o.book?.buy:o.book?.sell;c?.fillable&&l&&!l.fillable&&n.push({key:"bookFillable",level:"thesis-broke",from:!0,to:!1});let u=o.oiDeltaPct;return u!=null&&Math.abs(u)>=15&&n.push({key:"oiDeltaPct",level:"hold",from:0,to:u}),{schema:Xt,id:e.id,coin:e.see.coin,side:e.side,actionMode:Mo.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function _y(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await Qe(e))?.[0]?.universe?.length,venue:"hyperliquid",latencyMs:Date.now()-t}}catch(n){return{provider:"hl-entry-state",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}async function Uo(e={},t={}){let n=e.coin,r=le(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([Qe(t),n?jn(n,t).catch(()=>null):Promise.resolve(null),e.user?zn(e.user,t).catch(()=>null):Promise.resolve(null),n?Dm({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),aa({},t).catch(()=>null),mr({chainId:42161},t).catch(()=>null)]);return lP({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function Ty(e={},t={}){let n=e.see&&e.see.schema===Xt?e.see:await Uo(e,t);return{see:n,...Ay(n,e.side)}}async function Cy(e={},t={}){let n=e.see&&e.see.schema===Xt?e.see:await Uo(e,t);return dP({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function Py(e={},t={}){let n=e.locked||yu(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Mo.ALERT_ONLY};let r=await Uo({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return pP(n,r)}at();Hi();Ki();async function Ny(e={}){let t=await eo(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Oy(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ut(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=Ly(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=bu(i)));let a=n==null?null:Dt(n);if(n!=null&&!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??a?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await eo(t))?.outcomes||[]).find(m=>{try{return Ut(m.outcome,0).outcome===l}catch{return!1}}),p=Array.isArray(d?.sideSpecs)?d.sideSpecs.findIndex(m=>m?.name===e.sideName):-1;if(p<0)throw new Error("hl-outcome: unknown sideName for outcome");let f=bu(p);if(i!=null&&i!==f)throw new Error("hl-outcome: sideName does not match outcome side");if(a&&a.side!==f)throw new Error("hl-outcome: sideName does not match outcome coin side");i=f}if(!n){if(r==null||i==null)throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");n=Ut(r,i).coin}if(a=Dt(n),!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&a.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&a.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let s=e.orderSide??o??(typeof e.isBuy=="boolean"?null:"buy"),c={...e,coin:n,outcome:void 0,outcomeSide:i};return delete c.orderSide,delete c.sideName,s==null?delete c.side:c.side=s,Kn(c,t)}async function Ry(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ut(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=Ly(e.outcomeSide):(o=e.side,o!=null&&(o=bu(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Ut(r,o).coin}let i=Dt(n);if(!i)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&i.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(o!=null&&i.side!==o)throw new Error("hl-outcome: coin does not match outcome side");let a={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete a.side,lo(a,t)}function Ly(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function bu(e){if(e===0||e===1)return e;if(typeof e=="string"){let t=e.trim().toLowerCase();if(t==="0"||t==="yes")return 0;if(t==="1"||t==="no")return 1}throw new Error("hl-outcome: outcome side must be 0, 1, yes, or no")}Z();Vn();var XF="0x"+"00".repeat(32);function hP(e){let t=typeof e=="bigint"?e:Ze(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 $y(e,t){let n=Ze(e.makerAmount,"poly: makerAmount"),r=Ze(e.takerAmount,"poly: takerAmount");return hP(t==="BUY"?n:r)}Vn();var gP=new Set(["https://clob.polymarket.com/order"]),Do=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),e5=Object.freeze(Do.map(e=>e[0])),yP=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),bP="0xe111180000d2663c0091e4f400237545b87b996b",wP="0xe2222d279d744050d28e00520010520000310f59",By=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function My(e){let t=String(e||"").replace(/\/$/,"");if(!gP.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Fy(e){let t=Je(e,"poly: exchange").toLowerCase();if(!yP.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Uy(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=By(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(Je(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(My(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(Fy(o.verifyingContract),Fy(n.exchange),Je(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==Je(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?wP:bP;if(Je(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==Do.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let E=0;E<Do.length;E+=1)if(s[E]?.name!==Do[E][0]||s[E]?.type!==Do[E][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(Je(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(Je(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=By(n.tokenId,"tokenId",80);if(Je(a.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=Ze(a.makerAmount,"poly: makerAmount"),f=Ze(a.takerAmount,"poly: takerAmount"),m=Ze(n.makerAmount,"poly: prepared makerAmount"),h=Ze(n.takerAmount,"poly: prepared takerAmount");if(p!==m)throw new Error("poly: signed makerAmount differs from prepared envelope");if(f!==h)throw new Error("poly: signed takerAmount differs from prepared envelope");let b=d==="BUY"?p:f,x=d==="BUY"?f:p,w=Se(n.quantity,6,"poly: quantity");if(w<=0n||w!==x)throw new Error("poly: quantity must match CLOB v2 amounts");let g=Se(n.price,6,"poly: price");if(g<=0n||g>=1000000n)throw new Error("poly: price must be within (0,1)");if(x*g!==b*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(Se(n.notionalUsdc,6,"poly: notionalUsdc")!==b)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=$y(a,d);if(Se(v,6,"poly: displayed notionalUsdc")!==b)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let S=t.maxNotionalUsd??t.maxNotionalUsdc;if(S!=null){let E=Se(S,6,"poly: maxNotionalUsd");if(b>E)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:b.toString(),notional:b.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:f.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:v,submitTo:My(n.submitTo)})}function xP(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 Dy(e,t={},n={}){if(String(e?.kind)!=="poly-order")throw new Error("poly: prepared kind is not a local-signer surface");if(!e?.domain||!e?.types||!e?.value)throw new Error("poly: prepared EIP-712 order required");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a={version:1,surface:"poly",action:"order",owner:xP({...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 Uy(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as s5,randomInt as vP}from"node:crypto";import{keccak256 as l5,concat as u5,zeroPadValue as d5,getCreate2Address as p5,AbiCoder as m5}from"ethers";var Vy=137;var SP="0xE111180000d2663C0091e4f400237545B87B996B",kP="0xe2222d279d744050d28e00520010520000310F59",qy="0x0000000000000000000000000000000000000000000000000000000000000000",wu=6;var EP={name:"Polymarket CTF Exchange",version:"2",chainId:Vy},IP={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"}]},Hy={"0.1":{price:1,size:2,amount:3},"0.01":{price:2,size:2,amount:4},"0.001":{price:3,size:2,amount:5},"0.0001":{price:4,size:2,amount:6}};function La(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function $a(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function jy(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Wy(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function AP(e,t,n,r){let o=Wy(Number(n),r.price);if(e==="BUY"){let c=$a(Number(t),r.size),l=c*o;return La(l)>r.amount&&(l=jy(l,r.amount+4),La(l)>r.amount&&(l=$a(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=$a(Number(t),r.size),s=a*o;return La(s)>r.amount&&(s=jy(s,r.amount+4),La(s)>r.amount&&(s=$a(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function zy(e){let t=Number(e).toFixed(wu),[n,r=""]=t.split(".");return(n+r.padEnd(wu,"0").slice(0,wu)).replace(/^0+/,"")||"0"}function _P(e={}){if(Object.prototype.hasOwnProperty.call(e,"negRisk")&&typeof e.negRisk!="boolean")throw new Error("negRisk must be a boolean");let{tokenId:t,side:n,price:r,size:o,maker:i,signer:a,negRisk:s=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=qy,builder:p=qy}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!a)throw new Error("maker and signer required");let f=Number(r),m=Number(o);if(!(f>0&&f<1))throw new Error(`price out of (0,1): ${r}`);if(!(m>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=Hy[String(c)]||Hy["0.01"],b=Wy(f,h.price),{rawMakerAmt:x,rawTakerAmt:w}=AP(n,m,b,h),g=zy(x),y=zy(w),v=String(vP(1,2**31-1)),S=Date.now().toString(),E=n==="BUY"?0:1,I=s?kP:SP,_={salt:v,maker:i,signer:a,tokenId:String(t),makerAmount:g,takerAmount:y,side:E,signatureType:u,timestamp:S,metadata:d,builder:p},T={...EP,verifyingContract:I},C=n==="BUY"?x:w;return{domain:T,types:IP,value:_,orderType:l,side:n,price:String(b),quantity:String(n==="BUY"?w:x),notionalUsdc:C,exchange:I,negRisk:s}}function Gy(){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 Ky(e={},t={}){let n=_P(e),r={provider:"poly-clob",kind:"poly-order",chainId:Vy,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=Dy(r,e,t)}catch{r.oraclePrepared=!1}return N(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as FP,keccak256 as ob}from"ethers";Z();Ha();Fa();var UP=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function DP(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Tt(e);for(let o of Object.keys(n))if(!UP.has(o))throw new Error(`prepareTemplateDeploy: unsupported field "${o}" in localForkSimulationReceipt`);if(n.status!=="success"&&n.status!=="reverted")throw new Error('prepareTemplateDeploy: simulation status must be "success" or "reverted"');let r={status:n.status};if(n.chainId!==void 0){let o=Number(n.chainId);if(!Number.isSafeInteger(o)||o!==t)throw new Error("prepareTemplateDeploy: simulation chainId must match deployment chainId");r.chainId=o}if(n.forkBlockNumber!==void 0){let o=Number(n.forkBlockNumber);if(!Number.isSafeInteger(o)||o<0)throw new Error("prepareTemplateDeploy: simulation forkBlockNumber must be a nonnegative safe integer");r.forkBlockNumber=o}if(n.gasUsed!==void 0){let o=String(n.gasUsed);if(!/^(0|[1-9][0-9]*)$/.test(o))throw new Error("prepareTemplateDeploy: simulation gasUsed must be a nonnegative integer");r.gasUsed=o}if(n.transactionHash!==void 0){if(!/^0x[0-9a-fA-F]{64}$/.test(n.transactionHash))throw new Error("prepareTemplateDeploy: simulation transactionHash must be bytes32 hex");r.transactionHash=n.transactionHash}if(n.contractAddress!==void 0){if(!/^0x[0-9a-fA-F]{40}$/.test(n.contractAddress))throw new Error("prepareTemplateDeploy: simulation contractAddress must be an EVM address");r.contractAddress=n.contractAddress}if(n.revertReason!==void 0){if(typeof n.revertReason!="string"||n.revertReason.length>500)throw new Error("prepareTemplateDeploy: simulation revertReason must be at most 500 characters");r.revertReason=n.revertReason}return r}async function ib(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=Jy(n,o),a=rb(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!a.bytecode||a.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let s=a.bytecode.startsWith("0x")?a.bytecode:`0x${a.bytecode}`,u=(await new FP(a.abi,s).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...DP(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},f={chainId:r,to:null,data:u,value:"0x0"};return N({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:a.contractName,template:i,chainId:r,transaction:f,unsignedDeployEnvelope:{transaction:f,signed:!1,broadcast:!1},abi:a.abi,sourceHash:a.gate.sourceHash,bytecodeHash:ob(s),authorityReport:Zy(i),simulationReceipt:p,verificationManifest:{contractName:a.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:a.gate.sourceHash,creationBytecodeHash:ob(s),constructorData:`0x${u.slice(s.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${a.contractName}`},monitoringPlan:{activation:"after user-signed deployment confirmation",enabled:!1,events:[...i.monitor],checks:["deployment bytecode matches verification manifest","authority changes","contract balance and release/withdraw events"]},gate:{forgeBuild:a.gate.forgeBuild,forgeTests:a.gate.forgeTests,staticAnalysis:{tool:a.gate.staticAnalysis.tool,ok:a.gate.staticAnalysis.ok,skipped:a.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:Da},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,deploymentActivated:!1,note:"Unsigned deploy. User wallet signs. Template tests passed; not a firm audit."},{provider:"protocol-templates",kind:"template-deploy"})}Ha();_u();Ki();$();var JP="https://api.geckoterminal.com/api/v2",Va=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||JP).replace(/\/$/,""),gr=e=>encodeURIComponent(String(e));async function Tu(e={},t={}){let n=Math.max(1,Number(e.page||1));return k(`${Va(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function mb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return k(`${Va(t)}/networks/${gr(e.network)}/pools/${gr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function fb(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return k(`${Va(t)}/networks/${gr(e.network)}/tokens/${gr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function hb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),k(`${Va(t)}/networks/${gr(e.network)}/pools/${gr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function gb(e={}){let t=await Tu({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}$();he();import{Interface as xb,getAddress as vb,isAddress as eN}from"ethers";Z();var tN="https://api.curve.finance/v1",Sb=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||tN).replace(/\/$/,""),nN=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),kb="0x0000000000000000000000000000000000000000",Cu=new xb(["function get_dy(address[11] route,uint256[5][5] swap_params,uint256 amount,address[5] pools) view returns (uint256)","function exchange(address[11] route,uint256[5][5] swap_params,uint256 amount,uint256 expected,address[5] pools,address receiver) payable returns (uint256)"]),yb=new xb(["function coins(uint256) view returns (address)"]);function Eb(e){let t=nN[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Ko(e,t){if(!eN(e))throw new Error(`${t} must be a valid EVM address`);return vb(e)}function rN(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 bb(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function Ib(e,t,n){return[e,t,n,...Array(8).fill(kb)]}function Ab(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function _b(e){return[e,...Array(4).fill(kb)]}async function oN({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=yb.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=yb.decodeFunctionResult("coins",c);i.push(vb(l[0]))}return i}function wb(e,t,n){let r=t.toLowerCase(),o=e.findIndex(i=>i.toLowerCase()===r);if(o<0)throw new Error(`Curve pool does not contain ${n}`);return o}async function Tb(e={}){return k(`${Sb(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Pu(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return k(`${Sb(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Cb(e={}){let t=await Pu({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Nu(e={},t={}){let n=Number(e.chainId??8453),r=Eb(n),o=Ko(e.pool,"curve pool"),i=Ko(e.tokenIn,"curve tokenIn"),a=Ko(e.tokenOut,"curve tokenOut"),s=rN(e.amountIn,"curve amountIn"),c=bb(e.nCoins??2,"curve nCoins",2,8),l=bb(e.poolType,"curve poolType",1,4),u=t.rpcCall||U,d=await oN({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=wb(d,i,"tokenIn"),f=wb(d,a,"tokenOut");if(p===f)throw new Error("Curve token indexes must differ");let m=Ib(i,o,a),h=Ab(p,f,l,c),b=_b(o),x=Cu.encodeFunctionData("get_dy",[m,h,s,b]),w=await u(n,"eth_call",[{to:r,data:x},e.blockTag||"latest"],t),g=Cu.decodeFunctionResult("get_dy",w),y=BigInt(g[0]);if(y<=0n)throw new Error("curve quote returned zero output");return re({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:y.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:f,route:m,swapParams:h.map(v=>v.map(S=>S.toString())),pools:b},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Pb(e={},t={}){let n=Number(e.chainId??8453),r=Eb(n),o=Ko(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Ko(e.receiver||e.recipient||o,"curve receiver"),a=await Nu({...e,sender:o},t),s=Ib(a.tokenIn,a.pool,a.tokenOut),c=Ab(a.i,a.j,a.poolType,a.nCoins),l=_b(a.pool),u=Cu.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return N({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,autoSlippage:a.autoSlippage,requiresApproval:{token:a.tokenIn,spender:r,amount:a.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:fe(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}$();he();Z();import{Interface as aN,getAddress as sN,isAddress as cN,keccak256 as Nb,toUtf8Bytes as Ob}from"ethers";var lN="https://api.morpho.org/graphql",Wa=new aN(["function asset() view returns (address)","function maxDeposit(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256)"]),uN=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||lN;async function Ru(e,t,n={}){return k(uN(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var dN="query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }",pN="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function Yo(e,t){let n=String(e||"").trim();if(!cN(n))throw new Error(`morpho: ${t} must be an address`);return sN(n).toLowerCase()}function mN(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`morpho: ${t} must be a positive integer string`)}}function Ou(e){return Array.isArray(e)?`[${e.map(Ou).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ou(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Xo(e,t,n,r,o={}){let i=Wa.encodeFunctionData(n,r),s=await(o.rpcCall||U)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Wa.decodeFunctionResult(n,s)}function fN(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Rb(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ru(dN,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Lu(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ru(pN,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Lb(e={}){return{ok:(await Ru("query { __typename }",{},e))?.data?.__typename==="Query"}}async function $b(e={},t={}){let n=Number(e.chainId??8453),r=String(e.action||"deposit").toLowerCase();if(!["deposit","withdraw"].includes(r))throw new Error("morpho: action must be deposit or withdraw");let o=Yo(e.vault||e.vaultAddress,"vault"),i=Yo(e.owner||e.from||e.sender,"owner"),a=Yo(e.receiver||i,"receiver"),s=mN(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Lu({chainId:n,first:100},t),u=fN(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await Xo(n,o,"asset",[],t),f=Yo(p,"vault asset");if((u?.asset?.address?Yo(u.asset.address,"api vault asset"):f)!==f)throw new Error("morpho: API asset and on-chain asset mismatch");let h,b;if(r==="deposit"){let[w]=await Xo(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(w.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[g]=await Xo(n,o,"previewDeposit",[s],t);if(BigInt(g.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");b={minSharesOut:g.toString()},h=Wa.encodeFunctionData("deposit",[s,a])}else{let[w]=await Xo(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(w.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[g]=await Xo(n,o,"previewWithdraw",[s],t);if(BigInt(g.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");b={maxSharesIn:g.toString()},h=Wa.encodeFunctionData("withdraw",[s,a,i])}let x={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:f,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...b,calldataHash:Nb(Ob(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return x.guardHash=Nb(Ob(Ou(x))),N({provider:"morpho",protocol:"erc4626-vault",vaultReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,chainId:n,action:r,vault:o,asset:f,owner:i,receiver:a,amount:s,vaultInfo:u,vaultGuard:x,requiresApproval:r==="deposit"?{token:f,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:x}},{provider:"morpho",kind:"erc4626-vault"})}$();he();import{Interface as gN,getAddress as $u,isAddress as yN}from"ethers";Z();var bN="https://api-v3.balancer.fi/",wN=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||bN;async function Fb(e,t,n={}){return k(wN(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var xN="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Bb=Object.freeze({1:{name:"ethereum",router:"0xAE563E3f8219521950555F5962419C8919758Ea2",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",router:"0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2c639c533813f4aa9d7837caf62653d097ff85"},8453:{name:"base",router:"0x3f170631ed9821Ca51A59D996aB095162438DC10",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",router:"0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",router:"0xF39CA6ede9BF7820a952b52f3c94af526bAB9015",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),vN="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",SN="0x0000000000000000000000000000000000000000",Bu=new gN(["function querySwapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,address sender,bytes userData) returns (uint256 amountOut)","function swapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,uint256 minAmountOut,uint256 deadline,bool wethIsEth,bytes userData) payable returns (uint256 amountOut)"]);function Ub(e){let t=Number(e??8453),n=Bb[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Bb).join(", ")})`);return{chainId:t,...n}}function Db(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===SN||t===vN.toLowerCase()}function Ga(e,t){if(!yN(e))throw new Error(`${t} must be a valid EVM address`);return $u(e)}function Mb(e,t,n){let r=String(e||"");return Db(r)||/^weth$/i.test(r)?$u(t.weth):/^usdc$/i.test(r)?$u(t.usdc):Ga(r,n)}function kN(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 qb(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function Hb(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return Fb(xN,{first:n,chains:r,where:{chainIn:r}},t)}async function jb(e={}){return{ok:(await Fb("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Mu(e={},t={}){let n=Ub(e.chainId),r=Ga(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Mb(o,n,"balancer tokenIn"),a=Mb(e.tokenOut||"USDC",n,"balancer tokenOut"),s=kN(e.amountIn,"balancer amountIn"),c=Ga(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Bu.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,qb(e.userData)]),d=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Bu.decodeFunctionResult("querySwapSingleTokenExactIn",d),f=BigInt(p[0]);if(f<=0n)throw new Error("balancer quote returned zero output");return re({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:f.toString()},{chainId:n.chainId,venue:n.router,amountOut:f.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function zb(e={},t={}){let n=Ub(e.chainId),r=Ga(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Db(o),a=await Mu({...e,sender:r},t),s=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+s),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=Bu.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,qb(e.userData)]);return N({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:fe(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}$();import{getAddress as IN}from"ethers";Z();var AN="https://api-v2.pendle.finance/core",_N=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),TN="0x0000000000000000000000000000000000000000",CN="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Vb=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||AN).replace(/\/$/,"");function Ka(e,t){try{return IN(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function yr(e,t){return Ka(e,t).toLowerCase()}function PN(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===CN||t===TN}function Fu(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n.toString()}function NN(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:Ka(t.token,`pendle input ${n} token`),amount:Fu(t.amount,`pendle input ${n} amount`)}))}function ON(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>Ka(t,`pendle output ${n} token`))}function RN(e){let t=_N[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function LN(e){let t=e?.routes?.[0]?.outputs?.[0]?.amount||e?.outputs?.[0]?.amount;if(!t)throw new Error("Pendle convert response missing output amount");return Fu(t,"pendle output amount")}function $N(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!PN(r.token)).map(r=>({token:yr(r.token,"pendle approval token"),spender:yr(t,"pendle approval spender"),amount:Fu(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Uu(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),k(`${Vb(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wb(e={}){let t=await Uu({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Du(e={},t={}){let n=Number(e.chainId??42161),r=RN(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=Ka(e.receiver||o,"pendle receiver"),a=NN(e.inputs),s=ON(e.outputs);if(e.enableAggregator===!0||Array.isArray(e.aggregators)&&e.aggregators.length)throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");let c=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:a,outputs:s,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await k(`${Vb(t)}/v3/sdk/${n}/convert`,{method:"POST",body:l,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),p=u?.routes?.[0]?.tx;if(!p?.to||!p?.data)throw new Error("Pendle convert returned no executable tx");if(yr(p.to,"pendle tx target")!==yr(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&yr(p.from,"pendle tx sender")!==yr(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let f=LN(u),m=re(u,{chainId:n,venue:p.to,amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return N({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:m,autoSlippage:m.autoSlippage,requiresApproval:$N(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:fe(m.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function Gb(e={},t={}){let n=await Du(e,t),{transaction:r,...o}=n;return o}$();import{isAddress as MN}from"ethers";Z();var FN="https://api.odos.xyz",qu=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||FN).replace(/\/$/,"");async function Hu(e={}){return k(`${qu(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function UN(e={}){let t=Number(e.chainId);if(!Number.isInteger(t))throw new Error("odos: chainId required");if(!Array.isArray(e.inputTokens)||e.inputTokens.length<1)throw new Error("odos: inputTokens[] required");if(!Array.isArray(e.outputTokens)||e.outputTokens.length!==1)throw new Error("odos: agentic execution currently requires exactly one output token");if(!MN(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Kb(e={},t={}){let n=UN(e),r=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await k(`${qu(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),a=i?.outAmounts?.[0];if(!i?.pathId||!a)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:a}}async function Yb(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Kb(e,t);return{...re(r,{chainId:n,venue:"odos-quote",amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to assemble and simulate the path"}}async function Xb(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Kb(e,t),i=await k(`${qu(t)}/sor/assemble`,{method:"POST",body:{userAddr:e.userAddr,pathId:r.pathId,simulate:!0,...e.receiver?{receiver:e.receiver}:{}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),a=i?.transaction;if(!a?.to||!a?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(a.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(a.from&&String(a.from).toLowerCase()!==String(e.userAddr).toLowerCase())throw new Error("odos: transaction sender mismatch");if(i?.simulation?.isSuccess!==!0)throw new Error(`odos: assembled transaction simulation failed: ${i?.simulation?.simulationError||"unknown"}`);let s=re(r,{chainId:n,venue:a.to,amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),c=i?.simulation?.amountsOut?.[0];if(c!=null&&BigInt(c)<BigInt(s.amountOutMinimum))throw new Error("odos: simulation output is below the bounded automatic floor");let l="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",u="0x0000000000000000000000000000000000000000",d=e.inputTokens.filter(p=>![l,u].includes(String(p.tokenAddress).toLowerCase())).map(p=>({token:p.tokenAddress,spender:a.to,amount:String(p.amount)}));return N({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,simulation:i.simulation,requiresApproval:d,autoSlippage:s.autoSlippage,transaction:{chainId:n,from:a.from||e.userAddr,to:a.to,data:a.data,value:a.value??"0x0",...a.gas!=null?{gasLimit:a.gas}:{},...a.nonce!=null?{nonce:a.nonce}:{},slippageGuard:fe(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function Qb(e={}){let t=await Hu(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}$();var Jb=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,qN=/[<>&`*_~[\]()|\\]/g,HN=/[\u0000-\u001F\u007F]/g;function ju(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Jb,"").replace(HN,"").replace(qN,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function zu(e){if(e==null)return!1;let t=String(e);return Jb.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Zb=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});function Ya(e,t={}){let n=Number(e),r=t.baseUrl||Zb[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function ew(e){return!!Zb[Number(e)]}async function Vu(e={},t={}){return k(`${Ya(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function tw(e={},t={}){if(!e.address)throw new Error("address required");return k(`${Ya(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function nw(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return k(`${Ya(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function rw(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${Ya(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await k(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function ow(e=[],{fungibleOnly:t=!0}={}){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r.token&&typeof r.token=="object"?r.token:{},i=String(o.type||r.token_type||"").toUpperCase();if(t&&i&&!i.includes("ERC-20")&&i!=="ERC20")continue;let a=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!a||typeof a!="string")continue;let s=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(s)||s==="0")continue;let c=o.decimals??r.decimals;typeof c=="string"&&/^\d+$/.test(c)&&(c=Number(c)),(typeof c!="number"||!Number.isInteger(c)||c<0||c>36)&&(c=18);let l=ju(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=ju(o.name,{max:80,fallback:""})||null;n.push({address:a.toLowerCase().startsWith("0x")?a:`0x${a}`,symbol:l,name:u,decimals:c,amountRaw:s,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:zu(o.symbol)||zu(o.name)||void 0})}return n}async function iw(e={}){let t=await Vu({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as zN}from"ethers";$();he();at();var VN="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",sw=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function Qt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function Xa(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function aw(e){if(!e)return null;try{return zN(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Cn(e={},t=process.env){let n=e.addresses||{},r=aw(n.evm||e.evmAddress||Xa(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||Xa(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||Xa(t,"ORACLE_BITCOIN_ADDRESS"),a=aw(n.hyperliquid||e.hyperliquidAddress||Xa(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?de(o,"portfolio Solana address"):null,bitcoin:i?st(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function Qo(e,t){let n=BigInt(String(e||"0")),r=Number(t);if(!Number.isInteger(r)||r<0||r>36)throw new Error("portfolio: decimals must be an integer from 0 to 36");if(r===0)return n.toString();let o=n<0n,i=o?-n:n,a=10n**BigInt(r),s=i/a,c=String(i%a).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${s}${c?`.${c}`:""}`}function br(e){let t=Number(e);return Number.isFinite(t)?t:null}function Qa(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Jt(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function cw(e,t){let n=sw[t],r=n?e?.coins?.[n]:null,o=Number(r?.price);return{key:n||null,priceUsd:Number.isFinite(o)?o:null,timestamp:r?.timestamp??null,confidence:r?.confidence??null}}function WN(e){let t=new Map;for(let n of e)if(n?.ok)for(let r of n.data?.accounts||[]){let o=BigInt(String(r.amount||"0"));if(o===0n||!r.mint)continue;let i=`${r.mint}:${r.decimals??"unknown"}`,a=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};a.amountRaw+=o,a.accounts+=1,n.program&&a.programs.add(n.program),t.set(i,a)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:Qo(r,n.decimals),i=n.decimals===0&&n.amountRaw===1n;return{mint:n.mint,amountRaw:r,amount:o,decimals:n.decimals,tokenPrograms:[...n.programs],accountCount:n.accounts,verification:"unverified",classification:i?"collectible-candidate":"fungible-or-unclassified",priceUsd:null,usdValue:null}})}function Wu(e,t){return{family:e,status:"unsupported",reason:t}}function Gu(e,t){if(!e||e.status!=="ok")return e;let n=cw(t,e.symbol),r=br(e.amount),o=r!=null&&n.priceUsd!=null?Qa(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function lw(e={}){let t=Cn({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Ja(e={},t={}){let n=new Date().toISOString(),r=Cn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Hn.map(R=>[R.chainId,R])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(sw))],u=o?xe(()=>bn(l,Qt(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Me(c,e.concurrency||5,async R=>{let F=s.get(R);if(!F)return{family:"evm",chainId:R,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:R,name:F.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let J={...Qt(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},me=await xe(()=>ln(R,r.evm,J));if(!me.ok)return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"unavailable",latencyMs:me.ms,error:me.error};let Ce=F.nativeCurrency?.decimals??18,He=F.nativeCurrency?.symbol||"NATIVE",W=me.data.balanceWei,be={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&ew(R)){let sn=await xe(()=>rw({chainId:R,address:r.evm},{...Qt(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));sn.ok?be={status:"ok",assets:ow(sn.data,{fungibleOnly:!0}).map(Nr=>{let Or=Qo(Nr.amountRaw,Nr.decimals);return{...Nr,amount:Or,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:sn.ms}:be={status:"unavailable",assets:[],reason:sn.error||"blockscout token-balances failed",source:"blockscout",latencyMs:sn.ms}}return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"ok",latencyMs:me.ms,native:{status:"ok",symbol:He,amountRaw:W,decimals:Ce,amount:Qo(W,Ce)},fungibleTokens:be,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:be.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let R=Qt(t,"solana"),F=await xe(()=>Yi({address:r.solana},R)),J=i||a?await Promise.all([xe(()=>fo({owner:r.solana,programId:il},R)).then(be=>({...be,program:"spl-token"})),xe(()=>fo({owner:r.solana,programId:VN},R)).then(be=>({...be,program:"token-2022"}))]):[],me=WN(J),Ce=me.filter(be=>be.classification==="collectible-candidate"),He=me.filter(be=>be.classification!=="collectible-candidate"),W=J.filter(be=>!be.ok).map(be=>be.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||J.some(be=>be.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:Qo(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?W.length===J.length?"unavailable":W.length?"partial":"ok":"not-requested",assets:i?He:[],errors:W,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?W.length===J.length?"unavailable":"partial":"not-requested",assets:a?Ce:[],errors:W,note:"decimals=0 and amount=1 is only a collectible candidate, not verified NFT metadata"},source:"solana-rpc"}})(),f=(async()=>{if(!r.bitcoin)return{family:"bitcoin",name:"Bitcoin Mainnet",address:null,status:"not-configured",error:"set ORACLE_BITCOIN_ADDRESS or pass addresses.bitcoin"};let R=Qt(t,"bitcoin"),F=Qt(t,"bitcoinMeta"),[J,me,Ce]=await Promise.all([xe(()=>Qi({address:r.bitcoin},R)),i?xe(()=>Zi({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?xe(()=>Jn({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),He=me.ok?me.data:null,W=Ce.ok?Ce.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:J.ok||He?.ok||W?.ok?"ok":"unavailable",native:J.ok?{status:"ok",symbol:"BTC",amountRaw:J.data.balanceSats,decimals:8,amount:Qo(J.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:J.error},fungibleTokens:{status:i?He?.ok?"ok":"unavailable":"not-requested",assets:He?.balances||[],error:He?.ok?null:He?.error||me.error,verification:"indexer-reported"},collectibles:{status:a?W?.ok?"ok":"unavailable":"not-requested",assets:W?.inscriptions||[],error:W?.ok?null:W?.error||Ce.error,unknownNotEmpty:!!W?.unknownNotEmpty,verification:"indexer-reported"},source:"bitcoin-esplora+bitcoin-meta"}})(),m=(async()=>{if(!r.hyperliquid)return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:null,status:"not-configured",error:"set ORACLE_HYPERLIQUID_ADDRESS or pass addresses.hyperliquid"};let R=Qt(t,"hyperliquid"),[F,J,me]=await Promise.all([xe(()=>Li(r.hyperliquid,R)),xe(()=>zn(r.hyperliquid,R)),xe(()=>St(R))]),Ce=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(W=>Jt(W.total)||Jt(W.hold)).map(W=>({coin:W.coin||null,total:String(W.total??"0"),hold:String(W.hold??"0"),priceUsd:null,usdValue:null})),He=(J.ok&&Array.isArray(J.data?.assetPositions)?J.data.assetPositions:[]).map(W=>W.position||W).filter(W=>Jt(W.szi)).map(W=>({coin:W.coin||null,size:String(W.szi??"0"),entryPrice:W.entryPx??null,positionValueUsd:W.positionValue??null,unrealizedPnlUsd:W.unrealizedPnl??null,liquidationPrice:W.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||J.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:Ce,error:F.ok?null:F.error},perps:{status:J.ok?"ok":"unavailable",accountValueUsd:J.data?.marginSummary?.accountValue??null,withdrawableUsd:J.data?.withdrawable??null,positions:He,error:J.ok?null:J.error},mids:me.ok?me.data:{},source:"hyperliquid-info"}})(),[h,b,x,w,g]=await Promise.all([d,p,f,m,u]),y=g.ok?g.data:null,v=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),S=[];for(let R of h){if(R.family!=="evm"||R.fungibleTokens?.status!=="ok")continue;let F=v[R.chainId];if(F)for(let J of R.fungibleTokens.assets||[])J.address&&S.push(`${F}:${String(J.address).toLowerCase()}`)}let E=null;if(o&&S.length){let R=[...new Set(S)],F=await xe(()=>bn(R,Qt(t,"prices")));F.ok&&(E=F.data)}let I=h.map(R=>{let F=R.native?{...R,native:Gu(R.native,y)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let J=v[F.chainId],me=F.fungibleTokens.assets.map(Ce=>{let He=String(Ce.symbol||"").toUpperCase(),W=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(He)&&(W=1),W==null&&J&&Ce.address&&E?.coins){let lp=`${J}:${String(Ce.address).toLowerCase()}`,Nr=E.coins[lp],Or=Number(Nr?.price);Number.isFinite(Or)&&Or>0&&(W=Or)}let be=br(Ce.amount),sn=be!=null&&W!=null?Qa(be*W):null;return{...Ce,priceUsd:W,usdValue:sn}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:me}}}return F});b.native&&(b.native=Gu(b.native,y)),x.native&&(x.native=Gu(x.native,y));let _=0,T=0,C=0;for(let R of[...I,b,x]){R.native?.status==="ok"&&Jt(R.native.amount)&&(R.native.usdValue!=null?(_+=R.native.usdValue,T+=1):C+=1);for(let F of R.fungibleTokens?.assets||[])!Jt(F.amount)&&!Jt(F.amountRaw)||(F.usdValue!=null?(_+=F.usdValue,T+=1):C+=1)}let L=cw(y,"HYPE");for(let R of w.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),J=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?L.priceUsd||br(w.mids?.HYPE):br(w.mids?.[R.coin]),me=br(R.total);R.priceUsd=J,R.usdValue=me!=null&&J!=null?Qa(me*J):null,Jt(R.total)&&(R.usdValue!=null?(_+=R.usdValue,T+=1):C+=1)}let X=br(w.perps?.accountValueUsd);X!=null&&X!==0&&(_+=X,T+=1);let Q=[...b.fungibleTokens?.assets||[],...b.collectibles?.assets||[]].filter(R=>Jt(R.amount)).length,O=(x.fungibleTokens?.assets||[]).length+(x.collectibles?.assets||[]).length;C+=Q+O;let q=[...I,b,x,w],B=R=>q.filter(F=>F.status===R).length,z=[],pe=I.filter(R=>R.fungibleTokens?.status==="unavailable"),ve=I.filter(R=>R.fungibleTokens?.status==="ok");pe.length&&!ve.length?z.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):pe.length&&z.push(`EVM token discovery partial: Blockscout covered ${ve.length} chain(s); ${pe.length} chain(s) still native-only.`),(b.fungibleTokens?.assets?.length||b.collectibles?.assets?.length)&&z.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),x.collectibles?.unknownNotEmpty&&z.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),g.ok||z.push(`Price provider unavailable: ${g.error}`);let xt=[Wu("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Wu("sui","Sui balance adapter is not installed"),Wu("aptos","Aptos balance adapter is not installed")],$t=q.some(R=>["unavailable","partial","not-configured"].includes(R.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(R.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:q.length,ok:B("ok"),unavailable:B("unavailable"),notConfigured:B("not-configured"),unsupported:B("unsupported")+xt.length,evmChainsRequested:c.length,evmChainsOk:I.filter(R=>R.status==="ok").length},valuation:{knownUsd:Qa(_),label:"known priced value, not a complete portfolio total",pricedItems:T,unpricedNonzeroItems:C,complete:C===0&&!$t&&B("unavailable")===0&&B("not-configured")===0&&xt.length===0,priceSource:o?"DefiLlama":null,priceStatus:g.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...I,b,x,w],unsupportedFamilies:xt,warnings:z}}import{constants as es}from"node:fs";import{chmod as yO,mkdir as bO,open as wO,readFile as xO}from"node:fs/promises";import{createHash as vO,randomUUID as SO}from"node:crypto";import kO from"node:os";import xr from"node:path";$();$();var KN=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]),YN=new Set(["image/jpeg","image/png","image/webp"]);function XN(e){let t=String(e||"").toLowerCase();return KN.some(n=>t===n||t.endsWith(`.${n}`))}function QN(e){let t=String(e||"").trim();return t.startsWith("ipfs://")?`https://ipfs.io/ipfs/${t.slice(7).replace(/^ipfs\//,"")}`:t.startsWith("ar://")?`https://arweave.net/${t.slice(5)}`:t}function uw(e){let t=QN(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!XN(n.hostname)?null:n}async function JN(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=uw(e);if(!r)throw new Error("image host is not on the raster gallery allowlist");let o=Math.min(Math.max(Number(t.maxImageBytes??15e5),5e4),4e6);for(let i=0;i<=3;i+=1){let a=await xe(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!a.ok)throw new Error(a.error);let s=a.data;if(s.status>=300&&s.status<400){let d=s.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=uw(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!s.ok)throw new Error(`image HTTP ${s.status}`);let c=String(s.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!YN.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(s.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await s.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function Ku(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ZN(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function dw(e={},t={}){let n=Array.isArray(e.items)?e.items:[];if(!n.length)throw new Error("nft gallery requires inventory items");let r=Math.min(Math.max(Number(e.pageSize??12)||12,1),12),o=Math.max(Number(e.page??1)||1,1),i=Math.max(Math.ceil(n.length/r),1);if(o>i)throw new Error(`nft gallery page ${o} exceeds ${i}`);let a=n.slice((o-1)*r,o*r),s=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let g of a){if(c>=l){s.push({item:g,image:null,error:"gallery page byte cap reached"});continue}try{let y=await JN(g.imageUrl||g.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:g,image:y,error:null})}catch(y){s.push({item:g,image:null,error:String(y?.message||y).slice(0,180)})}}let u=3,d=340,p=400,f=76,m=Math.ceil(a.length/u),h=u*d,b=f+m*p,x=s.map(({item:g,image:y,error:v},S)=>{let E=S%u,I=Math.floor(S/u),_=E*d,T=f+I*p,C=y?`<image x="${_+14}" y="${T+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${_+14}" y="${T+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${T+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,L=Ku(ZN(g,S).slice(0,34)),X=Ku(g.chain||"unknown chain");return`${C}<text x="${_+16}" y="${T+350}" fill="#f3f5f7" font-size="17" font-weight="600">${L}</text><text x="${_+16}" y="${T+376}" fill="#8d98a8" font-size="13">${X}${v?" \xB7 placeholder":""}</text>`}).join(""),w=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${b}" viewBox="0 0 ${h} ${b}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${Ku(new Date().toISOString())}</text>${x}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(w).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(g=>g.image).length,placeholders:s.filter(g=>!g.image).map(g=>({assetKey:g.item.assetKey||null,name:g.item.name||null,sourceUrl:g.item.imageUrl||null,error:g.error})),rasterOnly:!0,externalScripts:!1}}var eO=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],tO=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,nO=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function rO(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;tO.test(n)&&t.push("url-in-name");let i=eO.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),nO.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let a=e.estimatedValueUsd==null&&e.estimatedValueSats==null,s=!Array.isArray(e.traits)||e.traits.length===0;a&&s&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function pw(e={}){let t=rO(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}Z();var oO=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),iO=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function Pn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Jo(e,t){let n=await xe(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function aO(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function sO(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function cO(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function hw(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function lO(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function uO(e,t){let n=hw(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),a=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(a)||a<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let s=Math.round((i+a)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-s)*100)/100,currentValueUsd:o,totalCostUsd:s,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function dO(e){let t=new Map;for(let n of e){let r=hw(n);t.has(r)||t.set(r,n)}return[...t.values()]}function pO(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,a)=>i+Number(a.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function gw(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function wr(e={},t={}){let n=new Date().toISOString(),r=Cn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=oO.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=Pn(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await Me(l,4,async y=>({row:y,result:await Jo(`opensea-${y.chain}`,()=>Yr({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:v}of u)if(v.ok){let S=v.data.nfts.map(E=>({...E,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...S),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:v.data.complete?"ok":"partial",count:S.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!r.evm)for(let y of i.filter(v=>v.family!=="solana"))a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let y=await Jo("opensea-solana",()=>Yr({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let v=y.data.nfts.map(S=>({...S,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...v),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:v.length,complete:y.data.complete,next:y.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:y.error,source:"opensea"})}else(!o||o.has("solana"))&&a.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let y=await Jo("satflow-wallet-contents",()=>ta({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Pn(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let v=aO(y.data.contents).map(E=>sO(E,r.bitcoin));s.push(...v);let S=v.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:S?"ok":"partial",count:v.length,complete:S,source:"satflow"})}else{let v=await Jo("bitcoin-meta-inscriptions",()=>Jn({address:r.bitcoin},Pn(t,"bitcoinMeta")),t.timeoutMs??35e3),S=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];s.push(...S.map(E=>cO(E,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:S.length?"partial":"unavailable",count:S.length,complete:!1,source:S.length?"bitcoin-meta":"satflow",error:S.length?"Satflow unavailable; fallback has IDs only":y.error})}}else(!o||o.has("bitcoin"))&&a.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let y of[...new Set([r.evm,r.solana].filter(Boolean))]){let v=await Jo(`opensea-pnl-${y}`,()=>Ei({address:y},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:v.error})}let p=lO(e.costBasis),f=dO(s).map(y=>uO(y,p)).map(y=>pw(y)),m=f.filter(y=>!y.spam),h=f.filter(y=>y.spam),b=m.filter(y=>y.estimatedValueUsd!=null&&Number.isFinite(Number(y.estimatedValueUsd))),x=Math.round(b.reduce((y,v)=>y+Number(v.estimatedValueUsd),0)*100)/100,w=m.length-b.length,g=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:iO,inventory:{count:f.length,visibleCount:m.length,flaggedCount:h.length,items:f,visibleItems:m,flaggedItems:h},valuation:{estimatedCurrentValueUsd:x,valuedItems:b.length,unvaluedItems:w,complete:w===0&&g.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:pO(m,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function mw(e,t){let n=typeof e=="number"?e*1e3:Date.parse(String(e||""));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp or Unix seconds`);let r=Math.floor(n/1e3);if(r<=Math.floor(Date.now()/1e3))throw new Error(`${t} must be in the future`);return r}function mO(e){let t=String(e??"").trim();if(!/^[1-9]\d*$/.test(t))throw new Error("Bitcoin NFT list priceSats must be a positive integer");return t}async function yw(e={},t={}){if(e.userConfirmed!==!0)throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");let n=String(e.marketplace||"").trim().toLowerCase();if(n==="opensea")return Pi(e,Pn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=mw(e.expiry??e.endTime,"Solana NFT listing expiry");return _a({...e,expiry:r},Pn(t,"magiceden"))}if(n==="satflow"){let r=mw(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return na({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:mO(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Pn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Yu(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`${t} must be a non-negative ETH number`);return n}function Xu(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Za(e){return String(e??"").trim().toLowerCase()}function fO(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Za(t),i=Za(n);return!o||!i?!1:r.some(a=>Za(a.trait_type??a.traitType??a.type)===o&&Za(a.value??a.trait_value??a.traitValue)===i)}function hO(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function fw(e={},t=["timestamp","listedAt","createdAt"]){for(let n of t){let r=e[n]??e[n.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`)];if(r==null)continue;let o=typeof r=="number"?r:Date.parse(String(r));if(Number.isFinite(o))return o}return null}function Qu(e){return Math.round(Number(e)*1e6)/1e6}function Zt(e,t,n={}){return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:String(e.marketplace||"").toLowerCase(),collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"PASS",reason:t,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:null,evidence:n,prepareIntent:null}}async function bw(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return Zt(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(E=>e[E]==null||e[E]==="");if(o.length)return Zt(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Yu(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Yu(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Yu(e.traitFloorEth,"traitFloorEth"),d=Xu(e.collectionFloorEth),p=Xu(e.maxListingAgeMs),f=Xu(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return Zt(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return Zt(e,"invalid-min-trait-sales");if(u<=0)return Zt(e,"trait-floor-unavailable");let m=E=>fO(E,e.traitType,e.traitValue)&&hO(E,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(m).filter(E=>{if(!f)return!0;let I=fw(E,["timestamp","soldAt","createdAt"]);return I!=null&&i-I<=f}),b=Qu(h.reduce((E,I)=>E+Number(I.priceEth??I.price??0),0)),x={count:h.length,volumeEth:b,minSales:c,minVolumeEth:l};if(h.length<c||b<l)return Zt(e,"trait-liquidity-insufficient",{traitSales:x});let w=(Array.isArray(e.listings)?e.listings:[]).filter(m).filter(E=>{let I=Number(E.priceEth??E.price);if(!Number.isFinite(I)||I<=0||I>a)return!1;if(!p)return!0;let _=fw(E,["listedAt","createdAt","timestamp"]);return _!=null&&i-_<=p}).map(E=>{let I=Number(E.priceEth??E.price),_=Math.round((u-I)/u*1e4);return{...E,priceEth:I,discountBps:_}}).filter(E=>E.discountBps>=s).sort((E,I)=>E.priceEth-I.priceEth||I.discountBps-E.discountBps),g={traitSales:x,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:w.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return Zt(e,"invalid-min-trait-listings",g);if(w.length<y)return Zt(e,"trait-listing-depth-insufficient",g);let v=w[0],S=N({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:Qu(v.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:g,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:Qu(v.priceEth),discountBps:v.discountBps},evidence:g,prepareIntent:S}}async function ww(e={},t={}){let n=await wr({...e,includePnl:!0},t);return{provider:"nft-portfolio",operation:"pnl",readOnly:!0,generatedAt:n.generatedAt,addresses:n.addresses,coverage:n.coverage,unsupported:n.unsupported,valuation:n.valuation,pnl:n.pnl}}async function xw(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await wr({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await dw({...e,items:n},Pn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var vw=10*1024*1024,Ew=1e3;function en(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function vr(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Sw(e,t){if(e==null||e==="")return null;let n=Date.parse(String(e));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(n).toISOString()}function Iw(e,t,n,r,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<n||i>r)throw new Error(`${o} must be an integer from ${n} to ${r}`);return i}function EO(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Aw(e={}){return`portfolio_${vO("sha256").update(EO(e)).digest("hex").slice(0,20)}`}function _w(e={}){if(e.historyFile)return xr.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return xr.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||xr.join(kO.homedir(),".hermes");return xr.join(xr.resolve(n),"state","oracle","portfolio-history.jsonl")}function IO(e){let t=en(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?vr(t):null}function AO(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=en(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?vr(t):null}function _O(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=en(c.usdValue);return l==null?s:s+l},0),i=en(n.perps?.accountValueUsd),a=vr(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>en(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=en(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:vr(r)})}return t}function TO(e,t,n){let r=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:n,ok:r.filter(o=>o.status==="ok").length,partial:r.filter(o=>o.status==="partial").length,unavailable:r.filter(o=>o.status==="unavailable").length,notConfigured:r.filter(o=>o.status==="not-configured").length,status:n?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function CO(e,t){let n=_w(t),r=`${JSON.stringify(e)}
|
|
147
|
-
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await
|
|
148
|
-
`))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function NO(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Cn(e,t.env||process.env);return Object.values(n).some(Boolean)?Aw(n):null}async function Ju(e={},t={}){let n=Iw(e.limit,100,1,Ew,"portfolio history limit"),r=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(r))throw new Error("portfolio history order must be asc or desc");let o=Sw(e.since,"portfolio history since"),i=Sw(e.until,"portfolio history until"),a=NO(e,t),s=await PO(t),c=s.snapshots.filter(d=>!(a&&d.portfolioId!==a||o&&d.recordedAt<o||i&&d.recordedAt>i));c.sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)));let l=c.length;c=c.slice(-n),r==="desc"&&c.reverse();let u=c.filter(d=>en(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:s.file,portfolioId:a,order:r,totalStored:s.snapshots.length,totalMatching:l,corruptLines:s.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:u.length,unpricedSnapshots:c.length-u.length,firstRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt))).at(-1).recordedAt:null}}}function kw(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function ts(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function OO(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function RO(e,t){let c=e.map(g=>g.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let g=Math.max(1,Math.abs(l)*.05);l-=g,u+=g}else{let g=(u-l)*.1;l=Math.max(0,l-g),u+=g}let d=g=>e.length===1?1240/2:100+1040*g/(e.length-1),p=g=>570-(g-l)/(u-l)*470,f=e.map((g,y)=>`${y?"L":"M"}${d(y).toFixed(2)},${p(g.value).toFixed(2)}`).join(" "),m=Array.from({length:5},(g,y)=>{let v=y/4,S=100+v*470,E=u-v*(u-l);return`<line x1="100" y1="${S}" x2="1140" y2="${S}" stroke="#26313c" stroke-width="1"/><text x="86" y="${S+5}" text-anchor="end" fill="#8795a5" font-size="15">${kw(E)}</text>`}).join(""),h=e.map((g,y)=>`<circle cx="${d(y)}" cy="${p(g.value)}" r="5" fill="#b8f0ff"><title>${ts(g.recordedAt)}: ${kw(g.value)}</title></circle>`).join(""),b=ts(e[0].recordedAt.slice(0,10)),x=ts(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${ts(t||"configured portfolio")}</text>${m}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${f}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${h}<text x="100" y="610" fill="#8795a5" font-size="15">${b}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${x}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function Cw(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Iw(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Ju({...e,order:"asc",limit:e.limit??Ew},t);if(!r.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=r.snapshots.map(d=>({recordedAt:d.recordedAt,value:en(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=OO(o,n),a=i[0].value,s=i.at(-1).value,c=vr(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=RO(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:a,endKnownUsd:s,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}he();var $O=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),BO=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),MO=`0x${"0".repeat(64)}`;function FO(e){return!e||e==="0x"||e===MO}async function Nn(e={},t={}){let n=t.rpcCall||U,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(m){return{address:r,chainId:o,status:"unavailable",error:m?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let a=[],s=[],c=i.slice(2).toLowerCase();for(let[m,h]of Object.entries($O))c.includes(m)&&s.push({selector:`0x${m}`,...h});let l=!1,u=null,d=null;for(let{label:m,slot:h}of BO)try{let b=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!FO(b)){l=!0,u=m,d=`0x${String(b).slice(-40)}`;break}}catch{a.push(`proxy slot (${m}) unreadable; proxy status uncertain`)}l&&(s.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),a.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let f=s.filter(m=>m.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:f,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function Pw(e={}){let t=Date.now();try{let n=await Nn({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var DO=/^0x[0-9a-fA-F]{40}$/,Nw=4663;function ns(e,t){let n=String(e||"").trim();if(!DO.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Zu(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n)||BigInt(n)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return n}function Zo(e,t){return e==null||e===""?null:Zu(e,t)}function qO({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:a,unsignedTx:s,args:c,opts:l}){let u=s?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=ns(u.to,"prepared destination"),p=String(u.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=Zu(u.value??r,"prepared native value");if(BigInt(f)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let m=Zo(u.gasLimit??c.gasLimit,"gasLimit"),h=Zo(u.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let b=Number(l.nowMs??Date.now()),x=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),w=zs({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:b,ttlMs:x,secret:l.routeAttestationSecret}),g=fe(w,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),y={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:h,slippageBps:g.selectedBps,expiresAtMs:b+x},v=Zo(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return v&&(y.maxPriorityFeePerGas=v),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||v)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=Zo(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=Zo(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:g.selectedBps,expiresAtMs:b+x,fee:{oracleFeeBps:5},autoSlippage:g,artifact:{chainId:e,owner:o,transactions:[y]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function HO(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}fc();let n=_m(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function jO({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==G.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),n?.status!=="ok"&&c.push("structural contract risk is unavailable"),n?.risk==="high"&&c.push("structural contract risk is high"),r?.verdict!==H.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==H.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==G.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),s.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),a.tokenIn||c.push("tokenIn is required to prepare"),a.amountIn||c.push("amountIn is required to prepare"),a.recipient||c.push("recipient is required to prepare"),c}async function Ow(e={},t={}){let n=Number(e.chainId??Nw);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=ns(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ns(e.tokenIn,"tokenIn"):null,i=e.recipient?ns(e.recipient,"recipient"):null,a=e.amountIn==null?null:Zu(e.amountIn,"amountIn"),s=HO(n,t.scanner),c=t.scanContractRisk||Nn,[l,u,d]=await Promise.all([s.resolveToken(r),s.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await s.scoreRisk(r),f=null;s.supports?.("sellSimulation")&&a?f=await s.sellSimulation({token:r,amountIn:a,base:o||void 0}):s.supports?.("sellSimulation")&&(f=await s.sellSimulation({token:r,amountIn:"10000000000000000"}));let m=null;s.supports?.("quote")&&o&&a&&(m=await s.quote({tokenIn:o,tokenOut:r,amountIn:a}));let h={...e,tokenIn:o,amountIn:a,recipient:i},b=jO({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:h,scanner:s}),x=null,w=null,g=null;if(e.prepare===!0&&b.length===0){x=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{w=qO({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:m,topPool:u?.pools?.[0]||null,unsignedTx:x,args:e,opts:t})}catch(y){g=String(y?.message||y).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!w,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:s.key,name:s.name,nativeCurrency:s.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,blockedReasons:b,prepared:!!x,unsignedTx:x,localSignerEnvelope:w,localSignerBlockedReason:g,signed:w?"pending-local-signer":!1,broadcast:w?"pending-local-signer":!1}}async function Rw(){fc();let e=Tm();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Nw,chainIds:e.map(t=>t.chainId),execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:!1,broadcast:!1,note:"capability only; actual arming requires owner-local signer policy and a compatible prepared artifact"}}he();he();var VO=5,ed=[50,75,90],Lw=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function On(e,t){if(e==null)return null;try{if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isFinite(e)||e<0)throw new Error("bad number");return BigInt(Math.floor(e))}let n=String(e).trim();return n.startsWith("0x"),BigInt(n)}catch{throw new Error(`${t} must be a non-negative integer (wei)`)}}function WO(e){let t=e.filter(n=>n!=null).sort((n,r)=>n<r?-1:n>r?1:0);return t.length?t[Math.floor(t.length/2)]:null}async function rs(e={},t={}){let n=t.rpcCall||U,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Lw[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Lw).join(", ")}`};let i,a,s,c;try{i=On(e.maxFeePerGasWei,"maxFeePerGasWei"),a=On(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=On(e.gasLimit,"gasLimit"),c=On(e.maxTotalGasWei,"maxTotalGasWei")}catch(E){return{status:"error",viable:!1,error:E.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${VO.toString(16)}`,"pending",ed],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(E){return{status:"unavailable",viable:!1,error:E?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=On(u?.baseFeePerGas,"baseFeePerGas")??On(l?.baseFeePerGas?.[l.baseFeePerGas.length-1],"baseFeePerGas");if(d==null)return{status:"unavailable",viable:!1,error:"chain did not report a baseFeePerGas (pre-EIP-1559?)",notes:["this pricer is EIP-1559 only"]};let f=(Array.isArray(l?.reward)?l.reward:[]).map(E=>{try{return On(E?.[o.percentile],"reward")}catch{return null}}).filter(E=>E!=null&&E>0n),m=WO(f),h=[];m==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let b=m??1000000000n,x=d*o.baseFeeMultiplier+b,w=[];a!=null&&b>a&&(w.push({field:"maxPriorityFeePerGas",wanted:b.toString(),capped:a.toString()}),b=a,x=d*o.baseFeeMultiplier+b),i!=null&&x>i&&(w.push({field:"maxFeePerGas",wanted:x.toString(),capped:i.toString()}),x=i,b>x&&(b=x));let g=s!=null?s*x:null;c!=null&&g!=null&&g>c&&w.push({field:"totalGas",wanted:g.toString(),capped:c.toString()});let y=m==null||b>=m,v=c==null||g==null||g<=c,S=y&&v;return y||h.push(`tip cap ${b} is below the observed ${ed[o.percentile]}th-percentile tip ${m}; this bid is unlikely to land`),v||h.push(`worst-case gas ${g} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:S,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:m==null?null:m.toString(),percentile:ed[o.percentile],maxFeePerGas:x.toString(),maxPriorityFeePerGas:b.toString(),worstCaseGasWei:g==null?null:g.toString(),clamps:w,notes:h}}he();var KO="08c379a0",YO="4e487b71",XO=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 QO(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===KO)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===YO){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:XO[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 JO(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 ZO(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 e2(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 ei(e={},t={}){let n=t.rpcCall||U,r=Number(e.chainId),o=e.tx||{};if(!Number.isInteger(r))return{status:"error",willRevert:null,error:"chainId is required"};if(!o.to||!/^0x[a-fA-F0-9]{40}$/.test(String(o.to)))return{status:"error",willRevert:null,error:"tx.to must be a valid address"};if(o.from&&!/^0x[a-fA-F0-9]{40}$/.test(String(o.from)))return{status:"error",willRevert:null,error:"tx.from must be a valid address"};let i=e2(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(m){let h=JO(m);if(!ZO(m,!!h))return{status:"unavailable",willRevert:null,chainId:r,error:m?.message||"simulation unavailable",notes:["could not reach the node; this is NOT evidence the transaction would fail"]};c=!0,l=QO(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 m=await n(r,"eth_estimateGas",[i,"pending"],t);u=BigInt(m);let h=BigInt(Math.max(0,Math.floor(e.gasBufferPercent??20)));d=u+u*h/100n,a.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(m){a.push(`gas estimation failed: ${m?.message||"unknown"}`)}a.push("a pass reflects CURRENT chain state \u2014 it is not a guarantee the transaction lands, and in a contested mint the state changes between blocks");let p=`0x${"0".repeat(64)}`,f=s===p;return f&&a.push("call did not revert but returned boolean false \u2014 some ERC-20s (e.g. USDC) signal failure this way instead of reverting"),{status:"ok",willRevert:!1,returnsFalse:f,chainId:r,returnData:s,gasEstimate:u==null?null:u.toString(),gasLimit:d==null?null:d.toString(),summary:f?"executes but returns FALSE \u2014 the contract is rejecting this operation":u?`would succeed, ~${u} gas`:"would succeed",notes:a}}async function $w(e={}){let t=Date.now();try{let n=await ei({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 n2=Object.freeze([{selector:"a0712d68",signature:"mint(uint256)",args:["quantity"]},{selector:"40c10f19",signature:"mint(address,uint256)",args:["to","quantity"]},{selector:"1249c58b",signature:"mint()",args:[]},{selector:"2db11544",signature:"publicMint(uint256)",args:["quantity"]},{selector:"efef39a1",signature:"purchase(uint256)",args:["quantity"]},{selector:"a6f2ae3a",signature:"buy()",args:[]}]);function r2(e){let t=BigInt(e).toString(16);if(t.length>64)throw new Error("value too large for a 32-byte word");return t.padStart(64,"0")}function o2(e){let t=String(e).toLowerCase().replace(/^0x/,"");if(!/^[a-f0-9]{40}$/.test(t))throw new Error(`invalid address: ${e}`);return t.padStart(64,"0")}function Bw(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=o2(t);else if(o==="quantity")r+=r2(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function i2({address:e,chainId:t,minter:n,quantity:r,tx:o,nowMs:i,ttlMs:a=3e4}){if(!o?.gasLimit||!o?.maxFeePerGas)throw new Error("local-signer envelope requires gasLimit and maxFeePerGas");let s=Number(i??Date.now()),c=String(o.value??"0");return{version:1,surface:"evm-nft",action:"mint",provider:"nft-mint",owner:n,destination:e,contract:e,quantity:String(r),totalWei:c,slippageBps:0,expiresAtMs:s+Math.min(Math.max(Number(a)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{chainId:t,owner:n,contract:e,quantity:String(r),totalWei:c,transactions:[{chainId:t,from:n,to:e,data:o.data,value:c,gasLimit:String(o.gasLimit),maxFeePerGas:String(o.maxFeePerGas),...o.maxPriorityFeePerGas!=null?{maxPriorityFeePerGas:String(o.maxPriorityFeePerGas),type:2}:{}}]}}}async function os(e={},t={}){let n=t.rpcCall||U,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",found:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",found:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(c){return{status:"unavailable",error:c?.message||"eth_getCode failed",found:[]}}if(!i||i==="0x")return{status:"ok",found:[],notes:["no contract deployed at this address"]};let a=i.slice(2).toLowerCase(),s=n2.filter(c=>a.includes(c.selector));return{status:"ok",address:r,chainId:o,found:s,notes:s.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function Mw(e={}){let t=Date.now();try{let n=await os({address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",chainId:1},e),r=n.status==="ok";return{provider:"nft-mint",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe failed"}}catch(n){return{provider:"nft-mint",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}async function td(e={},t={}){let n=String(e.contract||e.address||"").trim().toLowerCase(),r=Number(e.chainId),o=String(e.minter||e.from||"").trim().toLowerCase(),i=e.quantity==null?1:Number(e.quantity);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"minter address is required"};if(!Number.isInteger(i)||i<1)return{status:"error",error:"quantity must be a positive integer"};if(!Number.isInteger(r))return{status:"error",error:"chainId is required"};let a=await os({address:n,chainId:r},t);if(a.status!=="ok")return{status:a.status,error:a.error};if(!a.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:a.notes};let s=e.signature?a.found.find(g=>g.signature===e.signature):a.found[0];if(!s)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:a.found.map(g=>g.signature)};let c=a.found.length>1&&!e.signature,l=await Nn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await ei({chainId:r,tx:{from:o,to:n,data:Bw(s,{minter:o,quantity:i}),value:e.valueWei},gasBufferPercent:e.gasBufferPercent},t),u.willRevert===!0&&e.ignoreRevert!==!0))return{status:"would-revert",error:`mint would revert: ${u.revert.reason}`,simulation:u,mintFunction:s.signature,notes:["signing this now would burn gas and fail; pass ignoreRevert to prepare anyway (e.g. a mint that has not opened yet)"]};let d=e.gasLimit??(u?.gasLimit?Number(u.gasLimit):null),p=await rs({chainId:r,urgency:e.urgency||"war",gasLimit:d,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,maxTotalGasWei:e.maxTotalGasWei},t);if(p.status!=="ok")return{status:"unavailable",error:p.error,notes:p.notes};let f;try{f=Bw(s,{minter:o,quantity:i})}catch(g){return{status:"error",error:g.message}}let m={chainId:r,from:o,to:n,data:f,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=rc({chainId:r,tx:{gasLimit:d,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},policy:{maxTotalGasWei:e.maxTotalGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,grant:e.grant}}),!h.ok))return{status:"refused",error:`gas-war cap exceeded: ${h.reason||h.error}`,gas:p,capCheck:h};let b=[];c&&b.push(`contract exposes ${a.found.length} mint entrypoints (${a.found.map(g=>g.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&b.push(`contract risk HIGH: ${l.findings.map(g=>g.name).join(", ")}`),p.viable||b.push(p.notes[0]),h.skipped&&b.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let x=null,w=null;try{x=i2({address:n,chainId:r,minter:o,quantity:i,tx:m,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(g){w=String(g?.message||g).slice(0,200)}return{status:"ok",execution:x?"armed-local":"prepare-only",signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1,tx:m,localSignerEnvelope:x,localSignerBlockedReason:w,mintFunction:s.signature,alternatives:a.found.map(g=>g.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:b}}Z();import{createHash as nR}from"node:crypto";import{createHash as s2}from"node:crypto";var c2=1,l2=8,Te=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},u2=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),d2=new Set(["family","id"]),p2=new Set(["id","startsAt","endsAt","eligibility"]),m2=new Set(["kind","proofFormat","proofDigest"]),f2=new Set(["amount","unit"]),h2=new Set(["value","unit"]);function Sr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Te(`${t} must be a plain object`);return e}function kr(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Te(`${n} has unknown field ${r}`,"unknown-field")}function ot(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Te(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function g2(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Te(`${t} must be a positive safe integer`);return e}function nd(e,t){if(e=Sr(e,t),kr(e,f2,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Te(`${t} requires amount and unit`,"ambiguous-unit");let n=ot(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Te(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:ot(e.unit,`${t}.unit`)}}function rd(e,t){if(e=Sr(e,t),kr(e,h2,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Te(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function y2(e,t){e=Sr(e,t),kr(e,m2,t);let n=ot(e.kind,`${t}.kind`),r=ot(e.proofFormat,`${t}.proofFormat`),o=ot(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Te(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function b2(e,t){let n=`stages[${t}]`;e=Sr(e,n),kr(e,p2,n);let r=rd(e.startsAt,`${n}.startsAt`),o=rd(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Te(`${n} must end after it starts`,"invalid-stage-range");return{id:ot(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:y2(e.eligibility,`${n}.eligibility`)}}function od(e){if(e=Sr(e,"input"),kr(e,u2,"input"),e.version!==c2)throw new Te("version must be 1");let t=Sr(e.chain,"chain");kr(t,d2,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>l2)throw new Te("stages must contain 1 through 8 entries","stage-count");let r=n.map(b2).sort((a,s)=>a.startsAt.value-s.startsAt.value||a.id.localeCompare(s.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new Te("stage ids must be unique","duplicate-stage");if(o.add(r[a].id),a&&r[a].startsAt.value<r[a-1].endsAt.value)throw new Te("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Te("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:ot(t.family,"chain.family"),id:ot(t.id,"chain.id")},marketplace:ot(e.marketplace,"marketplace"),mechanism:ot(e.mechanism,"mechanism"),collection:ot(e.collection,"collection"),recipient:ot(e.recipient,"recipient"),quantity:g2(e.quantity,"quantity"),stages:r,mintValueCap:nd(e.mintValueCap,"mintValueCap"),networkFeeCap:nd(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:nd(e.priorityFeeCap,"priorityFeeCap"),expiry:rd(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Te("every stage must end no later than expiry","stage-after-expiry");return i}function w2(e){return JSON.stringify(od(e))}function Fw(e){return`sha256:${s2("sha256").update(w2(e),"utf8").digest("hex")}`}var id=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Rn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),ad=Object.freeze(Object.values(Rn)),Uw=new Set(ad),Dw=Object.freeze(ad.slice(0,4)),x2=ad,v2=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Le=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function is(e,t){if(!Array.isArray(e)||e.length===0)throw new Le(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Le(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Le(`${t} contains duplicates`);return[...n].sort()}function S2(e){if(!Array.isArray(e))throw new Le("capabilities must be an array");let t=new Set(e);for(let n of t)if(!Uw.has(n))throw new Le(`unknown capability ${n}`,"unknown-capability");return x2.every(n=>t.has(n))?id.AUTOMINT_READY:Dw.every(n=>t.has(n))?id.PREPARE_READY:id.RESEARCH_ONLY}function sd(e=[]){if(!Array.isArray(e))throw new Le("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Le("entry must be an object");for(let i of Object.keys(n))if(!v2.has(i))throw new Le(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Le("entry id must be an exact string");if(t.has(n.id))throw new Le(`duplicate entry id ${n.id}`,"duplicate-entry");let r=is(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(is(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(is(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(is(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:S2(r)});t.set(o.id,o)}return Object.freeze({entries:Object.freeze([...t.values()]),get(n){return t.get(n)||null},find({chainFamily:n,marketplace:r,mechanism:o}={}){return[...t.values()].filter(i=>i.chainFamilies.includes(n)&&i.marketplaces.includes(r)&&i.mechanisms.includes(o))},require(n,r=Dw){let o=t.get(n);if(!o)throw new Le(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!Uw.has(i))throw new Le(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Le(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var J3=sd([]);Z();import{getAddress as k2,Interface as cd,keccak256 as E2}from"ethers";var tn=Object.freeze({manifold:new cd(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new cd(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new cd(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),ud=Object.freeze({manifold:Object.freeze({signature:"mint(address,uint256,uint32,bytes32[],address)",layout:"manifold-claim-v1"}),zora:Object.freeze({signature:"mint(address,uint256,string,address)",layout:"zora-1155-mint-v1"}),thirdweb:Object.freeze({signature:"claim(address,uint256,address,uint256,(bytes32[],uint256,uint256,address),bytes)",layout:"thirdweb-drop-claim-v1"})}),nU=Object.freeze(Object.fromEntries(Object.entries(ud).map(([e,t])=>[tn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function oe(e){throw new Error(`evm-mint-launchpads: ${e}`)}function Ke(e,t){try{return k2(String(e||""))}catch{return oe(`invalid ${t}`)}}function $e(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&oe(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return oe(`${t} must be an unsigned integer`)}}function ld(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&oe(`invalid ${t}`),e.map(String)}function I2(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&oe("invalid chainId");let o=Ke(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&Ke(u.contract,"reviewed contract")===o);a||oe("unsupported contract or wrong chain");let s=Ke(a.mintTarget||a.contract,"reviewed mint target"),c=tn[e].getFunction(ud[e].signature).selector.toLowerCase();return(!(a.selectors||[c]).map(u=>String(u).toLowerCase()).includes(c)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&oe("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function A2(e,t,n){if(typeof n.getCode=="function")return n.getCode(e,t);if(typeof n.rpcCall=="function")return n.rpcCall(e,"eth_getCode",[t,"latest"],n);oe("runtime bytecode verification required")}function _2(e,t){let n=e.stage;if(!n)return null;let r=$e(n.startTime,"stage startTime"),o=$e(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&oe("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function T2(e,t){let n=ud[e];String(t).slice(0,10).toLowerCase()!==tn[e].getFunction(n.signature).selector.toLowerCase()&&oe("unknown selector");let r;try{r=tn[e].decodeFunctionData(n.signature,t)}catch{oe("invalid calldata layout")}let o;return e==="manifold"&&(o=tn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=tn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=tn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&oe("calldata must be canonical with no suffix"),r}async function qw(e,t={},n={}){tn[e]||oe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=I2(e,t,n),s=Ke(t.recipient||t.minter,"recipient"),c=$e(t.quantity,"quantity",{positive:!0}),l=$e(t.priceWei,"priceWei"),u=$e(t.maxValueWei,"maxValueWei"),d=$e(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&oe("transaction chain mismatch"),Ke(p.to,"transaction target")!==i&&oe("transaction target mismatch");let f=await A2(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(f))||f==="0x"||E2(f).toLowerCase()!==String(a.codeHash).toLowerCase())&&oe("runtime bytecode is not reviewed");let m=T2(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),b=_2(t,h),x,w,g,y=null,v=[];if(e==="manifold")Ke(m[0],"calldata contract")!==o&&oe("calldata contract mismatch"),(t.instanceId==null||$e(m[1],"instanceId")!==$e(t.instanceId,"instanceId"))&&oe("instance/stage mismatch"),(t.mintIndex==null||$e(m[2],"mintIndex")!==$e(t.mintIndex,"mintIndex"))&&oe("mint index/stage mismatch"),v=ld([...m[3]]),x=Ke(m[4],"calldata recipient"),w=1n,g=l;else if(e==="zora")x=Ke(m[0],"calldata recipient"),w=BigInt(m[1]),g=l,t.comment!=null&&m[2]!==String(t.comment)&&oe("comment mismatch"),t.mintReferral!=null&&Ke(m[3],"mint referral")!==Ke(t.mintReferral,"expected mint referral")&&oe("mint referral mismatch");else{x=Ke(m[0],"calldata recipient"),w=BigInt(m[1]),g=BigInt(m[3]);let T=m[4];v=ld([...T.proof]),y=BigInt(T.quantityLimitPerWallet),y<c&&oe("wallet allowance below quantity"),(BigInt(T.pricePerToken)!==l||Ke(T.currency,"allowlist currency")!==Ke(m[2],"currency"))&&oe("allowlist terms mismatch")}x!==s&&oe("recipient mismatch"),w!==c&&oe("quantity mismatch"),g!==l&&oe("price mismatch"),t.proof!=null&&JSON.stringify(v.map(T=>T.toLowerCase()))!==JSON.stringify(ld(t.proof).map(T=>T.toLowerCase()))&&oe("proof mismatch");let S=$e(p.value??0,"transaction value"),E=l*c;(S<E||S-E>d||S>u)&&oe("transaction value or fee cap exceeded");let I=p.gasLimit==null?null:$e(p.gasLimit,"gasLimit"),_=p.maxFeePerGas==null?null:$e(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(I==null||I>$e(t.maxGasLimit,"maxGasLimit"))&&oe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(_==null||_>$e(t.maxFeePerGasWei,"maxFeePerGasWei"))&&oe("gas fee cap exceeded"),N({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:S.toString(),platformFeeWei:(S-E).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...b?{stage:b}:{},...y==null?{}:{walletAllowance:y.toString()},proof:v,transaction:{chainId:r,to:i,data:p.data,value:S.toString(),...I==null?{}:{gasLimit:I.toString()},..._==null?{}:{maxFeePerGas:_.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var C2="RESEARCH_ONLY";var P2="canonical serialized-message decoding and program-specific instruction validation are not implemented",as=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),oU=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function N2(){throw new Error(`solana-mint: ${C2}; disabled until ${P2}`)}function Hw(){N2()}Z();import{Address as O2,CompactSize as R2,NETWORK as L2,OutScript as Zw,Script as $2,TEST_NETWORK as jw,Transaction as B2,utils as M2}from"@scure/btc-signer";import{createHash as ti}from"node:crypto";var zw="universal-ordinals-mint",Vw="bitcoin-ordinals-mint-plan",F2=1800*1e3,U2=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Ww=new Set,D2=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function dt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function nn(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`ordinals mint: ${t} must be an integer`);let o=BigInt(r);if(n?o<=0n:o<0n)throw new Error(`ordinals mint: ${t} must be ${n?"positive":"non-negative"}`);return o}function dd(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`ordinals mint: ${t} must be a non-negative number`);return n}function ex(e,t){let n=dt(e,t).toLowerCase();if(!/^(?:[0-9a-f]{2})+$/.test(n))throw new Error(`ordinals mint: ${t} must be non-empty canonical hex`);return n}function q2(e){return e==="bitcoin"||e==="mainnet"?L2:e==="regtest"?{...jw,bech32:"bcrt"}:jw}function Gw(e,t){try{let n=Zw.decode(e);if(n.type==="unknown")throw new Error("unknown script type");return n}catch(n){throw new Error(`${t} must be a recognized standard Bitcoin script (${n?.message||"decode failed"})`)}}function H2(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function j2(e){let t=ti("sha256").update(e.unsignedTx).digest();return ti("sha256").update(t).digest().reverse().toString("hex")}function Kw(e,...t){let n=ti("sha256").update(e,"ascii").digest();return ti("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function z2(e,t,n,r){let o=Buffer.from(t||[]);if(o.length<1)throw new Error(`${r} has an empty tapLeafScript`);let i=o.subarray(0,-1),a=o.at(-1);if(n.type!=="tr")throw new Error(`${r} tapLeafScript requires a taproot prevout`);if(!e?.internalKey||!Array.isArray(e.merklePath))throw new Error(`${r} has malformed tapLeafScript control data`);let s=Kw("TapLeaf",Buffer.from([a]),Buffer.from(R2.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Kw("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=M2.taprootTweakPubkey(e.internalKey,s);if(!Buffer.from(c).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==a)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function Yw(e,t){let n=dt(e,t);try{let r=Buffer.from(n,"base64");if(!r.length||r.toString("base64")!==n||r.subarray(0,5).toString("hex")!=="70736274ff")throw new Error("bad PSBT encoding or magic");let o=B2.fromPSBT(r);if(o.global?.unknown?.length||o.global?.proprietary?.length)throw new Error(`${t} contains opaque unknown/proprietary global fields`);let i=Array.from({length:o.inputsLength},(s,c)=>{let l=o.getInput(c);for(let p of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(H2(l[p]))throw new Error(`${t} contains signed/finalized input ${c}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${c} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${c} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${c} requires witnessUtxo value and script`);let u=Gw(l.witnessUtxo.script,`${t} input ${c} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${c} uses SIGHASH_DEFAULT for a non-taproot prevout`);let d=(l.tapLeafScript||[]).map(([p,f],m)=>z2(p,f,u,`${t} input ${c} tapLeafScript ${m}`));return{txid:Buffer.from(l.txid).toString("hex"),vout:Number(l.index),sequence:Number(l.sequence),valueSats:BigInt(l.witnessUtxo.amount).toString(),scriptHex:Buffer.from(l.witnessUtxo.script).toString("hex"),sighashType:l.sighashType,tapLeafScripts:d}}),a=Array.from({length:o.outputsLength},(s,c)=>{let l=o.getOutput(c);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${c} contains opaque unknown/proprietary fields`);return Gw(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:j2(o),inputs:i,outputs:a,feeSats:o.fee.toString(),vsizeLowerBound:o.unsignedTx.length}}catch(r){throw new Error(`ordinals mint: invalid ${t}; decoded PSBT required (${r?.message||"decode failed"})`)}}function V2(e){let t=Buffer.from(e);if(t.length!==36)throw new Error("ordinals mint: inscription envelope parent linkage must be 36 bytes");return`${Buffer.from(t.subarray(0,32)).reverse().toString("hex")}i${t.readUInt32LE(32)}`}function W2(e){if(Number.isInteger(e)&&e>=1&&e<=16)return e;if(e instanceof Uint8Array&&e.length===1&&e[0]>=1&&e[0]<=16)return e[0]}var G2=new Set([1,3]);function K2(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=W2(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!G2.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let s=r.get(i)||[];s.push(Buffer.from(a)),r.set(i,s)}if(e[n++]!==0)throw new Error("ordinals mint: malformed inscription envelope body separator");let o=[];for(;n<e.length&&e[n]!=="ENDIF";){if(!(e[n]instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope body");o.push(Buffer.from(e[n++]))}if(e[n]!=="ENDIF")throw new Error("ordinals mint: unterminated inscription envelope");return{fields:r,content:Buffer.concat(o)}}function Y2(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=$2.decode(u)}catch(p){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${p?.message||"script decode failed"})`)}for(let p=0;p+2<d.length;p+=1)d[p]===0&&d[p+1]==="IF"&&d[p+2]instanceof Uint8Array&&Buffer.from(d[p+2]).equals(Buffer.from("ord","ascii"))&&o.push(K2(d,p))}if(o.length===0)throw new Error("ordinals mint: missing tapLeafScript inscription envelope");if(o.length!==1)throw new Error("ordinals mint: ambiguous tapLeafScript inscription envelope");let i=o[0],a=i.fields.get(1)||[];if(a.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let s;try{s=new TextDecoder("utf-8",{fatal:!0}).decode(a[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(s!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(ti("sha256").update(i.content).digest("hex")!==t)throw new Error("ordinals mint: inscription envelope content SHA-256 does not match contentHash");let l=i.fields.get(3)||[];if(r!=null){if(l.length!==1||V2(l[0])!==r)throw new Error("ordinals mint: inscription envelope parent linkage does not match parentId")}else if(l.length!==0)throw new Error("ordinals mint: unexpected inscription envelope parent linkage")}function Xw(e){return{txid:e.txid,vout:e.vout,sequence:e.sequence,valueSats:e.valueSats,scriptHex:e.scriptHex,sighashType:e.sighashType,outpoint:`${e.txid}:${e.vout}`}}function X2(e){let t=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|signedPsbt|signedTransaction|rawTransaction|txHex)$/i,n=r=>{if(!(!r||typeof r!="object"))for(let[o,i]of Object.entries(r)){if(t.test(o))throw new Error(`ordinals mint: ${o} refused; private/signed material is outside this prepare-only adapter`);n(i)}};if(n(e),e.sign===!0||e.execute===!0||e.broadcast===!0||e.submit===!0)throw new Error("ordinals mint: sign/broadcast/execute refused; adapter is prepare-only")}function tx(e,t="parentId"){let n=dt(e,t).toLowerCase();if(!/^[0-9a-f]{64}i\d+$/.test(n))throw new Error(`ordinals mint: ${t} must be a canonical inscription id`);return n}function nx(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=dt(e.txid,`commitInputs[${t}].txid`).toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`ordinals mint: commitInputs[${t}].txid must be 64 hex`);let r=Number(e.vout);if(!Number.isSafeInteger(r)||r<0||r>4294967295)throw new Error(`ordinals mint: commitInputs[${t}].vout invalid`);let o=nn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function Q2(e,{recipient:t,parentId:n,postageSats:r}){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: revealOutputs required");let o=e.map((a,s)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${s} invalid`);return{role:dt(a.role,`revealOutputs[${s}].role`),address:dt(a.address,`revealOutputs[${s}].address`),valueSats:nn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:ex(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:tx(a.parentId,`revealOutputs[${s}].parentId`)}}}),i=o.filter(a=>a.role==="inscription");if(i.length!==1)throw new Error("ordinals mint: exactly one inscription reveal output required");if(i[0].address!==t)throw new Error("ordinals mint: reveal destination mutation refused");if(i[0].valueSats!==r)throw new Error("ordinals mint: reveal postage does not match bound postageSats");if(i[0].parentId!==n)throw new Error("ordinals mint: missing or mutated parent linkage on inscription output");return o}function J2(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:dt(n?.role,`commitOutputs[${r}].role`),valueSats:nn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:ex(n?.scriptHex,`commitOutputs[${r}].scriptHex`)}));if(t.filter(n=>n.role==="reveal").length!==1)throw new Error("ordinals mint: exactly one commit reveal output required");return t}function Qw(e,t,n){if(e.length!==t.length||e.some((r,o)=>r.valueSats!==t[o].valueSats||r.scriptHex!==t[o].scriptHex))throw new Error(`ordinals mint: actual ${n} outputs do not match reviewed outputs`)}function Jw(e,t,n){try{return Buffer.from(Zw.encode(O2(q2(t)).decode(e))).toString("hex")}catch(r){throw new Error(`ordinals mint: ${n} must be a valid address for ${t} (${r?.message||"decode failed"})`)}}function Z2(e,t){let n=e.commitPsbtInputs??e.psbtInputs;if(n==null)return;if(!Array.isArray(n))throw new Error("ordinals mint: commitPsbtInputs must be an array");let r=n.map((i,a)=>nx({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function eR(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");X2(e);for(let C of["content","contentBytes","body","file","path","url","contentUrl"])if(e[C]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let C of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[C]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=dt(e.network,"network").toLowerCase();if(!U2.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=dt(e.contentHash??e.contentSha256??e.sha256,"contentHash").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new Error("ordinals mint: contentHash must be a 32-byte SHA-256 hex digest");let o=dt(e.contentType??e.mimeType,"contentType").toLowerCase();if(!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(o))throw new Error("ordinals mint: invalid contentType");let i=tx(e.parentId??e.parentInscriptionId),a=dt(e.recipient??e.destination,"recipient"),s=nn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString();if(!Array.isArray(e.commitInputs)||e.commitInputs.length===0)throw new Error("ordinals mint: exact commitInputs required");let c=e.commitInputs.map(nx);if(new Set(c.map(C=>C.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");Z2(e,c);let l=Yw(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=Yw(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=J2(e.commitOutputs),p=Q2(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((C,L)=>C.txid!==c[L].txid||C.vout!==c[L].vout||C.valueSats!==c[L].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Qw(l.outputs,d,"commit PSBT"),Qw(u.outputs,p,"reveal PSBT");let f=Jw(a,n,"recipient");if(p.find(C=>C.role==="inscription").scriptHex!==f)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[C,L]of p.entries())if(L.scriptHex!==Jw(L.address,n,`revealOutputs[${C}].address`))throw new Error(`ordinals mint: reveal output ${C} script does not pay its bound address`);let m=d.findIndex(C=>C.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(C=>C.txid===l.txid&&C.vout===m);if(h.length!==1||h[0].valueSats!==d[m].valueSats||h[0].scriptHex!==d[m].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");Y2(u,{contentHash:r,contentType:o,parentId:i});let b=dd(e.commitFeeRateSatVb,"commitFeeRateSatVb"),x=dd(e.revealFeeRateSatVb,"revealFeeRateSatVb"),w=dd(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(w<=0||b>w||x>w)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let g=nn(e.commitFeeSats,"commitFeeSats"),y=nn(e.revealFeeSats,"revealFeeSats"),v=nn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(g+y>v)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==g.toString()||u.feeSats!==y.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(g)/l.vsizeLowerBound>b||Number(y)/u.vsizeLowerBound>x)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(C=>C.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let I=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:nn(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(I.enabled){if(!Number.isSafeInteger(I.outputIndex)||I.outputIndex<0||p[I.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[I.outputIndex].valueSats!==I.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(C=>C.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let _=Number(t.nowMs??Date.now()),T=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(T)||T<=_||T-_>F2)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:a,postageSats:s,commitInputs:l.inputs.map(Xw),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(Xw),revealPsbt:u.encoded,revealOutputs:p,commitRate:b,revealRate:x,maxRate:w,commitFee:g.toString(),revealFee:y.toString(),maxTotalFee:v.toString(),rbf:e.rbf,cpfp:I,expiresAt:T}}function tR(e={},t={}){let n=eR(e,t),r=n.commitInputs.find(s=>Ww.has(s.outpoint));if(r)throw new Error(`ordinals mint: commit UTXO ${r.outpoint} already reserved; reuse refused`);let o=Object.freeze({...t.feeConfig||e.feeConfiguration||{}}),i={provider:zw,kind:Vw,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...D2},feeConfiguration:o,plan:{version:1,network:n.network,content:{sha256:n.contentHash,type:n.contentType,mutable:!1},parentId:n.parentId,recipient:n.recipient,postageSats:n.postageSats,commit:{unsignedPsbt:n.commitPsbt,inputs:n.commitInputs,outputs:n.commitOutputs,feeRateSatVb:n.commitRate,feeSats:n.commitFee,rbf:n.rbf},reveal:{unsignedPsbt:n.revealPsbt,inputs:n.revealInputs,outputs:n.revealOutputs,feeRateSatVb:n.revealRate,feeSats:n.revealFee,cpfp:n.cpfp},caps:{maxFeeRateSatVb:n.maxRate,maxTotalFeeSats:n.maxTotalFee},expiresAt:n.expiresAt,maxExecutions:1},note:"Unsigned commit/reveal PSBT plan only. Sign and broadcast in a user-controlled Bitcoin wallet; inscription numbers are not stable before confirmation."},a=N(i,{provider:zw,kind:Vw,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Ww.add(s.outpoint);return a}var rx=tR;var rR=Object.freeze([Rn.DISCOVERY,Rn.ELIGIBILITY,Rn.PREPARATION,Rn.SIMULATION]),ox=[["evm.manifold","evm",["manifold"],["mint","claim"],"evm","manifold"],["evm.zora","evm",["zora"],["mint"],"evm","zora"],["evm.thirdweb","evm",["thirdweb"],["mint","claim"],"evm","thirdweb"],["evm.opensea-seadrop","evm",["opensea"],["mint","seadrop"],"opensea",null],["solana.metaplex-core","solana",["metaplex"],["mint"],"solana",as.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",as.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",as.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],ix=Object.freeze(ox.map(([e,t,n,r])=>Object.freeze({id:e,family:t,chainFamilies:Object.freeze([t]),marketplaces:Object.freeze(n),mechanisms:Object.freeze(r),enabled:t!=="solana",capabilities:t==="solana"?Object.freeze([Rn.DISCOVERY]):rR,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),bU=sd(ix.map(({family:e,tier:t,enabled:n,...r})=>r)),ax=new Map(ox.map(e=>[e[0],e])),oR=new Set(["intent","adapterId","input"]),iR=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,ss=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ue(e,t,n){throw new ss(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&ue("intent-mismatch",`${n} does not match canonical intent`)}function Ae(e,t,n){let r=e[t];return r.unit!==n&&ue("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function sx(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))iR.test(n)&&ue("custody-refused",`${t}.${n} is outside the prepare-only boundary`),sx(r,`${t}.${n}`)}function aR(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function sR(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ue("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ue("intent-mismatch","stageId does not match canonical intent"),M(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${nR("sha256").update(JSON.stringify(aR(n,t))).digest("hex")}`;M(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),s=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(a)||!Number.isSafeInteger(s))&&ue("invalid-request","decoded input requires exact stage bounds"),M(a,o.startsAt.value,"stage start"),M(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&ue("expired-intent","canonical mint stage is not active at authoritative now"),o}function cR(e,t){let n=ax.get(t);n||ue("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return M(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&ue("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function lR(e,t){e.chain.family==="evm"?(M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.maxValueWei??t.maxTotalWei,Ae(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Ae(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Ae(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Ae(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Ae(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Ae(e,"priorityFeeCap","lamports"),"priority-fee cap")):(M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function uR(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==dn(e))&&ue("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ue("custody-refused","leaf artifact is not strictly prepare-only")}function dR(e,t,n){M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity");let r=Ae(e,"mintValueCap","wei"),o=Ae(e,"networkFeeCap","wei"),i=Ae(e,"priorityFeeCap","wei-per-gas");M(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||ue("artifact-mismatch","prepared EVM transaction is missing"),M(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&ue("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(a.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&ue("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),M(n.contract,e.collection,"artifact collection/drop"),M(n.recipient??n.buyer,e.recipient,"artifact recipient"),M(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&ue("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function pR(e,t,n){M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Ae(e,"mintValueCap","lamports"),"mint-value cap");let r=Ae(e,"networkFeeCap","lamports"),o=Ae(e,"priorityFeeCap","lamports");M(t.networkFeeCapLamports,r,"network-fee cap"),M(t.priorityFeeCapLamports,o,"priority-fee cap"),M(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let s of a.instructions)if(String(s.decoded?.type).toLowerCase().includes("price")){let c=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(c)*BigInt(s.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&ue("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function mR(e,t,n){return M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),M(n.plan.network,e.chain.id,"artifact network"),M(n.plan.parentId,e.collection,"artifact collection/drop"),M(n.plan.recipient,e.recipient,"artifact recipient"),M(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),M(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),M(n.plan.caps.maxFeeRateSatVb,e.priorityFeeCap.amount,"artifact priority-fee cap"),{networkFee:(BigInt(n.plan.commit.feeSats)+BigInt(n.plan.reveal.feeSats)).toString(),priorityFee:String(n.plan.caps.maxFeeRateSatVb)}}function pd(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:ix})}async function cx(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:pd()}}async function lx(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ue("invalid-request","request must be a plain object");for(let u of Object.keys(e))oR.has(u)||ue("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ue("invalid-request","explicit adapterId is required; adapter inference is refused"),ax.has(e.adapterId)||ue("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ue("invalid-request","family-specific decoded input is required"),sx(n);let r;try{r=od(e.intent)}catch(u){ue("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ue("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ue("expired-intent","canonical mint intent has expired");let i=cR(r,e.adapterId);i[1]==="solana"&&ue("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=sR(r,n,r.chain.family,o);lR(r,n);let s;try{i[4]==="evm"?s=await qw(i[5],n,t):i[4]==="opensea"?s=await Ci(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await Hw(n,t)):s=await rx(n,t)}catch(u){if(u instanceof ss)throw u;ue("adapter-refused",u?.message||"adapter preparation failed",u)}uR(s);let c=i[4]==="bitcoin"?mR(r,n,s):i[4]==="solana"?pR(r,n,s):dR(r,n,s),l=Object.freeze({intentHash:Fw(r),adapterId:e.adapterId,family:r.chain.family,network:r.chain.id,marketplace:r.marketplace,mechanism:r.mechanism,collection:r.collection,recipient:r.recipient,quantity:String(r.quantity),stageId:a.id,proofDigest:a.eligibility.proofDigest,mintValueCap:r.mintValueCap,networkFeeCap:r.networkFeeCap,priorityFeeCap:r.priorityFeeCap,observedNetworkFee:c.networkFee,observedPriorityFee:c.priorityFee});return N({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:s},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(s.expiresAt))})}var md="ROUTE_ONLY",fd=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),dx=new Set(Object.values(fd)),hR=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),gR=new Set(["amount","currency"]),yR=new Set(["value","unit"]),bR=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),wR=new Set(["provider","operations"]),se=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function Ar(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new se(`${t} must be a plain object`);return e}function ni(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new se(`${n} has unknown field ${r}`,"unknown-field")}function ge(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new se(`${t} must be an exact non-empty string`);return e}function px(e,t,{positive:n=!1}={}){if(e=ge(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new se(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function Er(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new se(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>ge(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new se(`${t} contains duplicates`);return r}function mx(e,t){return e=Ar(e,t),ni(e,gR,t),{amount:px(e.amount,`${t}.amount`),currency:ge(e.currency,`${t}.currency`)}}function ux(e,t){if(!Array.isArray(e))throw new se(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>mx(n,`${t}[${r}]`))}function xR(e){if(e=Ar(e,"expiry"),ni(e,yR,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new se("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function vR(e,t,n){Object.hasOwn(e,n)&&(t[n]=ge(e[n],n))}function fx(e){e=Ar(e,"intent"),ni(e,hR,"intent");let t=ge(e.action,"action");if(!dx.has(t))throw new se(`unsupported action ${t}`,"invalid-action");let n={action:t,family:ge(e.family,"family"),network:ge(e.network,"network"),standard:ge(e.standard,"standard"),collection:ge(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])vR(e,n,o);let r=["tokenId","mint","inscription"].filter(o=>Object.hasOwn(n,o));if(t==="mint"){if(r.length!==0||n.outpoint)throw new se("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new se("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new se("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=ge(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new se("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=ge(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=ge(e.sender,"sender"))}else n.owner=ge(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=ge(e.recipient,"recipient")),n.quantity=px(e.quantity,"quantity",{positive:!0}),n.marketplace=ge(e.marketplace,"marketplace"),n.protocol=ge(e.protocol,"protocol"),n.artifactKind=ge(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new se(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=mx(e.price,"price"),n.expiry=xR(e.expiry),n.fees=ux(e.fees,"fees"),n.royalties=ux(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=ge(e.listingId,"listingId")),n}function SR(e){e=Ar(e,"adapter"),ni(e,bR,"adapter");let t=Er(e.actions,"adapter.actions");for(let o of t)if(!dx.has(o))throw new se(`adapter has unknown action ${o}`,"invalid-action");let n=Ar(e.surface,"adapter.surface");ni(n,wR,"adapter.surface");let r=Ar(n.operations,"adapter.surface.operations");for(let o of t)ge(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new se(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:ge(e.id,"adapter.id"),family:ge(e.family,"adapter.family"),networks:Object.freeze(Er(e.networks,"adapter.networks")),standards:Object.freeze(Er(e.standards,"adapter.standards")),marketplaces:Object.freeze(Er(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(Er(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(Er(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:md,custody:"user",surface:Object.freeze({provider:ge(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function kR(e=[]){if(!Array.isArray(e))throw new se("entries must be an array");let t=e.map(SR);if(new Set(t.map(r=>r.id)).size!==t.length)throw new se("adapter ids must be unique","duplicate-adapter");function n(r,o){return t.filter(i=>i.family===r.family&&i.networks.includes(r.network)&&i.standards.includes(r.standard)&&i.marketplaces.includes(r.marketplace)&&i.protocols.includes(r.protocol)&&i.artifactKinds.includes(r.artifactKind)&&(!o||i.actions.includes(r.action)))}return Object.freeze({tier:md,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=fx(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new se("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new se(`adapter lacks ${o.action}`,"unsupported-operation"):new se("no exact adapter route","unsupported-operation")}})}var Ir=(e,t,n,r,o,i,a,s,c,l)=>({id:e,family:t,networks:n,standards:r,marketplaces:o,protocols:i,artifactKinds:a,actions:s,surface:{provider:c,operations:l}}),hd=kR([Ir("opensea-evm-market","evm",["eip155:1","eip155:10","eip155:137","eip155:8453","eip155:42161","eip155:4663"],["erc721","erc1155"],["opensea"],["seaport","seadrop"],["provider-request"],["mint","list","cancel_listing"],"opensea-nft",{mint:"prepareMint",list:"prepareList",cancel_listing:"prepareCancel"}),Ir("evm-asset-safe-transfer","evm",["eip155:1","eip155:10","eip155:137","eip155:8453","eip155:42161","eip155:4663"],["erc721","erc1155"],["none"],["erc721","erc1155"],["evm-safe-transfer"],["send"],"universal-evm-nft-transfer",{send:"prepare"}),Ir("magic-eden-solana-market","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["magic-eden"],["magic-eden-solana"],["solana-transaction"],["buy","list"],"magiceden-sol",{buy:"prepareBuy",list:"prepareList"}),Ir("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Ir("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Ir("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function hx(e,{access:t="public",feeProfile:n="default",registry:r=hd,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new se("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new se("nowMs must be a non-negative safe integer","invalid-expiry");let i=fx(e);if(i.expiry&&o>=i.expiry.value)throw new se("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:md,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:ge(n,"feeProfile"),fees:Object.freeze({oracle:"0",currency:"none"}),adapterId:a.id,surface:Object.freeze({provider:a.surface.provider,operation:a.surface.operations[i.action]}),intent:Object.freeze(i)})}Z();var ls="universal-evm-nft-transfer",gx="evm-nft-safe-transfer",IR=1800*1e3,AR=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),_R=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function yx(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(_R.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);yx(r,t)}}}function gd(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n)||/^0x0{40}$/.test(n))throw new Error(`evm nft transfer: valid non-zero ${t} address required`);return n}function Ln(e,t,{positive:n=!1,safe:r=!1}={}){let o=String(e??"").trim();if(!/^\d+$/.test(o))throw new Error(`evm nft transfer: ${t} must be an unsigned integer`);let i=BigInt(o);if(i>=1n<<256n||n&&i===0n)throw new Error(`evm nft transfer: ${t} is out of range`);if(r&&i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`evm nft transfer: ${t} is out of range`);return i}var ri=e=>e.toString(16).padStart(64,"0"),cs=e=>e.slice(2).padStart(64,"0");function TR(e,t,n,r,o){return e==="erc721"?`0x42842e0e${cs(t)}${cs(n)}${ri(r)}`:`0xf242432a${cs(t)}${cs(n)}${ri(r)}${ri(o)}${ri(160n)}${ri(0n)}`}function CR(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(yx(e),["sign","execute","broadcast","submit"].some(h=>e[h]===!0))throw new Error("evm nft transfer: execution refused; adapter is prepare-only");let n=String(e.standard??e.tokenStandard??"").toLowerCase().replace("-","");if(n!=="erc721"&&n!=="erc1155")throw new Error("evm nft transfer: standard must be exact ERC-721 or ERC-1155");let r=Ln(e.chainId,"chainId",{positive:!0,safe:!0}),o=gd(e.sender??e.from,"sender"),i=gd(e.recipient??e.to,"recipient"),a=gd(e.contract??e.contractAddress??e.tokenContract,"contract"),s=Ln(e.tokenId,"tokenId"),c=Ln(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(Ln(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=Ln(e.gasLimit,"gasLimit",{positive:!0}),u=Ln(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=Ln(e.maxPriorityFeePerGasWei??e.maxPriorityFeePerGas,"maxPriorityFeePerGasWei");if(d>u)throw new Error("evm nft transfer: priority fee cap exceeds max fee cap");if(e.reviewed!==!0&&e.userConfirmed!==!0)throw new Error("evm nft transfer: reviewed=true required after reviewing chain, parties, NFT, quantity, fee caps, and expiry");let p=Number(e.expiresAt??e.expiry??e.expiresAtMs);if(!Number.isSafeInteger(p)||p<=Number(t)||p-Number(t)>IR)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let f=TR(n,o,i,s,c),m=e.calldata??e.data;if(m!=null&&String(m).toLowerCase()!==f)throw new Error("evm nft transfer: calldata mutation refused; only canonical safeTransferFrom is allowed");return{standard:n,chainId:Number(r),sender:o,recipient:i,contract:a,tokenId:s.toString(),quantity:c.toString(),gasLimit:l.toString(),maxFeePerGasWei:u.toString(),maxPriorityFeePerGasWei:d.toString(),expiresAt:p,data:f}}function bx(e={},t={}){let n=CR(e,t),r={provider:ls,kind:gx,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...AR},fee:{oracleFeeBps:0,oracleFeeWei:"0"},transfer:{standard:n.standard,sender:n.sender,recipient:n.recipient,contract:n.contract,tokenId:n.tokenId,quantity:n.quantity},transaction:{chainId:n.chainId,from:n.sender,to:n.contract,data:n.data,value:"0",gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei},caps:{gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei,nativeValueWei:"0"},reviewed:!0,note:"Unsigned exact safeTransferFrom only; sign and broadcast in a user-controlled wallet."};return N(r,{provider:ls,kind:gx,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}Z();var us="universal-solana-nft-transfer",wx="solana-verified-nft-transfer",vx="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",$n=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),xx=new Set(Object.values($n)),NR=new Set([$n.token,$n.token2022]),OR=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),RR=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function te(e){throw new Error(`solana nft transfer: ${e}`)}function pt(e,t){let n=String(e??"").trim();return n||te(`${t} required`),n}function wt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||te(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&te(`${t} must be positive`),r}function we(e,t,n){String(e??"")!==String(t)&&te(`${n} mismatch; mutation refused`)}function Sx(e,t="request",n=new Set){if(!(!e||typeof e!="object"||n.has(e))){n.add(e);for(let[r,o]of Object.entries(e))RR.test(r)&&o!=null&&o!==!1&&te(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),Sx(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&te(`${r} refused; adapter is prepare-only`)}}function LR(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&te(`${t} must be decoded`),Array.isArray(e.accounts)||te(`${t} decoded accounts required`),e.decoded}function $R(e,t,n){for(let r of e.accounts){let o=pt(r.pubkey,"account pubkey");t.has(o)||te(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&te(`unexpected writable account ${o}`)}}function BR(e={}){(!e||typeof e!="object"||Array.isArray(e))&&te("request object required"),Sx(e),(e.network!=="mainnet-beta"||e.genesisHash!==vx)&&te("mainnet genesis/network mismatch"),e.reviewed!==!0&&te("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=pt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&te("standard must be metaplex or core");let n=pt(e.mint??e.asset,"mint/asset"),r=pt(e.collection,"collection");e.collectionVerified!==!0&&te("verified collection required");let o=pt(e.owner,"owner"),i=pt(e.recipient,"recipient"),a=wt(e.quantity,"quantity",{positive:!0}),s=wt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&te("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&te("Core quantity must be exactly 1");let c=pt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==$n.core:!NR.has(c))&&te("reviewed transfer program mismatch");let l=t==="metaplex"?pt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?pt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&we(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(wt(e.decimals??0,"decimals")):null,p=wt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),f=wt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),m=wt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*f+999999n)/1000000n;h>m&&te("priority fee exceeds reviewed cap");let b=wt(e.networkFeeLamports,"networkFeeLamports"),x=wt(e.networkFeeCapLamports,"networkFeeCapLamports");b>x&&te("network fee cap exceeded");let w=e.transaction;(!w||typeof w!="object"||Array.isArray(w))&&te("transaction object required"),w.version!==0&&w.version!=="legacy"&&te("transaction version must be 0 or legacy");let g=pt(w.recentBlockhash,"recentBlockhash");we(g,e.approvedBlockhash,"blockhash mutation after approval");let y=wt(w.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),v=wt(e.currentBlockHeight,"currentBlockHeight");v>y&&te("expired blockhash"),(!Array.isArray(w.instructions)||w.instructions.length<3)&&te("canonical instructions required");let S=new Set([o,n,l,u].filter(Boolean)),E=new Set([o,i,n,r,l,u,...xx].filter(Boolean)),I=0,_=0,T=0,C=0;for(let[L,X]of w.instructions.entries()){let Q=pt(X.programId,`instructions[${L}].programId`);xx.has(Q)||te(`unknown program ${Q}`);let O=LR(X,`instructions[${L}]`);$R(X,E,S);let q=String(O.type??O.instruction??"").toLowerCase();Q===$n.computeBudget?q.includes("limit")?(we(O.units??O.computeUnitLimit,p,"compute-unit limit"),I++):q.includes("price")?(we(O.microLamports??O.computeUnitPriceMicroLamports,f,"compute-unit price"),_++):te("unsupported compute budget instruction"):Q===$n.associatedToken?((t!=="metaplex"||q!=="createassociatedtokenaccountidempotent")&&te("non-canonical associated token instruction"),we(O.payer,o,"ATA payer"),we(O.owner,i,"ATA recipient"),we(O.mint,n,"ATA mint"),we(O.tokenAccount,u,"recipient ATA"),we(O.tokenProgramId,c,"ATA token program"),C++):t==="metaplex"&&Q===c?(q!=="transferchecked"&&te("only canonical transferChecked is allowed"),we(O.mint,n,"mint"),we(O.owner,o,"owner"),we(O.recipient,i,"recipient"),we(O.sourceTokenAccount,l,"source token account"),we(O.destinationTokenAccount,u,"recipient ATA"),we(O.amount,a,"quantity"),we(O.decimals,d,"decimals"),T++):t==="core"&&Q===$n.core?(q!=="transfer"&&te("only canonical Core transfer is allowed"),we(O.asset,n,"mint/asset"),we(O.collection,r,"collection"),O.collectionVerified!==!0&&te("verified collection required in Core instruction"),we(O.owner,o,"owner"),we(O.newOwner,i,"recipient"),we(O.amount??1,1,"quantity"),T++):te(`program ${Q} is not valid for ${t} transfer`)}return(I!==1||_!==1)&&te("exactly one compute-unit limit and price instruction required"),T!==1&&te("exactly one canonical transfer instruction required"),t==="metaplex"&&C>1&&te("at most one idempotent recipient ATA instruction allowed"),{standard:t,mint:n,collection:r,owner:o,recipient:i,quantity:a.toString(),maxEditionQuantity:s.toString(),tokenProgramId:c,sourceTokenAccount:l,recipientTokenAccount:u,decimals:d,recentBlockhash:g,lastValidBlockHeight:y.toString(),currentBlockHeight:v.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:f.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:m.toString(),networkFeeLamports:b.toString(),networkFeeCapLamports:x.toString(),transaction:w}}function kx(e={},t={}){let n=BR(e),r=Number(t.nowMs??Date.now()),o={provider:us,kind:wx,chain:"solana-mainnet-beta",genesisHash:vx,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...OR},fee:{oracleFeeBps:0,oracleFeeLamports:"0"},transfer:{standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:!0,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,...n.sourceTokenAccount?{sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,decimals:n.decimals}:{}},transaction:{unsigned:!0,version:n.transaction.version,recentBlockhash:n.recentBlockhash,lastValidBlockHeight:n.lastValidBlockHeight,instructions:structuredClone(n.transaction.instructions)},caps:{currentBlockHeight:n.currentBlockHeight,computeUnitLimit:n.computeUnitLimit,computeUnitPriceMicroLamports:n.computeUnitPriceMicroLamports,priorityFeeLamports:n.priorityFeeLamports,priorityFeeCapLamports:n.priorityFeeCapLamports,networkFeeLamports:n.networkFeeLamports,networkFeeCapLamports:n.networkFeeCapLamports},reviewed:!0};return N(o,{provider:us,kind:wx,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}Z();var ds="universal-ordinals-transfer",Ex="bitcoin-ordinals-transfer-plan",Ix=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),FR=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ie(e){throw new Error(`ordinals transfer: ${e}`)}function on(e,t){let n=String(e??"").trim();return n||ie(`${t} required`),n}function rn(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ie(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ie(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ie(`${t} out of range`),o}function Ax(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ie(`${t} must be positive`),n}function Px(e,t){let n=on(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ie(`${t} must be 64 hex`),n}function Nx(e,t="inscriptionId"){let n=on(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ie(`${t} must be canonical`),n}function Ox(e,t="request"){if(!e||typeof e!="object")return;let n=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|partialSig|partialSigs|signedPsbt|signedTransaction|rawTransaction|txHex|finalized|finalScriptSig|finalScriptWitness)$/i;for(let[r,o]of Object.entries(e))n.test(r)&&o!=null&&o!==!1&&ie(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Ox(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ie(`${r} bypass refused; adapter is prepare-only`)}function Rx(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ie(`${t}.${n} arbitrary script refused; use a bound address`)}function _x(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Rx(e,t);let n=Px(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ie(`${t}.vout invalid`),{txid:n,vout:r,valueSats:rn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:on(e.address,`${t}.address`),sequence:Number(rn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function Tx(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Rx(e,t),{role:on(e.role,`${t}.role`),address:on(e.address,`${t}.address`),valueSats:rn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:Nx(e.inscriptionId,`${t}.inscriptionId`)}}}function Cx(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ie(`${n} mismatch; mutation refused`)}function UR(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ie("request object required"),Ox(e);let t=on(e.network,"network").toLowerCase(),n=Px(e.genesisHash,"genesisHash");(!Ix[t]||n!==Ix[t])&&ie("network/genesis mismatch");let r=Nx(e.inscriptionId),o=_x(e.ownerInput,"ownerInput");on(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ie("current inscription outpoint mismatch");let i=on(e.destination,"destination"),a=rn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:Tx(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ie("exact change output invalid");let c=Ax(e.feeRateSatVb,"feeRateSatVb"),l=Ax(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ie("fee rate exceeds reviewed cap");let u=rn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=rn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ie("total fee exceeds reviewed cap");let p=Number(rn(e.locktime,"locktime",{max:0xffffffffn})),f=Number(rn(e.sequence,"sequence",{max:0xffffffffn}));f<4294967294&&ie("RBF sequence refused"),o.sequence!==f&&ie("owner input sequence mismatch");let m=e.psbt;(!m||typeof m!="object"||Array.isArray(m))&&ie("decoded PSBT plan required"),(m.version!==0||m.unsigned!==!0)&&ie("PSBT v0 must be explicitly unsigned"),Number(m.locktime)!==p&&ie("PSBT locktime mismatch"),(!Array.isArray(m.inputs)||m.inputs.length!==1)&&ie("exactly one PSBT input required; extra inputs refused"),Cx(_x(m.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(m.outputs)?m.outputs.map((g,y)=>Tx(g,`psbt.outputs[${y}]`)):ie("PSBT outputs required"),b={role:"inscription",address:i,valueSats:a,inscriptionId:r};Cx(h,s?[b,s]:[b],"exact PSBT outputs"),h.filter(g=>g.role==="inscription"&&g.inscriptionId===r).length!==1&&ie("exactly one inscription-carrying output required");let w=h.reduce((g,y)=>g+BigInt(y.valueSats),0n);return BigInt(o.valueSats)!==w+u&&ie("input/output/fee conservation mismatch; inscription burn or fee widening refused"),{network:t,genesisHash:n,inscriptionId:r,currentOutpoint:o.outpoint,ownerInput:o,destination:i,postageSats:a,changeOutput:s,feeRateSatVb:c,maxFeeRateSatVb:l,totalFeeSats:u.toString(),maxTotalFeeSats:d.toString(),locktime:p,sequence:f,psbt:{version:0,unsigned:!0,locktime:p,inputs:[o],outputs:h}}}function Lx(e={},t={}){let n=UR(e);return N({provider:ds,kind:Ex,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...FR},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:ds,kind:Ex,env:t.env})}he();function qR(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();if(/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),e.expiresAt!=null){let o=Number(e.expiresAt);Number.isFinite(o)?o<=t&&n.push("grant has expired"):n.push("grant.expiresAt must be a timestamp when supplied")}return{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}function $x(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),a=[];if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(i))return{status:"error",error:"chainId is required"};if(r!=="alert_only"&&r!=="execute")return{status:"ok",actionMode:"alert_only",requestedMode:r,downgraded:!0,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:null,notes:[`unrecognized actionMode ${JSON.stringify(r)} \u2014 defaulted to alert_only; only the exact string "execute" arms a trigger`]};let s=r;if(r==="execute")if(!kl(t.env||process.env))s="alert_only",a.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=qR(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(s="alert_only",a.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(s="alert_only",a.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return s==="alert_only"?a.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):a.push("ARMED until mint opens: this trigger will submit one prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:s,requestedMode:r,downgraded:s!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:s==="execute"?e.grant:null,armedUntil:s==="execute"?"mint-opens":null,notes:a}}async function Bx(e={},t={}){let n=t.rpcCall||U,r=String(e.contract||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r)||!Number.isInteger(o))return{status:"error",open:!1,error:"contract and chainId are required"};let i=[{selector:"0xeb8d2444",name:"saleIsActive()",openWhen:!0},{selector:"0x25fd90f3",name:"mintActive()",openWhen:!0},{selector:"0x68428a1b",name:"saleActive()",openWhen:!0},{selector:"0x22f3e2d4",name:"isActive()",openWhen:!0},{selector:"0x5c975abb",name:"paused()",openWhen:!1}];for(let a of i)try{let s=await n(o,"eth_call",[{to:r,data:a.selector},"latest"],t);if(s&&s!=="0x"){let c=BigInt(s)===1n;return{status:"ok",open:a.openWhen?c:!c,evidence:a.name,raw:s}}}catch{}return{status:"unknown",open:!1,notes:["no readable sale-state flag; cannot confirm the mint is open \u2014 will not fire on a guess"]}}var jR=1440*60*1e3;function zR(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),String(e.maxValueWei)!=="0"&&n.push("grant.maxValueWei must be 0 for Mancers free mints");let o=Number(e.expiresAt);return Number.isFinite(o)?o<=t?n.push("grant has expired"):o-t>jR&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}var Mx="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",VR=4663,WR="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Fx="a22cb465",GR="a0712d68";function yd(e){return String(e||"").trim().toLowerCase()}function _r(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function KR(e){let t=_r(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Fx}${t.padStart(64,"0")}${"0".repeat(64)}`}function YR(e){return _r(e).includes(_r(Mx))}function XR(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>_r(n?.data).startsWith(Fx))}function QR(e={},t){let n=_r(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return yd(i[0])!==WR?!1:_r(i[2])===n})}function JR(e=1){return`0x${GR}${BigInt(e).toString(16).padStart(64,"0")}`}function Ux(e={},t={}){let n=yd(e.contract),r=yd(e.minter),o=Number(e.chainId),i=e.valueWei==null?"0":String(e.valueWei),a=[];/^0x[a-f0-9]{40}$/.test(n)||a.push("contract must be a 0x address"),/^0x[a-f0-9]{40}$/.test(r)||a.push("minter must be a 0x address"),o!==VR&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),YR(e.bytecode||"")||a.push("bytecode does not reference Mancers 0x797a\u20268cA57 \u2014 no allowlist gate found");let s=e.simulation||{};s.willRevert===!0&&a.push("mint simulation reverts"),XR(s)&&a.push("simulation sets approval / setApprovalForAll"),QR(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:JR(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:KR(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Jh(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=zR(e.grant,{nowMs:t.nowMs});p.ok?p.contract!==n||p.chainId!==o?a.push("DOWNGRADED: grant does not match this contract/chain"):d=!0:a.push(`DOWNGRADED: ${p.problems.join("; ")}`)}return{status:c?"ok":"fail",verdict:c?"unknown-risk":"fail",failClosedPass:c,executeFire:d,oneShot:d,execution:"prepare-only",signed:!1,chainId:o,contract:n,minter:r,gate:Mx.toLowerCase(),reasons:a,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}$();Z();Wi();var eL="https://api.paraswap.io",bd=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||eL).replace(/\/$/,"");function Tr(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 wd(e={},t={}){let n=Number(e.chainId||1);return k(`${bd(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Tr(e.srcToken,"srcToken"),destToken:Tr(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 Vi({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(lf(o)))r.set(s,c);let i=await k(`${bd(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...re(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:a,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function Dx(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=Tr(e.userAddress,"userAddress"),o=await Cr(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Tr(e.srcToken,"srcToken"),destToken:Tr(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(s.receiver=Tr(e.receiver,"receiver"));let c=await k(`${bd(t)}/transactions/${n}`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??n)!==n)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==a)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return N({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:s.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:s.srcToken,spender:i.tokenTransferProxy||a,amount:s.srcAmount}:null,transaction:{chainId:n,from:c.from||r,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:fe(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function qx(e={}){let t=await wd({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}import{createHash as nL}from"node:crypto";import{getAddress as Gx,isAddress as xd}from"ethers";var Hx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",rL=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),oL=Object.freeze(["lifi"]),jx=/^0x[0-9a-fA-F]{64}$/,iL=/^\d+$/;function ye(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function zx(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ye(t,"must be a positive chainId"),n}function ps(e,t){let n=String(e??"").trim();return(!iL.test(n)||BigInt(n)<=0n)&&ye(t,"must be a positive integer string"),n}function aL(e,t){return e==null||e===""?null:ps(e,t)}function Vx(e,t){let n=String(e??"").trim();return n.toLowerCase()===Hx.toLowerCase()?Hx:(xd(n)||ye(t,"must be an EVM address or native token sentinel"),Gx(n))}function Kx(e,t){let n=String(e??"").trim();return xd(n)||ye(t,"must be an EVM address"),Gx(n)}function sL(e,t){return e==null||e===""?null:Kx(e,t)}function Wx(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ye(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function cL(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ye(r,"must be a finite millisecond timestamp"),o<=t&&ye(r,"expired"),o>t+n&&ye(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Pr(e){if(Array.isArray(e))return e.map(Pr);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Pr(e[n]));return t}return e}function lL(e){return JSON.stringify(Pr(e))}function ms(e){return`0x${nL("sha256").update(lL(e)).digest("hex")}`}function Yx(e,t){let n={...e};for(let r of t)delete n[r];return n}function uL(e){return ms(Yx(e,["intentHash"]))}function dL(e){return ms(Yx(e,["firmQuoteHash"]))}function vd(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ye("time","is invalid");let o=zx(e.fromChainId??e.fromChain,"fromChainId"),i=zx(e.toChainId??e.toChain,"toChainId"),s=o===i?rL:oL,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Vx(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Vx(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:ps(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Kx(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:cL(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:aL(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Wx(e.allowedSources,"allowedSources",s),allowedRouters:Wx(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?Pr(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ye("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):ms({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=uL(c),Object.freeze(c)}function pL(e){return(!e||typeof e!="object"||Array.isArray(e))&&ye("artifact","required"),e.typedDataHash!=null&&!jx.test(String(e.typedDataHash))&&ye("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!jx.test(String(e.calldataHash))&&ye("artifact.calldataHash","must be bytes32"),e.to!=null&&!xd(String(e.to))&&ye("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ye("artifact.data","must be hex"),Pr(e)}function Xx(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ye("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ye("quote expiry","required"),o<=r&&ye("quote","expired"),o>e.deadlineMs&&ye("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ye("source","required"),e.allowedSources.includes(i)||ye("source","not allowed by intent");let a=ps(t.amountOut??t.buyAmount,"amountOut"),s=ps(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&ye("minBuyAmount","exceeds amountOut");let c=pL(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||ye("quotedAtMs","must be finite");let u=sL(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:u,amountOut:a,minBuyAmount:s,quotedAtMs:Math.floor(l),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?Pr(t.metadata):{}};return d.quoteId||(d.quoteId=ms({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=dL(d),Object.freeze(d)}function oi(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Qx(e,t){return String(e?.[t]??"").trim()}function ii(e,t){return Object.freeze({source:e,run:t})}function mL(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let n=t.env??process.env,r=t.providers??{},o=t.supportedUniV3Chains??je,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return oi(e,"lifi")&&a.push(ii("lifi",async()=>{let c=await(r.lifiQuote??go)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),l=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:l?.toAmount??c?.toAmount,minBuyAmount:l?.toAmountMin??c?.toAmountMin??l?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await fL(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(oi(e,"paraswap")&&a.push(ii("paraswap",async()=>{let c=await(r.paraswapPrice??Cr)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),l=c?.priceRoute??c;return{quoteId:l?.id??null,amountOut:l?.destAmount,minBuyAmount:c?.amountOutMinimum??l?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:l},metadata:{contractAddress:l?.contractAddress??null}}})),oi(e,"0x")&&(Qx(n,"ZEROX_API_KEY")||Qx(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(ii("0x",async()=>{let c=await(r.zeroxQuote??bo)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),oi(e,"cow")&&a.push(ii("cow",async()=>{let c=await(r.cowQuote??Zn)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),l=c?.quote??c;return{quoteId:c?.id??null,amountOut:l?.buyAmount,minBuyAmount:l?.buyAmount,expiryMs:Math.min(Number(l?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:l},metadata:{solver:!0}}})),oi(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(ii("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Un)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),a}async function fL(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function hL(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function gL(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>hL(s,r))),i=[],a=[];for(let s=0;s<o.length;s++){let c=t[s],l=o[s];if(l.status==="rejected"){a.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(Xx(e,{...l.value,source:c.source},n))}catch(u){a.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:a}}function yL(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(a=>Number(a.expiryMs??0)>n);r.sort((a,s)=>{let c=BigInt(s.minBuyAmount??0)-BigInt(a.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(s.amountOut??0)-BigInt(a.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(a=>({...a,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Jx(e,t={}){let n=mL(e,t),{quotes:r,failed:o}=await gL(e,n,t),i=yL(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}function Zx(e={},t={}){return vd(e,t)}async function ev(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:vd(e,t);return Jx(n,t)}async function tv(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}$();var wL="https://app.across.to";function Sd(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||wL).replace(/\/$/,"")}async function nv(e={}){try{let t=await k(`${Sd(e)}/api/pools?token=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t.totalPoolSize=="string",provider:"across-bridge",l1Token:t.l1Token}}catch(t){return{ok:!1,provider:"across-bridge",error:String(t.message||t).slice(0,120)}}}async function rv(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return k(`${Sd(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ov(e={},t={}){let n=new URLSearchParams;return e.originChainId&&n.set("originChainId",String(e.originChainId)),e.destinationChainId&&n.set("destinationChainId",String(e.destinationChainId)),e.token&&n.set("token",String(e.token)),e.amount&&n.set("amount",String(e.amount)),k(`${Sd(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var vL="https://api.beefy.finance";function kd(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||vL).replace(/\/$/,"")}async function iv(e={}){try{let t=await k(`${kd(e)}/apy`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Object.keys(t||{});return{ok:n.length>0,provider:"beefy-yields",vaultCount:n.length}}catch(t){return{ok:!1,provider:"beefy-yields",error:String(t.message||t).slice(0,120)}}}async function av(e={},t={}){let n=await k(`${kd(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,a]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=a);return o}return n}async function sv(e={}){return k(`${kd(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}$();var kL="https://public-api.birdeye.so";function cv(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||kL).replace(/\/$/,"")}async function lv(e={}){try{let t=await k(`${cv(e)}/public/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=1`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.data)&&t.data.length>0,provider:"birdeye-tokens"}}catch(t){return{ok:!1,provider:"birdeye-tokens",error:String(t.message||t).slice(0,120)}}}async function uv(e={},t={}){let n=String(e.sortBy||"v24hUSD"),r=String(e.sortType||"desc"),o=Math.max(0,Number(e.offset||0)),i=Math.min(50,Math.max(1,Number(e.limit||20)));return k(`${cv(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var IL="https://api.celenium.io";function Ed(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||IL).replace(/\/$/,"")}async function dv(e={}){try{let t=await k(`${Ed(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&t.blobs_count!=null,provider:"celestia-da"}}catch(t){return{ok:!1,provider:"celestia-da",error:String(t.message||t).slice(0,120)}}}async function pv(e={}){return k(`${Ed(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function mv(e={},t={}){let n=Number(e.height);if(n&&(!Number.isFinite(n)||n<1))throw new Error("celestia-da: height must be positive");let r=n?`/v1/block/${n}`:"/v1/block";return k(`${Ed(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var _L="https://api.mainnet-beta.solana.com";function TL(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||_L).replace(/\/$/,"")}async function fs(e,t,n={}){let r=TL(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),s=await(await(n.fetchImpl||fetch)(r,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:o,signal:AbortSignal.timeout(n.timeoutMs??2e4)})).json();if(s.error)throw new Error(`das-assets ${e}: ${s.error.message||JSON.stringify(s.error)}`);return s.result}async function fv(e={}){try{let t=await fs("getAsset",{id:"12He3nqt2XLbpuWGdwsJBNcomm7r3M8Kh6Dj9w7ZAK9"},e);return{ok:t&&typeof t=="object",provider:"das-assets"}}catch(t){return{ok:!1,provider:"das-assets",error:String(t.message||t).slice(0,120)}}}async function hv(e={},t={}){let n=String(e.ownerAddress||"").trim();if(!n)throw new Error("das-assets: ownerAddress is required");let r=Math.max(1,Number(e.page||1)),o=Math.min(1e3,Math.max(1,Number(e.limit||50)));return fs("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function gv(e={},t={}){let n=Math.max(1,Number(e.page||1)),r=Math.min(100,Math.max(1,Number(e.limit||20))),o={page:n,limit:r};return e.ownerAddress&&(o.ownerAddress=String(e.ownerAddress)),e.collectionId&&(o.collectionId=String(e.collectionId)),e.creatorAddress&&(o.creatorAddress=String(e.creatorAddress)),e.delegate&&(o.delegate=String(e.delegate)),fs("searchAssets",o,t)}async function yv(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return fs("getAssetProof",{id:n},t)}$();var PL="https://api.l2beat.com";function Id(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||PL).replace(/\/$/,"")}async function bv(e={}){try{let t=await k(`${Id(e)}/api/scaling/tvl`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:t&&typeof t.totalUsd=="string",provider:"l2beat-tvl"}}catch(t){return{ok:!1,provider:"l2beat-tvl",error:String(t.message||t).slice(0,120)}}}async function wv(e={},t={}){let n=await k(`${Id(t)}/api/scaling/tvl`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.project){let r=String(e.project).toLowerCase(),o=n?.projects||{},i=Object.entries(o).find(([a])=>String(a).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function xv(e={},t={}){return k(`${Id(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}$();var OL="https://api.spark.fi";function Ad(e={}){return(e.baseUrl||process.env.SPARK_API_URL||OL).replace(/\/$/,"")}async function vv(e={}){try{return{ok:(await k(`${Ad(e)}/v1/savings/spark/mainnet/usdc`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4}))?.data?.vault?.address!=null,provider:"spark-lend"}}catch(t){return{ok:!1,provider:"spark-lend",error:String(t.message||t).slice(0,120)}}}async function Sv(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?k(`${Ad(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):k(`${Ad(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var LL="https://api.symbiotic.fi";function _d(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||LL).replace(/\/$/,"")}async function kv(e={}){try{let t=await k(`${_d(e)}/v1/vaults`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:Array.isArray(t)&&t.length>0,provider:"symbiotic-restaking",count:t.length}}catch(t){return{ok:!1,provider:"symbiotic-restaking",error:String(t.message||t).slice(0,120)}}}async function Ev(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await k(`${_d(t)}/v1/vaults?limit=${n}&offset=${Math.max(0,Number(e.offset||0))}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return e.approvedOnly?r.filter(o=>o.approved===!0):r}async function Iv(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return k(`${_d(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}$();var BL="https://staking-api.polygon.technology/api/v2",ML=18,FL=200,UL=50,DL=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Cd(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||BL).replace(/\/$/,"")}function qL(e,t="id"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);let r=Number(n);if(!Number.isSafeInteger(r)||r<1)throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);return r}function HL(e,t=UL){let n=Number(e??t);return Number.isFinite(n)?Math.min(FL,Math.max(1,Math.trunc(n))):t}function Td(e){let t=Number(e);return Number.isFinite(t)?t/10**ML:null}async function Pd(e,t={}){let n=await k(`${Cd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});if(typeof n=="string")throw new Error(`polygon-staking GET ${e}: non-JSON response`);if(n?.success===!1){let r=n?.message||n?.error||n?.status||"request rejected";throw new Error(`polygon-staking GET ${e}: ${r}`)}return n}function Av(e={}){return{id:e.id??null,name:typeof e.name=="string"?e.name.trim():null,status:e.status??null,currentState:e.currentState??null,owner:e.owner??null,signer:e.signer??null,contractAddress:e.contractAddress??null,commissionPercent:e.commissionPercent??null,uptimePercent:e.uptimePercent??null,performanceIndex:e.performanceIndex??null,delegationEnabled:e.delegationEnabled??null,activationEpoch:e.activationEpoch??null,deactivationEpoch:e.deactivationEpoch??null,jailEndEpoch:e.jailEndEpoch??null,missedLatestCheckpointCount:e.missedLatestCheckpointcount??null,totalStakedRaw:e.totalStaked??null,selfStakeRaw:e.selfStake??null,delegatedStakeRaw:e.delegatedStake??null,totalStakedPolApprox:Td(e.totalStaked),selfStakePolApprox:Td(e.selfStake),delegatedStakePolApprox:Td(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function _v(e={},t={}){let n=await Pd("/validators",t),r=Array.isArray(n?.result)?n.result:[],o=n?.summary?.total??r.length;if(e.status){let d=String(e.status).toLowerCase();r=r.filter(p=>String(p?.status||"").toLowerCase()===d)}if(e.currentState){let d=String(e.currentState).toUpperCase();r=r.filter(p=>String(p?.currentState||"").toUpperCase()===d)}if(e.delegationEnabled!=null){let d=!!e.delegationEnabled;r=r.filter(p=>!!p?.delegationEnabled===d)}let i=DL.has(String(e.sortBy))?String(e.sortBy):"id",a=String(e.direction||"").toUpperCase()==="DESC";r=[...r].sort((d,p)=>{let f=Number(d?.[i]??0),m=Number(p?.[i]??0),h=Number.isFinite(f)&&Number.isFinite(m)?f-m:0;return a?-h:h});let s=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=HL(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:s,total:o,limit:l,offset:c,sortBy:i,direction:a?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(Av)}}async function Tv(e={},t={}){let n=qL(e.id??e.validatorId,"id"),o=(await Pd(`/validators/${n}`,t))?.result;if(!o||typeof o!="object")throw new Error(`polygon-staking: validator ${n} not found`);return{provider:"polygon-staking",chainId:137,id:n,validator:e.raw?o:{...Av(o),delegatorCount:o.delegatorCount??null,checkpointsSigned:o.checkpointsSigned??null,checkpointsMissed:o.checkpointsMissed??null,isInAuction:o.isInAuction??null,auctionAmount:o.auctionAmount??null,delegatorUnclaimedRewardsRaw:o.delegatorUnclaimedRewards??null,validatorUnclaimedRewardsRaw:o.validatorUnclaimedRewards??null,claimedRewardRaw:o.claimedReward??null,description:typeof o.description=="string"?o.description:null,logoUrl:o.logoUrl??null},raw:e.raw?void 0:o}}async function Cv(e={}){try{let t=await Pd("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Cd(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Cd(e),error:String(t?.message||t),exec:!1}}}$();var zL="https://api.v3.aave.com/graphql",ZU=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),VL=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||zL;async function hs(e,t,n={}){let r=await k(VL(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4});if(r?.errors?.length)throw new Error(`aave-v3: ${r.errors.map(o=>o?.message||String(o)).join("; ")}`);return r}var WL=`query Markets($request: MarketsRequest!) {
|
|
143
|
+
- `)}`);let o=e.capabilities||{},i=Oi.filter(s=>typeof o[s]=="function"),a={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(s=>({...s})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Oi.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Oi)i.includes(s)?a[s]=async(...c)=>o[s](...c,{scanner:a}):a[s]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${s}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(a)}var cc=new Map;function _m(e){let t=EI(e);return cc.set(t.chainId,t),t}function Tm(e){return cc.get(Number(e))||null}function Pm(){return[...cc.values()]}he();var uc={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Xe=e=>BigInt(e).toString(16).padStart(64,"0"),Qr=e=>e.slice(2).toLowerCase().padStart(64,"0");function II(e,t){return`0x${uc.getAmountsOut}`+Xe(e)+Xe(64)+Xe(t.length)+t.map(Qr).join("")}function AI(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 lc(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var dc=100;function _I(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>dc)throw new Error(`slippageBps ${n} exceeds the ${dc} 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 Cm(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await U(t,"eth_call",[{to:o,data:II(i,a)},"latest"],s);return AI(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=lc(c.scanner);if(!l)return{chainId:t,evidence:Y.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=s||[o,i];if(u.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(l,a,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(a),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:Y.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:Y.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:a},s={}){let c=lc(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!l)return{chainId:t,token:o,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let u=await r(c,i,[l,o],s);if(!u)return{chainId:t,token:o,verdict:z.FAIL,evidence:Y.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=u[u.length-1];if(d===0n)return{chainId:t,token:o,verdict:z.FAIL,evidence:Y.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],s);if(!p)return{chainId:t,token:o,verdict:z.FAIL,evidence:Y.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p[p.length-1],f=Number(m*10000n/BigInt(i)),h=z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=z.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:g,amountIn:String(i),bought:d.toString(),returned:m.toString(),retentionBps:f,evidence:Y.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:a,recipient:s,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=lc(p);if(!m)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(s||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:a,path:f},d);if(h.evidence!==Y.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=_I(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(l)),x=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,b=x?`0x${uc.swapExactETHForTokens}`+Xe(g)+Xe(128)+Qr(s)+Xe(w)+Xe(f.length)+f.map(Qr).join(""):`0x${uc.swapExactTokensForTokens}`+Xe(a)+Xe(g)+Xe(160)+Qr(s)+Xe(w)+Xe(f.length)+f.map(Qr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:b,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:dc,deadline:w.toString()},requires:x?[]:[{step:"approve",token:f[0],spender:m,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}he();var TI=[100,500,3e3,1e4],Nm={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},hn=e=>BigInt(e).toString(16).padStart(64,"0"),Jr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Om=/^0x[0-9a-fA-F]{40}$/,mc=100;function PI(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>mc)throw new Error(`slippageBps ${n} exceeds the ${mc} 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 pc(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Rm(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${Nm.quoteExactInputSingle}`+Jr(a)+Jr(s)+hn(c)+hn(l)+hn(0),p=await U(t,"eth_call",[{to:i,data:d},"latest"],u).catch(()=>null),m=p?.result??p;if(!m||m==="0x"||m.length<66)return null;let f=BigInt(`0x${m.slice(2,66)}`);return f>0n?f:null}async function o({quoter:i,tokenIn:a,tokenOut:s,amountIn:c},l){let u=[],d=null;for(let p of TI){let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=pc(c.scanner,"quoter");if(!l)return{chainId:t,evidence:Y.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,a])if(!Om.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:a,amountIn:s},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:a,amountIn:String(s),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:Y.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:a,triedFeeTiers:d,evidence:Y.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:a,base:s},c={}){let l=pc(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(v=>String(v).toLowerCase()),d=null;!s&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),m=String(n||"").toLowerCase();if(m&&p===m)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let f=s||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(f&&p===String(f).toLowerCase())return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!l||!f)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let h=await o({quoter:l,tokenIn:f,tokenOut:i,amountIn:a},c);if(!h.best){let v=u.find(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c);if(k.best){let S=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c);if(S.best){let I=S.best.amountOut,T=Number(I*10000n/BigInt(a)),_=z.PASS,C="round trip vs dollar book completes with expected fee/impact loss";return T<5e3?(_=z.FAIL,C=`round trip vs dollar book returns only ${(T/100).toFixed(2)}% -- punitive tax or no real liquidity`):T<9e3&&(_=z.CAUTION,C=`round trip vs dollar book returns ${(T/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:_,reason:C,amountIn:String(a),bought:k.best.amountOut.toString(),returned:I.toString(),retentionBps:T,buyFee:k.best.fee,sellFee:S.best.fee,evidence:Y.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:z.FAIL,evidence:Y.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:l,tokenIn:i,tokenOut:f,amountIn:h.best.amountOut},c);if(!g.best){let v=u.find(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c),S=k.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c):{best:null};if(k.best&&S.best){let I=S.best.amountOut,T=Number(I*10000n/BigInt(a)),_=z.PASS,C="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return T<5e3?(_=z.FAIL,C=`dollar-book round trip returns only ${(T/100).toFixed(2)}%`):T<9e3&&(_=z.CAUTION,C=`dollar-book round trip returns ${(T/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:_,reason:C,amountIn:String(a),bought:k.best.amountOut.toString(),returned:I.toString(),retentionBps:T,buyFee:k.best.fee,sellFee:S.best.fee,evidence:Y.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:z.FAIL,evidence:Y.LIVE,leg:"sell",bought:h.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=g.best.amountOut,x=Number(w*10000n/BigInt(a)),b=z.PASS,y="round trip completes with expected fee/impact loss";return x<5e3?(b=z.FAIL,y=`round trip returns only ${(x/100).toFixed(2)}% -- punitive tax or no real liquidity`):x<9e3&&(b=z.CAUTION,y=`round trip returns ${(x/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:b,reason:y,amountIn:String(a),bought:h.best.amountOut.toString(),returned:w.toString(),retentionBps:x,buyFee:h.best.fee,sellFee:g.best.fee,evidence:Y.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:a,amountIn:s,recipient:c,slippageBps:l=50,fee:u},d={}){let p=pc(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(!Om.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:a,amountIn:s},d);if(m.evidence!==Y.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=PI(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(d.useNative||m.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),w=`0x${Nm.exactInputSingle}`+Jr(i)+Jr(a)+hn(f)+Jr(c)+hn(s)+hn(h)+hn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:g?String(s):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:mc,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Ri={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Lm(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function $m(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 CI(e){let{chainId:t}=e;async function n(r,o,i){return U(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await $r(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:Y.LIVE}},async nativeBalance(r,o={}){let i=await ln(t,r,o);return{chainId:t,address:r,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:Y.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await Br({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:Y.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:Y.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,a,s,c]=await Promise.all([n(r,Ri.decimals,o).catch(()=>null),n(r,Ri.symbol,o).catch(()=>null),n(r,Ri.name,o).catch(()=>null),n(r,Ri.totalSupply,o).catch(()=>null)]),l=Lm(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:$m(a?.result??a),name:$m(s?.result??s),totalSupply:(Lm(c?.result??c)??null)?.toString()??null,evidence:u?Y.LIVE:Y.UNKNOWN,warning:u?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:Y.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await un(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=qs(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:Ep(r,l),evidence:l.length?Y.LIVE:Y.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:a,chunkSize:s=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let d=r;d<=o;d+=s){let p=Math.min(d+s-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),a&&(m.topics=a);let f=await U(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence:Y.UNKNOWN};for(let h of f?.result??f??[])l.push(h)}return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!0,chunks:u.length,evidence:Y.LIVE}},async scoreRisk(r,o={}){let i=[],a=z.PASS,s=u=>{let d={[z.PASS]:0,[z.CAUTION]:1,[z.UNKNOWN]:2,[z.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==Y.LIVE?(i.push({check:"erc20-metadata",result:z.UNKNOWN,detail:c.warning}),s(z.UNKNOWN)):i.push({check:"erc20-metadata",result:z.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===Y.UNAVAILABLE)i.push({check:"liquidity",result:z.UNKNOWN,detail:l.reason}),s(z.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:z.FAIL,detail:"no pool with liquidity found"}),s(z.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:z.CAUTION,detail:`top pool only $${d}`}),s(z.CAUTION)):i.push({check:"liquidity",result:z.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:z.CAUTION,detail:"pool under 24h old"}),s(z.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:z.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),s(u.verdict)}else i.push({check:"sellability",result:z.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),s(z.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Bm(e){let n={...CI(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Rm({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,a)=>(await n.resolvePools(i,a)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Cm({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,a]of Object.entries(n))o[i]=a.bind(n);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var Hn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function fc(){return Hn.map(e=>_m(Bm(e)))}var Zr=new Map,NI=Object.keys(je).map(Number),OI=Object.keys(ft).map(Number),RI=Hn.map(e=>e.chainId),LI=[...new Set(Object.values(Ai))],hc=new Set,Mm=!1;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(Mm&&hc.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Zr.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Zr.get(t)}function gc(e){return Zr.get(e)||null}function Li({venue:e,op:t}={}){let n=[...Zr.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function $I(){hc.clear();for(let e of Zr.keys())hc.add(e);Mm=!0}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:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});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:RI,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Hn.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 v1 quote + local-signer Solana swap handoff"});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"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});P({id:"uniswap-v3",venue:"dex",chainIds:NI,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:"uniswap-v4",venue:"dex",chainIds:OI,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:LI,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","chains","quote","prepare"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});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."});$I();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. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});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:"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:"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:"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"],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:"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."});$();at();at();var DI=/^0x[0-9a-fA-F]{40}$/,to="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function yc(e,t){let n=String(e||"").trim();if(!DI.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function zm(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Vm(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 qI(e){return[...e].sort((t,n)=>(zm(n.tvl)??-1)-(zm(t.tvl)??-1))}function bc(e){return e.hlInfo||ce}function wc(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function xc(e={},t={}){let n=await bc(t)({type:"vaultSummaries"},t),r=qI((Array.isArray(n)?n:[]).map(Vm));return wc({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Fi(e={},t={}){let r={type:"vaultDetails",vaultAddress:yc(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=yc(e.user,"user"));let o=await bc(t)(r,t);return wc({provider:"hl-vaults",vault:Vm(o||{}),raw:o})}async function vc(e={},t={}){let n=yc(e.user||e.address,"user"),r=await bc(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 wc({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Sc(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Fi({...e,vaultAddress:to},t);if(n==="summaries")return xc(e,t);if(n==="details")return Fi(e,t);if(n==="mine")return vc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Wm(e={}){try{let t=await Sc({mode:"hlp"},e);return{ok:t.vault.vaultAddress===to&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1,execution:"read-only",armed:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1,execution:"read-only",armed:!1}}}he();import{AbiCoder as jI}from"ethers";var kc=999;var _e=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Ec=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),zI=jI.defaultAbiCoder();function no(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-precompiles: ${t} must be a 0x EVM address`);return n.toLowerCase()}function ro(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 gn(e,t){return e.length?zI.encode(e,t):"0x"}function kt(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 VI(e,t=0){let n=kt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Mt(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:kc});let r=await U(kc,"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 Ft(e){return{provider:"hl-precompiles",chainId:kc,...Ec,...e}}async function Ui(e={}){let t=await Mt(_e.l1BlockNumber,"0x",e);return Ft({op:"l1BlockNumber",precompile:_e.l1BlockNumber,l1BlockNumber:kt(t).toString(),raw:t})}async function Ic(e={},t={}){let n=ro(e.index??e.assetId??0,"index",32),r=await Mt(_e.markPx,gn(["uint32"],[n]),t);return Ft({op:"markPx",precompile:_e.markPx,index:n,markPx:kt(r).toString(),raw:r})}async function Ac(e={},t={}){let n=ro(e.index??e.assetId??0,"index",32),r=await Mt(_e.oraclePx,gn(["uint32"],[n]),t);return Ft({op:"oraclePx",precompile:_e.oraclePx,index:n,oraclePx:kt(r).toString(),raw:r})}async function _c(e={},t={}){let n=ro(e.index??e.assetId??0,"index",32),r=await Mt(_e.spotPx,gn(["uint32"],[n]),t);return Ft({op:"spotPx",precompile:_e.spotPx,index:n,spotPx:kt(r).toString(),raw:r})}async function Tc(e={},t={}){let n=no(e.user,"user"),r=ro(e.perp??e.assetId??0,"perp",16),o=await Mt(_e.position,gn(["address","uint16"],[n,r]),t);return Ft({op:"position",precompile:_e.position,user:n,perp:r,szi:VI(o,0),raw:o})}async function Pc(e={},t={}){let n=no(e.user,"user"),r=ro(e.token??0,"token",64),o=await Mt(_e.spotBalance,gn(["address","uint64"],[n,r]),t);return Ft({op:"spotBalance",precompile:_e.spotBalance,user:n,token:r,total:kt(o,0).toString(),hold:kt(o,1).toString(),raw:o})}async function Cc(e={},t={}){let n=no(e.user,"user"),r=no(e.vaultAddress??e.vault??to,"vault"),o=await Mt(_e.vaultEquity,gn(["address","address"],[n,r]),t);return Ft({op:"vaultEquity",precompile:_e.vaultEquity,user:n,vaultAddress:r,hlp:r===to,equity:kt(o,0).toString(),raw:o})}async function Nc(e={},t={}){let n=no(e.user,"user"),r=await Mt(_e.withdrawable,gn(["address"],[n]),t);return Ft({op:"withdrawable",precompile:_e.withdrawable,user:n,withdrawable:kt(r).toString(),raw:r})}async function Gm(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return Ui(t);if(n==="markPx")return Ic(e,t);if(n==="oraclePx")return Ac(e,t);if(n==="spotPx")return _c(e,t);if(n==="position")return Tc(e,t);if(n==="spotBalance")return Pc(e,t);if(n==="vaultEquity"||n==="hlp")return Cc(e,t);if(n==="withdrawable")return Nc(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Km(e={}){try{let t=await Ui(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Ec,l1BlockNumber:t.l1BlockNumber,precompiles:_e}}catch(t){return{ok:!1,provider:"hl-precompiles",...Ec,error:String(t?.message||t).slice(0,160)}}}at();Z();function Ym(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function qi(e={},t,n){let r=String(t||""),o=Ym(e);if(o){let a=oo(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=oo(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function Hi(e={},t=[],n){let r=Ym(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(oo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&oo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(oo(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Oc=Number.MAX_SAFE_INTEGER,Di=String(Oc);function oo(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Oc?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>Di.length||t.length===Di.length&&t>Di||t===Di&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Oc?r:null}function yf(){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 It(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function bf(e){let t=It(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function BA(e,t,n=4){let r=It(e),o=It(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function wf(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},a=n[o]||{},s=String(i.name||"").trim(),c=It(a.funding),l=It(a.markPx??a.oraclePx),u=It(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:It(a.oraclePx),openInterest:u,fundingAprPct:bf(c)})}return r}function xf(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=It(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=bf(n),o=n>0,i={coin:e.coin,notionalUsd:It(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?BA(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 Qc(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await Qe(t),i=wf(o).filter(a=>a.funding>0&&a.openInterest>=r).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function Jc(e={},t={}){let n=String(e.coin||"").trim();if(!n)throw new Error("hl-delta-neutral: coin required");let r=Number(e.notionalUsd??e.notional??1e3),o=await Qe(t),i=wf(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return xf(i,r)}async function Zc(e={},t={}){Sf(e,t,"hl-delta-neutral");let n=kf(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Jc(e,t);if(r.verdict==="skip")return N({...r,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=qi(e,r.coin,"hl-delta-neutral");if(!vf.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(()=>(Yi(),Xc)),a=await i({coin:r.coin,side:r.perpSide,size:r.perpSize,type:e.orderType||"limit",price:e.price??r.markPx,owner:e.owner,maxNotionalUsd:n},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(a?.signed===!0||a?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let s=a?.localSignerEnvelope||null,c=a?.localSignerBlockedReason||null;return N({...r,prepared:!!s,surface:"hl",hedge:a,localSignerEnvelope:s,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:s?"awaiting-hl-signer":"blocked",oraclePrepared:!!s},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var vf=/^0x[0-9a-fA-F]{40}$/;function Sf(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 MA(e,t,n){Sf(e,t,n)}function FA(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=kf(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"&&Hi(e,n,"hl-delta-neutral"),t==="live"&&!vf.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 kf(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 Ef(e={},t={}){MA(e,t,"hl-delta-neutral");let n=FA(e),r=await Qc({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.coin))continue;let c=xf(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let l=await Zc({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}$();Z();Vn();var DA=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),uo=14,If=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Yn(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function el(e){let t=String(e||"").replace(/\/$/,"");if(!DA.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function Af(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=If(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=el(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(yn(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(yn(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Yn(n.orderType,0,"orderType"),Yn(n.timeInForce,1,"timeInForce"),Yn(n.reduceOnly,0,"reduceOnly"),Yn(n.triggerPrice,0,"triggerPrice"),Yn(n.orderExpiry,-1,"orderExpiry");let c=If(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=Ze(n.baseAmount,"lighter: baseAmount"),d=Ze(n.price,"lighter: price");if(u>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(u),m=Number(d),f=Number(n.sizeDecimals??0),h=Number(n.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=f+h,w=u*d,x=Se(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(w!==x)throw new Error("lighter: notionalUsd must match size and price");let b=Se(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>b)throw new Error("lighter: notional exceeds cap");let y=Ie(n.notionalUsd,"lighter: notionalUsd");return Yn(n.txType,uo,"txType"),Object.freeze({unit:"usd",value:String(y),notional:String(y),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(y)})}function qA(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 _f(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=el(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:qA(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??uo,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return Af(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var Pf="https://mainnet.zklighter.elliot.ai",Cf="https://testnet.zklighter.elliot.ai";function HA(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?Cf:Pf}function Nf(){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 jt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function jA(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 Of(e){let t=jt(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function zA(e,t,n=4){let r=jt(e),o=jt(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let a=10**i;return Math.floor(r/o*a+1e-12)}function Tf(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Rf(e,t){let n=Array.isArray(e?.funding_rates)?e.funding_rates:[],r=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let a of r){let s=Tf(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=Tf(a.market_id);if(s==null)continue;let c=o.get(s),l=jt(c?.mark_price??c?.index_price),u=jt(a.rate),d=String(a.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:s,funding:u,markPx:l,openInterest:jt(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:Of(u)})}return i}function Lf(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=jt(e.funding);if(n==null)throw new Error("lighter: funding required");let r=Of(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:jt(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?zA(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 $f(e={}){let t=HA(e),n=e.fetchImpl,r=await E(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await E(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function tl(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await $f(t),i=Rf(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function nl(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 $f(t),a=Rf(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return Lf(a,r)}async function rl(e={},t={}){Mf(e,t,"lighter");let n=Ff(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 nl(e,t);if(o.verdict==="skip")return N({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=qi(e,o.coin,"lighter");if(!Bf.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=jA(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:uo,submitTo:`${s?Cf:Pf}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=_f(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return N({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Bf=/^0x[0-9a-fA-F]{40}$/;function Mf(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 VA(e,t,n){Mf(e,t,n)}function WA(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=Ff(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"&&Hi(e,n,"lighter"),t==="live"&&!Bf.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let a=e.accountIndex;if(t==="live"&&(typeof a!="number"||!Number.isSafeInteger(a)||a<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:a}}function Ff(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 Uf(e={},t={}){VA(e,t,"lighter");let n=WA(e),r=await tl({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.symbol)&&!o.has(s.coin))continue;let c=Lf(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let l=await rl({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}$();var KA="https://clob.polymarket.com",YA="https://gamma-api.polymarket.com";function po(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||KA).replace(/\/$/,"")}function Df(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||YA).replace(/\/$/,"")}async function ol(e={}){return E(`${po(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function qf(e={}){let t=await ol(e);return{ok:t!=null&&t!=="",time:t}}async function Hf({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return E(`${Df(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function jf(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return E(`${po(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function zf(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return E(`${po(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Vf(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return E(`${po(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wf(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return E(`${po(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Gf({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,a])=>[i,String(a)]))});return E(`${Df(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}he();$();import{createHash as Kf}from"node:crypto";var Xn="mainnet-beta",QA="https://api.mainnet-beta.solana.com",il="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function JA(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||QA).trim()}function de(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}function ZA(e,t){return t?[...e,{commitment:t}]:e}async function mo(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await E(JA(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function al(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await mo("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Xn,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Yf(e={}){try{let[t,n]=await Promise.all([mo("getHealth",[],e),al({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Xn,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Xn,error:String(t?.message||t),exec:!1}}}async function Xi(e={},t={}){let n=de(e.address||e.owner,"address"),r=await mo("getBalance",ZA([n],e.commitment),t);return{provider:"solana-rpc",cluster:Xn,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function e1(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 fo(e={},t={}){let n=de(e.owner||e.address,"owner"),r=e.mint?{mint:de(e.mint,"mint")}:{programId:de(e.programId||il,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await mo("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(e1):[];return{provider:"solana-rpc",cluster:Xn,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function t1(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 n1(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let a=e[o++];if(n|=(a&127)<<r,(a&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function r1(e){let t=Buffer.from(e,"base64");try{let n=n1(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Kf("sha256").update(t.subarray(r)).digest("hex")}catch{return Kf("sha256").update(t).digest("hex")}}async function Xf(e={},t={}){let n=t1(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await mo("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Xn,ok:i.err==null,transactionHash:r1(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}$();var i1="mainnet",a1="https://mempool.space/api",s1="https://mempool.space/testnet/api";function gt(e={}){return String(e.network||process.env.BTC_NETWORK||i1).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function cl(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):gt(e)==="testnet"?s1:a1}function sl(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 st(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 c1(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 ll(e,t={}){let n=`${cl(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 Qi(e,t={}){let n=await ll(e,t);try{return JSON.parse(n)}catch{return n}}async function Qf(e={}){try{let t=await ll("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:gt(e),baseUrl:sl(cl(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:gt(e),baseUrl:sl(cl(e)),error:sl(t?.message||t),exec:!1}}}async function Jf(e={}){let t=await ll("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:gt(e),tipHeight:Number(t)}}async function Zf(e={}){try{let t=await Qi("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:gt(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:gt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ji(e={},t={}){let n=st(e.address||e.addr,"address"),r=await Qi(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:gt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function eh(e={},t={}){let n=st(e.address||e.addr,"address"),r=await Qi(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:gt(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function th(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 Qi(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:gt(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 nh(e={},t={}){let n=c1(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:gt(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 ul="https://ordinals.com";function Zi(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var u1=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function rh(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=Zi(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,a=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=u1.includes(o)&&(i==="https:"||a)}}catch{n=!1}return Ue({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Qn(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:rh(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function oh(e={}){let t=Zi(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let a=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:rh(e),signal:AbortSignal.timeout(8e3)});if(r={ok:a.status>0&&a.status<500,path:o,status:a.status},a.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function ea(e={},t={}){let n=st(e.address||e.addr,"address"),r=Zi(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let a of o)try{let s=await Qn(a,t),c=d1(s);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:a}}catch(s){i=s}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function d1(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 Jn(e={},t={}){let n=st(e.address||e.addr,"address"),r=Zi(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],a=null;for(let s of i)try{let c=await Qn(s,t),l=p1(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:s}}catch(c){a=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(a?.message||a||"all indexer paths failed")}}async function ih(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||ul,o=await Qn(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function ah(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||ul,o=Number(e.page||0),i=await Qn(`${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 sh(e={},t={}){let n=t.ordinalsBase||ul,r=e.height??await Qn(`${n}/r/blockheight`,t),o=await Qn(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function p1(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}))}Z();var f1=["unsigned","notsigned","tosign","signable"],h1=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),g1=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function dl(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function y1(e){return f1.some(t=>e.startsWith(t))||h1.has(e)}function b1(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=dl(t);return y1(n)?!1:g1.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function w1(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 pl(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=>pl(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(b1(c)){o.push(c);continue}o.push(...pl(l,t+1,n,r))}let a=Object.keys(e).map(dl).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(dl(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),w1(e)&&o.push("v/r/s"),o}function At(e,t){let n=pl(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 x1="https://api.satflow.com/v1";function ch(e={}){return ze({provider:"satflow",defaultUrl:x1,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function ta(e={}){return ch(e).baseUrl}function fl(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function v1(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":fl(e)},ch(e).trusted)}async function zt(e,{method:t="GET",body:n,opts:r={}}={}){if(!fl(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${ta(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:v1(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await s.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!s.ok)throw new Error(`satflow ${t} ${e}: HTTP ${s.status} ${String(c).slice(0,200)}`);return l}async function lh(e={}){if(!!!fl(e))return{ok:!1,provider:"satflow",baseUrl:ta(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 zt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:ta(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:ta(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function uh(e={},t={}){let n=String(e.type||"ordinals").toLowerCase();if(!["ordinals","runes"].includes(n))throw new Error("satflow: type must be ordinals|runes");let r=new URLSearchParams({type:n});e.ids&&r.set("ids",Array.isArray(e.ids)?e.ids.join(","):String(e.ids));let o=await zt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function dh(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 zt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function ph(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 zt(`/item?${r}`,{opts:t})}}async function na(e={},t={}){let n=st(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 zt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function mh(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 zt(`/orders/floor?${r}`,{opts:t})}}var S1=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function fh(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))S1.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var k1=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"]),E1=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function ml(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}function I1(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=st(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=st(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function hh(e={},t={}){let n=fh(e,k1);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=ml(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await zt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=ml(a)??ml(a?.intent);if(s==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(s>o)throw new Error(`satflow: purchase price ${s} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);At("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=I1(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return N({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:s.toString(),maxSats:o.toString(),intent:a,unsignedPsbt:c,localSignerEnvelope:l,localSignerBlockedReason:u,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function ra(e={},t={}){let n=fh(e,E1);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 zt("/intent/sell",{method:"POST",body:n,opts:t});return At("satflow",r),N({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}$();Z();var ia="https://lite-api.jup.ag/swap/v1",gl="So11111111111111111111111111111111111111112",bh="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",_1=100,gh=2e4;function wh(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||ia).replace(/\/$/,"")}function ho(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 xh(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>_1)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function oa(e,t){return e==null?t:!!e}function T1(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 P1(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 vh(e){let t=Buffer.from(e,"base64"),n=P1(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 hl(e={},{quotedAtMs:t=Date.now(),ttlMs:n=gh}={}){let r=de(e.inputMint,"inputMint"),o=de(e.outputMint,"outputMint"),i=ho(e.inAmount,"inAmount"),a=ho(e.outAmount,"outAmount"),s=ho(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=xh(e.slippageBps??50),l=(BigInt(a)-BigInt(a)*BigInt(c)/10000n).toString();if(s!==l)throw new Error("jupiter: otherAmountThreshold does not match serialized min-out");return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:a,otherAmountThreshold:s,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||gh,1e3),3e4)}}function C1({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==gl)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=vh(n),a=ho(r.exactFeeLamports??o.exactFeeLamports??"5000","exactFeeLamports");return{version:1,surface:"sol",action:"swap",owner:e,destination:t.outputMint,tradeId:r.tradeId||`jupiter-${t.inputMint.slice(0,6)}-${t.outputMint.slice(0,6)}-${t.inAmount}`,slippageBps:t.slippageBps,expiresAtMs:t.expiresAtMs,fee:{oracleFeeBps:5},artifact:{cluster:r.cluster||"mainnet",provider:"jupiter",inputMint:t.inputMint,outputMint:t.outputMint,inAmount:t.inAmount,outAmount:t.outAmount,otherAmountThreshold:t.otherAmountThreshold,slippageBps:t.slippageBps,jupiterProgram:r.jupiterProgram||o.jupiterProgram||"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",messageBase64:i,exactFeeLamports:a}}}var N1=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),O1="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function yh(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=O1.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 Sh(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(`${ia}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),a=Object.entries(i),s=a.filter(([p])=>yh(p)),c=[],l=a.filter(([p])=>!yh(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${ia}/program-id-to-label`,verified:s.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:a.length,verified:s.length}};let u=async p=>{let f=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(f.error)throw new Error(f.error.message);return f.result};for(let p=0;p<s.length;p+=90){let m=s.slice(p,p+90),f=null;for(let h=0;h<3&&!f;h++)try{f=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[m.map(([g])=>g),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(g=>setTimeout(g,2e3*(h+1)))}if(!f){for(let[h,g]of m)l.push({programId:h,label:g,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,g)=>{let[w,x]=m[g];h&&h.executable===!0&&N1.has(h.owner)?c.push({programId:w,label:x,owner:h.owner}):l.push({programId:w,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${ia}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:a.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,m)=>p.label.localeCompare(m.label)),unresolved:l}}async function kh(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await aa({inputMint:gl,outputMint:bh,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 aa(e={},t={}){let n=de(e.inputMint||e.fromMint||gl,"inputMint"),r=de(e.outputMint||e.toMint||bh,"outputMint"),o=ho(e.amount||e.inAmount,"amount"),i=xh(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${wh(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await E(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=hl({...s,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:s,solanaGuard:c}}function R1(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Eh(e={},t={}){let n=de(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:hl(e.quoteResponse,t)}:await aa(e,t),o=r.quote,i=r.solanaGuard||hl(o,t);if(oa(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await E(`${wh(t)}/swap`,{method:"POST",body:R1({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:oa(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:oa(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:oa(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=T1(a?.swapTransaction);vh(s),At("jupiter",a);let c=a?.quoteResponse??a?.quote??null,l=["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"],u=!1;if(c&&typeof c=="object"){for(let m of l){let f=o?.[m],h=c?.[m];if(f==null||h==null)throw new Error(`jupiter: echoed quote is incomplete \u2014 missing ${m}`);if(String(f)!==String(h))throw new Error(`jupiter: swap response ${m} (${h}) does not match the quoted ${m} (${f}) \u2014 refusing to prepare`)}u=!0}let d=null,p=null;try{d=C1({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return N({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}$();var $1="https://coins.llama.fi",B1="https://api.llama.fi",M1="https://yields.llama.fi",F1="https://stablecoins.llama.fi";function U1(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||$1).replace(/\/$/,"")}function Ih(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||B1).replace(/\/$/,"")}async function bn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return E(`${U1(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ah(e={}){let n=(await bn(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function _h(e={}){return E(`${Ih(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function Th(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||M1).replace(/\/$/,""),r=await E(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(a=>String(a.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(a=>String(a.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(a=>!!a.stablecoin==!!e.stablecoin)),o.sort((a,s)=>Number(s.tvlUsd||0)-Number(a.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...r,data:o.slice(0,i)}}async function sa(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||F1).replace(/\/$/,""),r=e.includePrices!==!1;return E(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Ph(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return E(`${Ih(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Ch(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await bn(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}$();var Vt="0x000000000000000000000000000000000000dEaD";function yl(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Vt}Z();Gi();var q1="https://li.quest/v1";function wl(e={}){return(e.baseUrl||process.env.LIFI_API_URL||q1).replace(/\/$/,"")}var bl="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",H1="0x0000000000000000000000000000000000000000";function j1(e){let t=String(e||bl).toLowerCase();return t===bl.toLowerCase()||t===H1}function Nh(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 Oh(e={}){let t=await E(`${wl(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 go(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=bl,toToken:i,fromAmount:a,fromAddress:s=Vt}=e;if(n==null||!i||!a)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(a),fromAddress:s}),l=Fe({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 Wi({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,w]of Object.entries(lf(u)))c.set(g,w);let d=await E(`${wl(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:l,oracleFee:u};let m=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",f=re(d,{chainId:Number(n),venue:m,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps}),h=d?.estimate?.toAmountMin||d?.toAmountMin;if(h!=null&&BigInt(h)<BigInt(f.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...f,oracleFee:u}}async function Rh(e={},t={}){let n=await go(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!j1(e.fromToken)){let a=n?.estimate?.approvalAddress||n?.approvalAddress;if(!a)throw new Error("lifi: ERC20 route missing approvalAddress");let s=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:Nh(s,"approval token"),spender:Nh(a,"approval spender"),amount:String(e.fromAmount)}}return N({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:fe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Lh(e={}){return E(`${wl(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}he();import{Interface as Mh,getAddress as yo,isAddress as V1}from"ethers";Z();var Wt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},W1=[1,50,100,200,2e3],$h=new Mh(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),G1=new Mh(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Fh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Uh="0x0000000000000000000000000000000000000000";function Dh(e){let t=Number(e),n=Wt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Wt).join(", ")})`);return{chainId:t,...n}}function Bh(e,t){let n=Wt[Number(t)];if(!e||e===Fh||e===Uh||/^eth$/i.test(String(e)))return yo(n.weth);let r=String(e);if(/^weth$/i.test(r))return yo(n.weth);if(/^usdc$/i.test(r))return yo(n.usdc);if(!V1(r))throw new Error(`invalid token address: ${e}`);return yo(r)}async function ca(e={},t={}){let{chainId:n,quoter:r,router:o}=Dh(e.chainId??8453),i=Bh(e.tokenIn||"WETH",n),a=Bh(e.tokenOut||Wt[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...W1],l=[],u=null;for(let d of c){let p=$h.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await U(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=$h.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return re({venue:"aerodrome",chainId:n,chain:Wt[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function qh(e={},t={}){let n=Number(e.chainId??8453),r=Dh(n),o=yo(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Fh||i===Uh||/^eth$/i.test(i),s=await ca(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=G1.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return N({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:a?s.amountIn:"0",slippageGuard:fe(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Hh(e={}){let t=Number(e.chainId??8453);try{let n=await ca({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:Wt[t]?.router,quoter:Wt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function jh(){return Object.entries(Wt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}$();Z();var Y1="https://api.0x.org";function zh(e={}){return ze({provider:"zerox",defaultUrl:Y1,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Vh(e={}){return zh(e).baseUrl}function la(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Wh(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":la(e)},zh(e).trusted)}async function Gh(e={}){if(!la(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await xl({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 xl(e={},t={}){if(!la(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let s=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return a&&s.set("taker",a),E(`${Vh(t)}/swap/allowance-holder/price?${s}`,{headers:Wh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function bo(e={},t={}){if(!la(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let s=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`0x: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(s.selectedBps)});a&&c.set("taker",a);let l=await E(`${Vh(t)}/swap/allowance-holder/quote?${c}`,{headers:Wh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?re(l,{chainId:n,venue:l?.transaction?.to||l?.to||"0x",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...l,autoSlippagePolicy:s}}async function Kh(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await bo(e,t),r=n?.transaction;if(!r?.to||!r?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=n?.issues?.allowance?.spender||n?.allowanceTarget;return N({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:n?.issues?.allowance?.actual!=null&&BigInt(n.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:r.to,data:r.data,value:r.value??"0x0",...r.gas!=null?{gasLimit:r.gas}:{},slippageGuard:fe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}$();Z();var Q1="https://across.to/api",J1="https://api.hop.exchange/v1",Z1="https://api.relay.link",e_={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function Yh(e={}){try{return{ok:!0,estimatedFillTimeSec:(await vl({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function vl(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:a}=e;if(!n||o==null||i==null||!a)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let s=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(a)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Q1).replace(/\/$/,"");return E(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Xh(e={}){try{let t=await Sl({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 Sl(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let a=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),s=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a});if(!s.executable)throw new Error(`hop: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(s.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||J1).replace(/\/$/,""),u=await E(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?re(u,{chainId:Number(e.originChainId||e.chainId||e_[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a}):{...u,autoSlippagePolicy:s}}async function Qh(e={}){try{let t=await ua({user:Vt,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 ua(e={},t={}){let{user:n=Vt,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:a="0x0000000000000000000000000000000000000000",amount:s,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!s)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=Fe({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||Z1).replace(/\/$/,""),d=await E(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:a,amount:String(s),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:re(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Jh(e={},t={}){let n=await ua(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(s=>(s.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:s.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(s=>String(s.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let a=o.map(s=>({chainId:r,from:s.from||e.user,to:s.to,data:s.data,value:s.value??"0x0",...s.gasLimit!=null||s.gas!=null?{gasLimit:s.gasLimit??s.gas}:{},slippageGuard:fe(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return N({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}$();import{TypedDataEncoder as t0,getAddress as wo,isAddress as n_}from"ethers";var gF=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function kl(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Zh(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}Z();var Al={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"},r_=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),o_=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Il={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},n0={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},e0=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"}]}),IF=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function _l(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Al[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function xo(e,t){let n=String(e||"").trim();if(!n_(n))throw new Error(`cowswap: ${t} must be an address`);return wo(n).toLowerCase()}function El(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 i_(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 a_(e){let t=r_[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:wo(t)}}function s_(e={},t,n){let r=xo(e.sellToken,"sellToken"),o=xo(e.buyToken,"buyToken"),i=xo(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=i_(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:El(e.sellAmount,"sellAmount"),buyAmount:El(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:El(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function r0(e={}){try{let t=await Zn({chainId:1,sellToken:Il[1],buyToken:n0[1],sellAmountBeforeFee:"1000000000000000",from:Vt},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 Zn(e={},t={}){let n=Number(e.chainId??1),r=yl(e.from||e.owner),o=e.sellToken||Il[n],i=e.buyToken||n0[n],a=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||a==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Il[n],!o))throw new Error("no WETH mapping for chain");let s={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:a,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await E(`${_l(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?re(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function o0(e={},t={}){let n=Number(e.chainId??1),r=xo(yl(e.from||e.owner||e.signer),"owner"),o=await Zn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=s_(o?.quote||o,n,r),a=a_(n),s={domain:a,types:e0,primaryType:"Order",message:i},c=t0.hash(a,e0,i),l=o_[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return N({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:wo(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:s,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:a.verifyingContract.toLowerCase(),vaultRelayer:wo(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:wo(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:c_({chainId:n,owner:r,typedData:s,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function c_(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=Al[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=xo(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=t0.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${s.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??a+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function i0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return E(`${_l(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function a0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return E(`${_l(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function s0(){return Object.keys(Al).map(Number)}$();Z();var u_="https://api.1inch.dev/swap/v6.0";function c0(e={}){return ze({provider:"oneinch",defaultUrl:u_,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Tl(e={}){return c0(e).baseUrl}function vo(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Pl(e={}){let t=vo(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},c0(e).trusted)}async function l0(e={}){if(!vo(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Cl({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 Cl(e={},t={}){if(!vo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let a=new URLSearchParams({src:r,dst:o,amount:String(i)}),s=await E(`${Tl(t)}/${n}/quote?${a}`,{headers:Pl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?re(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function d_(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Nl(e={},t={}){if(!vo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return E(`${Tl(t)}/${n}/approve/spender`,{headers:Pl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function u0(e={},t={}){if(!vo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,a=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!a)throw new Error("oneinchPrepare requires src, dst, amount, from");let s=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`1inch: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:a,slippage:String(s.selectedBps/100)});e.receiver&&c.set("receiver",e.receiver),e.referrer&&c.set("referrer",e.referrer),e.disableEstimate!=null&&c.set("disableEstimate",String(!!e.disableEstimate)),e.allowPartialFill!=null&&c.set("allowPartialFill",String(!!e.allowPartialFill)),e.includeProtocols&&c.set("includeProtocols",String(e.includeProtocols)),e.excludeProtocols&&c.set("excludeProtocols",String(e.excludeProtocols));let l=await E(`${Tl(t)}/${n}/swap?${c}`,{headers:Pl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),u=l?.tx;if(!u?.to||!u?.data)throw new Error("1inch: swap returned no executable tx");if(u.from&&String(u.from).toLowerCase()!==String(a).toLowerCase())throw new Error("1inch: transaction sender mismatch");let d=l?.dstAmount||l?.toTokenAmount||l?.buyAmount;if(!d)throw new Error("1inch: swap response missing dstAmount");let p=re(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!d_(r)){let f=l?.spender||l?.approvalAddress||(await Nl({chainId:n},t))?.address;if(!f)throw new Error("1inch: ERC-20 route missing approval spender");m={token:r,spender:f,amount:String(i)}}return N({provider:"oneinch",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:p,autoSlippage:p.autoSlippage,requiresApproval:m,transaction:{chainId:n,from:u.from||a,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:fe(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}Z();var m_=96*1024,d0=50;function f_(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>m_)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 _t(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function m0(e,t){let n=_t(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 h_(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 g_(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=_t(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:_t(e.network,`accepts[${t}].network`),amount:m0(e.amount,`accepts[${t}].amount`),asset:_t(e.asset,`accepts[${t}].asset`),payTo:_t(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:h_(e.extra)})}function Ol(e){let t=f_(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>d0)throw new Error(`x402: accepts must contain 1-${d0} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:_t(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(g_));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 p0(e,t){return String(e)===String(t)}function y_(e,t={}){let n=Ol(e),r=_t(t.network,"network"),o=_t(t.asset,"asset"),i=_t(t.payTo,"payTo"),a=BigInt(m0(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&p0(l.asset,o)&&p0(l.payTo,i));if(s.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=s.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>a)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${a}`);return c}function f0(e={}){return e.paymentRequired??e.header??e.body}function h0(e={}){return Ol(f0(e))}function g0(e={},t={}){let n=Ol(f0(e)),r=y_(n,e);return N({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function y0(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}$();var w_="https://api.bankr.bot";function Rl(e={}){return ze({provider:"bankr",defaultUrl:w_,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function b0(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function x_(e={}){let t=b0(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function w0(e={},t=!1){let n=x_(e),r=Rl(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function x0(e,t={}){return E(`${Rl(t).baseUrl}${e}`,{headers:w0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function Ll(e={}){return x0("/wallet/me",e)}async function v0(e={}){return x0("/wallet/portfolio",e)}function So(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function v_(e){let t=So(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 S0(e={},t={}){let n={fromChain:So(e.fromChain,"fromChain"),fromToken:So(e.fromToken,"fromToken"),toChain:So(e.toChain,"toChain"),toToken:So(e.toToken,"toToken"),amount:v_(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return E(`${Rl(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:w0(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function k0(e={}){if(!b0(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await Ll(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var k_=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function ko(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||k_,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function E0(e={}){try{let t=await ko({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 I0(e={}){let t=await ko({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function A0(e,t={}){if(!e)throw new Error("coin required");let n=await ko({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var I_=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function da(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let a=t.url||I_,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(a),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let w;try{w=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{w={raw:String(g.data).slice(0,300)}}d.push(w),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function _0(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await da([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 T0(e,t={}){if(!e)throw new Error("assetId required");let n=await da([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import R0 from"node:path";import{homedir as U_}from"node:os";import{createHash as D_,randomUUID as q_}from"node:crypto";import ae from"node:fs";import pa from"node:path";import{createHash as __,randomUUID as P0}from"node:crypto";var $l=1,ct=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Gt(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(Gt).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Gt(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function C0(e){return __("sha256").update(Gt(e)).digest("hex")}function ma(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 fa(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function N0(e){ae.mkdirSync(e,{recursive:!0,mode:448});try{ae.chmodSync(e,448)}catch{}}function Bl(e){try{let t=ae.statSync(e);return{...JSON.parse(ae.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function er({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:a=3e4,lockWaitMs:s=2e3,lockIdFactory:c=()=>P0()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(a)||a<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(s)||s<0||s>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let b=n();return r(b),{schemaVersion:$l,kind:t,generation:0,data:b}}function d(b){let y;try{y=JSON.parse(b)}catch(S){throw new ct(`corrupt ${t} snapshot: invalid JSON (${S.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new ct(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==$l)throw new ct(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new ct(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...k}=y;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||C0(k)!==v)throw new ct(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(S){throw new ct(`corrupt ${t} snapshot: ${S.message}`,"STORE_CORRUPT")}return k}function p(){if(!ae.existsSync(e))return u();let b=ae.statSync(e);if(!b.isFile()||b.size>i)throw new ct(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ae.chmodSync(e,384)}catch{}return d(ae.readFileSync(e,"utf8"))}function m(){N0(pa.dirname(e));let b=ma(o),y=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:b})}
|
|
144
|
+
`,k=()=>{let _;try{return _=ae.openSync(l,"wx",384),ae.writeFileSync(_,v,"utf8"),ae.fsyncSync(_),ae.closeSync(_),{lockId:y}}catch(C){let L=_!==void 0;if(L)try{ae.closeSync(_)}catch{}if(L)try{ae.unlinkSync(l)}catch{}if(C?.code!=="EEXIST")throw C;return null}},I=ma(o)+s,T=new Int32Array(new SharedArrayBuffer(4));for(;;){let _=k();if(_)return _;let C=ma(o),L=Bl(l),D=!1;if(L){let O=C-Number(L.acquiredAt??L.mtimeMs);D=Number.isFinite(O)&&O>=a}else try{D=C-ae.statSync(l).mtimeMs>=a}catch{D=!1}if(D){let O=Bl(l);if(L?O?.lockId===L.lockId:O===null){try{ae.unlinkSync(l)}catch(B){if(B?.code!=="ENOENT")throw B}continue}}let H=I-C;if(H<=0)throw new ct(`${t} store is busy`,"STORE_BUSY");Atomics.wait(T,0,0,Math.min(10,H))}}function f(b){if(Bl(l)?.lockId===b.lockId)try{ae.unlinkSync(l)}catch(v){if(v?.code!=="ENOENT")throw v}}function h(b){r(b.data);let y={...b,integrity:C0(b)},v=`${Gt(y)}
|
|
145
|
+
`;if(Buffer.byteLength(v)>i)throw new ct(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let k=pa.dirname(e);N0(k);let S=pa.join(k,`.${pa.basename(e)}.${process.pid}.${P0()}.tmp`),I;try{I=ae.openSync(S,"wx",384),ae.writeFileSync(I,v,"utf8"),ae.fsyncSync(I),ae.closeSync(I),I=void 0,ae.renameSync(S,e);try{ae.chmodSync(e,384)}catch{}try{let T=ae.openSync(k,"r");try{ae.fsyncSync(T)}finally{ae.closeSync(T)}}catch{}}finally{if(I!==void 0)try{ae.closeSync(I)}catch{}try{ae.unlinkSync(S)}catch(T){if(T?.code!=="ENOENT")throw T}}}function g(){return fa(p().data)}function w(){let b=p();return{schemaVersion:b.schemaVersion,kind:b.kind,generation:b.generation,data:fa(b.data)}}function x(b){if(typeof b!="function")throw new TypeError("mutator must be a function");let y=m();try{let v=p(),k=fa(v.data),S=b(k,{generation:v.generation,now:ma(o)});return r(k),h({schemaVersion:$l,kind:t,generation:v.generation+1,data:k}),fa(S)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:w,mutate:x})}import{wordlists as T_}from"ethers";var P_=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),C_=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],N_=new Set([12,15,18,21,24]);function O_(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return N_.has(t.length)&&t.every(n=>T_.en.getWordIndex(n)>=0)}var R_=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,L_=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,$_=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function B_(e){let t=O0(e);return $_.has(t)||L_.test(t)}var Eo=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function O0(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function M_(e){let t=O0(e);return[...P_].some(n=>t.includes(n))}function F_(e,t,n){if(typeof t=="string"){if(C_.some(r=>r.test(t))||O_(t))throw new Eo(n);if(R_.test(t)&&!B_(e))throw new Eo(n)}}function Ml(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return F_(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)=>Ml(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(M_(o))throw new Eo(i);e[o]!==void 0&&(r[o]=Ml(e[o],i,o))}return r}function Tt(e){return Ml(e)}var ga=1,L0="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",zF=Object.freeze(["listing","offer","arm","instruct"]),H_=Object.freeze(["open","cancelled","expired","armed","submitted"]),VF=Object.freeze(["arm","sign-and-broadcast"]),j_=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."}),z_=/^(?:0|[1-9][0-9]*)$/,V_=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,W_=/^0x[a-fA-F0-9]{40}$/,G_=/^0x[a-fA-F0-9]{64}$/,K_=/[\u0000-\u001f\u007f]/,Y_=new Set(H_),Dl=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function G(e,t){throw new Dl(e,t)}function vn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))vn(t);Object.freeze(e)}return e}function Ao(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&G(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||K_.test(o))&&G(`${t} is invalid`),r?o.toLowerCase():o}function Re(e,t){let n=Ao(e,t,{max:128});return V_.test(n)||G(`${t} must be a bounded id`),n}function Io(e,t,{positive:n=!1}={}){typeof e=="number"&&G(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return z_.test(r)||G(`${t} must be a canonical integer string`),n&&r==="0"&&G(`${t} must be positive`),r}function xn(e,t){let n=Ao(e,t,{max:42,lower:!0});return W_.test(n)||G(`${t} must be a 20-byte EVM address`),n}function $0(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&G(`${t} must be a plain object`),e}function wn(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&G("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Fl(e){return new Date(e).toISOString()}function X_(e){return D_("sha256").update(Gt(e),"utf8").digest("hex")}function Q_(e=process.env){let t=e.ORACLE_CONFIG_DIR||R0.join(U_(),".config","oracle");return R0.join(t,"local-marketplace.v1.json")}function ha(e){let t=e.status==="submitted";return vn({schemaVersion:ga,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:Y_.has(e.status)?e.status:G("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>vn({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:L0,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function J_(e){(!e||e.schemaVersion!==ga||!Array.isArray(e.listings))&&G("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&G("marketplace capacity exceeded","STORE_LIMIT")}function Ul(e,t){return vn({schemaVersion:ga,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:L0,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function Z_(e,t,n){typeof e=="string"&&G("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=$0(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&G("generic signHash is refused","SIGNHASH_REFUSED");let o=xn(r.from??r.offerer??t.seller,"artifact.from"),i=xn(r.to??r.recipient??n.buyer,"artifact.to"),a=Io(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&G("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&G("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&G("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&G("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function eT(e,t){if(e==null)return{action:"arm"};let n=$0(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&G("generic signHash is refused","SIGNHASH_REFUSED");let r=Ao(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&G("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&G("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&G("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&G("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&G("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&G("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function B0({filePath:e=Q_(),clock:t=()=>Date.now(),idFactory:n=()=>q_()}={}){let r=er({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:ga,listings:[]}),validateData:J_});function o(h,g){return h.tenantId===g}function i(h,g){return h.status==="open"&&Date.parse(h.expiresAt)<=g&&(h.status="expired"),h}function a(h={}){Tt(h);let g=Re(h.tenantId,"tenantId"),w=xn(h.seller,"seller"),x=Ao(h.asset,"asset",{max:128}),b=Io(h.amount,"amount",{positive:!0}),y=Io(h.price,"price",{positive:!0}),v=Io(h.chainId,"chainId",{positive:!0}),k=wn(t),S=Fl(k),I=h.expiresAt==null?Fl(k+864e5):Ao(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(I))||Date.parse(I)<=k)&&G("expiresAt must be after now");let T=Re(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(_=>{_.listings.some(D=>D.listingId===T)&&G("listingId already exists","DUPLICATE");let C={listingId:T,tenantId:g,seller:w,asset:x,amount:b,price:y,chainId:v,status:"open",createdAt:S,expiresAt:I,offers:[],custody:"none",execution:"armed-local"},L={...C,listingHash:X_(C)};return _.listings.push(L),ha(L)})}function s({tenantId:h}={}){let g=Re(h,"tenantId"),w=wn(t);return vn(r.read().listings.filter(x=>o(x,g)).map(x=>ha(i({...x,offers:x.offers.map(b=>({...b}))},w))))}function c({tenantId:h,listingId:g,actor:w}={}){let x=Re(h,"tenantId"),b=Re(g,"listingId"),y=xn(w,"actor"),v=wn(t);return r.mutate(k=>{let S=k.listings.find(I=>o(I,x)&&I.listingId===b);return S||G("listing not found","NOT_FOUND"),i(S,v),S.seller!==y&&G("only the seller can cancel","FORBIDDEN"),S.status!=="open"&&G("listing is not open","NOT_OPEN"),S.status="cancelled",ha(S)})}function l(h={}){Tt(h);let g=Re(h.tenantId,"tenantId"),w=Re(h.listingId,"listingId"),x=xn(h.buyer,"buyer"),b=Io(h.amount,"amount",{positive:!0}),y=wn(t),v=Re(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(k=>{let S=k.listings.find(I=>o(I,g)&&I.listingId===w);return S||G("listing not found","NOT_FOUND"),i(S,y),S.status!=="open"&&G("listing is not open","NOT_OPEN"),S.seller===x&&G("seller cannot offer on their own listing","FORBIDDEN"),S.offers.some(I=>I.offerId===v)&&G("offerId already exists","DUPLICATE"),S.offers.push({offerId:v,buyer:x,amount:b,status:"open",createdAt:Fl(y)}),ha(S)})}function u(h,{tenantId:g,listingId:w,offerId:x,actor:b,now:y,allowed:v=["open","armed"]}){let k=h.listings.find(I=>o(I,g)&&I.listingId===w);k||G("listing not found","NOT_FOUND"),i(k,y),v.includes(k.status)||G("listing is not open","NOT_OPEN"),k.seller!==b&&G("only the seller can arm a fill","FORBIDDEN");let S=k.offers.find(I=>I.offerId===x);return(!S||!["open","armed"].includes(S.status))&&G("offer not found","NOT_FOUND"),{row:k,offer:S}}function d({tenantId:h,listingId:g,offerId:w,actor:x}={}){let b=Re(h,"tenantId"),y=Re(g,"listingId"),v=Re(w,"offerId"),k=xn(x,"actor"),S=wn(t);return r.mutate(I=>{let{row:T,offer:_}=u(I,{tenantId:b,listingId:y,offerId:v,actor:k,now:S});return T.status="armed",_.status="armed",Ul(T,_)})}async function p({tenantId:h,listingId:g,offerId:w,actor:x,instruction:b,executor:y}={}){let v=Re(h,"tenantId"),k=Re(g,"listingId"),S=Re(w,"offerId"),I=xn(x,"actor"),T=wn(t),_=r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:v,listingId:k,offerId:S,actor:I,now:T,allowed:["open","armed"]}),ve=eT(b,W);return W.status="armed",pe.status="armed",{armed:Ul(W,pe),instruction:ve,listingHash:W.listingHash}});if(_.instruction.action==="arm")return _.armed;let C=r.read().listings.find(B=>B.listingId===k&&B.tenantId===v),L=C?.offers.find(B=>B.offerId===S),D=Z_(_.instruction.artifact,C,L);(!y||typeof y.executeConfirmedArtifact!="function")&&G("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&G("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await y.executeConfirmedArtifact(D,_.instruction.nonce,y),O=H?.receipt?.transactionHash??H?.transactionHash;(typeof O!="string"||!G_.test(O))&&G("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let j=H?.receipt?.status??H?.status;return j!==1&&j!=="0x1"&&G("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:v,listingId:k,offerId:S,actor:I,now:wn(t),allowed:["armed"]});return W.status="submitted",pe.status="submitted",W.transactionHash=O.toLowerCase(),vn({...Ul(W,pe),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:W.transactionHash,review:`Local P2 fill ${W.listingId} signed and broadcast through the instructed local signer. transactionHash=${W.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Re(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&G("consult text required"),vn({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 j_}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import M0 from"node:path";import{homedir as tT}from"node:os";import{createHash as nT,randomUUID as rT}from"node:crypto";var ba=1,F0="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",JF=Object.freeze(["open","cancelled","armed","submitted"]),oT=/^(?:0|[1-9][0-9]*)$/,iT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,aT=/^0x[a-fA-F0-9]{40}$/,sT=/^0x[a-fA-F0-9]{64}$/,cT=/[\u0000-\u001f\u007f]/,jl=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function X(e,t){throw new jl(e,t)}function _o(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))_o(t);Object.freeze(e)}return e}function To(e,t,{max:n=256}={}){typeof e!="string"&&X(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||cT.test(r))&&X(`${t} is invalid`),r}function Pt(e,t){let n=To(e,t,{max:128});return iT.test(n)||X(`${t} must be a bounded id`),n}function ya(e,t,{positive:n=!1}={}){typeof e=="number"&&X(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return oT.test(r)||X(`${t} must be a canonical integer string`),n&&r==="0"&&X(`${t} must be positive`),r}function Sn(e,t){let n=To(e,t,{max:42}).toLowerCase();return aT.test(n)||X(`${t} must be a 20-byte EVM address`),n}function lT(e){let t=To(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{X("resource must be an https URL")}return n.protocol!=="https:"&&X("resource must be https"),(n.username||n.password)&&X("resource must not contain credentials"),n.toString()}function U0(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&X(`${t} must be a plain object`),e}function uT(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&X("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function dT(e){return new Date(e).toISOString()}function pT(e=process.env){let t=e.ORACLE_CONFIG_DIR||M0.join(tT(),".config","oracle");return M0.join(t,"local-x402.v1.json")}function ql(e){let t=e.status==="submitted";return _o({schemaVersion:ba,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:F0,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function mT(e){(!e||e.schemaVersion!==ba||!Array.isArray(e.intents))&&X("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&X("x402 capacity exceeded","STORE_LIMIT")}function Hl(e){return _o({schemaVersion:ba,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:F0,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function fT(e,t){typeof e=="string"&&X("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=U0(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&X("generic signHash is refused","SIGNHASH_REFUSED");let r=Sn(n.from??t.payer,"artifact.from"),o=Sn(n.to??t.payTo,"artifact.to"),i=ya(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&X("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&X("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&X("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&X("amount exceeds maxBudget","BUDGET"),n}function hT(e,t){if(e==null)return{action:"arm"};let n=U0(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&X("generic signHash is refused","SIGNHASH_REFUSED");let r=To(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&X("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&X("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&X("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&X("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function D0({filePath:e=pT(),clock:t=()=>Date.now(),idFactory:n=()=>rT()}={}){let r=er({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:ba,intents:[]}),validateData:mT});function o(l={}){Tt(l);let u=Pt(l.tenantId,"tenantId"),d=Sn(l.payer,"payer"),p=Sn(l.payTo,"payTo"),m=lT(l.resource),f=ya(l.amount,"amount",{positive:!0}),h=ya(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&X("amount exceeds maxBudget","BUDGET");let g=To(l.asset??"USDC","asset",{max:32}),w=ya(l.chainId,"chainId",{positive:!0}),x=uT(t),b=Pt(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(S=>S.intentId===b)&&X("intentId already exists","DUPLICATE");let v={intentId:b,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:w,status:"open",createdAt:dT(x),custody:"none",execution:"armed-local"},k={...v,intentHash:nT("sha256").update(Gt(v),"utf8").digest("hex")};return y.intents.push(k),ql(k)})}function i({tenantId:l}={}){let u=Pt(l,"tenantId");return _o(r.read().intents.filter(d=>d.tenantId===u).map(ql))}function a({tenantId:l,intentId:u,actor:d}={}){let p=Pt(l,"tenantId"),m=Pt(u,"intentId"),f=Sn(d,"actor");return r.mutate(h=>{let g=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return g||X("intent not found","NOT_FOUND"),g.payer!==f&&X("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&X("intent is not open","NOT_OPEN"),g.status="cancelled",ql(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=Pt(l,"tenantId"),m=Pt(u,"intentId"),f=Sn(d,"actor");return r.mutate(h=>{let g=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return g||X("intent not found","NOT_FOUND"),g.payer!==f&&X("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||X("intent is not open","NOT_OPEN"),g.status="armed",Hl(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=Pt(l,"tenantId"),h=Pt(u,"intentId"),g=Sn(d,"actor"),w=r.mutate(S=>{let I=S.intents.find(_=>_.tenantId===f&&_.intentId===h);I||X("intent not found","NOT_FOUND"),I.payer!==g&&X("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(I.status)||X("intent is not open","NOT_OPEN");let T=hT(p,I);return I.status="armed",{armed:Hl(I),instruction:T}});if(w.instruction.action==="arm")return w.armed;let x=r.read().intents.find(S=>S.tenantId===f&&S.intentId===h),b=fT(w.instruction.artifact,x);(!m||typeof m.executeConfirmedArtifact!="function")&&X("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&X("generic signHash executors are refused","SIGNHASH_REFUSED");let y=await m.executeConfirmedArtifact(b,w.instruction.nonce,m),v=y?.receipt?.transactionHash??y?.transactionHash;(typeof v!="string"||!sT.test(v))&&X("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let k=y?.receipt?.status??y?.status;return k!==1&&k!=="0x1"&&X("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(S=>{let I=S.intents.find(T=>T.tenantId===f&&T.intentId===h);return(!I||I.status!=="armed")&&X("intent is not armed","NOT_OPEN"),I.status="submitted",I.transactionHash=v.toLowerCase(),_o({...Hl(I),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:I.transactionHash,review:`Oracle local x402 ${I.intentId} signed and broadcast. transactionHash=${I.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import q0 from"node:path";import{homedir as gT}from"node:os";import{randomUUID as yT}from"node:crypto";var Wl=1,bT="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",s6=Object.freeze(["listed","revoked"]),wT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,xT=/[\u0000-\u001f\u007f]/,vT=/^[a-f0-9]{64}$/,ST=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,kT=new Set(["read","prepare","none"]),Vl=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function ke(e,t){throw new Vl(e,t)}function Gl(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Gl(t);Object.freeze(e)}return e}function Kt(e,t,{max:n=256}={}){typeof e!="string"&&ke(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||xT.test(r))&&ke(`${t} is invalid`),r}function Po(e,t){let n=Kt(e,t,{max:128});return wT.test(n)||ke(`${t} must be a bounded id`),n}function H0(e,t){let n=Kt(e,t,{max:64}).toLowerCase();return vT.test(n)||ke(`${t} must be 64 lowercase hex`),n}function ET(e,t){let n=Kt(e,t,{max:2048}),r;try{r=new URL(n)}catch{ke(`${t} must be an https URL`)}return r.protocol!=="https:"&&ke(`${t} must be https`),(r.username||r.password)&&ke(`${t} must not contain credentials`),r.toString()}function IT(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&ke("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Kt(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!ST.test(r)||r==="0.0.0.0")&&ke(`outboundHosts[${n}] is not an allowlisted host`),r}))}function j0(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ke("clock invalid","CLOCK_INVALID"),n}function z0(e){return new Date(e).toISOString()}function AT(e=process.env){let t=e.ORACLE_CONFIG_DIR||q0.join(gT(),".config","oracle");return q0.join(t,"local-pack-registry.v1.json")}function zl(e){return Gl({schemaVersion:Wl,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:bT,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function _T(e){(!e||e.schemaVersion!==Wl||!Array.isArray(e.packs))&&ke("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&ke("pack registry capacity exceeded","STORE_LIMIT")}function V0({filePath:e=AT(),clock:t=()=>Date.now(),idFactory:n=()=>yT()}={}){let r=er({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Wl,packs:[]}),validateData:_T});function o(l={}){Tt(l);let u=Po(l.tenantId,"tenantId"),d=Kt(l.name,"name",{max:128}),p=Kt(l.version,"version",{max:64}),m=Kt(l.publisher,"publisher",{max:128}),f=H0(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:H0(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:ET(l.homepage,"homepage"),w=IT(l.outboundHosts),x=Kt(l.spendScope??"none","spendScope",{max:16});kT.has(x)||ke("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&ke("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let b=j0(t),y=Po(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(S=>S.packId===y||S.tenantId===u&&S.name===d&&S.version===p&&S.status==="listed")&&ke("pack already listed","DUPLICATE");let k={packId:y,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:w,spendScope:x,status:"listed",createdAt:z0(b),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(k),zl(k)})}function i({tenantId:l}={}){let u=Po(l,"tenantId");return Gl(r.read().packs.filter(d=>d.tenantId===u).map(zl))}function a({tenantId:l,packId:u}={}){let d=Po(l,"tenantId"),p=Po(u,"packId"),m=j0(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||ke("pack not found","NOT_FOUND"),h.status!=="listed"&&ke("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=z0(m),zl(h)})}function s(){ke("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){ke("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}$();import{getAddress as LT,Interface as nr,keccak256 as Xl}from"ethers";import{createHash as Ql,createHmac as $T,timingSafeEqual as ag}from"node:crypto";he();import{Interface as K0,getAddress as Kl,isAddress as TT}from"ethers";var PT="0x0000000000000000000000000000000000000000",Y0=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),CT=new K0(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),NT=new K0(["function quoteExactInputSingle((address tokenIn,address tokenOut,uint256 amountIn,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)","function quoteExactOutputSingle((address tokenIn,address tokenOut,uint256 amount,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountIn,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)"]);function OT(e){let t=Number(e??4663),n=Y0[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function W0(e,t){if(/^weth$/i.test(String(e||"")))return Kl(Y0[t].weth);if(!TT(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Kl(e)}function RT(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function G0(e,t,n,r,o,i){let a=r.encodeFunctionData(o,i),s=await e(t,"eth_call",[{to:n,data:a},"latest"]);if(!s||s==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,s)}async function X0(e,t={},n={}){try{let r=OT(t.chainId),o=W0(t.tokenIn,r.chainId),i=W0(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=RT(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),s=Number(t.tickSpacing??2e3);if(!Number.isInteger(s)||s<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||U,l=await G0(c,r.chainId,r.factory,CT,"getPool",[o,i,s]),u=Kl(l[0]);if(u.toLowerCase()===PT)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:a,tickSpacing:s,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:a,tickSpacing:s,sqrtPriceLimitX96:0n},m=await G0(c,r.chainId,r.quoter,NT,d,[p]),f={provider:"up33",venue:"up33-v3",chainId:r.chainId,chain:r.name,factory:r.factory,quoter:r.quoter,router:r.router,pool:u.toLowerCase(),tokenIn:o.toLowerCase(),tokenOut:i.toLowerCase(),tickSpacing:s,sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...f,amountIn:a.toString(),amountOut:m[0].toString()}:{...f,amountIn:m[0].toString(),amountOut:a.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Q0(e={},t={}){return X0("exact-input",e,t)}async function J0(e={},t={}){return X0("exact-output",e,t)}Z();var V=4663,wa="https://anvil.clutch.market",BT=`${wa}/api/markets/snapshot?chainId=${V}`,MT=`${wa}/api/rpc?chainId=${V}`,FT=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),We="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Jl="0x0000000000000000000000000000000000000000",kn=1e5,UT=256e3,Z0=256,DT=3e4,qT=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"}),et=Object.freeze({chainId:V,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ce=new nr(["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"]),HT=new nr(["function allowance(address owner,address spender) view returns (uint256)"]),sg=new nr(["function decimals() view returns (uint8)"]),eg=new nr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),tt=new nr(["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)"]),Yt=new nr(["function pendingEth() view returns (uint256)","function minDropWei() view returns (uint256)","function roundActive() view returns (bool)","function currentRound() view returns (uint256)","function roundState() view returns (uint256 roundId,bool active,uint256 cursor,uint256 remaining,uint256[3] amounts,uint256[3] paid)","function getStockTokens() view returns (address[3])","function startDropPublic(uint256 minOutBps)","function continueDrop(uint256 batchSize)"]);function q(e,t){try{return LT(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Nt(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 Ge(e,t,n=null){let r=e==null&&n!=null?n:e,o=String(r??"").trim();if(!/^\d+$/.test(o))throw new Error(`stonkbrokers: ${t} must be an unsigned integer`);return BigInt(o)}async function ee(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(V,"eth_call",[{to:q(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function cg(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 tg(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>Z0)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Z0}`);return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new Error("stonkbrokers: Anvil snapshot rows must be objects");if(Number(n.chainId)!==V)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${V}`);return{name:n.name||n.collectionName||null,chainId:V,collection:q(n.collection||n.collectionAddress,"Anvil collection"),market:q(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?q(n.tokenAddress,"Anvil payment token"):null,floorPrice:n.floorPrice??null,buyPrice:n.buyPrice??null,tokensPerNFT:n.tokensPerNFT??null,inventoryCount:Number(n.inventoryCount??n.inventoryLength??0),specificFeeBps:Number(n.specificFeeBps??0),source:"anvil-snapshot"}})}async function jT(e,t,n=[],r={}){if(Number(e)!==V)throw new Error(`stonkbrokers: Anvil supports chain ${V} only`);if(!FT.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await E(MT,{method:"POST",headers:{origin:wa,referer:`${wa}/`,"user-agent":"Mozilla/5.0"},body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??2e4,retries:0});if(o?.error)throw new Error(`stonkbrokers: Anvil RPC ${o.error.message||"failed"}`);if(o?.result==null)throw new Error("stonkbrokers: Anvil RPC returned no result");return o.result}function lt(e={}){return e.rpcCall||((t,n,r)=>jT(t,n,r,e))}async function rr(e={},t={}){if(e.snapshot){let s=tg(e.snapshot),c={kind:"anvil-markets",chainId:V,total:s.length,contentHash:Ql("sha256").update(tr(s)).digest("hex")},l=Zl(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(s,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),s}let n=s=>{let c=String(s?.headers?.get?.("content-type")||"").split(";",1)[0].trim().toLowerCase();if(c!=="application/json"&&!c.endsWith("+json"))throw new Error("stonkbrokers: Anvil snapshot content-type must be JSON")},r=await E(BT,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:UT,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=tg(r),i={kind:"anvil-markets",chainId:V,total:o.length,contentHash:Ql("sha256").update(tr(o)).digest("hex")},a=Zl(e.snapshotCompletenessEvidence??r.completenessEvidence,i,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(o,"snapshotCoverage",{value:{complete:a.valid,evidence:a.evidence,error:a.error},enumerable:!1}),o}function xa(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 lg({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 rr({},n)).find(f=>f.market===e);if(!i)throw new Error("stonkbrokers: market is missing from the trusted Anvil snapshot");if(i.collection!==t)throw new Error("stonkbrokers: trusted Anvil snapshot collection mismatch");if(!i.tokenAddress)throw new Error("stonkbrokers: trusted Anvil snapshot payment token is missing");let a=qT[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=lt(n),c=xa(await s(V,"eth_blockNumber",[])),l=await s(V,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||xa(l?.number)!==c)throw new Error("stonkbrokers: Anvil RPC returned an invalid block attestation");let d=Object.freeze({blockHash:u,requireCanonical:!0}),p=String(await s(V,"eth_getCode",[e,d])).toLowerCase();if(!/^0x[0-9a-f]+$/.test(p)||p==="0x")throw new Error("stonkbrokers: Anvil market runtime is empty");let m=Xl(p).toLowerCase();if(m!==a)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:s,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:m,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+DT}}function ug(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:V,market:e.record.market,collection:e.record.collection,paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r,snapshotFetchedAtMs:e.snapshotFetchedAtMs,snapshotExpiresAtMs:e.snapshotExpiresAtMs,blockNumber:BigInt(e.blockNumber).toString(),blockHash:e.blockHash,runtimeCodeHash:e.runtimeCodeHash})}async function No(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=Nt(e.tokenId),i=await lg({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,Ce,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Ce,"inventory",[BigInt(o)],s),ee(a,r,tt,"ownerOf",[BigInt(o)],s),ee(a,n,Ce,"collection",[],s),ee(a,n,Ce,"token",[],s),ee(a,n,Ce,"robinhoodSwapFeeWei",[],s)]),f=q(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=q(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await ee(a,h,sg,"decimals",[],s))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(m[0]).toString(),x=ug(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),b=!!c[4],y=!!l[0],v=q(u[0],"NFT owner")===n,k=b&&y&&v;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:V,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:g,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:w,fees:cg(c[2],c[3]),available:k,evidence:{quoteAvailable:b,inventory:y,ownerIsMarket:v,marketCollection:f,attestation:x},reason:k?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function va(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await lg({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Ce,"quoteSellNFT",[],a),ee(i,n,Ce,"collection",[],a),ee(i,n,Ce,"token",[],a),ee(i,n,Ce,"robinhoodSwapFeeWei",[],a)]),d=q(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=q(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await ee(i,p,sg,"decimals",[],a))[0]);if(!Number.isSafeInteger(m)||m<0||m>255)throw new Error("stonkbrokers: invalid payment token decimals");let f=BigInt(u[0]).toString(),h=ug(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:V,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(s[0]).toString(),grossPayoutRaw:BigInt(s[1]).toString(),nativeSwapFeeWei:f,fees:cg(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function dg(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 Ct(e,t){let n=Ge(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function pg({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:V,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Ct(o,"gasLimit").toString(),maxFeePerGas:Ct(i,"maxFeePerGasWei").toString(),nonce:Number(s),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return a!=null&&a!==""&&(c.maxPriorityFeePerGas=Ct(a,"maxPriorityFeePerGasWei").toString()),c}function mg(e,t){return N({provider:"anvil-nft",kind:"anvil-nft-execution",execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:"pending-local-signer",broadcast:"pending-local-signer",simulation:"required-again-at-local-signer",localSignerEnvelope:e,quote:t},{provider:"anvil-nft",kind:"anvil-nft-execution"})}async function fg(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=q(e.market,"Anvil market"),o=q(e.collection,"NFT collection"),i=Nt(e.tokenId),a=Ct(e.maxTotalCostRaw,"maxTotalCostRaw"),s=Ge(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 No({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>a||BigInt(l.nativeSwapFeeWei)>s)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=Ct(e.confirmedTotalCostRaw,"confirmedTotalCostRaw");if(d!==u)throw new Error("stonkbrokers: confirmed buy economics do not match the exact fresh quote");let p=Number(t.nowMs??Date.now()),m=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),f=q(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,w={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await ee(lt(t),f,HT,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let b={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[pg({...b,to:r,data:Ce.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],v={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},k={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:g,anvilQuote:v,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:dg(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:v,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:y}};return mg(k,l)}async function hg(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=lt(t),r=q(e.seller,"seller"),o=q(e.market,"Anvil market"),i=q(e.collection,"NFT collection"),a=Nt(e.tokenId),s=Ct(e.minPayoutRaw,"minPayoutRaw"),c=Ge(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 va({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([ee(n,i,tt,"ownerOf",[BigInt(a)],p).then(_=>q(_[0],"NFT owner")),ee(n,i,tt,"getApproved",[BigInt(a)],p).then(_=>q(_[0],"NFT approval")),ee(n,i,tt,"isApprovedForAll",[r,o],p).then(_=>!!_[0])]);if(m!==r)throw new Error("stonkbrokers: seller does not own exact NFT");if(f!==o&&!h)throw new Error("stonkbrokers: pre-existing NFT approval is required");if(BigInt(u.netPayoutRaw)<s||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let g=BigInt(u.netPayoutRaw),w=Ct(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),b=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=q(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),k={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},S=[pg({...k,to:o,data:Ce.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],I={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},T={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:y,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:I,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:w.toString()},tradeId:dg(e.tradeId),slippageBps:0,expiresAtMs:x+b,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:I,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:S}};return mg(T,u)}async function zT(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(v=>Nt(v)),b={kind:"anvil-inventory",chainId:V,market:q(e.market,"Anvil market"),collection:q(e.collection,"NFT collection"),total:x.length,contentHash:Ql("sha256").update(tr(x)).digest("hex")},y=Zl(e.inventoryCompletenessEvidence,b,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:x,total:x.length,scanned:x.length,complete:y.valid,continuation:y.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=lt(t),r=q(e.market,"Anvil market"),o=xa(await n(V,"eth_blockNumber",[])),i=await n(V,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||xa(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Ce,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>kn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${kn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>kn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${kn}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:kn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,Ce,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let x=f.toString();g.add(x),h.push(x),f=BigInt((await ee(n,r,Ce,"getNextTokenId",[f],s))[0])}let w=h.length===l;return{ids:h,total:l,scanned:h.length,complete:w,continuation:w?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function VT(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 WT(e,t,n){let r=lt(n);try{let o=String((await ee(r,e,tt,"tokenURI",[BigInt(t)]))[0]),i=VT(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await E(a,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,lookupFn:n.lookupFn,untrustedUrl:!0,maxResponseBytes:256e3})}catch(o){if(n.allowRarityOfFallback===!1)throw o;let i=await ee(r,e,tt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function gg(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 GT(e,t=[]){let n=Array.isArray(e?.attributes)?e.attributes:[];return t.every(r=>{let o=String(r?.traitType??r?.trait_type??"").trim().toLowerCase();if(!o)throw new Error("stonkbrokers: trait filter requires traitType");let i=n.find(u=>String(u?.trait_type??u?.traitType??"").trim().toLowerCase()===o),a=String(r?.op||"eq").trim().toLowerCase();if(a==="exists")return i!=null;if(i==null)return!1;let s=i.value;if(a==="eq")return String(s).toLowerCase()===String(r.value).toLowerCase();if(a==="in")return Array.isArray(r.values)&&r.values.some(u=>String(s).toLowerCase()===String(u).toLowerCase());let c=Number(s),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(a==="gte")return c>=l;if(a==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${a}`)})}async function Sa(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await zT({...e,market:n},t),i=o.ids,a=Math.min(Math.max(Number(e.minStars??4)||4,1),5),s=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=lt(t),p=(await Me(i,s,async h=>{try{let g=await ee(u,r,tt,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(g[0])+1}}catch(g){return e.includeErrors?{tokenId:h,stars:null,error:String(g.message||g)}:null}})).filter(h=>h&&h.stars>=a),f=(await Me(p,s,async h=>{try{let g=await No({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:g.available,quote:g,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(g){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(g.message||g)}:null}})).filter(Boolean).sort((h,g)=>Number(g.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(g.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:V,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:f.length,candidates:f,exec:!1,readOnly:!0}}let l=(await Me(i,s,async u=>{try{let[d,p]=await Promise.all([WT(r,u,t),No({market:n,collection:r,tokenId:u},t)]),m=gg(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?GT(d,f):e.includeAll===!0?!0:m!=null&&m>=a)?{tokenId:u,stars:m,traits:d.attributes||[],available:p.available,quote:p,decision:"WATCH",reason:"trait evidence is ranking-only until exact exit liquidity clears net-profit gates"}:null}catch(d){return e.includeErrors?{tokenId:u,available:!1,error:String(d.message||d)}:null}})).filter(Boolean).sort((u,d)=>Number(d.stars||0)-Number(u.stars||0)||(BigInt(u.tokenId)<BigInt(d.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-traits",chainId:V,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:l.length,candidates:l,exec:!1,readOnly:!0}}function yg(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function ng(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 bg(e={}){return{maxMarkets:ng(e,"maxMarkets",kn),maxItemsPerMarket:ng(e,"maxItemsPerMarket",kn)}}function wg(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Co(e,t){let n=Number(t?.inventoryTotal??e.inventoryCount??0),r=Number(e.inventoryCount??0),o=Number(t?.inventoryScanned??t?.scanned??0),i=Number.isFinite(o)?Math.min(Math.max(o,0),n):0,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function xg(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(s=>s.complete===!0),a=t.filter(s=>s.complete!==!0).map(s=>({market:s.market,continuation:s.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?a.length?{markets:a}:null:{snapshotEvidenceRequired:!0,...a.length?{markets:a}:{}}:{marketOffset:n}}}async function vg(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=bg(e),o=await rr(e,t),i=wg(o,e,n),a=t.scanCollection||Sa,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Me(i,s,async l=>{let u=yg(e,l.collection);try{let d={...e,...u,market:l.market,collection:l.collection,includeAll:u.includeAll??!u.raritySource};r!=null&&(d.maxItems=r);let p=await a(d,t);return{...l,status:"ok",scan:p,...Co(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Co(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:V,marketCount:i.length,...xg(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 Sg(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=bg(e),o=await rr(e,t),i=o.snapshotCoverage?.complete===!0,a=wg(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||eu,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Me(a,l,async d=>{let p=yg(e,d.collection),m=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Co(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=Co(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),...Co(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:V,marketCount:a.length,...xg(o,u),scannedMarketCount:u.filter(d=>d.scan).length,arbCount:i?u.reduce((d,p)=>d+(p.complete?Number(p.scan?.arbCount||0):0),0):0,markets:u,exec:!1,readOnly:!0}}function rg(e,t){return e>t?"ARB":"PASS"}async function KT(e={},t={}){let n=String(e.direction||""),r=Ge(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=q(e.paymentToken,"Anvil payment token"),i={chainId:V,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:lt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||J0)({chainId:V,tokenIn:We,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:We,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||Yp)({...i,tokenIn:We,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:We,amountOutRaw:r.toString(),amountInWei:String(u.amountIn),source:`uniswap-v4:${u.poolId}`,venue:u.venue||"uniswap-v4",fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks||null,poolId:u.poolId,gasEstimate:u.gasEstimate}}if(n!=="liquidate-exact-input")throw new Error("stonkbrokers: unsupported conversion direction");let s=await(t.up33QuoteExactIn||Q0)({chainId:V,tokenIn:o,tokenOut:We,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:We,amountInRaw:r.toString(),amountOutWei:String(s.amountOut),source:`up33:${s.pool}`,venue:s.venue||"up33-v3",tickSpacing:s.tickSpacing,pool:s.pool,quoter:s.quoter,gasEstimate:s.gasEstimate};let c=await(t.uniV4QuoteExactIn||Vr)({...i,tokenIn:o,tokenOut:We,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:We,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 og(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=q(e.quoteToken,"conversion quote token");if(n!==We)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=Ge(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=Ge(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function YT(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 tr(e){return Array.isArray(e)?`[${e.map(tr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${tr(e[t])}`).join(",")}}`:JSON.stringify(e)}function kg(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:$T("sha256",n).update(tr(r)).digest("hex")}}function XT(e,t){return kg(e,t)}function Zl(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=XT(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!ag(a,s))throw new Error("completeness evidence authentication failed");for(let[u,d]of Object.entries(t))if(String(e[u])!==String(d))throw new Error(`completeness evidence ${u} mismatch`);let c=Number(e.quotedAtMs),l=Number(e.expiresAtMs);if(!Number.isFinite(c)||!Number.isFinite(l)||c>n||l<=n||l<=c)throw new Error("completeness evidence is stale or has invalid freshness bounds");if(!String(e.source||"").trim())throw new Error("completeness evidence source is required");return{valid:!0,evidence:e,error:null}}catch(o){return{valid:!1,evidence:null,error:String(o.message||o)}}}function QT(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:YT(e,t)}function Yl(e,t,n,r,o,i){let a=QT(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==V)throw new Error(`${r} evidence chainId mismatch`);if(String(a.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(a.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(a.source||"").trim())throw new Error(`${r} evidence source is required`);if(!i||String(i).length<16)throw new Error(`${r} trusted attestation secret is unavailable`);let s=String(a.mac||"").toLowerCase(),c=kg(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!ag(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(a.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(a.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(a.blockHash||"").toLowerCase()!==o.blockHash||String(a.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(a.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&q(a.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(a.quotedAtMs),p=Number(a.expiresAtMs);if(!Number.isFinite(d)||!Number.isFinite(p)||d>n||p<=n||p<=d)throw new Error(`${r} evidence is stale or has invalid freshness bounds`);let m=a.amountWei??a.amount??a.gasCostWei??a.gasPriceWei,f=Ge(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Ct(a.gasLimit,`${r} evidence gasLimit`),g=Ct(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let w=a.simulation;if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`${r} simulation evidence is required`);if(Number(w.chainId)!==V)throw new Error(`${r} simulation chainId mismatch`);if(String(w.route||"")!==t||String(w.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(w.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(w.blockHash||"").toLowerCase()!==o.blockHash||String(w.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(w.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(q(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let b=q(w.sender,`${r} simulation sender`),y=q(w.owner,`${r} simulation owner`);if(!o.owner||b!==o.owner||y!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Ge(w.valueWei,`${r} simulation valueWei`))!==String(Ge(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(w.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&q(w.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(w.success!==!0||w.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(w.result??"")))throw new Error(`${r} simulation did not return a successful result`);let v=Number(w.quotedAtMs),k=Number(w.expiresAtMs);if(!Number.isFinite(v)||!Number.isFinite(k)||v>n||k<=n||k<=v)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...a,amountWei:f.toString()},error:null}}catch(s){return{amount:null,evidence:null,error:String(s.message||s)}}}function ig(e){let t=q(e,"OpenSea payment token");if(t!==Jl&&t!==We)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function eu(e={},t={}){let n=await Sa(e,t),r=Number(t.nowMs??Date.now());if(!Number.isFinite(r))throw new Error("stonkbrokers: opts.nowMs must be finite");let o=t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET,i=null;try{i=q(e.owner,"execution owner")}catch{}let a=(w,x,b,y={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:b,owner:i,...y}),s=(w,x,b,y,v)=>Yl(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(b,y,x,v),o),c=(w,x)=>{let b=null;try{b=q(w?.target,"conversion target")}catch{}let y=a(w?.calldataHash,w,"conversion",{target:b,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(y.calldataHash)||!/^0x[0-9a-f]{64}$/.test(y.blockHash)||!/^\d+$/.test(y.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let v=Yl(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",y,o);if(v.amount!=null||w?.gasEstimate==null)return v;let k=Yl(e.gasPriceEvidence,x,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(k.amount==null)return{amount:null,evidence:null,error:k.error};let S=Ge(w.gasEstimate,"conversion gasEstimate");return{amount:S*k.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:S.toString(),gasPriceEvidence:k.evidence},error:null}},l=(w,x,b,y,v)=>{try{let k=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(k))throw new Error("exact Seaport order hash is required");let S=q(x?.protocolAddress,"Seaport protocol address"),I=String(x?.executionCalldataHash||"").toLowerCase(),T=/^0x[0-9a-f]{64}$/.test(I)?I:null,_=y==="seaport-fulfillment"&&v===Jl?String(x?.priceWei??""):"0",C={orderHash:k,protocolAddress:S,target:S,valueWei:_},L=s(w,y,T,b,C);if(L.amount==null)throw new Error(L.error);if(L.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let D=L.evidence?.approvalRequired;if(typeof D!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==D)throw new Error("Seaport approval requirement evidence mismatch");let H=[L];if(D){let j=String(x?.approvalCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(j)?j:null,W=y==="seaport-offer-acceptance"?n.collection:v;H.push(s(w,"seaport-approval",B,b,{...C,target:W,valueWei:"0"}))}if(v===Jl){let j=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",B=String(x?.prerequisiteCalldataHash||"").toLowerCase(),W=/^0x[0-9a-f]{64}$/.test(B)?B:null,pe=j==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";H.push(s(w,j,W,b,{...C,target:We,valueWei:pe}))}let O=H.find(j=>j.amount==null);if(O)throw new Error(O.error);return{amount:H.reduce((j,B)=>j+B.amount,0n),evidence:H.map(j=>j.evidence),error:null}}catch(k){return{amount:null,evidence:null,error:String(k.message||k)}}},u=Ge(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||_i,p=t.openSeaBestOffer||Ti,m=t.paymentTokenConversion||(w=>KT({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await va({market:n.market,collection:n.collection},t),h=[];for(let w of n.candidates){let x=null;try{x=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId},t)}catch{}let b=w.quote,y=Xl(Ce.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(b.totalCostRaw)])).toLowerCase(),v=s("anvil-to-opensea","anvil-call",y,b.evidence.attestation,{target:n.market,valueWei:b.nativeSwapFeeWei}),k=null,S=null;if(x)try{k=ig(x.paymentToken)}catch(B){S=String(B.message||B)}let I=S||!x?{amount:null,evidence:null,error:S||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,b.evidence.attestation,"seaport-offer-acceptance",k),T={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:b.paymentToken,amountUnits:b.amountUnits,anvilTotalCostRaw:b.totalCostRaw,anvilBaseCostRaw:b.baseCostRaw,anvilFeeRaw:b.fees.totalFeeRaw,paymentTokenDecimals:b.paymentTokenDecimals,nativeSwapFeeWei:b.nativeSwapFeeWei,openSeaGrossOfferWei:x?.grossOfferWei==null?null:String(x.grossOfferWei),openSeaSellingValueWei:x?.sellerNetWei==null?null:String(x.sellerNetWei),openSeaFeeWei:x?.feeWei==null?null:String(x.feeWei),openSeaPaymentToken:k,gasCostWei:v.amount==null?null:v.amount.toString(),gasEvidence:v.evidence,marketplaceGasCostWei:I.amount==null?null:I.amount.toString(),marketplaceGasEvidence:I.evidence,conversionGasCostWei:null};if(x?.sellerNetWei==null||!b.available)h.push({...T,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(S)h.push({...T,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${S}`});else if(v.amount==null)h.push({...T,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${v.error}`});else if(I.amount==null)h.push({...T,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${I.error}`});else if(typeof m!="function")h.push({...T,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let B=og(await m({chainId:V,direction:"acquire-exact-output",amountRaw:b.totalCostRaw,paymentToken:b.paymentToken,quoteToken:We}),{direction:"acquire-exact-output",amountRaw:b.totalCostRaw}),W=c(B,"anvil-to-opensea");if(W.amount==null)h.push({...T,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${W.error}`});else{let pe=v.amount+I.amount+W.amount,ve=BigInt(x.sellerNetWei)-BigInt(B.amountInWei)-BigInt(b.nativeSwapFeeWei)-pe;h.push({...T,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilCostInWethWei:B.amountInWei,conversion:B,netWei:ve.toString(),decision:rg(ve,u),reason:ve>u?"exact inventory, exact conversion, native fee, gas, and exact OpenSea seller net clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(B){h.push({...T,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}let _=null;try{_=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!_)continue;let C=Xl(Ce.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),L=s("opensea-to-anvil","anvil-call",C,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),D=null,H=null;try{D=ig(_.paymentToken)}catch(B){H=String(B.message||B)}let O=H?{amount:null,evidence:null,error:H}:l("opensea-to-anvil",_,f.evidence.attestation,"seaport-fulfillment",D),j={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(_.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:D,gasCostWei:L.amount==null?null:L.amount.toString(),gasEvidence:L.evidence,marketplaceGasCostWei:O.amount==null?null:O.amount.toString(),marketplaceGasEvidence:O.evidence,conversionGasCostWei:null};if(H){h.push({...j,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${H}`});continue}if(L.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${L.error}`});continue}if(O.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${O.error}`});continue}if(typeof m!="function"){h.push({...j,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let B=og(await m({chainId:V,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:We}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),W=c(B,"opensea-to-anvil");if(W.amount==null)h.push({...j,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${W.error}`});else{let pe=L.amount+O.amount+W.amount,ve=BigInt(B.amountOutWei)-BigInt(_.priceWei)-BigInt(f.nativeSwapFeeWei)-pe;h.push({...j,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilPayoutInWethWei:B.amountOutWei,conversion:B,netWei:ve.toString(),decision:rg(ve,u),reason:ve>u?"exact OpenSea listing, exact conversion, native fee, gas, and current Anvil payout clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(B){h.push({...j,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}}let g=n.complete===!0?h:h.map(w=>w.decision==="ARB"?{...w,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:w);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:V,collection:n.collection,market:n.market,slug:String(e.slug||""),gasCostWei:null,conversionGasCostWei:null,gasPriceWei:null,inventoryTotal:n.inventoryTotal,inventoryScanned:n.inventoryScanned,complete:n.complete,truncated:n.truncated,continuation:n.continuation,minNetWei:u.toString(),opportunities:g.sort((w,x)=>{let b=BigInt(w.netWei??"-1"),y=BigInt(x.netWei??"-1");return y>b?1:y<b?-1:0}),arbCount:g.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function ka(e={},t={}){let n=lt(t),r=Nt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,et.ammVault,eg,"quoteSpecificBuy",[BigInt(r)]),ee(n,et.ammVault,eg,"inventory",[BigInt(r)]),ee(n,et.nft,tt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:q(a[0],"broker owner")===et.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:V,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:s,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function Eg(e,t){try{return q((await ee(t,et.nft,tt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return q((await ee(t,et.nft,tt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Ig(e={},t={}){let n=lt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Me(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Nt(a.brokerTokenId,"brokerTokenId"),c=Nt(a.nestedTokenId,"nestedTokenId"),l=q(a.tba,"TBA"),u=q(a.nestedCollection,"nested collection"),d=gg({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([Eg(s,n),ee(n,u,tt,"ownerOf",[BigInt(c)]).then(g=>q(g[0],"nested owner")),ka({brokerTokenId:s},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:s,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:a.traits||[],available:h,quote:f,decision:"WATCH",reason:h?"rarity is ranking-only until exit-liquidity evidence clears profit gates":"nested custody or parent availability is stale"}})).filter(Boolean).sort((a,s)=>s.stars-a.stars);return{provider:"stonkbrokers",chainId:V,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function Ag(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=Nt(e.brokerTokenId,"brokerTokenId"),o=Ge(e.maxTokenCostWei,"maxTokenCostWei"),i=Ge(e.maxEthFeeWei,"maxEthFeeWei"),a=await ka({brokerTokenId:r},t);if(!a.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(a.tokenCostWei)>o||BigInt(a.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return N({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:V,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:et.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:a.tokenCostWei,quotedEthFeeWei:a.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function Oo(e={},t={}){let n=lt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?et.overtimeBooster:et.stockBooster,[i,a,s,c,l,u]=await Promise.all([ee(n,o,Yt,"pendingEth"),ee(n,o,Yt,"minDropWei"),ee(n,o,Yt,"roundActive"),ee(n,o,Yt,"currentRound"),ee(n,o,Yt,"roundState").catch(()=>null),ee(n,o,Yt,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:V,which:r,booster:o,pendingWei:d.toString(),minDropWei:p.toString(),roundActive:m,roundId:BigInt(c[0]).toString(),cursor:l?BigInt(l[2]).toString():null,remaining:l?BigInt(l[3]).toString():null,stockTokens:u?Array.from(u[0]).map(g=>q(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function _g(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?et.overtimeBooster:et.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Yt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Yt.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return N({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:V,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:V,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function Tg(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>Nt(s,"brokerTokenId")):[],r=lt(t),o=await Me(n,8,async s=>{let[c,l]=await Promise.all([ee(r,et.nft,tt,"ownerOf",[BigInt(s)]).then(u=>q(u[0],"broker owner")),Eg(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Oo({which:"stock"},t),Oo({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:V,owner:e.owner?q(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Pg(e={},t={}){try{let n=await rr(e,t);return{ok:!0,chainId:V,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:V,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Cg(e={},t={}){try{let n=await Oo({which:"stock"},t);return{ok:!0,chainId:V,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:V,error:String(n.message||n).slice(0,180)}}}Z();import{createHash as ZT}from"node:crypto";var Ea="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",eP=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"}]),En=Object.freeze(Object.fromEntries(eP.map(e=>[e.name,e.selector]))),tP=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),nP=new Set(["name","endpoint","version","skills","domains"]),rP=new Set(["agentId","agentRegistry"]),Ng=new Set(["reputation","crypto-economic","tee-attestation"]),oP=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,iP=64*1024;function Ro(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 tu(e,t,n){for(let r of Object.keys(e)){if(oP.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 or(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 Og(e,t,{service:n=!1}={}){let r=or(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 nu(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 Ia(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function ru(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 ou(e){let t=Ia(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return nu(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Lg(){let e=[];try{let t=Ia(process.env.ORACLE_ERC8004_CHAIN_ID);ou(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 aP(e){return JSON.parse(JSON.stringify(e))}function Aa(e){let t=Ro(e,"registration file");if(tu(t,tP,"registration"),t.type!==Ea)throw new Error("erc8004: registration-v1 type required");let n={type:Ea,name:or(t.name,"name",128),description:or(t.description,"description",4096),image:Og(t.image,"image")};if(!Array.isArray(t.services)||t.services.length>32)throw new Error("erc8004: services must be a bounded array");let r=new Set;if(n.services=t.services.map((a,s)=>{let c=Ro(a,`services[${s}]`);tu(c,nP,`services[${s}]`);let l=or(c.name,`services[${s}].name`,64);if(/^(?:x|twitter)$/i.test(l)||/(?:^|\.)x\.com(?:\/|$)|twitter\.com/i.test(String(c.endpoint)))throw new Error("erc8004: X/Twitter services are excluded");let u=l.toLowerCase();if(r.has(u))throw new Error(`erc8004: duplicate service ${l}`);r.add(u);let d={name:l,endpoint:Og(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=or(c.version,`services[${s}].version`,64));for(let p of["skills","domains"])if(c[p]!=null){if(!Array.isArray(c[p])||c[p].length>64||c[p].some(m=>typeof m!="string"||m.length>128))throw new Error(`erc8004: malformed services[${s}].${p}`);d[p]=[...c[p]]}return d}),typeof t.x402Support!="boolean"||typeof t.active!="boolean")throw new Error("erc8004: x402Support and active must be boolean");if(n.x402Support=t.x402Support,n.active=t.active,!Array.isArray(t.registrations)||t.registrations.length>32)throw new Error("erc8004: registrations must be a bounded array");let o=new Set;if(n.registrations=t.registrations.map((a,s)=>{let c=Ro(a,`registrations[${s}]`);tu(c,rP,`registrations[${s}]`);let l=ru(c.agentId),u=/^eip155:([1-9][0-9]*):(0x[0-9a-fA-F]{40})$/.exec(String(c.agentRegistry||""));if(!u)throw new Error(`erc8004: malformed registrations[${s}].agentRegistry`);let d=`eip155:${Number(u[1])}:${u[2].toLowerCase()}`,p=`${d}:${l}`;if(o.has(p))throw new Error("erc8004: duplicate registration");return o.add(p),{agentId:Number(l),agentRegistry:d}}),t.supportedTrust!=null){if(!Array.isArray(t.supportedTrust)||t.supportedTrust.length>Ng.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!Ng.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>iP)throw new Error("erc8004: registration metadata oversized");return aP(n)}function sP(e){if(Ro(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ea)throw new Error("erc8004: registration-v1 type required");return Aa({type:Ea,...e})}function cP(e){let t=Aa(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Lo(e){return BigInt(e).toString(16).padStart(64,"0")}function $g(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Lo(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function lP(e){return`${En.register}${Lo(32)}${$g(e)}`}function uP(e,t){return`${En.setAgentURI}${Lo(e)}${Lo(64)}${$g(t)}`}function dP(e,t){return`${e}${Lo(t)}`}function pP(e){return ZT("sha256").update(e,"utf8").digest("hex")}function iu(e,t){Ro(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 Bg(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Ia(e.chainId),c=nu(e.owner,"owner"),l=ou(s),u=Number(t?.nowMs??Date.now());return N({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:pP(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:s,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function Mg(e={},t={}){iu(e,new Set(["chainId","owner","registration"]));let n=cP(sP(e.registration));return Bg(e,t,{kind:"erc8004-register",uri:n,selector:En.register,data:lP(n)})}function Fg(e={},t={}){iu(e,new Set(["chainId","owner","agentId","agentURI"]));let n=ru(e.agentId),r=Ug(e.agentURI);return Bg(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:En.setAgentURI,data:uP(n,r),id:n})}function Ug(e){let t=or(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 Aa(o),t}function Rg(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 nu(`0x${e.slice(-40)}`,t)}function mP(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 Dg(e={},t={}){iu(e,new Set(["chainId","agentId"]));let n=Ia(e.chainId),r=ru(e.agentId),o=ou(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:dP(d,r)},"latest"]),[a,s,c]=await Promise.all([i(En.ownerOf),i(En.tokenURI),i(En.getAgentWallet)]),l=Ug(mP(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Aa(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Rg(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Rg(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}he();var qg=999;async function Hg(e={}){let t={chainId:qg,rpc:null,dex:null};try{t.rpc=await Fn(qg,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Fr("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 jg(e="HYPE",t={}){let r=(await Fr(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 zg(e,t={}){return un(e,t)}$();Z();var gP="https://api-mainnet.magiceden.dev/v2",$o=1e9;function Vg(e={}){return ze({provider:"magiceden",defaultUrl:gP,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function ar(e={}){return Vg(e).baseUrl}function In(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function sr(e={}){let t=In(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Vg(e).trusted)}function au(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 ir(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 yP(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 bP(e){return Math.round(ir(e,"priceSol")*$o)}function wP(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 xP({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function vP(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=xP(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Wg(e={}){try{let t=await su({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!In(e),readTier:"keyless",prepareTier:In(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!In(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function su(e={},t={}){let n=au(e.symbol||e.collection),r=await E(`${ar(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:sr(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/$o:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/$o:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/$o:null,exec:!1,raw:r}}function Gg(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*$o):null,tokenSize:e.tokenSize??1}}async function Kg(e={},t={}){let n=au(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(`${ar(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let a=await E(i.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Gg);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Yg(e={},t={}){let n=de(e.tokenMint||e.mint,"tokenMint"),r=await E(`${ar(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Gg);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Xg(e={},t={}){if(!In(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=de(e.seller,"seller"),o=de(e.tokenMint,"tokenMint"),i=de(e.tokenATA||e.tokenAddress,"tokenATA"),a=de(e.auctionHouse,"auctionHouse"),s=ir(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:ir(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${ar(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",a),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await E(l.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});At("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: buy_now returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return N({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-buy",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,seller:r,tokenMint:o,priceSol:s,maxPriceSol:c,lamports:bP(s),transaction:p,transactionEncoding:"base64",raw:u})}async function _a(e={},t={}){if(!In(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=de(e.seller||e.userPublicKey,"seller"),r=de(e.tokenMint,"tokenMint"),o=de(e.tokenATA||e.tokenAddress,"tokenATA"),i=de(e.auctionHouse,"auctionHouse"),a=ir(e.priceSol??e.price,"priceSol"),s=wP(e.expiry),c=vP(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${ar(t)}/instructions/sell`);l.searchParams.set("seller",n),l.searchParams.set("auctionHouseAddress",i),l.searchParams.set("tokenMint",r),l.searchParams.set("tokenAccount",o),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",de(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await E(l.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});At("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: sell returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return N({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-list",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,seller:n,tokenMint:r,priceSol:a,expiry:s,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function Qg(e={},t={}){if(!In(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=au(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=ir(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:ir(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${ar(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await E(a.toString(),{headers:sr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=yP(s);if(c==null)throw new Error("magiceden: mint price not present in the API response \u2014 refusing to prepare an unverifiable spend");let l=c*i;if(l>o)throw new Error(`magiceden: mint cost ${l} SOL exceeds maxPriceSol cap ${o} SOL`);At("magiceden",s);let u=s?.v0?.tx?.data??s?.tx?.data??null;if(!Array.isArray(u))throw s?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: mint returned no unsigned transaction payload");let d=Buffer.from(u).toString("base64");return N({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-mint",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,symbol:r,nftAmount:i,priceSol:c,totalSol:l,maxPriceSol:o,transaction:d,transactionEncoding:"base64",raw:s})}Z();Bc();$();at();var cr=8,cu=10n**BigInt(cr),kP="0xa4b1",Jg=7,lu=1,EP=2n**64n-1n;function IP(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 Mo(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function ur(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 Bo(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>cr)throw new Error(`hl-staking: ${t} has more than ${cr} decimals`);let i=BigInt(r)*cu+BigInt((o+"0".repeat(cr)).slice(0,cr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>EP)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function lr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Ot(e){let t=BigInt(String(e||"0")),n=t/cu,r=(t%cu).toString().padStart(cr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Zg(e={}){try{let t=await uu(e);return{ok:t.count>0,provider:"hl-staking",chain:Mo(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 uu(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 du(e={},t={}){let n=ur(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 pu(e={},t={}){let n=ur(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 ey(e={},t={}){let n=ur(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 ty(e={},t={}){let n=ur(e.user||e.address,"user"),r=await ce({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function mu(e={}){let t=e.nonce==null?Date.now():Number(e.nonce);if(!Number.isInteger(t)||t<=0)throw new Error("hl-staking: nonce must be a positive integer ms timestamp");return t}function Ta(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||kP)}function AP(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ta(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function fu({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:a,caps:s,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:Mo(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:IP(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:AP(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=zi(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,N(l,{provider:"hl-staking",kind:e})}function ny(e={},t={}){let n=Bo(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Bo(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Ot(n)} HYPE exceeds maxHype cap ${Ot(r)} HYPE`);let o=mu(e),i=Mo(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ta(t),wei:lr(n),nonce:o};return fu({kind:"hype-stake-deposit",action:a,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:lr(n),nonce:o},opts:t,args:e,caps:{amountHype:Ot(n),maxHype:r?Ot(r):null},notes:["Moves HYPE from your Hyperliquid spot balance into your staking balance.","Staking balance still earns nothing until it is delegated to a validator.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function ry(e={},t={}){let n=Bo(e.amountHype??e.amount,"amountHype"),r=mu(e),o=Mo(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ta(t),wei:lr(n),nonce:r};return fu({kind:"hype-stake-withdraw",action:i,primaryType:"HyperliquidTransaction:CWithdraw",types:{"HyperliquidTransaction:CWithdraw":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:o,wei:lr(n),nonce:r},opts:t,args:e,caps:{amountHype:Ot(n)},notes:[`Starts the ${Jg} 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 oy(e={},t={}){let n=ur(e.validator,"validator"),r=Bo(e.amountHype??e.amount,"amountHype"),o=Object.prototype.hasOwnProperty.call(e,"isUndelegate"),i=Object.prototype.hasOwnProperty.call(e,"undelegate");if(o&&typeof e.isUndelegate!="boolean")throw new Error("hl-staking: isUndelegate must be a boolean");if(i&&typeof e.undelegate!="boolean")throw new Error("hl-staking: undelegate must be a boolean");if(o&&i&&e.isUndelegate!==e.undelegate)throw new Error("hl-staking: isUndelegate and undelegate must match");let a=o?e.isUndelegate:i?e.undelegate:!1,s=e.maxHype==null?null:Bo(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${Ot(r)} HYPE exceeds maxHype cap ${Ot(s)} HYPE`);let c=mu(e),l=Mo(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ta(t),validator:n,wei:lr(r),isUndelegate:a,nonce:c};return fu({kind:a?"hype-undelegate":"hype-delegate",action:u,primaryType:"HyperliquidTransaction:TokenDelegate",types:{"HyperliquidTransaction:TokenDelegate":[{name:"hyperliquidChain",type:"string"},{name:"validator",type:"address"},{name:"wei",type:"uint64"},{name:"isUndelegate",type:"bool"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:l,validator:n,wei:lr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:Ot(r),maxHype:s?Ot(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${lu} 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 ${lu} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function iy(e={},t={}){let n=ur(e.user||e.address,"user"),r=await du({user:n},t),o=await pu({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Jg,validatorLockupDays:lu,exec:!1}}at();async function hu(e={}){let t=Date.now();try{let n=await St(e);return{provider:"hl-markets",ok:!0,venue:"hyperliquid",symbols:Object.keys(n||{}).length,latencyMs:Date.now()-t}}catch(n){return{provider:"hl-markets",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}var TP=24*365,PP=8;function Ne(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function CP(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Pa(e={},t={}){let[n,r]=await Promise.all([Qe(t),St(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],s=o.map((c,l)=>{let u=i[l]||{},d=Ne(u.markPx),p=Ne(u.prevDayPx),m=Ne(u.openInterest),f=Ne(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Ne(u.oraclePx),midPx:Ne(u.midPx)??Ne(r?.[c.name]),prevDayPx:p,change24hPct:CP(d,p),dayNtlVolumeUsd:Ne(u.dayNtlVlm),premium:Ne(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(TP/PP)*100,openInterestCoin:m,openInterestUsd:m==null||d==null?null:m*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:s.length,markets:s,totals:{openInterestUsd:s.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:s.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function ay(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Pa(e,t),a=(s,c=-1)=>r.filter(l=>l[s]!=null).sort((l,u)=>(l[s]-u[s])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:a("change24hPct"),losers:a("change24hPct",1),byVolume:a("dayNtlVolumeUsd"),byOpenInterest:a("openInterestUsd"),fundingHighest:a("fundingRateAprPct"),fundingLowest:a("fundingRateAprPct",1)}}async function sy(e={},t={}){let n=String(e.coin||e.symbol||"").trim().toUpperCase();if(!n)throw new Error("hl-markets: coin required");let r=String(e.interval||"1h"),o=Number(e.lookbackMs)||1440*60*1e3,i=Date.now(),a=i-o,[s,c,l]=await Promise.all([Pa({},t),Bi({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),jn(n,t).catch(()=>null)]),u=s.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:Ne(h.o),high:Ne(h.h),low:Ne(h.l),close:Ne(h.c),volume:Ne(h.v)})),p=l?.levels??[],m=Ne(p?.[0]?.[0]?.px),f=Ne(p?.[1]?.[0]?.px);return{provider:"hl-info",venue:"hyperliquid",kind:"coin-datapoints",asOfMs:Date.now(),coin:n,market:u,book:{bestBid:m,bestAsk:f,spread:m==null||f==null?null:f-m,spreadBps:m==null||f==null||f===0?null:(f-m)/f*1e4},candles:{interval:r,count:d.length,series:d}}}async function cy(e={},t={}){let n=await Mi(t),r=n?.tokens??[],o=n?.universe??[];return{provider:"hl-info",venue:"hyperliquid",kind:"spot-datapoints",asOfMs:Date.now(),tokenCount:r.length,pairCount:o.length,tokens:r.map(i=>({name:i.name,index:i.index,szDecimals:i.szDecimals??null,weiDecimals:i.weiDecimals??null,tokenId:i.tokenId??null,isCanonical:!!i.isCanonical})),pairs:o.map(i=>({name:i.name,index:i.index,tokens:i.tokens,isCanonical:!!i.isCanonical}))}}import{mkdirSync as YP,readFileSync as XP,readdirSync as QP,renameSync as JP,writeFileSync as ZP}from"node:fs";import{homedir as eC}from"node:os";import{join as Ra}from"node:path";var Fo=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});$();he();Z();import{Interface as gu,getAddress as hy,isAddress as OP}from"ethers";var ly=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),uy=Object.freeze({42161:{name:"arbitrum",api:ly[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:ly[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),dy="0x0000000000000000000000000000000000000000",RP=`0x${"0".repeat(64)}`,py=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),my=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Ca=new gu(["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"]),gy=new gu(["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)"]),LP=new gu(["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)"]),$P=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function pr(e){let t=Number(e??42161),n=uy[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(uy).join(", ")})`);return{chainId:t,...n}}function Na(e,t={}){let n=pr(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function nt(e,t){if(!OP(e))throw new Error(`${t} must be a valid EVM address`);return hy(e)}function ne(e){return hy(e).toLowerCase()}function dr(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 An(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 BP(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 MP(e){let t=String(e||"marketIncrease").trim();if(!(t in py))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:py[t]}}function FP(e){let t=String(e||"noSwap").trim();if(!(t in my))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:my[t]}}function UP(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function DP(e,t){let n=ne(t);return e.find(r=>ne(r.marketToken||r.market||r.address)===n)||null}function qP(e,t){let n=ne(t);return e.find(r=>ne(r.tokenAddress||r.address)===n)||null}function HP({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=dr(e?.minPrice,"gmx minPrice"),i=dr(e?.maxPrice,"gmx maxPrice"),a=BigInt(r),s=10000n;return n==="marketIncrease"?(t?i*(s+a)/s:o*(s-a)/s).toString():(t?o*(s-a)/s:i*(s+a)/s).toString()}function jP(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function zP(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function yt(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 VP(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:yt(t,"account",a=>ne(a)),market:yt(t,"market",a=>ne(a)),initialCollateralToken:yt(t,"initialCollateralToken",a=>ne(a)),key:yt(o,"key",a=>String(a).toLowerCase()),reason:yt(i,"reason",a=>String(a)),sizeDeltaUsd:yt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:yt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:yt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:yt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:yt(r,"isLong",a=>!!a)}}function WP(e={},t){if(ne(e.address)!==ne(t.eventEmitter))return null;let n;try{n=LP.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=$P[r];if(!o)return null;let i=VP(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||zP(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?ne(s):null,market:i.market,initialCollateralToken:i.initialCollateralToken,sizeDeltaUsd:i.sizeDeltaUsd,initialCollateralDeltaAmount:i.initialCollateralDeltaAmount,executionFee:i.executionFee,acceptablePrice:i.acceptablePrice,isLong:i.isLong,reason:i.reason,logIndex:e.logIndex==null?null:Number.parseInt(String(e.logIndex),16)}}function fy(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function GP(e=[],{chainId:t}={}){let n=pr(t);return(Array.isArray(e)?e:[]).map(r=>WP(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function yy(e={},t={}){return E(`${Na(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yu(e={},t={}){return E(`${Na(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function by(e={},t={}){return E(`${Na(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function mr(e={},t={}){return E(`${Na(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function wy(e={}){let t=await mr({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function xy(e={},t={}){let n=pr(e.chainId??42161),r=nt(e.account||e.owner||e.user,"gmx account"),o=An(e.start??0,"gmx start"),i=An(e.end??e.limit??20,"gmx end"),a=gy.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),account:ne(r),raw:c}}async function vy(e={},t={}){let n=pr(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=gy.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),key:r,raw:a}}async function Sy(e={},t={}){let n=pr(e.chainId??42161),r=t.receipt||await Mr({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=GP(r.logs||[],{chainId:n.chainId}),a=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,s=a?i.filter(u=>u.orderKey===a):i;if(s.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:a?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=s.reduce((u,d)=>fy(d.status)>=fy(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?ne(e.expectedAccount||e.account):null;return l&&c.account!==l?{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,reason:`account mismatch: expected ${l}, got ${c.account||"null"}`,orderKey:c.orderKey,account:c.account,events:i,receipt:r}:{ok:!0,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,orderKey:c.orderKey,account:c.account,market:c.market,eventEmitter:ne(n.eventEmitter),events:s,receipt:r}}async function ky(e={},t={}){let n=pr(e.chainId??42161),r=MP(e.orderType||e.type),o=FP(e.decreasePositionSwapType),i=nt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=nt(e.receiver||i,"gmx receiver"),s=nt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?nt(e.callbackContract,"gmx callbackContract"):dy,l=e.uiFeeReceiver?nt(e.uiFeeReceiver,"gmx uiFeeReceiver"):dy,u=nt(e.market||e.marketToken,"gmx market"),d=nt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?dr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):An(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=dr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=dr(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(f>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let g=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(m>g)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let w=BP(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[b,y]=await Promise.all([yu({chainId:n.chainId},t),mr({chainId:n.chainId},t)]),v=DP(UP(b,"markets"),u);if(!v)throw new Error("gmx market not found in public registry");if(v.isListed===!1)throw new Error("gmx market is not listed");let k=nt(v.indexToken,"gmx market indexToken"),S=nt(v.longToken,"gmx market longToken"),I=nt(v.shortToken,"gmx market shortToken"),T=ne(d);if(![ne(S),ne(I)].includes(T))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let _=jP(v,x);if(_>0n&&m>_)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let C=qP(y,k);if(!C)throw new Error("gmx index ticker not found");let L=e.acceptablePrice?dr(e.acceptablePrice,"gmx acceptablePrice").toString():HP({ticker:C,isLong:x,typeKey:r.key,maxSlippageBps:w}),D=(e.swapPath||[]).map(me=>nt(me,"gmx swapPath market"));if(D.length>3)throw new Error("gmx swapPath too long for guarded slice");let H=An(e.triggerPrice??"0","gmx triggerPrice"),O=An(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=An(e.minOutputAmount??"0","gmx minOutputAmount"),B=An(e.validFromTime??"0","gmx validFromTime"),W=!!e.shouldUnwrapNativeToken,pe=e.autoCancel==null?!0:!!e.autoCancel,ve=String(e.referralCode||RP);if(!/^0x[0-9a-fA-F]{64}$/.test(ve))throw new Error("gmx referralCode must be bytes32 hex");let xt=Array.isArray(e.dataList)?e.dataList:[];for(let me of xt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(me)))throw new Error("gmx dataList entries must be bytes32 hex");let $t={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:D},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt(L),executionFee:f,callbackGasLimit:O,minOutputAmount:j,validFromTime:B},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:W,autoCancel:pe,referralCode:ve,dataList:xt},R=[];r.key==="marketIncrease"&&p>0n&&R.push(Ca.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(Ca.encodeFunctionData("sendWnt",[n.orderVault,f])),R.push(Ca.encodeFunctionData("createOrder",[$t]));let F=Ca.encodeFunctionData("multicall",[R]),J={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:ne(i),receiver:ne(a),exchangeRouter:ne(n.exchangeRouter),router:ne(n.router),orderVault:ne(n.orderVault),market:ne(u),indexToken:ne(k),initialCollateralToken:ne(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:L,maxSlippageBps:w,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return N({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:ne(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:ne(d),spender:ne(n.router),amount:p.toString()}:null,gmxGuard:J,transaction:{chainId:n.chainId,from:ne(i),to:ne(n.exchangeRouter),data:F,value:f.toString(),gmxGuard:J}},{provider:"gmx",kind:"gmx-order"})}at();var Xt="oracle.hl.entry-state.v1",tC=8,nC=24*365;function le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function fr(e){return e==null||e===0?0:e>0?1:-1}function Uo(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function rC(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Ra(eC(),".config","oracle")}function Ay(e={}){return Ra(rC(e),"hl-entry-states")}function Oa(e,t,n){return n==null&&e.push(t),n}function oC(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(a=>String(a?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function Rt(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function iC(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:le(a.time),rate:le(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return Rt("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)fr(o[a].rate)!==fr(o[a-1].rate)&&(i+=1);return{source:"hl-info.fundingHistory",asOfMs:n??o[o.length-1].t,unknown:!1,coin:t||null,samples:o.length,firstRate:o[0].rate,lastRate:o[o.length-1].rate,signFlips:i,windowMs:o[o.length-1].t-o[0].t}}function aC(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return Rt("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=le(a.peggedUSD??a.usd??i.circulatingPrevDay?.peggedUSD);s!=null&&(r+=s,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:Rt("defillama.stablecoins","no peggedUSD")}function Ey(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 sC(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),a=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],s=o.find(p=>a.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!s)return Rt("gmx.tickers","no matching symbol");let c=Ey(s.minPrice,n),l=Ey(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return Rt("gmx.tickers","unreadable price");let d=n!=null&&n>0?Uo(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?Rt("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(s.tokenSymbol||s.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function cC({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?Rt("hl-info.fundingHistory","not fetched"):iC(r,{coin:e,asOfMs:n}),llamaStables:o==null?Rt("defillama.stablecoins","not fetched"):aC(o,n),gmxTicker:i==null?Rt("gmx.tickers","not fetched"):sC(i,{coin:e,hlMark:t,asOfMs:n})}}function Iy(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=le(s?.px),l=le(s?.sz);if(c==null||l==null||c<=0||l<=0)continue;let u=c*l,d=Math.min(u,Math.max(0,t-o));if(d<=0||(i+=d/c,o+=d,o>=t))break}let a=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:a}}function lC(e,t){if(!e)return{present:!1,unknown:["userState"]};let n=String(t).toUpperCase(),i=(e.assetPositions||e.clearinghouseState?.assetPositions||[]).find(f=>String(f?.position?.coin||"").toUpperCase()===n)?.position;if(!i)return{present:!1,unknown:[]};let a=le(i.szi),s=le(i.positionValue)!=null&&a?Math.abs(le(i.positionValue)/a):null,c=le(i.entryPx),l=le(i.liquidationPx),u=a==null?null:a>0?"long":a<0?"short":null,d=null,p=s??c;l!=null&&p!=null&&p!==0&&u==="long"?d=(p-l)/p*100:l!=null&&p!=null&&p!==0&&u==="short"&&(d=(l-p)/p*100);let m=[];return a==null&&m.push("position.szi"),c==null&&m.push("position.entryPx"),l==null&&m.push("position.liquidationPx"),d==null&&m.push("position.liqDistancePct"),{present:!0,side:u,szi:a,entryPx:c,liquidationPx:l,leverage:le(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function uC({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:a=Date.now(),fundingHistory:s=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:Xt,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=oC(n,e);if(!d)return{schema:Xt,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Oa(u,"markPx",le(m.markPx)),h=Oa(u,"oraclePx",le(m.oraclePx)),g=le(m.midPx),w=le(m.premium),x=Oa(u,"fundingRate",le(m.funding)),b=Oa(u,"openInterestCoin",le(m.openInterest)),y=le(m.dayNtlVlm),v=Array.isArray(m.impactPxs)?m.impactPxs:[],k=le(v[0]),S=le(v[1]),I=x==null?null:x*(nC/tC)*100,T=b==null||f==null?null:b*f,_=i==null||i===0||b==null?null:(b-i)/i*100;_==null&&u.push("oiDeltaPct");let C=r?.levels,L=Array.isArray(C)?C[0]:[],D=Array.isArray(C)?C[1]:[],H=le(L?.[0]?.px),O=le(D?.[0]?.px);H==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let j=Iy(D,Number(t)||0,"buy"),B=Iy(L,Number(t)||0,"sell");j.fillable||u.push("book.buyFillable"),B.fillable||u.push("book.sellFillable");let W=g??f,pe=j.avgFillPx==null||W==null?null:Uo(j.avgFillPx,W),ve=B.avgFillPx==null||W==null?null:Uo(W,B.avgFillPx),xt=lC(o,e);for(let J of xt.unknown||[])u.push(J);let $t=le(m.prevDayPx),R=f==null||$t==null||$t===0?null:(f-$t)/$t*100;R==null&&u.push("change24hPct");let F=cC({coin:String(p.name),hlMark:f,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return F.fundingPath.unknown&&u.push("overlays.fundingPath"),F.llamaStables.unknown&&u.push("overlays.llamaStables"),F.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Xt,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:w,markOracleBps:Uo(f,h),fundingRate:x,fundingAprPct:I,openInterestCoin:b,openInterestUsd:T,oiDeltaPct:_,dayNtlVolumeUsd:y,change24hPct:R,impactBidPx:k,impactAskPx:S,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:O,spreadBps:H==null||O==null?null:Uo(O,H),notionalUsd:Number(t)||0,buy:j,sell:B,buySlipBps:pe,sellSlipBps:ve},position:xt,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function _y(e,t){let n=String(t||"").toLowerCase();if(n!=="long"&&n!=="short")return{side:null,verdict:"no",factors:[{key:"side",status:"unverifiable",note:"side must be long or short"}]};if(!e?.coin||e.verdict==="no")return{side:n,verdict:"no",factors:[{key:"market",status:"unverifiable",note:"no live market"}]};let r=[],o=e.fundingRate;o==null?r.push({key:"funding",status:"unverifiable",note:"fundingRate unknown"}):n==="long"?r.push({key:"funding",status:o>0?"counter":(o<0,"aligned"),note:o>0?"longs pay":"shorts pay / flat",fundingAprPct:e.fundingAprPct}):r.push({key:"funding",status:o<0?"counter":"aligned",note:o<0?"shorts pay":"longs pay / flat",fundingAprPct:e.fundingAprPct});let i=e.premium??(e.markOracleBps==null?null:e.markOracleBps/1e4);i==null?r.push({key:"premium",status:"unverifiable",note:"mark vs oracle unknown"}):n==="long"?r.push({key:"premium",status:i>0?"counter":"aligned",note:i>0?"mark rich to oracle":"mark cheap / flat"}):r.push({key:"premium",status:i<0?"counter":"aligned",note:i<0?"mark cheap to oracle":"mark rich / flat"});let a=n==="long"?e.book?.buy:e.book?.sell;if(!a)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!a.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${a.requestedNotionalUsd} usd`});else{let f=n==="long"?e.book.buySlipBps:e.book.sellSlipBps;r.push({key:"book",status:f!=null&&f>20?"counter":"aligned",note:f==null?"fillable, slip unknown":`slip ${f.toFixed(1)} bps`})}let s=e.position?.liqDistancePct;e.position?.present?s==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:s<5?"counter":"aligned",note:`${s.toFixed(2)}% to liq`}):r.push({key:"liqDistancePct",status:"unverifiable",note:"no position / no user"}),e.oiDeltaPct==null&&r.push({key:"oiDeltaPct",status:"unverifiable",note:"no prior OI \u2014 HL /info has no 24h OI"});let c=e.overlays?.fundingPath;!c||c.unknown?r.push({key:"fundingPath",status:"unverifiable",note:c?.reason||"funding history unknown"}):r.push({key:"fundingPath",status:c.signFlips>0?"unverifiable":"aligned",note:c.signFlips>0?`${c.signFlips} funding sign flip(s) in window`:`carry stable n=${c.samples}`});let l=e.overlays?.gmxTicker;!l||l.unknown?r.push({key:"gmxBasis",status:"unverifiable",note:l?.reason||"gmx ticker unknown"}):l.basisBps!=null&&Math.abs(l.basisBps)>80?r.push({key:"gmxBasis",status:"counter",note:`HL vs GMX ${l.basisBps.toFixed(1)} bps`}):r.push({key:"gmxBasis",status:"aligned",note:l.basisBps==null?"gmx print, no HL mark":`HL vs GMX ${l.basisBps.toFixed(1)} bps`});let u=r.some(f=>f.key==="book"&&f.status==="counter"&&/cannot fill/.test(f.note)),d=r.some(f=>f.status==="counter"),p=r.some(f=>f.status==="unverifiable");return{side:n,verdict:u?"no":d||p?"wait":"go",factors:r,seeUnknown:e.unknown||[]}}function dC(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 pC({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Xt||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=dC(n),a=_y(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Xt,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Fo.ALERT_ONLY},c=Ay({...o,configDir:r||o.configDir});YP(c,{recursive:!0,mode:448});let l=Ra(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return ZP(u,`${JSON.stringify(s,null,2)}
|
|
146
|
+
`,{mode:384}),JP(u,l),s}function bu(e={}){let t=Ay(e),n=[];try{n=QP(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(XP(Ra(t,r),"utf8")))}function mC(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Fo.ALERT_ONLY};let r=e.see,o=t;fr(r.fundingRate)!==fr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),fr(r.premium)!==fr(o.premium)&&r.premium!=null&&o.premium!=null&&n.push({key:"premiumSign",level:"hold",from:r.premium,to:o.premium});let i=r.position?.liqDistancePct,a=o.position?.liqDistancePct;i!=null&&a!=null&&(a<5||a<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:a});let s=e.side,c=s==="long"?r.book?.buy:r.book?.sell,l=s==="long"?o.book?.buy:o.book?.sell;c?.fillable&&l&&!l.fillable&&n.push({key:"bookFillable",level:"thesis-broke",from:!0,to:!1});let u=o.oiDeltaPct;return u!=null&&Math.abs(u)>=15&&n.push({key:"oiDeltaPct",level:"hold",from:0,to:u}),{schema:Xt,id:e.id,coin:e.see.coin,side:e.side,actionMode:Fo.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function Ty(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await Qe(e))?.[0]?.universe?.length,venue:"hyperliquid",latencyMs:Date.now()-t}}catch(n){return{provider:"hl-entry-state",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}async function Do(e={},t={}){let n=e.coin,r=le(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([Qe(t),n?jn(n,t).catch(()=>null):Promise.resolve(null),e.user?zn(e.user,t).catch(()=>null):Promise.resolve(null),n?qm({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),sa({},t).catch(()=>null),mr({chainId:42161},t).catch(()=>null)]);return uC({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function Py(e={},t={}){let n=e.see&&e.see.schema===Xt?e.see:await Do(e,t);return{see:n,..._y(n,e.side)}}async function Cy(e={},t={}){let n=e.see&&e.see.schema===Xt?e.see:await Do(e,t);return pC({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function Ny(e={},t={}){let n=e.locked||bu(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Fo.ALERT_ONLY};let r=await Do({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return mC(n,r)}at();ji();Yi();async function Oy(e={}){let t=await eo(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Ry(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ut(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=$y(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=wu(i)));let a=n==null?null:Dt(n);if(n!=null&&!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??a?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await eo(t))?.outcomes||[]).find(f=>{try{return Ut(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=wu(p);if(i!=null&&i!==m)throw new Error("hl-outcome: sideName does not match outcome side");if(a&&a.side!==m)throw new Error("hl-outcome: sideName does not match outcome coin side");i=m}if(!n){if(r==null||i==null)throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");n=Ut(r,i).coin}if(a=Dt(n),!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&a.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&a.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let s=e.orderSide??o??(typeof e.isBuy=="boolean"?null:"buy"),c={...e,coin:n,outcome:void 0,outcomeSide:i};return delete c.orderSide,delete c.sideName,s==null?delete c.side:c.side=s,Kn(c,t)}async function Ly(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ut(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=$y(e.outcomeSide):(o=e.side,o!=null&&(o=wu(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Ut(r,o).coin}let i=Dt(n);if(!i)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&i.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(o!=null&&i.side!==o)throw new Error("hl-outcome: coin does not match outcome side");let a={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete a.side,lo(a,t)}function $y(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function wu(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")}Z();Vn();var Q6="0x"+"00".repeat(32);function gC(e){let t=typeof e=="bigint"?e:Ze(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 By(e,t){let n=Ze(e.makerAmount,"poly: makerAmount"),r=Ze(e.takerAmount,"poly: takerAmount");return gC(t==="BUY"?n:r)}Vn();var yC=new Set(["https://clob.polymarket.com/order"]),qo=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),t5=Object.freeze(qo.map(e=>e[0])),bC=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),wC="0xe111180000d2663c0091e4f400237545b87b996b",xC="0xe2222d279d744050d28e00520010520000310f59",My=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function Fy(e){let t=String(e||"").replace(/\/$/,"");if(!yC.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Uy(e){let t=Je(e,"poly: exchange").toLowerCase();if(!bC.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Dy(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=My(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(Je(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Fy(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(Uy(o.verifyingContract),Uy(n.exchange),Je(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==Je(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?xC:wC;if(Je(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==qo.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let S=0;S<qo.length;S+=1)if(s[S]?.name!==qo[S][0]||s[S]?.type!==qo[S][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(Je(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(Je(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=My(n.tokenId,"tokenId",80);if(Je(a.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=Ze(a.makerAmount,"poly: makerAmount"),m=Ze(a.takerAmount,"poly: takerAmount"),f=Ze(n.makerAmount,"poly: prepared makerAmount"),h=Ze(n.takerAmount,"poly: prepared takerAmount");if(p!==f)throw new Error("poly: signed makerAmount differs from prepared envelope");if(m!==h)throw new Error("poly: signed takerAmount differs from prepared envelope");let g=d==="BUY"?p:m,w=d==="BUY"?m:p,x=Se(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let b=Se(n.price,6,"poly: price");if(b<=0n||b>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*b!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(Se(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=By(a,d);if(Se(v,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let k=t.maxNotionalUsd??t.maxNotionalUsdc;if(k!=null){let S=Se(k,6,"poly: maxNotionalUsd");if(g>S)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:v,submitTo:Fy(n.submitTo)})}function vC(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 qy(e,t={},n={}){if(String(e?.kind)!=="poly-order")throw new Error("poly: prepared kind is not a local-signer surface");if(!e?.domain||!e?.types||!e?.value)throw new Error("poly: prepared EIP-712 order required");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a={version:1,surface:"poly",action:"order",owner:vC({...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 Dy(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as c5,randomInt as SC}from"node:crypto";import{keccak256 as u5,concat as d5,zeroPadValue as p5,getCreate2Address as m5,AbiCoder as f5}from"ethers";var Wy=137;var kC="0xE111180000d2663C0091e4f400237545B87B996B",EC="0xe2222d279d744050d28e00520010520000310F59",Hy="0x0000000000000000000000000000000000000000000000000000000000000000",xu=6;var IC={name:"Polymarket CTF Exchange",version:"2",chainId:Wy},AC={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"}]},jy={"0.1":{price:1,size:2,amount:3},"0.01":{price:2,size:2,amount:4},"0.001":{price:3,size:2,amount:5},"0.0001":{price:4,size:2,amount:6}};function La(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function $a(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function zy(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Gy(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function _C(e,t,n,r){let o=Gy(Number(n),r.price);if(e==="BUY"){let c=$a(Number(t),r.size),l=c*o;return La(l)>r.amount&&(l=zy(l,r.amount+4),La(l)>r.amount&&(l=$a(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=$a(Number(t),r.size),s=a*o;return La(s)>r.amount&&(s=zy(s,r.amount+4),La(s)>r.amount&&(s=$a(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function Vy(e){let t=Number(e).toFixed(xu),[n,r=""]=t.split(".");return(n+r.padEnd(xu,"0").slice(0,xu)).replace(/^0+/,"")||"0"}function TC(e={}){if(Object.prototype.hasOwnProperty.call(e,"negRisk")&&typeof e.negRisk!="boolean")throw new Error("negRisk must be a boolean");let{tokenId:t,side:n,price:r,size:o,maker:i,signer:a,negRisk:s=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=Hy,builder:p=Hy}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!a)throw new Error("maker and signer required");let m=Number(r),f=Number(o);if(!(m>0&&m<1))throw new Error(`price out of (0,1): ${r}`);if(!(f>0))throw new Error(`size must be > 0: ${o}`);if(u!==0&&u!==3)throw new Error(`Desk poly supports signatureType 0 (EOA) or 3 (deposit wallet), got ${u}`);if(typeof p!="string"||!/^0x[0-9a-fA-F]{64}$/.test(p))throw new Error("poly: builder must be a 32-byte hex string");if(typeof d!="string"||!/^0x[0-9a-fA-F]{64}$/.test(d))throw new Error("poly: metadata must be a 32-byte hex string");let h=jy[String(c)]||jy["0.01"],g=Gy(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=_C(n,f,g,h),b=Vy(w),y=Vy(x),v=String(SC(1,2**31-1)),k=Date.now().toString(),S=n==="BUY"?0:1,I=s?EC:kC,T={salt:v,maker:i,signer:a,tokenId:String(t),makerAmount:b,takerAmount:y,side:S,signatureType:u,timestamp:k,metadata:d,builder:p},_={...IC,verifyingContract:I},C=n==="BUY"?w:x;return{domain:_,types:AC,value:T,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:w),notionalUsdc:C,exchange:I,negRisk:s}}function Ky(){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 Yy(e={},t={}){let n=TC(e),r={provider:"poly-clob",kind:"poly-order",chainId:Wy,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=qy(r,e,t)}catch{r.oraclePrepared=!1}return N(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as UC,keccak256 as ib}from"ethers";Z();Ha();Fa();var DC=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function qC(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Tt(e);for(let o of Object.keys(n))if(!DC.has(o))throw new Error(`prepareTemplateDeploy: unsupported field "${o}" in localForkSimulationReceipt`);if(n.status!=="success"&&n.status!=="reverted")throw new Error('prepareTemplateDeploy: simulation status must be "success" or "reverted"');let r={status:n.status};if(n.chainId!==void 0){let o=Number(n.chainId);if(!Number.isSafeInteger(o)||o!==t)throw new Error("prepareTemplateDeploy: simulation chainId must match deployment chainId");r.chainId=o}if(n.forkBlockNumber!==void 0){let o=Number(n.forkBlockNumber);if(!Number.isSafeInteger(o)||o<0)throw new Error("prepareTemplateDeploy: simulation forkBlockNumber must be a nonnegative safe integer");r.forkBlockNumber=o}if(n.gasUsed!==void 0){let o=String(n.gasUsed);if(!/^(0|[1-9][0-9]*)$/.test(o))throw new Error("prepareTemplateDeploy: simulation gasUsed must be a nonnegative integer");r.gasUsed=o}if(n.transactionHash!==void 0){if(!/^0x[0-9a-fA-F]{64}$/.test(n.transactionHash))throw new Error("prepareTemplateDeploy: simulation transactionHash must be bytes32 hex");r.transactionHash=n.transactionHash}if(n.contractAddress!==void 0){if(!/^0x[0-9a-fA-F]{40}$/.test(n.contractAddress))throw new Error("prepareTemplateDeploy: simulation contractAddress must be an EVM address");r.contractAddress=n.contractAddress}if(n.revertReason!==void 0){if(typeof n.revertReason!="string"||n.revertReason.length>500)throw new Error("prepareTemplateDeploy: simulation revertReason must be at most 500 characters");r.revertReason=n.revertReason}return r}async function ab(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=Zy(n,o),a=ob(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!a.bytecode||a.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let s=a.bytecode.startsWith("0x")?a.bytecode:`0x${a.bytecode}`,u=(await new UC(a.abi,s).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...qC(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return N({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:a.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:a.abi,sourceHash:a.gate.sourceHash,bytecodeHash:ib(s),authorityReport:eb(i),simulationReceipt:p,verificationManifest:{contractName:a.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:a.gate.sourceHash,creationBytecodeHash:ib(s),constructorData:`0x${u.slice(s.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${a.contractName}`},monitoringPlan:{activation:"after user-signed deployment confirmation",enabled:!1,events:[...i.monitor],checks:["deployment bytecode matches verification manifest","authority changes","contract balance and release/withdraw events"]},gate:{forgeBuild:a.gate.forgeBuild,forgeTests:a.gate.forgeTests,staticAnalysis:{tool:a.gate.staticAnalysis.tool,ok:a.gate.staticAnalysis.ok,skipped:a.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:Da},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,deploymentActivated:!1,note:"Unsigned deploy. User wallet signs. Template tests passed; not a firm audit."},{provider:"protocol-templates",kind:"template-deploy"})}Ha();Tu();Yi();$();var ZC="https://api.geckoterminal.com/api/v2",Va=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||ZC).replace(/\/$/,""),gr=e=>encodeURIComponent(String(e));async function Pu(e={},t={}){let n=Math.max(1,Number(e.page||1));return E(`${Va(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function fb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return E(`${Va(t)}/networks/${gr(e.network)}/pools/${gr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function hb(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return E(`${Va(t)}/networks/${gr(e.network)}/tokens/${gr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function gb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),E(`${Va(t)}/networks/${gr(e.network)}/pools/${gr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function yb(e={}){let t=await Pu({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}$();he();import{Interface as vb,getAddress as Sb,isAddress as tN}from"ethers";Z();var nN="https://api.curve.finance/v1",kb=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||nN).replace(/\/$/,""),rN=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),Eb="0x0000000000000000000000000000000000000000",Cu=new vb(["function get_dy(address[11] route,uint256[5][5] swap_params,uint256 amount,address[5] pools) view returns (uint256)","function exchange(address[11] route,uint256[5][5] swap_params,uint256 amount,uint256 expected,address[5] pools,address receiver) payable returns (uint256)"]),bb=new vb(["function coins(uint256) view returns (address)"]);function Ib(e){let t=rN[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Yo(e,t){if(!tN(e))throw new Error(`${t} must be a valid EVM address`);return Sb(e)}function oN(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 wb(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function Ab(e,t,n){return[e,t,n,...Array(8).fill(Eb)]}function _b(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Tb(e){return[e,...Array(4).fill(Eb)]}async function iN({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=bb.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=bb.decodeFunctionResult("coins",c);i.push(Sb(l[0]))}return i}function xb(e,t,n){let r=t.toLowerCase(),o=e.findIndex(i=>i.toLowerCase()===r);if(o<0)throw new Error(`Curve pool does not contain ${n}`);return o}async function Pb(e={}){return E(`${kb(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Nu(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return E(`${kb(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Cb(e={}){let t=await Nu({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Ou(e={},t={}){let n=Number(e.chainId??8453),r=Ib(n),o=Yo(e.pool,"curve pool"),i=Yo(e.tokenIn,"curve tokenIn"),a=Yo(e.tokenOut,"curve tokenOut"),s=oN(e.amountIn,"curve amountIn"),c=wb(e.nCoins??2,"curve nCoins",2,8),l=wb(e.poolType,"curve poolType",1,4),u=t.rpcCall||U,d=await iN({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=xb(d,i,"tokenIn"),m=xb(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=Ab(i,o,a),h=_b(p,m,l,c),g=Tb(o),w=Cu.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),b=Cu.decodeFunctionResult("get_dy",x),y=BigInt(b[0]);if(y<=0n)throw new Error("curve quote returned zero output");return re({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:y.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(v=>v.map(k=>k.toString())),pools:g},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Nb(e={},t={}){let n=Number(e.chainId??8453),r=Ib(n),o=Yo(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Yo(e.receiver||e.recipient||o,"curve receiver"),a=await Ou({...e,sender:o},t),s=Ab(a.tokenIn,a.pool,a.tokenOut),c=_b(a.i,a.j,a.poolType,a.nCoins),l=Tb(a.pool),u=Cu.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return N({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,autoSlippage:a.autoSlippage,requiresApproval:{token:a.tokenIn,spender:r,amount:a.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:fe(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}$();he();Z();import{Interface as sN,getAddress as cN,isAddress as lN,keccak256 as Ob,toUtf8Bytes as Rb}from"ethers";var uN="https://api.morpho.org/graphql",Wa=new sN(["function asset() view returns (address)","function maxDeposit(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256)"]),dN=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||uN;async function Lu(e,t,n={}){return E(dN(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var pN="query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }",mN="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function Xo(e,t){let n=String(e||"").trim();if(!lN(n))throw new Error(`morpho: ${t} must be an address`);return cN(n).toLowerCase()}function fN(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`morpho: ${t} must be a positive integer string`)}}function 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)}async function Qo(e,t,n,r,o={}){let i=Wa.encodeFunctionData(n,r),s=await(o.rpcCall||U)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Wa.decodeFunctionResult(n,s)}function hN(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Lb(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Lu(pN,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function $u(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Lu(mN,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function $b(e={}){return{ok:(await Lu("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Bb(e={},t={}){let n=Number(e.chainId??8453),r=String(e.action||"deposit").toLowerCase();if(!["deposit","withdraw"].includes(r))throw new Error("morpho: action must be deposit or withdraw");let o=Xo(e.vault||e.vaultAddress,"vault"),i=Xo(e.owner||e.from||e.sender,"owner"),a=Xo(e.receiver||i,"receiver"),s=fN(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await $u({chainId:n,first:100},t),u=hN(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await Qo(n,o,"asset",[],t),m=Xo(p,"vault asset");if((u?.asset?.address?Xo(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[x]=await Qo(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[b]=await Qo(n,o,"previewDeposit",[s],t);if(BigInt(b.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:b.toString()},h=Wa.encodeFunctionData("deposit",[s,a])}else{let[x]=await Qo(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[b]=await Qo(n,o,"previewWithdraw",[s],t);if(BigInt(b.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:b.toString()},h=Wa.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...g,calldataHash:Ob(Rb(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=Ob(Rb(Ru(w))),N({provider:"morpho",protocol:"erc4626-vault",vaultReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,vaultInfo:u,vaultGuard:w,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}$();he();import{Interface as yN,getAddress as Bu,isAddress as bN}from"ethers";Z();var wN="https://api-v3.balancer.fi/",xN=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||wN;async function Ub(e,t,n={}){return E(xN(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var vN="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Mb=Object.freeze({1:{name:"ethereum",router:"0xAE563E3f8219521950555F5962419C8919758Ea2",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",router:"0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2c639c533813f4aa9d7837caf62653d097ff85"},8453:{name:"base",router:"0x3f170631ed9821Ca51A59D996aB095162438DC10",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",router:"0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",router:"0xF39CA6ede9BF7820a952b52f3c94af526bAB9015",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),SN="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",kN="0x0000000000000000000000000000000000000000",Mu=new yN(["function querySwapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,address sender,bytes userData) returns (uint256 amountOut)","function swapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,uint256 minAmountOut,uint256 deadline,bool wethIsEth,bytes userData) payable returns (uint256 amountOut)"]);function Db(e){let t=Number(e??8453),n=Mb[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Mb).join(", ")})`);return{chainId:t,...n}}function qb(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===kN||t===SN.toLowerCase()}function Ga(e,t){if(!bN(e))throw new Error(`${t} must be a valid EVM address`);return Bu(e)}function Fb(e,t,n){let r=String(e||"");return qb(r)||/^weth$/i.test(r)?Bu(t.weth):/^usdc$/i.test(r)?Bu(t.usdc):Ga(r,n)}function EN(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 Hb(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function jb(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return Ub(vN,{first:n,chains:r,where:{chainIn:r}},t)}async function zb(e={}){return{ok:(await Ub("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Fu(e={},t={}){let n=Db(e.chainId),r=Ga(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Fb(o,n,"balancer tokenIn"),a=Fb(e.tokenOut||"USDC",n,"balancer tokenOut"),s=EN(e.amountIn,"balancer amountIn"),c=Ga(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Mu.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,Hb(e.userData)]),d=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Mu.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return re({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:m.toString()},{chainId:n.chainId,venue:n.router,amountOut:m.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Vb(e={},t={}){let n=Db(e.chainId),r=Ga(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=qb(o),a=await Fu({...e,sender:r},t),s=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+s),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=Mu.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,Hb(e.userData)]);return N({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:fe(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}$();import{getAddress as AN}from"ethers";Z();var _N="https://api-v2.pendle.finance/core",TN=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),PN="0x0000000000000000000000000000000000000000",CN="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Wb=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||_N).replace(/\/$/,"");function Ka(e,t){try{return AN(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function yr(e,t){return Ka(e,t).toLowerCase()}function NN(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===CN||t===PN}function Uu(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n.toString()}function ON(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:Ka(t.token,`pendle input ${n} token`),amount:Uu(t.amount,`pendle input ${n} amount`)}))}function RN(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>Ka(t,`pendle output ${n} token`))}function LN(e){let t=TN[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function $N(e){let t=e?.routes?.[0]?.outputs?.[0]?.amount||e?.outputs?.[0]?.amount;if(!t)throw new Error("Pendle convert response missing output amount");return Uu(t,"pendle output amount")}function BN(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!NN(r.token)).map(r=>({token:yr(r.token,"pendle approval token"),spender:yr(t,"pendle approval spender"),amount:Uu(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Du(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),E(`${Wb(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Gb(e={}){let t=await Du({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function qu(e={},t={}){let n=Number(e.chainId??42161),r=LN(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=Ka(e.receiver||o,"pendle receiver"),a=ON(e.inputs),s=RN(e.outputs);if(e.enableAggregator===!0||Array.isArray(e.aggregators)&&e.aggregators.length)throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");let c=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:a,outputs:s,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await E(`${Wb(t)}/v3/sdk/${n}/convert`,{method:"POST",body:l,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),p=u?.routes?.[0]?.tx;if(!p?.to||!p?.data)throw new Error("Pendle convert returned no executable tx");if(yr(p.to,"pendle tx target")!==yr(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&yr(p.from,"pendle tx sender")!==yr(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=$N(u),f=re(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return N({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:BN(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:fe(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function Kb(e={},t={}){let n=await qu(e,t),{transaction:r,...o}=n;return o}$();import{isAddress as FN}from"ethers";Z();var UN="https://api.odos.xyz",Hu=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||UN).replace(/\/$/,"");async function ju(e={}){return E(`${Hu(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function DN(e={}){let t=Number(e.chainId);if(!Number.isInteger(t))throw new Error("odos: chainId required");if(!Array.isArray(e.inputTokens)||e.inputTokens.length<1)throw new Error("odos: inputTokens[] required");if(!Array.isArray(e.outputTokens)||e.outputTokens.length!==1)throw new Error("odos: agentic execution currently requires exactly one output token");if(!FN(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Yb(e={},t={}){let n=DN(e),r=Fe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await E(`${Hu(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),a=i?.outAmounts?.[0];if(!i?.pathId||!a)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:a}}async function Xb(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Yb(e,t);return{...re(r,{chainId:n,venue:"odos-quote",amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to assemble and simulate the path"}}async function Qb(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Yb(e,t),i=await E(`${Hu(t)}/sor/assemble`,{method:"POST",body:{userAddr:e.userAddr,pathId:r.pathId,simulate:!0,...e.receiver?{receiver:e.receiver}:{}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),a=i?.transaction;if(!a?.to||!a?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(a.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(a.from&&String(a.from).toLowerCase()!==String(e.userAddr).toLowerCase())throw new Error("odos: transaction sender mismatch");if(i?.simulation?.isSuccess!==!0)throw new Error(`odos: assembled transaction simulation failed: ${i?.simulation?.simulationError||"unknown"}`);let s=re(r,{chainId:n,venue:a.to,amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),c=i?.simulation?.amountsOut?.[0];if(c!=null&&BigInt(c)<BigInt(s.amountOutMinimum))throw new Error("odos: simulation output is below the bounded automatic floor");let l="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",u="0x0000000000000000000000000000000000000000",d=e.inputTokens.filter(p=>![l,u].includes(String(p.tokenAddress).toLowerCase())).map(p=>({token:p.tokenAddress,spender:a.to,amount:String(p.amount)}));return N({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,simulation:i.simulation,requiresApproval:d,autoSlippage:s.autoSlippage,transaction:{chainId:n,from:a.from||e.userAddr,to:a.to,data:a.data,value:a.value??"0x0",...a.gas!=null?{gasLimit:a.gas}:{},...a.nonce!=null?{nonce:a.nonce}:{},slippageGuard:fe(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function Jb(e={}){let t=await ju(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}$();var Zb=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,HN=/[<>&`*_~[\]()|\\]/g,jN=/[\u0000-\u001F\u007F]/g;function zu(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Zb,"").replace(jN,"").replace(HN,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Vu(e){if(e==null)return!1;let t=String(e);return Zb.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var ew=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});function Ya(e,t={}){let n=Number(e),r=t.baseUrl||ew[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function tw(e){return!!ew[Number(e)]}async function Wu(e={},t={}){return E(`${Ya(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function nw(e={},t={}){if(!e.address)throw new Error("address required");return E(`${Ya(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function rw(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return E(`${Ya(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ow(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${Ya(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await E(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function iw(e=[],{fungibleOnly:t=!0}={}){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r.token&&typeof r.token=="object"?r.token:{},i=String(o.type||r.token_type||"").toUpperCase();if(t&&i&&!i.includes("ERC-20")&&i!=="ERC20")continue;let a=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!a||typeof a!="string")continue;let s=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(s)||s==="0")continue;let c=o.decimals??r.decimals;typeof c=="string"&&/^\d+$/.test(c)&&(c=Number(c)),(typeof c!="number"||!Number.isInteger(c)||c<0||c>36)&&(c=18);let l=zu(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=zu(o.name,{max:80,fallback:""})||null;n.push({address:a.toLowerCase().startsWith("0x")?a:`0x${a}`,symbol:l,name:u,decimals:c,amountRaw:s,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:Vu(o.symbol)||Vu(o.name)||void 0})}return n}async function aw(e={}){let t=await Wu({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as VN}from"ethers";$();he();at();var WN="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",cw=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function Qt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function Xa(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function sw(e){if(!e)return null;try{return VN(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Pn(e={},t=process.env){let n=e.addresses||{},r=sw(n.evm||e.evmAddress||Xa(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||Xa(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||Xa(t,"ORACLE_BITCOIN_ADDRESS"),a=sw(n.hyperliquid||e.hyperliquidAddress||Xa(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?de(o,"portfolio Solana address"):null,bitcoin:i?st(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function Jo(e,t){let n=BigInt(String(e||"0")),r=Number(t);if(!Number.isInteger(r)||r<0||r>36)throw new Error("portfolio: decimals must be an integer from 0 to 36");if(r===0)return n.toString();let o=n<0n,i=o?-n:n,a=10n**BigInt(r),s=i/a,c=String(i%a).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${s}${c?`.${c}`:""}`}function br(e){let t=Number(e);return Number.isFinite(t)?t:null}function Qa(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Jt(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function lw(e,t){let n=cw[t],r=n?e?.coins?.[n]:null,o=Number(r?.price);return{key:n||null,priceUsd:Number.isFinite(o)?o:null,timestamp:r?.timestamp??null,confidence:r?.confidence??null}}function GN(e){let t=new Map;for(let n of e)if(n?.ok)for(let r of n.data?.accounts||[]){let o=BigInt(String(r.amount||"0"));if(o===0n||!r.mint)continue;let i=`${r.mint}:${r.decimals??"unknown"}`,a=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};a.amountRaw+=o,a.accounts+=1,n.program&&a.programs.add(n.program),t.set(i,a)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:Jo(r,n.decimals),i=n.decimals===0&&n.amountRaw===1n;return{mint:n.mint,amountRaw:r,amount:o,decimals:n.decimals,tokenPrograms:[...n.programs],accountCount:n.accounts,verification:"unverified",classification:i?"collectible-candidate":"fungible-or-unclassified",priceUsd:null,usdValue:null}})}function Gu(e,t){return{family:e,status:"unsupported",reason:t}}function Ku(e,t){if(!e||e.status!=="ok")return e;let n=lw(t,e.symbol),r=br(e.amount),o=r!=null&&n.priceUsd!=null?Qa(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function uw(e={}){let t=Pn({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Ja(e={},t={}){let n=new Date().toISOString(),r=Pn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Hn.map(R=>[R.chainId,R])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(cw))],u=o?xe(()=>bn(l,Qt(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Me(c,e.concurrency||5,async R=>{let F=s.get(R);if(!F)return{family:"evm",chainId:R,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:R,name:F.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let J={...Qt(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},me=await xe(()=>ln(R,r.evm,J));if(!me.ok)return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"unavailable",latencyMs:me.ms,error:me.error};let Pe=F.nativeCurrency?.decimals??18,He=F.nativeCurrency?.symbol||"NATIVE",K=me.data.balanceWei,be={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&tw(R)){let sn=await xe(()=>ow({chainId:R,address:r.evm},{...Qt(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));sn.ok?be={status:"ok",assets:iw(sn.data,{fungibleOnly:!0}).map(Nr=>{let Or=Jo(Nr.amountRaw,Nr.decimals);return{...Nr,amount:Or,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:sn.ms}:be={status:"unavailable",assets:[],reason:sn.error||"blockscout token-balances failed",source:"blockscout",latencyMs:sn.ms}}return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"ok",latencyMs:me.ms,native:{status:"ok",symbol:He,amountRaw:K,decimals:Pe,amount:Jo(K,Pe)},fungibleTokens:be,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:be.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let R=Qt(t,"solana"),F=await xe(()=>Xi({address:r.solana},R)),J=i||a?await Promise.all([xe(()=>fo({owner:r.solana,programId:il},R)).then(be=>({...be,program:"spl-token"})),xe(()=>fo({owner:r.solana,programId:WN},R)).then(be=>({...be,program:"token-2022"}))]):[],me=GN(J),Pe=me.filter(be=>be.classification==="collectible-candidate"),He=me.filter(be=>be.classification!=="collectible-candidate"),K=J.filter(be=>!be.ok).map(be=>be.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||J.some(be=>be.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:Jo(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?K.length===J.length?"unavailable":K.length?"partial":"ok":"not-requested",assets:i?He:[],errors:K,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?K.length===J.length?"unavailable":"partial":"not-requested",assets:a?Pe:[],errors:K,note:"decimals=0 and amount=1 is only a collectible candidate, not verified NFT metadata"},source:"solana-rpc"}})(),m=(async()=>{if(!r.bitcoin)return{family:"bitcoin",name:"Bitcoin Mainnet",address:null,status:"not-configured",error:"set ORACLE_BITCOIN_ADDRESS or pass addresses.bitcoin"};let R=Qt(t,"bitcoin"),F=Qt(t,"bitcoinMeta"),[J,me,Pe]=await Promise.all([xe(()=>Ji({address:r.bitcoin},R)),i?xe(()=>ea({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?xe(()=>Jn({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),He=me.ok?me.data:null,K=Pe.ok?Pe.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:J.ok||He?.ok||K?.ok?"ok":"unavailable",native:J.ok?{status:"ok",symbol:"BTC",amountRaw:J.data.balanceSats,decimals:8,amount:Jo(J.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:J.error},fungibleTokens:{status:i?He?.ok?"ok":"unavailable":"not-requested",assets:He?.balances||[],error:He?.ok?null:He?.error||me.error,verification:"indexer-reported"},collectibles:{status:a?K?.ok?"ok":"unavailable":"not-requested",assets:K?.inscriptions||[],error:K?.ok?null:K?.error||Pe.error,unknownNotEmpty:!!K?.unknownNotEmpty,verification:"indexer-reported"},source:"bitcoin-esplora+bitcoin-meta"}})(),f=(async()=>{if(!r.hyperliquid)return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:null,status:"not-configured",error:"set ORACLE_HYPERLIQUID_ADDRESS or pass addresses.hyperliquid"};let R=Qt(t,"hyperliquid"),[F,J,me]=await Promise.all([xe(()=>$i(r.hyperliquid,R)),xe(()=>zn(r.hyperliquid,R)),xe(()=>St(R))]),Pe=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(K=>Jt(K.total)||Jt(K.hold)).map(K=>({coin:K.coin||null,total:String(K.total??"0"),hold:String(K.hold??"0"),priceUsd:null,usdValue:null})),He=(J.ok&&Array.isArray(J.data?.assetPositions)?J.data.assetPositions:[]).map(K=>K.position||K).filter(K=>Jt(K.szi)).map(K=>({coin:K.coin||null,size:String(K.szi??"0"),entryPrice:K.entryPx??null,positionValueUsd:K.positionValue??null,unrealizedPnlUsd:K.unrealizedPnl??null,liquidationPrice:K.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||J.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:Pe,error:F.ok?null:F.error},perps:{status:J.ok?"ok":"unavailable",accountValueUsd:J.data?.marginSummary?.accountValue??null,withdrawableUsd:J.data?.withdrawable??null,positions:He,error:J.ok?null:J.error},mids:me.ok?me.data:{},source:"hyperliquid-info"}})(),[h,g,w,x,b]=await Promise.all([d,p,m,f,u]),y=b.ok?b.data:null,v=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),k=[];for(let R of h){if(R.family!=="evm"||R.fungibleTokens?.status!=="ok")continue;let F=v[R.chainId];if(F)for(let J of R.fungibleTokens.assets||[])J.address&&k.push(`${F}:${String(J.address).toLowerCase()}`)}let S=null;if(o&&k.length){let R=[...new Set(k)],F=await xe(()=>bn(R,Qt(t,"prices")));F.ok&&(S=F.data)}let I=h.map(R=>{let F=R.native?{...R,native:Ku(R.native,y)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let J=v[F.chainId],me=F.fungibleTokens.assets.map(Pe=>{let He=String(Pe.symbol||"").toUpperCase(),K=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(He)&&(K=1),K==null&&J&&Pe.address&&S?.coins){let up=`${J}:${String(Pe.address).toLowerCase()}`,Nr=S.coins[up],Or=Number(Nr?.price);Number.isFinite(Or)&&Or>0&&(K=Or)}let be=br(Pe.amount),sn=be!=null&&K!=null?Qa(be*K):null;return{...Pe,priceUsd:K,usdValue:sn}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:me}}}return F});g.native&&(g.native=Ku(g.native,y)),w.native&&(w.native=Ku(w.native,y));let T=0,_=0,C=0;for(let R of[...I,g,w]){R.native?.status==="ok"&&Jt(R.native.amount)&&(R.native.usdValue!=null?(T+=R.native.usdValue,_+=1):C+=1);for(let F of R.fungibleTokens?.assets||[])!Jt(F.amount)&&!Jt(F.amountRaw)||(F.usdValue!=null?(T+=F.usdValue,_+=1):C+=1)}let L=lw(y,"HYPE");for(let R of x.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),J=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?L.priceUsd||br(x.mids?.HYPE):br(x.mids?.[R.coin]),me=br(R.total);R.priceUsd=J,R.usdValue=me!=null&&J!=null?Qa(me*J):null,Jt(R.total)&&(R.usdValue!=null?(T+=R.usdValue,_+=1):C+=1)}let D=br(x.perps?.accountValueUsd);D!=null&&D!==0&&(T+=D,_+=1);let H=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(R=>Jt(R.amount)).length,O=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;C+=H+O;let j=[...I,g,w,x],B=R=>j.filter(F=>F.status===R).length,W=[],pe=I.filter(R=>R.fungibleTokens?.status==="unavailable"),ve=I.filter(R=>R.fungibleTokens?.status==="ok");pe.length&&!ve.length?W.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):pe.length&&W.push(`EVM token discovery partial: Blockscout covered ${ve.length} chain(s); ${pe.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&W.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&W.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),b.ok||W.push(`Price provider unavailable: ${b.error}`);let xt=[Gu("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Gu("sui","Sui balance adapter is not installed"),Gu("aptos","Aptos balance adapter is not installed")],$t=j.some(R=>["unavailable","partial","not-configured"].includes(R.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(R.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:j.length,ok:B("ok"),unavailable:B("unavailable"),notConfigured:B("not-configured"),unsupported:B("unsupported")+xt.length,evmChainsRequested:c.length,evmChainsOk:I.filter(R=>R.status==="ok").length},valuation:{knownUsd:Qa(T),label:"known priced value, not a complete portfolio total",pricedItems:_,unpricedNonzeroItems:C,complete:C===0&&!$t&&B("unavailable")===0&&B("not-configured")===0&&xt.length===0,priceSource:o?"DefiLlama":null,priceStatus:b.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...I,g,w,x],unsupportedFamilies:xt,warnings:W}}import{constants as es}from"node:fs";import{chmod as bO,mkdir as wO,open as xO,readFile as vO}from"node:fs/promises";import{createHash as SO,randomUUID as kO}from"node:crypto";import EO from"node:os";import xr from"node:path";$();$();var YN=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]),XN=new Set(["image/jpeg","image/png","image/webp"]);function QN(e){let t=String(e||"").toLowerCase();return YN.some(n=>t===n||t.endsWith(`.${n}`))}function JN(e){let t=String(e||"").trim();return t.startsWith("ipfs://")?`https://ipfs.io/ipfs/${t.slice(7).replace(/^ipfs\//,"")}`:t.startsWith("ar://")?`https://arweave.net/${t.slice(5)}`:t}function dw(e){let t=JN(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!QN(n.hostname)?null:n}async function ZN(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=dw(e);if(!r)throw new Error("image host is not on the raster gallery allowlist");let o=Math.min(Math.max(Number(t.maxImageBytes??15e5),5e4),4e6);for(let i=0;i<=3;i+=1){let a=await xe(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!a.ok)throw new Error(a.error);let s=a.data;if(s.status>=300&&s.status<400){let d=s.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=dw(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!s.ok)throw new Error(`image HTTP ${s.status}`);let c=String(s.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!XN.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(s.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await s.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function Yu(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function eO(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function pw(e={},t={}){let n=Array.isArray(e.items)?e.items:[];if(!n.length)throw new Error("nft gallery requires inventory items");let r=Math.min(Math.max(Number(e.pageSize??12)||12,1),12),o=Math.max(Number(e.page??1)||1,1),i=Math.max(Math.ceil(n.length/r),1);if(o>i)throw new Error(`nft gallery page ${o} exceeds ${i}`);let a=n.slice((o-1)*r,o*r),s=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let b of a){if(c>=l){s.push({item:b,image:null,error:"gallery page byte cap reached"});continue}try{let y=await ZN(b.imageUrl||b.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:b,image:y,error:null})}catch(y){s.push({item:b,image:null,error:String(y?.message||y).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(a.length/u),h=u*d,g=m+f*p,w=s.map(({item:b,image:y,error:v},k)=>{let S=k%u,I=Math.floor(k/u),T=S*d,_=m+I*p,C=y?`<image x="${T+14}" y="${_+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${T+14}" y="${_+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${T+170}" y="${_+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,L=Yu(eO(b,k).slice(0,34)),D=Yu(b.chain||"unknown chain");return`${C}<text x="${T+16}" y="${_+350}" fill="#f3f5f7" font-size="17" font-weight="600">${L}</text><text x="${T+16}" y="${_+376}" fill="#8d98a8" font-size="13">${D}${v?" \xB7 placeholder":""}</text>`}).join(""),x=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${Yu(new Date().toISOString())}</text>${w}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(x).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(b=>b.image).length,placeholders:s.filter(b=>!b.image).map(b=>({assetKey:b.item.assetKey||null,name:b.item.name||null,sourceUrl:b.item.imageUrl||null,error:b.error})),rasterOnly:!0,externalScripts:!1}}var tO=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],nO=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,rO=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function oO(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;nO.test(n)&&t.push("url-in-name");let i=tO.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),rO.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let a=e.estimatedValueUsd==null&&e.estimatedValueSats==null,s=!Array.isArray(e.traits)||e.traits.length===0;a&&s&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function mw(e={}){let t=oO(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}Z();var iO=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),aO=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function Cn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Zo(e,t){let n=await xe(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function sO(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function cO(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function lO(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function gw(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function uO(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function dO(e,t){let n=gw(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),a=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(a)||a<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let s=Math.round((i+a)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-s)*100)/100,currentValueUsd:o,totalCostUsd:s,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function pO(e){let t=new Map;for(let n of e){let r=gw(n);t.has(r)||t.set(r,n)}return[...t.values()]}function mO(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,a)=>i+Number(a.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function yw(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function wr(e={},t={}){let n=new Date().toISOString(),r=Pn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=iO.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=Cn(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await Me(l,4,async y=>({row:y,result:await Zo(`opensea-${y.chain}`,()=>Yr({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:v}of u)if(v.ok){let k=v.data.nfts.map(S=>({...S,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...k),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:v.data.complete?"ok":"partial",count:k.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!r.evm)for(let y of i.filter(v=>v.family!=="solana"))a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let y=await Zo("opensea-solana",()=>Yr({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let v=y.data.nfts.map(k=>({...k,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...v),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:v.length,complete:y.data.complete,next:y.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:y.error,source:"opensea"})}else(!o||o.has("solana"))&&a.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let y=await Zo("satflow-wallet-contents",()=>na({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Cn(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let v=sO(y.data.contents).map(S=>cO(S,r.bitcoin));s.push(...v);let k=v.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:k?"ok":"partial",count:v.length,complete:k,source:"satflow"})}else{let v=await Zo("bitcoin-meta-inscriptions",()=>Jn({address:r.bitcoin},Cn(t,"bitcoinMeta")),t.timeoutMs??35e3),k=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];s.push(...k.map(S=>lO(S,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:k.length?"partial":"unavailable",count:k.length,complete:!1,source:k.length?"bitcoin-meta":"satflow",error:k.length?"Satflow unavailable; fallback has IDs only":y.error})}}else(!o||o.has("bitcoin"))&&a.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let y of[...new Set([r.evm,r.solana].filter(Boolean))]){let v=await Zo(`opensea-pnl-${y}`,()=>Ii({address:y},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:v.error})}let p=uO(e.costBasis),m=pO(s).map(y=>dO(y,p)).map(y=>mw(y)),f=m.filter(y=>!y.spam),h=m.filter(y=>y.spam),g=f.filter(y=>y.estimatedValueUsd!=null&&Number.isFinite(Number(y.estimatedValueUsd))),w=Math.round(g.reduce((y,v)=>y+Number(v.estimatedValueUsd),0)*100)/100,x=f.length-g.length,b=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:aO,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:g.length,unvaluedItems:x,complete:x===0&&b.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:mO(f,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function fw(e,t){let n=typeof e=="number"?e*1e3:Date.parse(String(e||""));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp or Unix seconds`);let r=Math.floor(n/1e3);if(r<=Math.floor(Date.now()/1e3))throw new Error(`${t} must be in the future`);return r}function fO(e){let t=String(e??"").trim();if(!/^[1-9]\d*$/.test(t))throw new Error("Bitcoin NFT list priceSats must be a positive integer");return t}async function bw(e={},t={}){if(e.userConfirmed!==!0)throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");let n=String(e.marketplace||"").trim().toLowerCase();if(n==="opensea")return Ni(e,Cn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=fw(e.expiry??e.endTime,"Solana NFT listing expiry");return _a({...e,expiry:r},Cn(t,"magiceden"))}if(n==="satflow"){let r=fw(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return ra({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:fO(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Cn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Xu(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`${t} must be a non-negative ETH number`);return n}function Qu(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Za(e){return String(e??"").trim().toLowerCase()}function hO(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Za(t),i=Za(n);return!o||!i?!1:r.some(a=>Za(a.trait_type??a.traitType??a.type)===o&&Za(a.value??a.trait_value??a.traitValue)===i)}function gO(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function hw(e={},t=["timestamp","listedAt","createdAt"]){for(let n of t){let r=e[n]??e[n.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`)];if(r==null)continue;let o=typeof r=="number"?r:Date.parse(String(r));if(Number.isFinite(o))return o}return null}function Ju(e){return Math.round(Number(e)*1e6)/1e6}function Zt(e,t,n={}){return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:String(e.marketplace||"").toLowerCase(),collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"PASS",reason:t,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:null,evidence:n,prepareIntent:null}}async function ww(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return Zt(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(S=>e[S]==null||e[S]==="");if(o.length)return Zt(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Xu(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Xu(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Xu(e.traitFloorEth,"traitFloorEth"),d=Qu(e.collectionFloorEth),p=Qu(e.maxListingAgeMs),m=Qu(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return Zt(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return Zt(e,"invalid-min-trait-sales");if(u<=0)return Zt(e,"trait-floor-unavailable");let f=S=>hO(S,e.traitType,e.traitValue)&&gO(S,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(S=>{if(!m)return!0;let I=hw(S,["timestamp","soldAt","createdAt"]);return I!=null&&i-I<=m}),g=Ju(h.reduce((S,I)=>S+Number(I.priceEth??I.price??0),0)),w={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return Zt(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(S=>{let I=Number(S.priceEth??S.price);if(!Number.isFinite(I)||I<=0||I>a)return!1;if(!p)return!0;let T=hw(S,["listedAt","createdAt","timestamp"]);return T!=null&&i-T<=p}).map(S=>{let I=Number(S.priceEth??S.price),T=Math.round((u-I)/u*1e4);return{...S,priceEth:I,discountBps:T}}).filter(S=>S.discountBps>=s).sort((S,I)=>S.priceEth-I.priceEth||I.discountBps-S.discountBps),b={traitSales:w,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:x.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return Zt(e,"invalid-min-trait-listings",b);if(x.length<y)return Zt(e,"trait-listing-depth-insufficient",b);let v=x[0],k=N({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:Ju(v.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:b,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:Ju(v.priceEth),discountBps:v.discountBps},evidence:b,prepareIntent:k}}async function xw(e={},t={}){let n=await wr({...e,includePnl:!0},t);return{provider:"nft-portfolio",operation:"pnl",readOnly:!0,generatedAt:n.generatedAt,addresses:n.addresses,coverage:n.coverage,unsupported:n.unsupported,valuation:n.valuation,pnl:n.pnl}}async function vw(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await wr({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await pw({...e,items:n},Cn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var Sw=10*1024*1024,Iw=1e3;function en(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function vr(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function kw(e,t){if(e==null||e==="")return null;let n=Date.parse(String(e));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(n).toISOString()}function Aw(e,t,n,r,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<n||i>r)throw new Error(`${o} must be an integer from ${n} to ${r}`);return i}function IO(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function _w(e={}){return`portfolio_${SO("sha256").update(IO(e)).digest("hex").slice(0,20)}`}function Tw(e={}){if(e.historyFile)return xr.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return xr.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||xr.join(EO.homedir(),".hermes");return xr.join(xr.resolve(n),"state","oracle","portfolio-history.jsonl")}function AO(e){let t=en(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?vr(t):null}function _O(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=en(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?vr(t):null}function TO(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=en(c.usdValue);return l==null?s:s+l},0),i=en(n.perps?.accountValueUsd),a=vr(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>en(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=en(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:vr(r)})}return t}function PO(e,t,n){let r=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:n,ok:r.filter(o=>o.status==="ok").length,partial:r.filter(o=>o.status==="partial").length,unavailable:r.filter(o=>o.status==="unavailable").length,notConfigured:r.filter(o=>o.status==="not-configured").length,status:n?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function CO(e,t){let n=Tw(t),r=`${JSON.stringify(e)}
|
|
147
|
+
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await wO(xr.dirname(n),{recursive:!0,mode:448});let o=es.O_APPEND|es.O_CREAT|es.O_WRONLY|(es.O_NOFOLLOW||0),i=await xO(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await bO(n,384),n}async function Pw(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||Ja,o=t.nftInventoryImpl||wr,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=AO(s),u=_O(c),d=[l,u].filter(v=>v!=null),p=d.length?vr(d.reduce((v,k)=>v+k,0)):null,m=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=s?.addresses||Pn(e,t.env||process.env),w=_w(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let b={schemaVersion:1,id:`snapshot_${kO()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!g?.[v]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:m,label:m?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(s?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(s?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:TO(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:PO(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await CO(b,t),snapshot:b,balance:s,nfts:c}}async function NO(e){let t=Tw(e);try{let n=await vO(t);if(n.byteLength>Sw)throw new Error(`portfolio history exceeds ${Sw} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
148
|
+
`))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function OO(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Pn(e,t.env||process.env);return Object.values(n).some(Boolean)?_w(n):null}async function Zu(e={},t={}){let n=Aw(e.limit,100,1,Iw,"portfolio history limit"),r=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(r))throw new Error("portfolio history order must be asc or desc");let o=kw(e.since,"portfolio history since"),i=kw(e.until,"portfolio history until"),a=OO(e,t),s=await NO(t),c=s.snapshots.filter(d=>!(a&&d.portfolioId!==a||o&&d.recordedAt<o||i&&d.recordedAt>i));c.sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)));let l=c.length;c=c.slice(-n),r==="desc"&&c.reverse();let u=c.filter(d=>en(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:s.file,portfolioId:a,order:r,totalStored:s.snapshots.length,totalMatching:l,corruptLines:s.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:u.length,unpricedSnapshots:c.length-u.length,firstRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt))).at(-1).recordedAt:null}}}function Ew(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function ts(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function RO(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function LO(e,t){let c=e.map(b=>b.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let b=Math.max(1,Math.abs(l)*.05);l-=b,u+=b}else{let b=(u-l)*.1;l=Math.max(0,l-b),u+=b}let d=b=>e.length===1?1240/2:100+1040*b/(e.length-1),p=b=>570-(b-l)/(u-l)*470,m=e.map((b,y)=>`${y?"L":"M"}${d(y).toFixed(2)},${p(b.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(b,y)=>{let v=y/4,k=100+v*470,S=u-v*(u-l);return`<line x1="100" y1="${k}" x2="1140" y2="${k}" stroke="#26313c" stroke-width="1"/><text x="86" y="${k+5}" text-anchor="end" fill="#8795a5" font-size="15">${Ew(S)}</text>`}).join(""),h=e.map((b,y)=>`<circle cx="${d(y)}" cy="${p(b.value)}" r="5" fill="#b8f0ff"><title>${ts(b.recordedAt)}: ${Ew(b.value)}</title></circle>`).join(""),g=ts(e[0].recordedAt.slice(0,10)),w=ts(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${ts(t||"configured portfolio")}</text>${f}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${m}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${h}<text x="100" y="610" fill="#8795a5" font-size="15">${g}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${w}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function Cw(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Aw(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Zu({...e,order:"asc",limit:e.limit??Iw},t);if(!r.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=r.snapshots.map(d=>({recordedAt:d.recordedAt,value:en(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=RO(o,n),a=i[0].value,s=i.at(-1).value,c=vr(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=LO(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:a,endKnownUsd:s,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}he();var BO=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),MO=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),FO=`0x${"0".repeat(64)}`;function UO(e){return!e||e==="0x"||e===FO}async function Nn(e={},t={}){let n=t.rpcCall||U,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(f){return{address:r,chainId:o,status:"unavailable",error:f?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let a=[],s=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(BO))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of MO)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!UO(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{a.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(s.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),a.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=s.filter(f=>f.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function Nw(e={}){let t=Date.now();try{let n=await Nn({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var qO=/^0x[0-9a-fA-F]{40}$/,Ow=4663;function ns(e,t){let n=String(e||"").trim();if(!qO.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function ed(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n)||BigInt(n)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return n}function ei(e,t){return e==null||e===""?null:ed(e,t)}function HO({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:a,unsignedTx:s,args:c,opts:l}){let u=s?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=ns(u.to,"prepared destination"),p=String(u.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let m=ed(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=ei(u.gasLimit??c.gasLimit,"gasLimit"),h=ei(u.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!f||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let g=Number(l.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),x=zs({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:w,secret:l.routeAttestationSecret}),b=fe(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),y={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:b.selectedBps,expiresAtMs:g+w},v=ei(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return v&&(y.maxPriorityFeePerGas=v),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||v)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=ei(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=ei(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:b.selectedBps,expiresAtMs:g+w,fee:{oracleFeeBps:5},autoSlippage:b,artifact:{chainId:e,owner:o,transactions:[y]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function jO(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}fc();let n=Tm(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function zO({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==Y.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),n?.status!=="ok"&&c.push("structural contract risk is unavailable"),n?.risk==="high"&&c.push("structural contract risk is high"),r?.verdict!==z.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==z.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==Y.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),s.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),a.tokenIn||c.push("tokenIn is required to prepare"),a.amountIn||c.push("amountIn is required to prepare"),a.recipient||c.push("recipient is required to prepare"),c}async function Rw(e={},t={}){let n=Number(e.chainId??Ow);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=ns(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ns(e.tokenIn,"tokenIn"):null,i=e.recipient?ns(e.recipient,"recipient"):null,a=e.amountIn==null?null:ed(e.amountIn,"amountIn"),s=jO(n,t.scanner),c=t.scanContractRisk||Nn,[l,u,d]=await Promise.all([s.resolveToken(r),s.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await s.scoreRisk(r),m=null;s.supports?.("sellSimulation")&&a?m=await s.sellSimulation({token:r,amountIn:a,base:o||void 0}):s.supports?.("sellSimulation")&&(m=await s.sellSimulation({token:r,amountIn:"10000000000000000"}));let f=null;s.supports?.("quote")&&o&&a&&(f=await s.quote({tokenIn:o,tokenOut:r,amountIn:a}));let h={...e,tokenIn:o,amountIn:a,recipient:i},g=zO({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),w=null,x=null,b=null;if(e.prepare===!0&&g.length===0){w=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{x=HO({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(y){b=String(y?.message||y).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!x,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:s.key,name:s.name,nativeCurrency:s.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!w,unsignedTx:w,localSignerEnvelope:x,localSignerBlockedReason:b,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function Lw(){fc();let e=Pm();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Ow,chainIds:e.map(t=>t.chainId),execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:!1,broadcast:!1,note:"capability only; actual arming requires owner-local signer policy and a compatible prepared artifact"}}he();he();var WO=5,td=[50,75,90],$w=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function On(e,t){if(e==null)return null;try{if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isFinite(e)||e<0)throw new Error("bad number");return BigInt(Math.floor(e))}let n=String(e).trim();return n.startsWith("0x"),BigInt(n)}catch{throw new Error(`${t} must be a non-negative integer (wei)`)}}function GO(e){let t=e.filter(n=>n!=null).sort((n,r)=>n<r?-1:n>r?1:0);return t.length?t[Math.floor(t.length/2)]:null}async function rs(e={},t={}){let n=t.rpcCall||U,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=$w[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys($w).join(", ")}`};let i,a,s,c;try{i=On(e.maxFeePerGasWei,"maxFeePerGasWei"),a=On(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=On(e.gasLimit,"gasLimit"),c=On(e.maxTotalGasWei,"maxTotalGasWei")}catch(S){return{status:"error",viable:!1,error:S.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${WO.toString(16)}`,"pending",td],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(S){return{status:"unavailable",viable:!1,error:S?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=On(u?.baseFeePerGas,"baseFeePerGas")??On(l?.baseFeePerGas?.[l.baseFeePerGas.length-1],"baseFeePerGas");if(d==null)return{status:"unavailable",viable:!1,error:"chain did not report a baseFeePerGas (pre-EIP-1559?)",notes:["this pricer is EIP-1559 only"]};let m=(Array.isArray(l?.reward)?l.reward:[]).map(S=>{try{return On(S?.[o.percentile],"reward")}catch{return null}}).filter(S=>S!=null&&S>0n),f=GO(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,w=d*o.baseFeeMultiplier+g,x=[];a!=null&&g>a&&(x.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,w=d*o.baseFeeMultiplier+g),i!=null&&w>i&&(x.push({field:"maxFeePerGas",wanted:w.toString(),capped:i.toString()}),w=i,g>w&&(g=w));let b=s!=null?s*w:null;c!=null&&b!=null&&b>c&&x.push({field:"totalGas",wanted:b.toString(),capped:c.toString()});let y=f==null||g>=f,v=c==null||b==null||b<=c,k=y&&v;return y||h.push(`tip cap ${g} is below the observed ${td[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),v||h.push(`worst-case gas ${b} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:k,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:td[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:b==null?null:b.toString(),clamps:x,notes:h}}he();var YO="08c379a0",XO="4e487b71",QO=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 JO(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===YO)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===XO){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:QO[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 ZO(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 e2(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 t2(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 ti(e={},t={}){let n=t.rpcCall||U,r=Number(e.chainId),o=e.tx||{};if(!Number.isInteger(r))return{status:"error",willRevert:null,error:"chainId is required"};if(!o.to||!/^0x[a-fA-F0-9]{40}$/.test(String(o.to)))return{status:"error",willRevert:null,error:"tx.to must be a valid address"};if(o.from&&!/^0x[a-fA-F0-9]{40}$/.test(String(o.from)))return{status:"error",willRevert:null,error:"tx.from must be a valid address"};let i=t2(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=ZO(f);if(!e2(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=JO(h),h||(l.reason="execution reverted (node did not return a reason payload)",l.kind="revert-no-data")}if(c)return{status:"ok",willRevert:!0,chainId:r,revert:l,summary:`would REVERT: ${l.reason}`,notes:["simulated against current chain state; signing this now would burn gas and fail"]};let u=null,d=null;if(e.estimateGas!==!1)try{let f=await n(r,"eth_estimateGas",[i,"pending"],t);u=BigInt(f);let h=BigInt(Math.max(0,Math.floor(e.gasBufferPercent??20)));d=u+u*h/100n,a.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){a.push(`gas estimation failed: ${f?.message||"unknown"}`)}a.push("a pass reflects CURRENT chain state \u2014 it is not a guarantee the transaction lands, and in a contested mint the state changes between blocks");let p=`0x${"0".repeat(64)}`,m=s===p;return m&&a.push("call did not revert but returned boolean false \u2014 some ERC-20s (e.g. USDC) signal failure this way instead of reverting"),{status:"ok",willRevert:!1,returnsFalse:m,chainId:r,returnData:s,gasEstimate:u==null?null:u.toString(),gasLimit:d==null?null:d.toString(),summary:m?"executes but returns FALSE \u2014 the contract is rejecting this operation":u?`would succeed, ~${u} gas`:"would succeed",notes:a}}async function Bw(e={}){let t=Date.now();try{let n=await ti({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 r2=Object.freeze([{selector:"a0712d68",signature:"mint(uint256)",args:["quantity"]},{selector:"40c10f19",signature:"mint(address,uint256)",args:["to","quantity"]},{selector:"1249c58b",signature:"mint()",args:[]},{selector:"2db11544",signature:"publicMint(uint256)",args:["quantity"]},{selector:"efef39a1",signature:"purchase(uint256)",args:["quantity"]},{selector:"a6f2ae3a",signature:"buy()",args:[]}]);function o2(e){let t=BigInt(e).toString(16);if(t.length>64)throw new Error("value too large for a 32-byte word");return t.padStart(64,"0")}function i2(e){let t=String(e).toLowerCase().replace(/^0x/,"");if(!/^[a-f0-9]{40}$/.test(t))throw new Error(`invalid address: ${e}`);return t.padStart(64,"0")}function Mw(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=i2(t);else if(o==="quantity")r+=o2(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function a2({address:e,chainId:t,minter:n,quantity:r,tx:o,nowMs:i,ttlMs:a=3e4}){if(!o?.gasLimit||!o?.maxFeePerGas)throw new Error("local-signer envelope requires gasLimit and maxFeePerGas");let s=Number(i??Date.now()),c=String(o.value??"0");return{version:1,surface:"evm-nft",action:"mint",provider:"nft-mint",owner:n,destination:e,contract:e,quantity:String(r),totalWei:c,slippageBps:0,expiresAtMs:s+Math.min(Math.max(Number(a)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{chainId:t,owner:n,contract:e,quantity:String(r),totalWei:c,transactions:[{chainId:t,from:n,to:e,data:o.data,value:c,gasLimit:String(o.gasLimit),maxFeePerGas:String(o.maxFeePerGas),...o.maxPriorityFeePerGas!=null?{maxPriorityFeePerGas:String(o.maxPriorityFeePerGas),type:2}:{}}]}}}async function os(e={},t={}){let n=t.rpcCall||U,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",found:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",found:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(c){return{status:"unavailable",error:c?.message||"eth_getCode failed",found:[]}}if(!i||i==="0x")return{status:"ok",found:[],notes:["no contract deployed at this address"]};let a=i.slice(2).toLowerCase(),s=r2.filter(c=>a.includes(c.selector));return{status:"ok",address:r,chainId:o,found:s,notes:s.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function Fw(e={}){let t=Date.now();try{let n=await os({address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",chainId:1},e),r=n.status==="ok";return{provider:"nft-mint",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe failed"}}catch(n){return{provider:"nft-mint",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}async function nd(e={},t={}){let n=String(e.contract||e.address||"").trim().toLowerCase(),r=Number(e.chainId),o=String(e.minter||e.from||"").trim().toLowerCase(),i=e.quantity==null?1:Number(e.quantity);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"minter address is required"};if(!Number.isInteger(i)||i<1)return{status:"error",error:"quantity must be a positive integer"};if(!Number.isInteger(r))return{status:"error",error:"chainId is required"};let a=await os({address:n,chainId:r},t);if(a.status!=="ok")return{status:a.status,error:a.error};if(!a.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:a.notes};let s=e.signature?a.found.find(b=>b.signature===e.signature):a.found[0];if(!s)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:a.found.map(b=>b.signature)};let c=a.found.length>1&&!e.signature,l=await Nn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await ti({chainId:r,tx:{from:o,to:n,data:Mw(s,{minter:o,quantity:i}),value:e.valueWei},gasBufferPercent:e.gasBufferPercent},t),u.willRevert===!0&&e.ignoreRevert!==!0))return{status:"would-revert",error:`mint would revert: ${u.revert.reason}`,simulation:u,mintFunction:s.signature,notes:["signing this now would burn gas and fail; pass ignoreRevert to prepare anyway (e.g. a mint that has not opened yet)"]};let d=e.gasLimit??(u?.gasLimit?Number(u.gasLimit):null),p=await rs({chainId:r,urgency:e.urgency||"war",gasLimit:d,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,maxTotalGasWei:e.maxTotalGasWei},t);if(p.status!=="ok")return{status:"unavailable",error:p.error,notes:p.notes};let m;try{m=Mw(s,{minter:o,quantity:i})}catch(b){return{status:"error",error:b.message}}let f={chainId:r,from:o,to:n,data:m,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=rc({chainId:r,tx:{gasLimit:d,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},policy:{maxTotalGasWei:e.maxTotalGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,grant:e.grant}}),!h.ok))return{status:"refused",error:`gas-war cap exceeded: ${h.reason||h.error}`,gas:p,capCheck:h};let g=[];c&&g.push(`contract exposes ${a.found.length} mint entrypoints (${a.found.map(b=>b.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(b=>b.name).join(", ")}`),p.viable||g.push(p.notes[0]),h.skipped&&g.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let w=null,x=null;try{w=a2({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(b){x=String(b?.message||b).slice(0,200)}return{status:"ok",execution:w?"armed-local":"prepare-only",signed:w?"pending-local-signer":!1,broadcast:w?"pending-local-signer":!1,tx:f,localSignerEnvelope:w,localSignerBlockedReason:x,mintFunction:s.signature,alternatives:a.found.map(b=>b.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}Z();import{createHash as rR}from"node:crypto";import{createHash as c2}from"node:crypto";var l2=1,u2=8,Te=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},d2=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),p2=new Set(["family","id"]),m2=new Set(["id","startsAt","endsAt","eligibility"]),f2=new Set(["kind","proofFormat","proofDigest"]),h2=new Set(["amount","unit"]),g2=new Set(["value","unit"]);function Sr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Te(`${t} must be a plain object`);return e}function kr(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Te(`${n} has unknown field ${r}`,"unknown-field")}function ot(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Te(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function y2(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Te(`${t} must be a positive safe integer`);return e}function rd(e,t){if(e=Sr(e,t),kr(e,h2,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Te(`${t} requires amount and unit`,"ambiguous-unit");let n=ot(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Te(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:ot(e.unit,`${t}.unit`)}}function od(e,t){if(e=Sr(e,t),kr(e,g2,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Te(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function b2(e,t){e=Sr(e,t),kr(e,f2,t);let n=ot(e.kind,`${t}.kind`),r=ot(e.proofFormat,`${t}.proofFormat`),o=ot(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Te(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function w2(e,t){let n=`stages[${t}]`;e=Sr(e,n),kr(e,m2,n);let r=od(e.startsAt,`${n}.startsAt`),o=od(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Te(`${n} must end after it starts`,"invalid-stage-range");return{id:ot(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:b2(e.eligibility,`${n}.eligibility`)}}function id(e){if(e=Sr(e,"input"),kr(e,d2,"input"),e.version!==l2)throw new Te("version must be 1");let t=Sr(e.chain,"chain");kr(t,p2,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>u2)throw new Te("stages must contain 1 through 8 entries","stage-count");let r=n.map(w2).sort((a,s)=>a.startsAt.value-s.startsAt.value||a.id.localeCompare(s.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new Te("stage ids must be unique","duplicate-stage");if(o.add(r[a].id),a&&r[a].startsAt.value<r[a-1].endsAt.value)throw new Te("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Te("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:ot(t.family,"chain.family"),id:ot(t.id,"chain.id")},marketplace:ot(e.marketplace,"marketplace"),mechanism:ot(e.mechanism,"mechanism"),collection:ot(e.collection,"collection"),recipient:ot(e.recipient,"recipient"),quantity:y2(e.quantity,"quantity"),stages:r,mintValueCap:rd(e.mintValueCap,"mintValueCap"),networkFeeCap:rd(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:rd(e.priorityFeeCap,"priorityFeeCap"),expiry:od(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Te("every stage must end no later than expiry","stage-after-expiry");return i}function x2(e){return JSON.stringify(id(e))}function Uw(e){return`sha256:${c2("sha256").update(x2(e),"utf8").digest("hex")}`}var ad=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Rn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),sd=Object.freeze(Object.values(Rn)),Dw=new Set(sd),qw=Object.freeze(sd.slice(0,4)),v2=sd,S2=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Le=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function is(e,t){if(!Array.isArray(e)||e.length===0)throw new Le(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Le(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Le(`${t} contains duplicates`);return[...n].sort()}function k2(e){if(!Array.isArray(e))throw new Le("capabilities must be an array");let t=new Set(e);for(let n of t)if(!Dw.has(n))throw new Le(`unknown capability ${n}`,"unknown-capability");return v2.every(n=>t.has(n))?ad.AUTOMINT_READY:qw.every(n=>t.has(n))?ad.PREPARE_READY:ad.RESEARCH_ONLY}function cd(e=[]){if(!Array.isArray(e))throw new Le("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Le("entry must be an object");for(let i of Object.keys(n))if(!S2.has(i))throw new Le(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Le("entry id must be an exact string");if(t.has(n.id))throw new Le(`duplicate entry id ${n.id}`,"duplicate-entry");let r=is(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(is(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(is(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(is(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:k2(r)});t.set(o.id,o)}return Object.freeze({entries:Object.freeze([...t.values()]),get(n){return t.get(n)||null},find({chainFamily:n,marketplace:r,mechanism:o}={}){return[...t.values()].filter(i=>i.chainFamilies.includes(n)&&i.marketplaces.includes(r)&&i.mechanisms.includes(o))},require(n,r=qw){let o=t.get(n);if(!o)throw new Le(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!Dw.has(i))throw new Le(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Le(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var Z3=cd([]);Z();import{getAddress as E2,Interface as ld,keccak256 as I2}from"ethers";var tn=Object.freeze({manifold:new ld(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new ld(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new ld(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),dd=Object.freeze({manifold:Object.freeze({signature:"mint(address,uint256,uint32,bytes32[],address)",layout:"manifold-claim-v1"}),zora:Object.freeze({signature:"mint(address,uint256,string,address)",layout:"zora-1155-mint-v1"}),thirdweb:Object.freeze({signature:"claim(address,uint256,address,uint256,(bytes32[],uint256,uint256,address),bytes)",layout:"thirdweb-drop-claim-v1"})}),rU=Object.freeze(Object.fromEntries(Object.entries(dd).map(([e,t])=>[tn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function oe(e){throw new Error(`evm-mint-launchpads: ${e}`)}function Ke(e,t){try{return E2(String(e||""))}catch{return oe(`invalid ${t}`)}}function $e(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&oe(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return oe(`${t} must be an unsigned integer`)}}function ud(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&oe(`invalid ${t}`),e.map(String)}function A2(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&oe("invalid chainId");let o=Ke(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&Ke(u.contract,"reviewed contract")===o);a||oe("unsupported contract or wrong chain");let s=Ke(a.mintTarget||a.contract,"reviewed mint target"),c=tn[e].getFunction(dd[e].signature).selector.toLowerCase();return(!(a.selectors||[c]).map(u=>String(u).toLowerCase()).includes(c)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&oe("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function _2(e,t,n){if(typeof n.getCode=="function")return n.getCode(e,t);if(typeof n.rpcCall=="function")return n.rpcCall(e,"eth_getCode",[t,"latest"],n);oe("runtime bytecode verification required")}function T2(e,t){let n=e.stage;if(!n)return null;let r=$e(n.startTime,"stage startTime"),o=$e(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&oe("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function P2(e,t){let n=dd[e];String(t).slice(0,10).toLowerCase()!==tn[e].getFunction(n.signature).selector.toLowerCase()&&oe("unknown selector");let r;try{r=tn[e].decodeFunctionData(n.signature,t)}catch{oe("invalid calldata layout")}let o;return e==="manifold"&&(o=tn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=tn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=tn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&oe("calldata must be canonical with no suffix"),r}async function Hw(e,t={},n={}){tn[e]||oe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=A2(e,t,n),s=Ke(t.recipient||t.minter,"recipient"),c=$e(t.quantity,"quantity",{positive:!0}),l=$e(t.priceWei,"priceWei"),u=$e(t.maxValueWei,"maxValueWei"),d=$e(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&oe("transaction chain mismatch"),Ke(p.to,"transaction target")!==i&&oe("transaction target mismatch");let m=await _2(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||I2(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&oe("runtime bytecode is not reviewed");let f=P2(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=T2(t,h),w,x,b,y=null,v=[];if(e==="manifold")Ke(f[0],"calldata contract")!==o&&oe("calldata contract mismatch"),(t.instanceId==null||$e(f[1],"instanceId")!==$e(t.instanceId,"instanceId"))&&oe("instance/stage mismatch"),(t.mintIndex==null||$e(f[2],"mintIndex")!==$e(t.mintIndex,"mintIndex"))&&oe("mint index/stage mismatch"),v=ud([...f[3]]),w=Ke(f[4],"calldata recipient"),x=1n,b=l;else if(e==="zora")w=Ke(f[0],"calldata recipient"),x=BigInt(f[1]),b=l,t.comment!=null&&f[2]!==String(t.comment)&&oe("comment mismatch"),t.mintReferral!=null&&Ke(f[3],"mint referral")!==Ke(t.mintReferral,"expected mint referral")&&oe("mint referral mismatch");else{w=Ke(f[0],"calldata recipient"),x=BigInt(f[1]),b=BigInt(f[3]);let _=f[4];v=ud([..._.proof]),y=BigInt(_.quantityLimitPerWallet),y<c&&oe("wallet allowance below quantity"),(BigInt(_.pricePerToken)!==l||Ke(_.currency,"allowlist currency")!==Ke(f[2],"currency"))&&oe("allowlist terms mismatch")}w!==s&&oe("recipient mismatch"),x!==c&&oe("quantity mismatch"),b!==l&&oe("price mismatch"),t.proof!=null&&JSON.stringify(v.map(_=>_.toLowerCase()))!==JSON.stringify(ud(t.proof).map(_=>_.toLowerCase()))&&oe("proof mismatch");let k=$e(p.value??0,"transaction value"),S=l*c;(k<S||k-S>d||k>u)&&oe("transaction value or fee cap exceeded");let I=p.gasLimit==null?null:$e(p.gasLimit,"gasLimit"),T=p.maxFeePerGas==null?null:$e(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(I==null||I>$e(t.maxGasLimit,"maxGasLimit"))&&oe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(T==null||T>$e(t.maxFeePerGasWei,"maxFeePerGasWei"))&&oe("gas fee cap exceeded"),N({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:k.toString(),platformFeeWei:(k-S).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...y==null?{}:{walletAllowance:y.toString()},proof:v,transaction:{chainId:r,to:i,data:p.data,value:k.toString(),...I==null?{}:{gasLimit:I.toString()},...T==null?{}:{maxFeePerGas:T.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var C2="RESEARCH_ONLY";var N2="canonical serialized-message decoding and program-specific instruction validation are not implemented",as=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),iU=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function O2(){throw new Error(`solana-mint: ${C2}; disabled until ${N2}`)}function jw(){O2()}Z();import{Address as R2,CompactSize as L2,NETWORK as $2,OutScript as ex,Script as B2,TEST_NETWORK as zw,Transaction as M2,utils as F2}from"@scure/btc-signer";import{createHash as ni}from"node:crypto";var Vw="universal-ordinals-mint",Ww="bitcoin-ordinals-mint-plan",U2=1800*1e3,D2=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Gw=new Set,q2=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function dt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function nn(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`ordinals mint: ${t} must be an integer`);let o=BigInt(r);if(n?o<=0n:o<0n)throw new Error(`ordinals mint: ${t} must be ${n?"positive":"non-negative"}`);return o}function pd(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`ordinals mint: ${t} must be a non-negative number`);return n}function tx(e,t){let n=dt(e,t).toLowerCase();if(!/^(?:[0-9a-f]{2})+$/.test(n))throw new Error(`ordinals mint: ${t} must be non-empty canonical hex`);return n}function H2(e){return e==="bitcoin"||e==="mainnet"?$2:e==="regtest"?{...zw,bech32:"bcrt"}:zw}function Kw(e,t){try{let n=ex.decode(e);if(n.type==="unknown")throw new Error("unknown script type");return n}catch(n){throw new Error(`${t} must be a recognized standard Bitcoin script (${n?.message||"decode failed"})`)}}function j2(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function z2(e){let t=ni("sha256").update(e.unsignedTx).digest();return ni("sha256").update(t).digest().reverse().toString("hex")}function Yw(e,...t){let n=ni("sha256").update(e,"ascii").digest();return ni("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function V2(e,t,n,r){let o=Buffer.from(t||[]);if(o.length<1)throw new Error(`${r} has an empty tapLeafScript`);let i=o.subarray(0,-1),a=o.at(-1);if(n.type!=="tr")throw new Error(`${r} tapLeafScript requires a taproot prevout`);if(!e?.internalKey||!Array.isArray(e.merklePath))throw new Error(`${r} has malformed tapLeafScript control data`);let s=Yw("TapLeaf",Buffer.from([a]),Buffer.from(L2.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Yw("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=F2.taprootTweakPubkey(e.internalKey,s);if(!Buffer.from(c).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==a)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function Xw(e,t){let n=dt(e,t);try{let r=Buffer.from(n,"base64");if(!r.length||r.toString("base64")!==n||r.subarray(0,5).toString("hex")!=="70736274ff")throw new Error("bad PSBT encoding or magic");let o=M2.fromPSBT(r);if(o.global?.unknown?.length||o.global?.proprietary?.length)throw new Error(`${t} contains opaque unknown/proprietary global fields`);let i=Array.from({length:o.inputsLength},(s,c)=>{let l=o.getInput(c);for(let p of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(j2(l[p]))throw new Error(`${t} contains signed/finalized input ${c}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${c} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${c} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${c} requires witnessUtxo value and script`);let u=Kw(l.witnessUtxo.script,`${t} input ${c} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${c} uses SIGHASH_DEFAULT for a non-taproot prevout`);let d=(l.tapLeafScript||[]).map(([p,m],f)=>V2(p,m,u,`${t} input ${c} tapLeafScript ${f}`));return{txid:Buffer.from(l.txid).toString("hex"),vout:Number(l.index),sequence:Number(l.sequence),valueSats:BigInt(l.witnessUtxo.amount).toString(),scriptHex:Buffer.from(l.witnessUtxo.script).toString("hex"),sighashType:l.sighashType,tapLeafScripts:d}}),a=Array.from({length:o.outputsLength},(s,c)=>{let l=o.getOutput(c);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${c} contains opaque unknown/proprietary fields`);return Kw(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:z2(o),inputs:i,outputs:a,feeSats:o.fee.toString(),vsizeLowerBound:o.unsignedTx.length}}catch(r){throw new Error(`ordinals mint: invalid ${t}; decoded PSBT required (${r?.message||"decode failed"})`)}}function W2(e){let t=Buffer.from(e);if(t.length!==36)throw new Error("ordinals mint: inscription envelope parent linkage must be 36 bytes");return`${Buffer.from(t.subarray(0,32)).reverse().toString("hex")}i${t.readUInt32LE(32)}`}function G2(e){if(Number.isInteger(e)&&e>=1&&e<=16)return e;if(e instanceof Uint8Array&&e.length===1&&e[0]>=1&&e[0]<=16)return e[0]}var K2=new Set([1,3]);function Y2(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=G2(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!K2.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let s=r.get(i)||[];s.push(Buffer.from(a)),r.set(i,s)}if(e[n++]!==0)throw new Error("ordinals mint: malformed inscription envelope body separator");let o=[];for(;n<e.length&&e[n]!=="ENDIF";){if(!(e[n]instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope body");o.push(Buffer.from(e[n++]))}if(e[n]!=="ENDIF")throw new Error("ordinals mint: unterminated inscription envelope");return{fields:r,content:Buffer.concat(o)}}function X2(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=B2.decode(u)}catch(p){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${p?.message||"script decode failed"})`)}for(let p=0;p+2<d.length;p+=1)d[p]===0&&d[p+1]==="IF"&&d[p+2]instanceof Uint8Array&&Buffer.from(d[p+2]).equals(Buffer.from("ord","ascii"))&&o.push(Y2(d,p))}if(o.length===0)throw new Error("ordinals mint: missing tapLeafScript inscription envelope");if(o.length!==1)throw new Error("ordinals mint: ambiguous tapLeafScript inscription envelope");let i=o[0],a=i.fields.get(1)||[];if(a.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let s;try{s=new TextDecoder("utf-8",{fatal:!0}).decode(a[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(s!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(ni("sha256").update(i.content).digest("hex")!==t)throw new Error("ordinals mint: inscription envelope content SHA-256 does not match contentHash");let l=i.fields.get(3)||[];if(r!=null){if(l.length!==1||W2(l[0])!==r)throw new Error("ordinals mint: inscription envelope parent linkage does not match parentId")}else if(l.length!==0)throw new Error("ordinals mint: unexpected inscription envelope parent linkage")}function Qw(e){return{txid:e.txid,vout:e.vout,sequence:e.sequence,valueSats:e.valueSats,scriptHex:e.scriptHex,sighashType:e.sighashType,outpoint:`${e.txid}:${e.vout}`}}function Q2(e){let t=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|signedPsbt|signedTransaction|rawTransaction|txHex)$/i,n=r=>{if(!(!r||typeof r!="object"))for(let[o,i]of Object.entries(r)){if(t.test(o))throw new Error(`ordinals mint: ${o} refused; private/signed material is outside this prepare-only adapter`);n(i)}};if(n(e),e.sign===!0||e.execute===!0||e.broadcast===!0||e.submit===!0)throw new Error("ordinals mint: sign/broadcast/execute refused; adapter is prepare-only")}function nx(e,t="parentId"){let n=dt(e,t).toLowerCase();if(!/^[0-9a-f]{64}i\d+$/.test(n))throw new Error(`ordinals mint: ${t} must be a canonical inscription id`);return n}function rx(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=dt(e.txid,`commitInputs[${t}].txid`).toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`ordinals mint: commitInputs[${t}].txid must be 64 hex`);let r=Number(e.vout);if(!Number.isSafeInteger(r)||r<0||r>4294967295)throw new Error(`ordinals mint: commitInputs[${t}].vout invalid`);let o=nn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function J2(e,{recipient:t,parentId:n,postageSats:r}){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: revealOutputs required");let o=e.map((a,s)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${s} invalid`);return{role:dt(a.role,`revealOutputs[${s}].role`),address:dt(a.address,`revealOutputs[${s}].address`),valueSats:nn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:tx(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:nx(a.parentId,`revealOutputs[${s}].parentId`)}}}),i=o.filter(a=>a.role==="inscription");if(i.length!==1)throw new Error("ordinals mint: exactly one inscription reveal output required");if(i[0].address!==t)throw new Error("ordinals mint: reveal destination mutation refused");if(i[0].valueSats!==r)throw new Error("ordinals mint: reveal postage does not match bound postageSats");if(i[0].parentId!==n)throw new Error("ordinals mint: missing or mutated parent linkage on inscription output");return o}function Z2(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:dt(n?.role,`commitOutputs[${r}].role`),valueSats:nn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:tx(n?.scriptHex,`commitOutputs[${r}].scriptHex`)}));if(t.filter(n=>n.role==="reveal").length!==1)throw new Error("ordinals mint: exactly one commit reveal output required");return t}function Jw(e,t,n){if(e.length!==t.length||e.some((r,o)=>r.valueSats!==t[o].valueSats||r.scriptHex!==t[o].scriptHex))throw new Error(`ordinals mint: actual ${n} outputs do not match reviewed outputs`)}function Zw(e,t,n){try{return Buffer.from(ex.encode(R2(H2(t)).decode(e))).toString("hex")}catch(r){throw new Error(`ordinals mint: ${n} must be a valid address for ${t} (${r?.message||"decode failed"})`)}}function eR(e,t){let n=e.commitPsbtInputs??e.psbtInputs;if(n==null)return;if(!Array.isArray(n))throw new Error("ordinals mint: commitPsbtInputs must be an array");let r=n.map((i,a)=>rx({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function tR(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");Q2(e);for(let C of["content","contentBytes","body","file","path","url","contentUrl"])if(e[C]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let C of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[C]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=dt(e.network,"network").toLowerCase();if(!D2.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=dt(e.contentHash??e.contentSha256??e.sha256,"contentHash").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new Error("ordinals mint: contentHash must be a 32-byte SHA-256 hex digest");let o=dt(e.contentType??e.mimeType,"contentType").toLowerCase();if(!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(o))throw new Error("ordinals mint: invalid contentType");let i=nx(e.parentId??e.parentInscriptionId),a=dt(e.recipient??e.destination,"recipient"),s=nn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString();if(!Array.isArray(e.commitInputs)||e.commitInputs.length===0)throw new Error("ordinals mint: exact commitInputs required");let c=e.commitInputs.map(rx);if(new Set(c.map(C=>C.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");eR(e,c);let l=Xw(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=Xw(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=Z2(e.commitOutputs),p=J2(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((C,L)=>C.txid!==c[L].txid||C.vout!==c[L].vout||C.valueSats!==c[L].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Jw(l.outputs,d,"commit PSBT"),Jw(u.outputs,p,"reveal PSBT");let m=Zw(a,n,"recipient");if(p.find(C=>C.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[C,L]of p.entries())if(L.scriptHex!==Zw(L.address,n,`revealOutputs[${C}].address`))throw new Error(`ordinals mint: reveal output ${C} script does not pay its bound address`);let f=d.findIndex(C=>C.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(C=>C.txid===l.txid&&C.vout===f);if(h.length!==1||h[0].valueSats!==d[f].valueSats||h[0].scriptHex!==d[f].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");X2(u,{contentHash:r,contentType:o,parentId:i});let g=pd(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=pd(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=pd(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let b=nn(e.commitFeeSats,"commitFeeSats"),y=nn(e.revealFeeSats,"revealFeeSats"),v=nn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(b+y>v)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==b.toString()||u.feeSats!==y.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(b)/l.vsizeLowerBound>g||Number(y)/u.vsizeLowerBound>w)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(C=>C.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let I=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:nn(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(I.enabled){if(!Number.isSafeInteger(I.outputIndex)||I.outputIndex<0||p[I.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[I.outputIndex].valueSats!==I.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(C=>C.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let T=Number(t.nowMs??Date.now()),_=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(_)||_<=T||_-T>U2)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:a,postageSats:s,commitInputs:l.inputs.map(Qw),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(Qw),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:w,maxRate:x,commitFee:b.toString(),revealFee:y.toString(),maxTotalFee:v.toString(),rbf:e.rbf,cpfp:I,expiresAt:_}}function nR(e={},t={}){let n=tR(e,t),r=n.commitInputs.find(s=>Gw.has(s.outpoint));if(r)throw new Error(`ordinals mint: commit UTXO ${r.outpoint} already reserved; reuse refused`);let o=Object.freeze({...t.feeConfig||e.feeConfiguration||{}}),i={provider:Vw,kind:Ww,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...q2},feeConfiguration:o,plan:{version:1,network:n.network,content:{sha256:n.contentHash,type:n.contentType,mutable:!1},parentId:n.parentId,recipient:n.recipient,postageSats:n.postageSats,commit:{unsignedPsbt:n.commitPsbt,inputs:n.commitInputs,outputs:n.commitOutputs,feeRateSatVb:n.commitRate,feeSats:n.commitFee,rbf:n.rbf},reveal:{unsignedPsbt:n.revealPsbt,inputs:n.revealInputs,outputs:n.revealOutputs,feeRateSatVb:n.revealRate,feeSats:n.revealFee,cpfp:n.cpfp},caps:{maxFeeRateSatVb:n.maxRate,maxTotalFeeSats:n.maxTotalFee},expiresAt:n.expiresAt,maxExecutions:1},note:"Unsigned commit/reveal PSBT plan only. Sign and broadcast in a user-controlled Bitcoin wallet; inscription numbers are not stable before confirmation."},a=N(i,{provider:Vw,kind:Ww,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Gw.add(s.outpoint);return a}var ox=nR;var oR=Object.freeze([Rn.DISCOVERY,Rn.ELIGIBILITY,Rn.PREPARATION,Rn.SIMULATION]),ix=[["evm.manifold","evm",["manifold"],["mint","claim"],"evm","manifold"],["evm.zora","evm",["zora"],["mint"],"evm","zora"],["evm.thirdweb","evm",["thirdweb"],["mint","claim"],"evm","thirdweb"],["evm.opensea-seadrop","evm",["opensea"],["mint","seadrop"],"opensea",null],["solana.metaplex-core","solana",["metaplex"],["mint"],"solana",as.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",as.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",as.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],ax=Object.freeze(ix.map(([e,t,n,r])=>Object.freeze({id:e,family:t,chainFamilies:Object.freeze([t]),marketplaces:Object.freeze(n),mechanisms:Object.freeze(r),enabled:t!=="solana",capabilities:t==="solana"?Object.freeze([Rn.DISCOVERY]):oR,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),wU=cd(ax.map(({family:e,tier:t,enabled:n,...r})=>r)),sx=new Map(ix.map(e=>[e[0],e])),iR=new Set(["intent","adapterId","input"]),aR=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,ss=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ue(e,t,n){throw new ss(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&ue("intent-mismatch",`${n} does not match canonical intent`)}function Ae(e,t,n){let r=e[t];return r.unit!==n&&ue("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function cx(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))aR.test(n)&&ue("custody-refused",`${t}.${n} is outside the prepare-only boundary`),cx(r,`${t}.${n}`)}function sR(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function cR(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ue("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ue("intent-mismatch","stageId does not match canonical intent"),M(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${rR("sha256").update(JSON.stringify(sR(n,t))).digest("hex")}`;M(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),s=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(a)||!Number.isSafeInteger(s))&&ue("invalid-request","decoded input requires exact stage bounds"),M(a,o.startsAt.value,"stage start"),M(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&ue("expired-intent","canonical mint stage is not active at authoritative now"),o}function lR(e,t){let n=sx.get(t);n||ue("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return M(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&ue("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function uR(e,t){e.chain.family==="evm"?(M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.maxValueWei??t.maxTotalWei,Ae(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Ae(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Ae(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Ae(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Ae(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Ae(e,"priorityFeeCap","lamports"),"priority-fee cap")):(M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function dR(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==dn(e))&&ue("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ue("custody-refused","leaf artifact is not strictly prepare-only")}function pR(e,t,n){M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity");let r=Ae(e,"mintValueCap","wei"),o=Ae(e,"networkFeeCap","wei"),i=Ae(e,"priorityFeeCap","wei-per-gas");M(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||ue("artifact-mismatch","prepared EVM transaction is missing"),M(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&ue("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(a.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&ue("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),M(n.contract,e.collection,"artifact collection/drop"),M(n.recipient??n.buyer,e.recipient,"artifact recipient"),M(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&ue("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function mR(e,t,n){M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Ae(e,"mintValueCap","lamports"),"mint-value cap");let r=Ae(e,"networkFeeCap","lamports"),o=Ae(e,"priorityFeeCap","lamports");M(t.networkFeeCapLamports,r,"network-fee cap"),M(t.priorityFeeCapLamports,o,"priority-fee cap"),M(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let s of a.instructions)if(String(s.decoded?.type).toLowerCase().includes("price")){let c=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(c)*BigInt(s.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&ue("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function fR(e,t,n){return M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),M(n.plan.network,e.chain.id,"artifact network"),M(n.plan.parentId,e.collection,"artifact collection/drop"),M(n.plan.recipient,e.recipient,"artifact recipient"),M(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),M(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),M(n.plan.caps.maxFeeRateSatVb,e.priorityFeeCap.amount,"artifact priority-fee cap"),{networkFee:(BigInt(n.plan.commit.feeSats)+BigInt(n.plan.reveal.feeSats)).toString(),priorityFee:String(n.plan.caps.maxFeeRateSatVb)}}function md(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:ax})}async function lx(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:md()}}async function ux(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ue("invalid-request","request must be a plain object");for(let u of Object.keys(e))iR.has(u)||ue("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ue("invalid-request","explicit adapterId is required; adapter inference is refused"),sx.has(e.adapterId)||ue("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ue("invalid-request","family-specific decoded input is required"),cx(n);let r;try{r=id(e.intent)}catch(u){ue("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ue("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ue("expired-intent","canonical mint intent has expired");let i=lR(r,e.adapterId);i[1]==="solana"&&ue("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=cR(r,n,r.chain.family,o);uR(r,n);let s;try{i[4]==="evm"?s=await Hw(i[5],n,t):i[4]==="opensea"?s=await Ci(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await jw(n,t)):s=await ox(n,t)}catch(u){if(u instanceof ss)throw u;ue("adapter-refused",u?.message||"adapter preparation failed",u)}dR(s);let c=i[4]==="bitcoin"?fR(r,n,s):i[4]==="solana"?mR(r,n,s):pR(r,n,s),l=Object.freeze({intentHash:Uw(r),adapterId:e.adapterId,family:r.chain.family,network:r.chain.id,marketplace:r.marketplace,mechanism:r.mechanism,collection:r.collection,recipient:r.recipient,quantity:String(r.quantity),stageId:a.id,proofDigest:a.eligibility.proofDigest,mintValueCap:r.mintValueCap,networkFeeCap:r.networkFeeCap,priorityFeeCap:r.priorityFeeCap,observedNetworkFee:c.networkFee,observedPriorityFee:c.priorityFee});return N({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:s},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(s.expiresAt))})}var fd="ROUTE_ONLY",hd=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),px=new Set(Object.values(hd)),gR=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),yR=new Set(["amount","currency"]),bR=new Set(["value","unit"]),wR=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),xR=new Set(["provider","operations"]),se=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function Ar(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new se(`${t} must be a plain object`);return e}function ri(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new se(`${n} has unknown field ${r}`,"unknown-field")}function ge(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new se(`${t} must be an exact non-empty string`);return e}function mx(e,t,{positive:n=!1}={}){if(e=ge(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new se(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function Er(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new se(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>ge(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new se(`${t} contains duplicates`);return r}function fx(e,t){return e=Ar(e,t),ri(e,yR,t),{amount:mx(e.amount,`${t}.amount`),currency:ge(e.currency,`${t}.currency`)}}function dx(e,t){if(!Array.isArray(e))throw new se(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>fx(n,`${t}[${r}]`))}function vR(e){if(e=Ar(e,"expiry"),ri(e,bR,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new se("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function SR(e,t,n){Object.hasOwn(e,n)&&(t[n]=ge(e[n],n))}function hx(e){e=Ar(e,"intent"),ri(e,gR,"intent");let t=ge(e.action,"action");if(!px.has(t))throw new se(`unsupported action ${t}`,"invalid-action");let n={action:t,family:ge(e.family,"family"),network:ge(e.network,"network"),standard:ge(e.standard,"standard"),collection:ge(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])SR(e,n,o);let r=["tokenId","mint","inscription"].filter(o=>Object.hasOwn(n,o));if(t==="mint"){if(r.length!==0||n.outpoint)throw new se("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new se("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new se("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=ge(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new se("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=ge(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=ge(e.sender,"sender"))}else n.owner=ge(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=ge(e.recipient,"recipient")),n.quantity=mx(e.quantity,"quantity",{positive:!0}),n.marketplace=ge(e.marketplace,"marketplace"),n.protocol=ge(e.protocol,"protocol"),n.artifactKind=ge(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new se(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=fx(e.price,"price"),n.expiry=vR(e.expiry),n.fees=dx(e.fees,"fees"),n.royalties=dx(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=ge(e.listingId,"listingId")),n}function kR(e){e=Ar(e,"adapter"),ri(e,wR,"adapter");let t=Er(e.actions,"adapter.actions");for(let o of t)if(!px.has(o))throw new se(`adapter has unknown action ${o}`,"invalid-action");let n=Ar(e.surface,"adapter.surface");ri(n,xR,"adapter.surface");let r=Ar(n.operations,"adapter.surface.operations");for(let o of t)ge(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new se(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:ge(e.id,"adapter.id"),family:ge(e.family,"adapter.family"),networks:Object.freeze(Er(e.networks,"adapter.networks")),standards:Object.freeze(Er(e.standards,"adapter.standards")),marketplaces:Object.freeze(Er(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(Er(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(Er(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:fd,custody:"user",surface:Object.freeze({provider:ge(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function ER(e=[]){if(!Array.isArray(e))throw new se("entries must be an array");let t=e.map(kR);if(new Set(t.map(r=>r.id)).size!==t.length)throw new se("adapter ids must be unique","duplicate-adapter");function n(r,o){return t.filter(i=>i.family===r.family&&i.networks.includes(r.network)&&i.standards.includes(r.standard)&&i.marketplaces.includes(r.marketplace)&&i.protocols.includes(r.protocol)&&i.artifactKinds.includes(r.artifactKind)&&(!o||i.actions.includes(r.action)))}return Object.freeze({tier:fd,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=hx(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new se("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new se(`adapter lacks ${o.action}`,"unsupported-operation"):new se("no exact adapter route","unsupported-operation")}})}var Ir=(e,t,n,r,o,i,a,s,c,l)=>({id:e,family:t,networks:n,standards:r,marketplaces:o,protocols:i,artifactKinds:a,actions:s,surface:{provider:c,operations:l}}),gd=ER([Ir("opensea-evm-market","evm",["eip155:1","eip155:10","eip155:137","eip155:8453","eip155:42161","eip155:4663"],["erc721","erc1155"],["opensea"],["seaport","seadrop"],["provider-request"],["mint","list","cancel_listing"],"opensea-nft",{mint:"prepareMint",list:"prepareList",cancel_listing:"prepareCancel"}),Ir("evm-asset-safe-transfer","evm",["eip155:1","eip155:10","eip155:137","eip155:8453","eip155:42161","eip155:4663"],["erc721","erc1155"],["none"],["erc721","erc1155"],["evm-safe-transfer"],["send"],"universal-evm-nft-transfer",{send:"prepare"}),Ir("magic-eden-solana-market","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["magic-eden"],["magic-eden-solana"],["solana-transaction"],["buy","list"],"magiceden-sol",{buy:"prepareBuy",list:"prepareList"}),Ir("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Ir("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Ir("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function gx(e,{access:t="public",feeProfile:n="default",registry:r=gd,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new se("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new se("nowMs must be a non-negative safe integer","invalid-expiry");let i=hx(e);if(i.expiry&&o>=i.expiry.value)throw new se("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:fd,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:ge(n,"feeProfile"),fees:Object.freeze({oracle:"0",currency:"none"}),adapterId:a.id,surface:Object.freeze({provider:a.surface.provider,operation:a.surface.operations[i.action]}),intent:Object.freeze(i)})}Z();var ls="universal-evm-nft-transfer",yx="evm-nft-safe-transfer",AR=1800*1e3,_R=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),TR=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function bx(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(TR.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);bx(r,t)}}}function yd(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n)||/^0x0{40}$/.test(n))throw new Error(`evm nft transfer: valid non-zero ${t} address required`);return n}function Ln(e,t,{positive:n=!1,safe:r=!1}={}){let o=String(e??"").trim();if(!/^\d+$/.test(o))throw new Error(`evm nft transfer: ${t} must be an unsigned integer`);let i=BigInt(o);if(i>=1n<<256n||n&&i===0n)throw new Error(`evm nft transfer: ${t} is out of range`);if(r&&i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`evm nft transfer: ${t} is out of range`);return i}var oi=e=>e.toString(16).padStart(64,"0"),cs=e=>e.slice(2).padStart(64,"0");function PR(e,t,n,r,o){return e==="erc721"?`0x42842e0e${cs(t)}${cs(n)}${oi(r)}`:`0xf242432a${cs(t)}${cs(n)}${oi(r)}${oi(o)}${oi(160n)}${oi(0n)}`}function CR(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(bx(e),["sign","execute","broadcast","submit"].some(h=>e[h]===!0))throw new Error("evm nft transfer: execution refused; adapter is prepare-only");let n=String(e.standard??e.tokenStandard??"").toLowerCase().replace("-","");if(n!=="erc721"&&n!=="erc1155")throw new Error("evm nft transfer: standard must be exact ERC-721 or ERC-1155");let r=Ln(e.chainId,"chainId",{positive:!0,safe:!0}),o=yd(e.sender??e.from,"sender"),i=yd(e.recipient??e.to,"recipient"),a=yd(e.contract??e.contractAddress??e.tokenContract,"contract"),s=Ln(e.tokenId,"tokenId"),c=Ln(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(Ln(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=Ln(e.gasLimit,"gasLimit",{positive:!0}),u=Ln(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=Ln(e.maxPriorityFeePerGasWei??e.maxPriorityFeePerGas,"maxPriorityFeePerGasWei");if(d>u)throw new Error("evm nft transfer: priority fee cap exceeds max fee cap");if(e.reviewed!==!0&&e.userConfirmed!==!0)throw new Error("evm nft transfer: reviewed=true required after reviewing chain, parties, NFT, quantity, fee caps, and expiry");let p=Number(e.expiresAt??e.expiry??e.expiresAtMs);if(!Number.isSafeInteger(p)||p<=Number(t)||p-Number(t)>AR)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=PR(n,o,i,s,c),f=e.calldata??e.data;if(f!=null&&String(f).toLowerCase()!==m)throw new Error("evm nft transfer: calldata mutation refused; only canonical safeTransferFrom is allowed");return{standard:n,chainId:Number(r),sender:o,recipient:i,contract:a,tokenId:s.toString(),quantity:c.toString(),gasLimit:l.toString(),maxFeePerGasWei:u.toString(),maxPriorityFeePerGasWei:d.toString(),expiresAt:p,data:m}}function wx(e={},t={}){let n=CR(e,t),r={provider:ls,kind:yx,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{..._R},fee:{oracleFeeBps:0,oracleFeeWei:"0"},transfer:{standard:n.standard,sender:n.sender,recipient:n.recipient,contract:n.contract,tokenId:n.tokenId,quantity:n.quantity},transaction:{chainId:n.chainId,from:n.sender,to:n.contract,data:n.data,value:"0",gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei},caps:{gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei,nativeValueWei:"0"},reviewed:!0,note:"Unsigned exact safeTransferFrom only; sign and broadcast in a user-controlled wallet."};return N(r,{provider:ls,kind:yx,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}Z();var us="universal-solana-nft-transfer",xx="solana-verified-nft-transfer",Sx="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",$n=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),vx=new Set(Object.values($n)),OR=new Set([$n.token,$n.token2022]),RR=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),LR=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function te(e){throw new Error(`solana nft transfer: ${e}`)}function pt(e,t){let n=String(e??"").trim();return n||te(`${t} required`),n}function wt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||te(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&te(`${t} must be positive`),r}function we(e,t,n){String(e??"")!==String(t)&&te(`${n} mismatch; mutation refused`)}function kx(e,t="request",n=new Set){if(!(!e||typeof e!="object"||n.has(e))){n.add(e);for(let[r,o]of Object.entries(e))LR.test(r)&&o!=null&&o!==!1&&te(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),kx(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&te(`${r} refused; adapter is prepare-only`)}}function $R(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&te(`${t} must be decoded`),Array.isArray(e.accounts)||te(`${t} decoded accounts required`),e.decoded}function BR(e,t,n){for(let r of e.accounts){let o=pt(r.pubkey,"account pubkey");t.has(o)||te(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&te(`unexpected writable account ${o}`)}}function MR(e={}){(!e||typeof e!="object"||Array.isArray(e))&&te("request object required"),kx(e),(e.network!=="mainnet-beta"||e.genesisHash!==Sx)&&te("mainnet genesis/network mismatch"),e.reviewed!==!0&&te("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=pt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&te("standard must be metaplex or core");let n=pt(e.mint??e.asset,"mint/asset"),r=pt(e.collection,"collection");e.collectionVerified!==!0&&te("verified collection required");let o=pt(e.owner,"owner"),i=pt(e.recipient,"recipient"),a=wt(e.quantity,"quantity",{positive:!0}),s=wt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&te("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&te("Core quantity must be exactly 1");let c=pt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==$n.core:!OR.has(c))&&te("reviewed transfer program mismatch");let l=t==="metaplex"?pt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?pt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&we(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(wt(e.decimals??0,"decimals")):null,p=wt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=wt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=wt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&te("priority fee exceeds reviewed cap");let g=wt(e.networkFeeLamports,"networkFeeLamports"),w=wt(e.networkFeeCapLamports,"networkFeeCapLamports");g>w&&te("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&te("transaction object required"),x.version!==0&&x.version!=="legacy"&&te("transaction version must be 0 or legacy");let b=pt(x.recentBlockhash,"recentBlockhash");we(b,e.approvedBlockhash,"blockhash mutation after approval");let y=wt(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),v=wt(e.currentBlockHeight,"currentBlockHeight");v>y&&te("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&te("canonical instructions required");let k=new Set([o,n,l,u].filter(Boolean)),S=new Set([o,i,n,r,l,u,...vx].filter(Boolean)),I=0,T=0,_=0,C=0;for(let[L,D]of x.instructions.entries()){let H=pt(D.programId,`instructions[${L}].programId`);vx.has(H)||te(`unknown program ${H}`);let O=$R(D,`instructions[${L}]`);BR(D,S,k);let j=String(O.type??O.instruction??"").toLowerCase();H===$n.computeBudget?j.includes("limit")?(we(O.units??O.computeUnitLimit,p,"compute-unit limit"),I++):j.includes("price")?(we(O.microLamports??O.computeUnitPriceMicroLamports,m,"compute-unit price"),T++):te("unsupported compute budget instruction"):H===$n.associatedToken?((t!=="metaplex"||j!=="createassociatedtokenaccountidempotent")&&te("non-canonical associated token instruction"),we(O.payer,o,"ATA payer"),we(O.owner,i,"ATA recipient"),we(O.mint,n,"ATA mint"),we(O.tokenAccount,u,"recipient ATA"),we(O.tokenProgramId,c,"ATA token program"),C++):t==="metaplex"&&H===c?(j!=="transferchecked"&&te("only canonical transferChecked is allowed"),we(O.mint,n,"mint"),we(O.owner,o,"owner"),we(O.recipient,i,"recipient"),we(O.sourceTokenAccount,l,"source token account"),we(O.destinationTokenAccount,u,"recipient ATA"),we(O.amount,a,"quantity"),we(O.decimals,d,"decimals"),_++):t==="core"&&H===$n.core?(j!=="transfer"&&te("only canonical Core transfer is allowed"),we(O.asset,n,"mint/asset"),we(O.collection,r,"collection"),O.collectionVerified!==!0&&te("verified collection required in Core instruction"),we(O.owner,o,"owner"),we(O.newOwner,i,"recipient"),we(O.amount??1,1,"quantity"),_++):te(`program ${H} is not valid for ${t} transfer`)}return(I!==1||T!==1)&&te("exactly one compute-unit limit and price instruction required"),_!==1&&te("exactly one canonical transfer instruction required"),t==="metaplex"&&C>1&&te("at most one idempotent recipient ATA instruction allowed"),{standard:t,mint:n,collection:r,owner:o,recipient:i,quantity:a.toString(),maxEditionQuantity:s.toString(),tokenProgramId:c,sourceTokenAccount:l,recipientTokenAccount:u,decimals:d,recentBlockhash:b,lastValidBlockHeight:y.toString(),currentBlockHeight:v.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:w.toString(),transaction:x}}function Ex(e={},t={}){let n=MR(e),r=Number(t.nowMs??Date.now()),o={provider:us,kind:xx,chain:"solana-mainnet-beta",genesisHash:Sx,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...RR},fee:{oracleFeeBps:0,oracleFeeLamports:"0"},transfer:{standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:!0,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,...n.sourceTokenAccount?{sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,decimals:n.decimals}:{}},transaction:{unsigned:!0,version:n.transaction.version,recentBlockhash:n.recentBlockhash,lastValidBlockHeight:n.lastValidBlockHeight,instructions:structuredClone(n.transaction.instructions)},caps:{currentBlockHeight:n.currentBlockHeight,computeUnitLimit:n.computeUnitLimit,computeUnitPriceMicroLamports:n.computeUnitPriceMicroLamports,priorityFeeLamports:n.priorityFeeLamports,priorityFeeCapLamports:n.priorityFeeCapLamports,networkFeeLamports:n.networkFeeLamports,networkFeeCapLamports:n.networkFeeCapLamports},reviewed:!0};return N(o,{provider:us,kind:xx,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}Z();var ds="universal-ordinals-transfer",Ix="bitcoin-ordinals-transfer-plan",Ax=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),UR=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ie(e){throw new Error(`ordinals transfer: ${e}`)}function on(e,t){let n=String(e??"").trim();return n||ie(`${t} required`),n}function rn(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ie(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ie(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ie(`${t} out of range`),o}function _x(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ie(`${t} must be positive`),n}function Nx(e,t){let n=on(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ie(`${t} must be 64 hex`),n}function Ox(e,t="inscriptionId"){let n=on(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ie(`${t} must be canonical`),n}function Rx(e,t="request"){if(!e||typeof e!="object")return;let n=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|partialSig|partialSigs|signedPsbt|signedTransaction|rawTransaction|txHex|finalized|finalScriptSig|finalScriptWitness)$/i;for(let[r,o]of Object.entries(e))n.test(r)&&o!=null&&o!==!1&&ie(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Rx(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ie(`${r} bypass refused; adapter is prepare-only`)}function Lx(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ie(`${t}.${n} arbitrary script refused; use a bound address`)}function Tx(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Lx(e,t);let n=Nx(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ie(`${t}.vout invalid`),{txid:n,vout:r,valueSats:rn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:on(e.address,`${t}.address`),sequence:Number(rn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function Px(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Lx(e,t),{role:on(e.role,`${t}.role`),address:on(e.address,`${t}.address`),valueSats:rn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:Ox(e.inscriptionId,`${t}.inscriptionId`)}}}function Cx(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ie(`${n} mismatch; mutation refused`)}function DR(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ie("request object required"),Rx(e);let t=on(e.network,"network").toLowerCase(),n=Nx(e.genesisHash,"genesisHash");(!Ax[t]||n!==Ax[t])&&ie("network/genesis mismatch");let r=Ox(e.inscriptionId),o=Tx(e.ownerInput,"ownerInput");on(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ie("current inscription outpoint mismatch");let i=on(e.destination,"destination"),a=rn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:Px(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ie("exact change output invalid");let c=_x(e.feeRateSatVb,"feeRateSatVb"),l=_x(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ie("fee rate exceeds reviewed cap");let u=rn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=rn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ie("total fee exceeds reviewed cap");let p=Number(rn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(rn(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&ie("RBF sequence refused"),o.sequence!==m&&ie("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&ie("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&ie("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&ie("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&ie("exactly one PSBT input required; extra inputs refused"),Cx(Tx(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((b,y)=>Px(b,`psbt.outputs[${y}]`)):ie("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};Cx(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(b=>b.role==="inscription"&&b.inscriptionId===r).length!==1&&ie("exactly one inscription-carrying output required");let x=h.reduce((b,y)=>b+BigInt(y.valueSats),0n);return BigInt(o.valueSats)!==x+u&&ie("input/output/fee conservation mismatch; inscription burn or fee widening refused"),{network:t,genesisHash:n,inscriptionId:r,currentOutpoint:o.outpoint,ownerInput:o,destination:i,postageSats:a,changeOutput:s,feeRateSatVb:c,maxFeeRateSatVb:l,totalFeeSats:u.toString(),maxTotalFeeSats:d.toString(),locktime:p,sequence:m,psbt:{version:0,unsigned:!0,locktime:p,inputs:[o],outputs:h}}}function $x(e={},t={}){let n=DR(e);return N({provider:ds,kind:Ix,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...UR},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:ds,kind:Ix,env:t.env})}he();function HR(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();if(/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),e.expiresAt!=null){let o=Number(e.expiresAt);Number.isFinite(o)?o<=t&&n.push("grant has expired"):n.push("grant.expiresAt must be a timestamp when supplied")}return{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}function Bx(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),a=[];if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(i))return{status:"error",error:"chainId is required"};if(r!=="alert_only"&&r!=="execute")return{status:"ok",actionMode:"alert_only",requestedMode:r,downgraded:!0,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:null,notes:[`unrecognized actionMode ${JSON.stringify(r)} \u2014 defaulted to alert_only; only the exact string "execute" arms a trigger`]};let s=r;if(r==="execute")if(!kl(t.env||process.env))s="alert_only",a.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=HR(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(s="alert_only",a.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(s="alert_only",a.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return s==="alert_only"?a.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):a.push("ARMED until mint opens: this trigger will submit one prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:s,requestedMode:r,downgraded:s!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:s==="execute"?e.grant:null,armedUntil:s==="execute"?"mint-opens":null,notes:a}}async function Mx(e={},t={}){let n=t.rpcCall||U,r=String(e.contract||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r)||!Number.isInteger(o))return{status:"error",open:!1,error:"contract and chainId are required"};let i=[{selector:"0xeb8d2444",name:"saleIsActive()",openWhen:!0},{selector:"0x25fd90f3",name:"mintActive()",openWhen:!0},{selector:"0x68428a1b",name:"saleActive()",openWhen:!0},{selector:"0x22f3e2d4",name:"isActive()",openWhen:!0},{selector:"0x5c975abb",name:"paused()",openWhen:!1}];for(let a of i)try{let s=await n(o,"eth_call",[{to:r,data:a.selector},"latest"],t);if(s&&s!=="0x"){let c=BigInt(s)===1n;return{status:"ok",open:a.openWhen?c:!c,evidence:a.name,raw:s}}}catch{}return{status:"unknown",open:!1,notes:["no readable sale-state flag; cannot confirm the mint is open \u2014 will not fire on a guess"]}}var zR=1440*60*1e3;function VR(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),String(e.maxValueWei)!=="0"&&n.push("grant.maxValueWei must be 0 for Mancers free mints");let o=Number(e.expiresAt);return Number.isFinite(o)?o<=t?n.push("grant has expired"):o-t>zR&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}var Fx="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",WR=4663,GR="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Ux="a22cb465",KR="a0712d68";function bd(e){return String(e||"").trim().toLowerCase()}function _r(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function YR(e){let t=_r(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Ux}${t.padStart(64,"0")}${"0".repeat(64)}`}function XR(e){return _r(e).includes(_r(Fx))}function QR(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>_r(n?.data).startsWith(Ux))}function JR(e={},t){let n=_r(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return bd(i[0])!==GR?!1:_r(i[2])===n})}function ZR(e=1){return`0x${KR}${BigInt(e).toString(16).padStart(64,"0")}`}function Dx(e={},t={}){let n=bd(e.contract),r=bd(e.minter),o=Number(e.chainId),i=e.valueWei==null?"0":String(e.valueWei),a=[];/^0x[a-f0-9]{40}$/.test(n)||a.push("contract must be a 0x address"),/^0x[a-f0-9]{40}$/.test(r)||a.push("minter must be a 0x address"),o!==WR&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),XR(e.bytecode||"")||a.push("bytecode does not reference Mancers 0x797a\u20268cA57 \u2014 no allowlist gate found");let s=e.simulation||{};s.willRevert===!0&&a.push("mint simulation reverts"),QR(s)&&a.push("simulation sets approval / setApprovalForAll"),JR(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:ZR(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:YR(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Zh(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=VR(e.grant,{nowMs:t.nowMs});p.ok?p.contract!==n||p.chainId!==o?a.push("DOWNGRADED: grant does not match this contract/chain"):d=!0:a.push(`DOWNGRADED: ${p.problems.join("; ")}`)}return{status:c?"ok":"fail",verdict:c?"unknown-risk":"fail",failClosedPass:c,executeFire:d,oneShot:d,execution:"prepare-only",signed:!1,chainId:o,contract:n,minter:r,gate:Fx.toLowerCase(),reasons:a,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}$();Z();Gi();var tL="https://api.paraswap.io",wd=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||tL).replace(/\/$/,"");function Tr(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 xd(e={},t={}){let n=Number(e.chainId||1);return E(`${wd(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Pr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Tr(e.srcToken,"srcToken"),destToken:Tr(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 Wi({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(uf(o)))r.set(s,c);let i=await E(`${wd(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...re(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:a,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function qx(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=Tr(e.userAddress,"userAddress"),o=await Pr(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Tr(e.srcToken,"srcToken"),destToken:Tr(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(s.receiver=Tr(e.receiver,"receiver"));let c=await E(`${wd(t)}/transactions/${n}`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??n)!==n)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==a)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return N({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:s.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:s.srcToken,spender:i.tokenTransferProxy||a,amount:s.srcAmount}:null,transaction:{chainId:n,from:c.from||r,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:fe(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Hx(e={}){let t=await xd({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}import{createHash as rL}from"node:crypto";import{getAddress as Kx,isAddress as vd}from"ethers";var jx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",oL=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),iL=Object.freeze(["lifi"]),zx=/^0x[0-9a-fA-F]{64}$/,aL=/^\d+$/;function ye(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Vx(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ye(t,"must be a positive chainId"),n}function ps(e,t){let n=String(e??"").trim();return(!aL.test(n)||BigInt(n)<=0n)&&ye(t,"must be a positive integer string"),n}function sL(e,t){return e==null||e===""?null:ps(e,t)}function Wx(e,t){let n=String(e??"").trim();return n.toLowerCase()===jx.toLowerCase()?jx:(vd(n)||ye(t,"must be an EVM address or native token sentinel"),Kx(n))}function Yx(e,t){let n=String(e??"").trim();return vd(n)||ye(t,"must be an EVM address"),Kx(n)}function cL(e,t){return e==null||e===""?null:Yx(e,t)}function Gx(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ye(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function lL(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ye(r,"must be a finite millisecond timestamp"),o<=t&&ye(r,"expired"),o>t+n&&ye(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Cr(e){if(Array.isArray(e))return e.map(Cr);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Cr(e[n]));return t}return e}function uL(e){return JSON.stringify(Cr(e))}function ms(e){return`0x${rL("sha256").update(uL(e)).digest("hex")}`}function Xx(e,t){let n={...e};for(let r of t)delete n[r];return n}function dL(e){return ms(Xx(e,["intentHash"]))}function pL(e){return ms(Xx(e,["firmQuoteHash"]))}function Sd(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ye("time","is invalid");let o=Vx(e.fromChainId??e.fromChain,"fromChainId"),i=Vx(e.toChainId??e.toChain,"toChainId"),s=o===i?oL:iL,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Wx(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Wx(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:ps(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Yx(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:lL(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:sL(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Gx(e.allowedSources,"allowedSources",s),allowedRouters:Gx(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?Cr(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ye("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):ms({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=dL(c),Object.freeze(c)}function mL(e){return(!e||typeof e!="object"||Array.isArray(e))&&ye("artifact","required"),e.typedDataHash!=null&&!zx.test(String(e.typedDataHash))&&ye("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!zx.test(String(e.calldataHash))&&ye("artifact.calldataHash","must be bytes32"),e.to!=null&&!vd(String(e.to))&&ye("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ye("artifact.data","must be hex"),Cr(e)}function Qx(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ye("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ye("quote expiry","required"),o<=r&&ye("quote","expired"),o>e.deadlineMs&&ye("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ye("source","required"),e.allowedSources.includes(i)||ye("source","not allowed by intent");let a=ps(t.amountOut??t.buyAmount,"amountOut"),s=ps(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&ye("minBuyAmount","exceeds amountOut");let c=mL(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||ye("quotedAtMs","must be finite");let u=cL(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:u,amountOut:a,minBuyAmount:s,quotedAtMs:Math.floor(l),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?Cr(t.metadata):{}};return d.quoteId||(d.quoteId=ms({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=pL(d),Object.freeze(d)}function ii(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Jx(e,t){return String(e?.[t]??"").trim()}function ai(e,t){return Object.freeze({source:e,run:t})}function fL(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let n=t.env??process.env,r=t.providers??{},o=t.supportedUniV3Chains??je,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return ii(e,"lifi")&&a.push(ai("lifi",async()=>{let c=await(r.lifiQuote??go)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),l=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:l?.toAmount??c?.toAmount,minBuyAmount:l?.toAmountMin??c?.toAmountMin??l?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await hL(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(ii(e,"paraswap")&&a.push(ai("paraswap",async()=>{let c=await(r.paraswapPrice??Pr)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),l=c?.priceRoute??c;return{quoteId:l?.id??null,amountOut:l?.destAmount,minBuyAmount:c?.amountOutMinimum??l?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:l},metadata:{contractAddress:l?.contractAddress??null}}})),ii(e,"0x")&&(Jx(n,"ZEROX_API_KEY")||Jx(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(ai("0x",async()=>{let c=await(r.zeroxQuote??bo)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),ii(e,"cow")&&a.push(ai("cow",async()=>{let c=await(r.cowQuote??Zn)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),l=c?.quote??c;return{quoteId:c?.id??null,amountOut:l?.buyAmount,minBuyAmount:l?.buyAmount,expiryMs:Math.min(Number(l?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:l},metadata:{solver:!0}}})),ii(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(ai("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Un)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),a}async function hL(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function gL(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function yL(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>gL(s,r))),i=[],a=[];for(let s=0;s<o.length;s++){let c=t[s],l=o[s];if(l.status==="rejected"){a.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(Qx(e,{...l.value,source:c.source},n))}catch(u){a.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:a}}function bL(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(a=>Number(a.expiryMs??0)>n);r.sort((a,s)=>{let c=BigInt(s.minBuyAmount??0)-BigInt(a.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(s.amountOut??0)-BigInt(a.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(a=>({...a,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function Zx(e,t={}){let n=fL(e,t),{quotes:r,failed:o}=await yL(e,n,t),i=bL(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}function ev(e={},t={}){return Sd(e,t)}async function tv(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Sd(e,t);return Zx(n,t)}async function nv(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}$();var xL="https://app.across.to";function kd(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||xL).replace(/\/$/,"")}async function rv(e={}){try{let t=await E(`${kd(e)}/api/pools?token=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t.totalPoolSize=="string",provider:"across-bridge",l1Token:t.l1Token}}catch(t){return{ok:!1,provider:"across-bridge",error:String(t.message||t).slice(0,120)}}}async function ov(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return E(`${kd(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function iv(e={},t={}){let n=new URLSearchParams;return e.originChainId&&n.set("originChainId",String(e.originChainId)),e.destinationChainId&&n.set("destinationChainId",String(e.destinationChainId)),e.token&&n.set("token",String(e.token)),e.amount&&n.set("amount",String(e.amount)),E(`${kd(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var SL="https://api.beefy.finance";function Ed(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||SL).replace(/\/$/,"")}async function av(e={}){try{let t=await E(`${Ed(e)}/apy`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Object.keys(t||{});return{ok:n.length>0,provider:"beefy-yields",vaultCount:n.length}}catch(t){return{ok:!1,provider:"beefy-yields",error:String(t.message||t).slice(0,120)}}}async function sv(e={},t={}){let n=await E(`${Ed(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,a]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=a);return o}return n}async function cv(e={}){return E(`${Ed(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}$();var EL="https://public-api.birdeye.so";function lv(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||EL).replace(/\/$/,"")}async function uv(e={}){try{let t=await E(`${lv(e)}/public/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=1`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.data)&&t.data.length>0,provider:"birdeye-tokens"}}catch(t){return{ok:!1,provider:"birdeye-tokens",error:String(t.message||t).slice(0,120)}}}async function dv(e={},t={}){let n=String(e.sortBy||"v24hUSD"),r=String(e.sortType||"desc"),o=Math.max(0,Number(e.offset||0)),i=Math.min(50,Math.max(1,Number(e.limit||20)));return E(`${lv(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var AL="https://api.celenium.io";function Id(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||AL).replace(/\/$/,"")}async function pv(e={}){try{let t=await E(`${Id(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&t.blobs_count!=null,provider:"celestia-da"}}catch(t){return{ok:!1,provider:"celestia-da",error:String(t.message||t).slice(0,120)}}}async function mv(e={}){return E(`${Id(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function fv(e={},t={}){let n=Number(e.height);if(n&&(!Number.isFinite(n)||n<1))throw new Error("celestia-da: height must be positive");let r=n?`/v1/block/${n}`:"/v1/block";return E(`${Id(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var TL="https://api.mainnet-beta.solana.com";function PL(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||TL).replace(/\/$/,"")}async function fs(e,t,n={}){let r=PL(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),s=await(await(n.fetchImpl||fetch)(r,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:o,signal:AbortSignal.timeout(n.timeoutMs??2e4)})).json();if(s.error)throw new Error(`das-assets ${e}: ${s.error.message||JSON.stringify(s.error)}`);return s.result}async function hv(e={}){try{let t=await fs("getAsset",{id:"12He3nqt2XLbpuWGdwsJBNcomm7r3M8Kh6Dj9w7ZAK9"},e);return{ok:t&&typeof t=="object",provider:"das-assets"}}catch(t){return{ok:!1,provider:"das-assets",error:String(t.message||t).slice(0,120)}}}async function gv(e={},t={}){let n=String(e.ownerAddress||"").trim();if(!n)throw new Error("das-assets: ownerAddress is required");let r=Math.max(1,Number(e.page||1)),o=Math.min(1e3,Math.max(1,Number(e.limit||50)));return fs("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function yv(e={},t={}){let n=Math.max(1,Number(e.page||1)),r=Math.min(100,Math.max(1,Number(e.limit||20))),o={page:n,limit:r};return e.ownerAddress&&(o.ownerAddress=String(e.ownerAddress)),e.collectionId&&(o.collectionId=String(e.collectionId)),e.creatorAddress&&(o.creatorAddress=String(e.creatorAddress)),e.delegate&&(o.delegate=String(e.delegate)),fs("searchAssets",o,t)}async function bv(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return fs("getAssetProof",{id:n},t)}$();var NL="https://api.l2beat.com";function Ad(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||NL).replace(/\/$/,"")}async function wv(e={}){try{let t=await E(`${Ad(e)}/api/scaling/tvl`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:t&&typeof t.totalUsd=="string",provider:"l2beat-tvl"}}catch(t){return{ok:!1,provider:"l2beat-tvl",error:String(t.message||t).slice(0,120)}}}async function xv(e={},t={}){let n=await E(`${Ad(t)}/api/scaling/tvl`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.project){let r=String(e.project).toLowerCase(),o=n?.projects||{},i=Object.entries(o).find(([a])=>String(a).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function vv(e={},t={}){return E(`${Ad(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}$();var RL="https://api.spark.fi";function _d(e={}){return(e.baseUrl||process.env.SPARK_API_URL||RL).replace(/\/$/,"")}async function Sv(e={}){try{return{ok:(await E(`${_d(e)}/v1/savings/spark/mainnet/usdc`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4}))?.data?.vault?.address!=null,provider:"spark-lend"}}catch(t){return{ok:!1,provider:"spark-lend",error:String(t.message||t).slice(0,120)}}}async function kv(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?E(`${_d(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):E(`${_d(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var $L="https://api.symbiotic.fi";function Td(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||$L).replace(/\/$/,"")}async function Ev(e={}){try{let t=await E(`${Td(e)}/v1/vaults`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:Array.isArray(t)&&t.length>0,provider:"symbiotic-restaking",count:t.length}}catch(t){return{ok:!1,provider:"symbiotic-restaking",error:String(t.message||t).slice(0,120)}}}async function Iv(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await E(`${Td(t)}/v1/vaults?limit=${n}&offset=${Math.max(0,Number(e.offset||0))}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return e.approvedOnly?r.filter(o=>o.approved===!0):r}async function Av(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return E(`${Td(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}$();var ML="https://staking-api.polygon.technology/api/v2",FL=18,UL=200,DL=50,qL=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Cd(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||ML).replace(/\/$/,"")}function HL(e,t="id"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);let r=Number(n);if(!Number.isSafeInteger(r)||r<1)throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);return r}function jL(e,t=DL){let n=Number(e??t);return Number.isFinite(n)?Math.min(UL,Math.max(1,Math.trunc(n))):t}function Pd(e){let t=Number(e);return Number.isFinite(t)?t/10**FL:null}async function Nd(e,t={}){let n=await E(`${Cd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});if(typeof n=="string")throw new Error(`polygon-staking GET ${e}: non-JSON response`);if(n?.success===!1){let r=n?.message||n?.error||n?.status||"request rejected";throw new Error(`polygon-staking GET ${e}: ${r}`)}return n}function _v(e={}){return{id:e.id??null,name:typeof e.name=="string"?e.name.trim():null,status:e.status??null,currentState:e.currentState??null,owner:e.owner??null,signer:e.signer??null,contractAddress:e.contractAddress??null,commissionPercent:e.commissionPercent??null,uptimePercent:e.uptimePercent??null,performanceIndex:e.performanceIndex??null,delegationEnabled:e.delegationEnabled??null,activationEpoch:e.activationEpoch??null,deactivationEpoch:e.deactivationEpoch??null,jailEndEpoch:e.jailEndEpoch??null,missedLatestCheckpointCount:e.missedLatestCheckpointcount??null,totalStakedRaw:e.totalStaked??null,selfStakeRaw:e.selfStake??null,delegatedStakeRaw:e.delegatedStake??null,totalStakedPolApprox:Pd(e.totalStaked),selfStakePolApprox:Pd(e.selfStake),delegatedStakePolApprox:Pd(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function Tv(e={},t={}){let n=await Nd("/validators",t),r=Array.isArray(n?.result)?n.result:[],o=n?.summary?.total??r.length;if(e.status){let d=String(e.status).toLowerCase();r=r.filter(p=>String(p?.status||"").toLowerCase()===d)}if(e.currentState){let d=String(e.currentState).toUpperCase();r=r.filter(p=>String(p?.currentState||"").toUpperCase()===d)}if(e.delegationEnabled!=null){let d=!!e.delegationEnabled;r=r.filter(p=>!!p?.delegationEnabled===d)}let i=qL.has(String(e.sortBy))?String(e.sortBy):"id",a=String(e.direction||"").toUpperCase()==="DESC";r=[...r].sort((d,p)=>{let m=Number(d?.[i]??0),f=Number(p?.[i]??0),h=Number.isFinite(m)&&Number.isFinite(f)?m-f:0;return a?-h:h});let s=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=jL(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:s,total:o,limit:l,offset:c,sortBy:i,direction:a?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(_v)}}async function Pv(e={},t={}){let n=HL(e.id??e.validatorId,"id"),o=(await Nd(`/validators/${n}`,t))?.result;if(!o||typeof o!="object")throw new Error(`polygon-staking: validator ${n} not found`);return{provider:"polygon-staking",chainId:137,id:n,validator:e.raw?o:{..._v(o),delegatorCount:o.delegatorCount??null,checkpointsSigned:o.checkpointsSigned??null,checkpointsMissed:o.checkpointsMissed??null,isInAuction:o.isInAuction??null,auctionAmount:o.auctionAmount??null,delegatorUnclaimedRewardsRaw:o.delegatorUnclaimedRewards??null,validatorUnclaimedRewardsRaw:o.validatorUnclaimedRewards??null,claimedRewardRaw:o.claimedReward??null,description:typeof o.description=="string"?o.description:null,logoUrl:o.logoUrl??null},raw:e.raw?void 0:o}}async function Cv(e={}){try{let t=await Nd("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Cd(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Cd(e),error:String(t?.message||t),exec:!1}}}$();var VL="https://api.v3.aave.com/graphql",eD=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),WL=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||VL;async function hs(e,t,n={}){let r=await E(WL(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4});if(r?.errors?.length)throw new Error(`aave-v3: ${r.errors.map(o=>o?.message||String(o)).join("; ")}`);return r}var GL=`query Markets($request: MarketsRequest!) {
|
|
149
149
|
markets(request: $request) {
|
|
150
150
|
name
|
|
151
151
|
address
|
|
@@ -153,7 +153,7 @@ anchor-lang = "0.31.1"
|
|
|
153
153
|
totalMarketSize
|
|
154
154
|
totalAvailableLiquidity
|
|
155
155
|
}
|
|
156
|
-
}`,
|
|
156
|
+
}`,KL=`query Market($request: MarketRequest!) {
|
|
157
157
|
market(request: $request) {
|
|
158
158
|
name
|
|
159
159
|
address
|
|
@@ -186,6 +186,6 @@ anchor-lang = "0.31.1"
|
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
|
-
}`,
|
|
189
|
+
}`,YL=`query Chains($filter: ChainsFilter!) {
|
|
190
190
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
191
|
-
}`;function YL(e={}){let t=e.chainIds??(e.chainId!=null?[e.chainId]:null),n=(Array.isArray(t)?t:[t??1]).map(Number).filter(r=>Number.isInteger(r)&&r>0);if(!n.length)throw new Error("aave-v3: chainIds must contain at least one chain id");return[...new Set(n)]}async function Pv(e={},t={}){let n={chainIds:YL(e)};return e.user&&(n.user=String(e.user)),{markets:(await hs(WL,{request:n},t))?.data?.markets??[]}}async function Nv(e={},t={}){let n=String(e.address||e.market||e.marketAddress||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("aave-v3: marketReserves requires an EVM market (pool) address");let r=Number(e.chainId??1);if(!Number.isInteger(r)||r<=0)throw new Error("aave-v3: chainId must be a positive integer");let o={address:n,chainId:r};e.user&&(o.user=String(e.user));let a=(await hs(GL,{request:o},t))?.data?.market??null;if(!a)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:a}}async function Ov(e={},t={}){let n=new Set(["MAINNET_ONLY","TESTNET_ONLY","ALL"]),r=String(e.filter||"MAINNET_ONLY").toUpperCase();if(!n.has(r))throw new Error(`aave-v3: filter must be one of ${[...n].join(", ")}`);return{chains:(await hs(KL,{filter:r},t))?.data?.chains??[]}}async function Rv(e={}){return{ok:(await hs("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}$();var QL="https://staking-api.babylonlabs.io";function Nd(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||QL).replace(/\/$/,"")}function gs(e,t={}){return k(`${Nd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function Lv(e,t="pkHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n))throw new Error(`babylon-staking: ${t} must be hex`);if(n.length===66&&(n.startsWith("02")||n.startsWith("03")))return n.slice(2);if(n.length!==64)throw new Error(`babylon-staking: ${t} must be a 64-char x-only (or 66-char compressed) BTC public key`);return n}async function $v(e={}){try{let n=(await gs("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Nd(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Nd(e),error:String(t?.message||t),exec:!1}}}async function Bv(e={},t={}){let r=(await gs("/v2/stats",t))?.data||{};return{provider:"babylon-staking",activeTvlSats:String(r.active_tvl??""),totalActiveTvlSats:String(r.total_active_tvl??""),activeDelegations:r.active_delegations??null,totalActiveDelegations:r.total_active_delegations??null,activeFinalityProviders:r.active_finality_providers??null,totalFinalityProviders:r.total_finality_providers??null,btcStakingApr:r.btc_staking_apr??null,btcStakingAprPct:r.btc_staking_apr==null?null:Number(r.btc_staking_apr)*100,maxStakingApr:r.max_staking_apr??null,maxStakingAprPct:r.max_staking_apr==null?null:Number(r.max_staking_apr)*100,raw:r}}async function Mv(e={},t={}){let n=await gs("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(a=>String(a.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=Lv(e.btcPk,"btcPk");r=r.filter(a=>String(a.btc_pk||"").toLowerCase()===i)}let o=Math.min(500,Math.max(1,Number(e.limit||r.length||1)));return{provider:"babylon-staking",count:r.length,finalityProviders:r.slice(0,o).map(i=>({btcPk:i.btc_pk??null,moniker:i.description?.moniker??null,website:i.description?.website??null,state:i.state??null,commission:i.commission??null,activeTvlSats:i.active_tvl==null?null:String(i.active_tvl),activeDelegations:i.active_delegations??null}))}}async function Fv(e={},t={}){let n=Lv(e.stakerPkHex||e.stakerPk||e.pkHex||e.pk,"stakerPkHex"),r=new URLSearchParams({staker_pk_hex:n});e.paginationKey&&r.set("pagination_key",String(e.paginationKey));let o=await gs(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}$();var ZL="https://markets.bisq.network";function Od(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||ZL).replace(/\/$/,"")}function Uv(e,t="market"){let n=String(e||"").trim().toLowerCase().replace(/[/\-\s]/g,"_");if(!/^[a-z0-9]{2,12}_[a-z0-9]{2,12}$/.test(n))throw new Error(`bisq-markets: ${t} must look like btc_usd (got "${e}")`);return n}function ys(e,t={}){return k(`${Od(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Dv(e={}){try{let t=await ys("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Od(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Od(e),error:String(t?.message||t),exec:!1}}}async function qv(e={},t={}){let n=await ys("/api/markets",t),r=Object.values(n&&typeof n=="object"?n:{});if(e.base){let o=String(e.base).trim().toLowerCase();r=r.filter(i=>String(i.lsymbol||"").toLowerCase()===o)}if(e.quote){let o=String(e.quote).trim().toLowerCase();r=r.filter(i=>String(i.rsymbol||"").toLowerCase()===o)}return{provider:"bisq-markets",count:r.length,markets:r.map(o=>({pair:o.pair??null,name:o.name??null,base:o.lsymbol??null,baseName:o.lname??null,quote:o.rsymbol??null,quoteName:o.rname??null,baseType:o.ltype??null,quoteType:o.rtype??null}))}}async function Hv(e={},t={}){let n=Uv(e.market||e.pair||"btc_usd","market"),r=await ys(`/api/ticker?market=${encodeURIComponent(n)}`,t),o=Array.isArray(r)?r[0]||{}:r||{};return{provider:"bisq-markets",market:n,last:o.last==null?null:Number(o.last),high:o.high==null?null:Number(o.high),low:o.low==null?null:Number(o.low),bid:o.buy==null?null:Number(o.buy),ask:o.sell==null?null:Number(o.sell),volumeBase:o.volume_left==null?null:Number(o.volume_left),volumeQuote:o.volume_right==null?null:Number(o.volume_right),note:"Bisq is thin, non-KYC P2P \u2014 treat as a basis signal against centralized spot, not a reference rate",raw:o}}async function jv(e={},t={}){let n=Uv(e.market||e.pair||"btc_usd","market"),r=Math.min(2e3,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({market:n,limit:String(r)});e.timestampFrom&&o.set("timestamp_from",String(e.timestampFrom)),e.timestampTo&&o.set("timestamp_to",String(e.timestampTo));let i=await ys(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}$();var Lt=Object.freeze({60808:{name:"bob",label:"BOB (Build on Bitcoin)",url:"https://explorer.gobob.xyz",nativeSymbol:"ETH"},30:{name:"rootstock",label:"Rootstock (RSK)",url:"https://rootstock.blockscout.com",nativeSymbol:"RBTC"}}),t$=new Map([["bob",60808],["rootstock",30],["rsk",30]]),n$=60808;function ai(e){if(e==null||e==="")return n$;let t=t$.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Lt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Lt).join(", ")} / bob, rootstock)`);return n}function Rd(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=ai(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Lt[n].url).replace(/\/$/,"")}function zv(e,t="address"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`bob-rootstock: ${t} must be a 0x EVM address`);return n}function bs(e,t,n={}){return k(`${Rd(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Vv(e={},t={}){let n;try{n=ai(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Lt[n];try{let o=await bs(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Rd(n,e),totalBlocks:o?.total_blocks??null,averageBlockTimeMs:o?.average_block_time??null,exec:!1}}catch(o){return{ok:!1,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Rd(n,e),error:String(o?.message||o),exec:!1}}}async function Ld(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Lt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Ld({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Lt[c].name,error:String(l?.message||l)}}}))}}let r=ai(n),o=Lt[r],i=await bs(r,"/api/v2/stats",t);return{provider:"bob-rootstock",chainId:r,chain:o.name,label:o.label,nativeSymbol:o.nativeSymbol,averageBlockTimeMs:i.average_block_time??null,averageBlockTimeSec:i.average_block_time==null?null:Number(i.average_block_time)/1e3,gasPrices:i.gas_prices??null,gasPriceUpdatedAt:i.gas_price_updated_at??null,gasUsedToday:i.gas_used_today??null,coinPrice:i.coin_price??null,coinPriceChangePct:i.coin_price_change_percentage??null,marketCap:i.market_cap??null,tvl:i.tvl??null,totalBlocks:i.total_blocks??null,totalAddresses:i.total_addresses??null,totalTransactions:i.total_transactions??null,transactionsToday:i.transactions_today??null,networkUtilizationPct:i.network_utilization_percentage??null,raw:i}}async function Wv(e={},t={}){let n=ai(e.chainId??e.chain),r=zv(e.address||e.addr,"address"),o=Lt[n],i=await bs(n,`/api/v2/addresses/${encodeURIComponent(r)}`,t);return{provider:"bob-rootstock",chainId:n,chain:o.name,address:r,nativeSymbol:o.nativeSymbol,coinBalanceWei:i.coin_balance==null?null:String(i.coin_balance),coinBalance:i.coin_balance==null?null:Number(i.coin_balance)/1e18,isContract:i.is_contract??null,isVerified:i.is_verified??null,name:i.name??null,blockNumberBalanceUpdatedAt:i.block_number_balance_updated_at??null,raw:i}}async function Gv(e={},t={}){let n=ai(e.chainId??e.chain),r=zv(e.address||e.addr,"address"),o=await bs(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],a=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:Lt[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}$();var o$="https://insights.braiins.com/api/v1.0";function $d(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||o$).replace(/\/$/,"")}function Bd(e,t={}){return k(`${$d(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Kv(e={}){try{let t=await Bd("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:$d(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:$d(e),error:String(t?.message||t),exec:!1}}}async function Yv(e={},t={}){let n=await Bd("/price-stats",t);return{provider:"braiins-insights",btcUsd:n?.price==null?null:Number(n.price),percentChange24h:n?.percent_change_24h??null,timestamp:n?.timestamp??null,raw:n}}async function Xv(e={},t={}){let n=await Bd("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:a.length,pools:a.slice(0,s).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:a.slice(0,s)}}$();var a$="https://api.cow.fi",Qv=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function Jv(e={}){return(e.baseUrl||process.env.COW_API_URL||a$).replace(/\/$/,"")}function s$(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=Qv[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(Qv).join(", ")})`);return n}function Md(e,t,n){return`${Jv(n)}/${s$(e)}/api/v1${t}`}function Zv(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`cow-protocol: ${t} must be an EVM address`);return n}function eS(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function tS(e={},t={}){return k(Md(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function nS(e={},t={}){let n=Zv(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(eS(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await k(`${Md(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],a=e.openOnly===!1?i:i.filter(s=>String(s?.status||"").toLowerCase()==="open");return{owner:n,count:a.length,total:i.length,orders:a}}async function rS(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",Zv(e.owner||e.address||e.user,"owner"));let r=await k(`${Md(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,eS(e))}}async function oS(e={}){let t=await k(`${Jv(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}$();var l$="https://api.hiro.so",u$=20;function Fd(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||l$).replace(/\/$/,"")}function d$(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function si(e,t={}){return k(`${Fd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:d$(t)})}async function iS(e={}){try{let t=await si("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Fd(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:u$,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Fd(e),error:String(t?.message||t),exec:!1}}}async function aS(e={},t={}){let n=await si("/v2/info",t);return{provider:"hiro-stacks",peerVersion:n.peer_version??null,serverVersion:n.server_version??null,networkId:n.network_id??null,burnBlockHeight:n.burn_block_height??null,stableBurnBlockHeight:n.stable_burn_block_height??null,stacksTipHeight:n.stacks_tip_height??null,stacksTip:n.stacks_tip??null,poxConsensus:n.pox_consensus??null,raw:n}}async function sS(e={},t={}){let n=await si("/v2/pox",t),r=Number(n.total_liquid_supply_ustx||0),o=Number(n.current_cycle?.stacked_ustx||0);return{provider:"hiro-stacks",contractId:n.contract_id??null,currentCycleId:n.current_cycle?.id??null,currentCycleStackedUstx:n.current_cycle?.stacked_ustx==null?null:String(n.current_cycle.stacked_ustx),currentCycleIsPoX:n.current_cycle?.is_pox_active??null,nextCycleId:n.next_cycle?.id??null,nextCycleStackedUstx:n.next_cycle?.stacked_ustx==null?null:String(n.next_cycle.stacked_ustx),nextCycleMinThresholdUstx:n.next_cycle?.min_threshold_ustx==null?null:String(n.next_cycle.min_threshold_ustx),blocksUntilNextCycle:n.next_cycle?.blocks_until_prepare_phase??null,minAmountUstx:n.min_amount_ustx==null?null:String(n.min_amount_ustx),totalLiquidSupplyUstx:n.total_liquid_supply_ustx==null?null:String(n.total_liquid_supply_ustx),participationPct:r>0?o/r*100:null,rewardCycleLength:n.reward_cycle_length??null,rewardSlots:n.reward_slots??null,currentBurnchainBlockHeight:n.current_burnchain_block_height??null,raw:n}}async function cS(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await si(`/extended/v2/pox/cycles?limit=${n}&offset=${r}`,t),i=Array.isArray(o?.results)?o.results:[];return{provider:"hiro-stacks",total:o?.total??null,limit:n,offset:r,cycles:i.map(a=>({cycleNumber:a.cycle_number??null,blockHeight:a.block_height??null,totalStackedAmount:a.total_stacked_amount==null?null:String(a.total_stacked_amount),totalWeight:a.total_weight??null,totalSigners:a.total_signers??null}))}}async function lS(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await si(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}$();var m$="https://bundles.jito.wtf",dS=1e9;function Ud(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||m$).replace(/\/$/,"")}function f$(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function uS(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*dS):null}function h$(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/dS:null,raw:e}}async function pS(e={}){try{let t=await k(`${Ud(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function mS(e={},t={}){let n=f$(e.limit,5,100),r=new URL(`${Ud(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await k(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(h$),s=a.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:a.length,totalTipLamports:s.reduce((c,l)=>c+l,0),maxTipLamports:s.length?Math.max(...s):null,bundles:a}}async function fS(e={}){let t=await k(`${Ud(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,uS(i)])),suggestedTipLamports:uS(r.p75||r.p50),raw:n}}$();var y$="https://api.kamino.finance";function b$(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||y$).replace(/\/$/,"")}function Ye(e){let t=Number(e);return Number.isFinite(t)?t:null}function hS(e={}){let t=Ye(e.totalValueLocked)??0,n=Ye(e.apy?.totalApy)??0,r=Ye(e.kaminoApy?.totalApy)??0;return{strategy:e.strategy||null,pair:e.tokenA&&e.tokenB?`${e.tokenA}-${e.tokenB}`:null,tokenA:e.tokenA||null,tokenB:e.tokenB||null,tokenAMint:e.tokenAMint||null,tokenBMint:e.tokenBMint||null,tvlUsd:t,sharePrice:Ye(e.sharePrice),sharesIssued:Ye(e.sharesIssued),profitAndLoss:Ye(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:Ye(e.apy?.vault?.totalApr),apy24h:Ye(e.kaminoApy?.vault?.apy24h),apy7d:Ye(e.kaminoApy?.vault?.apy7d),apy30d:Ye(e.kaminoApy?.vault?.apy30d),poolPrice:Ye(e.apy?.vault?.poolPrice),priceLower:Ye(e.apy?.vault?.priceLower),priceUpper:Ye(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Dd(e={},t={}){let n=new URL(`${b$(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function gS(e={}){try{let t=await Dd({},e),n=t.filter(r=>(Number(r.totalValueLocked)||0)>0).length;return{ok:t.length>0,provider:"kamino-strategies",strategies:t.length,funded:n,exec:!1}}catch(t){return{ok:!1,provider:"kamino-strategies",error:String(t?.message||t),exec:!1}}}async function yS(e={},t={}){let r=(await Dd(e,t)).map(hS),o=r.length,i=Number.isFinite(Number(e.minTvlUsd))?Number(e.minTvlUsd):1e4;if(r=r.filter(l=>l.tvlUsd>=i),e.token){let l=String(e.token).toLowerCase();r=r.filter(u=>String(u.tokenA||"").toLowerCase()===l||String(u.tokenB||"").toLowerCase()===l||u.tokenAMint===e.token||u.tokenBMint===e.token)}if(e.pair){let l=String(e.pair).toLowerCase().replace(/[/_]/g,"-");r=r.filter(u=>String(u.pair||"").toLowerCase()===l)}e.inRangeOnly===!0&&(r=r.filter(l=>!l.outOfRange));let a=String(e.sortBy||"apy");r.sort((l,u)=>a==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let s=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,s);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",env:e.env||"mainnet-beta",status:e.status||"LIVE",totalStrategies:o,matched:r.length,count:c.length,minTvlUsd:i,tvlUsdMatched:r.reduce((l,u)=>l+u.tvlUsd,0),strategies:c}}async function bS(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Dd({...e,status:e.status||"ALL"},t)).find(i=>i.strategy===n);if(!o)throw new Error(`kamino-strategies: strategy ${n} not found`);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",...hS(o),raw:o}}$();var x$="https://blockstream.info/liquid/api",wS="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function ws(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||x$).replace(/\/$/,"")}function v$(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function S$(e,t="assetId"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`liquid-esplora: ${t} must be 64-char hex`);return n}async function xS(e,t={}){let n=`${ws(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}function vS(e,t={}){return k(`${ws(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function SS(e={}){try{let t=await xS("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:ws(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:ws(e),error:String(t?.message||t),exec:!1}}}async function kS(e={},t={}){let n=await xS("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function ES(e={},t={}){let n=v$(e.address||e.addr,"address"),r=await vS(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=o.funded_txo_sum!=null,s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:a?String(s-c):null,confidential:!a,note:a?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function IS(e={},t={}){let n=S$(e.assetId||e.asset||wS,"assetId"),r=await vS(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===wS,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}$();var E$="https://api-mainnet.magiceden.dev/v2/ord/btc",I$=600;function qd(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||E$).replace(/\/$/,"")}function A$(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function AS(e,t="collectionSymbol"){let n=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(n))throw new Error(`magiceden-ordinals: ${t} must be a slug like "nodemonkes"`);return n}function _S(e,t={}){return k(`${qd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:A$(t),retries:t.retries??1})}async function TS(e={}){let t=AS(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await _S(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:qd(e),probeCollection:t,rateLimitRpm:I$,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:qd(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function CS(e={},t={}){let n=AS(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await _S(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}$();var T$="https://mempool.space/api",C$=7;function Hd(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||T$).replace(/\/$/,"")}function xs(e,t={}){return k(`${Hd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function PS(e){if(!e)return{ageDays:null,stale:null};let t=new Date(e).getTime();if(!Number.isFinite(t))return{ageDays:null,stale:null};let n=(Date.now()-t)/864e5;return{ageDays:Math.round(n*10)/10,stale:n>C$}}async function NS(e={}){try{let n=(await xs("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=PS(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Hd(e),snapshotAt:n.added??null,ageDays:r,stale:o,nodeCount:n.node_count??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-lightning",baseUrl:Hd(e),error:String(t?.message||t),exec:!1}}}async function OS(e={},t={}){let r=(await xs("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=PS(r.added);return{provider:"mempool-lightning",snapshotAt:r.added??null,ageDays:o,stale:i,staleNote:i?`mempool.space Lightning snapshot is ${o} days old \u2014 trend only, not live state`:void 0,nodeCount:r.node_count??null,channelCount:r.channel_count??null,totalCapacitySats:r.total_capacity==null?null:String(r.total_capacity),totalCapacityBtc:r.total_capacity==null?null:Number(r.total_capacity)/1e8,avgCapacitySats:r.avg_capacity==null?null:String(r.avg_capacity),avgFeeRatePpm:r.avg_fee_rate??null,avgBaseFeeMsat:r.avg_base_fee_mtokens??null,torNodes:r.tor_nodes??null,clearnetNodes:r.clearnet_nodes??null,unannouncedNodes:r.unannounced_nodes??null,raw:r}}async function RS(e={},t={}){let n=String(e.metric||e.ranking||"connectivity").trim().toLowerCase(),r=new Set(["connectivity","liquidity","channels"]);if(!r.has(n))throw new Error(`mempool-lightning: metric must be one of ${[...r].join(", ")}`);let o=await xs(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],a=Math.min(100,Math.max(1,Number(e.limit||i.length||1)));return{provider:"mempool-lightning",metric:n,count:i.length,nodes:i.slice(0,a).map(s=>({publicKey:s.publicKey??null,alias:s.alias??null,channels:s.channels??null,capacitySats:s.capacity==null?null:String(s.capacity),firstSeen:s.firstSeen??null,updatedAt:s.updatedAt??null,city:s.city?.en??s.city??null,country:s.country?.en??s.country??null,iso:s.iso_code??null}))}}async function LS(e={},t={}){let n=await xs("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}$();var N$="https://mempool.space/api",$S=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function jd(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||N$).replace(/\/$/,"")}function BS(e,t){let n=String(e||t).trim().toLowerCase();if(!$S.has(n))throw new Error(`mempool-mining: window must be one of ${[...$S].join(", ")}`);return n}function ci(e,t={}){return k(`${jd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function MS(e={}){try{let t=await ci("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:jd(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:jd(e),error:String(t?.message||t),exec:!1}}}async function FS(e={},t={}){let n=await ci("/v1/difficulty-adjustment",t);return{provider:"mempool-mining",progressPercent:n.progressPercent??null,difficultyChangePct:n.difficultyChange??null,estimatedRetargetDate:n.estimatedRetargetDate??null,remainingBlocks:n.remainingBlocks??null,remainingTimeMs:n.remainingTime??null,previousRetargetPct:n.previousRetarget??null,nextRetargetHeight:n.nextRetargetHeight??null,timeAvgMs:n.timeAvg??null,raw:n}}async function US(e={},t={}){let n=BS(e.window||e.timeframe,"1w"),r=await ci(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),a=l=>i>0?Number(l.blockCount||0)/i*100:null,s=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||s.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:s[0]?a(s[0]):null,top3SharePct:s.slice(0,3).reduce((l,u)=>l+(a(u)||0),0)||null,pools:s.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:a(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function DS(e={},t={}){let n=BS(e.window||e.timeframe,"3d"),r=await ci(`/v1/mining/hashrate/${n}`,t),o=Array.isArray(r?.hashrates)?r.hashrates:[];return{provider:"mempool-mining",window:n,currentHashrate:r?.currentHashrate??null,currentHashrateEhs:r?.currentHashrate==null?null:Number(r.currentHashrate)/1e18,currentDifficulty:r?.currentDifficulty??null,points:o.length,hashrates:o,difficulty:Array.isArray(r?.difficulty)?r.difficulty:[]}}async function qS(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await ci(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}$();var R$="https://amm-v2.meteora.ag",HS=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),jS=new Set(["dynamic","multitoken","lst","farms"]),L$=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function $$(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||R$).replace(/\/$/,"")}function Be(e){let t=Number(e);return Number.isFinite(t)?t:null}function B$(e={}){return{address:e.pool_address||null,name:e.pool_name||null,type:e.pool_type||null,version:e.pool_version??null,mints:e.pool_token_mints||[],tokenAmounts:e.pool_token_amounts||[],tokenUsdAmounts:e.pool_token_usd_amounts||[],lpMint:e.lp_mint||null,lpDecimals:e.lp_decimal??null,lpPriceUsd:Be(e.pool_lp_price_in_usd),tvlUsd:Be(e.pool_tvl),farmTvlUsd:Be(e.farm_tvl),volume24hUsd:Be(e.trading_volume),volume7dUsd:Be(e.weekly_trading_volume),fee24hUsd:Be(e.fee_volume),fee7dUsd:Be(e.weekly_fee_volume),tradeApyPct:Be(e.trade_apy),weeklyTradeApyPct:Be(e.weekly_trade_apy),baseApyPct:Be(e.daily_base_apy),farmingApyPct:Be(e.farming_apy),totalApyPct:(Be(e.trade_apy)??0)+(Be(e.farming_apy)??0),aprPct:Be(e.apr),feePct:Be(e.total_fee_pct),farmingPool:e.farming_pool||null,isLst:!!e.is_lst,isMeme:!!e.is_meme,permissioned:!!e.permissioned,unknownTokens:!!e.unknown,createdAt:e.created_at??null}}function M$(e={},t={}){let n=new URL(`${$$(t)}/pools/search`),r=Math.max(0,Number(e.page)||0),o=Math.max(1,Math.min(Number(e.size??e.limit)||20,100));if(n.searchParams.set("page",String(r)),n.searchParams.set("size",String(o)),e.sortKey!=null){let s=String(e.sortKey);if(!HS.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...HS].join(", ")}`);n.searchParams.set("sort_key",s),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let s=String(e.poolType);if(!jS.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...jS].join(", ")}`);n.searchParams.set("pool_type",s)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let a=e.mints||e.includeTokenMints;if(a){let s=(Array.isArray(a)?a:[a]).map(c=>String(c).trim());for(let c of s)if(!L$.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",s.join(","))}return{url:n,page:r,size:o}}async function zd(e={},t={}){let{url:n,page:r,size:o}=M$(e,t),i=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(B$),totalCount:i?.total_count??null,page:r,size:o}}async function zS(e={}){try{let{pools:t,totalCount:n}=await zd({size:3},e);return{ok:t.length>0,provider:"meteora-dlmm",poolsIndexed:n,sample:t.length,exec:!1}}catch(t){return{ok:!1,provider:"meteora-dlmm",error:String(t?.message||t),exec:!1}}}async function VS(e={},t={}){let n=await zd({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,a)=>i+(a.tvlUsd??0),0),pools:r}}async function WS(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await zd({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}$();var U$="https://ordinals.com";function vs(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||U$).replace(/\/$/,"")}function D$(e,t="name"){let n=String(e||"").trim().toUpperCase().replace(/[•.\s_-]/g,"");if(!/^[A-Z]{1,28}$/.test(n))throw new Error(`ordinals-runes: ${t} must be 1-28 letters (spacers are stripped automatically)`);return n}async function GS(e,t={}){let n=`${vs(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Vd(e,t={}){return k(`${vs(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function KS(e={}){try{let t=await GS("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:vs(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:vs(e),error:String(t?.message||t),exec:!1}}}async function YS(e={},t={}){let n=await GS("/r/blockheight",t),r=Number(n);if(!Number.isFinite(r))throw new Error(`ordinals-runes: unexpected blockheight response ${n.slice(0,60)}`);return{provider:"ordinals-runes",blockHeight:r}}async function XS(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Vd(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function QS(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,a=await Vd(i,t),s=Array.isArray(a?.ids)?a.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:s.length,inscriptionIds:s,more:!!a?.more,raw:a}}async function JS(e={},t={}){let n=D$(e.name||e.rune||e.runeName,"name"),r=await Vd(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}$();var H$="https://hermes.pyth.network",Gd={"SOL/USD":"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d","BTC/USD":"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43","ETH/USD":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","USDC/USD":"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a","USDT/USD":"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b","JUP/USD":"0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996","JTO/USD":"b43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2","BONK/USD":"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419","PYTH/USD":"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff","HYPE/USD":"4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b"},j$=/^[0-9a-fA-F]{64}$/;function ZS(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||H$).replace(/\/$/,"")}function ek(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Gd[n.toUpperCase()]||Gd[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!j$.test(o))throw new Error(`pyth-price-feeds: ${t} must be a 32-byte hex feed id or a known symbol`);return o.toLowerCase()}function Wd(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Kd(e={}){let t=Wd({price:Number(e.price?.conf),expo:e.price?.expo}),n=Wd(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Wd(e.ema_price),publishTime:e.price?.publish_time??null,publishTimeIso:e.price?.publish_time?new Date(e.price.publish_time*1e3).toISOString():null,ageSeconds:e.price?.publish_time?Math.max(0,Math.round(Date.now()/1e3-e.price.publish_time)):null,expo:e.price?.expo??null,raw:{price:e.price??null,emaPrice:e.ema_price??null,metadata:e.metadata??null}}}async function Yd(e,t={}){let n=new URL(`${ZS(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function tk(e={}){try{let t=await Yd([Gd["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Kd):[])[0]||null;return{ok:!!(r&&Number.isFinite(r.price)&&r.price>0),provider:"pyth-price-feeds",solUsd:r?.price??null,ageSeconds:r?.ageSeconds??null,exec:!1}}catch(t){return{ok:!1,provider:"pyth-price-feeds",error:String(t?.message||t),exec:!1}}}async function nk(e={},t={}){let n=ek(e.feedId||e.id||e.symbol,"feedId"),r=await Yd([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Kd):[],i=o.find(a=>String(a.id).toLowerCase()===n)||o[0]||null;if(!i)throw new Error(`pyth-price-feeds: no price returned for feed ${n}`);return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",feedId:n,...i,binaryUpdate:r?.binary?.data?.[0]||null,binaryEncoding:r?.binary?.encoding||null}}async function rk(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>ek(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let a=[];for(let l of i)a.push(await Yd(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Kd):[]),c=Object.fromEntries(s.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:s.length,missing:r.filter(l=>!c[l]),prices:s,byId:c}}async function ok(e={},t={}){let n=new URL(`${ZS(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}$();var V$="https://relayscan.io",ik=new Set(["1h","12h","24h","7d"]);function Xd(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||V$).replace(/\/$/,"")}function ak(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!ik.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...ik].join(", ")}`);return t}function W$(e={}){let t=e.date||e.day;if(t==null)return new Date(Date.now()-864e5).toISOString().slice(0,10);let n=String(t).trim();if(!/^\d{4}-\d{2}-\d{2}$/.test(n))throw new Error("relayscan-mev: date must be YYYY-MM-DD");return n}async function Qd(e={},t={}){return k(`${Xd(t)}/overview/json?t=${ak(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function sk(e={},t={}){return k(`${Xd(t)}/builder-profit/json?t=${ak(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function ck(e={},t={}){let n=W$(e);return k(`${Xd(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function lk(e={}){let t=await Qd({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}$();var K$="https://extra-api.sanctum.so",Y$=30,X$=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Jd(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||K$).replace(/\/$/,"")}function uk(e,t="lst"){let n=String(e??"").trim();if(!n||/[?&=\s]/.test(n))throw new Error(`sanctum-lst: ${t} must be an LST symbol or mint`);return n}function Q$(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Bn(e,t,n={}){let r={},o={};for(let i of Q$(t,Y$)){let a=new URL(`${Jd(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await k(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function dk(e={}){try{let[t,n]=await Promise.all([k(`${Jd(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Bn("apy/inception",["jitoSOL"],e)]),r=Array.isArray(t?.lsts)?t.lsts:[];return{ok:r.length>0&&Number.isFinite(Number(n.values.jitoSOL)),provider:"sanctum-lst",lstCount:r.length,jitoSolApyInception:Number(n.values.jitoSOL)??null,exec:!1}}catch(t){return{ok:!1,provider:"sanctum-lst",error:String(t?.message||t),exec:!1}}}async function Zd(e={},t={}){let n=await k(`${Jd(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(a=>String(a.symbol||"").toLowerCase()===i||a.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function pk(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Zd({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=X$);let r=[...new Set(n.map(s=>uk(s,"lsts[]")))],[o,i]=await Promise.all([Bn("apy/latest",r,t),Bn("apy/inception",r,t)]),a=r.map(s=>{let c=Number(o.values[s]),l=Number(i.values[s]);return{lst:s,apyLatest:Number.isFinite(c)?c:null,apyLatestPct:Number.isFinite(c)?c*100:null,apyInception:Number.isFinite(l)?l:null,apyInceptionPct:Number.isFinite(l)?l*100:null,error:o.errs[s]||i.errs[s]||null}});return a.sort((s,c)=>(c.apyInception??-1)-(s.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:a.length,apys:a,byLst:Object.fromEntries(a.map(s=>[s.lst,s]))}}async function mk(e={},t={}){let n=uk(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Bn("apy/latest",[n],t),Bn("apy/inception",[n],t),Bn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Bn("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}$();var Z$="https://api.save.finance",eB="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",fk="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",tB=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function ep(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||Z$).replace(/\/$/,"")}function hk(e,t="address"){let n=String(e??"").trim();if(!tB.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function gk(e){let t=Number(e);return Number.isFinite(t)?t:null}function nB(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function rB(e={}){let t=e.reserve||{},n=t.liquidity||{},r=t.collateral||{};return{address:e.address||t.address||null,lendingMarket:t.lendingMarket||null,mint:n.mintPubkey||null,mintDecimals:n.mintDecimals??null,supplyApyPct:gk(e.rates?.supplyInterest),borrowApyPct:gk(e.rates?.borrowInterest),cTokenExchangeRate:e.cTokenExchangeRate??null,availableAmount:n.availableAmount??null,borrowedAmountWads:n.borrowedAmountWads??null,marketPrice:n.marketPrice??null,collateralMint:r.mintPubkey||null,collateralTotalSupply:r.mintTotalSupply??null,rewards:e.rewards||[],lastUpdateSlot:t.lastUpdate?.slot??null,stale:t.lastUpdate?.stale===1,raw:e}}async function yk(e={}){try{let t=await k(`${ep(e)}/v1/reserves?ids=${fk}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:fk,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function tp(e={},t={}){let n=new URL(`${ep(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(nB);if(e.includeHidden!==!0&&(o=o.filter(a=>!a.hidden)),e.name){let a=String(e.name).toLowerCase();o=o.filter(s=>String(s.name||"").toLowerCase()===a)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function bk(e={},t={}){let n=[];if(e.ids||e.reserves)n=(Array.isArray(e.ids||e.reserves)?e.ids||e.reserves:String(e.ids||e.reserves).split(",")).map(s=>hk(String(s).trim(),"reserve"));else{let a=hk(e.market||e.marketAddress||eB,"market"),c=(await tp({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===a);if(!c)throw new Error(`solend-lending: market ${a} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await k(`${ep(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...rB(a),address:a.address||a.reserve?.address||n[s]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function np(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`${t} must be a positive integer amount`)}if(n<=0n)throw new Error(`${t} must be a positive integer amount`);return n}function Mn(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function li(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:np(e.amount,"amount")}}function rp(e,t){let n=t.map(a=>BigInt(a)),r=n.reduce((a,s)=>a+s,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(a=>e*a/r),i=e-o.reduce((a,s)=>a+s,0n);for(let a=0;i>0n;a=(a+1)%o.length)o[a]+=1n,i-=1n;return o}function ui(e,t,n,r={}){return{kind:"execution-strategy-plan",strategy:t,chainId:e.chainId,tokenIn:e.tokenIn,tokenOut:e.tokenOut,taker:e.taker,totalAmount:String(e.total),slices:n,executable:!1,signs:!1,broadcasts:!1,requiresFreshQuotePerSlice:!0,requiresPolicyCheckPerSlice:!0,requiresSimulationPerSlice:!0,requiresUserConfirmationPerSlice:!0,receiptRequiredPerSlice:!0,...r}}function op(e,t,n=Date.now()){let r=Math.floor(t/e.length);return e.map((o,i)=>({index:i+1,amount:String(o),offsetSec:i*r,executeAfter:new Date(n+i*r*1e3).toISOString()}))}function iB(e={},t={}){let n=li(e),r=Mn(e.slices??10,"slices",2,100),o=Mn(e.durationSec??3600,"durationSec",r,604800),i=rp(n.total,Array(r).fill(1));return ui(n,"TWAP",op(i,o,t.nowMs),{durationSec:o})}function aB(e={},t={}){let n=li(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=Mn(e.durationSec??3600,"durationSec",r.length,604800),i=rp(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=op(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return ui(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function sB(e={}){let t=li(e),n=Mn(e.participationBps,"participationBps",1,1e4);if(!Array.isArray(e.observedMarketVolumes)||e.observedMarketVolumes.length===0||e.observedMarketVolumes.length>100)throw new Error("observedMarketVolumes must contain 1-100 positive integer amounts");let r=t.total,o=[];for(let[i,a]of e.observedMarketVolumes.entries()){let s=np(a,"observedMarketVolumes"),c=s*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(s)}),r-=l,r===0n)break}return ui(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function cB(e={}){let t=li(e),n=np(e.displayAmount,"displayAmount");if(n>t.total)throw new Error("displayAmount cannot exceed total amount");let r=[],o=t.total;for(;o>0n;){if(r.length>=100)throw new Error("iceberg requires more than 100 refills");let i=o>n?n:o;r.push({index:r.length+1,amount:String(i),displayAmount:String(n)}),o-=i}return ui(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function lB(e={},t={}){let n=li(e),r=Mn(e.slices??10,"slices",2,100),o=Mn(e.durationSec??3600,"durationSec",r,604800),i=Mn(e.urgencyBps??5e3,"urgencyBps",1,1e4),a=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),s=rp(n.total,a);return ui(n,"IS",op(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function wk(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return iB(e,t);if(n==="VWAP")return aB(e,t);if(n==="POV")return sB(e,t);if(n==="ICEBERG")return cB(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return lB(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function xk(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var Ak=Object.freeze({"opensea-evm-market":Object.freeze({provider:"opensea-nft",operations:Object.freeze({mint:"prepareMint",list:"prepareList",cancel_listing:"prepareCancel"})}),"evm-asset-safe-transfer":Object.freeze({provider:"universal-evm-nft-transfer",operations:Object.freeze({send:"prepare"})}),"magic-eden-solana-market":Object.freeze({provider:"magiceden-sol",operations:Object.freeze({buy:"prepareBuy",list:"prepareList"})}),"solana-nft-transfer":Object.freeze({provider:"universal-solana-nft-transfer",operations:Object.freeze({send:"prepare"})}),"satflow-ordinals-market":Object.freeze({provider:"satflow",operations:Object.freeze({buy:"preparePurchase",list:"prepareList"})}),"bitcoin-ordinal-transfer":Object.freeze({provider:"universal-ordinals-transfer",operations:Object.freeze({send:"prepare"})})});function Ek(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:fd,adapters:Object.freeze(hd.adapters.map(e=>{let t=Ak[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function AB(e,t={}){let n=hx(e,t),r=Ak[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new se(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var ip=new Map;function ks(e={}){let t=e.filePath||void 0,n=t||"__default__";return ip.has(n)||ip.set(n,U0(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),ip.get(n)}var ap=new Map;function sp(e={}){let t=e.filePath||void 0,n=t||"__default__";return ap.has(n)||ap.set(n,z0(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),ap.get(n)}var cp=new Map;function di(e={}){let t=e.filePath||void 0,n=t||"__default__";return cp.has(n)||cp.set(n,$0(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),cp.get(n)}var _B={"hl-info":{health:e=>Mm(e),allMids:e=>St(e),l2Book:(e,t={})=>jn(t.coin,e),outcomeMeta:e=>eo(e),clearinghouse:(e,t={})=>Li(t.user,e),userFills:(e,t={})=>Fm(t.user,e),meta:e=>Um(e),metaAndAssetCtxs:e=>Qe(e),candleSnapshot:(e,t={})=>$i(t,e),openOrders:(e,t={})=>qm(t.user,e),frontendOpenOrders:(e,t={})=>Hm(t.user,e),userState:(e,t={})=>zn(t.user,e),spotMeta:e=>Bi(e)},"hl-vaults":{health:e=>Vm(e),summaries:(e,t={})=>xc(t,e),details:(e,t={})=>Mi(t,e),userEquities:(e,t={})=>vc(t,e),tracker:(e,t={})=>Sc(t,e)},"hl-precompiles":{health:e=>Gm(e),read:(e,t={})=>Wm(t,e),l1BlockNumber:e=>Fi(e),markPx:(e,t={})=>Ic(t,e),oraclePx:(e,t={})=>Ac(t,e),spotPx:(e,t={})=>_c(t,e),position:(e,t={})=>Tc(t,e),spotBalance:(e,t={})=>Cc(t,e),vaultEquity:(e,t={})=>Pc(t,e),withdrawable:(e,t={})=>Nc(t,e)},"hl-delta-neutral":{health:()=>gf(),scan:(e,t={})=>Qc(t,e),quote:(e,t={})=>Jc(t,e),prepare:(e,t={})=>Zc(t,e),loop:(e,t={})=>kf(t,e)},"lighter-delta-neutral":{health:()=>Pf(),scan:(e,t={})=>tl(t,e),quote:(e,t={})=>nl(t,e),prepare:(e,t={})=>rl(t,e),loop:(e,t={})=>Ff(t,e)},"poly-public":{health:e=>Df(e),time:e=>ol(e),markets:(e,t={})=>qf(t,e),book:(e,t={})=>Hf(t.tokenId,e),midpoint:(e,t={})=>jf(t.tokenId,e),spread:(e,t={})=>zf(t.tokenId,e),price:(e,t={})=>Vf(t.tokenId,{side:t.side},e),events:(e,t={})=>Wf(t,e)},"evm-rpc":{health:(e,t={})=>Fn(t.chainId??1,e),healthAll:(e,t={})=>Ds({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>$r(t.chainId??1,e),chainId:(e,t={})=>Fs(t.chainId??1,e),getBalance:(e,t={})=>ln(t.chainId??1,t.address,e),call:(e,t={})=>U(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>Us(t,e),erc20Balance:(e,t={})=>Br(t,e),transactionReceipt:(e,t={})=>Mr(t,e)},portfolio:{health:e=>lw(e),balances:(e,t={})=>Ja(t,e),snapshot:(e,t={})=>Tw(t,e),history:(e,t={})=>Ju(t,e),valueGraph:(e,t={})=>Cw(t,e)},"nft-portfolio":{health:e=>gw(e),inventory:(e,t={})=>wr(t,e),gallery:(e,t={})=>xw(t,e),pnl:(e,t={})=>ww(t,e),prepareList:(e,t={})=>yw(t,e),traitSnipe:(e,t={})=>bw(t,e)},"contract-risk":{health:e=>Pw(e),scan:(e,t={})=>Nn(t,e)},"evm-token-sniper":{health:e=>Rw(e),scan:(e,t={})=>Ow(t,e)},"evm-simulate":{health:e=>$w(e),simulate:(e,t={})=>ei(t,e)},"nft-mint":{health:e=>Mw(e),discover:(e,t={})=>os(t,e),prepare:(e,t={})=>td(t,e),priceGas:(e,t={})=>rs(t,e),createTrigger:(e,t={})=>$x(t,e),checkOpen:(e,t={})=>Bx(t,e),evaluateMancerOs:(e,t={})=>Ux(t,e)},"universal-mint-router":{health:()=>cx(),capabilities:()=>pd(),prepare:(e,t={})=>lx(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:Ek()}),capabilities:()=>Ek(),route:(e,t={})=>AB(t,e)},"erc8004-identity":{health:()=>Rg(),prepareIdentityRegistration:(e,t={})=>Bg(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Mg(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Ug(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:ls,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>bx(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:us,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>kx(t,e)},"universal-ordinals-transfer":{health:()=>({provider:ds,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Lx(t,e)},"solana-rpc":{health:e=>Kf(e),latestBlockhash:(e,t={})=>al(t,e),getBalance:(e,t={})=>Yi(t,e),tokenAccounts:(e,t={})=>fo(t,e),simulate:(e,t={})=>Yf(t,e)},"bitcoin-esplora":{health:e=>Xf(e),tipHeight:e=>Qf(e),fees:e=>Jf(e),address:(e,t={})=>Qi(t,e),utxos:(e,t={})=>Zf(t,e),tx:(e,t={})=>eh(t,e),decode:(e,t={})=>th(t,e)},"bitcoin-meta":{health:e=>rh(e),runeBalances:(e,t={})=>Zi(t,e),inscriptions:(e,t={})=>Jn(t,e),inscriptionInfo:(e,t={})=>oh(t,e),inscriptionChildren:(e,t={})=>ih(t,e),ordBlockInfo:(e,t={})=>ah(t,e)},satflow:{health:e=>ch(e),collectionFloors:(e,t={})=>lh(t,e),collectionStats:(e,t={})=>uh(t,e),item:(e,t={})=>dh(t,e),walletContents:(e,t={})=>ta(t,e),floorListings:(e,t={})=>ph(t,e),preparePurchase:(e,t={})=>fh(t,e),prepareList:(e,t={})=>na(t,e)},jupiter:{health:e=>Sh(e),venues:(e,t={})=>vh(t,e),quote:(e,t={})=>ia(t,e),prepare:(e,t={})=>kh(t,e)},defillama:{health:e=>Ih(e),prices:(e,t={})=>bn(t.coins||[],e),pricesBySymbol:(e,t={})=>Ch(t.symbols,e),protocols:e=>Ah(e),yields:(e,t={})=>_h(t,e),stablecoins:(e,t={})=>aa(t,e),dexVolumes:(e,t={})=>Th(t,e)},lifi:{health:e=>Nh(e),quote:(e,t={})=>go(t,e),prepare:(e,t={})=>Oh(t,e),chains:e=>Rh(e)},dexscreener:{health:e=>Ep(e),token:(e,t={})=>un(t.address||t.tokenAddress,e),search:(e,t={})=>Fr(t.q||t.query,e),pair:(e,t={})=>Ip(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>qp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Un(t,e),prepare:(e,t={})=>Dp(t,e),quotePath:(e,t={})=>Up(t,e),ethUsdc:(e,t={})=>Xs(t,e),chains:()=>Hp()},"uniswap-v4":{health:(e,t={})=>Qp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Vr(t,e),inspectHook:(e,t={})=>Wp(t,e),prepare:(e,t={})=>Yp(t,e),chains:()=>Xp()},x402:{health:()=>g0(),inspect:(e,t={})=>f0(t),prepare:(e,t={})=>h0(t,e)},bankr:{health:e=>S0(e),wallet:e=>Rl(e),portfolio:e=>x0(e),swapQuote:(e,t={})=>v0(t,e)},aerodrome:{health:(e,t={})=>qh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>sa(t,e),prepare:(e,t={})=>Dh(t,e),chains:()=>Hh()},zerox:{health:e=>Wh(e),price:(e,t={})=>xl(t,e),quote:(e,t={})=>bo(t,e),prepare:(e,t={})=>Gh(t,e)},across:{health:e=>Kh(e),suggestedFees:(e,t={})=>vl(t,e)},hop:{health:e=>Yh(e),quote:(e,t={})=>Sl(t,e)},relay:{health:e=>Xh(e),quote:(e,t={})=>la(t,e),prepare:(e,t={})=>Qh(t,e)},cowswap:{health:e=>n0(e),quote:(e,t={})=>Zn(t,e),prepareOrder:(e,t={})=>r0(t,e),order:(e,t={})=>i0(t,e),status:(e,t={})=>o0(t,e),chains:()=>a0()},oneinch:{health:e=>c0(e),quote:(e,t={})=>Cl(t,e),prepare:(e,t={})=>l0(t,e),approveSpender:(e,t={})=>Pl(t,e)},"hl-ws":{health:e=>k0(e),allMids:e=>E0(e),l2Book:(e,t={})=>I0(t.coin,e),snapshot:(e,t={})=>So(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>A0({...e,assetId:t.assetId}),book:(e,t={})=>_0(t.assetId||t.tokenId,e),snapshot:(e,t={})=>da(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>um(e),collection:(e,t={})=>Kr(t.slug,e),floor:(e,t={})=>dm(t.slug,e),bestListings:(e,t={})=>ac(t,e),bestListing:(e,t={})=>Ai(t,e),bestOffer:(e,t={})=>_i(t,e),accountNfts:(e,t={})=>Yr(t,e),accountPnl:(e,t={})=>Ei(t,e),prepareBuy:(e,t={})=>km(t,e),prepareSweep:(e,t={})=>Em(t,e),prepareMint:(e,t={})=>Ci(t,e),prepareList:(e,t={})=>Pi(t,e),prepareCancel:(e,t={})=>Im(t,e)},"local-marketplace":{health:()=>({provider:"local-marketplace",status:"ok",armed:!0,execution:"armed-local",existingMarketplacesUnchanged:!0,refusesSignHash:!0,signed:!1,broadcast:!1}),createListing:(e,t={})=>di(e).createListing(t),listListings:(e,t={})=>di(e).listListings(t),cancelListing:(e,t={})=>di(e).cancelListing(t),createOffer:(e,t={})=>di(e).createOffer(t),armFill:(e,t={})=>di(e).armFill(t)},"local-x402":{health:()=>({provider:"local-x402",status:"ok",armed:!0,execution:"armed-local",telegram:!1,refusesSignHash:!0,signed:!1,broadcast:!1}),createIntent:(e,t={})=>ks(e).createIntent(t),listIntents:(e,t={})=>ks(e).listIntents(t),cancelIntent:(e,t={})=>ks(e).cancelIntent(t),armPayment:(e,t={})=>ks(e).armPayment(t)},"local-pack-registry":{health:()=>({provider:"local-pack-registry",status:"ok",pluginExecution:!1,loaded:!1,telegram:!1,execution:"read-only"}),registerPack:(e,t={})=>sp(e).registerPack(t),listPacks:(e,t={})=>sp(e).listPacks(t),revokePack:(e,t={})=>sp(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>Tg(t,e),markets:(e,t={})=>rr(t,e),quoteSpecificBuy:(e,t={})=>Po(t,e),quoteSell:(e,t={})=>va(t,e),scanCollection:(e,t={})=>Sa(t,e),scanAllMarkets:(e,t={})=>xg(t,e),scanCrossVenueArb:(e,t={})=>Zl(t,e),scanAllMarketsArb:(e,t={})=>vg(t,e),prepareSpecificBuy:(e,t={})=>mg(t,e),prepareSell:(e,t={})=>fg(t,e)},stonkbrokers:{health:(e,t={})=>Cg(t,e),quoteBrokerBuy:(e,t={})=>ka(t,e),scanBrokerLoot:(e,t={})=>Eg(t,e),prepareBrokerBuy:(e,t={})=>Ig(t,e),brokerDesk:(e,t={})=>_g(t,e),clockInStatus:(e,t={})=>No(t,e),prepareClockIn:(e,t={})=>Ag(t,e)},"hl-outcome":{list:e=>Ny(e),prepareOrder:(e,t={})=>Oy(t,e),prepareCancel:(e,t={})=>Ry(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:qa().map(e=>e.id),nativeTemplates:Wo().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>qa(),listNative:()=>Wo(),gate:(e,t={})=>zo(t.templateId||t.id,e),prepareDeploy:(e,t={})=>ib(t,e),buildNative:(e,t={})=>Go(t),eval:async()=>(await Promise.resolve().then(()=>(kk(),Sk))).runContractsEval()},"poly-clob":{health:()=>Gy(),prepareOrder:(e,t={})=>Ky(t||{},e)},"hl-perps":{health:e=>fu(e),assetInfo:(e,t={})=>Ht(t,e),prepareOrder:(e,t={})=>Kn(t,e),prepareCancel:(e,t={})=>lo(t,e),prepareLeverage:(e,t={})=>Gc(t,e),prepareIsolatedMargin:(e,t={})=>Kc(t,e),prepareBracket:(e,t={})=>Yc(t,e),prepareBuilderApproval:(e,t={})=>Wc(t,e)},"hl-markets":{health:e=>fu(e),markets:(e,t={})=>Ca(t,e),leaderboards:(e,t={})=>iy(t,e),coin:(e,t={})=>ay(t,e),spot:(e,t={})=>sy(t,e)},"hl-entry-state":{health:e=>_y(e),see:(e,t={})=>Uo(t,e),qualify:(e,t={})=>Ty(t,e),lock:(e,t={})=>Cy(t,e),list:e=>yu(e),watch:(e,t={})=>Py(t,e)},"magiceden-sol":{health:e=>Vg(e),stats:(e,t={})=>au(t,e),listings:(e,t={})=>Gg(t,e),tokenListings:(e,t={})=>Kg(t,e),prepareBuy:(e,t={})=>Yg(t,e),prepareList:(e,t={})=>_a(t,e),prepareMint:(e,t={})=>Xg(t,e)},"hl-staking":{health:e=>Jg(e),validators:e=>lu(e),delegatorSummary:(e,t={})=>uu(t,e),delegations:(e,t={})=>du(t,e),rewards:(e,t={})=>Zg(t,e),history:(e,t={})=>ey(t,e),preflight:(e,t={})=>oy(t,e),prepareStakeDeposit:(e,t={})=>ty(t,e),prepareStakeWithdraw:(e,t={})=>ny(t,e),prepareDelegate:(e,t={})=>ry(t,e)},"hyperevm-dex":{health:e=>qg(e),search:(e,t={})=>Hg(t.q||t.query||"HYPE",e),token:(e,t={})=>jg(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>gb(e),networks:(e,t={})=>Tu(t,e),pool:(e,t={})=>mb(t,e),token:(e,t={})=>fb(t,e),ohlcv:(e,t={})=>hb(t,e)},curve:{health:e=>Cb(e),openapi:e=>Tb(e),pools:(e,t={})=>Pu(t,e),quote:(e,t={})=>Nu(t,e),prepare:(e,t={})=>Pb(t,e)},gmx:{health:e=>by(e),tickers:(e,t={})=>mr(t,e),markets:(e,t={})=>gy(t,e),marketsInfo:(e,t={})=>gu(t,e),tokens:(e,t={})=>yy(t,e),prepareOrder:(e,t={})=>Sy(t,e),positions:(e,t={})=>wy(t,e),orderStatus:(e,t={})=>xy(t,e),verifyOrder:(e,t={})=>vy(t,e)},morpho:{health:e=>Lb(e),markets:(e,t={})=>Rb(t,e),vaults:(e,t={})=>Lu(t,e),prepareVault:(e,t={})=>$b(t,e)},balancer:{health:e=>jb(e),pools:(e,t={})=>Hb(t,e),quote:(e,t={})=>Mu(t,e),prepare:(e,t={})=>zb(t,e)},pendle:{health:e=>Wb(e),markets:(e,t={})=>Uu(t,e),quote:(e,t={})=>Gb(t,e),prepare:(e,t={})=>Du(t,e)},odos:{health:e=>Qb(e),chains:e=>Hu(e),quote:(e,t={})=>Yb(t,e),prepare:(e,t={})=>Xb(t,e)},blockscout:{health:e=>iw(e),stats:(e,t={})=>Vu(t,e),address:(e,t={})=>tw(t,e),token:(e,t={})=>nw(t,e)},paraswap:{health:e=>qx(e),tokens:(e,t={})=>wd(t,e),price:(e,t={})=>Cr(t,e),quote:(e,t={})=>Cr(t,e),prepare:(e,t={})=>Dx(t,e)},rfq:{health:e=>tv(e),intent:(e,t={})=>Zx(t,e),quote:(e,t={})=>ev(t,e)},"polygon-staking":{health:e=>Cv(e),validators:(e,t={})=>_v(t,e),validatorDetail:(e,t={})=>Tv(t,e)},"aave-v3":{health:e=>Rv(e),markets:(e,t={})=>Pv(t,e),marketReserves:(e,t={})=>Nv(t,e),chains:e=>Ov(e)},"babylon-staking":{health:e=>$v(e),stats:e=>Bv(e),finalityProviders:e=>Mv(e),delegations:(e,t={})=>Fv(t,e)},"bisq-markets":{health:e=>Dv(e),markets:e=>qv(e),ticker:(e,t={})=>Hv(t,e),trades:(e,t={})=>jv(t,e)},"bob-rootstock":{health:(e,t={})=>Vv(t.chainId,e),stats:(e,t={})=>Ld(t,e),addressInfo:(e,t={})=>Wv(t,e),tokenBalances:(e,t={})=>Gv(t,e)},"braiins-insights":{health:e=>Kv(e),priceStats:e=>Yv(e),poolStats:e=>Xv(e)},"cow-protocol":{health:e=>oS(e),auction:e=>tS(e),openOrders:(e,t={})=>nS(t,e),recentTrades:(e,t={})=>rS(t,e)},"hiro-stacks":{health:e=>iS(e),networkInfo:e=>aS(e),stackingInfo:e=>sS(e),poxCycles:e=>cS(e),blocks:(e,t={})=>lS(t,e)},"jito-mev":{health:e=>pS(e),recentBundles:(e,t={})=>mS(t,e),tipFloor:e=>fS(e)},"kamino-strategies":{health:e=>gS(e),strategies:(e,t={})=>yS(t,e),strategyMetrics:(e,t={})=>bS(t,e)},"liquid-esplora":{health:e=>SS(e),tipHeight:e=>kS(e),addressInfo:(e,t={})=>ES(t,e),assetInfo:(e,t={})=>IS(t,e)},"magiceden-ordinals":{health:e=>TS(e),collectionStat:(e,t={})=>CS(t,e)},"mempool-lightning":{health:e=>NS(e),statistics:e=>OS(e),nodeRankings:(e,t={})=>RS(t,e),nodeCountries:e=>LS(e)},"mempool-mining":{health:e=>MS(e),difficulty:e=>FS(e),poolShare:(e,t={})=>US(t,e),hashrate:(e,t={})=>DS(t,e),rewardStats:(e,t={})=>qS(t,e)},"meteora-dlmm":{health:e=>zS(e),pools:(e,t={})=>VS(t,e),poolSearch:(e,t={})=>WS(t,e)},"ordinals-runes":{health:e=>KS(e),blockHeight:e=>YS(e),blockInfo:(e,t={})=>XS(t,e),satInfo:(e,t={})=>QS(t,e),runeInfo:(e,t={})=>JS(t,e)},"pyth-price-feeds":{health:e=>tk(e),latestPrice:(e,t={})=>nk(t,e),latestPrices:(e,t={})=>rk(t,e),feedDirectory:e=>ok(e)},"relayscan-mev":{health:e=>lk(e),overview:(e,t={})=>Qd(t,e),builderProfit:(e,t={})=>sk(t,e),dailyStats:(e,t={})=>ck(t,e)},"sanctum-lst":{health:e=>dk(e),lstList:e=>Zd(e),apyAll:e=>pk(e),apyIndividual:(e,t={})=>mk(t,e)},"solend-lending":{health:e=>yk(e),markets:e=>tp(e),reserves:(e,t={})=>bk(t,e)},"execution-strategies":{health:()=>xk(),plan:(e,t={})=>wk(t)},"across-bridge":{health:e=>nv(e),pools:(e,t={})=>rv(t,e),suggestedFees:(e,t={})=>ov(t,e)},"beefy-yields":{health:e=>iv(e),apy:(e,t={})=>av(t,e),apyBreakdown:e=>sv(e)},"birdeye-tokens":{health:e=>lv(e),tokenList:(e,t={})=>uv(t,e)},"celestia-da":{health:e=>dv(e),stats:e=>pv(e),blockStats:(e,t={})=>mv(t,e)},"das-assets":{health:e=>fv(e),assetsByOwner:(e,t={})=>hv(t,e),searchAssets:(e,t={})=>gv(t,e),assetProof:(e,t={})=>yv(t,e)},"l2beat-tvl":{health:e=>bv(e),tvl:(e,t={})=>wv(t,e),activity:(e,t={})=>xv(t,e)},"spark-lend":{health:e=>vv(e),markets:(e,t={})=>Sv(t,e)},"symbiotic-restaking":{health:e=>kv(e),vaults:(e,t={})=>Ev(t,e),vaultDetail:(e,t={})=>Iv(t,e)}},Ik=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),_k=new Set(["hl-exec"]);function TB(e){return _k.has(String(e||""))}function CB(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(_k.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=Ri().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!Ik.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(Ik.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let a=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(a))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${a||"<missing>"}`)}}async function A(e,t,n={},r={}){if(TB(e))throw new Error(`${e} is an execution provider: it signs and submits with a real key. dataCall() is the public read plane and will not route to it.`);CB(e,t,n);let o=gc(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=_B[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function PB({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||Ri().map(d=>d.id);!o&&!e&&(s=s.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof a=="function"?a:(d,p,f)=>A(d,"health",p,f),u={};return await Me(s,i??8,async d=>{if(!gc(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},f=await xe(()=>l(d,p,c));if(!f.ok){u[d]={ok:!1,ms:f.ms,reason:"transport",error:f.error};return}let m=f.data;if(m&&typeof m=="object"&&m.ok===!1){u[d]={ok:!1,ms:f.ms,reason:"provider",error:m.error||m.message||"provider reported unhealthy",detail:m};return}u[d]={ok:!0,ms:f.ms,detail:m}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:u}}function Tk(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function NB(e){return e.execution==="prepare"&&Tk(e).length?"armed-local":e.execution||"read-only"}function OB(){return Ri().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:NB(e),localSignerSurfaces:Tk(e),description:e.description}))}var RD={catalog:OB,health:PB,call:A,hl:{health:e=>A("hl-info","health",{},e),allMids:e=>A("hl-info","allMids",{},e),l2Book:(e,t)=>A("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>A("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>A("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>A("hl-info","userFills",{user:e},t),meta:e=>A("hl-info","meta",{},e),metaAndAssetCtxs:e=>A("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>A("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>A("hl-info","openOrders",{user:e},t),userState:(e,t)=>A("hl-info","userState",{user:e},t),spotMeta:e=>A("hl-info","spotMeta",{},e),vaults:{health:e=>A("hl-vaults","health",{},e),summaries:(e,t)=>A("hl-vaults","summaries",e||{},t),details:(e,t)=>A("hl-vaults","details",e||{},t),mine:(e,t)=>A("hl-vaults","userEquities",{user:e},t),track:(e,t)=>A("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>A("hl-entry-state","see",e||{},t),qualify:(e,t)=>A("hl-entry-state","qualify",e||{},t),lock:(e,t)=>A("hl-entry-state","lock",e||{},t),list:e=>A("hl-entry-state","list",{},e),watch:(e,t)=>A("hl-entry-state","watch",e||{},t)},staking:{health:e=>A("hl-staking","health",{},e),validators:e=>A("hl-staking","validators",{},e),summary:(e,t)=>A("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>A("hl-staking","delegations",{user:e},t),rewards:(e,t)=>A("hl-staking","rewards",{user:e},t),history:(e,t)=>A("hl-staking","history",{user:e},t),preflight:(e,t)=>A("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>A("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>A("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>A("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>A("poly-public","health",{},e),time:e=>A("poly-public","time",{},e),markets:(e,t)=>A("poly-public","markets",e||{},t),book:(e,t)=>A("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>A("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>A("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>A("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>A("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>A("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>A("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>A("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>A("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>A("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>A("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>A("evm-token-sniper","health",{},e),scan:(e,t)=>A("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>A("portfolio","balances",e||{},t),snapshot:(e,t)=>A("portfolio","snapshot",e||{},t),history:(e,t)=>A("portfolio","history",e||{},t),valueGraph:(e,t)=>A("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>A("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>A("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>A("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>A("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>A("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>A("opensea-nft","floor",{slug:e},t),collection:(e,t)=>A("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>A("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>A("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>A("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>A("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>A("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>A("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>A("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>A("universal-mint-router","health",{},e),capabilities:e=>A("universal-mint-router","capabilities",{},e),prepare:(e,t)=>A("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>A("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>A("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>A("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>A("solana-rpc","health",{},e),latestBlockhash:(e,t)=>A("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>A("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>A("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>A("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>A("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>A("jupiter","prepare",e||{},t),nftStats:(e,t)=>A("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>A("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>A("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>A("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>A("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>A("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>A("bitcoin-esplora","health",{},e),tipHeight:e=>A("bitcoin-esplora","tipHeight",{},e),fees:e=>A("bitcoin-esplora","fees",{},e),address:(e,t)=>A("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>A("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>A("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>A("bitcoin-esplora","decode",e||{},t),metaHealth:e=>A("bitcoin-meta","health",{},e),runeBalances:(e,t)=>A("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>A("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>A("satflow","health",{},e),satflowFloors:(e,t)=>A("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>A("satflow","walletContents",{address:e},t)},prices:{health:e=>A("defillama","health",{},e),current:(e,t)=>A("defillama","prices",{coins:e},t),bySymbol:(e,t)=>A("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>A("defillama","protocols",{},e)},lifi:{health:e=>A("lifi","health",{},e),quote:(e,t)=>A("lifi","quote",e||{},t),chains:e=>A("lifi","chains",{},e)},dex:{health:e=>A("dexscreener","health",{},e),token:(e,t)=>A("dexscreener","token",{address:e},t),search:(e,t)=>A("dexscreener","search",{q:e},t),pair:(e,t,n)=>A("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>A("uniswap-v3","health",e||{},t),quote:(e,t)=>A("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>A("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>A("uniswap-v3","ethUsdc",e||{},t),chains:e=>A("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>A("uniswap-v4","health",e||{},t),quote:(e,t)=>A("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>A("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>A("uniswap-v4","prepare",e||{},t),chains:e=>A("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>A("x402","inspect",e||{},t),prepare:(e,t)=>A("x402","prepare",e||{},t)},bankr:{wallet:e=>A("bankr","wallet",{},e),portfolio:e=>A("bankr","portfolio",{},e),swapQuote:(e,t)=>A("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>A("across","suggestedFees",e||{},t),hop:(e,t)=>A("hop","quote",e||{},t),relay:(e,t)=>A("relay","quote",e||{},t)},cow:{quote:(e,t)=>A("cowswap","quote",e||{},t)},hlWs:{allMids:e=>A("hl-ws","allMids",{},e),l2Book:(e,t)=>A("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>A("poly-ws","book",{assetId:e},t)}};export{_k as EXECUTION_PROVIDERS,CB as assertDataOpAllowed,RD as data,A as dataCall,OB as dataCatalog,PB as dataHealth,TB as isExecutionProvider,AB as routeUniversalNftLifecycle,Ek as universalNftLifecycleCapabilities};
|
|
191
|
+
}`;function XL(e={}){let t=e.chainIds??(e.chainId!=null?[e.chainId]:null),n=(Array.isArray(t)?t:[t??1]).map(Number).filter(r=>Number.isInteger(r)&&r>0);if(!n.length)throw new Error("aave-v3: chainIds must contain at least one chain id");return[...new Set(n)]}async function Nv(e={},t={}){let n={chainIds:XL(e)};return e.user&&(n.user=String(e.user)),{markets:(await hs(GL,{request:n},t))?.data?.markets??[]}}async function Ov(e={},t={}){let n=String(e.address||e.market||e.marketAddress||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("aave-v3: marketReserves requires an EVM market (pool) address");let r=Number(e.chainId??1);if(!Number.isInteger(r)||r<=0)throw new Error("aave-v3: chainId must be a positive integer");let o={address:n,chainId:r};e.user&&(o.user=String(e.user));let a=(await hs(KL,{request:o},t))?.data?.market??null;if(!a)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:a}}async function Rv(e={},t={}){let n=new Set(["MAINNET_ONLY","TESTNET_ONLY","ALL"]),r=String(e.filter||"MAINNET_ONLY").toUpperCase();if(!n.has(r))throw new Error(`aave-v3: filter must be one of ${[...n].join(", ")}`);return{chains:(await hs(YL,{filter:r},t))?.data?.chains??[]}}async function Lv(e={}){return{ok:(await hs("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}$();var JL="https://staking-api.babylonlabs.io";function Od(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||JL).replace(/\/$/,"")}function gs(e,t={}){return E(`${Od(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function $v(e,t="pkHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n))throw new Error(`babylon-staking: ${t} must be hex`);if(n.length===66&&(n.startsWith("02")||n.startsWith("03")))return n.slice(2);if(n.length!==64)throw new Error(`babylon-staking: ${t} must be a 64-char x-only (or 66-char compressed) BTC public key`);return n}async function Bv(e={}){try{let n=(await gs("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Od(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Od(e),error:String(t?.message||t),exec:!1}}}async function Mv(e={},t={}){let r=(await gs("/v2/stats",t))?.data||{};return{provider:"babylon-staking",activeTvlSats:String(r.active_tvl??""),totalActiveTvlSats:String(r.total_active_tvl??""),activeDelegations:r.active_delegations??null,totalActiveDelegations:r.total_active_delegations??null,activeFinalityProviders:r.active_finality_providers??null,totalFinalityProviders:r.total_finality_providers??null,btcStakingApr:r.btc_staking_apr??null,btcStakingAprPct:r.btc_staking_apr==null?null:Number(r.btc_staking_apr)*100,maxStakingApr:r.max_staking_apr??null,maxStakingAprPct:r.max_staking_apr==null?null:Number(r.max_staking_apr)*100,raw:r}}async function Fv(e={},t={}){let n=await gs("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(a=>String(a.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=$v(e.btcPk,"btcPk");r=r.filter(a=>String(a.btc_pk||"").toLowerCase()===i)}let o=Math.min(500,Math.max(1,Number(e.limit||r.length||1)));return{provider:"babylon-staking",count:r.length,finalityProviders:r.slice(0,o).map(i=>({btcPk:i.btc_pk??null,moniker:i.description?.moniker??null,website:i.description?.website??null,state:i.state??null,commission:i.commission??null,activeTvlSats:i.active_tvl==null?null:String(i.active_tvl),activeDelegations:i.active_delegations??null}))}}async function Uv(e={},t={}){let n=$v(e.stakerPkHex||e.stakerPk||e.pkHex||e.pk,"stakerPkHex"),r=new URLSearchParams({staker_pk_hex:n});e.paginationKey&&r.set("pagination_key",String(e.paginationKey));let o=await gs(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}$();var e$="https://markets.bisq.network";function Rd(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||e$).replace(/\/$/,"")}function Dv(e,t="market"){let n=String(e||"").trim().toLowerCase().replace(/[/\-\s]/g,"_");if(!/^[a-z0-9]{2,12}_[a-z0-9]{2,12}$/.test(n))throw new Error(`bisq-markets: ${t} must look like btc_usd (got "${e}")`);return n}function ys(e,t={}){return E(`${Rd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function qv(e={}){try{let t=await ys("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Rd(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Rd(e),error:String(t?.message||t),exec:!1}}}async function Hv(e={},t={}){let n=await ys("/api/markets",t),r=Object.values(n&&typeof n=="object"?n:{});if(e.base){let o=String(e.base).trim().toLowerCase();r=r.filter(i=>String(i.lsymbol||"").toLowerCase()===o)}if(e.quote){let o=String(e.quote).trim().toLowerCase();r=r.filter(i=>String(i.rsymbol||"").toLowerCase()===o)}return{provider:"bisq-markets",count:r.length,markets:r.map(o=>({pair:o.pair??null,name:o.name??null,base:o.lsymbol??null,baseName:o.lname??null,quote:o.rsymbol??null,quoteName:o.rname??null,baseType:o.ltype??null,quoteType:o.rtype??null}))}}async function jv(e={},t={}){let n=Dv(e.market||e.pair||"btc_usd","market"),r=await ys(`/api/ticker?market=${encodeURIComponent(n)}`,t),o=Array.isArray(r)?r[0]||{}:r||{};return{provider:"bisq-markets",market:n,last:o.last==null?null:Number(o.last),high:o.high==null?null:Number(o.high),low:o.low==null?null:Number(o.low),bid:o.buy==null?null:Number(o.buy),ask:o.sell==null?null:Number(o.sell),volumeBase:o.volume_left==null?null:Number(o.volume_left),volumeQuote:o.volume_right==null?null:Number(o.volume_right),note:"Bisq is thin, non-KYC P2P \u2014 treat as a basis signal against centralized spot, not a reference rate",raw:o}}async function zv(e={},t={}){let n=Dv(e.market||e.pair||"btc_usd","market"),r=Math.min(2e3,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({market:n,limit:String(r)});e.timestampFrom&&o.set("timestamp_from",String(e.timestampFrom)),e.timestampTo&&o.set("timestamp_to",String(e.timestampTo));let i=await ys(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}$();var Lt=Object.freeze({60808:{name:"bob",label:"BOB (Build on Bitcoin)",url:"https://explorer.gobob.xyz",nativeSymbol:"ETH"},30:{name:"rootstock",label:"Rootstock (RSK)",url:"https://rootstock.blockscout.com",nativeSymbol:"RBTC"}}),n$=new Map([["bob",60808],["rootstock",30],["rsk",30]]),r$=60808;function si(e){if(e==null||e==="")return r$;let t=n$.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Lt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Lt).join(", ")} / bob, rootstock)`);return n}function Ld(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=si(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Lt[n].url).replace(/\/$/,"")}function Vv(e,t="address"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`bob-rootstock: ${t} must be a 0x EVM address`);return n}function bs(e,t,n={}){return E(`${Ld(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Wv(e={},t={}){let n;try{n=si(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Lt[n];try{let o=await bs(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Ld(n,e),totalBlocks:o?.total_blocks??null,averageBlockTimeMs:o?.average_block_time??null,exec:!1}}catch(o){return{ok:!1,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Ld(n,e),error:String(o?.message||o),exec:!1}}}async function $d(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Lt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await $d({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Lt[c].name,error:String(l?.message||l)}}}))}}let r=si(n),o=Lt[r],i=await bs(r,"/api/v2/stats",t);return{provider:"bob-rootstock",chainId:r,chain:o.name,label:o.label,nativeSymbol:o.nativeSymbol,averageBlockTimeMs:i.average_block_time??null,averageBlockTimeSec:i.average_block_time==null?null:Number(i.average_block_time)/1e3,gasPrices:i.gas_prices??null,gasPriceUpdatedAt:i.gas_price_updated_at??null,gasUsedToday:i.gas_used_today??null,coinPrice:i.coin_price??null,coinPriceChangePct:i.coin_price_change_percentage??null,marketCap:i.market_cap??null,tvl:i.tvl??null,totalBlocks:i.total_blocks??null,totalAddresses:i.total_addresses??null,totalTransactions:i.total_transactions??null,transactionsToday:i.transactions_today??null,networkUtilizationPct:i.network_utilization_percentage??null,raw:i}}async function Gv(e={},t={}){let n=si(e.chainId??e.chain),r=Vv(e.address||e.addr,"address"),o=Lt[n],i=await bs(n,`/api/v2/addresses/${encodeURIComponent(r)}`,t);return{provider:"bob-rootstock",chainId:n,chain:o.name,address:r,nativeSymbol:o.nativeSymbol,coinBalanceWei:i.coin_balance==null?null:String(i.coin_balance),coinBalance:i.coin_balance==null?null:Number(i.coin_balance)/1e18,isContract:i.is_contract??null,isVerified:i.is_verified??null,name:i.name??null,blockNumberBalanceUpdatedAt:i.block_number_balance_updated_at??null,raw:i}}async function Kv(e={},t={}){let n=si(e.chainId??e.chain),r=Vv(e.address||e.addr,"address"),o=await bs(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],a=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:Lt[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}$();var i$="https://insights.braiins.com/api/v1.0";function Bd(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||i$).replace(/\/$/,"")}function Md(e,t={}){return E(`${Bd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Yv(e={}){try{let t=await Md("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Bd(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Bd(e),error:String(t?.message||t),exec:!1}}}async function Xv(e={},t={}){let n=await Md("/price-stats",t);return{provider:"braiins-insights",btcUsd:n?.price==null?null:Number(n.price),percentChange24h:n?.percent_change_24h??null,timestamp:n?.timestamp??null,raw:n}}async function Qv(e={},t={}){let n=await Md("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:a.length,pools:a.slice(0,s).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:a.slice(0,s)}}$();var s$="https://api.cow.fi",Jv=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function Zv(e={}){return(e.baseUrl||process.env.COW_API_URL||s$).replace(/\/$/,"")}function c$(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=Jv[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(Jv).join(", ")})`);return n}function Fd(e,t,n){return`${Zv(n)}/${c$(e)}/api/v1${t}`}function eS(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`cow-protocol: ${t} must be an EVM address`);return n}function tS(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function nS(e={},t={}){return E(Fd(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function rS(e={},t={}){let n=eS(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(tS(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await E(`${Fd(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],a=e.openOnly===!1?i:i.filter(s=>String(s?.status||"").toLowerCase()==="open");return{owner:n,count:a.length,total:i.length,orders:a}}async function oS(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",eS(e.owner||e.address||e.user,"owner"));let r=await E(`${Fd(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,tS(e))}}async function iS(e={}){let t=await E(`${Zv(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}$();var u$="https://api.hiro.so",d$=20;function Ud(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||u$).replace(/\/$/,"")}function p$(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function ci(e,t={}){return E(`${Ud(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:p$(t)})}async function aS(e={}){try{let t=await ci("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Ud(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:d$,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Ud(e),error:String(t?.message||t),exec:!1}}}async function sS(e={},t={}){let n=await ci("/v2/info",t);return{provider:"hiro-stacks",peerVersion:n.peer_version??null,serverVersion:n.server_version??null,networkId:n.network_id??null,burnBlockHeight:n.burn_block_height??null,stableBurnBlockHeight:n.stable_burn_block_height??null,stacksTipHeight:n.stacks_tip_height??null,stacksTip:n.stacks_tip??null,poxConsensus:n.pox_consensus??null,raw:n}}async function cS(e={},t={}){let n=await ci("/v2/pox",t),r=Number(n.total_liquid_supply_ustx||0),o=Number(n.current_cycle?.stacked_ustx||0);return{provider:"hiro-stacks",contractId:n.contract_id??null,currentCycleId:n.current_cycle?.id??null,currentCycleStackedUstx:n.current_cycle?.stacked_ustx==null?null:String(n.current_cycle.stacked_ustx),currentCycleIsPoX:n.current_cycle?.is_pox_active??null,nextCycleId:n.next_cycle?.id??null,nextCycleStackedUstx:n.next_cycle?.stacked_ustx==null?null:String(n.next_cycle.stacked_ustx),nextCycleMinThresholdUstx:n.next_cycle?.min_threshold_ustx==null?null:String(n.next_cycle.min_threshold_ustx),blocksUntilNextCycle:n.next_cycle?.blocks_until_prepare_phase??null,minAmountUstx:n.min_amount_ustx==null?null:String(n.min_amount_ustx),totalLiquidSupplyUstx:n.total_liquid_supply_ustx==null?null:String(n.total_liquid_supply_ustx),participationPct:r>0?o/r*100:null,rewardCycleLength:n.reward_cycle_length??null,rewardSlots:n.reward_slots??null,currentBurnchainBlockHeight:n.current_burnchain_block_height??null,raw:n}}async function lS(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await ci(`/extended/v2/pox/cycles?limit=${n}&offset=${r}`,t),i=Array.isArray(o?.results)?o.results:[];return{provider:"hiro-stacks",total:o?.total??null,limit:n,offset:r,cycles:i.map(a=>({cycleNumber:a.cycle_number??null,blockHeight:a.block_height??null,totalStackedAmount:a.total_stacked_amount==null?null:String(a.total_stacked_amount),totalWeight:a.total_weight??null,totalSigners:a.total_signers??null}))}}async function uS(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await ci(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}$();var f$="https://bundles.jito.wtf",pS=1e9;function Dd(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||f$).replace(/\/$/,"")}function h$(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function dS(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*pS):null}function g$(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/pS:null,raw:e}}async function mS(e={}){try{let t=await E(`${Dd(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function fS(e={},t={}){let n=h$(e.limit,5,100),r=new URL(`${Dd(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await E(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(g$),s=a.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:a.length,totalTipLamports:s.reduce((c,l)=>c+l,0),maxTipLamports:s.length?Math.max(...s):null,bundles:a}}async function hS(e={}){let t=await E(`${Dd(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,dS(i)])),suggestedTipLamports:dS(r.p75||r.p50),raw:n}}$();var b$="https://api.kamino.finance";function w$(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||b$).replace(/\/$/,"")}function Ye(e){let t=Number(e);return Number.isFinite(t)?t:null}function gS(e={}){let t=Ye(e.totalValueLocked)??0,n=Ye(e.apy?.totalApy)??0,r=Ye(e.kaminoApy?.totalApy)??0;return{strategy:e.strategy||null,pair:e.tokenA&&e.tokenB?`${e.tokenA}-${e.tokenB}`:null,tokenA:e.tokenA||null,tokenB:e.tokenB||null,tokenAMint:e.tokenAMint||null,tokenBMint:e.tokenBMint||null,tvlUsd:t,sharePrice:Ye(e.sharePrice),sharesIssued:Ye(e.sharesIssued),profitAndLoss:Ye(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:Ye(e.apy?.vault?.totalApr),apy24h:Ye(e.kaminoApy?.vault?.apy24h),apy7d:Ye(e.kaminoApy?.vault?.apy7d),apy30d:Ye(e.kaminoApy?.vault?.apy30d),poolPrice:Ye(e.apy?.vault?.poolPrice),priceLower:Ye(e.apy?.vault?.priceLower),priceUpper:Ye(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function qd(e={},t={}){let n=new URL(`${w$(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function yS(e={}){try{let t=await qd({},e),n=t.filter(r=>(Number(r.totalValueLocked)||0)>0).length;return{ok:t.length>0,provider:"kamino-strategies",strategies:t.length,funded:n,exec:!1}}catch(t){return{ok:!1,provider:"kamino-strategies",error:String(t?.message||t),exec:!1}}}async function bS(e={},t={}){let r=(await qd(e,t)).map(gS),o=r.length,i=Number.isFinite(Number(e.minTvlUsd))?Number(e.minTvlUsd):1e4;if(r=r.filter(l=>l.tvlUsd>=i),e.token){let l=String(e.token).toLowerCase();r=r.filter(u=>String(u.tokenA||"").toLowerCase()===l||String(u.tokenB||"").toLowerCase()===l||u.tokenAMint===e.token||u.tokenBMint===e.token)}if(e.pair){let l=String(e.pair).toLowerCase().replace(/[/_]/g,"-");r=r.filter(u=>String(u.pair||"").toLowerCase()===l)}e.inRangeOnly===!0&&(r=r.filter(l=>!l.outOfRange));let a=String(e.sortBy||"apy");r.sort((l,u)=>a==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let s=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,s);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",env:e.env||"mainnet-beta",status:e.status||"LIVE",totalStrategies:o,matched:r.length,count:c.length,minTvlUsd:i,tvlUsdMatched:r.reduce((l,u)=>l+u.tvlUsd,0),strategies:c}}async function wS(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await qd({...e,status:e.status||"ALL"},t)).find(i=>i.strategy===n);if(!o)throw new Error(`kamino-strategies: strategy ${n} not found`);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",...gS(o),raw:o}}$();var v$="https://blockstream.info/liquid/api",xS="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function ws(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||v$).replace(/\/$/,"")}function S$(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function k$(e,t="assetId"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`liquid-esplora: ${t} must be 64-char hex`);return n}async function vS(e,t={}){let n=`${ws(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}function SS(e,t={}){return E(`${ws(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function kS(e={}){try{let t=await vS("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:ws(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:ws(e),error:String(t?.message||t),exec:!1}}}async function ES(e={},t={}){let n=await vS("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function IS(e={},t={}){let n=S$(e.address||e.addr,"address"),r=await SS(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=o.funded_txo_sum!=null,s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:a?String(s-c):null,confidential:!a,note:a?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function AS(e={},t={}){let n=k$(e.assetId||e.asset||xS,"assetId"),r=await SS(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===xS,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}$();var I$="https://api-mainnet.magiceden.dev/v2/ord/btc",A$=600;function Hd(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||I$).replace(/\/$/,"")}function _$(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function _S(e,t="collectionSymbol"){let n=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(n))throw new Error(`magiceden-ordinals: ${t} must be a slug like "nodemonkes"`);return n}function TS(e,t={}){return E(`${Hd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:_$(t),retries:t.retries??1})}async function PS(e={}){let t=_S(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await TS(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Hd(e),probeCollection:t,rateLimitRpm:A$,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Hd(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function CS(e={},t={}){let n=_S(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await TS(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}$();var P$="https://mempool.space/api",C$=7;function jd(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||P$).replace(/\/$/,"")}function xs(e,t={}){return E(`${jd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function NS(e){if(!e)return{ageDays:null,stale:null};let t=new Date(e).getTime();if(!Number.isFinite(t))return{ageDays:null,stale:null};let n=(Date.now()-t)/864e5;return{ageDays:Math.round(n*10)/10,stale:n>C$}}async function OS(e={}){try{let n=(await xs("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=NS(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:jd(e),snapshotAt:n.added??null,ageDays:r,stale:o,nodeCount:n.node_count??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-lightning",baseUrl:jd(e),error:String(t?.message||t),exec:!1}}}async function RS(e={},t={}){let r=(await xs("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=NS(r.added);return{provider:"mempool-lightning",snapshotAt:r.added??null,ageDays:o,stale:i,staleNote:i?`mempool.space Lightning snapshot is ${o} days old \u2014 trend only, not live state`:void 0,nodeCount:r.node_count??null,channelCount:r.channel_count??null,totalCapacitySats:r.total_capacity==null?null:String(r.total_capacity),totalCapacityBtc:r.total_capacity==null?null:Number(r.total_capacity)/1e8,avgCapacitySats:r.avg_capacity==null?null:String(r.avg_capacity),avgFeeRatePpm:r.avg_fee_rate??null,avgBaseFeeMsat:r.avg_base_fee_mtokens??null,torNodes:r.tor_nodes??null,clearnetNodes:r.clearnet_nodes??null,unannouncedNodes:r.unannounced_nodes??null,raw:r}}async function LS(e={},t={}){let n=String(e.metric||e.ranking||"connectivity").trim().toLowerCase(),r=new Set(["connectivity","liquidity","channels"]);if(!r.has(n))throw new Error(`mempool-lightning: metric must be one of ${[...r].join(", ")}`);let o=await xs(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],a=Math.min(100,Math.max(1,Number(e.limit||i.length||1)));return{provider:"mempool-lightning",metric:n,count:i.length,nodes:i.slice(0,a).map(s=>({publicKey:s.publicKey??null,alias:s.alias??null,channels:s.channels??null,capacitySats:s.capacity==null?null:String(s.capacity),firstSeen:s.firstSeen??null,updatedAt:s.updatedAt??null,city:s.city?.en??s.city??null,country:s.country?.en??s.country??null,iso:s.iso_code??null}))}}async function $S(e={},t={}){let n=await xs("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}$();var O$="https://mempool.space/api",BS=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function zd(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||O$).replace(/\/$/,"")}function MS(e,t){let n=String(e||t).trim().toLowerCase();if(!BS.has(n))throw new Error(`mempool-mining: window must be one of ${[...BS].join(", ")}`);return n}function li(e,t={}){return E(`${zd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function FS(e={}){try{let t=await li("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:zd(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:zd(e),error:String(t?.message||t),exec:!1}}}async function US(e={},t={}){let n=await li("/v1/difficulty-adjustment",t);return{provider:"mempool-mining",progressPercent:n.progressPercent??null,difficultyChangePct:n.difficultyChange??null,estimatedRetargetDate:n.estimatedRetargetDate??null,remainingBlocks:n.remainingBlocks??null,remainingTimeMs:n.remainingTime??null,previousRetargetPct:n.previousRetarget??null,nextRetargetHeight:n.nextRetargetHeight??null,timeAvgMs:n.timeAvg??null,raw:n}}async function DS(e={},t={}){let n=MS(e.window||e.timeframe,"1w"),r=await li(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),a=l=>i>0?Number(l.blockCount||0)/i*100:null,s=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||s.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:s[0]?a(s[0]):null,top3SharePct:s.slice(0,3).reduce((l,u)=>l+(a(u)||0),0)||null,pools:s.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:a(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function qS(e={},t={}){let n=MS(e.window||e.timeframe,"3d"),r=await li(`/v1/mining/hashrate/${n}`,t),o=Array.isArray(r?.hashrates)?r.hashrates:[];return{provider:"mempool-mining",window:n,currentHashrate:r?.currentHashrate??null,currentHashrateEhs:r?.currentHashrate==null?null:Number(r.currentHashrate)/1e18,currentDifficulty:r?.currentDifficulty??null,points:o.length,hashrates:o,difficulty:Array.isArray(r?.difficulty)?r.difficulty:[]}}async function HS(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await li(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}$();var L$="https://amm-v2.meteora.ag",jS=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),zS=new Set(["dynamic","multitoken","lst","farms"]),$$=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function B$(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||L$).replace(/\/$/,"")}function Be(e){let t=Number(e);return Number.isFinite(t)?t:null}function M$(e={}){return{address:e.pool_address||null,name:e.pool_name||null,type:e.pool_type||null,version:e.pool_version??null,mints:e.pool_token_mints||[],tokenAmounts:e.pool_token_amounts||[],tokenUsdAmounts:e.pool_token_usd_amounts||[],lpMint:e.lp_mint||null,lpDecimals:e.lp_decimal??null,lpPriceUsd:Be(e.pool_lp_price_in_usd),tvlUsd:Be(e.pool_tvl),farmTvlUsd:Be(e.farm_tvl),volume24hUsd:Be(e.trading_volume),volume7dUsd:Be(e.weekly_trading_volume),fee24hUsd:Be(e.fee_volume),fee7dUsd:Be(e.weekly_fee_volume),tradeApyPct:Be(e.trade_apy),weeklyTradeApyPct:Be(e.weekly_trade_apy),baseApyPct:Be(e.daily_base_apy),farmingApyPct:Be(e.farming_apy),totalApyPct:(Be(e.trade_apy)??0)+(Be(e.farming_apy)??0),aprPct:Be(e.apr),feePct:Be(e.total_fee_pct),farmingPool:e.farming_pool||null,isLst:!!e.is_lst,isMeme:!!e.is_meme,permissioned:!!e.permissioned,unknownTokens:!!e.unknown,createdAt:e.created_at??null}}function F$(e={},t={}){let n=new URL(`${B$(t)}/pools/search`),r=Math.max(0,Number(e.page)||0),o=Math.max(1,Math.min(Number(e.size??e.limit)||20,100));if(n.searchParams.set("page",String(r)),n.searchParams.set("size",String(o)),e.sortKey!=null){let s=String(e.sortKey);if(!jS.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...jS].join(", ")}`);n.searchParams.set("sort_key",s),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let s=String(e.poolType);if(!zS.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...zS].join(", ")}`);n.searchParams.set("pool_type",s)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let a=e.mints||e.includeTokenMints;if(a){let s=(Array.isArray(a)?a:[a]).map(c=>String(c).trim());for(let c of s)if(!$$.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",s.join(","))}return{url:n,page:r,size:o}}async function Vd(e={},t={}){let{url:n,page:r,size:o}=F$(e,t),i=await E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(M$),totalCount:i?.total_count??null,page:r,size:o}}async function VS(e={}){try{let{pools:t,totalCount:n}=await Vd({size:3},e);return{ok:t.length>0,provider:"meteora-dlmm",poolsIndexed:n,sample:t.length,exec:!1}}catch(t){return{ok:!1,provider:"meteora-dlmm",error:String(t?.message||t),exec:!1}}}async function WS(e={},t={}){let n=await Vd({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,a)=>i+(a.tvlUsd??0),0),pools:r}}async function GS(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await Vd({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}$();var D$="https://ordinals.com";function vs(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||D$).replace(/\/$/,"")}function q$(e,t="name"){let n=String(e||"").trim().toUpperCase().replace(/[•.\s_-]/g,"");if(!/^[A-Z]{1,28}$/.test(n))throw new Error(`ordinals-runes: ${t} must be 1-28 letters (spacers are stripped automatically)`);return n}async function KS(e,t={}){let n=`${vs(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Wd(e,t={}){return E(`${vs(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function YS(e={}){try{let t=await KS("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:vs(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:vs(e),error:String(t?.message||t),exec:!1}}}async function XS(e={},t={}){let n=await KS("/r/blockheight",t),r=Number(n);if(!Number.isFinite(r))throw new Error(`ordinals-runes: unexpected blockheight response ${n.slice(0,60)}`);return{provider:"ordinals-runes",blockHeight:r}}async function QS(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Wd(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function JS(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,a=await Wd(i,t),s=Array.isArray(a?.ids)?a.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:s.length,inscriptionIds:s,more:!!a?.more,raw:a}}async function ZS(e={},t={}){let n=q$(e.name||e.rune||e.runeName,"name"),r=await Wd(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}$();var j$="https://hermes.pyth.network",Kd={"SOL/USD":"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d","BTC/USD":"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43","ETH/USD":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","USDC/USD":"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a","USDT/USD":"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b","JUP/USD":"0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996","JTO/USD":"b43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2","BONK/USD":"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419","PYTH/USD":"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff","HYPE/USD":"4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b"},z$=/^[0-9a-fA-F]{64}$/;function ek(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||j$).replace(/\/$/,"")}function tk(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Kd[n.toUpperCase()]||Kd[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!z$.test(o))throw new Error(`pyth-price-feeds: ${t} must be a 32-byte hex feed id or a known symbol`);return o.toLowerCase()}function Gd(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Yd(e={}){let t=Gd({price:Number(e.price?.conf),expo:e.price?.expo}),n=Gd(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Gd(e.ema_price),publishTime:e.price?.publish_time??null,publishTimeIso:e.price?.publish_time?new Date(e.price.publish_time*1e3).toISOString():null,ageSeconds:e.price?.publish_time?Math.max(0,Math.round(Date.now()/1e3-e.price.publish_time)):null,expo:e.price?.expo??null,raw:{price:e.price??null,emaPrice:e.ema_price??null,metadata:e.metadata??null}}}async function Xd(e,t={}){let n=new URL(`${ek(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function nk(e={}){try{let t=await Xd([Kd["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Yd):[])[0]||null;return{ok:!!(r&&Number.isFinite(r.price)&&r.price>0),provider:"pyth-price-feeds",solUsd:r?.price??null,ageSeconds:r?.ageSeconds??null,exec:!1}}catch(t){return{ok:!1,provider:"pyth-price-feeds",error:String(t?.message||t),exec:!1}}}async function rk(e={},t={}){let n=tk(e.feedId||e.id||e.symbol,"feedId"),r=await Xd([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Yd):[],i=o.find(a=>String(a.id).toLowerCase()===n)||o[0]||null;if(!i)throw new Error(`pyth-price-feeds: no price returned for feed ${n}`);return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",feedId:n,...i,binaryUpdate:r?.binary?.data?.[0]||null,binaryEncoding:r?.binary?.encoding||null}}async function ok(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>tk(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let a=[];for(let l of i)a.push(await Xd(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Yd):[]),c=Object.fromEntries(s.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:s.length,missing:r.filter(l=>!c[l]),prices:s,byId:c}}async function ik(e={},t={}){let n=new URL(`${ek(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}$();var W$="https://relayscan.io",ak=new Set(["1h","12h","24h","7d"]);function Qd(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||W$).replace(/\/$/,"")}function sk(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!ak.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...ak].join(", ")}`);return t}function G$(e={}){let t=e.date||e.day;if(t==null)return new Date(Date.now()-864e5).toISOString().slice(0,10);let n=String(t).trim();if(!/^\d{4}-\d{2}-\d{2}$/.test(n))throw new Error("relayscan-mev: date must be YYYY-MM-DD");return n}async function Jd(e={},t={}){return E(`${Qd(t)}/overview/json?t=${sk(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function ck(e={},t={}){return E(`${Qd(t)}/builder-profit/json?t=${sk(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function lk(e={},t={}){let n=G$(e);return E(`${Qd(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function uk(e={}){let t=await Jd({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}$();var Y$="https://extra-api.sanctum.so",X$=30,Q$=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Zd(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||Y$).replace(/\/$/,"")}function dk(e,t="lst"){let n=String(e??"").trim();if(!n||/[?&=\s]/.test(n))throw new Error(`sanctum-lst: ${t} must be an LST symbol or mint`);return n}function J$(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Bn(e,t,n={}){let r={},o={};for(let i of J$(t,X$)){let a=new URL(`${Zd(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await E(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function pk(e={}){try{let[t,n]=await Promise.all([E(`${Zd(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Bn("apy/inception",["jitoSOL"],e)]),r=Array.isArray(t?.lsts)?t.lsts:[];return{ok:r.length>0&&Number.isFinite(Number(n.values.jitoSOL)),provider:"sanctum-lst",lstCount:r.length,jitoSolApyInception:Number(n.values.jitoSOL)??null,exec:!1}}catch(t){return{ok:!1,provider:"sanctum-lst",error:String(t?.message||t),exec:!1}}}async function ep(e={},t={}){let n=await E(`${Zd(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(a=>String(a.symbol||"").toLowerCase()===i||a.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function mk(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await ep({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=Q$);let r=[...new Set(n.map(s=>dk(s,"lsts[]")))],[o,i]=await Promise.all([Bn("apy/latest",r,t),Bn("apy/inception",r,t)]),a=r.map(s=>{let c=Number(o.values[s]),l=Number(i.values[s]);return{lst:s,apyLatest:Number.isFinite(c)?c:null,apyLatestPct:Number.isFinite(c)?c*100:null,apyInception:Number.isFinite(l)?l:null,apyInceptionPct:Number.isFinite(l)?l*100:null,error:o.errs[s]||i.errs[s]||null}});return a.sort((s,c)=>(c.apyInception??-1)-(s.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:a.length,apys:a,byLst:Object.fromEntries(a.map(s=>[s.lst,s]))}}async function fk(e={},t={}){let n=dk(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Bn("apy/latest",[n],t),Bn("apy/inception",[n],t),Bn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Bn("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}$();var eB="https://api.save.finance",tB="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",hk="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",nB=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function tp(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||eB).replace(/\/$/,"")}function gk(e,t="address"){let n=String(e??"").trim();if(!nB.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function yk(e){let t=Number(e);return Number.isFinite(t)?t:null}function rB(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function oB(e={}){let t=e.reserve||{},n=t.liquidity||{},r=t.collateral||{};return{address:e.address||t.address||null,lendingMarket:t.lendingMarket||null,mint:n.mintPubkey||null,mintDecimals:n.mintDecimals??null,supplyApyPct:yk(e.rates?.supplyInterest),borrowApyPct:yk(e.rates?.borrowInterest),cTokenExchangeRate:e.cTokenExchangeRate??null,availableAmount:n.availableAmount??null,borrowedAmountWads:n.borrowedAmountWads??null,marketPrice:n.marketPrice??null,collateralMint:r.mintPubkey||null,collateralTotalSupply:r.mintTotalSupply??null,rewards:e.rewards||[],lastUpdateSlot:t.lastUpdate?.slot??null,stale:t.lastUpdate?.stale===1,raw:e}}async function bk(e={}){try{let t=await E(`${tp(e)}/v1/reserves?ids=${hk}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:hk,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function np(e={},t={}){let n=new URL(`${tp(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(rB);if(e.includeHidden!==!0&&(o=o.filter(a=>!a.hidden)),e.name){let a=String(e.name).toLowerCase();o=o.filter(s=>String(s.name||"").toLowerCase()===a)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function wk(e={},t={}){let n=[];if(e.ids||e.reserves)n=(Array.isArray(e.ids||e.reserves)?e.ids||e.reserves:String(e.ids||e.reserves).split(",")).map(s=>gk(String(s).trim(),"reserve"));else{let a=gk(e.market||e.marketAddress||tB,"market"),c=(await np({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===a);if(!c)throw new Error(`solend-lending: market ${a} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await E(`${tp(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...oB(a),address:a.address||a.reserve?.address||n[s]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function rp(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`${t} must be a positive integer amount`)}if(n<=0n)throw new Error(`${t} must be a positive integer amount`);return n}function Mn(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function ui(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:rp(e.amount,"amount")}}function op(e,t){let n=t.map(a=>BigInt(a)),r=n.reduce((a,s)=>a+s,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(a=>e*a/r),i=e-o.reduce((a,s)=>a+s,0n);for(let a=0;i>0n;a=(a+1)%o.length)o[a]+=1n,i-=1n;return o}function di(e,t,n,r={}){return{kind:"execution-strategy-plan",strategy:t,chainId:e.chainId,tokenIn:e.tokenIn,tokenOut:e.tokenOut,taker:e.taker,totalAmount:String(e.total),slices:n,executable:!1,signs:!1,broadcasts:!1,requiresFreshQuotePerSlice:!0,requiresPolicyCheckPerSlice:!0,requiresSimulationPerSlice:!0,requiresUserConfirmationPerSlice:!0,receiptRequiredPerSlice:!0,...r}}function ip(e,t,n=Date.now()){let r=Math.floor(t/e.length);return e.map((o,i)=>({index:i+1,amount:String(o),offsetSec:i*r,executeAfter:new Date(n+i*r*1e3).toISOString()}))}function aB(e={},t={}){let n=ui(e),r=Mn(e.slices??10,"slices",2,100),o=Mn(e.durationSec??3600,"durationSec",r,604800),i=op(n.total,Array(r).fill(1));return di(n,"TWAP",ip(i,o,t.nowMs),{durationSec:o})}function sB(e={},t={}){let n=ui(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=Mn(e.durationSec??3600,"durationSec",r.length,604800),i=op(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=ip(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return di(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function cB(e={}){let t=ui(e),n=Mn(e.participationBps,"participationBps",1,1e4);if(!Array.isArray(e.observedMarketVolumes)||e.observedMarketVolumes.length===0||e.observedMarketVolumes.length>100)throw new Error("observedMarketVolumes must contain 1-100 positive integer amounts");let r=t.total,o=[];for(let[i,a]of e.observedMarketVolumes.entries()){let s=rp(a,"observedMarketVolumes"),c=s*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(s)}),r-=l,r===0n)break}return di(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function lB(e={}){let t=ui(e),n=rp(e.displayAmount,"displayAmount");if(n>t.total)throw new Error("displayAmount cannot exceed total amount");let r=[],o=t.total;for(;o>0n;){if(r.length>=100)throw new Error("iceberg requires more than 100 refills");let i=o>n?n:o;r.push({index:r.length+1,amount:String(i),displayAmount:String(n)}),o-=i}return di(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function uB(e={},t={}){let n=ui(e),r=Mn(e.slices??10,"slices",2,100),o=Mn(e.durationSec??3600,"durationSec",r,604800),i=Mn(e.urgencyBps??5e3,"urgencyBps",1,1e4),a=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),s=op(n.total,a);return di(n,"IS",ip(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function xk(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return aB(e,t);if(n==="VWAP")return sB(e,t);if(n==="POV")return cB(e,t);if(n==="ICEBERG")return lB(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return uB(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function vk(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var _k=Object.freeze({"opensea-evm-market":Object.freeze({provider:"opensea-nft",operations:Object.freeze({mint:"prepareMint",list:"prepareList",cancel_listing:"prepareCancel"})}),"evm-asset-safe-transfer":Object.freeze({provider:"universal-evm-nft-transfer",operations:Object.freeze({send:"prepare"})}),"magic-eden-solana-market":Object.freeze({provider:"magiceden-sol",operations:Object.freeze({buy:"prepareBuy",list:"prepareList"})}),"solana-nft-transfer":Object.freeze({provider:"universal-solana-nft-transfer",operations:Object.freeze({send:"prepare"})}),"satflow-ordinals-market":Object.freeze({provider:"satflow",operations:Object.freeze({buy:"preparePurchase",list:"prepareList"})}),"bitcoin-ordinal-transfer":Object.freeze({provider:"universal-ordinals-transfer",operations:Object.freeze({send:"prepare"})})});function Ik(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:hd,adapters:Object.freeze(gd.adapters.map(e=>{let t=_k[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function _B(e,t={}){let n=gx(e,t),r=_k[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new se(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var ap=new Map;function ks(e={}){let t=e.filePath||void 0,n=t||"__default__";return ap.has(n)||ap.set(n,D0(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),ap.get(n)}var sp=new Map;function cp(e={}){let t=e.filePath||void 0,n=t||"__default__";return sp.has(n)||sp.set(n,V0(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),sp.get(n)}var lp=new Map;function pi(e={}){let t=e.filePath||void 0,n=t||"__default__";return lp.has(n)||lp.set(n,B0(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),lp.get(n)}var TB={"hl-info":{health:e=>Fm(e),allMids:e=>St(e),l2Book:(e,t={})=>jn(t.coin,e),outcomeMeta:e=>eo(e),clearinghouse:(e,t={})=>$i(t.user,e),userFills:(e,t={})=>Um(t.user,e),meta:e=>Dm(e),metaAndAssetCtxs:e=>Qe(e),candleSnapshot:(e,t={})=>Bi(t,e),openOrders:(e,t={})=>Hm(t.user,e),frontendOpenOrders:(e,t={})=>jm(t.user,e),userState:(e,t={})=>zn(t.user,e),spotMeta:e=>Mi(e)},"hl-vaults":{health:e=>Wm(e),summaries:(e,t={})=>xc(t,e),details:(e,t={})=>Fi(t,e),userEquities:(e,t={})=>vc(t,e),tracker:(e,t={})=>Sc(t,e)},"hl-precompiles":{health:e=>Km(e),read:(e,t={})=>Gm(t,e),l1BlockNumber:e=>Ui(e),markPx:(e,t={})=>Ic(t,e),oraclePx:(e,t={})=>Ac(t,e),spotPx:(e,t={})=>_c(t,e),position:(e,t={})=>Tc(t,e),spotBalance:(e,t={})=>Pc(t,e),vaultEquity:(e,t={})=>Cc(t,e),withdrawable:(e,t={})=>Nc(t,e)},"hl-delta-neutral":{health:()=>yf(),scan:(e,t={})=>Qc(t,e),quote:(e,t={})=>Jc(t,e),prepare:(e,t={})=>Zc(t,e),loop:(e,t={})=>Ef(t,e)},"lighter-delta-neutral":{health:()=>Nf(),scan:(e,t={})=>tl(t,e),quote:(e,t={})=>nl(t,e),prepare:(e,t={})=>rl(t,e),loop:(e,t={})=>Uf(t,e)},"poly-public":{health:e=>qf(e),time:e=>ol(e),markets:(e,t={})=>Hf(t,e),book:(e,t={})=>jf(t.tokenId,e),midpoint:(e,t={})=>zf(t.tokenId,e),spread:(e,t={})=>Vf(t.tokenId,e),price:(e,t={})=>Wf(t.tokenId,{side:t.side},e),events:(e,t={})=>Gf(t,e)},"evm-rpc":{health:(e,t={})=>Fn(t.chainId??1,e),healthAll:(e,t={})=>Ds({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>$r(t.chainId??1,e),chainId:(e,t={})=>Fs(t.chainId??1,e),getBalance:(e,t={})=>ln(t.chainId??1,t.address,e),call:(e,t={})=>U(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>Us(t,e),erc20Balance:(e,t={})=>Br(t,e),transactionReceipt:(e,t={})=>Mr(t,e)},portfolio:{health:e=>uw(e),balances:(e,t={})=>Ja(t,e),snapshot:(e,t={})=>Pw(t,e),history:(e,t={})=>Zu(t,e),valueGraph:(e,t={})=>Cw(t,e)},"nft-portfolio":{health:e=>yw(e),inventory:(e,t={})=>wr(t,e),gallery:(e,t={})=>vw(t,e),pnl:(e,t={})=>xw(t,e),prepareList:(e,t={})=>bw(t,e),traitSnipe:(e,t={})=>ww(t,e)},"contract-risk":{health:e=>Nw(e),scan:(e,t={})=>Nn(t,e)},"evm-token-sniper":{health:e=>Lw(e),scan:(e,t={})=>Rw(t,e)},"evm-simulate":{health:e=>Bw(e),simulate:(e,t={})=>ti(t,e)},"nft-mint":{health:e=>Fw(e),discover:(e,t={})=>os(t,e),prepare:(e,t={})=>nd(t,e),priceGas:(e,t={})=>rs(t,e),createTrigger:(e,t={})=>Bx(t,e),checkOpen:(e,t={})=>Mx(t,e),evaluateMancerOs:(e,t={})=>Dx(t,e)},"universal-mint-router":{health:()=>lx(),capabilities:()=>md(),prepare:(e,t={})=>ux(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:Ik()}),capabilities:()=>Ik(),route:(e,t={})=>_B(t,e)},"erc8004-identity":{health:()=>Lg(),prepareIdentityRegistration:(e,t={})=>Mg(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Fg(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Dg(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:ls,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>wx(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:us,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Ex(t,e)},"universal-ordinals-transfer":{health:()=>({provider:ds,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>$x(t,e)},"solana-rpc":{health:e=>Yf(e),latestBlockhash:(e,t={})=>al(t,e),getBalance:(e,t={})=>Xi(t,e),tokenAccounts:(e,t={})=>fo(t,e),simulate:(e,t={})=>Xf(t,e)},"bitcoin-esplora":{health:e=>Qf(e),tipHeight:e=>Jf(e),fees:e=>Zf(e),address:(e,t={})=>Ji(t,e),utxos:(e,t={})=>eh(t,e),tx:(e,t={})=>th(t,e),decode:(e,t={})=>nh(t,e)},"bitcoin-meta":{health:e=>oh(e),runeBalances:(e,t={})=>ea(t,e),inscriptions:(e,t={})=>Jn(t,e),inscriptionInfo:(e,t={})=>ih(t,e),inscriptionChildren:(e,t={})=>ah(t,e),ordBlockInfo:(e,t={})=>sh(t,e)},satflow:{health:e=>lh(e),collectionFloors:(e,t={})=>uh(t,e),collectionStats:(e,t={})=>dh(t,e),item:(e,t={})=>ph(t,e),walletContents:(e,t={})=>na(t,e),floorListings:(e,t={})=>mh(t,e),preparePurchase:(e,t={})=>hh(t,e),prepareList:(e,t={})=>ra(t,e)},jupiter:{health:e=>kh(e),venues:(e,t={})=>Sh(t,e),quote:(e,t={})=>aa(t,e),prepare:(e,t={})=>Eh(t,e)},defillama:{health:e=>Ah(e),prices:(e,t={})=>bn(t.coins||[],e),pricesBySymbol:(e,t={})=>Ch(t.symbols,e),protocols:e=>_h(e),yields:(e,t={})=>Th(t,e),stablecoins:(e,t={})=>sa(t,e),dexVolumes:(e,t={})=>Ph(t,e)},lifi:{health:e=>Oh(e),quote:(e,t={})=>go(t,e),prepare:(e,t={})=>Rh(t,e),chains:e=>Lh(e)},dexscreener:{health:e=>Ip(e),token:(e,t={})=>un(t.address||t.tokenAddress,e),search:(e,t={})=>Fr(t.q||t.query,e),pair:(e,t={})=>Ap(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Hp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Un(t,e),prepare:(e,t={})=>qp(t,e),quotePath:(e,t={})=>Dp(t,e),ethUsdc:(e,t={})=>Xs(t,e),chains:()=>jp()},"uniswap-v4":{health:(e,t={})=>Jp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Vr(t,e),inspectHook:(e,t={})=>Gp(t,e),prepare:(e,t={})=>Xp(t,e),chains:()=>Qp()},x402:{health:()=>y0(),inspect:(e,t={})=>h0(t),prepare:(e,t={})=>g0(t,e)},bankr:{health:e=>k0(e),wallet:e=>Ll(e),portfolio:e=>v0(e),swapQuote:(e,t={})=>S0(t,e)},aerodrome:{health:(e,t={})=>Hh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>ca(t,e),prepare:(e,t={})=>qh(t,e),chains:()=>jh()},zerox:{health:e=>Gh(e),price:(e,t={})=>xl(t,e),quote:(e,t={})=>bo(t,e),prepare:(e,t={})=>Kh(t,e)},across:{health:e=>Yh(e),suggestedFees:(e,t={})=>vl(t,e)},hop:{health:e=>Xh(e),quote:(e,t={})=>Sl(t,e)},relay:{health:e=>Qh(e),quote:(e,t={})=>ua(t,e),prepare:(e,t={})=>Jh(t,e)},cowswap:{health:e=>r0(e),quote:(e,t={})=>Zn(t,e),prepareOrder:(e,t={})=>o0(t,e),order:(e,t={})=>a0(t,e),status:(e,t={})=>i0(t,e),chains:()=>s0()},oneinch:{health:e=>l0(e),quote:(e,t={})=>Cl(t,e),prepare:(e,t={})=>u0(t,e),approveSpender:(e,t={})=>Nl(t,e)},"hl-ws":{health:e=>E0(e),allMids:e=>I0(e),l2Book:(e,t={})=>A0(t.coin,e),snapshot:(e,t={})=>ko(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>_0({...e,assetId:t.assetId}),book:(e,t={})=>T0(t.assetId||t.tokenId,e),snapshot:(e,t={})=>da(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>dm(e),collection:(e,t={})=>Kr(t.slug,e),floor:(e,t={})=>pm(t.slug,e),bestListings:(e,t={})=>ac(t,e),bestListing:(e,t={})=>_i(t,e),bestOffer:(e,t={})=>Ti(t,e),accountNfts:(e,t={})=>Yr(t,e),accountPnl:(e,t={})=>Ii(t,e),prepareBuy:(e,t={})=>Em(t,e),prepareSweep:(e,t={})=>Im(t,e),prepareMint:(e,t={})=>Ci(t,e),prepareList:(e,t={})=>Ni(t,e),prepareCancel:(e,t={})=>Am(t,e)},"local-marketplace":{health:()=>({provider:"local-marketplace",status:"ok",armed:!0,execution:"armed-local",existingMarketplacesUnchanged:!0,refusesSignHash:!0,signed:!1,broadcast:!1}),createListing:(e,t={})=>pi(e).createListing(t),listListings:(e,t={})=>pi(e).listListings(t),cancelListing:(e,t={})=>pi(e).cancelListing(t),createOffer:(e,t={})=>pi(e).createOffer(t),armFill:(e,t={})=>pi(e).armFill(t)},"local-x402":{health:()=>({provider:"local-x402",status:"ok",armed:!0,execution:"armed-local",telegram:!1,refusesSignHash:!0,signed:!1,broadcast:!1}),createIntent:(e,t={})=>ks(e).createIntent(t),listIntents:(e,t={})=>ks(e).listIntents(t),cancelIntent:(e,t={})=>ks(e).cancelIntent(t),armPayment:(e,t={})=>ks(e).armPayment(t)},"local-pack-registry":{health:()=>({provider:"local-pack-registry",status:"ok",pluginExecution:!1,loaded:!1,telegram:!1,execution:"read-only"}),registerPack:(e,t={})=>cp(e).registerPack(t),listPacks:(e,t={})=>cp(e).listPacks(t),revokePack:(e,t={})=>cp(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>Pg(t,e),markets:(e,t={})=>rr(t,e),quoteSpecificBuy:(e,t={})=>No(t,e),quoteSell:(e,t={})=>va(t,e),scanCollection:(e,t={})=>Sa(t,e),scanAllMarkets:(e,t={})=>vg(t,e),scanCrossVenueArb:(e,t={})=>eu(t,e),scanAllMarketsArb:(e,t={})=>Sg(t,e),prepareSpecificBuy:(e,t={})=>fg(t,e),prepareSell:(e,t={})=>hg(t,e)},stonkbrokers:{health:(e,t={})=>Cg(t,e),quoteBrokerBuy:(e,t={})=>ka(t,e),scanBrokerLoot:(e,t={})=>Ig(t,e),prepareBrokerBuy:(e,t={})=>Ag(t,e),brokerDesk:(e,t={})=>Tg(t,e),clockInStatus:(e,t={})=>Oo(t,e),prepareClockIn:(e,t={})=>_g(t,e)},"hl-outcome":{list:e=>Oy(e),prepareOrder:(e,t={})=>Ry(t,e),prepareCancel:(e,t={})=>Ly(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:qa().map(e=>e.id),nativeTemplates:Go().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>qa(),listNative:()=>Go(),gate:(e,t={})=>Vo(t.templateId||t.id,e),prepareDeploy:(e,t={})=>ab(t,e),buildNative:(e,t={})=>Ko(t),eval:async()=>(await Promise.resolve().then(()=>(Ek(),kk))).runContractsEval()},"poly-clob":{health:()=>Ky(),prepareOrder:(e,t={})=>Yy(t||{},e)},"hl-perps":{health:e=>hu(e),assetInfo:(e,t={})=>Ht(t,e),prepareOrder:(e,t={})=>Kn(t,e),prepareCancel:(e,t={})=>lo(t,e),prepareLeverage:(e,t={})=>Gc(t,e),prepareIsolatedMargin:(e,t={})=>Kc(t,e),prepareBracket:(e,t={})=>Yc(t,e),prepareBuilderApproval:(e,t={})=>Wc(t,e)},"hl-markets":{health:e=>hu(e),markets:(e,t={})=>Pa(t,e),leaderboards:(e,t={})=>ay(t,e),coin:(e,t={})=>sy(t,e),spot:(e,t={})=>cy(t,e)},"hl-entry-state":{health:e=>Ty(e),see:(e,t={})=>Do(t,e),qualify:(e,t={})=>Py(t,e),lock:(e,t={})=>Cy(t,e),list:e=>bu(e),watch:(e,t={})=>Ny(t,e)},"magiceden-sol":{health:e=>Wg(e),stats:(e,t={})=>su(t,e),listings:(e,t={})=>Kg(t,e),tokenListings:(e,t={})=>Yg(t,e),prepareBuy:(e,t={})=>Xg(t,e),prepareList:(e,t={})=>_a(t,e),prepareMint:(e,t={})=>Qg(t,e)},"hl-staking":{health:e=>Zg(e),validators:e=>uu(e),delegatorSummary:(e,t={})=>du(t,e),delegations:(e,t={})=>pu(t,e),rewards:(e,t={})=>ey(t,e),history:(e,t={})=>ty(t,e),preflight:(e,t={})=>iy(t,e),prepareStakeDeposit:(e,t={})=>ny(t,e),prepareStakeWithdraw:(e,t={})=>ry(t,e),prepareDelegate:(e,t={})=>oy(t,e)},"hyperevm-dex":{health:e=>Hg(e),search:(e,t={})=>jg(t.q||t.query||"HYPE",e),token:(e,t={})=>zg(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>yb(e),networks:(e,t={})=>Pu(t,e),pool:(e,t={})=>fb(t,e),token:(e,t={})=>hb(t,e),ohlcv:(e,t={})=>gb(t,e)},curve:{health:e=>Cb(e),openapi:e=>Pb(e),pools:(e,t={})=>Nu(t,e),quote:(e,t={})=>Ou(t,e),prepare:(e,t={})=>Nb(t,e)},gmx:{health:e=>wy(e),tickers:(e,t={})=>mr(t,e),markets:(e,t={})=>yy(t,e),marketsInfo:(e,t={})=>yu(t,e),tokens:(e,t={})=>by(t,e),prepareOrder:(e,t={})=>ky(t,e),positions:(e,t={})=>xy(t,e),orderStatus:(e,t={})=>vy(t,e),verifyOrder:(e,t={})=>Sy(t,e)},morpho:{health:e=>$b(e),markets:(e,t={})=>Lb(t,e),vaults:(e,t={})=>$u(t,e),prepareVault:(e,t={})=>Bb(t,e)},balancer:{health:e=>zb(e),pools:(e,t={})=>jb(t,e),quote:(e,t={})=>Fu(t,e),prepare:(e,t={})=>Vb(t,e)},pendle:{health:e=>Gb(e),markets:(e,t={})=>Du(t,e),quote:(e,t={})=>Kb(t,e),prepare:(e,t={})=>qu(t,e)},odos:{health:e=>Jb(e),chains:e=>ju(e),quote:(e,t={})=>Xb(t,e),prepare:(e,t={})=>Qb(t,e)},blockscout:{health:e=>aw(e),stats:(e,t={})=>Wu(t,e),address:(e,t={})=>nw(t,e),token:(e,t={})=>rw(t,e)},paraswap:{health:e=>Hx(e),tokens:(e,t={})=>xd(t,e),price:(e,t={})=>Pr(t,e),quote:(e,t={})=>Pr(t,e),prepare:(e,t={})=>qx(t,e)},rfq:{health:e=>nv(e),intent:(e,t={})=>ev(t,e),quote:(e,t={})=>tv(t,e)},"polygon-staking":{health:e=>Cv(e),validators:(e,t={})=>Tv(t,e),validatorDetail:(e,t={})=>Pv(t,e)},"aave-v3":{health:e=>Lv(e),markets:(e,t={})=>Nv(t,e),marketReserves:(e,t={})=>Ov(t,e),chains:e=>Rv(e)},"babylon-staking":{health:e=>Bv(e),stats:e=>Mv(e),finalityProviders:e=>Fv(e),delegations:(e,t={})=>Uv(t,e)},"bisq-markets":{health:e=>qv(e),markets:e=>Hv(e),ticker:(e,t={})=>jv(t,e),trades:(e,t={})=>zv(t,e)},"bob-rootstock":{health:(e,t={})=>Wv(t.chainId,e),stats:(e,t={})=>$d(t,e),addressInfo:(e,t={})=>Gv(t,e),tokenBalances:(e,t={})=>Kv(t,e)},"braiins-insights":{health:e=>Yv(e),priceStats:e=>Xv(e),poolStats:e=>Qv(e)},"cow-protocol":{health:e=>iS(e),auction:e=>nS(e),openOrders:(e,t={})=>rS(t,e),recentTrades:(e,t={})=>oS(t,e)},"hiro-stacks":{health:e=>aS(e),networkInfo:e=>sS(e),stackingInfo:e=>cS(e),poxCycles:e=>lS(e),blocks:(e,t={})=>uS(t,e)},"jito-mev":{health:e=>mS(e),recentBundles:(e,t={})=>fS(t,e),tipFloor:e=>hS(e)},"kamino-strategies":{health:e=>yS(e),strategies:(e,t={})=>bS(t,e),strategyMetrics:(e,t={})=>wS(t,e)},"liquid-esplora":{health:e=>kS(e),tipHeight:e=>ES(e),addressInfo:(e,t={})=>IS(t,e),assetInfo:(e,t={})=>AS(t,e)},"magiceden-ordinals":{health:e=>PS(e),collectionStat:(e,t={})=>CS(t,e)},"mempool-lightning":{health:e=>OS(e),statistics:e=>RS(e),nodeRankings:(e,t={})=>LS(t,e),nodeCountries:e=>$S(e)},"mempool-mining":{health:e=>FS(e),difficulty:e=>US(e),poolShare:(e,t={})=>DS(t,e),hashrate:(e,t={})=>qS(t,e),rewardStats:(e,t={})=>HS(t,e)},"meteora-dlmm":{health:e=>VS(e),pools:(e,t={})=>WS(t,e),poolSearch:(e,t={})=>GS(t,e)},"ordinals-runes":{health:e=>YS(e),blockHeight:e=>XS(e),blockInfo:(e,t={})=>QS(t,e),satInfo:(e,t={})=>JS(t,e),runeInfo:(e,t={})=>ZS(t,e)},"pyth-price-feeds":{health:e=>nk(e),latestPrice:(e,t={})=>rk(t,e),latestPrices:(e,t={})=>ok(t,e),feedDirectory:e=>ik(e)},"relayscan-mev":{health:e=>uk(e),overview:(e,t={})=>Jd(t,e),builderProfit:(e,t={})=>ck(t,e),dailyStats:(e,t={})=>lk(t,e)},"sanctum-lst":{health:e=>pk(e),lstList:e=>ep(e),apyAll:e=>mk(e),apyIndividual:(e,t={})=>fk(t,e)},"solend-lending":{health:e=>bk(e),markets:e=>np(e),reserves:(e,t={})=>wk(t,e)},"execution-strategies":{health:()=>vk(),plan:(e,t={})=>xk(t)},"across-bridge":{health:e=>rv(e),pools:(e,t={})=>ov(t,e),suggestedFees:(e,t={})=>iv(t,e)},"beefy-yields":{health:e=>av(e),apy:(e,t={})=>sv(t,e),apyBreakdown:e=>cv(e)},"birdeye-tokens":{health:e=>uv(e),tokenList:(e,t={})=>dv(t,e)},"celestia-da":{health:e=>pv(e),stats:e=>mv(e),blockStats:(e,t={})=>fv(t,e)},"das-assets":{health:e=>hv(e),assetsByOwner:(e,t={})=>gv(t,e),searchAssets:(e,t={})=>yv(t,e),assetProof:(e,t={})=>bv(t,e)},"l2beat-tvl":{health:e=>wv(e),tvl:(e,t={})=>xv(t,e),activity:(e,t={})=>vv(t,e)},"spark-lend":{health:e=>Sv(e),markets:(e,t={})=>kv(t,e)},"symbiotic-restaking":{health:e=>Ev(e),vaults:(e,t={})=>Iv(t,e),vaultDetail:(e,t={})=>Av(t,e)}},Ak=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Tk=new Set(["hl-exec"]);function PB(e){return Tk.has(String(e||""))}function CB(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Tk.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=Li().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!Ak.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(Ak.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let a=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(a))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${a||"<missing>"}`)}}async function A(e,t,n={},r={}){if(PB(e))throw new Error(`${e} is an execution provider: it signs and submits with a real key. dataCall() is the public read plane and will not route to it.`);CB(e,t,n);let o=gc(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=TB[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function NB({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||Li().map(d=>d.id);!o&&!e&&(s=s.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof a=="function"?a:(d,p,m)=>A(d,"health",p,m),u={};return await Me(s,i??8,async d=>{if(!gc(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await xe(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:u}}function Pk(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function OB(e){return e.execution==="prepare"&&Pk(e).length?"armed-local":e.execution||"read-only"}function RB(){return Li().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:OB(e),localSignerSurfaces:Pk(e),description:e.description}))}var LD={catalog:RB,health:NB,call:A,hl:{health:e=>A("hl-info","health",{},e),allMids:e=>A("hl-info","allMids",{},e),l2Book:(e,t)=>A("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>A("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>A("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>A("hl-info","userFills",{user:e},t),meta:e=>A("hl-info","meta",{},e),metaAndAssetCtxs:e=>A("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>A("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>A("hl-info","openOrders",{user:e},t),userState:(e,t)=>A("hl-info","userState",{user:e},t),spotMeta:e=>A("hl-info","spotMeta",{},e),vaults:{health:e=>A("hl-vaults","health",{},e),summaries:(e,t)=>A("hl-vaults","summaries",e||{},t),details:(e,t)=>A("hl-vaults","details",e||{},t),mine:(e,t)=>A("hl-vaults","userEquities",{user:e},t),track:(e,t)=>A("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>A("hl-entry-state","see",e||{},t),qualify:(e,t)=>A("hl-entry-state","qualify",e||{},t),lock:(e,t)=>A("hl-entry-state","lock",e||{},t),list:e=>A("hl-entry-state","list",{},e),watch:(e,t)=>A("hl-entry-state","watch",e||{},t)},staking:{health:e=>A("hl-staking","health",{},e),validators:e=>A("hl-staking","validators",{},e),summary:(e,t)=>A("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>A("hl-staking","delegations",{user:e},t),rewards:(e,t)=>A("hl-staking","rewards",{user:e},t),history:(e,t)=>A("hl-staking","history",{user:e},t),preflight:(e,t)=>A("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>A("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>A("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>A("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>A("poly-public","health",{},e),time:e=>A("poly-public","time",{},e),markets:(e,t)=>A("poly-public","markets",e||{},t),book:(e,t)=>A("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>A("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>A("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>A("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>A("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>A("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>A("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>A("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>A("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>A("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>A("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>A("evm-token-sniper","health",{},e),scan:(e,t)=>A("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>A("portfolio","balances",e||{},t),snapshot:(e,t)=>A("portfolio","snapshot",e||{},t),history:(e,t)=>A("portfolio","history",e||{},t),valueGraph:(e,t)=>A("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>A("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>A("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>A("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>A("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>A("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>A("opensea-nft","floor",{slug:e},t),collection:(e,t)=>A("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>A("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>A("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>A("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>A("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>A("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>A("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>A("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>A("universal-mint-router","health",{},e),capabilities:e=>A("universal-mint-router","capabilities",{},e),prepare:(e,t)=>A("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>A("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>A("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>A("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>A("solana-rpc","health",{},e),latestBlockhash:(e,t)=>A("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>A("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>A("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>A("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>A("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>A("jupiter","prepare",e||{},t),nftStats:(e,t)=>A("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>A("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>A("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>A("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>A("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>A("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>A("bitcoin-esplora","health",{},e),tipHeight:e=>A("bitcoin-esplora","tipHeight",{},e),fees:e=>A("bitcoin-esplora","fees",{},e),address:(e,t)=>A("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>A("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>A("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>A("bitcoin-esplora","decode",e||{},t),metaHealth:e=>A("bitcoin-meta","health",{},e),runeBalances:(e,t)=>A("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>A("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>A("satflow","health",{},e),satflowFloors:(e,t)=>A("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>A("satflow","walletContents",{address:e},t)},prices:{health:e=>A("defillama","health",{},e),current:(e,t)=>A("defillama","prices",{coins:e},t),bySymbol:(e,t)=>A("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>A("defillama","protocols",{},e)},lifi:{health:e=>A("lifi","health",{},e),quote:(e,t)=>A("lifi","quote",e||{},t),chains:e=>A("lifi","chains",{},e)},dex:{health:e=>A("dexscreener","health",{},e),token:(e,t)=>A("dexscreener","token",{address:e},t),search:(e,t)=>A("dexscreener","search",{q:e},t),pair:(e,t,n)=>A("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>A("uniswap-v3","health",e||{},t),quote:(e,t)=>A("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>A("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>A("uniswap-v3","ethUsdc",e||{},t),chains:e=>A("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>A("uniswap-v4","health",e||{},t),quote:(e,t)=>A("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>A("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>A("uniswap-v4","prepare",e||{},t),chains:e=>A("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>A("x402","inspect",e||{},t),prepare:(e,t)=>A("x402","prepare",e||{},t)},bankr:{wallet:e=>A("bankr","wallet",{},e),portfolio:e=>A("bankr","portfolio",{},e),swapQuote:(e,t)=>A("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>A("across","suggestedFees",e||{},t),hop:(e,t)=>A("hop","quote",e||{},t),relay:(e,t)=>A("relay","quote",e||{},t)},cow:{quote:(e,t)=>A("cowswap","quote",e||{},t)},hlWs:{allMids:e=>A("hl-ws","allMids",{},e),l2Book:(e,t)=>A("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>A("poly-ws","book",{assetId:e},t)}};export{Tk as EXECUTION_PROVIDERS,CB as assertDataOpAllowed,LD as data,A as dataCall,RB as dataCatalog,NB as dataHealth,PB as isExecutionProvider,_B as routeUniversalNftLifecycle,Ik as universalNftLifecycleCapabilities};
|