@oracle-agent/oracle 0.28.13 → 0.28.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/skills/oracle-action-semantics/SKILL.md +3 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +26 -26
- package/dist/cli/commands/chat.mjs +140 -140
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +73 -74
- package/dist/cli/commands/model.mjs +143 -143
- package/dist/cli/commands/receipt.mjs +2 -2
- package/dist/cli/commands/setup.mjs +7 -7
- package/dist/cli/commands/sign.mjs +11 -11
- package/dist/cli/commands/signer.mjs +13 -13
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +24 -24
- package/dist/index.mjs +29 -29
- 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/public-api/agent-grants.mjs +2 -2
- package/package.json +1 -1
package/dist/data/desk-data.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),c=Yx("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function ik(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,cd):Math.min(250*2**e,cd)+Math.floor(Math.random()*100)}function hr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Xa(e,t,n){return hr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function gr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function sk(e){return e?e.byteLength??e.length??0:0}async function ud(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&&(gr(e),!r))throw Xa(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 Xa(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+=sk(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 Xa(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function dd(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function ck(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,y=a?{lookupFn:a}:{};if(c&&!s&&!Ka(h))throw hr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let w=async(v,{status:g=null}={})=>{let b=await za(v,y);if(!b.ok)throw hr(g==null?`HTTP refused ${v}: ${b.error}`:`HTTP redirect to ${v} ${b.error}`,g==null?{}:{status:g});let k=new URL(v).hostname;if(s){if(m&&(await m.close(),m=null),!m)try{m=await Va({requireUndici:!0,...u?{importUndici:u}:{}})}catch(E){throw hr(g==null?`HTTP refused ${v}: ${E?.message||E}`:`HTTP redirect to ${v} refused: ${E?.message||E}`,g==null?{}:{status:g})}m.pin(k,b.addresses),h=m.fetch}else id(h,k,b.addresses);return b};try{let v=String(e),g={...r||{}};c&&await w(v);for(let b=0;b<=ld;b+=1){let k=await h(v,{method:n,headers:g,body:o,signal:p.signal,redirect:"manual"});if(Qx.has(k.status)){if(n!=="GET"&&n!=="HEAD"){let T=await ud(k,l??Zx,{url:v,truncate:!0}),q=new Error(`HTTP ${k.status} ${n} ${v} redirected non-idempotent request`);throw q.status=k.status,q.body=dd(T)??T.slice(0,300),q}if(b===ld)throw gr(k),new Error(`HTTP redirect loop for ${e}`);let _=k.headers?.get?.("location"),O;try{O=nk(_,v)}catch(T){throw gr(k),T}let N=!rk(O,v);if(gr(k),N&&(g=tk(g)),c)await w(O,{status:k.status});else if(N){let T=await za(O,y);if(!T.ok){let q=new Error(`HTTP redirect from ${v} ${T.error}`);throw q.status=k.status,q.retryable=!1,q}s&&T.addresses?.length&&(m||(m=await Va(u?{importUndici:u}:{})),m&&(m.pin(new URL(O).hostname,T.addresses),h=m.fetch))}v=O;continue}if(typeof d=="function")try{await d(k,{url:v})}catch(_){throw gr(k),hr(_?.message||String(_))}let E=await ud(k,l,{url:v,onOversize:()=>p.abort()}),I=dd(E);if(!k.ok){let _=new Error(`HTTP ${k.status} ${n} ${v}`);throw _.status=k.status,_.retryAfter=k.headers?.get?.("retry-after")??null,_.body=I??E.slice(0,300),_}return I??E}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.close()}}async function x(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):Jx,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 b;for(let k=0;k<=s;k++)try{return await ck(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:m,importUndici:d,validateResponse:p})}catch(E){b=E;let I=E?.status,_=E?.name==="AbortError",O=new Set([408,425,429]),N=E?.retryable===!1?!1:I!=null?O.has(I)||Xx.has(I)&&sd.has(o):!_&&sd.has(o);if(k===s||!N)throw E;await ak(ik(k,E?.retryAfter))}throw b};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let w=ok(o,e,i,{untrustedUrl:u,maxResponseBytes:m}),v=Ya.get(w);if(v)return v;let g=h().finally(()=>Ya.delete(w));return Ya.set(w,g),g}async function ge(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 Ne(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 Xx,sd,Jx,cd,pd,Qx,ld,Zx,Ya,ak,L=we(()=>{ad();Xx=new Set([408,425,429,500,502,503,504]),sd=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Jx=2,cd=4e3,pd=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Qx=new Set([301,302,303,307,308]),ld=3,Zx=64*1024;Ya=new Map;ak=e=>new Promise(t=>setTimeout(t,e))});function Qa(e){return md.get(Number(e))||null}function fd(e,t=process.env){let n=Qa(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function hd(e){return md.has(Number(e))}var Ja,md,gd=we(()=>{Ja={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}},md=new Map(Object.values(Ja).map(e=>[e.chainId,e]))});var Fo={};Ha(Fo,{PUBLIC_RPC_FALLBACKS:()=>es,erc20Allowance:()=>rs,erc20BalanceOf:()=>br,resolveRpcUrl:()=>ts,rpcBlockNumber:()=>yr,rpcCall:()=>M,rpcChainId:()=>ns,rpcGasPrice:()=>fk,rpcGetBalance:()=>Yt,rpcHealth:()=>kn,rpcHealthAll:()=>os,transactionReceipt:()=>wr});import{Interface as lk,getAddress as uk}from"ethers";function It(e,t){try{return uk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function dk(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 Za(e){return e==null?null:Number.parseInt(String(e),16)}function ts(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=fd(e,n);return r||es[Number(e)]||null}function mk(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!pk.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 M(e,t,n=[],r={}){let o=String(t||"");mk(o);let i=ts(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 x(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 kn(e,t={}){let n=await M(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await M(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Qa(e)?.name||null}}async function yr(e,t={}){let n=await M(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function ns(e,t={}){let n=await M(e,"eth_chainId",[],t);return parseInt(n,16)}async function fk(e,t={}){let n=await M(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Yt(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await M(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function rs(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=It(e.token||e.tokenAddress,"token"),o=It(e.owner,"owner"),i=It(e.spender,"spender"),a=Mo.encodeFunctionData("allowance",[o,i]),s=await M(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Mo.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=It(e.token||e.tokenAddress,"token"),o=It(e.account||e.owner||e.address,"account"),i=Mo.encodeFunctionData("balanceOf",[o]),a=await M(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Mo.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 wr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=dk(e.txHash||e.hash||e.transactionHash),o=await M(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=Za(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?It(e.expectedTo,"expectedTo"):null,u=o.to?It(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?It(o.from,"receipt.from"):null,blockNumber:Za(o.blockNumber),transactionIndex:Za(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function os(e={}){let t=e.chainIds||Object.values(Ja).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!hd(r)&&!es[r]&&!ts(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await kn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Mo,es,pk,de=we(()=>{L();gd();Mo=new lk(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);es={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"};pk=/^(?: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 Tk,createHmac as Nk,timingSafeEqual as dL}from"node:crypto";function cs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(cs).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${cs(e[n])}`).join(",")}}`}function Ed(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Id(e=process.env){return Ed(process.env)||Ed(e)}function Lk(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function Jt(e){let t=Lk(e);return Tk("sha256").update(cs(t)).digest("hex")}function $k(e,t=Id()){return t?Nk("sha256",t).update(String(e)).digest("hex"):""}function P(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+ls:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>Rk)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:Ok},f=Jt(p),m=Id(r),h=m?$k(f,m):void 0,y={...p,prepareHash:f};return h&&(y.prepareMac=h),y}var Ok,ls,Rk,K=we(()=>{Ok=2,ls=300*1e3,Rk=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function VS({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"?zS:jS}async function oe(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=VS(t);return x(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _p(e={}){let t=await oe({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function ft(e={}){return oe({type:"allMids"},e)}async function An(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return oe({type:"l2Book",coin:String(e)},t)}async function Nr(e={}){return oe({type:"outcomeMeta"},e)}async function ai(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return oe({type:"spotClearinghouseState",user:e},t)}async function Pp(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return oe({type:"userFills",user:e},t)}async function Cp(e={}){return oe({type:"meta"},e)}async function je(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),oe(t,e)}async function si({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 oe(i,o)}async function Tp({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return oe({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Np(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return oe({type:"openOrders",user:e},t)}async function Op(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return oe({type:"frontendOpenOrders",user:e},t)}async function _n(e,t={}){if(!e)throw new Error("hlUserState requires user");return oe({type:"clearinghouseState",user:e},t)}async function ci(e={}){return oe({type:"spotMeta"},e)}var jS,zS,Ze=we(()=>{L();jS="https://api.hyperliquid.xyz/info",zS="https://api.hyperliquid-testnet.xyz/info"});async function qp(e={}){let t=Date.now();if(Br.dexs&&t-Br.at<6e4&&!e.fetchImpl)return Br.dexs;let n=await oe({type:"perpDexs"},e);return Br={at:t,dexs:Array.isArray(n)?n:[]},Br.dexs}async function Dp(e="",t={}){let n=e||"",r=Date.now(),o=Up.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await oe({type:"metaAndAssetCtxs",dex:e},t):await je(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return Up.set(n,c),c}function Ct(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=Hp+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Pt(e,t){let n=Vs(e),r=Vs(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=Hp+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 Vs(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 Gs(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Ct(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Pt(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:nE(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=Pt(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 qp(t)).findIndex(b=>b&&b.name===l);if(f<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:m,ctxs:h}=await Dp(l,t),y=m.findIndex(b=>b.name===n||b.name===`${l}:${d}`||b.name.endsWith(`:${d}`));if(y<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let w=m[y];if(w.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let v=tE+f*1e4+y,g=h[y]||{};return{kind:"hip3",coin:w.name||n,assetId:v,szDecimals:w.szDecimals??0,maxLeverage:w.maxLeverage??null,dex:l,dexIndex:f,indexInMeta:y,markPx:g.markPx??null}}let{universe:r,ctxs:o}=await Dp("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await qp(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 Gs({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 nE(e,t){let n=Vs(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var Hp,tE,Br,Up,fi=we(()=>{Ze();Hp=1e8,tE=1e5,Br={at:0,dexs:null},Up=new Map});function ye(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function ze(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function on(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=ye(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 Ks(e,t="amount"){let n=on(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Se(e,t,n="amount"){let r=ye(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 Pn=we(()=>{});function sE(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 Wp(e,t){let n=ye(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 st(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=>st(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)}:${st(e[r],t)}`).join(",")}}`}function cE(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)||st(n,"declared order type")!==st({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(st(n,"declared order type")!==st({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||st(n,"declared order type")!==st({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 lE(e,t,n){let r=Wp(e.s,"signed size"),o=Wp(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 uE(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=Tt(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(ze(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=on(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 jp(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(ye(e.s,"hl: signed size")!==ye(t.size,"hl: size"))throw new Error("hl: signed size must match");if(ye(e.p,"hl: signed price")!==ye(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(st(e.t,"signed order type")!==st(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 zp(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(ye(e.s,"hl: bracket protection size")!==ye(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(ye(e.p,"hl: bracket protection price")!==ye(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(ye(i.triggerPx,"hl: triggerPx")!==ye(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function dE(e){let t=String(e||"").replace(/\/$/,"");if(!rE.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Ys(e){return Ct(e)!=null}function pE(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(Ys(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 mE(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(Ys(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 Vp(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=Tt(n.kind,"kind",48),o=iE[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=dE(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!==aE[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(oE.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=Tt(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=Ct(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(pE(c,t),mE(c,l,t),r==="hip4-order"&&!Ys(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");cE(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");jp(u[0],n,l);let m=1;d!=null&&zp(u[m++],n,l,d,"tp"),p!=null&&zp(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");jp(u[0],n,l)}lE(u[0],n,t),uE(n,t),s=ye(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=Tt(n.usd,"margin usd",64),d=Se(u,6,"hl: margin usd");if(on(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=sE(m,6)}}if(r==="builder-fee-approval"){let c=Tt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Tt(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=Tt(n.maxFeeRate,"maxFeeRate",32);if(Tt(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 rE,oE,iE,aE,Tt,Gp=we(()=>{Pn();fi();rE=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),oE=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),iE=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"}),aE=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"}),Tt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function hE(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 hi(e,t={},n={}){let r=String(e?.kind||""),o=fE[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:hE(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 Vp(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 fE,Xs=we(()=>{Gp();fE=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 gE,JsonRpcProvider as yE}from"ethers";function SE(e){return kE.test(String(e||""))}async function gi(e,{contract:t=bE,rpc:n=vE,chainId:r=wE,balanceOf:o}={}){if(!SE(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new yE(n,r,{staticNetwork:!0}),a=new gE(t,xE,i);return BigInt(await a.balanceOf(e))}var bE,wE,vE,xE,kE,Js=we(()=>{bE="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",wE=999,vE="https://rpc.hyperliquid.xyz/evm",xE=["function balanceOf(address owner) view returns (uint256)"],kE=/^0x[a-fA-F0-9]{40}$/});import{existsSync as EE,readFileSync as IE,lstatSync as AE}from"node:fs";import{homedir as Kp}from"node:os";import{join as Qs}from"node:path";function CE(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Yp,t)?Yp[t]:PE}function LE(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Xp])return String(e[Xp]);let t=e.ORACLE_CONFIG_DIR||Qs(Kp(),".config","oracle");return Qs(t,"fee-recipient")}return Qs(Kp(),".config","oracle","fee-recipient")}function Zs(e=process.env){try{let t=LE(e);if(!EE(t)||AE(t).isSymbolicLink())return"";let n=IE(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function $E(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let n=Number(e);return!Number.isFinite(n)||n<=0?0:Math.min(Math.floor(n),_E)}function BE({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[NE]||"").trim(),o=String(e[OE]||RE).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=CE(t),a=$E(e[TE],{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=Zs(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 yi({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=BE({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 gi(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Jp(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Qp(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var _E,PE,Yp,TE,NE,OE,Xp,RE,bi=we(()=>{Js();_E=100,PE=5,Yp=Object.freeze({swap:5,bridge:5,perps:0,nft:0});TE="ORACLE_INTEGRATOR_FEE_BPS",NE="ORACLE_INTEGRATOR_FEE_RECIPIENT",OE="ORACLE_INTEGRATOR_ID",Xp="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",RE="oracle"});var uc={};Ha(uc,{HL_BUILDER_ADDRESS_ENV:()=>wi,HL_BUILDER_DEFAULT_FEE_BPS:()=>ME,HL_BUILDER_FEE_ENV:()=>tc,HL_BUILDER_FEE_TIERS:()=>Mr,HL_BUILDER_MAX_FEE_BPS:()=>ec,HL_PERP_MAX_SIG_FIGS:()=>Zp,HL_PERP_PRICE_DECIMALS:()=>em,HL_SIGNATURE_CHAIN_ID:()=>rc,MARGIN_MODE:()=>Fr,ORDER_TYPES:()=>Le,TIF:()=>Ur,formatPerpPrice:()=>gt,formatPerpSize:()=>om,hlBuilderFeeBpsForKind:()=>rm,hlPerpAssetInfo:()=>Nt,hlPrepareBracketOrder:()=>lc,hlPrepareBuilderApproval:()=>ac,hlPrepareCancelOrder:()=>qr,hlPreparePerpOrder:()=>Nn,hlPrepareUpdateIsolatedMargin:()=>cc,hlPrepareUpdateLeverage:()=>sc,resolveBuilderFee:()=>oc});function tm(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 FE(e,t){let n=tm(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function UE(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 nm(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 rm(e="perp"){if(e==="perp"||e==="main")return Mr.perp;if(e==="spot")return Mr.spot;if(e==="hip3")return Mr.hip3;if(e==="outcome"||e==="hip4")return Mr.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function oc({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[wi]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${wi} must be an EVM address`);let o=Zs(e);if(!o||o!==r)return null;let i=e?.[tc],a=rm(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: ${tc} must be a positive number in 0.1 bps increments`);if(s>ec)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${ec} 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 qE(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 oe({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 DE(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||gi;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function ic(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 HE(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 ic(r,a,n)}function gt(e,t,n={}){let r=em-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return ic(HE(e,Zp,n),r,n)}function om(e,t){let n=ic(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 WE(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 Nt(e={},t={}){let n=await Gs(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 nc(e,{tif:t=Ur.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Le.LIMIT:return{limit:{tif:t}};case Le.MARKET:return{limit:{tif:Ur.IOC}};case Le.STOP_MARKET:case Le.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:gt(n,o),tpsl:e===Le.STOP_MARKET?"sl":"tp"}};case Le.STOP_LIMIT:case Le.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:gt(n,o),tpsl:e===Le.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Cn(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:rc,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 Tn(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=hi(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,P(r,{provider:e.provider||"hl-perps",kind:e.kind})}function ac(e={},t={}){let n=oc({env:t.env});if(!n)throw new Error(`hl-perps: ${wi} 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:rc,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Tn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Cn(o,r,t)},e,t)}async function Nn(e={},t={}){let n=await Nt(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??Le.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=nm(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=om(e.size??e.sz,n.szDecimals),s;if(r===Le.MARKET){let v=Number(n.markPx);if(!Number.isFinite(v)){let E=await ft(t);v=Number(E?.[n.coin]??E?.[String(n.assetId)]??NaN)}if(!Number.isFinite(v))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 b=o?v*(1+g/1e4):v*(1-g/1e4);s=gt(b,n.szDecimals,{roundDown:o});let k=Math.abs(Number(s)/v-1)*1e4;if(k>g+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${k.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=gt(e.price??e.limitPx,n.szDecimals)}let c=nc(r,{tif:e.tif??(r===Le.MARKET?Ur.IOC:Ur.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=oc({env:t.env,kind:n.kind}),p=await DE(d,e,t),f=p.exempt?null:d,m=await qE(f,e,t),h=m.approved?f:null;h&&(u.builder=h.wire);let y=Number(e.nonce??Date.now()),w=WE(a,s);return Tn({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:f&&!h?{...d.disclosure,...m}:null,...Cn(u,y,t)},e,t)}async function qr(e={},t={}){let n=await Nt(UE(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=tm(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Tn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Cn(i,Number(e.nonce??Date.now()),t)},e,t)}async function sc(e={},t={}){let n=await Nt(e,t),r=FE(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||Fr.CROSS).toLowerCase();if(o!==Fr.CROSS&&o!==Fr.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Fr.CROSS,leverage:r};return Tn({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,...Cn(i,Number(e.nonce??Date.now()),t)},e,t)}async function cc(e={},t={}){let n=await Nt(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=nm(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Tn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Cn(s,Number(e.nonce??Date.now()),t)},e,t)}async function lc(e={},t={}){let n=await Nn(e,t),r=await Nt(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:gt(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:nc(Le.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:gt(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:nc(Le.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 Tn({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:gt(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:gt(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Cn(a,Number(e.nonce??Date.now()),t)},e,t)}var Zp,em,rc,ME,ec,wi,tc,Mr,Le,Ur,Fr,vi=we(()=>{Ze();fi();Pn();K();Xs();Js();bi();Zp=5,em=6,rc="0x66eee",ME=2,ec=10,wi="ORACLE_HL_BUILDER_ADDRESS",tc="ORACLE_HL_BUILDER_FEE_BPS",Mr=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Le=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Ur=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Fr=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as dg,readFileSync as F_}from"node:fs";import{dirname as ug,join as wl}from"node:path";import{fileURLToPath as U_}from"node:url";function q_(e){let t=ug(U_(e));for(let n=0;n<8;n+=1){let r=wl(t,"package.json");if(dg(r))try{let i=JSON.parse(F_(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=ug(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function ta(e,t){let n=q_(t),r=wl(n,e);return dg(r)?r:wl(n,"dist","assets",e)}var vl=we(()=>{});import{isAddress as D_}from"ethers";function W_(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:pg,tag:`v${pg}`}),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 na(e){let t=dn[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function po(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function mo(e,t){let n=String(e||"");if(!D_(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function mg(e,t){let n=na(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");po(i,"safe-erc20: supply"),mo(a,"safe-erc20: initialHolder"),mo(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(po(i,"safe-erc721-drop: cap"),mo(a,"safe-erc721-drop: treasury"),po(s,"safe-erc721-drop: mintPrice"),po(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");mo(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;mo(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`)}po(i,"safe-vesting: durationSeconds")}return n}function fg(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var pg,H_,dn,ra=we(()=>{pg="5.0.2",H_={"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"]}};dn=Object.freeze(Object.fromEntries(Object.entries(H_).map(([e,t])=>[e,W_(e,t)])))});import{spawnSync as xl}from"node:child_process";import{existsSync as pn,readFileSync as oa,readdirSync as hg,statSync as gg}from"node:fs";import{join as ut}from"node:path";import{createHash as j_}from"node:crypto";function aa(){return pn(fo)?hg(fo).filter(e=>dn[e]&&gg(ut(fo,e)).isDirectory()).map(e=>{let t=ut(fo,e),n=ut(t,"SECURITY.md");return{id:e,path:t,metadata:na(e),securityNotice:pn(n)?oa(n,"utf8").slice(0,500):null,disclaimer:ia}}):[]}function yg(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",ut(e,".foundry/bin/forge")];for(let n of t)if(xl(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function z_(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:xl("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function Jn(e,t,n){let r=xl(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 V_(e){let t=j_("sha256");function n(r){let o=gg(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of hg(r).sort())n(ut(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(oa(r)))}return n(e),t.digest("hex")}function ho(e,t={}){let n=na(e),r=t.allowSkipStatic!==!1,o=ut(fo,e);if(!pn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=yg();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(!pn(ut(o,"lib","forge-std"))){let f=Jn(i,["install","foundry-rs/forge-std","--no-git"],o);if(!f.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
3
|
-
${f.stderr}`)}if(!
|
|
4
|
-
${f.stderr}`)}let a=
|
|
5
|
-
${c.stderr}`.slice(0,2e3));let l=
|
|
1
|
+
var zx=Object.defineProperty;var we=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Wa=(e,t)=>{for(var n in t)zx(e,n,{get:t[n],enumerable:!0})};import Yt from"node:net";import Vx from"node:dns";function Mo(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 f=p.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;d.splice(d.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return d.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:d.map(f=>Number.parseInt(f,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 ja(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 za(e){if(Yt.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(Yt.isIPv6(e)){let t=Mo(e);if(!t)return!1;let n=Mo("::ffff:0:0");return ja(t,n,96)?za([...t.slice(12)].join(".")):ja(t,Mo("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>ja(t,Mo(o),i)):!1}return!1}function Kx(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(Gx.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=Yt.isIP(n);return r!==0&&!za(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Va(e,{lookupFn:t=Vx.promises.lookup}={}){let n=Kx(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:Yt.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=>!za(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Ga({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||(Yt.isIPv6(p.address)?6:4)})),s=(d,p,f)=>{i.set(o(d),a(typeof p=="string"?[{address:p,family:f}]:p))},c=d=>{let p=o(d);if(Yt.isIP(p))return[{address:p,family:Yt.isIPv6(p)?6:4}];let f=i.get(p);if(!f||!f.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return f},l=new n({connect:{lookup(d,p,f){let m;try{m=c(d)}catch(h){return f(h)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),u=Yx((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 Yx(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[Ka]=Object.freeze({pin:t}),e}function Ya(e){return typeof e=="function"&&typeof e[Ka]?.pin=="function"}function id(e,t,n){if(!Ya(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ka].pin(t,n)}var Gx,Ka,ad=we(()=>{Gx=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ka=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Xx}from"node:crypto";function tk(e){let t=String(e||"").toLowerCase();return pd.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function nk(e){let t={};for(let[n,r]of Object.entries(e||{}))tk(n)||(t[n]=r);return t}function rk(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 ok(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function ik(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([...pd,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
|
|
2
|
+
`),c=Xx("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function ak(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,cd):Math.min(250*2**e,cd)+Math.floor(Math.random()*100)}function gr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ja(e,t,n){return gr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function yr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function ck(e){return e?e.byteLength??e.length??0:0}async function ud(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&&(yr(e),!r))throw Ja(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 Ja(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+=ck(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 Ja(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function dd(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function lk(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,y=a?{lookupFn:a}:{};if(c&&!s&&!Ya(h))throw gr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let w=async(v,{status:g=null}={})=>{let b=await Va(v,y);if(!b.ok)throw gr(g==null?`HTTP refused ${v}: ${b.error}`:`HTTP redirect to ${v} ${b.error}`,g==null?{}:{status:g});let k=new URL(v).hostname;if(s){if(m&&(await m.close(),m=null),!m)try{m=await Ga({requireUndici:!0,...u?{importUndici:u}:{}})}catch(E){throw gr(g==null?`HTTP refused ${v}: ${E?.message||E}`:`HTTP redirect to ${v} refused: ${E?.message||E}`,g==null?{}:{status:g})}m.pin(k,b.addresses),h=m.fetch}else id(h,k,b.addresses);return b};try{let v=String(e),g={...r||{}};c&&await w(v);for(let b=0;b<=ld;b+=1){let k=await h(v,{method:n,headers:g,body:o,signal:p.signal,redirect:"manual"});if(Zx.has(k.status)){if(n!=="GET"&&n!=="HEAD"){let T=await ud(k,l??ek,{url:v,truncate:!0}),q=new Error(`HTTP ${k.status} ${n} ${v} redirected non-idempotent request`);throw q.status=k.status,q.body=dd(T)??T.slice(0,300),q}if(b===ld)throw yr(k),new Error(`HTTP redirect loop for ${e}`);let _=k.headers?.get?.("location"),O;try{O=rk(_,v)}catch(T){throw yr(k),T}let N=!ok(O,v);if(yr(k),N&&(g=nk(g)),c)await w(O,{status:k.status});else if(N){let T=await Va(O,y);if(!T.ok){let q=new Error(`HTTP redirect from ${v} ${T.error}`);throw q.status=k.status,q.retryable=!1,q}s&&T.addresses?.length&&(m||(m=await Ga(u?{importUndici:u}:{})),m&&(m.pin(new URL(O).hostname,T.addresses),h=m.fetch))}v=O;continue}if(typeof d=="function")try{await d(k,{url:v})}catch(_){throw yr(k),gr(_?.message||String(_))}let E=await ud(k,l,{url:v,onOversize:()=>p.abort()}),I=dd(E);if(!k.ok){let _=new Error(`HTTP ${k.status} ${n} ${v}`);throw _.status=k.status,_.retryAfter=k.headers?.get?.("retry-after")??null,_.body=I??E.slice(0,300),_}return I??E}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.close()}}async function x(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):Qx,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 b;for(let k=0;k<=s;k++)try{return await lk(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:m,importUndici:d,validateResponse:p})}catch(E){b=E;let I=E?.status,_=E?.name==="AbortError",O=new Set([408,425,429]),N=E?.retryable===!1?!1:I!=null?O.has(I)||Jx.has(I)&&sd.has(o):!_&&sd.has(o);if(k===s||!N)throw E;await sk(ak(k,E?.retryAfter))}throw b};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let w=ik(o,e,i,{untrustedUrl:u,maxResponseBytes:m}),v=Xa.get(w);if(v)return v;let g=h().finally(()=>Xa.delete(w));return Xa.set(w,g),g}async function ge(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 Ne(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 Jx,sd,Qx,cd,pd,Zx,ld,ek,Xa,sk,L=we(()=>{ad();Jx=new Set([408,425,429,500,502,503,504]),sd=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Qx=2,cd=4e3,pd=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Zx=new Set([301,302,303,307,308]),ld=3,ek=64*1024;Xa=new Map;sk=e=>new Promise(t=>setTimeout(t,e))});function Za(e){return md.get(Number(e))||null}function fd(e,t=process.env){let n=Za(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function hd(e){return md.has(Number(e))}var Qa,md,gd=we(()=>{Qa={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}},md=new Map(Object.values(Qa).map(e=>[e.chainId,e]))});var Uo={};Wa(Uo,{PUBLIC_RPC_FALLBACKS:()=>ts,erc20Allowance:()=>os,erc20BalanceOf:()=>wr,resolveRpcUrl:()=>ns,rpcBlockNumber:()=>br,rpcCall:()=>M,rpcChainId:()=>rs,rpcGasPrice:()=>hk,rpcGetBalance:()=>Xt,rpcHealth:()=>Sn,rpcHealthAll:()=>is,transactionReceipt:()=>vr});import{Interface as uk,getAddress as dk}from"ethers";function At(e,t){try{return dk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function pk(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 es(e){return e==null?null:Number.parseInt(String(e),16)}function ns(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=fd(e,n);return r||ts[Number(e)]||null}function fk(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!mk.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 M(e,t,n=[],r={}){let o=String(t||"");fk(o);let i=ns(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 x(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 Sn(e,t={}){let n=await M(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await M(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Za(e)?.name||null}}async function br(e,t={}){let n=await M(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function rs(e,t={}){let n=await M(e,"eth_chainId",[],t);return parseInt(n,16)}async function hk(e,t={}){let n=await M(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Xt(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await M(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function os(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=At(e.token||e.tokenAddress,"token"),o=At(e.owner,"owner"),i=At(e.spender,"spender"),a=Fo.encodeFunctionData("allowance",[o,i]),s=await M(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Fo.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 wr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=At(e.token||e.tokenAddress,"token"),o=At(e.account||e.owner||e.address,"account"),i=Fo.encodeFunctionData("balanceOf",[o]),a=await M(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Fo.decodeFunctionResult("balanceOf",a),c=BigInt(s[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function vr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=pk(e.txHash||e.hash||e.transactionHash),o=await M(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=es(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?At(e.expectedTo,"expectedTo"):null,u=o.to?At(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?At(o.from,"receipt.from"):null,blockNumber:es(o.blockNumber),transactionIndex:es(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function is(e={}){let t=e.chainIds||Object.values(Qa).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!hd(r)&&!ts[r]&&!ns(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Sn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Fo,ts,mk,de=we(()=>{L();gd();Fo=new uk(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);ts={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"};mk=/^(?: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 Nk,createHmac as Ok,timingSafeEqual as pL}from"node:crypto";function ls(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ls).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${ls(e[n])}`).join(",")}}`}function Ed(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Id(e=process.env){return Ed(process.env)||Ed(e)}function $k(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function Qt(e){let t=$k(e);return Nk("sha256").update(ls(t)).digest("hex")}function Bk(e,t=Id()){return t?Ok("sha256",t).update(String(e)).digest("hex"):""}function P(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+us:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>Lk)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:Rk},f=Qt(p),m=Id(r),h=m?Bk(f,m):void 0,y={...p,prepareHash:f};return h&&(y.prepareMac=h),y}var Rk,us,Lk,K=we(()=>{Rk=2,us=300*1e3,Lk=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function GS({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"?VS:zS}async function oe(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=GS(t);return x(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _p(e={}){let t=await oe({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function ht(e={}){return oe({type:"allMids"},e)}async function _n(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return oe({type:"l2Book",coin:String(e)},t)}async function Or(e={}){return oe({type:"outcomeMeta"},e)}async function si(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return oe({type:"spotClearinghouseState",user:e},t)}async function Pp(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return oe({type:"userFills",user:e},t)}async function Cp(e={}){return oe({type:"meta"},e)}async function je(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),oe(t,e)}async function ci({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 oe(i,o)}async function Tp({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return oe({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Np(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return oe({type:"openOrders",user:e},t)}async function Op(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return oe({type:"frontendOpenOrders",user:e},t)}async function Pn(e,t={}){if(!e)throw new Error("hlUserState requires user");return oe({type:"clearinghouseState",user:e},t)}async function li(e={}){return oe({type:"spotMeta"},e)}var zS,VS,et=we(()=>{L();zS="https://api.hyperliquid.xyz/info",VS="https://api.hyperliquid-testnet.xyz/info"});async function qp(e={}){let t=Date.now();if(Mr.dexs&&t-Mr.at<6e4&&!e.fetchImpl)return Mr.dexs;let n=await oe({type:"perpDexs"},e);return Mr={at:t,dexs:Array.isArray(n)?n:[]},Mr.dexs}async function Dp(e="",t={}){let n=e||"",r=Date.now(),o=Up.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await oe({type:"metaAndAssetCtxs",dex:e},t):await je(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return Up.set(n,c),c}function Tt(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=Hp+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Ct(e,t){let n=Gs(e),r=Gs(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=Hp+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 Gs(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 Ks(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Tt(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Ct(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:rE(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=Ct(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 qp(t)).findIndex(b=>b&&b.name===l);if(f<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:m,ctxs:h}=await Dp(l,t),y=m.findIndex(b=>b.name===n||b.name===`${l}:${d}`||b.name.endsWith(`:${d}`));if(y<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let w=m[y];if(w.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let v=nE+f*1e4+y,g=h[y]||{};return{kind:"hip3",coin:w.name||n,assetId:v,szDecimals:w.szDecimals??0,maxLeverage:w.maxLeverage??null,dex:l,dexIndex:f,indexInMeta:y,markPx:g.markPx??null}}let{universe:r,ctxs:o}=await Dp("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await qp(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 Ks({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 rE(e,t){let n=Gs(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var Hp,nE,Mr,Up,hi=we(()=>{et();Hp=1e8,nE=1e5,Mr={at:0,dexs:null},Up=new Map});function ve(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function ze(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function an(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=ve(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 Ve(e,t="amount"){let n=an(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function ye(e,t,n="amount"){let r=ve(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 Cn=we(()=>{});function cE(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 Wp(e,t){let n=ve(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 ct(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=>ct(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)}:${ct(e[r],t)}`).join(",")}}`}function lE(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)||ct(n,"declared order type")!==ct({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(ct(n,"declared order type")!==ct({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||ct(n,"declared order type")!==ct({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 uE(e,t,n){let r=Wp(e.s,"signed size"),o=Wp(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=ye(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=ye(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function dE(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=Nt(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(ze(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=an(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=ye(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function jp(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(ve(e.s,"hl: signed size")!==ve(t.size,"hl: size"))throw new Error("hl: signed size must match");if(ve(e.p,"hl: signed price")!==ve(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(ct(e.t,"signed order type")!==ct(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 zp(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(ve(e.s,"hl: bracket protection size")!==ve(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(ve(e.p,"hl: bracket protection price")!==ve(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(ve(i.triggerPx,"hl: triggerPx")!==ve(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function pE(e){let t=String(e||"").replace(/\/$/,"");if(!oE.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Ys(e){return Tt(e)!=null}function mE(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(Ys(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 fE(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(Ys(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 Vp(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=Nt(n.kind,"kind",48),o=aE[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=pE(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!==sE[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(iE.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=Nt(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=Tt(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(mE(c,t),fE(c,l,t),r==="hip4-order"&&!Ys(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");lE(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");jp(u[0],n,l);let m=1;d!=null&&zp(u[m++],n,l,d,"tp"),p!=null&&zp(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");jp(u[0],n,l)}uE(u[0],n,t),dE(n,t),s=ve(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=Nt(n.usd,"margin usd",64),d=ye(u,6,"hl: margin usd");if(an(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=ye(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),m=d<0n?-d:d;if(m>f)throw new Error("hl: margin notional exceeds cap");s=cE(m,6)}}if(r==="builder-fee-approval"){let c=Nt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Nt(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=Nt(n.maxFeeRate,"maxFeeRate",32);if(Nt(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=ye(u.slice(0,-1),12,"hl: builder fee percent"),p=ye(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 oE,iE,aE,sE,Nt,Gp=we(()=>{Cn();hi();oE=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),iE=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),aE=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"}),sE=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"}),Nt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function gE(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 gi(e,t={},n={}){let r=String(e?.kind||""),o=hE[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:gE(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 Vp(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 hE,Xs=we(()=>{Gp();hE=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 yE,JsonRpcProvider as bE}from"ethers";function EE(e){return SE.test(String(e||""))}async function yi(e,{contract:t=wE,rpc:n=xE,chainId:r=vE,balanceOf:o}={}){if(!EE(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new bE(n,r,{staticNetwork:!0}),a=new yE(t,kE,i);return BigInt(await a.balanceOf(e))}var wE,vE,xE,kE,SE,Js=we(()=>{wE="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",vE=999,xE="https://rpc.hyperliquid.xyz/evm",kE=["function balanceOf(address owner) view returns (uint256)"],SE=/^0x[a-fA-F0-9]{40}$/});import{existsSync as IE,readFileSync as AE,lstatSync as _E}from"node:fs";import{homedir as Kp}from"node:os";import{join as Qs}from"node:path";function TE(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Yp,t)?Yp[t]:CE}function $E(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Xp])return String(e[Xp]);let t=e.ORACLE_CONFIG_DIR||Qs(Kp(),".config","oracle");return Qs(t,"fee-recipient")}return Qs(Kp(),".config","oracle","fee-recipient")}function Zs(e=process.env){try{let t=$E(e);if(!IE(t)||_E(t).isSymbolicLink())return"";let n=AE(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function BE(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),PE)}function ME({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[OE]||"").trim(),o=String(e[RE]||LE).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=TE(t),a=BE(e[NE],{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=Zs(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 bi({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=ME({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 yi(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Jp(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Qp(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var PE,CE,Yp,NE,OE,RE,Xp,LE,wi=we(()=>{Js();PE=100,CE=5,Yp=Object.freeze({swap:5,bridge:5,perps:0,nft:0});NE="ORACLE_INTEGRATOR_FEE_BPS",OE="ORACLE_INTEGRATOR_FEE_RECIPIENT",RE="ORACLE_INTEGRATOR_ID",Xp="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",LE="oracle"});var uc={};Wa(uc,{HL_BUILDER_ADDRESS_ENV:()=>vi,HL_BUILDER_DEFAULT_FEE_BPS:()=>FE,HL_BUILDER_FEE_ENV:()=>tc,HL_BUILDER_FEE_TIERS:()=>Fr,HL_BUILDER_MAX_FEE_BPS:()=>ec,HL_PERP_MAX_SIG_FIGS:()=>Zp,HL_PERP_PRICE_DECIMALS:()=>em,HL_SIGNATURE_CHAIN_ID:()=>rc,MARGIN_MODE:()=>Ur,ORDER_TYPES:()=>Le,TIF:()=>qr,formatPerpPrice:()=>yt,formatPerpSize:()=>om,hlBuilderFeeBpsForKind:()=>rm,hlPerpAssetInfo:()=>Ot,hlPrepareBracketOrder:()=>lc,hlPrepareBuilderApproval:()=>ac,hlPrepareCancelOrder:()=>Dr,hlPreparePerpOrder:()=>On,hlPrepareUpdateIsolatedMargin:()=>cc,hlPrepareUpdateLeverage:()=>sc,resolveBuilderFee:()=>oc});function tm(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 UE(e,t){let n=tm(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function qE(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 nm(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 rm(e="perp"){if(e==="perp"||e==="main")return Fr.perp;if(e==="spot")return Fr.spot;if(e==="hip3")return Fr.hip3;if(e==="outcome"||e==="hip4")return Fr.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function oc({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[vi]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${vi} must be an EVM address`);let o=Zs(e);if(!o||o!==r)return null;let i=e?.[tc],a=rm(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: ${tc} must be a positive number in 0.1 bps increments`);if(s>ec)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${ec} 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 DE(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 oe({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 HE(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||yi;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function ic(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 WE(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 ic(r,a,n)}function yt(e,t,n={}){let r=em-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return ic(WE(e,Zp,n),r,n)}function om(e,t){let n=ic(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 jE(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 Ot(e={},t={}){let n=await Ks(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 nc(e,{tif:t=qr.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Le.LIMIT:return{limit:{tif:t}};case Le.MARKET:return{limit:{tif:qr.IOC}};case Le.STOP_MARKET:case Le.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:yt(n,o),tpsl:e===Le.STOP_MARKET?"sl":"tp"}};case Le.STOP_LIMIT:case Le.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:yt(n,o),tpsl:e===Le.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Tn(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:rc,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 Nn(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=gi(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,P(r,{provider:e.provider||"hl-perps",kind:e.kind})}function ac(e={},t={}){let n=oc({env:t.env});if(!n)throw new Error(`hl-perps: ${vi} 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:rc,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Nn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Tn(o,r,t)},e,t)}async function On(e={},t={}){let n=await Ot(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??Le.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=nm(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=om(e.size??e.sz,n.szDecimals),s;if(r===Le.MARKET){let v=Number(n.markPx);if(!Number.isFinite(v)){let E=await ht(t);v=Number(E?.[n.coin]??E?.[String(n.assetId)]??NaN)}if(!Number.isFinite(v))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 b=o?v*(1+g/1e4):v*(1-g/1e4);s=yt(b,n.szDecimals,{roundDown:o});let k=Math.abs(Number(s)/v-1)*1e4;if(k>g+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${k.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=yt(e.price??e.limitPx,n.szDecimals)}let c=nc(r,{tif:e.tif??(r===Le.MARKET?qr.IOC:qr.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=oc({env:t.env,kind:n.kind}),p=await HE(d,e,t),f=p.exempt?null:d,m=await DE(f,e,t),h=m.approved?f:null;h&&(u.builder=h.wire);let y=Number(e.nonce??Date.now()),w=jE(a,s);return Nn({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:f&&!h?{...d.disclosure,...m}:null,...Tn(u,y,t)},e,t)}async function Dr(e={},t={}){let n=await Ot(qE(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=tm(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Nn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Tn(i,Number(e.nonce??Date.now()),t)},e,t)}async function sc(e={},t={}){let n=await Ot(e,t),r=UE(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||Ur.CROSS).toLowerCase();if(o!==Ur.CROSS&&o!==Ur.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Ur.CROSS,leverage:r};return Nn({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,...Tn(i,Number(e.nonce??Date.now()),t)},e,t)}async function cc(e={},t={}){let n=await Ot(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=ye(o,6,"hl-perps: usd"),a=nm(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Nn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Tn(s,Number(e.nonce??Date.now()),t)},e,t)}async function lc(e={},t={}){let n=await On(e,t),r=await Ot(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:yt(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:nc(Le.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:yt(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:nc(Le.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 Nn({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:yt(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:yt(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Tn(a,Number(e.nonce??Date.now()),t)},e,t)}var Zp,em,rc,FE,ec,vi,tc,Fr,Le,qr,Ur,xi=we(()=>{et();hi();Cn();K();Xs();Js();wi();Zp=5,em=6,rc="0x66eee",FE=2,ec=10,vi="ORACLE_HL_BUILDER_ADDRESS",tc="ORACLE_HL_BUILDER_FEE_BPS",Fr=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Le=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),qr=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Ur=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as pg,readFileSync as U_}from"node:fs";import{dirname as dg,join as wl}from"node:path";import{fileURLToPath as q_}from"node:url";function D_(e){let t=dg(q_(e));for(let n=0;n<8;n+=1){let r=wl(t,"package.json");if(pg(r))try{let i=JSON.parse(U_(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=dg(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function na(e,t){let n=D_(t),r=wl(n,e);return pg(r)?r:wl(n,"dist","assets",e)}var vl=we(()=>{});import{isAddress as H_}from"ethers";function j_(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:mg,tag:`v${mg}`}),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 ra(e){let t=pn[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function mo(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function fo(e,t){let n=String(e||"");if(!H_(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function fg(e,t){let n=ra(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");mo(i,"safe-erc20: supply"),fo(a,"safe-erc20: initialHolder"),fo(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(mo(i,"safe-erc721-drop: cap"),fo(a,"safe-erc721-drop: treasury"),mo(s,"safe-erc721-drop: mintPrice"),mo(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");fo(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;fo(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`)}mo(i,"safe-vesting: durationSeconds")}return n}function hg(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var mg,W_,pn,oa=we(()=>{mg="5.0.2",W_={"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"]}};pn=Object.freeze(Object.fromEntries(Object.entries(W_).map(([e,t])=>[e,j_(e,t)])))});import{spawnSync as xl}from"node:child_process";import{existsSync as mn,readFileSync as ia,readdirSync as gg,statSync as yg}from"node:fs";import{join as dt}from"node:path";import{createHash as z_}from"node:crypto";function sa(){return mn(ho)?gg(ho).filter(e=>pn[e]&&yg(dt(ho,e)).isDirectory()).map(e=>{let t=dt(ho,e),n=dt(t,"SECURITY.md");return{id:e,path:t,metadata:ra(e),securityNotice:mn(n)?ia(n,"utf8").slice(0,500):null,disclaimer:aa}}):[]}function bg(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",dt(e,".foundry/bin/forge")];for(let n of t)if(xl(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function V_(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:xl("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function Qn(e,t,n){let r=xl(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 G_(e){let t=z_("sha256");function n(r){let o=yg(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of gg(r).sort())n(dt(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(ia(r)))}return n(e),t.digest("hex")}function go(e,t={}){let n=ra(e),r=t.allowSkipStatic!==!1,o=dt(ho,e);if(!mn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=bg();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(!mn(dt(o,"lib","forge-std"))){let f=Qn(i,["install","foundry-rs/forge-std","--no-git"],o);if(!f.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
3
|
+
${f.stderr}`)}if(!mn(dt(o,"lib","openzeppelin-contracts"))){let f=Qn(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!f.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
4
|
+
${f.stderr}`)}let a=dt(o,"lib","openzeppelin-contracts","package.json"),s=mn(a)?JSON.parse(ia(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=Qn(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
5
|
+
${c.stderr}`.slice(0,2e3));let l=Qn(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=
|
|
7
|
+
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=V_();if(d){let f=Qn(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:f.ok,skipped:!1,stdout:(f.stdout||"").slice(0,1500),stderr:(f.stderr||"").slice(0,500)},!f.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
|
|
8
8
|
${f.stdout}
|
|
9
|
-
${f.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=
|
|
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=
|
|
9
|
+
${f.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=G_(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:aa,firmAudit:!1}}function wg(e,t={}){let n=go(e,t),r=bg(),o=n.path,i=Qn(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=dt(o,"out",`${a}.sol`,`${a}.json`);if(!mn(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(ia(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 ho,aa,ca=we(()=>{vl();oa();ho=na("protocols/templates",import.meta.url),aa="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 kl}from"node:crypto";import{secp256k1 as yo}from"@noble/curves/secp256k1.js";import{bech32m as kg}from"@scure/base";function Xe(e,t){throw new Error(`${e}: ${t}`)}function _g(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||Xe("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Sl(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{Xe(t,`must be an integer from ${n} to ${r}`)}}function Q_(e){let t=String(e||"");if(!t||[...t].some(o=>!Sg.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(Sg.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 Eg(e,t){let n=String(e||"").trim(),r=Q_(n);return(!r||r.length!==32)&&Xe(t,"must be a 32-byte base58 Solana public key"),n}function Ig(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||Xe(t,"must be a compressed secp256k1 public key");try{yo.Point.fromHex(n)}catch{Xe(t,"must encode a valid secp256k1 curve point")}return n}function Z_(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}Xe("bitcoin-tapscript-vault","script too large")}function Il(e,t){let n=kl("sha256").update(e).digest();return kl("sha256").update(n).update(n).update(t).digest()}function Ag(e){return Il("TapLeaf",Buffer.concat([Buffer.from([192]),Z_(e.length),e]))}function eP(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return Il("TapBranch",Buffer.concat([n,r]))}function la(e){return yo.Point.fromHex(e).x.toString(16).padStart(64,"0")}function Pg(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function tP(e,t){let n=[];return e.forEach((r,o)=>n.push(Pg(la(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function nP(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 rP(e,t){return Buffer.concat([nP(t),Buffer.from([178,117]),Pg(la(e)),Buffer.from([172])])}function oP(e,t,n){let r=yo.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${Il("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%yo.Point.Fn.ORDER,s=o.add(yo.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:kg.encode(l,[1,...kg.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function rt(e,t){return Object.freeze({path:e,content:t.endsWith(`
|
|
11
11
|
`)?t:`${t}
|
|
12
|
-
`})}function
|
|
12
|
+
`})}function iP(e){let t=kl("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 aP(e){let t=_g(e.projectName),n=Eg(e.authority,"solana-safe-vault authority"),r=Sl(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||Xe("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=Eg(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&Xe("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}");
|
|
@@ -97,16 +97,16 @@ pub enum VaultError {
|
|
|
97
97
|
#[msg("Vault has insufficient funds")] InsufficientFunds,
|
|
98
98
|
#[msg("Arithmetic overflow")] ArithmeticOverflow,
|
|
99
99
|
}
|
|
100
|
-
`,s=[
|
|
100
|
+
`,s=[rt("Anchor.toml",`[provider]
|
|
101
101
|
cluster = "${o}"
|
|
102
102
|
wallet = "~/.config/solana/id.json"
|
|
103
103
|
|
|
104
104
|
[programs.${o}]
|
|
105
105
|
${t} = "${i}"
|
|
106
|
-
`),
|
|
106
|
+
`),rt("Cargo.toml",`[workspace]
|
|
107
107
|
members = ["programs/${t}"]
|
|
108
108
|
resolver = "2"
|
|
109
|
-
`),
|
|
109
|
+
`),rt(`programs/${t}/Cargo.toml`,`[package]
|
|
110
110
|
name = "${t}"
|
|
111
111
|
version = "0.1.0"
|
|
112
112
|
edition = "2021"
|
|
@@ -122,28 +122,28 @@ default = []
|
|
|
122
122
|
|
|
123
123
|
[dependencies]
|
|
124
124
|
anchor-lang = "0.31.1"
|
|
125
|
-
`),
|
|
125
|
+
`),rt(`programs/${t}/src/lib.rs`,a),rt(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
|
|
126
126
|
// 1. initialize with ${r} slots; 2. deposit; 3. reject early withdrawal;
|
|
127
127
|
// 4. advance slots; 5. withdraw as authority; 6. reject non-authority.
|
|
128
|
-
`),
|
|
128
|
+
`),rt("SECURITY.md",`# Security model
|
|
129
129
|
|
|
130
130
|
- Initial and permanent withdrawal authority: \`${n}\`
|
|
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:
|
|
134
|
+
`)];return{family:"solana",network:o,projectName:t,protocolModel:ua["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:El},deploymentPrepared:!1}}function sP(e){let t=_g(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||Xe("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,v)=>Ig(w,`signerPubkeys[${v}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&Xe("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Sl(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=Ig(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&Xe("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=Sl(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(la).join(",")})`,c=`and_v(v:older(${a}),pk(${la(i)}))`,l=`taproot_tree(${s},${c})`,u=tP(r,o),d=rP(i,Number(a)),p=eP(Ag(u),Ag(d)),f=oP(r[0],p,n),m=`tr(${f.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:m,address:f.address,scriptPubKey:f.scriptPubKey},y=[rt("policy/miniscript.txt",l),rt("policy/descriptor.txt",m),rt("policy/manifest.json",JSON.stringify(h,null,2)),rt("tests/policy-vectors.json",JSON.stringify({cooperative:{requiredSignatures:o,csvBlocks:0,expected:"spendable"},insufficientCooperative:{requiredSignatures:Math.max(0,o-1),csvBlocks:0,expected:"rejected"},earlyRecovery:{recoverySignature:!0,csvBlocks:Math.max(0,Number(a)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(a),expected:"spendable"}},null,2)),rt("SECURITY.md",`# Security model
|
|
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:la["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:y,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:El},psbtPrepared:!1,fundingPrepared:!1}}function yo(){return Object.values(la).map(e=>({...e,disclaimer:El}))}async function bo(e={}){let t=String(e.templateId||"").trim(),n=la[t];n||Ye("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?iP(e):aP(e),o=oP(r.files);return P({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 El,kg,la,Al=we(()=>{K();El="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",kg="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",la=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 Mx={};Ha(Mx,{CONTRACTS_EVAL_HERE:()=>LR,runContractsEval:()=>RR});import Da from"node:fs";import Vt from"node:path";import{spawnSync as vR}from"node:child_process";import{fileURLToPath as xR}from"node:url";function CR(){let e=process.env.HOME||"";for(let t of["forge",Vt.join(e,".foundry/bin/forge")])if(vR(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function Bx(e,t=[]){if(!Da.existsSync(e))return t;for(let n of Da.readdirSync(e)){let r=Vt.join(e,n);if(Da.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;Bx(r,t)}else n.endsWith(".sol")&&!r.includes(`${Vt.sep}lib${Vt.sep}`)&&t.push(r)}return t}function TR(){let e=[];for(let t of Object.keys(dn)){let n=Vt.join(kR,t),r=Bx(Vt.join(n,"src")),o=[];for(let i of r){let a=Da.readFileSync(i,"utf8");for(let s of SR)s.test(a)&&o.push(`${Vt.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function NR(){return CR()?Object.keys(dn).map(e=>{try{let t=ho(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(dn).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function OR(){let e=[],t=yo();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 bo({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:ER,programId:IR,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 bo({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[AR,_R],recoveryPubkey:PR,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 RR(){let e=TR(),t=NR(),n=await OR(),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 kR,SR,ER,IR,AR,_R,PR,LR,Fx=we(()=>{ra();sa();Al();vl();kR=ta("protocols/templates",import.meta.url),SR=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],ER="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",IR="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",AR="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",_R="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",PR="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";LR=Vt.dirname(xR(import.meta.url))});de();import{Interface as _d,getAddress as kr,isAddress as Bk}from"ethers";L();var hk="https://api.dexscreener.com",gk=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Je=e=>String(e??"").toLowerCase(),yk=e=>Array.isArray(e)?e:e==null?[]:[e];function bk(e,t,n){let r=Je(t),o=Je(n),i=Je(e?.baseToken?.address),a=Je(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function wk(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Uo(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||hk).replace(/\/$/,"")}async function yd(e={}){let n=(await x(`${Uo(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Xt(e,t={}){if(!e)throw new Error("tokenAddress required");return x(`${Uo(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function vr(e,t={}){if(!e)throw new Error("query required");return x(`${Uo(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function bd(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return x(`${Uo(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function xr({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Je(gk[Number(e)]||e),a=new Set(yk(r).filter(Boolean).map(Je)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>Xt(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=`${Je(f?.chainId)}:${Je(f?.dexId)}:${Je(f?.pairAddress)}`;l.has(m)||(l.add(m),u.push(f))}return u.filter(p=>Je(p?.chainId)===i).filter(p=>bk(p,t,n)).filter(p=>!a.size||a.has(Je(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:wk(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)[0]??null}import{createHash as Ek,createHmac as xd,timingSafeEqual as Ik}from"node:crypto";import{readFileSync as xk}from"node:fs";import{homedir as kk}from"node:os";import{join as qo}from"node:path";function Sk(){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=kk();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||qo(t,".config","oracle")).trim();return[e,qo(n,"exec.env")].filter(Boolean)}return[e,qo(t,".config","oracle","exec.env"),qo(t,".config","mad-desk","exec.env")].filter(Boolean)}function wd(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Sk())try{let i=xk(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 Do=100,vd=2e4;function Ho(e){return Array.isArray(e)?`[${e.map(Ho).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ho(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function kd(e,{required:t=!1}={}){try{return wd(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function as(e){let{signature:t,...n}=e;return n}function Sd(e,{secret:t}={}){let n=kd(t);return n?{...e,signature:xd("sha256",n).update(Ho(as(e))).digest("hex")}:e}function Ak(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 Ek("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ue(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=kd(o);if(i){let f=xd("sha256",i).update(Ho(as(e))).digest("hex");if(!_k(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>Do||!Number.isInteger(s)||s<0||s>Do||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=Ck(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 Sd({...as(e),calldataHash:Ak(r)},{secret:o})}function _k(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:Ik(n,r)}function is(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Pk(e){let t=e==null?Do: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,Do)}function Oe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=is(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(is(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,is(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=Pk(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function ss({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=vd,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Oe({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)||vd)),h=d*BigInt(1e4-p.selectedBps),y=h/10000n;if(h%10000n!==0n&&(y+=1n),y>d&&(y=d),d>0n&&y<=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-y)*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 Sd({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:y.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:u})}function Ck(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 ee(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=ss({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}}K();var Be={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"}},Mk=[100,500,3e3,1e4],Wo=new _d(["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)"]),Ad=new _d(["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)"]),Pd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Cd="0x0000000000000000000000000000000000000000",us=[100,500,2500,1e4],Fk={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:us}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:us}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:us}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function ps(e,t){let n=Number(e),r=Be[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(Be).join(", ")})`);let o=Fk[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 ds(e,t){let n=Be[Number(t)];if(!e||e===Pd||e===Cd||/^eth$/i.test(String(e)))return kr(n.weth);let r=String(e);if(/^weth$/i.test(r))return kr(n.weth);if(/^usdc$/i.test(r))return kr(n.usdc);if(!Bk(r))throw new Error(`invalid token address: ${e}`);return kr(r)}function Uk(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 qk(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 Sn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=ps(e.chainId??8453,e.venue),a=ds(e.tokenIn||"WETH",n),s=ds(e.tokenOut||Be[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:Mk,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let h of u){let y=Wo.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:h,sqrtPriceLimitX96:0n}]);try{let w=await M(n,"eth_call",[{to:r,data:y},"latest"],t);if(!w||w==="0x"){d.push({fee:h,ok:!1,error:"empty result"});continue}let v=Wo.decodeFunctionResult("quoteExactInputSingle",w),g={fee:h,ok:!0,amountOut:v[0].toString(),sqrtPriceX96After:v[1].toString(),initializedTicksCrossed:Number(v[2]),gasEstimate:v[3].toString()};d.push(g),(!p||BigInt(g.amountOut)>BigInt(p.amountOut))&&(p=g)}catch(w){d.push({fee:h,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!p){let h=d.map(y=>`${y.fee}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await xr({chainId:n,tokenA:a,tokenB:s,dexIds:Uk(e.venue)},t).catch(()=>null):null,m=e.liquidityUsd??f?.liquidityUsd??null;return ee({venue:"uniswap-v3",chainId:n,chain:Be[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:m,liquiditySource:f,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:m,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Td(e={},t={}){let{chainId:n,quoter:r,router:o}=ps(e.chainId??8453),i=(e.tokens||[]).map(p=>ds(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=qk(i,a),l=Wo.encodeFunctionData("quoteExactInput",[c,s]),u=await M(n,"eth_call",[{to:r,data:l},"latest"],t),d=Wo.decodeFunctionResult("quoteExactInput",u);return ee({venue:"uniswap-v3",chainId:n,chain:Be[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 ms(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Sn({chainId:n,tokenIn:Be[n].weth,tokenOut:Be[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Nd(e={},t={}){let n=Number(e.chainId??8453),r=ps(n,e.venue),o=kr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Pd||i===Cd||/^eth$/i.test(i),s=await Sn(e,t),c=Ad.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=Ad.encodeFunctionData("multicall",[d,[c]]);return P({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:ue(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Od(e={}){let t=Number(e.chainId??8453);try{let n=await ms({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 Rd(){return Object.entries(Be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}de();import{AbiCoder as Hk,Interface as Ld,getAddress as it,isAddress as Vo,keccak256 as Wk}from"ethers";K();var jk=Hk.defaultAbiCoder(),Qt="0x0000000000000000000000000000000000000000",at={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"}},$d=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],jo=new Ld(["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)"]),SL=new Ld(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var zk="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function fs(e){let t=Number(e),n=at[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(at).join(", ")})`);return{chainId:t,...n}}function zo(e,t){let n=at[Number(t)];if(!e||e===zk||e===Qt||/^eth$/i.test(String(e)))return it(n.weth);let r=String(e);if(/^weth$/i.test(r))return it(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return it(n.usdc);if(!Vo(r))throw new Error(`invalid token address: ${e}`);return it(r)}function Bd({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Qt}){let i=it(e),a=it(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=o&&Vo(o)?it(o):Qt;return Wk(jk.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Md({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Qt}){let i=it(e),a=it(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&Vo(o)?it(o):Qt},zeroForOne:l}}var Fd=["uniswap-v4","uniswapv4"];async function Go(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=fs(e.chainId??8453),a=zo(e.tokenIn||"WETH",n),s=zo(e.tokenOut||at[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}]:[...$d],u=e.hooks||Qt,d=[],p=null;for(let h of l){let{poolKey:y,zeroForOne:w}=Md({tokenIn:a,tokenOut:s,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),v=jo.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let g=await(t.rpcCall||M)(n,"eth_call",[{to:r,data:v},"latest"],t);if(!g||g==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let b=jo.decodeFunctionResult("quoteExactInputSingle",g),k={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:b[0].toString(),gasEstimate:b[1].toString(),poolKey:y,zeroForOne:w,poolId:Bd({...y})};d.push(k),(!p||BigInt(k.amountOut)>BigInt(p.amountOut))&&(p=k)}catch(g){d.push({...h,ok:!1,error:String(g.message||g).slice(0,160)})}}if(!p){let h=d.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await xr({chainId:n,tokenA:a,tokenB:s,dexIds:Fd},t).catch(()=>null):null,m=e.liquidityUsd??f?.liquidityUsd??null;return ee({venue:"uniswap-v4",chainId:n,chain:at[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:m,liquiditySource:f,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Vo(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:m,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ud(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=fs(e.chainId??8453),a=zo(e.tokenIn||"WETH",n),s=zo(e.tokenOut||at[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}]:[...$d],u=e.hooks||Qt,d=[],p=null;for(let m of l){let{poolKey:h,zeroForOne:y}=Md({tokenIn:a,tokenOut:s,fee:m.fee,tickSpacing:m.tickSpacing,hooks:u}),w=jo.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:y,exactAmount:c,hookData:"0x"}]);try{let v=await(t.rpcCall||M)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!v||v==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let g=jo.decodeFunctionResult("quoteExactOutputSingle",v),b={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:g[0].toString(),gasEstimate:g[1].toString(),poolKey:h,zeroForOne:y,poolId:Bd({...h})};d.push(b),(!p||BigInt(b.amountIn)<BigInt(p.amountIn))&&(p=b)}catch(v){d.push({...m,ok:!1,error:String(v.message||v).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 xr({chainId:n,tokenA:a,tokenB:s,dexIds:Fd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:at[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 qd(){return Object.entries(at).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 Dd(e={}){let t=fs(e.chainId??8453),n=await M(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}L();import{readFileSync as Xk,existsSync as Jk}from"node:fs";import{getAddress as Qk,Interface as Yo,TypedDataEncoder as bs,parseUnits as Zk}from"ethers";var Hd="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Qe({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:Wd(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([Wd(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[Hd]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Hd}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Wd(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function He(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}K();var Gk=/^(0|[1-9][0-9]*)$/,hs=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function Zt(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(!Gk.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 Kk(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function Yk(e={}){return e.maxFeePerGas!=null?Zt(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Zt(e.gasPrice,"gasPrice"):null}function gs(e={}){try{let t=Kk(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Zt(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=Zt(n.gasLimit??n.gas,"gasLimit"),s=Yk(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=Zt(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Zt(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Zt(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 jd(e={}){let t=gs(e);if(!t.ok)throw new hs(t);return t}var eS="https://api.opensea.io/api/v2",tS="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)",nS=new Yo([`function ${tS}`]),Ko=new Yo(["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"]),rS=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"]),oS=new Set(rS),Xd=new Set(["solana","flow"]),Sr="0x0000000000000000000000000000000000000000";function iS(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Jk(e))return"";try{for(let t of Xk(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 mt(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||iS()}function Jd(e={}){return Qe({provider:"opensea",defaultUrl:eS,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function en(e={}){return Jd(e).baseUrl}function tn(e={}){return He({accept:"application/json"},{"x-api-key":mt(e)},Jd(e).trusted)}function Qd(e){let t=String(e||"ethereum").trim().toLowerCase();if(!oS.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function z(e,t="address"){try{return Qk(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Zd(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Xd.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return z(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 aS(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 sS(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 zd(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 cS(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 ep(e={}){if(!mt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Ir("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 Ir(e,t={}){if(!e)throw new Error("collection slug required");if(!mt(t))throw new Error("OPENSEA_API_KEY required");return x(`${en(t)}/collections/${encodeURIComponent(e)}`,{headers:tn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function tp(e,t={}){let n=await Ir(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 Ar(e={},t={}){if(!mt(t))throw new Error("OPENSEA_API_KEY required");let n=Qd(e.chain),r=Zd(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(`${en(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 x(l.toString(),{headers:tn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(cS(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 Xo(e={},t={}){if(!mt(t))throw new Error("OPENSEA_API_KEY required");let n=Zd(e.address||e.owner),r=await x(`${en(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:tn(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 Jo=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 _r(e){let t=String(e||"").trim().toLowerCase(),n=Jo[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Re(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 lS(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 Er(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function np(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 rp(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 uS(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function dS(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=z(e?.token,t);if(n===0&&r!==Sr)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Sr)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function pS(e,t){let n=Re(e?.startAmount,`${t} startAmount`),r=Re(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 ys(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(uS);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=dS(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+=pS(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var mS=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 Me(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Vd(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 op(e,t){return{itemType:Number(Me(e?.itemType,`${t} itemType`)),token:z(e?.token,`${t} token`),identifierOrCriteria:Me(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Me(e?.startAmount,`${t} startAmount`),endAmount:Me(e?.endAmount,`${t} endAmount`)}}function fS(e,t){return{...op(e,t),recipient:z(e?.recipient,`${t} recipient`)}}function hS(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:z(e.offerer,`${t} offerer`),zone:z(e.zone,`${t} zone`),offer:n.map((o,i)=>op(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>fS(o,`${t} consideration[${i}]`)),orderType:Number(Me(e.orderType,`${t} orderType`)),startTime:Me(e.startTime,`${t} startTime`),endTime:Me(e.endTime,`${t} endTime`),zoneHash:Vd(e.zoneHash,`${t} zoneHash`),salt:Me(e.salt,`${t} salt`),conduitKey:Vd(e.conduitKey,`${t} conduitKey`),counter:Me(e.counter,`${t} counter`)}}function ip(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=hS(t,n);if(bs.hashStruct("OrderComponents",mS,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function ap(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=z(e?.token,`${t} contract`),o=Er(e?.identifierOrCriteria),i=Re(e?.startAmount,`${t} startAmount`,{positive:!0}),a=Re(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 gS(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 ap(r[0],`${t} offer NFT`)}function yS(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=ap(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 bS(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&z(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 wS(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 sp(e,t,n,r){let o=Me(t?.startTime,`${r} startTime`),i=Me(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=rp(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&wS(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function vS(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(Jo[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=gS(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;bS(e.asset,s,c,"listing");let l=Re(e.price?.current?.value,"listing price",{positive:!0}),u=ip(e,i,"listing"),d=ys(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:z(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:sp(e,i,n,"listing"),counter:Me(i?.counter,"listing counter")}}async function ws(e={},t={}){if(!mt(t))throw new Error("OPENSEA_API_KEY required");let n=_r(e.chain);n.contract=e.contract?z(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(`${en(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await x(i.toString(),{headers:tn(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=>vS(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Qo(e={},t={}){let n=Er(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 ws({...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 xS(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=yS(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Re(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=ys(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=ys(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:ip(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:z(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:sp(e,i,r,"offer"),counter:Me(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Zo(e={},t={}){if(!mt(t))throw new Error("OPENSEA_API_KEY required");let n=_r(e.chain);n.contract=e.contract?z(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Er(e.tokenId),i=await x(`${en(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:tn(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 xS(a,n,o,s)}function kS(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 cp(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"&&cp(n))}function lp(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function up(e){return!e||typeof e!="object"?!1:lp(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&up(t))}function dp(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"&&dp(o,t,n);return t}function Gd(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function pp(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(lp(e))throw new Error("opensea: signed transaction material refused");if((e.from?z(Gd(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=z(Gd(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=nS.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=lS(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function ei(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 vs(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}=ei(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(()=>(de(),Fo)),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(()=>(de(),Fo)),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 SS(e,t){if(cp(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(up(e))throw new Error("opensea: signed transaction material refused");let n=dp(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=>pp(r,t))}function ES(e,t,n={}){return P({...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 mp(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function fp(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function IS(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=z(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function ti(e={},t={}){if(!mt(t))throw new Error("OPENSEA_API_KEY required");kS(e);let{chain:n,chainId:r}=_r(e.chain),o=z(e.buyer||e.minter||e.address,"buyer"),i=z(e.contract,"NFT contract"),a=np(e.quantity),s=Re(e.priceWei,"priceWei"),c=Re(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=rp(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 Ir(d,t),f=IS(p,n,i),m=s*BigInt(a);if(m>c)throw new Error("opensea: mint total exceeds total cap");let h=await x(`${en(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:tn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),y=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(y)?y:y?[y]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let v=new Set(w.map(R=>z(R,"SeaDrop mint target"))),g=SS(h,{buyer:o,chainId:r,targets:v});if(g.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let b,k,E=null,I;try{b=Ko.decodeFunctionData("mintPublic",g[0].data),k="public",I=Ko.encodeFunctionData("mintPublic",[b[0],b[1],b[2],b[3]])}catch{try{b=Ko.decodeFunctionData("mintAllowList",g[0].data),k="allowlist";let R=b[4],H=[...b[5]].map(String);if(H.length<1||H.length>64||H.some(xe=>!/^0x[0-9a-fA-F]{64}$/.test(xe)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let U=BigInt(R.startTime),Q=BigInt(R.endTime),be=BigInt(Math.floor(l/1e3));if(U>be||Q<=be)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(R.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(R.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");I=Ko.encodeFunctionData("mintAllowList",[b[0],b[1],b[2],b[3],R,H]),E={mintPrice:BigInt(R.mintPrice).toString(),maxTotalMintableByWallet:BigInt(R.maxTotalMintableByWallet).toString(),startTime:U.toString(),endTime:Q.toString(),dropStageIndex:BigInt(R.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(R.maxTokenSupplyForStage).toString(),feeBps:Number(R.feeBps),restrictFeeRecipients:!!R.restrictFeeRecipients,proof:H}}catch(R){throw/opensea:/.test(String(R?.message||""))?R:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let _=z(b[0],"mint NFT contract"),O=z(b[1],"mint fee recipient"),N=z(b[2],"mint recipient");if(_!==f)throw new Error("opensea: mint calldata collection mismatch");if(N!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(b[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(I.toLowerCase()!==g[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=g.reduce((R,H)=>R+H.valueWei,0n);if(T!==m)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(T>c)throw new Error("opensea: mint total exceeds total cap");let q=await vs(g,r,{...t,provider:e.provider||t.provider});if(q.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let se=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},Z=jd({chainId:r,tx:g[0],policy:se});return ES({action:"mint",mintType:k,...E?{stage:E}:{},chain:n,chainId:r,slug:d,buyer:o,contract:f,quantity:a,priceWei:s.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:g[0].to,feeRecipient:O,expiry:u,transactions:g.map(ei),gasWar:Z,...q},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+ls,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function AS(e={}){let t=Qd(e.chain);if(Xd.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?zd(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=zd(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:z(e.contract,"NFT contract"),token_id:o,quantity:sS(e.quantity??1,"quantity"),price:{amount:aS(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:z(e.price?.currency??e.currency??Sr,"price currency")},start_time:n.text,end_time:r.text}}var En={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"}]},Kd=new Yo(["function setApprovalForAll(address operator,bool approved)"]),_S=new Yo(["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 Yd(e,t){return e?.[t]||(e?.action===t?e:null)}function PS(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(g=>Yd(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=z(c.verifyingContract,"listing protocol"),u=s.message;if(z(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(z(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||z(g.token,"listing payment token")!==Sr)throw new Error("opensea: executable listings currently require native fixed-price consideration");let b=BigInt(g.startAmount),k=BigInt(g.endAmount);if(b<=0n||b!==k)throw new Error("opensea: listing consideration must be fixed and positive");z(g.recipient,"listing consideration recipient"),p+=b}let f=Zk(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 y=bs.hashStruct("OrderComponents",En,u),w=o.map(g=>Yd(g,"itemApprovalAction")).find(Boolean)||o.find(g=>/setApprovalForAll/i.test(String(g?.action||""))),v=null;if(w){let g=w.transaction||w.itemApprovalAction?.transaction,b=pp(g,{buyer:t,chainId:r,targets:new Set([n.contract])}),k;try{k=Kd.decodeFunctionData("setApprovalForAll",b.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=z(k[0],"listing approval operator");if(k[1]!==!0||b.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(Kd.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==b.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");v={...b,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:En,primaryType:"OrderComponents",message:u},orderHash:y,priceWei:p,approval:v}}async function ni(e={},t={}){if(!mt(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=z(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(AS);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=z(e.taker,"taker"));let c=await x(`${en(t)}/listings/actions`,{method:"POST",headers:tn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=_r(o[0].chain),u=PS(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await vs(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return P({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(ei),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 hp(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=_r(e.chain),o=z(e.seller||e.address||e.owner,"seller"),i=z(e.protocolAddress,"reviewed Seaport protocol address"),a=z(e.contract,"NFT contract"),s=Er(e.tokenId),c=np(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[_,O]of Object.entries(En)){let N=l.types?.[_];if(!Array.isArray(N)||N.length!==O.length||N.some((T,q)=>T?.name!==O[q].name||T?.type!==O[q].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(_=>_!=="EIP712Domain").sort().join(",")!==Object.keys(En).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=z(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let f=l.message;if(z(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(z(m.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Er(m.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=Re(m.startAmount,"cancellation offer startAmount",{positive:!0}),y=Re(m.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||y!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let _ of f.consideration){if(Number(_.itemType)!==0||z(_.token,"cancellation payment token")!==Sr)throw new Error("opensea: cancellation requires native fixed-price consideration");let O=Re(_.startAmount,"cancellation consideration startAmount",{positive:!0}),N=Re(_.endAmount,"cancellation consideration endAmount",{positive:!0});if(O!==N)throw new Error("opensea: cancellation consideration must be fixed and positive");z(_.recipient,"cancellation consideration recipient")}let w=Re(f.startTime,"cancellation startTime");if(Re(f.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let g=bs.hashStruct("OrderComponents",En,f),b=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(b)||b!==g.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let k=_S.encodeFunctionData("cancel",[[f]]),E=[{from:o,to:p,data:k,value:"0x0",valueWei:0n,chainId:r}],I=await vs(E,r,{...t,provider:e.provider||t.provider});if(I.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return P({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:En,primaryType:"OrderComponents",message:f},transactions:E.map(ei),...I,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}de();var ri=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"}),j=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),TS=/^0x[0-9a-fA-F]{40}$/;function NS(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}TS.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))ri.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 OS(e){let{ok:t,errors:n,warnings:r}=NS(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
140
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:ua["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:y,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:El},psbtPrepared:!1,fundingPrepared:!1}}function bo(){return Object.values(ua).map(e=>({...e,disclaimer:El}))}async function wo(e={}){let t=String(e.templateId||"").trim(),n=ua[t];n||Xe("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?aP(e):sP(e),o=iP(r.files);return P({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 El,Sg,ua,Al=we(()=>{K();El="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",Sg="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",ua=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 Fx={};Wa(Fx,{CONTRACTS_EVAL_HERE:()=>$R,runContractsEval:()=>LR});import Ha from"node:fs";import Gt from"node:path";import{spawnSync as xR}from"node:child_process";import{fileURLToPath as kR}from"node:url";function TR(){let e=process.env.HOME||"";for(let t of["forge",Gt.join(e,".foundry/bin/forge")])if(xR(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function Mx(e,t=[]){if(!Ha.existsSync(e))return t;for(let n of Ha.readdirSync(e)){let r=Gt.join(e,n);if(Ha.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;Mx(r,t)}else n.endsWith(".sol")&&!r.includes(`${Gt.sep}lib${Gt.sep}`)&&t.push(r)}return t}function NR(){let e=[];for(let t of Object.keys(pn)){let n=Gt.join(SR,t),r=Mx(Gt.join(n,"src")),o=[];for(let i of r){let a=Ha.readFileSync(i,"utf8");for(let s of ER)s.test(a)&&o.push(`${Gt.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function OR(){return TR()?Object.keys(pn).map(e=>{try{let t=go(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(pn).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function RR(){let e=[],t=bo();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 wo({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:IR,programId:AR,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 wo({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[_R,PR],recoveryPubkey:CR,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 LR(){let e=NR(),t=OR(),n=await RR(),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 SR,ER,IR,AR,_R,PR,CR,$R,Ux=we(()=>{oa();ca();Al();vl();SR=na("protocols/templates",import.meta.url),ER=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],IR="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",AR="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",_R="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",PR="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",CR="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";$R=Gt.dirname(kR(import.meta.url))});de();import{Interface as _d,getAddress as Sr,isAddress as Mk}from"ethers";L();var gk="https://api.dexscreener.com",yk=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Qe=e=>String(e??"").toLowerCase(),bk=e=>Array.isArray(e)?e:e==null?[]:[e];function wk(e,t,n){let r=Qe(t),o=Qe(n),i=Qe(e?.baseToken?.address),a=Qe(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function vk(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function qo(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||gk).replace(/\/$/,"")}async function yd(e={}){let n=(await x(`${qo(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Jt(e,t={}){if(!e)throw new Error("tokenAddress required");return x(`${qo(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function xr(e,t={}){if(!e)throw new Error("query required");return x(`${qo(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function bd(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return x(`${qo(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function kr({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Qe(yk[Number(e)]||e),a=new Set(bk(r).filter(Boolean).map(Qe)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>Jt(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=`${Qe(f?.chainId)}:${Qe(f?.dexId)}:${Qe(f?.pairAddress)}`;l.has(m)||(l.add(m),u.push(f))}return u.filter(p=>Qe(p?.chainId)===i).filter(p=>wk(p,t,n)).filter(p=>!a.size||a.has(Qe(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:vk(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)[0]??null}import{createHash as Ik,createHmac as xd,timingSafeEqual as Ak}from"node:crypto";import{readFileSync as kk}from"node:fs";import{homedir as Sk}from"node:os";import{join as Do}from"node:path";function Ek(){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=Sk();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Do(t,".config","oracle")).trim();return[e,Do(n,"exec.env")].filter(Boolean)}return[e,Do(t,".config","oracle","exec.env"),Do(t,".config","mad-desk","exec.env")].filter(Boolean)}function wd(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Ek())try{let i=kk(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 Ho=100,vd=2e4;function Wo(e){return Array.isArray(e)?`[${e.map(Wo).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Wo(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function kd(e,{required:t=!1}={}){try{return wd(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function ss(e){let{signature:t,...n}=e;return n}function Sd(e,{secret:t}={}){let n=kd(t);return n?{...e,signature:xd("sha256",n).update(Wo(ss(e))).digest("hex")}:e}function _k(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 Ik("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ue(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=kd(o);if(i){let f=xd("sha256",i).update(Wo(ss(e))).digest("hex");if(!Pk(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>Ho||!Number.isInteger(s)||s<0||s>Ho||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=Tk(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 Sd({...ss(e),calldataHash:_k(r)},{secret:o})}function Pk(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:Ak(n,r)}function as(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Ck(e){let t=e==null?Ho: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,Ho)}function Oe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=as(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(as(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,as(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=Ck(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function cs({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=vd,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Oe({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)||vd)),h=d*BigInt(1e4-p.selectedBps),y=h/10000n;if(h%10000n!==0n&&(y+=1n),y>d&&(y=d),d>0n&&y<=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-y)*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 Sd({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:y.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:u})}function Tk(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 ee(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=cs({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}}K();var Be={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"}},Fk=[100,500,3e3,1e4],jo=new _d(["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)"]),Ad=new _d(["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)"]),Pd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Cd="0x0000000000000000000000000000000000000000",ds=[100,500,2500,1e4],Uk={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ds}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ds}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ds}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function ms(e,t){let n=Number(e),r=Be[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(Be).join(", ")})`);let o=Uk[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 ps(e,t){let n=Be[Number(t)];if(!e||e===Pd||e===Cd||/^eth$/i.test(String(e)))return Sr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Sr(n.weth);if(/^usdc$/i.test(r))return Sr(n.usdc);if(!Mk(r))throw new Error(`invalid token address: ${e}`);return Sr(r)}function qk(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 Dk(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 En(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=ms(e.chainId??8453,e.venue),a=ps(e.tokenIn||"WETH",n),s=ps(e.tokenOut||Be[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:Fk,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let h of u){let y=jo.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:h,sqrtPriceLimitX96:0n}]);try{let w=await M(n,"eth_call",[{to:r,data:y},"latest"],t);if(!w||w==="0x"){d.push({fee:h,ok:!1,error:"empty result"});continue}let v=jo.decodeFunctionResult("quoteExactInputSingle",w),g={fee:h,ok:!0,amountOut:v[0].toString(),sqrtPriceX96After:v[1].toString(),initializedTicksCrossed:Number(v[2]),gasEstimate:v[3].toString()};d.push(g),(!p||BigInt(g.amountOut)>BigInt(p.amountOut))&&(p=g)}catch(w){d.push({fee:h,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!p){let h=d.map(y=>`${y.fee}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await kr({chainId:n,tokenA:a,tokenB:s,dexIds:qk(e.venue)},t).catch(()=>null):null,m=e.liquidityUsd??f?.liquidityUsd??null;return ee({venue:"uniswap-v3",chainId:n,chain:Be[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:m,liquiditySource:f,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:m,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Td(e={},t={}){let{chainId:n,quoter:r,router:o}=ms(e.chainId??8453),i=(e.tokens||[]).map(p=>ps(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=Dk(i,a),l=jo.encodeFunctionData("quoteExactInput",[c,s]),u=await M(n,"eth_call",[{to:r,data:l},"latest"],t),d=jo.decodeFunctionResult("quoteExactInput",u);return ee({venue:"uniswap-v3",chainId:n,chain:Be[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 fs(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await En({chainId:n,tokenIn:Be[n].weth,tokenOut:Be[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Nd(e={},t={}){let n=Number(e.chainId??8453),r=ms(n,e.venue),o=Sr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Pd||i===Cd||/^eth$/i.test(i),s=await En(e,t),c=Ad.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=Ad.encodeFunctionData("multicall",[d,[c]]);return P({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:ue(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Od(e={}){let t=Number(e.chainId??8453);try{let n=await fs({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 Rd(){return Object.entries(Be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}de();import{AbiCoder as Wk,Interface as Ld,getAddress as at,isAddress as Go,keccak256 as jk}from"ethers";K();var zk=Wk.defaultAbiCoder(),Zt="0x0000000000000000000000000000000000000000",st={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"}},$d=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],zo=new Ld(["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)"]),EL=new Ld(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var Vk="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function hs(e){let t=Number(e),n=st[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(st).join(", ")})`);return{chainId:t,...n}}function Vo(e,t){let n=st[Number(t)];if(!e||e===Vk||e===Zt||/^eth$/i.test(String(e)))return at(n.weth);let r=String(e);if(/^weth$/i.test(r))return at(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return at(n.usdc);if(!Go(r))throw new Error(`invalid token address: ${e}`);return at(r)}function Bd({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Zt}){let i=at(e),a=at(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=o&&Go(o)?at(o):Zt;return jk(zk.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Md({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Zt}){let i=at(e),a=at(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&Go(o)?at(o):Zt},zeroForOne:l}}var Fd=["uniswap-v4","uniswapv4"];async function Ko(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=hs(e.chainId??8453),a=Vo(e.tokenIn||"WETH",n),s=Vo(e.tokenOut||st[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}]:[...$d],u=e.hooks||Zt,d=[],p=null;for(let h of l){let{poolKey:y,zeroForOne:w}=Md({tokenIn:a,tokenOut:s,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),v=zo.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let g=await(t.rpcCall||M)(n,"eth_call",[{to:r,data:v},"latest"],t);if(!g||g==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let b=zo.decodeFunctionResult("quoteExactInputSingle",g),k={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:b[0].toString(),gasEstimate:b[1].toString(),poolKey:y,zeroForOne:w,poolId:Bd({...y})};d.push(k),(!p||BigInt(k.amountOut)>BigInt(p.amountOut))&&(p=k)}catch(g){d.push({...h,ok:!1,error:String(g.message||g).slice(0,160)})}}if(!p){let h=d.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await kr({chainId:n,tokenA:a,tokenB:s,dexIds:Fd},t).catch(()=>null):null,m=e.liquidityUsd??f?.liquidityUsd??null;return ee({venue:"uniswap-v4",chainId:n,chain:st[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:m,liquiditySource:f,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Go(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:m,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ud(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=hs(e.chainId??8453),a=Vo(e.tokenIn||"WETH",n),s=Vo(e.tokenOut||st[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}]:[...$d],u=e.hooks||Zt,d=[],p=null;for(let m of l){let{poolKey:h,zeroForOne:y}=Md({tokenIn:a,tokenOut:s,fee:m.fee,tickSpacing:m.tickSpacing,hooks:u}),w=zo.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:y,exactAmount:c,hookData:"0x"}]);try{let v=await(t.rpcCall||M)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!v||v==="0x"){d.push({...m,ok:!1,error:"empty result"});continue}let g=zo.decodeFunctionResult("quoteExactOutputSingle",v),b={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:g[0].toString(),gasEstimate:g[1].toString(),poolKey:h,zeroForOne:y,poolId:Bd({...h})};d.push(b),(!p||BigInt(b.amountIn)<BigInt(p.amountIn))&&(p=b)}catch(v){d.push({...m,ok:!1,error:String(v.message||v).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 kr({chainId:n,tokenA:a,tokenB:s,dexIds:Fd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:st[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 qd(){return Object.entries(st).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 Dd(e={}){let t=hs(e.chainId??8453),n=await M(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}L();import{readFileSync as Jk,existsSync as Qk}from"node:fs";import{getAddress as Zk,Interface as Xo,TypedDataEncoder as ws,parseUnits as eS}from"ethers";var Hd="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:Wd(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([Wd(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[Hd]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Hd}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Wd(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function He(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}K();var Kk=/^(0|[1-9][0-9]*)$/,gs=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function en(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(!Kk.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 Yk(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function Xk(e={}){return e.maxFeePerGas!=null?en(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?en(e.gasPrice,"gasPrice"):null}function ys(e={}){try{let t=Yk(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=en(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=en(n.gasLimit??n.gas,"gasLimit"),s=Xk(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=en(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=en(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:en(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 jd(e={}){let t=ys(e);if(!t.ok)throw new gs(t);return t}var tS="https://api.opensea.io/api/v2",nS="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)",rS=new Xo([`function ${nS}`]),Yo=new Xo(["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"]),oS=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"]),iS=new Set(oS),Xd=new Set(["solana","flow"]),Er="0x0000000000000000000000000000000000000000";function aS(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Qk(e))return"";try{for(let t of Jk(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 ft(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||aS()}function Jd(e={}){return Ze({provider:"opensea",defaultUrl:tS,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function tn(e={}){return Jd(e).baseUrl}function nn(e={}){return He({accept:"application/json"},{"x-api-key":ft(e)},Jd(e).trusted)}function Qd(e){let t=String(e||"ethereum").trim().toLowerCase();if(!iS.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function z(e,t="address"){try{return Zk(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Zd(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Xd.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return z(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 sS(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 cS(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 zd(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 lS(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 ep(e={}){if(!ft(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Ar("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 Ar(e,t={}){if(!e)throw new Error("collection slug required");if(!ft(t))throw new Error("OPENSEA_API_KEY required");return x(`${tn(t)}/collections/${encodeURIComponent(e)}`,{headers:nn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function tp(e,t={}){let n=await Ar(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 _r(e={},t={}){if(!ft(t))throw new Error("OPENSEA_API_KEY required");let n=Qd(e.chain),r=Zd(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(`${tn(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 x(l.toString(),{headers:nn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(lS(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 Jo(e={},t={}){if(!ft(t))throw new Error("OPENSEA_API_KEY required");let n=Zd(e.address||e.owner),r=await x(`${tn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:nn(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 Qo=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 Pr(e){let t=String(e||"").trim().toLowerCase(),n=Qo[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Re(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 uS(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 Ir(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function np(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 rp(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 dS(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function pS(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=z(e?.token,t);if(n===0&&r!==Er)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Er)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function mS(e,t){let n=Re(e?.startAmount,`${t} startAmount`),r=Re(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 bs(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(dS);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=pS(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+=mS(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var fS=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 Me(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Vd(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 op(e,t){return{itemType:Number(Me(e?.itemType,`${t} itemType`)),token:z(e?.token,`${t} token`),identifierOrCriteria:Me(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Me(e?.startAmount,`${t} startAmount`),endAmount:Me(e?.endAmount,`${t} endAmount`)}}function hS(e,t){return{...op(e,t),recipient:z(e?.recipient,`${t} recipient`)}}function gS(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:z(e.offerer,`${t} offerer`),zone:z(e.zone,`${t} zone`),offer:n.map((o,i)=>op(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>hS(o,`${t} consideration[${i}]`)),orderType:Number(Me(e.orderType,`${t} orderType`)),startTime:Me(e.startTime,`${t} startTime`),endTime:Me(e.endTime,`${t} endTime`),zoneHash:Vd(e.zoneHash,`${t} zoneHash`),salt:Me(e.salt,`${t} salt`),conduitKey:Vd(e.conduitKey,`${t} conduitKey`),counter:Me(e.counter,`${t} counter`)}}function ip(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=gS(t,n);if(ws.hashStruct("OrderComponents",fS,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function ap(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=z(e?.token,`${t} contract`),o=Ir(e?.identifierOrCriteria),i=Re(e?.startAmount,`${t} startAmount`,{positive:!0}),a=Re(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 yS(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 ap(r[0],`${t} offer NFT`)}function bS(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=ap(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 wS(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&z(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 vS(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 sp(e,t,n,r){let o=Me(t?.startTime,`${r} startTime`),i=Me(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=rp(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&vS(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function xS(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(Qo[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=yS(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;wS(e.asset,s,c,"listing");let l=Re(e.price?.current?.value,"listing price",{positive:!0}),u=ip(e,i,"listing"),d=bs(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:z(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:sp(e,i,n,"listing"),counter:Me(i?.counter,"listing counter")}}async function vs(e={},t={}){if(!ft(t))throw new Error("OPENSEA_API_KEY required");let n=Pr(e.chain);n.contract=e.contract?z(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(`${tn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await x(i.toString(),{headers:nn(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=>xS(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Zo(e={},t={}){let n=Ir(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 vs({...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 kS(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=bS(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Re(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=bs(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=bs(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:ip(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:z(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:sp(e,i,r,"offer"),counter:Me(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function ei(e={},t={}){if(!ft(t))throw new Error("OPENSEA_API_KEY required");let n=Pr(e.chain);n.contract=e.contract?z(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Ir(e.tokenId),i=await x(`${tn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:nn(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 kS(a,n,o,s)}function SS(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 cp(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"&&cp(n))}function lp(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function up(e){return!e||typeof e!="object"?!1:lp(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&up(t))}function dp(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"&&dp(o,t,n);return t}function Gd(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function pp(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(lp(e))throw new Error("opensea: signed transaction material refused");if((e.from?z(Gd(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=z(Gd(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=rS.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=uS(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 xs(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(()=>(de(),Uo)),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(()=>(de(),Uo)),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 ES(e,t){if(cp(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(up(e))throw new Error("opensea: signed transaction material refused");let n=dp(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=>pp(r,t))}function IS(e,t,n={}){return P({...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 mp(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function fp(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function AS(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=z(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function ni(e={},t={}){if(!ft(t))throw new Error("OPENSEA_API_KEY required");SS(e);let{chain:n,chainId:r}=Pr(e.chain),o=z(e.buyer||e.minter||e.address,"buyer"),i=z(e.contract,"NFT contract"),a=np(e.quantity),s=Re(e.priceWei,"priceWei"),c=Re(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=rp(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 Ar(d,t),f=AS(p,n,i),m=s*BigInt(a);if(m>c)throw new Error("opensea: mint total exceeds total cap");let h=await x(`${tn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:nn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),y=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(y)?y:y?[y]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let v=new Set(w.map(R=>z(R,"SeaDrop mint target"))),g=ES(h,{buyer:o,chainId:r,targets:v});if(g.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let b,k,E=null,I;try{b=Yo.decodeFunctionData("mintPublic",g[0].data),k="public",I=Yo.encodeFunctionData("mintPublic",[b[0],b[1],b[2],b[3]])}catch{try{b=Yo.decodeFunctionData("mintAllowList",g[0].data),k="allowlist";let R=b[4],H=[...b[5]].map(String);if(H.length<1||H.length>64||H.some(ke=>!/^0x[0-9a-fA-F]{64}$/.test(ke)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let U=BigInt(R.startTime),Q=BigInt(R.endTime),be=BigInt(Math.floor(l/1e3));if(U>be||Q<=be)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(R.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(R.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");I=Yo.encodeFunctionData("mintAllowList",[b[0],b[1],b[2],b[3],R,H]),E={mintPrice:BigInt(R.mintPrice).toString(),maxTotalMintableByWallet:BigInt(R.maxTotalMintableByWallet).toString(),startTime:U.toString(),endTime:Q.toString(),dropStageIndex:BigInt(R.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(R.maxTokenSupplyForStage).toString(),feeBps:Number(R.feeBps),restrictFeeRecipients:!!R.restrictFeeRecipients,proof:H}}catch(R){throw/opensea:/.test(String(R?.message||""))?R:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let _=z(b[0],"mint NFT contract"),O=z(b[1],"mint fee recipient"),N=z(b[2],"mint recipient");if(_!==f)throw new Error("opensea: mint calldata collection mismatch");if(N!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(b[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(I.toLowerCase()!==g[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=g.reduce((R,H)=>R+H.valueWei,0n);if(T!==m)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(T>c)throw new Error("opensea: mint total exceeds total cap");let q=await xs(g,r,{...t,provider:e.provider||t.provider});if(q.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let se=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},Z=jd({chainId:r,tx:g[0],policy:se});return IS({action:"mint",mintType:k,...E?{stage:E}:{},chain:n,chainId:r,slug:d,buyer:o,contract:f,quantity:a,priceWei:s.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:g[0].to,feeRecipient:O,expiry:u,transactions:g.map(ti),gasWar:Z,...q},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+us,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function _S(e={}){let t=Qd(e.chain);if(Xd.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?zd(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=zd(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:z(e.contract,"NFT contract"),token_id:o,quantity:cS(e.quantity??1,"quantity"),price:{amount:sS(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:z(e.price?.currency??e.currency??Er,"price currency")},start_time:n.text,end_time:r.text}}var In={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"}]},Kd=new Xo(["function setApprovalForAll(address operator,bool approved)"]),PS=new Xo(["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 Yd(e,t){return e?.[t]||(e?.action===t?e:null)}function CS(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(g=>Yd(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=z(c.verifyingContract,"listing protocol"),u=s.message;if(z(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(z(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||z(g.token,"listing payment token")!==Er)throw new Error("opensea: executable listings currently require native fixed-price consideration");let b=BigInt(g.startAmount),k=BigInt(g.endAmount);if(b<=0n||b!==k)throw new Error("opensea: listing consideration must be fixed and positive");z(g.recipient,"listing consideration recipient"),p+=b}let f=eS(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 y=ws.hashStruct("OrderComponents",In,u),w=o.map(g=>Yd(g,"itemApprovalAction")).find(Boolean)||o.find(g=>/setApprovalForAll/i.test(String(g?.action||""))),v=null;if(w){let g=w.transaction||w.itemApprovalAction?.transaction,b=pp(g,{buyer:t,chainId:r,targets:new Set([n.contract])}),k;try{k=Kd.decodeFunctionData("setApprovalForAll",b.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=z(k[0],"listing approval operator");if(k[1]!==!0||b.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(Kd.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==b.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");v={...b,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:In,primaryType:"OrderComponents",message:u},orderHash:y,priceWei:p,approval:v}}async function ri(e={},t={}){if(!ft(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=z(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(_S);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=z(e.taker,"taker"));let c=await x(`${tn(t)}/listings/actions`,{method:"POST",headers:nn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Pr(o[0].chain),u=CS(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await xs(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return P({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 hp(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Pr(e.chain),o=z(e.seller||e.address||e.owner,"seller"),i=z(e.protocolAddress,"reviewed Seaport protocol address"),a=z(e.contract,"NFT contract"),s=Ir(e.tokenId),c=np(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[_,O]of Object.entries(In)){let N=l.types?.[_];if(!Array.isArray(N)||N.length!==O.length||N.some((T,q)=>T?.name!==O[q].name||T?.type!==O[q].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(_=>_!=="EIP712Domain").sort().join(",")!==Object.keys(In).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=z(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let f=l.message;if(z(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(z(m.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Ir(m.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=Re(m.startAmount,"cancellation offer startAmount",{positive:!0}),y=Re(m.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||y!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let _ of f.consideration){if(Number(_.itemType)!==0||z(_.token,"cancellation payment token")!==Er)throw new Error("opensea: cancellation requires native fixed-price consideration");let O=Re(_.startAmount,"cancellation consideration startAmount",{positive:!0}),N=Re(_.endAmount,"cancellation consideration endAmount",{positive:!0});if(O!==N)throw new Error("opensea: cancellation consideration must be fixed and positive");z(_.recipient,"cancellation consideration recipient")}let w=Re(f.startTime,"cancellation startTime");if(Re(f.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let g=ws.hashStruct("OrderComponents",In,f),b=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(b)||b!==g.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let k=PS.encodeFunctionData("cancel",[[f]]),E=[{from:o,to:p,data:k,value:"0x0",valueWei:0n,chainId:r}],I=await xs(E,r,{...t,provider:e.provider||t.provider});if(I.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return P({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:In,primaryType:"OrderComponents",message:f},transactions:E.map(ti),...I,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}de();var oi=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"}),j=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),NS=/^0x[0-9a-fA-F]{40}$/;function OS(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}NS.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 RS(e){let{ok:t,errors:n,warnings:r}=OS(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
142
142
|
- ${n.join(`
|
|
143
|
-
- `)}`);let o=e.capabilities||{},i=ri.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:ri.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of ri)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 xs=new Map;function gp(e){let t=OS(e);return xs.set(t.chainId,t),t}function yp(e){return xs.get(Number(e))||null}function bp(){return[...xs.values()]}de();var Ss={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},We=e=>BigInt(e).toString(16).padStart(64,"0"),Pr=e=>e.slice(2).toLowerCase().padStart(64,"0");function RS(e,t){return`0x${Ss.getAmountsOut}`+We(e)+We(64)+We(t.length)+t.map(Pr).join("")}function LS(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 ks(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Es=100;function $S(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Es)throw new Error(`slippageBps ${n} exceeds the ${Es} 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 wp(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await M(t,"eth_call",[{to:o,data:RS(i,a)},"latest"],s);return LS(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=ks(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=ks(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:j.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:j.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:j.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:j.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:j.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=j.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=j.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=j.CAUTION,y=`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:y,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=ks(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 y=$S(h.amountOut,c);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(l)),v=n&&m[0].toLowerCase()===n.toLowerCase()&&d.useNative,g=v?`0x${Ss.swapExactETHForTokens}`+We(y)+We(128)+Pr(s)+We(w)+We(m.length)+m.map(Pr).join(""):`0x${Ss.swapExactTokensForTokens}`+We(a)+We(y)+We(160)+Pr(s)+We(w)+We(m.length)+m.map(Pr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:g,value:v?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:y.toString(),slippageBps:c,maxSlippageBps:Es,deadline:w.toString()},requires:v?[]:[{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."}}}}de();var BS=[100,500,3e3,1e4],vp={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},nn=e=>BigInt(e).toString(16).padStart(64,"0"),Cr=e=>e.slice(2).toLowerCase().padStart(64,"0"),xp=/^0x[0-9a-fA-F]{40}$/,As=100;function MS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>As)throw new Error(`slippageBps ${n} exceeds the ${As} 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 Is(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function kp(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${vp.quoteExactInputSingle}`+Cr(a)+Cr(s)+nn(c)+nn(l)+nn(0),p=await M(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 BS){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=Is(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(!xp.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=Is(c.scanner,"quoter"),u=s||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:j.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||!u)return{chainId:t,token:i,verdict:j.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 d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:a},c);if(!d.best)return{chainId:t,token:i,verdict:j.FAIL,evidence:G.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:j.FAIL,evidence:G.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=p.best.amountOut,m=Number(f*10000n/BigInt(a)),h=j.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=j.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=j.CAUTION,y=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:y,amountIn:String(a),bought:d.best.amountOut.toString(),returned:f.toString(),retentionBps:m,buyFee:d.best.fee,sellFee:p.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=Is(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(!xp.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=MS(f.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=!!(d.useNative||f.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),w=`0x${vp.exactInputSingle}`+Cr(i)+Cr(a)+nn(m)+Cr(c)+nn(s)+nn(h)+nn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:y?String(s):"0x0"},guard:{quotedOut:f.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:As,fee:m},requires:y?[]:[{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 Sp(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Ep(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 FS(e){let{chainId:t}=e;async function n(r,o,i){return M(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await yr(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:G.LIVE}},async nativeBalance(r,o={}){let i=await Yt(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=Sp(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:Ep(a?.result??a),name:Ep(s?.result??s),totalSupply:(Sp(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 Xt(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?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 M(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=j.PASS,s=u=>{let d={[j.PASS]:0,[j.CAUTION]:1,[j.UNKNOWN]:2,[j.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==G.LIVE?(i.push({check:"erc20-metadata",result:j.UNKNOWN,detail:c.warning}),s(j.UNKNOWN)):i.push({check:"erc20-metadata",result:j.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===G.UNAVAILABLE)i.push({check:"liquidity",result:j.UNKNOWN,detail:l.reason}),s(j.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:j.FAIL,detail:"no pool with liquidity found"}),s(j.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:j.CAUTION,detail:`top pool only $${d}`}),s(j.CAUTION)):i.push({check:"liquidity",result:j.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:j.CAUTION,detail:"pool under 24h old"}),s(j.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:j.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),s(u.verdict)}else i.push({check:"sellability",result:j.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),s(j.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ip(e){let n={...FS(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,kp({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,wp({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 In=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function _s(){return In.map(e=>gp(Ip(e)))}var Tr=new Map,US=Object.keys(Be).map(Number),qS=Object.keys(at).map(Number),DS=In.map(e=>e.chainId),HS=[...new Set(Object.values(Jo))],Ps=new Set,Ap=!1;function A(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(Ap&&Ps.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Tr.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Tr.get(t)}function Cs(e){return Tr.get(e)||null}function ii({venue:e,op:t}={}){let n=[...Tr.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function WS(){Ps.clear();for(let e of Tr.keys())Ps.add(e);Ap=!0}A({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"});A({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."});A({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."});A({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."});A({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"});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."]])A({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});A({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."});A({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:DS,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:In.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."});A({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)"});A({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)"});A({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"});A({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."});A({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."});A({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"});A({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."});A({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."});A({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."});A({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."});A({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."});A({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"});A({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)"});A({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});A({id:"uniswap-v3",venue:"dex",chainIds:US,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"});A({id:"uniswap-v4",venue:"dex",chainIds:qS,auth:"none",ops:["health","quote","chains"],execution:"read-only",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});A({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)"});A({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)"});A({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)"});A({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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"});A({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"});A({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"});A({id:"opensea-nft",venue:"nft",chainIds:HS,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"});A({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"});A({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"});A({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"});A({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"});A({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"});A({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"});A({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)"});A({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"});A({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)"});A({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"});A({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"});A({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."});A({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."});WS();A({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});A({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."});A({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."});A({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."});A({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."});A({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)."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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."});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});L();Ze();Ze();var KS=/^0x[0-9a-fA-F]{40}$/,Or="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Ts(e,t){let n=String(e||"").trim();if(!KS.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Rp(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Lp(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 YS(e){return[...e].sort((t,n)=>(Rp(n.tvl)??-1)-(Rp(t.tvl)??-1))}function Ns(e){return e.hlInfo||oe}function Os(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Rs(e={},t={}){let n=await Ns(t)({type:"vaultSummaries"},t),r=YS((Array.isArray(n)?n:[]).map(Lp));return Os({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function li(e={},t={}){let r={type:"vaultDetails",vaultAddress:Ts(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Ts(e.user,"user"));let o=await Ns(t)(r,t);return Os({provider:"hl-vaults",vault:Lp(o||{}),raw:o})}async function Ls(e={},t={}){let n=Ts(e.user||e.address,"user"),r=await Ns(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 Os({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function $s(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return li({...e,vaultAddress:Or},t);if(n==="summaries")return Rs(e,t);if(n==="details")return li(e,t);if(n==="mine")return Ls(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function $p(e={}){try{let t=await $s({mode:"hlp"},e);return{ok:t.vault.vaultAddress===Or&&!!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}}}de();import{AbiCoder as JS}from"ethers";var Bs=999;var ke=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Ms=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),QS=JS.defaultAbiCoder();function Rr(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 Lr(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 rn(e,t){return e.length?QS.encode(e,t):"0x"}function ht(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 ZS(e,t=0){let n=ht(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function At(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Bs});let r=await M(Bs,"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 _t(e){return{provider:"hl-precompiles",chainId:Bs,...Ms,...e}}async function ui(e={}){let t=await At(ke.l1BlockNumber,"0x",e);return _t({op:"l1BlockNumber",precompile:ke.l1BlockNumber,l1BlockNumber:ht(t).toString(),raw:t})}async function Fs(e={},t={}){let n=Lr(e.index??e.assetId??0,"index",32),r=await At(ke.markPx,rn(["uint32"],[n]),t);return _t({op:"markPx",precompile:ke.markPx,index:n,markPx:ht(r).toString(),raw:r})}async function Us(e={},t={}){let n=Lr(e.index??e.assetId??0,"index",32),r=await At(ke.oraclePx,rn(["uint32"],[n]),t);return _t({op:"oraclePx",precompile:ke.oraclePx,index:n,oraclePx:ht(r).toString(),raw:r})}async function qs(e={},t={}){let n=Lr(e.index??e.assetId??0,"index",32),r=await At(ke.spotPx,rn(["uint32"],[n]),t);return _t({op:"spotPx",precompile:ke.spotPx,index:n,spotPx:ht(r).toString(),raw:r})}async function Ds(e={},t={}){let n=Rr(e.user,"user"),r=Lr(e.perp??e.assetId??0,"perp",16),o=await At(ke.position,rn(["address","uint16"],[n,r]),t);return _t({op:"position",precompile:ke.position,user:n,perp:r,szi:ZS(o,0),raw:o})}async function Hs(e={},t={}){let n=Rr(e.user,"user"),r=Lr(e.token??0,"token",64),o=await At(ke.spotBalance,rn(["address","uint64"],[n,r]),t);return _t({op:"spotBalance",precompile:ke.spotBalance,user:n,token:r,total:ht(o,0).toString(),hold:ht(o,1).toString(),raw:o})}async function Ws(e={},t={}){let n=Rr(e.user,"user"),r=Rr(e.vaultAddress??e.vault??Or,"vault"),o=await At(ke.vaultEquity,rn(["address","address"],[n,r]),t);return _t({op:"vaultEquity",precompile:ke.vaultEquity,user:n,vaultAddress:r,hlp:r===Or,equity:ht(o,0).toString(),raw:o})}async function js(e={},t={}){let n=Rr(e.user,"user"),r=await At(ke.withdrawable,rn(["address"],[n]),t);return _t({op:"withdrawable",precompile:ke.withdrawable,user:n,withdrawable:ht(r).toString(),raw:r})}async function Bp(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return ui(t);if(n==="markPx")return Fs(e,t);if(n==="oraclePx")return Us(e,t);if(n==="spotPx")return qs(e,t);if(n==="position")return Ds(e,t);if(n==="spotBalance")return Hs(e,t);if(n==="vaultEquity"||n==="hlp")return Ws(e,t);if(n==="withdrawable")return js(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Mp(e={}){try{let t=await ui(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Ms,l1BlockNumber:t.l1BlockNumber,precompiles:ke}}catch(t){return{ok:!1,provider:"hl-precompiles",...Ms,error:String(t?.message||t).slice(0,160)}}}Ze();K();function Fp(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function pi(e={},t,n){let r=String(t||""),o=Fp(e);if(o){let a=$r(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=$r(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function mi(e={},t=[],n){let r=Fp(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if($r(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&$r(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if($r(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var zs=Number.MAX_SAFE_INTEGER,di=String(zs);function $r(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=zs?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<=zs?r:null}function im(){return{ok:!0,provider:"hl-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated hl signer. Not automated."}}function yt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function am(e){let t=yt(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function jE(e,t,n=4){let r=yt(e),o=yt(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function sm(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},a=n[o]||{},s=String(i.name||"").trim(),c=yt(a.funding),l=yt(a.markPx??a.oraclePx),u=yt(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:yt(a.oraclePx),openInterest:u,fundingAprPct:am(c)})}return r}function cm(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=yt(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=am(n),o=n>0,i={coin:e.coin,notionalUsd:yt(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?jE(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 dc(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await je(t),i=sm(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 pc(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 je(t),i=sm(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return cm(i,r)}async function mc(e={},t={}){um(e,t,"hl-delta-neutral");let n=dm(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await pc(e,t);if(r.verdict==="skip")return P({...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=pi(e,r.coin,"hl-delta-neutral");if(!lm.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(()=>(vi(),uc)),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 P({...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 lm=/^0x[0-9a-fA-F]{40}$/;function um(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 zE(e,t,n){um(e,t,n)}function VE(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=dm(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"&&mi(e,n,"hl-delta-neutral"),t==="live"&&!lm.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 dm(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 pm(e={},t={}){zE(e,t,"hl-delta-neutral");let n=VE(e),r=await dc({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=cm(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 mc({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();K();Pn();var KE=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Dr=14,mm=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function On(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function fc(e){let t=String(e||"").replace(/\/$/,"");if(!KE.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function fm(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=mm(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=fc(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(on(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(on(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");On(n.orderType,0,"orderType"),On(n.timeInForce,1,"timeInForce"),On(n.reduceOnly,0,"reduceOnly"),On(n.triggerPrice,0,"triggerPrice"),On(n.orderExpiry,-1,"orderExpiry");let c=mm(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=Ks(n.baseAmount,"lighter: baseAmount"),d=Ks(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 y=m+h,w=u*d,v=Se(n.notionalUsd,y,"lighter: notionalUsd");if(v<=0n)throw new Error("lighter: notionalUsd required");if(w!==v)throw new Error("lighter: notionalUsd must match size and price");let g=Se(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,y,"lighter: maxNotionalUsd");if(w>g)throw new Error("lighter: notional exceeds cap");let b=ye(n.notionalUsd,"lighter: notionalUsd");return On(n.txType,Dr,"txType"),Object.freeze({unit:"usd",value:String(b),notional:String(b),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:f,submitTo:o,actionType:"create-order",amount:String(b)})}function YE(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 hm(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=fc(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:YE(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??Dr,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return fm(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var ym="https://mainnet.zklighter.elliot.ai",bm="https://testnet.zklighter.elliot.ai";function XE(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?bm:ym}function wm(){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 Ot(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function JE(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 vm(e){let t=Ot(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function QE(e,t,n=4){let r=Ot(e),o=Ot(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 gm(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function xm(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=gm(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=gm(a.market_id);if(s==null)continue;let c=o.get(s),l=Ot(c?.mark_price??c?.index_price),u=Ot(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:Ot(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:vm(u)})}return i}function km(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Ot(e.funding);if(n==null)throw new Error("lighter: funding required");let r=vm(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Ot(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?QE(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 Sm(e={}){let t=XE(e),n=e.fetchImpl,r=await x(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await x(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function hc(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Sm(t),i=xm(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 gc(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 Sm(t),a=xm(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return km(a,r)}async function yc(e={},t={}){Im(e,t,"lighter");let n=Am(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 gc(e,t);if(o.verdict==="skip")return P({...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=pi(e,o.coin,"lighter");if(!Em.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=JE(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:Dr,submitTo:`${s?bm:ym}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=hm(u,{...e,maxNotionalUsd:n},t)}catch(m){p=String(m?.message||m).slice(0,200)}return P({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Em=/^0x[0-9a-fA-F]{40}$/;function Im(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 ZE(e,t,n){Im(e,t,n)}function eI(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=Am(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"&&mi(e,n,"lighter"),t==="live"&&!Em.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 Am(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 _m(e={},t={}){ZE(e,t,"lighter");let n=eI(e),r=await hc({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=km(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 yc({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();var nI="https://clob.polymarket.com",rI="https://gamma-api.polymarket.com";function Hr(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||nI).replace(/\/$/,"")}function Pm(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||rI).replace(/\/$/,"")}async function bc(e={}){return x(`${Hr(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Cm(e={}){let t=await bc(e);return{ok:t!=null&&t!=="",time:t}}async function Tm({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 x(`${Pm(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Nm(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${Hr(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Om(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${Hr(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Rm(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${Hr(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Lm(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return x(`${Hr(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function $m({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 x(`${Pm(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}de();L();import{createHash as Bm}from"node:crypto";var Rn="mainnet-beta",iI="https://api.mainnet-beta.solana.com",wc="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function aI(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||iI).trim()}function ce(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 sI(e,t){return t?[...e,{commitment:t}]:e}async function Wr(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 x(aI(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 vc(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await Wr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Rn,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Mm(e={}){try{let[t,n]=await Promise.all([Wr("getHealth",[],e),vc({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Rn,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Rn,error:String(t?.message||t),exec:!1}}}async function xi(e={},t={}){let n=ce(e.address||e.owner,"address"),r=await Wr("getBalance",sI([n],e.commitment),t);return{provider:"solana-rpc",cluster:Rn,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function cI(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 jr(e={},t={}){let n=ce(e.owner||e.address,"owner"),r=e.mint?{mint:ce(e.mint,"mint")}:{programId:ce(e.programId||wc,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await Wr("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(cI):[];return{provider:"solana-rpc",cluster:Rn,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function lI(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 uI(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 dI(e){let t=Buffer.from(e,"base64");try{let n=uI(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Bm("sha256").update(t.subarray(r)).digest("hex")}catch{return Bm("sha256").update(t).digest("hex")}}async function Fm(e={},t={}){let n=lI(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await Wr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Rn,ok:i.err==null,transactionHash:dI(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}L();var mI="mainnet",fI="https://mempool.space/api",hI="https://mempool.space/testnet/api";function ct(e={}){return String(e.network||process.env.BTC_NETWORK||mI).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function kc(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):ct(e)==="testnet"?hI:fI}function xc(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function et(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function gI(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 Sc(e,t={}){let n=`${kc(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 ki(e,t={}){let n=await Sc(e,t);try{return JSON.parse(n)}catch{return n}}async function Um(e={}){try{let t=await Sc("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:ct(e),baseUrl:xc(kc(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:ct(e),baseUrl:xc(kc(e)),error:xc(t?.message||t),exec:!1}}}async function qm(e={}){let t=await Sc("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:ct(e),tipHeight:Number(t)}}async function Dm(e={}){try{let t=await ki("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:ct(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:ct(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Si(e={},t={}){let n=et(e.address||e.addr,"address"),r=await ki(`/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:ct(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Hm(e={},t={}){let n=et(e.address||e.addr,"address"),r=await ki(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:ct(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 Wm(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 ki(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:ct(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 jm(e={},t={}){let n=gI(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:ct(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 Ec="https://ordinals.com";function Ei(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var bI=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function zm(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=Ei(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=bI.includes(o)&&(i==="https:"||a)}}catch{n=!1}return He({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Ln(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:zm(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 Vm(e={}){let t=Ei(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:zm(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 Ii(e={},t={}){let n=et(e.address||e.addr,"address"),r=Ei(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 Ln(a,t),c=wI(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 wI(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 $n(e={},t={}){let n=et(e.address||e.addr,"address"),r=Ei(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 Ln(s,t),l=vI(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 Gm(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||Ec,o=await Ln(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Km(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||Ec,o=Number(e.page||0),i=await Ln(`${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 Ym(e={},t={}){let n=t.ordinalsBase||Ec,r=e.height??await Ln(`${n}/r/blockheight`,t),o=await Ln(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function vI(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}))}K();var kI=["unsigned","notsigned","tosign","signable"],SI=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),EI=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Ic(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function II(e){return kI.some(t=>e.startsWith(t))||SI.has(e)}function AI(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Ic(t);return II(n)?!1:EI.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function _I(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 Ac(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=>Ac(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(AI(c)){o.push(c);continue}o.push(...Ac(l,t+1,n,r))}let a=Object.keys(e).map(Ic).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Ic(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),_I(e)&&o.push("v/r/s"),o}function bt(e,t){let n=Ac(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 PI="https://api.satflow.com/v1";function Xm(e={}){return Qe({provider:"satflow",defaultUrl:PI,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Ai(e={}){return Xm(e).baseUrl}function Pc(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function CI(e={}){return He({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Pc(e)},Xm(e).trusted)}async function Rt(e,{method:t="GET",body:n,opts:r={}}={}){if(!Pc(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Ai(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:CI(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 Jm(e={}){if(!!!Pc(e))return{ok:!1,provider:"satflow",baseUrl:Ai(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 Rt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Ai(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:Ai(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Qm(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 Rt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Zm(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 Rt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function ef(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 Rt(`/item?${r}`,{opts:t})}}async function _i(e={},t={}){let n=et(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await Rt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function tf(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 Rt(`/orders/floor?${r}`,{opts:t})}}var TI=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function nf(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))TI.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var NI=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"]),OI=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function _c(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 RI(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=et(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=et(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function rf(e={},t={}){let n=nf(e,NI);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=_c(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Rt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=_c(a)??_c(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`);bt("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=RI(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return P({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 Pi(e={},t={}){let n=nf(e,OI);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 Rt("/intent/sell",{method:"POST",body:n,opts:t});return bt("satflow",r),P({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}L();K();var Ti="https://lite-api.jup.ag/swap/v1",Tc="So11111111111111111111111111111111111111112",sf="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",$I=100,of=2e4;function cf(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Ti).replace(/\/$/,"")}function zr(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 lf(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>$I)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function Ci(e,t){return e==null?t:!!e}function BI(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 MI(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 uf(e){let t=Buffer.from(e,"base64"),n=MI(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 Cc(e={},{quotedAtMs:t=Date.now(),ttlMs:n=of}={}){let r=ce(e.inputMint,"inputMint"),o=ce(e.outputMint,"outputMint"),i=zr(e.inAmount,"inAmount"),a=zr(e.outAmount,"outAmount"),s=zr(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=lf(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)||of,1e3),3e4)}}function FI({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Tc)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=uf(n),a=zr(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 UI=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),qI="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function af(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=qI.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 df(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(`${Ti}/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])=>af(p)),c=[],l=a.filter(([p])=>!af(p)).map(([p,f])=>({programId:p,label:f,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Ti}/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(([y])=>y),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(y=>setTimeout(y,2e3*(h+1)))}if(!m){for(let[h,y]of f)l.push({programId:h,label:y,reason:"rpc batch failed after 3 attempts"});continue}m.value.forEach((h,y)=>{let[w,v]=f[y];h&&h.executable===!0&&UI.has(h.owner)?c.push({programId:w,label:v,owner:h.owner}):l.push({programId:w,label:v,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:`${Ti}/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 pf(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Ni({inputMint:Tc,outputMint:sf,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 Ni(e={},t={}){let n=ce(e.inputMint||e.fromMint||Tc,"inputMint"),r=ce(e.outputMint||e.toMint||sf,"outputMint"),o=zr(e.amount||e.inAmount,"amount"),i=lf(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${cf(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 x(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Cc({...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 DI(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function mf(e={},t={}){let n=ce(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Cc(e.quoteResponse,t)}:await Ni(e,t),o=r.quote,i=r.solanaGuard||Cc(o,t);if(Ci(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await x(`${cf(t)}/swap`,{method:"POST",body:DI({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:Ci(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:Ci(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:Ci(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=BI(a?.swapTransaction);uf(s),bt("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=FI({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(f){p=String(f?.message||f).slice(0,200)}return P({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}L();var WI="https://coins.llama.fi",jI="https://api.llama.fi",zI="https://yields.llama.fi",VI="https://stablecoins.llama.fi";function GI(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||WI).replace(/\/$/,"")}function ff(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||jI).replace(/\/$/,"")}async function an(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return x(`${GI(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function hf(e={}){let n=(await an(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function gf(e={}){return x(`${ff(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function yf(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||zI).replace(/\/$/,""),r=await x(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(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 Oi(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||VI).replace(/\/$/,""),r=e.includePrices!==!1;return x(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function bf(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return x(`${ff(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function wf(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await an(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}L();var Lt="0x000000000000000000000000000000000000dEaD";function Nc(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Lt}K();bi();var YI="https://li.quest/v1";function Rc(e={}){return(e.baseUrl||process.env.LIFI_API_URL||YI).replace(/\/$/,"")}var Oc="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",XI="0x0000000000000000000000000000000000000000";function JI(e){let t=String(e||Oc).toLowerCase();return t===Oc.toLowerCase()||t===XI}function vf(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 xf(e={}){let t=await x(`${Rc(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 Vr(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Oc,toToken:i,fromAmount:a,fromAddress:s=Lt}=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=Oe({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 yi({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[y,w]of Object.entries(Jp(u)))c.set(y,w);let d=await x(`${Rc(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=ee(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 kf(e={},t={}){let n=await Vr(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(!JI(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:vf(s,"approval token"),spender:vf(a,"approval spender"),amount:String(e.fromAmount)}}return P({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:ue(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Sf(e={}){return x(`${Rc(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}de();import{Interface as Af,getAddress as Gr,isAddress as ZI}from"ethers";K();var $t={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},eA=[1,50,100,200,2e3],Ef=new Af(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),tA=new Af(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),_f="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Pf="0x0000000000000000000000000000000000000000";function Cf(e){let t=Number(e),n=$t[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys($t).join(", ")})`);return{chainId:t,...n}}function If(e,t){let n=$t[Number(t)];if(!e||e===_f||e===Pf||/^eth$/i.test(String(e)))return Gr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Gr(n.weth);if(/^usdc$/i.test(r))return Gr(n.usdc);if(!ZI(r))throw new Error(`invalid token address: ${e}`);return Gr(r)}async function Ri(e={},t={}){let{chainId:n,quoter:r,router:o}=Cf(e.chainId??8453),i=If(e.tokenIn||"WETH",n),a=If(e.tokenOut||$t[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]:[...eA],l=[],u=null;for(let d of c){let p=Ef.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let f=await M(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=Ef.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 ee({venue:"aerodrome",chainId:n,chain:$t[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 Tf(e={},t={}){let n=Number(e.chainId??8453),r=Cf(n),o=Gr(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===_f||i===Pf||/^eth$/i.test(i),s=await Ri(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=tA.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 P({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:ue(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Nf(e={}){let t=Number(e.chainId??8453);try{let n=await Ri({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:$t[t]?.router,quoter:$t[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Of(){return Object.entries($t).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}L();K();var rA="https://api.0x.org";function Rf(e={}){return Qe({provider:"zerox",defaultUrl:rA,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Lf(e={}){return Rf(e).baseUrl}function Li(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function $f(e={}){return He({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Li(e)},Rf(e).trusted)}async function Bf(e={}){if(!Li(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Lc({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 Lc(e={},t={}){if(!Li(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),x(`${Lf(t)}/swap/allowance-holder/price?${s}`,{headers:$f(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Kr(e={},t={}){if(!Li(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=Oe({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 x(`${Lf(t)}/swap/allowance-holder/quote?${c}`,{headers:$f(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?ee(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 Mf(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Kr(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 P({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:ue(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}L();K();var iA="https://across.to/api",aA="https://api.hop.exchange/v1",sA="https://api.relay.link",cA={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function Ff(e={}){try{return{ok:!0,estimatedFillTimeSec:(await $c({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 $c(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||iA).replace(/\/$/,"");return x(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Uf(e={}){try{let t=await Bc({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 Bc(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=Oe({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||aA).replace(/\/$/,""),u=await x(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?ee(u,{chainId:Number(e.originChainId||e.chainId||cA[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 qf(e={}){try{let t=await $i({user:Lt,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 $i(e={},t={}){let{user:n=Lt,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=Oe({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||sA).replace(/\/$/,""),d=await x(`${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}:ee(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 Df(e={},t={}){let n=await $i(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:ue(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return P({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}L();import{TypedDataEncoder as uA,getAddress as Yr,isAddress as dA}from"ethers";var kB=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Mc(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Hf(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}K();var jf={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"},pA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),mA=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Uc={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},zf={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Wf=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"}]}),NB=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function qc(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=jf[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Bi(e,t){let n=String(e||"").trim();if(!dA(n))throw new Error(`cowswap: ${t} must be an address`);return Yr(n).toLowerCase()}function Fc(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 fA(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 hA(e){let t=pA[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:Yr(t)}}function gA(e={},t,n){let r=Bi(e.sellToken,"sellToken"),o=Bi(e.buyToken,"buyToken"),i=Bi(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=fA(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Fc(e.sellAmount,"sellAmount"),buyAmount:Fc(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:Fc(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Vf(e={}){try{let t=await Bn({chainId:1,sellToken:Uc[1],buyToken:zf[1],sellAmountBeforeFee:"1000000000000000",from:Lt},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 Bn(e={},t={}){let n=Number(e.chainId??1),r=Nc(e.from||e.owner),o=e.sellToken||Uc[n],i=e.buyToken||zf[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=Uc[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 x(`${qc(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?ee(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Gf(e={},t={}){let n=Number(e.chainId??1),r=Bi(Nc(e.from||e.owner||e.signer),"owner"),o=await Bn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=gA(o?.quote||o,n,r),a=hA(n),s={domain:a,types:Wf,primaryType:"Order",message:i},c=uA.hash(a,Wf,i),l=mA[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return P({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:Yr(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:Yr(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:Yr(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Kf(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return x(`${qc(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Yf(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return x(`${qc(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Xf(){return Object.keys(jf).map(Number)}L();K();var bA="https://api.1inch.dev/swap/v6.0";function Jf(e={}){return Qe({provider:"oneinch",defaultUrl:bA,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Dc(e={}){return Jf(e).baseUrl}function Xr(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Hc(e={}){let t=Xr(e);return He({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Jf(e).trusted)}async function Qf(e={}){if(!Xr(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Wc({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 Wc(e={},t={}){if(!Xr(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 x(`${Dc(t)}/${n}/quote?${a}`,{headers:Hc(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?ee(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function wA(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function jc(e={},t={}){if(!Xr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return x(`${Dc(t)}/${n}/approve/spender`,{headers:Hc(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Zf(e={},t={}){if(!Xr(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=Oe({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 x(`${Dc(t)}/${n}/swap?${c}`,{headers:Hc(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=ee(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),f=null;if(!wA(r)){let m=l?.spender||l?.approvalAddress||(await jc({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 P({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:ue(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var xA=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Jr(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||xA,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 y;try{y=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{y={raw:String(h.data).slice(0,200)}}u.push(y),y.channel&&y.channel!=="subscriptionResponse"?d+=1:y.data&&y.channel==="subscriptionResponse"||y.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 eh(e={}){try{let t=await Jr({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 th(e={}){let t=await Jr({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function nh(e,t={}){if(!e)throw new Error("coin required");let n=await Jr({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var SA=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Mi(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||SA,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",y=>{let w;try{w=JSON.parse(typeof y.data=="string"?y.data:String(y.data))}catch{w={raw:String(y.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]})))}),f.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function rh(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Mi([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 oh(e,t={}){if(!e)throw new Error("assetId required");let n=await Mi([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}L();import{getAddress as NA,Interface as Fn,keccak256 as Gc}from"ethers";import{createHash as Kc,createHmac as OA,timingSafeEqual as wh}from"node:crypto";de();import{Interface as sh,getAddress as zc,isAddress as IA}from"ethers";var AA="0x0000000000000000000000000000000000000000",ch=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),_A=new sh(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),PA=new sh(["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 CA(e){let t=Number(e??4663),n=ch[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function ih(e,t){if(/^weth$/i.test(String(e||"")))return zc(ch[t].weth);if(!IA(String(e||"")))throw new Error(`up33: invalid token ${e}`);return zc(e)}function TA(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function ah(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 lh(e,t={},n={}){try{let r=CA(t.chainId),o=ih(t.tokenIn,r.chainId),i=ih(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=TA(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||M,l=await ah(c,r.chainId,r.factory,_A,"getPool",[o,i,s]),u=zc(l[0]);if(u.toLowerCase()===AA)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 ah(c,r.chainId,r.quoter,PA,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 uh(e={},t={}){return lh("exact-input",e,t)}async function dh(e={},t={}){return lh("exact-output",e,t)}K();var D=4663,Fi="https://anvil.clutch.market",RA=`${Fi}/api/markets/snapshot?chainId=${D}`,LA=`${Fi}/api/rpc?chainId=${D}`,$A=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Fe="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Yc="0x0000000000000000000000000000000000000000",sn=1e5,BA=256e3,ph=256,MA=3e4,FA=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"}),Ve=Object.freeze({chainId:D,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ae=new Fn(["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"]),UA=new Fn(["function allowance(address owner,address spender) view returns (uint256)"]),vh=new Fn(["function decimals() view returns (uint8)"]),mh=new Fn(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),Ge=new Fn(["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)"]),Bt=new Fn(["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 F(e,t){try{return NA(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function vt(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 Ue(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 Y(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(D,"eth_call",[{to:F(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function xh(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 fh(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>ph)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${ph}`);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)!==D)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${D}`);return{name:n.name||n.collectionName||null,chainId:D,collection:F(n.collection||n.collectionAddress,"Anvil collection"),market:F(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?F(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 qA(e,t,n=[],r={}){if(Number(e)!==D)throw new Error(`stonkbrokers: Anvil supports chain ${D} only`);if(!$A.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await x(LA,{method:"POST",headers:{origin:Fi,referer:`${Fi}/`,"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 tt(e={}){return e.rpcCall||((t,n,r)=>qA(t,n,r,e))}async function Un(e={},t={}){if(e.snapshot){let s=fh(e.snapshot),c={kind:"anvil-markets",chainId:D,total:s.length,contentHash:Kc("sha256").update(Mn(s)).digest("hex")},l=Xc(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 x(RA,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:BA,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=fh(r),i={kind:"anvil-markets",chainId:D,total:o.length,contentHash:Kc("sha256").update(Mn(o)).digest("hex")},a=Xc(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 Ui(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 kh({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 Un({},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=FA[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=tt(n),c=Ui(await s(D,"eth_blockNumber",[])),l=await s(D,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||Ui(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(D,"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=Gc(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+MA}}function Sh(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:D,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 Zr(e={},t={}){let n=F(e.market,"Anvil market"),r=F(e.collection,"NFT collection"),o=vt(e.tokenId),i=await kh({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,f]=await Promise.all([Y(a,n,Ae,"quoteSpecificBuy",[BigInt(o)],s),Y(a,n,Ae,"inventory",[BigInt(o)],s),Y(a,r,Ge,"ownerOf",[BigInt(o)],s),Y(a,n,Ae,"collection",[],s),Y(a,n,Ae,"token",[],s),Y(a,n,Ae,"robinhoodSwapFeeWei",[],s)]),m=F(d[0],"Anvil market collection");if(m!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=F(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let y=Number((await Y(a,h,vh,"decimals",[],s))[0]);if(!Number.isSafeInteger(y)||y<0||y>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(f[0]).toString(),v=Sh(i,{paymentToken:h,paymentTokenDecimals:y,nativeSwapFeeWei:w}),g=!!c[4],b=!!l[0],k=F(u[0],"NFT owner")===n,E=g&&b&&k;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:D,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:y,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:w,fees:xh(c[2],c[3]),available:E,evidence:{quoteAvailable:g,inventory:b,ownerIsMarket:k,marketCollection:m,attestation:v},reason:E?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function qi(e={},t={}){let n=F(e.market,"Anvil market"),r=F(e.collection,"NFT collection"),o=await kh({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([Y(i,n,Ae,"quoteSellNFT",[],a),Y(i,n,Ae,"collection",[],a),Y(i,n,Ae,"token",[],a),Y(i,n,Ae,"robinhoodSwapFeeWei",[],a)]),d=F(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=F(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let f=Number((await Y(i,p,vh,"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=Sh(o,{paymentToken:p,paymentTokenDecimals:f,nativeSwapFeeWei:m});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:D,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:xh(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function Eh(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 wt(e,t){let n=Ue(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function Ih({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:D,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:wt(o,"gasLimit").toString(),maxFeePerGas:wt(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=wt(a,"maxPriorityFeePerGasWei").toString()),c}function Ah(e,t){return P({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 _h(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=F(e.buyer,"buyer"),r=F(e.market,"Anvil market"),o=F(e.collection,"NFT collection"),i=vt(e.tokenId),a=wt(e.maxTotalCostRaw,"maxTotalCostRaw"),s=Ue(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 Zr({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=wt(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=F(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),y=l.evidence.attestation,w={blockHash:y.blockHash,requireCanonical:!0},v=BigInt((await Y(tt(t),m,UA,"allowance",[n,r],w))[0]);if(v<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let g={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},b=[Ih({...g,to:r,data:Ae.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],k={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},E={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:y,anvilQuote:k,preconditions:{allowanceVerified:!0,allowanceRaw:v.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:Eh(e.tradeId),slippageBps:0,expiresAtMs:p+f,fee:{oracleFeeBps:0},artifact:{chainId:D,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:m,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:y,anvilQuote:k,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:b}};return Ah(E,l)}async function Ph(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=tt(t),r=F(e.seller,"seller"),o=F(e.market,"Anvil market"),i=F(e.collection,"NFT collection"),a=vt(e.tokenId),s=wt(e.minPayoutRaw,"minPayoutRaw"),c=Ue(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 qi({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[f,m,h]=await Promise.all([Y(n,i,Ge,"ownerOf",[BigInt(a)],p).then(N=>F(N[0],"NFT owner")),Y(n,i,Ge,"getApproved",[BigInt(a)],p).then(N=>F(N[0],"NFT approval")),Y(n,i,Ge,"isApprovedForAll",[r,o],p).then(N=>!!N[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 y=BigInt(u.netPayoutRaw),w=wt(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==y)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let v=Number(t.nowMs??Date.now()),g=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),b=F(u.paymentToken,"Anvil payment token"),k=Number(u.paymentTokenDecimals),E={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},I=[Ih({...E,to:o,data:Ae.encodeFunctionData("sellNFT",[BigInt(a),y]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],_={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},O={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:b,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:y.toString(),minPayoutRaw:y.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:_,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:m,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:w.toString()},tradeId:Eh(e.tradeId),slippageBps:0,expiresAtMs:v+g,fee:{oracleFeeBps:0},artifact:{chainId:D,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:b,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:_,exactQuoteNetPayoutRaw:y.toString(),minPayoutRaw:y.toString(),transactions:I}};return Ah(O,u)}async function DA(e={},t={}){if(Array.isArray(e.tokenIds)){let v=e.tokenIds.map(k=>vt(k)),g={kind:"anvil-inventory",chainId:D,market:F(e.market,"Anvil market"),collection:F(e.collection,"NFT collection"),total:v.length,contentHash:Kc("sha256").update(Mn(v)).digest("hex")},b=Xc(e.inventoryCompletenessEvidence,g,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:v,total:v.length,scanned:v.length,complete:b.valid,continuation:b.valid?null:{offset:v.length,evidenceRequired:!0},completenessEvidence:b.evidence,completenessError:b.error}}let n=tt(t),r=F(e.market,"Anvil market"),o=Ui(await n(D,"eth_blockNumber",[])),i=await n(D,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||Ui(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await Y(n,r,Ae,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>sn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${sn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>sn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${sn}`);let p=u?Math.min(d,l):l,f={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:sn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:f};let m=BigInt((await Y(n,r,Ae,"oldestTokenId",[],s))[0]),h=[],y=new Set;for(;h.length<l&&h.length<p&&!y.has(m.toString());){let v=m.toString();y.add(v),h.push(v),m=BigInt((await Y(n,r,Ae,"getNextTokenId",[m],s))[0])}let w=h.length===l;return{ids:h,total:l,scanned:h.length,complete:w,continuation:w?null:{offset:h.length,tokenId:m.toString()},completenessEvidence:f}}function HA(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 WA(e,t,n){let r=tt(n);try{let o=String((await Y(r,e,Ge,"tokenURI",[BigInt(t)]))[0]),i=HA(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await x(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 Y(r,e,Ge,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function Ch(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 jA(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 Di(e={},t={}){let n=F(e.market,"Anvil market"),r=F(e.collection,"NFT collection"),o=await DA({...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=tt(t),p=(await Ne(i,s,async h=>{try{let y=await Y(u,r,Ge,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(y[0])+1}}catch(y){return e.includeErrors?{tokenId:h,stars:null,error:String(y.message||y)}:null}})).filter(h=>h&&h.stars>=a),m=(await Ne(p,s,async h=>{try{let y=await Zr({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:y.available,quote:y,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(y){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(y.message||y)}:null}})).filter(Boolean).sort((h,y)=>Number(y.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(y.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:D,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 Ne(i,s,async u=>{try{let[d,p]=await Promise.all([WA(r,u,t),Zr({market:n,collection:r,tokenId:u},t)]),f=Ch(d,e.traitType||"Stars"),m=Array.isArray(e.traitFilters)?e.traitFilters:[];return(m.length?jA(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:D,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 Th(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function hh(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 Nh(e={}){return{maxMarkets:hh(e,"maxMarkets",sn),maxItemsPerMarket:hh(e,"maxItemsPerMarket",sn)}}function Oh(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Qr(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 Rh(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 Lh(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Nh(e),o=await Un(e,t),i=Oh(o,e,n),a=t.scanCollection||Di,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ne(i,s,async l=>{let u=Th(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,...Qr(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Qr(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:D,marketCount:i.length,...Rh(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 $h(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Nh(e),o=await Un(e,t),i=o.snapshotCoverage?.complete===!0,a=Oh(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Jc,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ne(a,l,async d=>{let p=Th(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",...Qr(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),y=Qr(d,h);return{...d,decision:i&&y.complete&&h.arbCount>0?"ARB":"WATCH",slug:f,scan:h,...y}}catch(m){return{...d,decision:"WATCH",slug:f,reason:String(m.message||m).slice(0,240),...Qr(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:D,marketCount:a.length,...Rh(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 gh(e,t){return e>t?"ARB":"PASS"}async function zA(e={},t={}){let n=String(e.direction||""),r=Ue(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=F(e.paymentToken,"Anvil payment token"),i={chainId:D,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:tt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||dh)({chainId:D,tokenIn:Fe,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:Fe,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||Ud)({...i,tokenIn:Fe,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Fe,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||uh)({chainId:D,tokenIn:o,tokenOut:Fe,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:Fe,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||Go)({...i,tokenIn:o,tokenOut:Fe,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Fe,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 yh(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=F(e.quoteToken,"conversion quote token");if(n!==Fe)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=Ue(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=Ue(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function VA(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 Mn(e){return Array.isArray(e)?`[${e.map(Mn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Mn(e[t])}`).join(",")}}`:JSON.stringify(e)}function Bh(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:OA("sha256",n).update(Mn(r)).digest("hex")}}function GA(e,t){return Bh(e,t)}function Xc(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=GA(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!wh(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 KA(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:VA(e,t)}function Vc(e,t,n,r,o,i){let a=KA(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==D)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=Bh(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!wh(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&&F(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=Ue(f,`${r} evidence amountWei`);if(m<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=wt(a.gasLimit,`${r} evidence gasLimit`),y=wt(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*y!==m)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)!==D)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(F(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let g=F(w.sender,`${r} simulation sender`),b=F(w.owner,`${r} simulation owner`);if(!o.owner||g!==o.owner||b!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Ue(w.valueWei,`${r} simulation valueWei`))!==String(Ue(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&&F(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 k=Number(w.quotedAtMs),E=Number(w.expiresAtMs);if(!Number.isFinite(k)||!Number.isFinite(E)||k>n||E<=n||E<=k)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 bh(e){let t=F(e,"OpenSea payment token");if(t!==Yc&&t!==Fe)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Jc(e={},t={}){let n=await Di(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=F(e.owner,"execution owner")}catch{}let a=(w,v,g,b={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(v?.blockNumber??""),blockHash:String(v?.blockHash||"").toLowerCase(),leg:g,owner:i,...b}),s=(w,v,g,b,k)=>Vc(e.gasEvidence??e.gasCostEvidence,w,r,`${v} gas`,a(g,b,v,k),o),c=(w,v)=>{let g=null;try{g=F(w?.target,"conversion target")}catch{}let b=a(w?.calldataHash,w,"conversion",{target:g,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(b.calldataHash)||!/^0x[0-9a-f]{64}$/.test(b.blockHash)||!/^\d+$/.test(b.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let k=Vc(e.conversionGasEvidence??e.conversionGasCostEvidence,v,r,"conversion gas",b,o);if(k.amount!=null||w?.gasEstimate==null)return k;let E=Vc(e.gasPriceEvidence,v,r,"gas price",{...b,leg:"conversion-gas-price"},o);if(E.amount==null)return{amount:null,evidence:null,error:E.error};let I=Ue(w.gasEstimate,"conversion gasEstimate");return{amount:I*E.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:v,leg:"conversion",gasEstimate:I.toString(),gasPriceEvidence:E.evidence},error:null}},l=(w,v,g,b,k)=>{try{let E=String(v?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(E))throw new Error("exact Seaport order hash is required");let I=F(v?.protocolAddress,"Seaport protocol address"),_=String(v?.executionCalldataHash||"").toLowerCase(),O=/^0x[0-9a-f]{64}$/.test(_)?_:null,N=b==="seaport-fulfillment"&&k===Yc?String(v?.priceWei??""):"0",T={orderHash:E,protocolAddress:I,target:I,valueWei:N},q=s(w,b,O,g,T);if(q.amount==null)throw new Error(q.error);if(q.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let se=q.evidence?.approvalRequired;if(typeof se!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof v?.approvalRequired=="boolean"&&v.approvalRequired!==se)throw new Error("Seaport approval requirement evidence mismatch");let Z=[q];if(se){let H=String(v?.approvalCalldataHash||"").toLowerCase(),U=/^0x[0-9a-f]{64}$/.test(H)?H:null,Q=b==="seaport-offer-acceptance"?n.collection:k;Z.push(s(w,"seaport-approval",U,g,{...T,target:Q,valueWei:"0"}))}if(k===Yc){let H=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",U=String(v?.prerequisiteCalldataHash||"").toLowerCase(),Q=/^0x[0-9a-f]{64}$/.test(U)?U:null,be=H==="wrap-native-to-weth"?String(v?.sellerNetWei??""):"0";Z.push(s(w,H,Q,g,{...T,target:Fe,valueWei:be}))}let R=Z.find(H=>H.amount==null);if(R)throw new Error(R.error);return{amount:Z.reduce((H,U)=>H+U.amount,0n),evidence:Z.map(H=>H.evidence),error:null}}catch(E){return{amount:null,evidence:null,error:String(E.message||E)}}},u=Ue(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Qo,p=t.openSeaBestOffer||Zo,f=t.paymentTokenConversion||(w=>zA({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),m=await qi({market:n.market,collection:n.collection},t),h=[];for(let w of n.candidates){let v=null;try{v=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId},t)}catch{}let g=w.quote,b=Gc(Ae.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(g.totalCostRaw)])).toLowerCase(),k=s("anvil-to-opensea","anvil-call",b,g.evidence.attestation,{target:n.market,valueWei:g.nativeSwapFeeWei}),E=null,I=null;if(v)try{E=bh(v.paymentToken)}catch(U){I=String(U.message||U)}let _=I||!v?{amount:null,evidence:null,error:I||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",v,g.evidence.attestation,"seaport-offer-acceptance",E),O={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:g.paymentToken,amountUnits:g.amountUnits,anvilTotalCostRaw:g.totalCostRaw,anvilBaseCostRaw:g.baseCostRaw,anvilFeeRaw:g.fees.totalFeeRaw,paymentTokenDecimals:g.paymentTokenDecimals,nativeSwapFeeWei:g.nativeSwapFeeWei,openSeaGrossOfferWei:v?.grossOfferWei==null?null:String(v.grossOfferWei),openSeaSellingValueWei:v?.sellerNetWei==null?null:String(v.sellerNetWei),openSeaFeeWei:v?.feeWei==null?null:String(v.feeWei),openSeaPaymentToken:E,gasCostWei:k.amount==null?null:k.amount.toString(),gasEvidence:k.evidence,marketplaceGasCostWei:_.amount==null?null:_.amount.toString(),marketplaceGasEvidence:_.evidence,conversionGasCostWei:null};if(v?.sellerNetWei==null||!g.available)h.push({...O,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(I)h.push({...O,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${I}`});else if(k.amount==null)h.push({...O,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${k.error}`});else if(_.amount==null)h.push({...O,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${_.error}`});else if(typeof f!="function")h.push({...O,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let U=yh(await f({chainId:D,direction:"acquire-exact-output",amountRaw:g.totalCostRaw,paymentToken:g.paymentToken,quoteToken:Fe}),{direction:"acquire-exact-output",amountRaw:g.totalCostRaw}),Q=c(U,"anvil-to-opensea");if(Q.amount==null)h.push({...O,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${Q.error}`});else{let be=k.amount+_.amount+Q.amount,xe=BigInt(v.sellerNetWei)-BigInt(U.amountInWei)-BigInt(g.nativeSwapFeeWei)-be;h.push({...O,conversionGasCostWei:Q.amount.toString(),conversionGasEvidence:Q.evidence,totalExecutionGasWei:be.toString(),anvilCostInWethWei:U.amountInWei,conversion:U,netWei:xe.toString(),decision:gh(xe,u),reason:xe>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(U){h.push({...O,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}let N=null;try{N=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!N)continue;let T=Gc(Ae.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(m.netPayoutRaw)])).toLowerCase(),q=s("opensea-to-anvil","anvil-call",T,m.evidence.attestation,{target:n.market,valueWei:m.nativeSwapFeeWei}),se=null,Z=null;try{se=bh(N.paymentToken)}catch(U){Z=String(U.message||U)}let R=Z?{amount:null,evidence:null,error:Z}:l("opensea-to-anvil",N,m.evidence.attestation,"seaport-fulfillment",se),H={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:m.paymentToken,amountUnits:m.amountUnits,openSeaBuyPriceWei:String(N.priceWei),anvilGrossPayoutRaw:m.grossPayoutRaw,anvilNetPayoutRaw:m.netPayoutRaw,anvilFeeRaw:m.fees.totalFeeRaw,paymentTokenDecimals:m.paymentTokenDecimals,nativeSwapFeeWei:m.nativeSwapFeeWei,openSeaPaymentToken:se,gasCostWei:q.amount==null?null:q.amount.toString(),gasEvidence:q.evidence,marketplaceGasCostWei:R.amount==null?null:R.amount.toString(),marketplaceGasEvidence:R.evidence,conversionGasCostWei:null};if(Z){h.push({...H,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${Z}`});continue}if(q.amount==null){h.push({...H,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${q.error}`});continue}if(R.amount==null){h.push({...H,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${R.error}`});continue}if(typeof f!="function"){h.push({...H,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let U=yh(await f({chainId:D,direction:"liquidate-exact-input",amountRaw:m.netPayoutRaw,paymentToken:m.paymentToken,quoteToken:Fe}),{direction:"liquidate-exact-input",amountRaw:m.netPayoutRaw}),Q=c(U,"opensea-to-anvil");if(Q.amount==null)h.push({...H,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${Q.error}`});else{let be=q.amount+R.amount+Q.amount,xe=BigInt(U.amountOutWei)-BigInt(N.priceWei)-BigInt(m.nativeSwapFeeWei)-be;h.push({...H,conversionGasCostWei:Q.amount.toString(),conversionGasEvidence:Q.evidence,totalExecutionGasWei:be.toString(),anvilPayoutInWethWei:U.amountOutWei,conversion:U,netWei:xe.toString(),decision:gh(xe,u),reason:xe>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(U){h.push({...H,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}}let y=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:D,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:y.sort((w,v)=>{let g=BigInt(w.netWei??"-1"),b=BigInt(v.netWei??"-1");return b>g?1:b<g?-1:0}),arbCount:y.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Hi(e={},t={}){let n=tt(t),r=vt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([Y(n,Ve.ammVault,mh,"quoteSpecificBuy",[BigInt(r)]),Y(n,Ve.ammVault,mh,"inventory",[BigInt(r)]),Y(n,Ve.nft,Ge,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:F(a[0],"broker owner")===Ve.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:D,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 Mh(e,t){try{return F((await Y(t,Ve.nft,Ge,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return F((await Y(t,Ve.nft,Ge,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Fh(e={},t={}){let n=tt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ne(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=vt(a.brokerTokenId,"brokerTokenId"),c=vt(a.nestedTokenId,"nestedTokenId"),l=F(a.tba,"TBA"),u=F(a.nestedCollection,"nested collection"),d=Ch({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,f,m]=await Promise.all([Mh(s,n),Y(n,u,Ge,"ownerOf",[BigInt(c)]).then(y=>F(y[0],"nested owner")),Hi({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:D,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function Uh(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=F(e.buyer,"buyer"),r=vt(e.brokerTokenId,"brokerTokenId"),o=Ue(e.maxTokenCostWei,"maxTokenCostWei"),i=Ue(e.maxEthFeeWei,"maxEthFeeWei"),a=await Hi({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 P({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:D,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:Ve.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 eo(e={},t={}){let n=tt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?Ve.overtimeBooster:Ve.stockBooster,[i,a,s,c,l,u]=await Promise.all([Y(n,o,Bt,"pendingEth"),Y(n,o,Bt,"minDropWei"),Y(n,o,Bt,"roundActive"),Y(n,o,Bt,"currentRound"),Y(n,o,Bt,"roundState").catch(()=>null),Y(n,o,Bt,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),f=!!s[0],m=!f&&d>=p,h=f;return{provider:"stonkbrokers",chainId:D,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(y=>F(y,"stock token")):[],canStart:m,canContinue:h,action:h?"continueDrop":m?"startDropPublic":"wait",exec:!1,readOnly:!0}}function qh(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?Ve.overtimeBooster:Ve.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Bt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Bt.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return P({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:D,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:D,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function Dh(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>vt(s,"brokerTokenId")):[],r=tt(t),o=await Ne(n,8,async s=>{let[c,l]=await Promise.all([Y(r,Ve.nft,Ge,"ownerOf",[BigInt(s)]).then(u=>F(u[0],"broker owner")),Mh(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([eo({which:"stock"},t),eo({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:D,owner:e.owner?F(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Hh(e={},t={}){try{let n=await Un(e,t);return{ok:!0,chainId:D,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:D,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Wh(e={},t={}){try{let n=await eo({which:"stock"},t);return{ok:!0,chainId:D,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:D,error:String(n.message||n).slice(0,180)}}}K();import{createHash as XA}from"node:crypto";var Wi="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",JA=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"}]),cn=Object.freeze(Object.fromEntries(JA.map(e=>[e.name,e.selector]))),QA=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),ZA=new Set(["name","endpoint","version","skills","domains"]),e1=new Set(["agentId","agentRegistry"]),jh=new Set(["reputation","crypto-economic","tee-attestation"]),t1=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,n1=64*1024;function to(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 Qc(e,t,n){for(let r of Object.keys(e)){if(t1.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 qn(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 zh(e,t,{service:n=!1}={}){let r=qn(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 Zc(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 ji(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function el(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 tl(e){let t=ji(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Zc(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Gh(){let e=[];try{let t=ji(process.env.ORACLE_ERC8004_CHAIN_ID);tl(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 r1(e){return JSON.parse(JSON.stringify(e))}function zi(e){let t=to(e,"registration file");if(Qc(t,QA,"registration"),t.type!==Wi)throw new Error("erc8004: registration-v1 type required");let n={type:Wi,name:qn(t.name,"name",128),description:qn(t.description,"description",4096),image:zh(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=to(a,`services[${s}]`);Qc(c,ZA,`services[${s}]`);let l=qn(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:zh(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=qn(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=to(a,`registrations[${s}]`);Qc(c,e1,`registrations[${s}]`);let l=el(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>jh.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!jh.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>n1)throw new Error("erc8004: registration metadata oversized");return r1(n)}function o1(e){if(to(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Wi)throw new Error("erc8004: registration-v1 type required");return zi({type:Wi,...e})}function i1(e){let t=zi(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function no(e){return BigInt(e).toString(16).padStart(64,"0")}function Kh(e){let t=Buffer.from(e,"utf8").toString("hex");return`${no(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function a1(e){return`${cn.register}${no(32)}${Kh(e)}`}function s1(e,t){return`${cn.setAgentURI}${no(e)}${no(64)}${Kh(t)}`}function c1(e,t){return`${e}${no(t)}`}function l1(e){return XA("sha256").update(e,"utf8").digest("hex")}function nl(e,t){to(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 Yh(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=ji(e.chainId),c=Zc(e.owner,"owner"),l=tl(s),u=Number(t?.nowMs??Date.now());return P({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:l1(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 Xh(e={},t={}){nl(e,new Set(["chainId","owner","registration"]));let n=i1(o1(e.registration));return Yh(e,t,{kind:"erc8004-register",uri:n,selector:cn.register,data:a1(n)})}function Jh(e={},t={}){nl(e,new Set(["chainId","owner","agentId","agentURI"]));let n=el(e.agentId),r=Qh(e.agentURI);return Yh(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:cn.setAgentURI,data:s1(n,r),id:n})}function Qh(e){let t=qn(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 zi(o),t}function Vh(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 Zc(`0x${e.slice(-40)}`,t)}function u1(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 Zh(e={},t={}){nl(e,new Set(["chainId","agentId"]));let n=ji(e.chainId),r=el(e.agentId),o=tl(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:c1(d,r)},"latest"]),[a,s,c]=await Promise.all([i(cn.ownerOf),i(cn.tokenURI),i(cn.getAgentWallet)]),l=Qh(u1(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=zi(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Vh(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Vh(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}de();var e0=999;async function t0(e={}){let t={chainId:e0,rpc:null,dex:null};try{t.rpc=await kn(e0,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await vr("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 n0(e="HYPE",t={}){let r=(await vr(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 r0(e,t={}){return Xt(e,t)}L();K();var m1="https://api-mainnet.magiceden.dev/v2",ro=1e9;function o0(e={}){return Qe({provider:"magiceden",defaultUrl:m1,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Hn(e={}){return o0(e).baseUrl}function ln(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function Wn(e={}){let t=ln(e);return He({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},o0(e).trusted)}function rl(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 Dn(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 f1(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 h1(e){return Math.round(Dn(e,"priceSol")*ro)}function g1(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 y1({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function b1(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=y1(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function i0(e={}){try{let t=await ol({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!ln(e),readTier:"keyless",prepareTier:ln(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!ln(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function ol(e={},t={}){let n=rl(e.symbol||e.collection),r=await x(`${Hn(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:Wn(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/ro:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/ro:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/ro:null,exec:!1,raw:r}}function a0(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*ro):null,tokenSize:e.tokenSize??1}}async function s0(e={},t={}){let n=rl(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(`${Hn(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 x(i.toString(),{headers:Wn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(a0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function c0(e={},t={}){let n=ce(e.tokenMint||e.mint,"tokenMint"),r=await x(`${Hn(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:Wn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(a0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function l0(e={},t={}){if(!ln(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=ce(e.buyer||e.userPublicKey,"buyer"),r=ce(e.seller,"seller"),o=ce(e.tokenMint,"tokenMint"),i=ce(e.tokenATA||e.tokenAddress,"tokenATA"),a=ce(e.auctionHouse,"auctionHouse"),s=Dn(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:Dn(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Hn(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 x(l.toString(),{headers:Wn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});bt("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 P({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:h1(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Vi(e={},t={}){if(!ln(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=ce(e.seller||e.userPublicKey,"seller"),r=ce(e.tokenMint,"tokenMint"),o=ce(e.tokenATA||e.tokenAddress,"tokenATA"),i=ce(e.auctionHouse,"auctionHouse"),a=Dn(e.priceSol??e.price,"priceSol"),s=g1(e.expiry),c=b1(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${Hn(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",ce(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await x(l.toString(),{headers:Wn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});bt("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 P({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 u0(e={},t={}){if(!ln(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=ce(e.buyer||e.userPublicKey,"buyer"),r=rl(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=Dn(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:Dn(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${Hn(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await x(a.toString(),{headers:Wn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=f1(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`);bt("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 P({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})}K();Xs();L();Ze();var jn=8,il=10n**BigInt(jn),v1="0xa4b1",d0=7,al=1,x1=2n**64n-1n;function k1(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 io(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Vn(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 oo(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>jn)throw new Error(`hl-staking: ${t} has more than ${jn} decimals`);let i=BigInt(r)*il+BigInt((o+"0".repeat(jn)).slice(0,jn)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>x1)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function zn(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function xt(e){let t=BigInt(String(e||"0")),n=t/il,r=(t%il).toString().padStart(jn,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function p0(e={}){try{let t=await sl(e);return{ok:t.count>0,provider:"hl-staking",chain:io(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 sl(e={}){let t=await oe({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 cl(e={},t={}){let n=Vn(e.user||e.address,"user"),r=await oe({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 ll(e={},t={}){let n=Vn(e.user||e.address,"user"),r=await oe({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 m0(e={},t={}){let n=Vn(e.user||e.address,"user"),r=await oe({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function f0(e={},t={}){let n=Vn(e.user||e.address,"user"),r=await oe({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function ul(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 Gi(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||v1)}function S1(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Gi(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function dl({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:io(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:k1(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:S1(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=hi(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,P(l,{provider:"hl-staking",kind:e})}function h0(e={},t={}){let n=oo(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:oo(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${xt(n)} HYPE exceeds maxHype cap ${xt(r)} HYPE`);let o=ul(e),i=io(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Gi(t),wei:zn(n),nonce:o};return dl({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:zn(n),nonce:o},opts:t,args:e,caps:{amountHype:xt(n),maxHype:r?xt(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 g0(e={},t={}){let n=oo(e.amountHype??e.amount,"amountHype"),r=ul(e),o=io(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Gi(t),wei:zn(n),nonce:r};return dl({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:zn(n),nonce:r},opts:t,args:e,caps:{amountHype:xt(n)},notes:[`Starts the ${d0} 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 y0(e={},t={}){let n=Vn(e.validator,"validator"),r=oo(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:oo(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${xt(r)} HYPE exceeds maxHype cap ${xt(s)} HYPE`);let c=ul(e),l=io(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Gi(t),validator:n,wei:zn(r),isUndelegate:a,nonce:c};return dl({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:zn(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:xt(r),maxHype:s?xt(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${al} 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 ${al} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function b0(e={},t={}){let n=Vn(e.user||e.address,"user"),r=await cl({user:n},t),o=await ll({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:d0,validatorLockupDays:al,exec:!1}}Ze();async function pl(e={}){let t=Date.now();try{let n=await ft(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 I1=24*365,A1=8;function _e(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function _1(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Ki(e={},t={}){let[n,r]=await Promise.all([je(t),ft(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=_e(u.markPx),p=_e(u.prevDayPx),f=_e(u.openInterest),m=_e(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:_e(u.oraclePx),midPx:_e(u.midPx)??_e(r?.[c.name]),prevDayPx:p,change24hPct:_1(d,p),dayNtlVolumeUsd:_e(u.dayNtlVlm),premium:_e(u.premium),fundingRate:m,fundingRateAprPct:m==null?null:m*(I1/A1)*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 w0(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Ki(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 v0(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([Ki({},t),si({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),An(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:_e(h.o),high:_e(h.h),low:_e(h.l),close:_e(h.c),volume:_e(h.v)})),p=l?.levels??[],f=_e(p?.[0]?.[0]?.px),m=_e(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 x0(e={},t={}){let n=await ci(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 V1,readFileSync as G1,readdirSync as K1,renameSync as Y1,writeFileSync as X1}from"node:fs";import{homedir as J1}from"node:os";import{join as Qi}from"node:path";var ao=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});L();de();K();import{Interface as ml,getAddress as P0,isAddress as C1}from"ethers";var k0=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),S0=Object.freeze({42161:{name:"arbitrum",api:k0[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:k0[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),E0="0x0000000000000000000000000000000000000000",T1=`0x${"0".repeat(64)}`,I0=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),A0=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Yi=new ml(["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"]),C0=new ml(["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)"]),N1=new ml(["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)"]),O1=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Kn(e){let t=Number(e??42161),n=S0[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(S0).join(", ")})`);return{chainId:t,...n}}function Xi(e,t={}){let n=Kn(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function Ke(e,t){if(!C1(e))throw new Error(`${t} must be a valid EVM address`);return P0(e)}function J(e){return P0(e).toLowerCase()}function Gn(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 un(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 R1(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 L1(e){let t=String(e||"marketIncrease").trim();if(!(t in I0))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:I0[t]}}function $1(e){let t=String(e||"noSwap").trim();if(!(t in A0))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:A0[t]}}function B1(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function M1(e,t){let n=J(t);return e.find(r=>J(r.marketToken||r.market||r.address)===n)||null}function F1(e,t){let n=J(t);return e.find(r=>J(r.tokenAddress||r.address)===n)||null}function U1({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Gn(e?.minPrice,"gmx minPrice"),i=Gn(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 q1(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function D1(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function lt(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 H1(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:lt(t,"account",a=>J(a)),market:lt(t,"market",a=>J(a)),initialCollateralToken:lt(t,"initialCollateralToken",a=>J(a)),key:lt(o,"key",a=>String(a).toLowerCase()),reason:lt(i,"reason",a=>String(a)),sizeDeltaUsd:lt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:lt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:lt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:lt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:lt(r,"isLong",a=>!!a)}}function W1(e={},t){if(J(e.address)!==J(t.eventEmitter))return null;let n;try{n=N1.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=O1[r];if(!o)return null;let i=H1(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||D1(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?J(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 _0(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function j1(e=[],{chainId:t}={}){let n=Kn(t);return(Array.isArray(e)?e:[]).map(r=>W1(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function T0(e={},t={}){return x(`${Xi(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fl(e={},t={}){return x(`${Xi(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function N0(e={},t={}){return x(`${Xi(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Yn(e={},t={}){return x(`${Xi(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function O0(e={}){let t=await Yn({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function R0(e={},t={}){let n=Kn(e.chainId??42161),r=Ke(e.account||e.owner||e.user,"gmx account"),o=un(e.start??0,"gmx start"),i=un(e.end??e.limit??20,"gmx end"),a=C0.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||M)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:J(n.reader),dataStore:J(n.dataStore),account:J(r),raw:c}}async function L0(e={},t={}){let n=Kn(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=C0.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||M)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:J(n.reader),dataStore:J(n.dataStore),key:r,raw:a}}async function $0(e={},t={}){let n=Kn(e.chainId??42161),r=t.receipt||await wr({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=j1(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)=>_0(d.status)>=_0(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?J(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:J(n.eventEmitter),events:s,receipt:r}}async function B0(e={},t={}){let n=Kn(e.chainId??42161),r=L1(e.orderType||e.type),o=$1(e.decreasePositionSwapType),i=Ke(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=Ke(e.receiver||i,"gmx receiver"),s=Ke(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?Ke(e.callbackContract,"gmx callbackContract"):E0,l=e.uiFeeReceiver?Ke(e.uiFeeReceiver,"gmx uiFeeReceiver"):E0,u=Ke(e.market||e.marketToken,"gmx market"),d=Ke(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Gn(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):un(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),f=Gn(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),m=Gn(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(m>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let y=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(f>y)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let w=R1(e.maxSlippageBps??e.slippageBps,50),v=e.isLong==null?!0:!!e.isLong,[g,b]=await Promise.all([fl({chainId:n.chainId},t),Yn({chainId:n.chainId},t)]),k=M1(B1(g,"markets"),u);if(!k)throw new Error("gmx market not found in public registry");if(k.isListed===!1)throw new Error("gmx market is not listed");let E=Ke(k.indexToken,"gmx market indexToken"),I=Ke(k.longToken,"gmx market longToken"),_=Ke(k.shortToken,"gmx market shortToken"),O=J(d);if(![J(I),J(_)].includes(O))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let N=q1(k,v);if(N>0n&&f>N)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=F1(b,E);if(!T)throw new Error("gmx index ticker not found");let q=e.acceptablePrice?Gn(e.acceptablePrice,"gmx acceptablePrice").toString():U1({ticker:T,isLong:v,typeKey:r.key,maxSlippageBps:w}),se=(e.swapPath||[]).map(le=>Ke(le,"gmx swapPath market"));if(se.length>3)throw new Error("gmx swapPath too long for guarded slice");let Z=un(e.triggerPrice??"0","gmx triggerPrice"),R=un(e.callbackGasLimit??"0","gmx callbackGasLimit"),H=un(e.minOutputAmount??"0","gmx minOutputAmount"),U=un(e.validFromTime??"0","gmx validFromTime"),Q=!!e.shouldUnwrapNativeToken,be=e.autoCancel==null?!0:!!e.autoCancel,xe=String(e.referralCode||T1);if(!/^0x[0-9a-fA-F]{64}$/.test(xe))throw new Error("gmx referralCode must be bytes32 hex");let pt=Array.isArray(e.dataList)?e.dataList:[];for(let le of pt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(le)))throw new Error("gmx dataList entries must be bytes32 hex");let Et={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:se},numbers:{sizeDeltaUsd:f,initialCollateralDeltaAmount:p,triggerPrice:Z,acceptablePrice:BigInt(q),executionFee:m,callbackGasLimit:R,minOutputAmount:H,validFromTime:U},orderType:r.code,decreasePositionSwapType:o.code,isLong:v,shouldUnwrapNativeToken:Q,autoCancel:be,referralCode:xe,dataList:pt},C=[];r.key==="marketIncrease"&&p>0n&&C.push(Yi.encodeFunctionData("sendTokens",[d,n.orderVault,p])),C.push(Yi.encodeFunctionData("sendWnt",[n.orderVault,m])),C.push(Yi.encodeFunctionData("createOrder",[Et]));let B=Yi.encodeFunctionData("multicall",[C]),V={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:J(i),receiver:J(a),exchangeRouter:J(n.exchangeRouter),router:J(n.router),orderVault:J(n.orderVault),market:J(u),indexToken:J(E),initialCollateralToken:J(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:f.toString(),executionFee:m.toString(),acceptablePrice:q,maxSlippageBps:w,isLong:v,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return P({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:J(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:J(d),spender:J(n.router),amount:p.toString()}:null,gmxGuard:V,transaction:{chainId:n.chainId,from:J(i),to:J(n.exchangeRouter),data:B,value:m.toString(),gmxGuard:V}},{provider:"gmx",kind:"gmx-order"})}Ze();var Mt="oracle.hl.entry-state.v1",Q1=8,Z1=24*365;function ie(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Xn(e){return e==null||e===0?0:e>0?1:-1}function so(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function e_(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Qi(J1(),".config","oracle")}function U0(e={}){return Qi(e_(e),"hl-entry-states")}function Ji(e,t,n){return n==null&&e.push(t),n}function t_(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 kt(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function n_(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:ie(a.time),rate:ie(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return kt("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)Xn(o[a].rate)!==Xn(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 r_(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return kt("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=ie(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}:kt("defillama.stablecoins","no peggedUSD")}function M0(e,t){let n=ie(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 o_(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 kt("gmx.tickers","no matching symbol");let c=M0(s.minPrice,n),l=M0(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return kt("gmx.tickers","unreadable price");let d=n!=null&&n>0?so(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?kt("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 i_({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?kt("hl-info.fundingHistory","not fetched"):n_(r,{coin:e,asOfMs:n}),llamaStables:o==null?kt("defillama.stablecoins","not fetched"):r_(o,n),gmxTicker:i==null?kt("gmx.tickers","not fetched"):o_(i,{coin:e,hlMark:t,asOfMs:n})}}function F0(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=ie(s?.px),l=ie(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 a_(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=ie(i.szi),s=ie(i.positionValue)!=null&&a?Math.abs(ie(i.positionValue)/a):null,c=ie(i.entryPx),l=ie(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:ie(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:f}}function s_({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:Mt,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=t_(n,e);if(!d)return{schema:Mt,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:f}=d,m=Ji(u,"markPx",ie(f.markPx)),h=Ji(u,"oraclePx",ie(f.oraclePx)),y=ie(f.midPx),w=ie(f.premium),v=Ji(u,"fundingRate",ie(f.funding)),g=Ji(u,"openInterestCoin",ie(f.openInterest)),b=ie(f.dayNtlVlm),k=Array.isArray(f.impactPxs)?f.impactPxs:[],E=ie(k[0]),I=ie(k[1]),_=v==null?null:v*(Z1/Q1)*100,O=g==null||m==null?null:g*m,N=i==null||i===0||g==null?null:(g-i)/i*100;N==null&&u.push("oiDeltaPct");let T=r?.levels,q=Array.isArray(T)?T[0]:[],se=Array.isArray(T)?T[1]:[],Z=ie(q?.[0]?.px),R=ie(se?.[0]?.px);Z==null&&u.push("book.bidPx"),R==null&&u.push("book.askPx");let H=F0(se,Number(t)||0,"buy"),U=F0(q,Number(t)||0,"sell");H.fillable||u.push("book.buyFillable"),U.fillable||u.push("book.sellFillable");let Q=y??m,be=H.avgFillPx==null||Q==null?null:so(H.avgFillPx,Q),xe=U.avgFillPx==null||Q==null?null:so(Q,U.avgFillPx),pt=a_(o,e);for(let V of pt.unknown||[])u.push(V);let Et=ie(f.prevDayPx),C=m==null||Et==null||Et===0?null:(m-Et)/Et*100;C==null&&u.push("change24hPct");let B=i_({coin:String(p.name),hlMark:m,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return B.fundingPath.unknown&&u.push("overlays.fundingPath"),B.llamaStables.unknown&&u.push("overlays.llamaStables"),B.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Mt,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:m,oraclePx:h,midPx:y,premium:w,markOracleBps:so(m,h),fundingRate:v,fundingAprPct:_,openInterestCoin:g,openInterestUsd:O,oiDeltaPct:N,dayNtlVolumeUsd:b,change24hPct:C,impactBidPx:E,impactAskPx:I,maxLeverage:p.maxLeverage??null,book:{bidPx:Z,askPx:R,spreadBps:Z==null||R==null?null:so(R,Z),notionalUsd:Number(t)||0,buy:H,sell:U,buySlipBps:be,sellSlipBps:xe},position:pt,overlays:B,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function q0(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 c_(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 l_({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Mt||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=c_(n),a=q0(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Mt,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:ao.ALERT_ONLY},c=U0({...o,configDir:r||o.configDir});V1(c,{recursive:!0,mode:448});let l=Qi(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return X1(u,`${JSON.stringify(s,null,2)}
|
|
144
|
-
`,{mode:384}),Y1(u,l),s}function hl(e={}){let t=U0(e),n=[];try{n=K1(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(G1(Qi(t,r),"utf8")))}function u_(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:ao.ALERT_ONLY};let r=e.see,o=t;Xn(r.fundingRate)!==Xn(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),Xn(r.premium)!==Xn(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:Mt,id:e.id,coin:e.see.coin,side:e.side,actionMode:ao.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function D0(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await je(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 co(e={},t={}){let n=e.coin,r=ie(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([je(t),n?An(n,t).catch(()=>null):Promise.resolve(null),e.user?_n(e.user,t).catch(()=>null):Promise.resolve(null),n?Tp({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Oi({},t).catch(()=>null),Yn({chainId:42161},t).catch(()=>null)]);return s_({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:ie(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function H0(e={},t={}){let n=e.see&&e.see.schema===Mt?e.see:await co(e,t);return{see:n,...q0(n,e.side)}}async function W0(e={},t={}){let n=e.see&&e.see.schema===Mt?e.see:await co(e,t);return l_({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function j0(e={},t={}){let n=e.locked||hl(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:ao.ALERT_ONLY};let r=await co({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return u_(n,r)}Ze();fi();vi();async function z0(e={}){let t=await Nr(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function V0(e={},t={}){let n=e.coin,r=e.outcome==null?null:Pt(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=K0(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=gl(i)));let a=n==null?null:Ct(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 Nr(t))?.outcomes||[]).find(m=>{try{return Pt(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=gl(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=Pt(r,i).coin}if(a=Ct(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,Nn(c,t)}async function G0(e={},t={}){let n=e.coin,r=e.outcome==null?null:Pt(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=K0(e.outcomeSide):(o=e.side,o!=null&&(o=gl(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Pt(r,o).coin}let i=Ct(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,qr(a,t)}function K0(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function gl(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")}K();Pn();var EM="0x"+"00".repeat(32);function Y0(e,t){let n=BigInt(ye(e.makerAmount,"poly: makerAmount")),r=BigInt(ye(e.takerAmount,"poly: takerAmount"));if(n<=0n||r<=0n)throw new Error("poly: order amounts must be positive integer micro-units");return Number(t==="BUY"?n:r)/1e6}Pn();var m_=new Set(["https://clob.polymarket.com/order"]),lo=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),PM=Object.freeze(lo.map(e=>e[0])),f_=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),h_="0xe111180000d2663c0091e4f400237545b87b996b",g_="0xe2222d279d744050d28e00520010520000310f59",X0=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function J0(e){let t=String(e||"").replace(/\/$/,"");if(!m_.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Q0(e){let t=ze(e,"poly: exchange").toLowerCase();if(!f_.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Z0(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=X0(n.kind,"kind",48);if(r!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(ze(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(J0(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(Q0(o.verifyingContract),Q0(n.exchange),ze(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==ze(n.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof n.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=n.negRisk?g_:h_;if(ze(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==lo.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let y=0;y<lo.length;y+=1)if(s[y]?.name!==lo[y][0]||s[y]?.type!==lo[y][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(ze(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(ze(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=X0(n.tokenId,"tokenId",80);if(ze(a.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=Y0(a,d),f=Se(n.notionalUsdc,6,"poly: notionalUsdc"),m=Se(p,6,"poly: computed notional");if(f!==m)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let h=t.maxNotionalUsd??t.maxNotionalUsdc;if(h!=null){let y=Se(h,6,"poly: maxNotionalUsd");if(m>y)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:String(p),notional:String(p),fee:"0",kind:r,tokenId:l,side:d,submitTo:J0(n.submitTo)})}function y_(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 eg(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:y_({...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,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 Z0(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as $M,randomInt as b_}from"node:crypto";import{keccak256 as MM,concat as FM,zeroPadValue as UM,getCreate2Address as qM,AbiCoder as DM}from"ethers";var ig=137;var w_="0xE111180000d2663C0091e4f400237545B87B996B",v_="0xe2222d279d744050d28e00520010520000310F59",tg="0x0000000000000000000000000000000000000000000000000000000000000000",yl=6;var x_={name:"Polymarket CTF Exchange",version:"2",chainId:ig},k_={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"}]},ng={"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 Zi(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function ea(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function rg(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function S_(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function E_(e,t,n,r){let o=S_(Number(n),r.price);if(e==="BUY"){let c=ea(Number(t),r.size),l=c*o;return Zi(l)>r.amount&&(l=rg(l,r.amount+4),Zi(l)>r.amount&&(l=ea(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=ea(Number(t),r.size),s=a*o;return Zi(s)>r.amount&&(s=rg(s,r.amount+4),Zi(s)>r.amount&&(s=ea(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function og(e){let t=Number(e).toFixed(yl),[n,r=""]=t.split(".");return(n+r.padEnd(yl,"0").slice(0,yl)).replace(/^0+/,"")||"0"}function I_(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=tg,builder:p=tg}=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=ng[String(c)]||ng["0.01"],{rawMakerAmt:y,rawTakerAmt:w}=E_(n,m,f,h),v=og(y),g=og(w),b=String(b_(1,2**31-1)),k=Date.now().toString(),E=n==="BUY"?0:1,I=s?v_:w_,_={salt:b,maker:i,signer:a,tokenId:String(t),makerAmount:v,takerAmount:g,side:E,signatureType:u,timestamp:k,metadata:d,builder:p};return{domain:{...x_,verifyingContract:I},types:k_,value:_,orderType:l,side:n,notionalUsdc:n==="BUY"?y:w,exchange:I,negRisk:s}}function ag(){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 sg(e={},t={}){let n=I_(e),r={provider:"poly-clob",kind:"poly-order",chainId:ig,tokenId:String(e.tokenId),side:n.side,orderType:n.orderType,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=eg(r,e,t)}catch{r.oraclePrepared=!1}return P(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as G_,keccak256 as wg}from"ethers";import{wordlists as __}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/],T_=new Set([12,15,18,21,24]);function N_(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return T_.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=cg(e);return L_.has(t)||R_.test(t)}var uo=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function cg(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function B_(e){let t=cg(e);return[...P_].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 uo(n);if(O_.test(t)&&!$_(e))throw new uo(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 uo(i);e[o]!==void 0&&(r[o]=bl(e[o],i,o))}return r}function lg(e){return bl(e)}K();sa();ra();var K_=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function Y_(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=lg(e);for(let o of Object.keys(n))if(!K_.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 vg(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=mg(n,o),a=bg(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 G_(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}:{...Y_(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},f={chainId:r,to:null,data:u,value:"0x0"};return P({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:wg(s),authorityReport:fg(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:wg(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:ia},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"})}sa();Al();vi();L();var sP="https://api.geckoterminal.com/api/v2",ua=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||sP).replace(/\/$/,""),Qn=e=>encodeURIComponent(String(e));async function _l(e={},t={}){let n=Math.max(1,Number(e.page||1));return x(`${ua(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Pg(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return x(`${ua(t)}/networks/${Qn(e.network)}/pools/${Qn(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cg(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return x(`${ua(t)}/networks/${Qn(e.network)}/tokens/${Qn(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Tg(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)),x(`${ua(t)}/networks/${Qn(e.network)}/pools/${Qn(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ng(e={}){let t=await _l({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}L();de();import{Interface as $g,getAddress as Bg,isAddress as lP}from"ethers";K();var uP="https://api.curve.finance/v1",Mg=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||uP).replace(/\/$/,""),dP=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),Fg="0x0000000000000000000000000000000000000000",Pl=new $g(["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)"]),Og=new $g(["function coins(uint256) view returns (address)"]);function Ug(e){let t=dP[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function wo(e,t){if(!lP(e))throw new Error(`${t} must be a valid EVM address`);return Bg(e)}function pP(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 Rg(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 qg(e,t,n){return[e,t,n,...Array(8).fill(Fg)]}function Dg(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Hg(e){return[e,...Array(4).fill(Fg)]}async function mP({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=Og.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=Og.decodeFunctionResult("coins",c);i.push(Bg(l[0]))}return i}function Lg(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 Wg(e={}){return x(`${Mg(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Cl(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 x(`${Mg(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function jg(e={}){let t=await Cl({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Tl(e={},t={}){let n=Number(e.chainId??8453),r=Ug(n),o=wo(e.pool,"curve pool"),i=wo(e.tokenIn,"curve tokenIn"),a=wo(e.tokenOut,"curve tokenOut"),s=pP(e.amountIn,"curve amountIn"),c=Rg(e.nCoins??2,"curve nCoins",2,8),l=Rg(e.poolType,"curve poolType",1,4),u=t.rpcCall||M,d=await mP({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=Lg(d,i,"tokenIn"),f=Lg(d,a,"tokenOut");if(p===f)throw new Error("Curve token indexes must differ");let m=qg(i,o,a),h=Dg(p,f,l,c),y=Hg(o),w=Pl.encodeFunctionData("get_dy",[m,h,s,y]),v=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),g=Pl.decodeFunctionResult("get_dy",v),b=BigInt(g[0]);if(b<=0n)throw new Error("curve quote returned zero output");return ee({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:b.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:f,route:m,swapParams:h.map(k=>k.map(E=>E.toString())),pools:y},{chainId:n,venue:r,amountOut:b.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function zg(e={},t={}){let n=Number(e.chainId??8453),r=Ug(n),o=wo(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=wo(e.receiver||e.recipient||o,"curve receiver"),a=await Tl({...e,sender:o},t),s=qg(a.tokenIn,a.pool,a.tokenOut),c=Dg(a.i,a.j,a.poolType,a.nCoins),l=Hg(a.pool),u=Pl.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return P({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:ue(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}L();de();K();import{Interface as hP,getAddress as gP,isAddress as yP,keccak256 as Vg,toUtf8Bytes as Gg}from"ethers";var bP="https://api.morpho.org/graphql",da=new hP(["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)"]),wP=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||bP;async function Ol(e,t,n={}){return x(wP(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var vP="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 } } } }",xP="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 vo(e,t){let n=String(e||"").trim();if(!yP(n))throw new Error(`morpho: ${t} must be an address`);return gP(n).toLowerCase()}function kP(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 Nl(e){return Array.isArray(e)?`[${e.map(Nl).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Nl(e[t])}`).join(",")}}`:JSON.stringify(e)}async function xo(e,t,n,r,o={}){let i=da.encodeFunctionData(n,r),s=await(o.rpcCall||M)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return da.decodeFunctionResult(n,s)}function SP(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Kg(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ol(vP,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Rl(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ol(xP,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Yg(e={}){return{ok:(await Ol("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Xg(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=vo(e.vault||e.vaultAddress,"vault"),i=vo(e.owner||e.from||e.sender,"owner"),a=vo(e.receiver||i,"receiver"),s=kP(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Rl({chainId:n,first:100},t),u=SP(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=vo(p,"vault asset");if((u?.asset?.address?vo(u.asset.address,"api vault asset"):f)!==f)throw new Error("morpho: API asset and on-chain asset mismatch");let h,y;if(r==="deposit"){let[v]=await xo(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(v.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");y={minSharesOut:g.toString()},h=da.encodeFunctionData("deposit",[s,a])}else{let[v]=await xo(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(v.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");y={maxSharesIn:g.toString()},h=da.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:f,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...y,calldataHash:Vg(Gg(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=Vg(Gg(Nl(w))),P({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:w,requiresApproval:r==="deposit"?{token:f,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}L();de();import{Interface as IP,getAddress as Ll,isAddress as AP}from"ethers";K();var _P="https://api-v3.balancer.fi/",PP=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||_P;async function Zg(e,t,n={}){return x(PP(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var CP="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Jg=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"}}),TP="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",NP="0x0000000000000000000000000000000000000000",$l=new IP(["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 ey(e){let t=Number(e??8453),n=Jg[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Jg).join(", ")})`);return{chainId:t,...n}}function ty(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===NP||t===TP.toLowerCase()}function pa(e,t){if(!AP(e))throw new Error(`${t} must be a valid EVM address`);return Ll(e)}function Qg(e,t,n){let r=String(e||"");return ty(r)||/^weth$/i.test(r)?Ll(t.weth):/^usdc$/i.test(r)?Ll(t.usdc):pa(r,n)}function OP(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 ny(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 ry(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 Zg(CP,{first:n,chains:r,where:{chainIn:r}},t)}async function oy(e={}){return{ok:(await Zg("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Bl(e={},t={}){let n=ey(e.chainId),r=pa(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Qg(o,n,"balancer tokenIn"),a=Qg(e.tokenOut||"USDC",n,"balancer tokenOut"),s=OP(e.amountIn,"balancer amountIn"),c=pa(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=$l.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,ny(e.userData)]),d=await(t.rpcCall||M)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=$l.decodeFunctionResult("querySwapSingleTokenExactIn",d),f=BigInt(p[0]);if(f<=0n)throw new Error("balancer quote returned zero output");return ee({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 iy(e={},t={}){let n=ey(e.chainId),r=pa(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=ty(o),a=await Bl({...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=$l.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,ny(e.userData)]);return P({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:ue(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}L();import{getAddress as LP}from"ethers";K();var $P="https://api-v2.pendle.finance/core",BP=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),MP="0x0000000000000000000000000000000000000000",FP="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",ay=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||$P).replace(/\/$/,"");function ma(e,t){try{return LP(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function Zn(e,t){return ma(e,t).toLowerCase()}function UP(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===FP||t===MP}function Ml(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 qP(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:ma(t.token,`pendle input ${n} token`),amount:Ml(t.amount,`pendle input ${n} amount`)}))}function DP(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>ma(t,`pendle output ${n} token`))}function HP(e){let t=BP[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function WP(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 Ml(t,"pendle output amount")}function jP(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!UP(r.token)).map(r=>({token:Zn(r.token,"pendle approval token"),spender:Zn(t,"pendle approval spender"),amount:Ml(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Fl(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)),x(`${ay(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sy(e={}){let t=await Fl({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Ul(e={},t={}){let n=Number(e.chainId??42161),r=HP(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=ma(e.receiver||o,"pendle receiver"),a=qP(e.inputs),s=DP(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=Oe({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 x(`${ay(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(Zn(p.to,"pendle tx target")!==Zn(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&Zn(p.from,"pendle tx sender")!==Zn(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let f=WP(u),m=ee(u,{chainId:n,venue:p.to,amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return P({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:m,autoSlippage:m.autoSlippage,requiresApproval:jP(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:ue(m.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function cy(e={},t={}){let n=await Ul(e,t),{transaction:r,...o}=n;return o}L();import{isAddress as VP}from"ethers";K();var GP="https://api.odos.xyz",ql=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||GP).replace(/\/$/,"");async function Dl(e={}){return x(`${ql(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function KP(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(!VP(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function ly(e={},t={}){let n=KP(e),r=Oe({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 x(`${ql(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 uy(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await ly(e,t);return{...ee(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 dy(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await ly(e,t),i=await x(`${ql(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=ee(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 P({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:ue(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function py(e={}){let t=await Dl(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}L();var my=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,XP=/[<>&`*_~[\]()|\\]/g,JP=/[\u0000-\u001F\u007F]/g;function Hl(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(my,"").replace(JP,"").replace(XP,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Wl(e){if(e==null)return!1;let t=String(e);return my.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var fy=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 fa(e,t={}){let n=Number(e),r=t.baseUrl||fy[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function hy(e){return!!fy[Number(e)]}async function jl(e={},t={}){return x(`${fa(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function gy(e={},t={}){if(!e.address)throw new Error("address required");return x(`${fa(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function yy(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return x(`${fa(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function by(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${fa(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await x(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function wy(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=Hl(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Hl(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:Wl(o.symbol)||Wl(o.name)||void 0})}return n}async function vy(e={}){let t=await jl({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as ZP}from"ethers";L();de();Ze();var eC="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",ky=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 Ft(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function ha(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function xy(e){if(!e)return null;try{return ZP(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function mn(e={},t=process.env){let n=e.addresses||{},r=xy(n.evm||e.evmAddress||ha(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||ha(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||ha(t,"ORACLE_BITCOIN_ADDRESS"),a=xy(n.hyperliquid||e.hyperliquidAddress||ha(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?ce(o,"portfolio Solana address"):null,bitcoin:i?et(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function ko(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 er(e){let t=Number(e);return Number.isFinite(t)?t:null}function ga(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Ut(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Sy(e,t){let n=ky[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 tC(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:ko(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 zl(e,t){return{family:e,status:"unsupported",reason:t}}function Vl(e,t){if(!e||e.status!=="ok")return e;let n=Sy(t,e.symbol),r=er(e.amount),o=r!=null&&n.priceUsd!=null?ga(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Ey(e={}){let t=mn({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function ya(e={},t={}){let n=new Date().toISOString(),r=mn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(In.map(C=>[C.chainId,C])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(ky))],u=o?ge(()=>an(l,Ft(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Ne(c,e.concurrency||5,async C=>{let B=s.get(C);if(!B)return{family:"evm",chainId:C,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:C,name:B.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let V={...Ft(t,"evm"),rpcUrl:e.rpcUrls?.[C]||t.evm?.rpcUrls?.[C]},le=await ge(()=>Yt(C,r.evm,V));if(!le.ok)return{family:"evm",chainId:C,name:B.name,address:r.evm,status:"unavailable",latencyMs:le.ms,error:le.error};let Ie=B.nativeCurrency?.decimals??18,$e=B.nativeCurrency?.symbol||"NATIVE",W=le.data.balanceWei,fe={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&hy(C)){let Gt=await ge(()=>by({chainId:C,address:r.evm},{...Ft(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Gt.ok?fe={status:"ok",assets:wy(Gt.data,{fungibleOnly:!0}).map(mr=>{let fr=ko(mr.amountRaw,mr.decimals);return{...mr,amount:fr,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Gt.ms}:fe={status:"unavailable",assets:[],reason:Gt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Gt.ms}}return{family:"evm",chainId:C,name:B.name,address:r.evm,status:"ok",latencyMs:le.ms,native:{status:"ok",symbol:$e,amountRaw:W,decimals:Ie,amount:ko(W,Ie)},fungibleTokens:fe,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:fe.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 C=Ft(t,"solana"),B=await ge(()=>xi({address:r.solana},C)),V=i||a?await Promise.all([ge(()=>jr({owner:r.solana,programId:wc},C)).then(fe=>({...fe,program:"spl-token"})),ge(()=>jr({owner:r.solana,programId:eC},C)).then(fe=>({...fe,program:"token-2022"}))]):[],le=tC(V),Ie=le.filter(fe=>fe.classification==="collectible-candidate"),$e=le.filter(fe=>fe.classification!=="collectible-candidate"),W=V.filter(fe=>!fe.ok).map(fe=>fe.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:B.ok||V.some(fe=>fe.ok)?"ok":"unavailable",native:B.ok?{status:"ok",symbol:"SOL",amountRaw:B.data.lamports,decimals:9,amount:ko(B.data.lamports,9),slot:B.data.slot}:{status:"unavailable",symbol:"SOL",error:B.error},fungibleTokens:{status:i?W.length===V.length?"unavailable":W.length?"partial":"ok":"not-requested",assets:i?$e:[],errors:W,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?W.length===V.length?"unavailable":"partial":"not-requested",assets:a?Ie:[],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 C=Ft(t,"bitcoin"),B=Ft(t,"bitcoinMeta"),[V,le,Ie]=await Promise.all([ge(()=>Si({address:r.bitcoin},C)),i?ge(()=>Ii({address:r.bitcoin},B)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?ge(()=>$n({address:r.bitcoin},B)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),$e=le.ok?le.data:null,W=Ie.ok?Ie.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:V.ok||$e?.ok||W?.ok?"ok":"unavailable",native:V.ok?{status:"ok",symbol:"BTC",amountRaw:V.data.balanceSats,decimals:8,amount:ko(V.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:V.error},fungibleTokens:{status:i?$e?.ok?"ok":"unavailable":"not-requested",assets:$e?.balances||[],error:$e?.ok?null:$e?.error||le.error,verification:"indexer-reported"},collectibles:{status:a?W?.ok?"ok":"unavailable":"not-requested",assets:W?.inscriptions||[],error:W?.ok?null:W?.error||Ie.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 C=Ft(t,"hyperliquid"),[B,V,le]=await Promise.all([ge(()=>ai(r.hyperliquid,C)),ge(()=>_n(r.hyperliquid,C)),ge(()=>ft(C))]),Ie=(B.ok&&Array.isArray(B.data?.balances)?B.data.balances:[]).filter(W=>Ut(W.total)||Ut(W.hold)).map(W=>({coin:W.coin||null,total:String(W.total??"0"),hold:String(W.hold??"0"),priceUsd:null,usdValue:null})),$e=(V.ok&&Array.isArray(V.data?.assetPositions)?V.data.assetPositions:[]).map(W=>W.position||W).filter(W=>Ut(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:B.ok||V.ok?"ok":"unavailable",spot:{status:B.ok?"ok":"unavailable",balances:Ie,error:B.ok?null:B.error},perps:{status:V.ok?"ok":"unavailable",accountValueUsd:V.data?.marginSummary?.accountValue??null,withdrawableUsd:V.data?.withdrawable??null,positions:$e,error:V.ok?null:V.error},mids:le.ok?le.data:{},source:"hyperliquid-info"}})(),[h,y,w,v,g]=await Promise.all([d,p,f,m,u]),b=g.ok?g.data:null,k=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),E=[];for(let C of h){if(C.family!=="evm"||C.fungibleTokens?.status!=="ok")continue;let B=k[C.chainId];if(B)for(let V of C.fungibleTokens.assets||[])V.address&&E.push(`${B}:${String(V.address).toLowerCase()}`)}let I=null;if(o&&E.length){let C=[...new Set(E)],B=await ge(()=>an(C,Ft(t,"prices")));B.ok&&(I=B.data)}let _=h.map(C=>{let B=C.native?{...C,native:Vl(C.native,b)}:C;if(B.fungibleTokens?.status==="ok"&&Array.isArray(B.fungibleTokens.assets)){let V=k[B.chainId],le=B.fungibleTokens.assets.map(Ie=>{let $e=String(Ie.symbol||"").toUpperCase(),W=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes($e)&&(W=1),W==null&&V&&Ie.address&&I?.coins){let od=`${V}:${String(Ie.address).toLowerCase()}`,mr=I.coins[od],fr=Number(mr?.price);Number.isFinite(fr)&&fr>0&&(W=fr)}let fe=er(Ie.amount),Gt=fe!=null&&W!=null?ga(fe*W):null;return{...Ie,priceUsd:W,usdValue:Gt}});B={...B,fungibleTokens:{...B.fungibleTokens,assets:le}}}return B});y.native&&(y.native=Vl(y.native,b)),w.native&&(w.native=Vl(w.native,b));let O=0,N=0,T=0;for(let C of[..._,y,w]){C.native?.status==="ok"&&Ut(C.native.amount)&&(C.native.usdValue!=null?(O+=C.native.usdValue,N+=1):T+=1);for(let B of C.fungibleTokens?.assets||[])!Ut(B.amount)&&!Ut(B.amountRaw)||(B.usdValue!=null?(O+=B.usdValue,N+=1):T+=1)}let q=Sy(b,"HYPE");for(let C of v.spot?.balances||[]){let B=String(C.coin||"").toUpperCase(),V=B==="USDC"||B==="USDT"||B==="USDT0"?1:B==="HYPE"?q.priceUsd||er(v.mids?.HYPE):er(v.mids?.[C.coin]),le=er(C.total);C.priceUsd=V,C.usdValue=le!=null&&V!=null?ga(le*V):null,Ut(C.total)&&(C.usdValue!=null?(O+=C.usdValue,N+=1):T+=1)}let se=er(v.perps?.accountValueUsd);se!=null&&se!==0&&(O+=se,N+=1);let Z=[...y.fungibleTokens?.assets||[],...y.collectibles?.assets||[]].filter(C=>Ut(C.amount)).length,R=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;T+=Z+R;let H=[..._,y,w,v],U=C=>H.filter(B=>B.status===C).length,Q=[],be=_.filter(C=>C.fungibleTokens?.status==="unavailable"),xe=_.filter(C=>C.fungibleTokens?.status==="ok");be.length&&!xe.length?Q.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):be.length&&Q.push(`EVM token discovery partial: Blockscout covered ${xe.length} chain(s); ${be.length} chain(s) still native-only.`),(y.fungibleTokens?.assets?.length||y.collectibles?.assets?.length)&&Q.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&Q.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),g.ok||Q.push(`Price provider unavailable: ${g.error}`);let pt=[zl("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),zl("sui","Sui balance adapter is not installed"),zl("aptos","Aptos balance adapter is not installed")],Et=H.some(C=>["unavailable","partial","not-configured"].includes(C.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(C.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:H.length,ok:U("ok"),unavailable:U("unavailable"),notConfigured:U("not-configured"),unsupported:U("unsupported")+pt.length,evmChainsRequested:c.length,evmChainsOk:_.filter(C=>C.status==="ok").length},valuation:{knownUsd:ga(O),label:"known priced value, not a complete portfolio total",pricedItems:N,unpricedNonzeroItems:T,complete:T===0&&!Et&&U("unavailable")===0&&U("not-configured")===0&&pt.length===0,priceSource:o?"DefiLlama":null,priceStatus:g.ok?"ok":"unavailable",priceQueriedAt:n},chains:[..._,y,w,v],unsupportedFamilies:pt,warnings:Q}}import{constants as wa}from"node:fs";import{chmod as AC,mkdir as _C,open as PC,readFile as CC}from"node:fs/promises";import{createHash as TC,randomUUID as NC}from"node:crypto";import OC from"node:os";import nr from"node:path";L();L();var rC=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"]),oC=new Set(["image/jpeg","image/png","image/webp"]);function iC(e){let t=String(e||"").toLowerCase();return rC.some(n=>t===n||t.endsWith(`.${n}`))}function aC(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 Iy(e){let t=aC(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!iC(n.hostname)?null:n}async function sC(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=Iy(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 ge(()=>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=Iy(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(!oC.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 Gl(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function cC(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function Ay(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 b=await sC(g.imageUrl||g.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=b.bytes,s.push({item:g,image:b,error:null})}catch(b){s.push({item:g,image:null,error:String(b?.message||b).slice(0,180)})}}let u=3,d=340,p=400,f=76,m=Math.ceil(a.length/u),h=u*d,y=f+m*p,w=s.map(({item:g,image:b,error:k},E)=>{let I=E%u,_=Math.floor(E/u),O=I*d,N=f+_*p,T=b?`<image x="${O+14}" y="${N+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${b.mimeType};base64,${b.data}"/>`:`<rect x="${O+14}" y="${N+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${O+170}" y="${N+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,q=Gl(cC(g,E).slice(0,34)),se=Gl(g.chain||"unknown chain");return`${T}<text x="${O+16}" y="${N+350}" fill="#f3f5f7" font-size="17" font-weight="600">${q}</text><text x="${O+16}" y="${N+376}" fill="#8d98a8" font-size="13">${se}${k?" \xB7 placeholder":""}</text>`}).join(""),v=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${y}" viewBox="0 0 ${h} ${y}"><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 ${Gl(new Date().toISOString())}</text>${w}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(v).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 lC=[/\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],uC=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,dC=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function pC(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;uC.test(n)&&t.push("url-in-name");let i=lC.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),dC.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 _y(e={}){let t=pC(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}K();var mC=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"}]),fC=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 fn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function So(e,t){let n=await ge(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function hC(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 gC(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 yC(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 Ty(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function bC(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 wC(e,t){let n=Ty(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 vC(e){let t=new Map;for(let n of e){let r=Ty(n);t.has(r)||t.set(r,n)}return[...t.values()]}function xC(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 Ny(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function tr(e={},t={}){let n=new Date().toISOString(),r=mn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(b=>String(b).toLowerCase())):null,i=mC.filter(b=>!o||o.has(b.chain)),a=[],s=[],c=fn(t,"opensea"),l=r.evm?i.filter(b=>b.family!=="solana"):[],u=await Ne(l,4,async b=>({row:b,result:await So(`opensea-${b.chain}`,()=>Ar({chain:b.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:b,result:k}of u)if(k.ok){let E=k.data.nfts.map(I=>({...I,family:b.family,chainId:b.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...E),a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:k.data.complete?"ok":"partial",count:E.length,complete:k.data.complete,next:k.data.next,source:"opensea"})}else a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"unavailable",error:k.error,source:"opensea"});if(!r.evm)for(let b of i.filter(k=>k.family!=="solana"))a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let b=await So("opensea-solana",()=>Ar({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(b.ok){let k=b.data.nfts.map(E=>({...E,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...k),a.push({family:"solana",chain:"solana",status:b.data.complete?"ok":"partial",count:k.length,complete:b.data.complete,next:b.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:b.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 b=await So("satflow-wallet-contents",()=>_i({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},fn(t,"satflow")),t.timeoutMs??35e3);if(b.ok){let k=hC(b.data.contents).map(I=>gC(I,r.bitcoin));s.push(...k);let E=k.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:E?"ok":"partial",count:k.length,complete:E,source:"satflow"})}else{let k=await So("bitcoin-meta-inscriptions",()=>$n({address:r.bitcoin},fn(t,"bitcoinMeta")),t.timeoutMs??35e3),E=k.ok&&k.data?.ok&&Array.isArray(k.data.inscriptions)?k.data.inscriptions:[];s.push(...E.map(I=>yC(I,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:E.length?"partial":"unavailable",count:E.length,complete:!1,source:E.length?"bitcoin-meta":"satflow",error:E.length?"Satflow unavailable; fallback has IDs only":b.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 b of[...new Set([r.evm,r.solana].filter(Boolean))]){let k=await So(`opensea-pnl-${b}`,()=>Xo({address:b},c),t.timeoutMs??35e3);d.push(k.ok?{status:"ok",...k.data}:{status:"unavailable",address:b,source:"opensea-indexed-account-pnl",error:k.error})}let p=bC(e.costBasis),f=vC(s).map(b=>wC(b,p)).map(b=>_y(b)),m=f.filter(b=>!b.spam),h=f.filter(b=>b.spam),y=m.filter(b=>b.estimatedValueUsd!=null&&Number.isFinite(Number(b.estimatedValueUsd))),w=Math.round(y.reduce((b,k)=>b+Number(k.estimatedValueUsd),0)*100)/100,v=m.length-y.length,g=a.filter(b=>b.status!=="ok"||b.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:fC,inventory:{count:f.length,visibleCount:m.length,flaggedCount:h.length,items:f,visibleItems:m,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:y.length,unvaluedItems:v,complete:v===0&&g.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:xC(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 Py(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 kC(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 Oy(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,fn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=Py(e.expiry??e.endTime,"Solana NFT listing expiry");return Vi({...e,expiry:r},fn(t,"magiceden"))}if(n==="satflow"){let r=Py(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Pi({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:kC(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},fn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Kl(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 Yl(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function ba(e){return String(e??"").trim().toLowerCase()}function SC(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=ba(t),i=ba(n);return!o||!i?!1:r.some(a=>ba(a.trait_type??a.traitType??a.type)===o&&ba(a.value??a.trait_value??a.traitValue)===i)}function EC(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function Cy(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 Xl(e){return Math.round(Number(e)*1e6)/1e6}function qt(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 Ry(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return qt(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(I=>e[I]==null||e[I]==="");if(o.length)return qt(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Kl(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Kl(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Kl(e.traitFloorEth,"traitFloorEth"),d=Yl(e.collectionFloorEth),p=Yl(e.maxListingAgeMs),f=Yl(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return qt(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return qt(e,"invalid-min-trait-sales");if(u<=0)return qt(e,"trait-floor-unavailable");let m=I=>SC(I,e.traitType,e.traitValue)&&EC(I,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(m).filter(I=>{if(!f)return!0;let _=Cy(I,["timestamp","soldAt","createdAt"]);return _!=null&&i-_<=f}),y=Xl(h.reduce((I,_)=>I+Number(_.priceEth??_.price??0),0)),w={count:h.length,volumeEth:y,minSales:c,minVolumeEth:l};if(h.length<c||y<l)return qt(e,"trait-liquidity-insufficient",{traitSales:w});let v=(Array.isArray(e.listings)?e.listings:[]).filter(m).filter(I=>{let _=Number(I.priceEth??I.price);if(!Number.isFinite(_)||_<=0||_>a)return!1;if(!p)return!0;let O=Cy(I,["listedAt","createdAt","timestamp"]);return O!=null&&i-O<=p}).map(I=>{let _=Number(I.priceEth??I.price),O=Math.round((u-_)/u*1e4);return{...I,priceEth:_,discountBps:O}}).filter(I=>I.discountBps>=s).sort((I,_)=>I.priceEth-_.priceEth||_.discountBps-I.discountBps),g={traitSales:w,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:v.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."},b=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(b)||b<1)return qt(e,"invalid-min-trait-listings",g);if(v.length<b)return qt(e,"trait-listing-depth-insufficient",g);let k=v[0],E=P({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Xl(k.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:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Xl(k.priceEth),discountBps:k.discountBps},evidence:g,prepareIntent:E}}async function Ly(e={},t={}){let n=await tr({...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 $y(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await tr({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await Ay({...e,items:n},fn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var By=10*1024*1024,Uy=1e3;function Dt(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function rr(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function My(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 qy(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 RC(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Dy(e={}){return`portfolio_${TC("sha256").update(RC(e)).digest("hex").slice(0,20)}`}function Hy(e={}){if(e.historyFile)return nr.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return nr.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||nr.join(OC.homedir(),".hermes");return nr.join(nr.resolve(n),"state","oracle","portfolio-history.jsonl")}function LC(e){let t=Dt(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?rr(t):null}function $C(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Dt(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?rr(t):null}function BC(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=Dt(c.usdValue);return l==null?s:s+l},0),i=Dt(n.perps?.accountValueUsd),a=rr(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>Dt(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=Dt(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:rr(r)})}return t}function MC(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 FC(e,t){let n=Hy(t),r=`${JSON.stringify(e)}
|
|
145
|
-
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await
|
|
146
|
-
`))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 qC(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=mn(e,t.env||process.env);return Object.values(n).some(Boolean)?Dy(n):null}async function Jl(e={},t={}){let n=qy(e.limit,100,1,Uy,"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=My(e.since,"portfolio history since"),i=My(e.until,"portfolio history until"),a=qC(e,t),s=await UC(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=>Dt(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 Fy(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function va(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function DC(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 HC(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,b)=>`${b?"L":"M"}${d(b).toFixed(2)},${p(g.value).toFixed(2)}`).join(" "),m=Array.from({length:5},(g,b)=>{let k=b/4,E=100+k*470,I=u-k*(u-l);return`<line x1="100" y1="${E}" x2="1140" y2="${E}" stroke="#26313c" stroke-width="1"/><text x="86" y="${E+5}" text-anchor="end" fill="#8795a5" font-size="15">${Fy(I)}</text>`}).join(""),h=e.map((g,b)=>`<circle cx="${d(b)}" cy="${p(g.value)}" r="5" fill="#b8f0ff"><title>${va(g.recordedAt)}: ${Fy(g.value)}</title></circle>`).join(""),y=va(e[0].recordedAt.slice(0,10)),w=va(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 ${va(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">${y}</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 jy(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=qy(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Jl({...e,order:"asc",limit:e.limit??Uy},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:Dt(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=DC(o,n),a=i[0].value,s=i.at(-1).value,c=rr(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=HC(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"}}}de();var jC=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"}}),zC=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),VC=`0x${"0".repeat(64)}`;function GC(e){return!e||e==="0x"||e===VC}async function hn(e={},t={}){let n=t.rpcCall||M,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(jC))c.includes(m)&&s.push({selector:`0x${m}`,...h});let l=!1,u=null,d=null;for(let{label:m,slot:h}of zC)try{let y=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!GC(y)){l=!0,u=m,d=`0x${String(y).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 zy(e={}){let t=Date.now();try{let n=await hn({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 YC=/^0x[0-9a-fA-F]{40}$/,Vy=4663;function xa(e,t){let n=String(e||"").trim();if(!YC.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Ql(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 Eo(e,t){return e==null||e===""?null:Ql(e,t)}function XC({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=xa(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=Ql(u.value??r,"prepared native value");if(BigInt(f)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let m=Eo(u.gasLimit??c.gasLimit,"gasLimit"),h=Eo(u.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let y=Number(l.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),v=ss({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:y,ttlMs:w,secret:l.routeAttestationSecret}),g=ue(v,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),b={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:h,slippageBps:g.selectedBps,expiresAtMs:y+w},k=Eo(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return k&&(b.maxPriorityFeePerGas=k),c.nonce!==void 0&&(b.nonce=Number(c.nonce)),(c.txType!==void 0||k)&&(b.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(b.l1FeeWei=Eo(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(b.operatorFeeWei=Eo(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:y+w,fee:{oracleFeeBps:5},autoSlippage:g,artifact:{chainId:e,owner:o,transactions:[b]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function JC(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}_s();let n=yp(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function QC({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!==j.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==j.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==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 Gy(e={},t={}){let n=Number(e.chainId??Vy);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=xa(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?xa(e.tokenIn,"tokenIn"):null,i=e.recipient?xa(e.recipient,"recipient"):null,a=e.amountIn==null?null:Ql(e.amountIn,"amountIn"),s=JC(n,t.scanner),c=t.scanContractRisk||hn,[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},y=QC({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:h,scanner:s}),w=null,v=null,g=null;if(e.prepare===!0&&y.length===0){w=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{v=XC({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:m,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(b){g=String(b?.message||b).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!v,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:y,prepared:!!w,unsignedTx:w,localSignerEnvelope:v,localSignerBlockedReason:g,signed:v?"pending-local-signer":!1,broadcast:v?"pending-local-signer":!1}}async function Ky(){_s();let e=bp();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Vy,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"}}de();de();var eT=5,Zl=[50,75,90],Yy=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function gn(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 tT(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 ka(e={},t={}){let n=t.rpcCall||M,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Yy[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Yy).join(", ")}`};let i,a,s,c;try{i=gn(e.maxFeePerGasWei,"maxFeePerGasWei"),a=gn(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=gn(e.gasLimit,"gasLimit"),c=gn(e.maxTotalGasWei,"maxTotalGasWei")}catch(I){return{status:"error",viable:!1,error:I.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${eT.toString(16)}`,"pending",Zl],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(I){return{status:"unavailable",viable:!1,error:I?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=gn(u?.baseFeePerGas,"baseFeePerGas")??gn(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(I=>{try{return gn(I?.[o.percentile],"reward")}catch{return null}}).filter(I=>I!=null&&I>0n),m=tT(f),h=[];m==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let y=m??1000000000n,w=d*o.baseFeeMultiplier+y,v=[];a!=null&&y>a&&(v.push({field:"maxPriorityFeePerGas",wanted:y.toString(),capped:a.toString()}),y=a,w=d*o.baseFeeMultiplier+y),i!=null&&w>i&&(v.push({field:"maxFeePerGas",wanted:w.toString(),capped:i.toString()}),w=i,y>w&&(y=w));let g=s!=null?s*w:null;c!=null&&g!=null&&g>c&&v.push({field:"totalGas",wanted:g.toString(),capped:c.toString()});let b=m==null||y>=m,k=c==null||g==null||g<=c,E=b&&k;return b||h.push(`tip cap ${y} is below the observed ${Zl[o.percentile]}th-percentile tip ${m}; this bid is unlikely to land`),k||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:E,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:m==null?null:m.toString(),percentile:Zl[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:y.toString(),worstCaseGasWei:g==null?null:g.toString(),clamps:v,notes:h}}de();var rT="08c379a0",oT="4e487b71",iT=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 aT(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===rT)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===oT){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:iT[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 sT(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 cT(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 lT(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 Io(e={},t={}){let n=t.rpcCall||M,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=lT(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(m){let h=sT(m);if(!cT(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=aT(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 Xy(e={}){let t=Date.now();try{let n=await Io({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 dT=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 pT(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 mT(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 Jy(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=mT(t);else if(o==="quantity")r+=pT(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function fT({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 Sa(e={},t={}){let n=t.rpcCall||M,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=dT.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 Qy(e={}){let t=Date.now();try{let n=await Sa({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 eu(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 Sa({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 hn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Io({chainId:r,tx:{from:o,to:n,data:Jy(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 ka({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=Jy(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=gs({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 y=[];c&&y.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"&&y.push(`contract risk HIGH: ${l.findings.map(g=>g.name).join(", ")}`),p.viable||y.push(p.notes[0]),h.skipped&&y.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let w=null,v=null;try{w=fT({address:n,chainId:r,minter:o,quantity:i,tx:m,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(g){v=String(g?.message||g).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:m,localSignerEnvelope:w,localSignerBlockedReason:v,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:y}}K();import{createHash as dN}from"node:crypto";import{createHash as gT}from"node:crypto";var yT=1,bT=8,Ee=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},wT=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),vT=new Set(["family","id"]),xT=new Set(["id","startsAt","endsAt","eligibility"]),kT=new Set(["kind","proofFormat","proofDigest"]),ST=new Set(["amount","unit"]),ET=new Set(["value","unit"]);function or(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Ee(`${t} must be a plain object`);return e}function ir(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Ee(`${n} has unknown field ${r}`,"unknown-field")}function Xe(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Ee(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function IT(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Ee(`${t} must be a positive safe integer`);return e}function tu(e,t){if(e=or(e,t),ir(e,ST,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Ee(`${t} requires amount and unit`,"ambiguous-unit");let n=Xe(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Ee(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:Xe(e.unit,`${t}.unit`)}}function nu(e,t){if(e=or(e,t),ir(e,ET,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Ee(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function AT(e,t){e=or(e,t),ir(e,kT,t);let n=Xe(e.kind,`${t}.kind`),r=Xe(e.proofFormat,`${t}.proofFormat`),o=Xe(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Ee(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function _T(e,t){let n=`stages[${t}]`;e=or(e,n),ir(e,xT,n);let r=nu(e.startsAt,`${n}.startsAt`),o=nu(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Ee(`${n} must end after it starts`,"invalid-stage-range");return{id:Xe(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:AT(e.eligibility,`${n}.eligibility`)}}function ru(e){if(e=or(e,"input"),ir(e,wT,"input"),e.version!==yT)throw new Ee("version must be 1");let t=or(e.chain,"chain");ir(t,vT,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>bT)throw new Ee("stages must contain 1 through 8 entries","stage-count");let r=n.map(_T).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 Ee("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 Ee("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Ee("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:Xe(t.family,"chain.family"),id:Xe(t.id,"chain.id")},marketplace:Xe(e.marketplace,"marketplace"),mechanism:Xe(e.mechanism,"mechanism"),collection:Xe(e.collection,"collection"),recipient:Xe(e.recipient,"recipient"),quantity:IT(e.quantity,"quantity"),stages:r,mintValueCap:tu(e.mintValueCap,"mintValueCap"),networkFeeCap:tu(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:tu(e.priorityFeeCap,"priorityFeeCap"),expiry:nu(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Ee("every stage must end no later than expiry","stage-after-expiry");return i}function PT(e){return JSON.stringify(ru(e))}function Zy(e){return`sha256:${gT("sha256").update(PT(e),"utf8").digest("hex")}`}var ou=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),yn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),iu=Object.freeze(Object.values(yn)),eb=new Set(iu),tb=Object.freeze(iu.slice(0,4)),CT=iu,TT=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Pe=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function Ea(e,t){if(!Array.isArray(e)||e.length===0)throw new Pe(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Pe(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Pe(`${t} contains duplicates`);return[...n].sort()}function NT(e){if(!Array.isArray(e))throw new Pe("capabilities must be an array");let t=new Set(e);for(let n of t)if(!eb.has(n))throw new Pe(`unknown capability ${n}`,"unknown-capability");return CT.every(n=>t.has(n))?ou.AUTOMINT_READY:tb.every(n=>t.has(n))?ou.PREPARE_READY:ou.RESEARCH_ONLY}function au(e=[]){if(!Array.isArray(e))throw new Pe("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Pe("entry must be an object");for(let i of Object.keys(n))if(!TT.has(i))throw new Pe(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Pe("entry id must be an exact string");if(t.has(n.id))throw new Pe(`duplicate entry id ${n.id}`,"duplicate-entry");let r=Ea(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(Ea(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(Ea(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(Ea(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:NT(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=tb){let o=t.get(n);if(!o)throw new Pe(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!eb.has(i))throw new Pe(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Pe(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var P5=au([]);K();import{getAddress as OT,Interface as su,keccak256 as RT}from"ethers";var Ht=Object.freeze({manifold:new su(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new su(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new su(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),lu=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"})}),O5=Object.freeze(Object.fromEntries(Object.entries(lu).map(([e,t])=>[Ht[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function te(e){throw new Error(`evm-mint-launchpads: ${e}`)}function qe(e,t){try{return OT(String(e||""))}catch{return te(`invalid ${t}`)}}function Ce(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&te(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return te(`${t} must be an unsigned integer`)}}function cu(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&te(`invalid ${t}`),e.map(String)}function LT(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&te("invalid chainId");let o=qe(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&qe(u.contract,"reviewed contract")===o);a||te("unsupported contract or wrong chain");let s=qe(a.mintTarget||a.contract,"reviewed mint target"),c=Ht[e].getFunction(lu[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))&&te("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function $T(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);te("runtime bytecode verification required")}function BT(e,t){let n=e.stage;if(!n)return null;let r=Ce(n.startTime,"stage startTime"),o=Ce(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&te("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function MT(e,t){let n=lu[e];String(t).slice(0,10).toLowerCase()!==Ht[e].getFunction(n.signature).selector.toLowerCase()&&te("unknown selector");let r;try{r=Ht[e].decodeFunctionData(n.signature,t)}catch{te("invalid calldata layout")}let o;return e==="manifold"&&(o=Ht.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Ht.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Ht.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&te("calldata must be canonical with no suffix"),r}async function nb(e,t={},n={}){Ht[e]||te("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=LT(e,t,n),s=qe(t.recipient||t.minter,"recipient"),c=Ce(t.quantity,"quantity",{positive:!0}),l=Ce(t.priceWei,"priceWei"),u=Ce(t.maxValueWei,"maxValueWei"),d=Ce(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&te("transaction chain mismatch"),qe(p.to,"transaction target")!==i&&te("transaction target mismatch");let f=await $T(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(f))||f==="0x"||RT(f).toLowerCase()!==String(a.codeHash).toLowerCase())&&te("runtime bytecode is not reviewed");let m=MT(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),y=BT(t,h),w,v,g,b=null,k=[];if(e==="manifold")qe(m[0],"calldata contract")!==o&&te("calldata contract mismatch"),(t.instanceId==null||Ce(m[1],"instanceId")!==Ce(t.instanceId,"instanceId"))&&te("instance/stage mismatch"),(t.mintIndex==null||Ce(m[2],"mintIndex")!==Ce(t.mintIndex,"mintIndex"))&&te("mint index/stage mismatch"),k=cu([...m[3]]),w=qe(m[4],"calldata recipient"),v=1n,g=l;else if(e==="zora")w=qe(m[0],"calldata recipient"),v=BigInt(m[1]),g=l,t.comment!=null&&m[2]!==String(t.comment)&&te("comment mismatch"),t.mintReferral!=null&&qe(m[3],"mint referral")!==qe(t.mintReferral,"expected mint referral")&&te("mint referral mismatch");else{w=qe(m[0],"calldata recipient"),v=BigInt(m[1]),g=BigInt(m[3]);let N=m[4];k=cu([...N.proof]),b=BigInt(N.quantityLimitPerWallet),b<c&&te("wallet allowance below quantity"),(BigInt(N.pricePerToken)!==l||qe(N.currency,"allowlist currency")!==qe(m[2],"currency"))&&te("allowlist terms mismatch")}w!==s&&te("recipient mismatch"),v!==c&&te("quantity mismatch"),g!==l&&te("price mismatch"),t.proof!=null&&JSON.stringify(k.map(N=>N.toLowerCase()))!==JSON.stringify(cu(t.proof).map(N=>N.toLowerCase()))&&te("proof mismatch");let E=Ce(p.value??0,"transaction value"),I=l*c;(E<I||E-I>d||E>u)&&te("transaction value or fee cap exceeded");let _=p.gasLimit==null?null:Ce(p.gasLimit,"gasLimit"),O=p.maxFeePerGas==null?null:Ce(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(_==null||_>Ce(t.maxGasLimit,"maxGasLimit"))&&te("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(O==null||O>Ce(t.maxFeePerGasWei,"maxFeePerGasWei"))&&te("gas fee cap exceeded"),P({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:E.toString(),platformFeeWei:(E-I).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...y?{stage:y}:{},...b==null?{}:{walletAllowance:b.toString()},proof:k,transaction:{chainId:r,to:i,data:p.data,value:E.toString(),..._==null?{}:{gasLimit:_.toString()},...O==null?{}:{maxFeePerGas:O.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var FT="RESEARCH_ONLY";var UT="canonical serialized-message decoding and program-specific instruction validation are not implemented",Ia=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),L5=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function qT(){throw new Error(`solana-mint: ${FT}; disabled until ${UT}`)}function rb(){qT()}K();import{Address as DT,CompactSize as HT,NETWORK as WT,OutScript as fb,Script as jT,TEST_NETWORK as ob,Transaction as zT,utils as VT}from"@scure/btc-signer";import{createHash as Ao}from"node:crypto";var ib="universal-ordinals-mint",ab="bitcoin-ordinals-mint-plan",GT=1800*1e3,KT=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),sb=new Set,YT=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function rt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function Wt(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 uu(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 hb(e,t){let n=rt(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 XT(e){return e==="bitcoin"||e==="mainnet"?WT:e==="regtest"?{...ob,bech32:"bcrt"}:ob}function cb(e,t){try{let n=fb.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 JT(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function QT(e){let t=Ao("sha256").update(e.unsignedTx).digest();return Ao("sha256").update(t).digest().reverse().toString("hex")}function lb(e,...t){let n=Ao("sha256").update(e,"ascii").digest();return Ao("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function ZT(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=lb("TapLeaf",Buffer.from([a]),Buffer.from(HT.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=lb("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=VT.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 ub(e,t){let n=rt(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=zT.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(JT(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=cb(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)=>ZT(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 cb(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:QT(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 eN(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 tN(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 nN=new Set([1,3]);function rN(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=tN(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!nN.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 oN(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=jT.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(rN(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(Ao("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||eN(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 db(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 iN(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 gb(e,t="parentId"){let n=rt(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 yb(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=rt(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=Wt(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function aN(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:rt(a.role,`revealOutputs[${s}].role`),address:rt(a.address,`revealOutputs[${s}].address`),valueSats:Wt(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:hb(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:gb(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 sN(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:rt(n?.role,`commitOutputs[${r}].role`),valueSats:Wt(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:hb(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 pb(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 mb(e,t,n){try{return Buffer.from(fb.encode(DT(XT(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 cN(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)=>yb({...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 lN(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");iN(e);for(let T of["content","contentBytes","body","file","path","url","contentUrl"])if(e[T]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let T of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[T]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=rt(e.network,"network").toLowerCase();if(!KT.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=rt(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=rt(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=gb(e.parentId??e.parentInscriptionId),a=rt(e.recipient??e.destination,"recipient"),s=Wt(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(yb);if(new Set(c.map(T=>T.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");cN(e,c);let l=ub(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=ub(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=sN(e.commitOutputs),p=aN(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((T,q)=>T.txid!==c[q].txid||T.vout!==c[q].vout||T.valueSats!==c[q].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");pb(l.outputs,d,"commit PSBT"),pb(u.outputs,p,"reveal PSBT");let f=mb(a,n,"recipient");if(p.find(T=>T.role==="inscription").scriptHex!==f)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[T,q]of p.entries())if(q.scriptHex!==mb(q.address,n,`revealOutputs[${T}].address`))throw new Error(`ordinals mint: reveal output ${T} script does not pay its bound address`);let m=d.findIndex(T=>T.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(T=>T.txid===l.txid&&T.vout===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");oN(u,{contentHash:r,contentType:o,parentId:i});let y=uu(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=uu(e.revealFeeRateSatVb,"revealFeeRateSatVb"),v=uu(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(v<=0||y>v||w>v)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let g=Wt(e.commitFeeSats,"commitFeeSats"),b=Wt(e.revealFeeSats,"revealFeeSats"),k=Wt(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(g+b>k)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==g.toString()||u.feeSats!==b.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(g)/l.vsizeLowerBound>y||Number(b)/u.vsizeLowerBound>w)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(T=>T.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let _=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:Wt(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(_.enabled){if(!Number.isSafeInteger(_.outputIndex)||_.outputIndex<0||p[_.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[_.outputIndex].valueSats!==_.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(T=>T.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let O=Number(t.nowMs??Date.now()),N=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(N)||N<=O||N-O>GT)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(db),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(db),revealPsbt:u.encoded,revealOutputs:p,commitRate:y,revealRate:w,maxRate:v,commitFee:g.toString(),revealFee:b.toString(),maxTotalFee:k.toString(),rbf:e.rbf,cpfp:_,expiresAt:N}}function uN(e={},t={}){let n=lN(e,t),r=n.commitInputs.find(s=>sb.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:ib,kind:ab,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...YT},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=P(i,{provider:ib,kind:ab,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)sb.add(s.outpoint);return a}var bb=uN;var pN=Object.freeze([yn.DISCOVERY,yn.ELIGIBILITY,yn.PREPARATION,yn.SIMULATION]),wb=[["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",Ia.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",Ia.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",Ia.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],vb=Object.freeze(wb.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([yn.DISCOVERY]):pN,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),K5=au(vb.map(({family:e,tier:t,enabled:n,...r})=>r)),xb=new Map(wb.map(e=>[e[0],e])),mN=new Set(["intent","adapterId","input"]),fN=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Aa=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ae(e,t,n){throw new Aa(e,t,n?{cause:n}:{})}function $(e,t,n){String(e??"")!==String(t)&&ae("intent-mismatch",`${n} does not match canonical intent`)}function ve(e,t,n){let r=e[t];return r.unit!==n&&ae("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function kb(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))fN.test(n)&&ae("custody-refused",`${t}.${n} is outside the prepare-only boundary`),kb(r,`${t}.${n}`)}function hN(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function gN(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ae("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ae("intent-mismatch","stageId does not match canonical intent"),$(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${dN("sha256").update(JSON.stringify(hN(n,t))).digest("hex")}`;$(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))&&ae("invalid-request","decoded input requires exact stage bounds"),$(a,o.startsAt.value,"stage start"),$(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&ae("expired-intent","canonical mint stage is not active at authoritative now"),o}function yN(e,t){let n=xb.get(t);n||ae("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return $(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&ae("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function bN(e,t){e.chain.family==="evm"?($(t.chainId,e.chain.id,"network"),$(t.contract,e.collection,"collection/drop"),$(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity"),$(t.maxValueWei??t.maxTotalWei,ve(e,"mintValueCap","wei"),"mint-value cap"),$(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,ve(e,"networkFeeCap","wei"),"network-fee cap"),$(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,ve(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?($(t.network,e.chain.id,"network"),$(t.collection??t.drop??t.identity,e.collection,"collection/drop"),$(t.recipientOwner??t.recipient,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity"),$(t.priceLamports,ve(e,"mintValueCap","lamports"),"mint-value cap"),$(t.networkFeeCapLamports,ve(e,"networkFeeCap","lamports"),"network-fee cap"),$(t.priorityFeeCapLamports,ve(e,"priorityFeeCap","lamports"),"priority-fee cap")):($(t.network,e.chain.id,"network"),$(t.parentId,e.collection,"collection/drop"),$(t.recipient,e.recipient,"recipient"),$(e.quantity,1,"Ordinals quantity"),$(t.postageSats,ve(e,"mintValueCap","sats"),"mint-value cap"),$(t.maxTotalFeeSats,ve(e,"networkFeeCap","sats"),"network-fee cap"),$(t.maxFeeRateSatVb,ve(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function wN(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==Jt(e))&&ae("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ae("custody-refused","leaf artifact is not strictly prepare-only")}function vN(e,t,n){$(t.chainId,e.chain.id,"network"),$(t.contract,e.collection,"collection/drop"),$(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity");let r=ve(e,"mintValueCap","wei"),o=ve(e,"networkFeeCap","wei"),i=ve(e,"priorityFeeCap","wei-per-gas");$(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),$(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),$(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||ae("artifact-mismatch","prepared EVM transaction is missing"),$(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&ae("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)&&ae("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),$(n.contract,e.collection,"artifact collection/drop"),$(n.recipient??n.buyer,e.recipient,"artifact recipient"),$(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&ae("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function xN(e,t,n){$(t.network,e.chain.id,"network"),$(t.collection??t.drop??t.identity,e.collection,"collection/drop"),$(t.recipientOwner??t.recipient,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity"),$(t.priceLamports,ve(e,"mintValueCap","lamports"),"mint-value cap");let r=ve(e,"networkFeeCap","lamports"),o=ve(e,"priorityFeeCap","lamports");$(t.networkFeeCapLamports,r,"network-fee cap"),$(t.priorityFeeCapLamports,o,"priority-fee cap"),$(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)&&ae("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function kN(e,t,n){return $(t.network,e.chain.id,"network"),$(t.parentId,e.collection,"collection/drop"),$(t.recipient,e.recipient,"recipient"),$(e.quantity,1,"Ordinals quantity"),$(t.postageSats,ve(e,"mintValueCap","sats"),"mint-value cap"),$(t.maxTotalFeeSats,ve(e,"networkFeeCap","sats"),"network-fee cap"),$(t.maxFeeRateSatVb,ve(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),$(n.plan.network,e.chain.id,"artifact network"),$(n.plan.parentId,e.collection,"artifact collection/drop"),$(n.plan.recipient,e.recipient,"artifact recipient"),$(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),$(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),$(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 du(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:vb})}async function Sb(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:du()}}async function Eb(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ae("invalid-request","request must be a plain object");for(let u of Object.keys(e))mN.has(u)||ae("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ae("invalid-request","explicit adapterId is required; adapter inference is refused"),xb.has(e.adapterId)||ae("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ae("invalid-request","family-specific decoded input is required"),kb(n);let r;try{r=ru(e.intent)}catch(u){ae("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ae("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ae("expired-intent","canonical mint intent has expired");let i=yN(r,e.adapterId);i[1]==="solana"&&ae("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=gN(r,n,r.chain.family,o);bN(r,n);let s;try{i[4]==="evm"?s=await nb(i[5],n,t):i[4]==="opensea"?s=await ti(n,t):i[4]==="solana"?($(n.programId,i[5],"selected Solana adapter program"),s=await rb(n,t)):s=await bb(n,t)}catch(u){if(u instanceof Aa)throw u;ae("adapter-refused",u?.message||"adapter preparation failed",u)}wN(s);let c=i[4]==="bitcoin"?kN(r,n,s):i[4]==="solana"?xN(r,n,s):vN(r,n,s),l=Object.freeze({intentHash:Zy(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 P({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 pu="ROUTE_ONLY",mu=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),Ab=new Set(Object.values(mu)),EN=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),IN=new Set(["amount","currency"]),AN=new Set(["value","unit"]),_N=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),PN=new Set(["provider","operations"]),re=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function cr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new re(`${t} must be a plain object`);return e}function _o(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new re(`${n} has unknown field ${r}`,"unknown-field")}function pe(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new re(`${t} must be an exact non-empty string`);return e}function _b(e,t,{positive:n=!1}={}){if(e=pe(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new re(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function ar(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new re(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>pe(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new re(`${t} contains duplicates`);return r}function Pb(e,t){return e=cr(e,t),_o(e,IN,t),{amount:_b(e.amount,`${t}.amount`),currency:pe(e.currency,`${t}.currency`)}}function Ib(e,t){if(!Array.isArray(e))throw new re(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>Pb(n,`${t}[${r}]`))}function CN(e){if(e=cr(e,"expiry"),_o(e,AN,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new re("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function TN(e,t,n){Object.hasOwn(e,n)&&(t[n]=pe(e[n],n))}function Cb(e){e=cr(e,"intent"),_o(e,EN,"intent");let t=pe(e.action,"action");if(!Ab.has(t))throw new re(`unsupported action ${t}`,"invalid-action");let n={action:t,family:pe(e.family,"family"),network:pe(e.network,"network"),standard:pe(e.standard,"standard"),collection:pe(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])TN(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 re("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new re("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new re("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=pe(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new re("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=pe(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=pe(e.sender,"sender"))}else n.owner=pe(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=pe(e.recipient,"recipient")),n.quantity=_b(e.quantity,"quantity",{positive:!0}),n.marketplace=pe(e.marketplace,"marketplace"),n.protocol=pe(e.protocol,"protocol"),n.artifactKind=pe(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new re(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=Pb(e.price,"price"),n.expiry=CN(e.expiry),n.fees=Ib(e.fees,"fees"),n.royalties=Ib(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=pe(e.listingId,"listingId")),n}function NN(e){e=cr(e,"adapter"),_o(e,_N,"adapter");let t=ar(e.actions,"adapter.actions");for(let o of t)if(!Ab.has(o))throw new re(`adapter has unknown action ${o}`,"invalid-action");let n=cr(e.surface,"adapter.surface");_o(n,PN,"adapter.surface");let r=cr(n.operations,"adapter.surface.operations");for(let o of t)pe(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new re(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:pe(e.id,"adapter.id"),family:pe(e.family,"adapter.family"),networks:Object.freeze(ar(e.networks,"adapter.networks")),standards:Object.freeze(ar(e.standards,"adapter.standards")),marketplaces:Object.freeze(ar(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(ar(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(ar(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:pu,custody:"user",surface:Object.freeze({provider:pe(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function ON(e=[]){if(!Array.isArray(e))throw new re("entries must be an array");let t=e.map(NN);if(new Set(t.map(r=>r.id)).size!==t.length)throw new re("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:pu,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=Cb(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new re("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new re(`adapter lacks ${o.action}`,"unsupported-operation"):new re("no exact adapter route","unsupported-operation")}})}var sr=(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}}),fu=ON([sr("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"}),sr("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"}),sr("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"}),sr("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),sr("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),sr("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function Tb(e,{access:t="public",feeProfile:n="default",registry:r=fu,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new re("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new re("nowMs must be a non-negative safe integer","invalid-expiry");let i=Cb(e);if(i.expiry&&o>=i.expiry.value)throw new re("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:pu,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:pe(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)})}K();var Pa="universal-evm-nft-transfer",Nb="evm-nft-safe-transfer",LN=1800*1e3,$N=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),BN=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function Ob(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(BN.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);Ob(r,t)}}}function hu(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 bn(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 Po=e=>e.toString(16).padStart(64,"0"),_a=e=>e.slice(2).padStart(64,"0");function MN(e,t,n,r,o){return e==="erc721"?`0x42842e0e${_a(t)}${_a(n)}${Po(r)}`:`0xf242432a${_a(t)}${_a(n)}${Po(r)}${Po(o)}${Po(160n)}${Po(0n)}`}function FN(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(Ob(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=bn(e.chainId,"chainId",{positive:!0,safe:!0}),o=hu(e.sender??e.from,"sender"),i=hu(e.recipient??e.to,"recipient"),a=hu(e.contract??e.contractAddress??e.tokenContract,"contract"),s=bn(e.tokenId,"tokenId"),c=bn(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(bn(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=bn(e.gasLimit,"gasLimit",{positive:!0}),u=bn(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=bn(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)>LN)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let f=MN(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 Rb(e={},t={}){let n=FN(e,t),r={provider:Pa,kind:Nb,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...$N},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 P(r,{provider:Pa,kind:Nb,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}K();var Ca="universal-solana-nft-transfer",Lb="solana-verified-nft-transfer",Bb="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",wn=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),$b=new Set(Object.values(wn)),qN=new Set([wn.token,wn.token2022]),DN=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),HN=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function X(e){throw new Error(`solana nft transfer: ${e}`)}function ot(e,t){let n=String(e??"").trim();return n||X(`${t} required`),n}function dt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||X(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&X(`${t} must be positive`),r}function he(e,t,n){String(e??"")!==String(t)&&X(`${n} mismatch; mutation refused`)}function Mb(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))HN.test(r)&&o!=null&&o!==!1&&X(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),Mb(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&X(`${r} refused; adapter is prepare-only`)}}function WN(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&X(`${t} must be decoded`),Array.isArray(e.accounts)||X(`${t} decoded accounts required`),e.decoded}function jN(e,t,n){for(let r of e.accounts){let o=ot(r.pubkey,"account pubkey");t.has(o)||X(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&X(`unexpected writable account ${o}`)}}function zN(e={}){(!e||typeof e!="object"||Array.isArray(e))&&X("request object required"),Mb(e),(e.network!=="mainnet-beta"||e.genesisHash!==Bb)&&X("mainnet genesis/network mismatch"),e.reviewed!==!0&&X("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=ot(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&X("standard must be metaplex or core");let n=ot(e.mint??e.asset,"mint/asset"),r=ot(e.collection,"collection");e.collectionVerified!==!0&&X("verified collection required");let o=ot(e.owner,"owner"),i=ot(e.recipient,"recipient"),a=dt(e.quantity,"quantity",{positive:!0}),s=dt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&X("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&X("Core quantity must be exactly 1");let c=ot(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==wn.core:!qN.has(c))&&X("reviewed transfer program mismatch");let l=t==="metaplex"?ot(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?ot(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&he(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(dt(e.decimals??0,"decimals")):null,p=dt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),f=dt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),m=dt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*f+999999n)/1000000n;h>m&&X("priority fee exceeds reviewed cap");let y=dt(e.networkFeeLamports,"networkFeeLamports"),w=dt(e.networkFeeCapLamports,"networkFeeCapLamports");y>w&&X("network fee cap exceeded");let v=e.transaction;(!v||typeof v!="object"||Array.isArray(v))&&X("transaction object required"),v.version!==0&&v.version!=="legacy"&&X("transaction version must be 0 or legacy");let g=ot(v.recentBlockhash,"recentBlockhash");he(g,e.approvedBlockhash,"blockhash mutation after approval");let b=dt(v.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),k=dt(e.currentBlockHeight,"currentBlockHeight");k>b&&X("expired blockhash"),(!Array.isArray(v.instructions)||v.instructions.length<3)&&X("canonical instructions required");let E=new Set([o,n,l,u].filter(Boolean)),I=new Set([o,i,n,r,l,u,...$b].filter(Boolean)),_=0,O=0,N=0,T=0;for(let[q,se]of v.instructions.entries()){let Z=ot(se.programId,`instructions[${q}].programId`);$b.has(Z)||X(`unknown program ${Z}`);let R=WN(se,`instructions[${q}]`);jN(se,I,E);let H=String(R.type??R.instruction??"").toLowerCase();Z===wn.computeBudget?H.includes("limit")?(he(R.units??R.computeUnitLimit,p,"compute-unit limit"),_++):H.includes("price")?(he(R.microLamports??R.computeUnitPriceMicroLamports,f,"compute-unit price"),O++):X("unsupported compute budget instruction"):Z===wn.associatedToken?((t!=="metaplex"||H!=="createassociatedtokenaccountidempotent")&&X("non-canonical associated token instruction"),he(R.payer,o,"ATA payer"),he(R.owner,i,"ATA recipient"),he(R.mint,n,"ATA mint"),he(R.tokenAccount,u,"recipient ATA"),he(R.tokenProgramId,c,"ATA token program"),T++):t==="metaplex"&&Z===c?(H!=="transferchecked"&&X("only canonical transferChecked is allowed"),he(R.mint,n,"mint"),he(R.owner,o,"owner"),he(R.recipient,i,"recipient"),he(R.sourceTokenAccount,l,"source token account"),he(R.destinationTokenAccount,u,"recipient ATA"),he(R.amount,a,"quantity"),he(R.decimals,d,"decimals"),N++):t==="core"&&Z===wn.core?(H!=="transfer"&&X("only canonical Core transfer is allowed"),he(R.asset,n,"mint/asset"),he(R.collection,r,"collection"),R.collectionVerified!==!0&&X("verified collection required in Core instruction"),he(R.owner,o,"owner"),he(R.newOwner,i,"recipient"),he(R.amount??1,1,"quantity"),N++):X(`program ${Z} is not valid for ${t} transfer`)}return(_!==1||O!==1)&&X("exactly one compute-unit limit and price instruction required"),N!==1&&X("exactly one canonical transfer instruction required"),t==="metaplex"&&T>1&&X("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:b.toString(),currentBlockHeight:k.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:f.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:m.toString(),networkFeeLamports:y.toString(),networkFeeCapLamports:w.toString(),transaction:v}}function Fb(e={},t={}){let n=zN(e),r=Number(t.nowMs??Date.now()),o={provider:Ca,kind:Lb,chain:"solana-mainnet-beta",genesisHash:Bb,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...DN},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 P(o,{provider:Ca,kind:Lb,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}K();var Ta="universal-ordinals-transfer",Ub="bitcoin-ordinals-transfer-plan",qb=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),GN=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ne(e){throw new Error(`ordinals transfer: ${e}`)}function zt(e,t){let n=String(e??"").trim();return n||ne(`${t} required`),n}function jt(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ne(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ne(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ne(`${t} out of range`),o}function Db(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ne(`${t} must be positive`),n}function zb(e,t){let n=zt(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ne(`${t} must be 64 hex`),n}function Vb(e,t="inscriptionId"){let n=zt(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ne(`${t} must be canonical`),n}function Gb(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&&ne(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Gb(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ne(`${r} bypass refused; adapter is prepare-only`)}function Kb(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ne(`${t}.${n} arbitrary script refused; use a bound address`)}function Hb(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Kb(e,t);let n=zb(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ne(`${t}.vout invalid`),{txid:n,vout:r,valueSats:jt(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:zt(e.address,`${t}.address`),sequence:Number(jt(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function Wb(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Kb(e,t),{role:zt(e.role,`${t}.role`),address:zt(e.address,`${t}.address`),valueSats:jt(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:Vb(e.inscriptionId,`${t}.inscriptionId`)}}}function jb(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ne(`${n} mismatch; mutation refused`)}function KN(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ne("request object required"),Gb(e);let t=zt(e.network,"network").toLowerCase(),n=zb(e.genesisHash,"genesisHash");(!qb[t]||n!==qb[t])&&ne("network/genesis mismatch");let r=Vb(e.inscriptionId),o=Hb(e.ownerInput,"ownerInput");zt(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ne("current inscription outpoint mismatch");let i=zt(e.destination,"destination"),a=jt(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:Wb(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ne("exact change output invalid");let c=Db(e.feeRateSatVb,"feeRateSatVb"),l=Db(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ne("fee rate exceeds reviewed cap");let u=jt(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=jt(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ne("total fee exceeds reviewed cap");let p=Number(jt(e.locktime,"locktime",{max:0xffffffffn})),f=Number(jt(e.sequence,"sequence",{max:0xffffffffn}));f<4294967294&&ne("RBF sequence refused"),o.sequence!==f&&ne("owner input sequence mismatch");let m=e.psbt;(!m||typeof m!="object"||Array.isArray(m))&&ne("decoded PSBT plan required"),(m.version!==0||m.unsigned!==!0)&&ne("PSBT v0 must be explicitly unsigned"),Number(m.locktime)!==p&&ne("PSBT locktime mismatch"),(!Array.isArray(m.inputs)||m.inputs.length!==1)&&ne("exactly one PSBT input required; extra inputs refused"),jb(Hb(m.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(m.outputs)?m.outputs.map((g,b)=>Wb(g,`psbt.outputs[${b}]`)):ne("PSBT outputs required"),y={role:"inscription",address:i,valueSats:a,inscriptionId:r};jb(h,s?[y,s]:[y],"exact PSBT outputs"),h.filter(g=>g.role==="inscription"&&g.inscriptionId===r).length!==1&&ne("exactly one inscription-carrying output required");let v=h.reduce((g,b)=>g+BigInt(b.valueSats),0n);return BigInt(o.valueSats)!==v+u&&ne("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 Yb(e={},t={}){let n=KN(e);return P({provider:Ta,kind:Ub,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...GN},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:Ta,kind:Ub,env:t.env})}de();function XN(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 Xb(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(!Mc(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=XN(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 Jb(e={},t={}){let n=t.rpcCall||M,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 QN=1440*60*1e3;function ZN(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>QN&&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 Qb="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",e2=4663,t2="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Zb="a22cb465",n2="a0712d68";function gu(e){return String(e||"").trim().toLowerCase()}function lr(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function r2(e){let t=lr(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Zb}${t.padStart(64,"0")}${"0".repeat(64)}`}function o2(e){return lr(e).includes(lr(Qb))}function i2(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>lr(n?.data).startsWith(Zb))}function a2(e={},t){let n=lr(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return gu(i[0])!==t2?!1:lr(i[2])===n})}function s2(e=1){return`0x${n2}${BigInt(e).toString(16).padStart(64,"0")}`}function ew(e={},t={}){let n=gu(e.contract),r=gu(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!==e2&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),o2(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"),i2(s)&&a.push("simulation sets approval / setApprovalForAll"),a2(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:s2(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:r2(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Hf(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=ZN(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:Qb.toLowerCase(),reasons:a,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}L();K();bi();var l2="https://api.paraswap.io",yu=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||l2).replace(/\/$/,"");function ur(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 bu(e={},t={}){let n=Number(e.chainId||1);return x(`${yu(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function dr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:ur(e.srcToken,"srcToken"),destToken:ur(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 yi({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(Qp(o)))r.set(s,c);let i=await x(`${yu(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...ee(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 tw(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=ur(e.userAddress,"userAddress"),o=await dr(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:ur(e.srcToken,"srcToken"),destToken:ur(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=ur(e.receiver,"receiver"));let c=await x(`${yu(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 P({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:ue(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function nw(e={}){let t=await bu({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 d2}from"node:crypto";import{getAddress as cw,isAddress as wu}from"ethers";var rw="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",p2=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),m2=Object.freeze(["lifi"]),ow=/^0x[0-9a-fA-F]{64}$/,f2=/^\d+$/;function me(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function iw(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&me(t,"must be a positive chainId"),n}function Na(e,t){let n=String(e??"").trim();return(!f2.test(n)||BigInt(n)<=0n)&&me(t,"must be a positive integer string"),n}function h2(e,t){return e==null||e===""?null:Na(e,t)}function aw(e,t){let n=String(e??"").trim();return n.toLowerCase()===rw.toLowerCase()?rw:(wu(n)||me(t,"must be an EVM address or native token sentinel"),cw(n))}function lw(e,t){let n=String(e??"").trim();return wu(n)||me(t,"must be an EVM address"),cw(n)}function g2(e,t){return e==null||e===""?null:lw(e,t)}function sw(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||me(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function y2(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||me(r,"must be a finite millisecond timestamp"),o<=t&&me(r,"expired"),o>t+n&&me(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 b2(e){return JSON.stringify(pr(e))}function Oa(e){return`0x${d2("sha256").update(b2(e)).digest("hex")}`}function uw(e,t){let n={...e};for(let r of t)delete n[r];return n}function w2(e){return Oa(uw(e,["intentHash"]))}function v2(e){return Oa(uw(e,["firmQuoteHash"]))}function vu(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&me("time","is invalid");let o=iw(e.fromChainId??e.fromChain,"fromChainId"),i=iw(e.toChainId??e.toChain,"toChainId"),s=o===i?p2:m2,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:aw(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:aw(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Na(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:lw(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:y2(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:h2(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:sw(e.allowedSources,"allowedSources",s),allowedRouters:sw(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)&&me("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Oa({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=w2(c),Object.freeze(c)}function x2(e){return(!e||typeof e!="object"||Array.isArray(e))&&me("artifact","required"),e.typedDataHash!=null&&!ow.test(String(e.typedDataHash))&&me("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!ow.test(String(e.calldataHash))&&me("artifact.calldataHash","must be bytes32"),e.to!=null&&!wu(String(e.to))&&me("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&me("artifact.data","must be hex"),pr(e)}function dw(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&me("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||me("quote expiry","required"),o<=r&&me("quote","expired"),o>e.deadlineMs&&me("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||me("source","required"),e.allowedSources.includes(i)||me("source","not allowed by intent");let a=Na(t.amountOut??t.buyAmount,"amountOut"),s=Na(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&me("minBuyAmount","exceeds amountOut");let c=x2(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||me("quotedAtMs","must be finite");let u=g2(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=Oa({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=v2(d),Object.freeze(d)}function Co(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function pw(e,t){return String(e?.[t]??"").trim()}function To(e,t){return Object.freeze({source:e,run:t})}function k2(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??Be,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return Co(e,"lifi")&&a.push(To("lifi",async()=>{let c=await(r.lifiQuote??Vr)({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 S2(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Co(e,"paraswap")&&a.push(To("paraswap",async()=>{let c=await(r.paraswapPrice??dr)({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}}})),Co(e,"0x")&&(pw(n,"ZEROX_API_KEY")||pw(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(To("0x",async()=>{let c=await(r.zeroxQuote??Kr)({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}}})),Co(e,"cow")&&a.push(To("cow",async()=>{let c=await(r.cowQuote??Bn)({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}}})),Co(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(To("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Sn)({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 S2(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function E2(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function I2(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>E2(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(dw(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 A2(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 mw(e,t={}){let n=k2(e,t),{quotes:r,failed:o}=await I2(e,n,t),i=A2(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 fw(e={},t={}){return vu(e,t)}async function hw(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:vu(e,t);return mw(n,t)}async function gw(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}L();var P2="https://app.across.to";function xu(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||P2).replace(/\/$/,"")}async function yw(e={}){try{let t=await x(`${xu(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 bw(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return x(`${xu(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ww(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)),x(`${xu(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var T2="https://api.beefy.finance";function ku(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||T2).replace(/\/$/,"")}async function vw(e={}){try{let t=await x(`${ku(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 xw(e={},t={}){let n=await x(`${ku(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 kw(e={}){return x(`${ku(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}L();var O2="https://public-api.birdeye.so";function Sw(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||O2).replace(/\/$/,"")}async function Ew(e={}){try{let t=await x(`${Sw(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 Iw(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 x(`${Sw(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var L2="https://api.celenium.io";function Su(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||L2).replace(/\/$/,"")}async function Aw(e={}){try{let t=await x(`${Su(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 _w(e={}){return x(`${Su(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function Pw(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 x(`${Su(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var B2="https://api.mainnet-beta.solana.com";function M2(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||B2).replace(/\/$/,"")}async function Ra(e,t,n={}){let r=M2(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 Cw(e={}){try{let t=await Ra("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 Tw(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 Ra("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function Nw(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)),Ra("searchAssets",o,t)}async function Ow(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Ra("getAssetProof",{id:n},t)}L();var U2="https://api.l2beat.com";function Eu(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||U2).replace(/\/$/,"")}async function Rw(e={}){try{let t=await x(`${Eu(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 Lw(e={},t={}){let n=await x(`${Eu(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 $w(e={},t={}){return x(`${Eu(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var D2="https://api.spark.fi";function Iu(e={}){return(e.baseUrl||process.env.SPARK_API_URL||D2).replace(/\/$/,"")}async function Bw(e={}){try{return{ok:(await x(`${Iu(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 Mw(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?x(`${Iu(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):x(`${Iu(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var W2="https://api.symbiotic.fi";function Au(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||W2).replace(/\/$/,"")}async function Fw(e={}){try{let t=await x(`${Au(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 Uw(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await x(`${Au(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 qw(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return x(`${Au(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var z2="https://staking-api.polygon.technology/api/v2",V2=18,G2=200,K2=50,Y2=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Pu(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||z2).replace(/\/$/,"")}function X2(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 J2(e,t=K2){let n=Number(e??t);return Number.isFinite(n)?Math.min(G2,Math.max(1,Math.trunc(n))):t}function _u(e){let t=Number(e);return Number.isFinite(t)?t/10**V2:null}async function Cu(e,t={}){let n=await x(`${Pu(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 Dw(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:_u(e.totalStaked),selfStakePolApprox:_u(e.selfStake),delegatedStakePolApprox:_u(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function Hw(e={},t={}){let n=await Cu("/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=Y2.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=J2(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(Dw)}}async function Ww(e={},t={}){let n=X2(e.id??e.validatorId,"id"),o=(await Cu(`/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:{...Dw(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 jw(e={}){try{let t=await Cu("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Pu(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Pu(e),error:String(t?.message||t),exec:!1}}}L();var Z2="https://api.v3.aave.com/graphql",CF=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),eO=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||Z2;async function La(e,t,n={}){let r=await x(eO(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 tO=`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 ks=new Map;function gp(e){let t=RS(e);return ks.set(t.chainId,t),t}function yp(e){return ks.get(Number(e))||null}function bp(){return[...ks.values()]}de();var Es={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},We=e=>BigInt(e).toString(16).padStart(64,"0"),Cr=e=>e.slice(2).toLowerCase().padStart(64,"0");function LS(e,t){return`0x${Es.getAmountsOut}`+We(e)+We(64)+We(t.length)+t.map(Cr).join("")}function $S(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 Ss(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Is=100;function BS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Is)throw new Error(`slippageBps ${n} exceeds the ${Is} 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 wp(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await M(t,"eth_call",[{to:o,data:LS(i,a)},"latest"],s);return $S(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=Ss(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=Ss(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:j.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:j.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:j.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:j.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:j.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=j.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=j.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=j.CAUTION,y=`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:y,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=Ss(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 y=BS(h.amountOut,c);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(l)),v=n&&m[0].toLowerCase()===n.toLowerCase()&&d.useNative,g=v?`0x${Es.swapExactETHForTokens}`+We(y)+We(128)+Cr(s)+We(w)+We(m.length)+m.map(Cr).join(""):`0x${Es.swapExactTokensForTokens}`+We(a)+We(y)+We(160)+Cr(s)+We(w)+We(m.length)+m.map(Cr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:g,value:v?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:y.toString(),slippageBps:c,maxSlippageBps:Is,deadline:w.toString()},requires:v?[]:[{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."}}}}de();var MS=[100,500,3e3,1e4],vp={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},rn=e=>BigInt(e).toString(16).padStart(64,"0"),Tr=e=>e.slice(2).toLowerCase().padStart(64,"0"),xp=/^0x[0-9a-fA-F]{40}$/,_s=100;function FS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>_s)throw new Error(`slippageBps ${n} exceeds the ${_s} 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 As(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function kp(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${vp.quoteExactInputSingle}`+Tr(a)+Tr(s)+rn(c)+rn(l)+rn(0),p=await M(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 MS){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=As(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(!xp.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=As(c.scanner,"quoter"),u=s||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:j.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||!u)return{chainId:t,token:i,verdict:j.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 d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:a},c);if(!d.best)return{chainId:t,token:i,verdict:j.FAIL,evidence:G.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:j.FAIL,evidence:G.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=p.best.amountOut,m=Number(f*10000n/BigInt(a)),h=j.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=j.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=j.CAUTION,y=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:y,amountIn:String(a),bought:d.best.amountOut.toString(),returned:f.toString(),retentionBps:m,buyFee:d.best.fee,sellFee:p.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=As(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(!xp.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=FS(f.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=!!(d.useNative||f.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),w=`0x${vp.exactInputSingle}`+Tr(i)+Tr(a)+rn(m)+Tr(c)+rn(s)+rn(h)+rn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:y?String(s):"0x0"},guard:{quotedOut:f.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:_s,fee:m},requires:y?[]:[{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 ii={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Sp(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Ep(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 US(e){let{chainId:t}=e;async function n(r,o,i){return M(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await br(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:G.LIVE}},async nativeBalance(r,o={}){let i=await Xt(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 wr({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,ii.decimals,o).catch(()=>null),n(r,ii.symbol,o).catch(()=>null),n(r,ii.name,o).catch(()=>null),n(r,ii.totalSupply,o).catch(()=>null)]),l=Sp(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:Ep(a?.result??a),name:Ep(s?.result??s),totalSupply:(Sp(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 Jt(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?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 M(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=j.PASS,s=u=>{let d={[j.PASS]:0,[j.CAUTION]:1,[j.UNKNOWN]:2,[j.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==G.LIVE?(i.push({check:"erc20-metadata",result:j.UNKNOWN,detail:c.warning}),s(j.UNKNOWN)):i.push({check:"erc20-metadata",result:j.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===G.UNAVAILABLE)i.push({check:"liquidity",result:j.UNKNOWN,detail:l.reason}),s(j.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:j.FAIL,detail:"no pool with liquidity found"}),s(j.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:j.CAUTION,detail:`top pool only $${d}`}),s(j.CAUTION)):i.push({check:"liquidity",result:j.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:j.CAUTION,detail:"pool under 24h old"}),s(j.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:j.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),s(u.verdict)}else i.push({check:"sellability",result:j.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),s(j.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ip(e){let n={...US(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,kp({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,wp({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 An=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function Ps(){return An.map(e=>gp(Ip(e)))}var Nr=new Map,qS=Object.keys(Be).map(Number),DS=Object.keys(st).map(Number),HS=An.map(e=>e.chainId),WS=[...new Set(Object.values(Qo))],Cs=new Set,Ap=!1;function A(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(Ap&&Cs.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Nr.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Nr.get(t)}function Ts(e){return Nr.get(e)||null}function ai({venue:e,op:t}={}){let n=[...Nr.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function jS(){Cs.clear();for(let e of Nr.keys())Cs.add(e);Ap=!0}A({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"});A({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."});A({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."});A({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."});A({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"});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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."]])A({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});A({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."});A({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:HS,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:An.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."});A({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)"});A({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)"});A({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"});A({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."});A({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."});A({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"});A({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."});A({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."});A({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."});A({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."});A({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."});A({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"});A({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)"});A({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});A({id:"uniswap-v3",venue:"dex",chainIds:qS,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"});A({id:"uniswap-v4",venue:"dex",chainIds:DS,auth:"none",ops:["health","quote","chains"],execution:"read-only",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});A({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)"});A({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)"});A({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)"});A({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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"});A({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"});A({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"});A({id:"opensea-nft",venue:"nft",chainIds:WS,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"});A({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"});A({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"});A({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"});A({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"});A({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"});A({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"});A({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)"});A({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"});A({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)"});A({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"});A({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"});A({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."});A({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."});jS();A({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});A({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."});A({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."});A({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."});A({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."});A({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)."});A({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."});A({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."});A({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."});A({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."});A({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."});A({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"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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."});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});A({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)"});L();et();et();var YS=/^0x[0-9a-fA-F]{40}$/,Rr="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Ns(e,t){let n=String(e||"").trim();if(!YS.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Rp(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Lp(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 XS(e){return[...e].sort((t,n)=>(Rp(n.tvl)??-1)-(Rp(t.tvl)??-1))}function Os(e){return e.hlInfo||oe}function Rs(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Ls(e={},t={}){let n=await Os(t)({type:"vaultSummaries"},t),r=XS((Array.isArray(n)?n:[]).map(Lp));return Rs({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function ui(e={},t={}){let r={type:"vaultDetails",vaultAddress:Ns(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Ns(e.user,"user"));let o=await Os(t)(r,t);return Rs({provider:"hl-vaults",vault:Lp(o||{}),raw:o})}async function $s(e={},t={}){let n=Ns(e.user||e.address,"user"),r=await Os(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 Rs({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Bs(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return ui({...e,vaultAddress:Rr},t);if(n==="summaries")return Ls(e,t);if(n==="details")return ui(e,t);if(n==="mine")return $s(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function $p(e={}){try{let t=await Bs({mode:"hlp"},e);return{ok:t.vault.vaultAddress===Rr&&!!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}}}de();import{AbiCoder as QS}from"ethers";var Ms=999;var Se=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Fs=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),ZS=QS.defaultAbiCoder();function Lr(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 $r(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 on(e,t){return e.length?ZS.encode(e,t):"0x"}function gt(e,t=0){let r=String(e||"").replace(/^0x/i,"").slice(t*64,t*64+64);if(r.length!==64)throw new Error("hl-precompiles: malformed precompile result");return BigInt(`0x${r}`)}function eE(e,t=0){let n=gt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function _t(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Ms});let r=await M(Ms,"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 Pt(e){return{provider:"hl-precompiles",chainId:Ms,...Fs,...e}}async function di(e={}){let t=await _t(Se.l1BlockNumber,"0x",e);return Pt({op:"l1BlockNumber",precompile:Se.l1BlockNumber,l1BlockNumber:gt(t).toString(),raw:t})}async function Us(e={},t={}){let n=$r(e.index??e.assetId??0,"index",32),r=await _t(Se.markPx,on(["uint32"],[n]),t);return Pt({op:"markPx",precompile:Se.markPx,index:n,markPx:gt(r).toString(),raw:r})}async function qs(e={},t={}){let n=$r(e.index??e.assetId??0,"index",32),r=await _t(Se.oraclePx,on(["uint32"],[n]),t);return Pt({op:"oraclePx",precompile:Se.oraclePx,index:n,oraclePx:gt(r).toString(),raw:r})}async function Ds(e={},t={}){let n=$r(e.index??e.assetId??0,"index",32),r=await _t(Se.spotPx,on(["uint32"],[n]),t);return Pt({op:"spotPx",precompile:Se.spotPx,index:n,spotPx:gt(r).toString(),raw:r})}async function Hs(e={},t={}){let n=Lr(e.user,"user"),r=$r(e.perp??e.assetId??0,"perp",16),o=await _t(Se.position,on(["address","uint16"],[n,r]),t);return Pt({op:"position",precompile:Se.position,user:n,perp:r,szi:eE(o,0),raw:o})}async function Ws(e={},t={}){let n=Lr(e.user,"user"),r=$r(e.token??0,"token",64),o=await _t(Se.spotBalance,on(["address","uint64"],[n,r]),t);return Pt({op:"spotBalance",precompile:Se.spotBalance,user:n,token:r,total:gt(o,0).toString(),hold:gt(o,1).toString(),raw:o})}async function js(e={},t={}){let n=Lr(e.user,"user"),r=Lr(e.vaultAddress??e.vault??Rr,"vault"),o=await _t(Se.vaultEquity,on(["address","address"],[n,r]),t);return Pt({op:"vaultEquity",precompile:Se.vaultEquity,user:n,vaultAddress:r,hlp:r===Rr,equity:gt(o,0).toString(),raw:o})}async function zs(e={},t={}){let n=Lr(e.user,"user"),r=await _t(Se.withdrawable,on(["address"],[n]),t);return Pt({op:"withdrawable",precompile:Se.withdrawable,user:n,withdrawable:gt(r).toString(),raw:r})}async function Bp(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return di(t);if(n==="markPx")return Us(e,t);if(n==="oraclePx")return qs(e,t);if(n==="spotPx")return Ds(e,t);if(n==="position")return Hs(e,t);if(n==="spotBalance")return Ws(e,t);if(n==="vaultEquity"||n==="hlp")return js(e,t);if(n==="withdrawable")return zs(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Mp(e={}){try{let t=await di(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Fs,l1BlockNumber:t.l1BlockNumber,precompiles:Se}}catch(t){return{ok:!1,provider:"hl-precompiles",...Fs,error:String(t?.message||t).slice(0,160)}}}et();K();function Fp(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function mi(e={},t,n){let r=String(t||""),o=Fp(e);if(o){let a=Br(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=Br(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function fi(e={},t=[],n){let r=Fp(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Br(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&Br(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(Br(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Vs=Number.MAX_SAFE_INTEGER,pi=String(Vs);function Br(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Vs?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>pi.length||t.length===pi.length&&t>pi||t===pi&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Vs?r:null}function im(){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 bt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function am(e){let t=bt(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function zE(e,t,n=4){let r=bt(e),o=bt(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 sm(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=bt(a.funding),l=bt(a.markPx??a.oraclePx),u=bt(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:bt(a.oraclePx),openInterest:u,fundingAprPct:am(c)})}return r}function cm(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=bt(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=am(n),o=n>0,i={coin:e.coin,notionalUsd:bt(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?zE(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 dc(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await je(t),i=sm(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 pc(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 je(t),i=sm(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return cm(i,r)}async function mc(e={},t={}){um(e,t,"hl-delta-neutral");let n=dm(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await pc(e,t);if(r.verdict==="skip")return P({...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=mi(e,r.coin,"hl-delta-neutral");if(!lm.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(()=>(xi(),uc)),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 P({...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 lm=/^0x[0-9a-fA-F]{40}$/;function um(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 VE(e,t,n){um(e,t,n)}function GE(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=dm(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"&&fi(e,n,"hl-delta-neutral"),t==="live"&&!lm.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 dm(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 pm(e={},t={}){VE(e,t,"hl-delta-neutral");let n=GE(e),r=await dc({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=cm(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 mc({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();K();Cn();var YE=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Hr=14,mm=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Rn(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function fc(e){let t=String(e||"").replace(/\/$/,"");if(!YE.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function fm(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=mm(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=fc(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(an(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(an(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Rn(n.orderType,0,"orderType"),Rn(n.timeInForce,1,"timeInForce"),Rn(n.reduceOnly,0,"reduceOnly"),Rn(n.triggerPrice,0,"triggerPrice"),Rn(n.orderExpiry,-1,"orderExpiry");let c=mm(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=Ve(n.baseAmount,"lighter: baseAmount"),d=Ve(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 y=m+h,w=u*d,v=ye(n.notionalUsd,y,"lighter: notionalUsd");if(v<=0n)throw new Error("lighter: notionalUsd required");if(w!==v)throw new Error("lighter: notionalUsd must match size and price");let g=ye(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,y,"lighter: maxNotionalUsd");if(w>g)throw new Error("lighter: notional exceeds cap");let b=ve(n.notionalUsd,"lighter: notionalUsd");return Rn(n.txType,Hr,"txType"),Object.freeze({unit:"usd",value:String(b),notional:String(b),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:f,submitTo:o,actionType:"create-order",amount:String(b)})}function XE(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 hm(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=fc(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:XE(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??Hr,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return fm(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var ym="https://mainnet.zklighter.elliot.ai",bm="https://testnet.zklighter.elliot.ai";function JE(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?bm:ym}function wm(){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 Rt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function QE(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 vm(e){let t=Rt(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function ZE(e,t,n=4){let r=Rt(e),o=Rt(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 gm(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function xm(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=gm(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=gm(a.market_id);if(s==null)continue;let c=o.get(s),l=Rt(c?.mark_price??c?.index_price),u=Rt(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:Rt(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:vm(u)})}return i}function km(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Rt(e.funding);if(n==null)throw new Error("lighter: funding required");let r=vm(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Rt(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?ZE(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 Sm(e={}){let t=JE(e),n=e.fetchImpl,r=await x(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await x(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function hc(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Sm(t),i=xm(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 gc(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 Sm(t),a=xm(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return km(a,r)}async function yc(e={},t={}){Im(e,t,"lighter");let n=Am(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 gc(e,t);if(o.verdict==="skip")return P({...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=mi(e,o.coin,"lighter");if(!Em.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=QE(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:Hr,submitTo:`${s?bm:ym}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=hm(u,{...e,maxNotionalUsd:n},t)}catch(m){p=String(m?.message||m).slice(0,200)}return P({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Em=/^0x[0-9a-fA-F]{40}$/;function Im(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 eI(e,t,n){Im(e,t,n)}function tI(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=Am(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"&&fi(e,n,"lighter"),t==="live"&&!Em.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 Am(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 _m(e={},t={}){eI(e,t,"lighter");let n=tI(e),r=await hc({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=km(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 yc({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();var rI="https://clob.polymarket.com",oI="https://gamma-api.polymarket.com";function Wr(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||rI).replace(/\/$/,"")}function Pm(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||oI).replace(/\/$/,"")}async function bc(e={}){return x(`${Wr(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Cm(e={}){let t=await bc(e);return{ok:t!=null&&t!=="",time:t}}async function Tm({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 x(`${Pm(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Nm(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${Wr(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Om(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${Wr(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Rm(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${Wr(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Lm(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return x(`${Wr(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function $m({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 x(`${Pm(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}de();L();import{createHash as Bm}from"node:crypto";var Ln="mainnet-beta",aI="https://api.mainnet-beta.solana.com",wc="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function sI(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||aI).trim()}function ce(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 cI(e,t){return t?[...e,{commitment:t}]:e}async function jr(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 x(sI(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 vc(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await jr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Ln,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Mm(e={}){try{let[t,n]=await Promise.all([jr("getHealth",[],e),vc({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Ln,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Ln,error:String(t?.message||t),exec:!1}}}async function ki(e={},t={}){let n=ce(e.address||e.owner,"address"),r=await jr("getBalance",cI([n],e.commitment),t);return{provider:"solana-rpc",cluster:Ln,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function lI(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 zr(e={},t={}){let n=ce(e.owner||e.address,"owner"),r=e.mint?{mint:ce(e.mint,"mint")}:{programId:ce(e.programId||wc,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await jr("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(lI):[];return{provider:"solana-rpc",cluster:Ln,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function uI(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 dI(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 pI(e){let t=Buffer.from(e,"base64");try{let n=dI(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Bm("sha256").update(t.subarray(r)).digest("hex")}catch{return Bm("sha256").update(t).digest("hex")}}async function Fm(e={},t={}){let n=uI(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await jr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Ln,ok:i.err==null,transactionHash:pI(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}L();var fI="mainnet",hI="https://mempool.space/api",gI="https://mempool.space/testnet/api";function lt(e={}){return String(e.network||process.env.BTC_NETWORK||fI).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function kc(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):lt(e)==="testnet"?gI:hI}function xc(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function tt(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function yI(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 Sc(e,t={}){let n=`${kc(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 Si(e,t={}){let n=await Sc(e,t);try{return JSON.parse(n)}catch{return n}}async function Um(e={}){try{let t=await Sc("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:lt(e),baseUrl:xc(kc(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:lt(e),baseUrl:xc(kc(e)),error:xc(t?.message||t),exec:!1}}}async function qm(e={}){let t=await Sc("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:lt(e),tipHeight:Number(t)}}async function Dm(e={}){try{let t=await Si("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:lt(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:lt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ei(e={},t={}){let n=tt(e.address||e.addr,"address"),r=await Si(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:lt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Hm(e={},t={}){let n=tt(e.address||e.addr,"address"),r=await Si(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:lt(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Wm(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 Si(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:lt(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function jm(e={},t={}){let n=yI(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:lt(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}var Ec="https://ordinals.com";function Ii(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var wI=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function zm(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=Ii(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=wI.includes(o)&&(i==="https:"||a)}}catch{n=!1}return He({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function $n(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:zm(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 Vm(e={}){let t=Ii(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:zm(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 Ai(e={},t={}){let n=tt(e.address||e.addr,"address"),r=Ii(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 $n(a,t),c=vI(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 vI(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 Bn(e={},t={}){let n=tt(e.address||e.addr,"address"),r=Ii(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 $n(s,t),l=xI(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 Gm(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||Ec,o=await $n(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Km(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||Ec,o=Number(e.page||0),i=await $n(`${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 Ym(e={},t={}){let n=t.ordinalsBase||Ec,r=e.height??await $n(`${n}/r/blockheight`,t),o=await $n(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function xI(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}))}K();var SI=["unsigned","notsigned","tosign","signable"],EI=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),II=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Ic(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function AI(e){return SI.some(t=>e.startsWith(t))||EI.has(e)}function _I(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Ic(t);return AI(n)?!1:II.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function PI(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 Ac(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=>Ac(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(_I(c)){o.push(c);continue}o.push(...Ac(l,t+1,n,r))}let a=Object.keys(e).map(Ic).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Ic(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),PI(e)&&o.push("v/r/s"),o}function wt(e,t){let n=Ac(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 CI="https://api.satflow.com/v1";function Xm(e={}){return Ze({provider:"satflow",defaultUrl:CI,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function _i(e={}){return Xm(e).baseUrl}function Pc(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function TI(e={}){return He({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Pc(e)},Xm(e).trusted)}async function Lt(e,{method:t="GET",body:n,opts:r={}}={}){if(!Pc(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${_i(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:TI(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 Jm(e={}){if(!!!Pc(e))return{ok:!1,provider:"satflow",baseUrl:_i(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 Lt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:_i(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:_i(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Qm(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 Lt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Zm(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 Lt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function ef(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 Lt(`/item?${r}`,{opts:t})}}async function Pi(e={},t={}){let n=tt(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await Lt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function tf(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 Lt(`/orders/floor?${r}`,{opts:t})}}var NI=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function nf(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))NI.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var OI=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"]),RI=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function _c(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 LI(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=tt(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=tt(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function rf(e={},t={}){let n=nf(e,OI);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=_c(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Lt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=_c(a)??_c(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`);wt("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=LI(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return P({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 Ci(e={},t={}){let n=nf(e,RI);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 Lt("/intent/sell",{method:"POST",body:n,opts:t});return wt("satflow",r),P({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}L();K();var Ni="https://lite-api.jup.ag/swap/v1",Tc="So11111111111111111111111111111111111111112",sf="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",BI=100,of=2e4;function cf(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Ni).replace(/\/$/,"")}function Vr(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 lf(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>BI)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function Ti(e,t){return e==null?t:!!e}function MI(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 FI(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 uf(e){let t=Buffer.from(e,"base64"),n=FI(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 Cc(e={},{quotedAtMs:t=Date.now(),ttlMs:n=of}={}){let r=ce(e.inputMint,"inputMint"),o=ce(e.outputMint,"outputMint"),i=Vr(e.inAmount,"inAmount"),a=Vr(e.outAmount,"outAmount"),s=Vr(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=lf(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)||of,1e3),3e4)}}function UI({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Tc)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=uf(n),a=Vr(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 qI=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),DI="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function af(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=DI.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 df(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(`${Ni}/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])=>af(p)),c=[],l=a.filter(([p])=>!af(p)).map(([p,f])=>({programId:p,label:f,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Ni}/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(([y])=>y),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(y=>setTimeout(y,2e3*(h+1)))}if(!m){for(let[h,y]of f)l.push({programId:h,label:y,reason:"rpc batch failed after 3 attempts"});continue}m.value.forEach((h,y)=>{let[w,v]=f[y];h&&h.executable===!0&&qI.has(h.owner)?c.push({programId:w,label:v,owner:h.owner}):l.push({programId:w,label:v,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:`${Ni}/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 pf(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Oi({inputMint:Tc,outputMint:sf,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 Oi(e={},t={}){let n=ce(e.inputMint||e.fromMint||Tc,"inputMint"),r=ce(e.outputMint||e.toMint||sf,"outputMint"),o=Vr(e.amount||e.inAmount,"amount"),i=lf(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${cf(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 x(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Cc({...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 HI(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function mf(e={},t={}){let n=ce(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Cc(e.quoteResponse,t)}:await Oi(e,t),o=r.quote,i=r.solanaGuard||Cc(o,t);if(Ti(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await x(`${cf(t)}/swap`,{method:"POST",body:HI({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:Ti(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:Ti(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:Ti(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=MI(a?.swapTransaction);uf(s),wt("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=UI({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(f){p=String(f?.message||f).slice(0,200)}return P({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}L();var jI="https://coins.llama.fi",zI="https://api.llama.fi",VI="https://yields.llama.fi",GI="https://stablecoins.llama.fi";function KI(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||jI).replace(/\/$/,"")}function ff(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||zI).replace(/\/$/,"")}async function sn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return x(`${KI(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function hf(e={}){let n=(await sn(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function gf(e={}){return x(`${ff(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function yf(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||VI).replace(/\/$/,""),r=await x(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(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 Ri(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||GI).replace(/\/$/,""),r=e.includePrices!==!1;return x(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function bf(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return x(`${ff(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function wf(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await sn(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}L();var $t="0x000000000000000000000000000000000000dEaD";function Nc(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:$t}K();wi();var XI="https://li.quest/v1";function Rc(e={}){return(e.baseUrl||process.env.LIFI_API_URL||XI).replace(/\/$/,"")}var Oc="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",JI="0x0000000000000000000000000000000000000000";function QI(e){let t=String(e||Oc).toLowerCase();return t===Oc.toLowerCase()||t===JI}function vf(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 xf(e={}){let t=await x(`${Rc(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 Gr(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Oc,toToken:i,fromAmount:a,fromAddress:s=$t}=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=Oe({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 bi({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[y,w]of Object.entries(Jp(u)))c.set(y,w);let d=await x(`${Rc(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=ee(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 kf(e={},t={}){let n=await Gr(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(!QI(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:vf(s,"approval token"),spender:vf(a,"approval spender"),amount:String(e.fromAmount)}}return P({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:ue(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Sf(e={}){return x(`${Rc(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}de();import{Interface as Af,getAddress as Kr,isAddress as eA}from"ethers";K();var Bt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},tA=[1,50,100,200,2e3],Ef=new Af(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),nA=new Af(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),_f="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Pf="0x0000000000000000000000000000000000000000";function Cf(e){let t=Number(e),n=Bt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Bt).join(", ")})`);return{chainId:t,...n}}function If(e,t){let n=Bt[Number(t)];if(!e||e===_f||e===Pf||/^eth$/i.test(String(e)))return Kr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Kr(n.weth);if(/^usdc$/i.test(r))return Kr(n.usdc);if(!eA(r))throw new Error(`invalid token address: ${e}`);return Kr(r)}async function Li(e={},t={}){let{chainId:n,quoter:r,router:o}=Cf(e.chainId??8453),i=If(e.tokenIn||"WETH",n),a=If(e.tokenOut||Bt[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]:[...tA],l=[],u=null;for(let d of c){let p=Ef.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let f=await M(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=Ef.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 ee({venue:"aerodrome",chainId:n,chain:Bt[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 Tf(e={},t={}){let n=Number(e.chainId??8453),r=Cf(n),o=Kr(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===_f||i===Pf||/^eth$/i.test(i),s=await Li(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=nA.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 P({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:ue(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Nf(e={}){let t=Number(e.chainId??8453);try{let n=await Li({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:Bt[t]?.router,quoter:Bt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Of(){return Object.entries(Bt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}L();K();var oA="https://api.0x.org";function Rf(e={}){return Ze({provider:"zerox",defaultUrl:oA,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Lf(e={}){return Rf(e).baseUrl}function $i(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function $f(e={}){return He({"0x-version":"v2",accept:"application/json"},{"0x-api-key":$i(e)},Rf(e).trusted)}async function Bf(e={}){if(!$i(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Lc({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 Lc(e={},t={}){if(!$i(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),x(`${Lf(t)}/swap/allowance-holder/price?${s}`,{headers:$f(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Yr(e={},t={}){if(!$i(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=Oe({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 x(`${Lf(t)}/swap/allowance-holder/quote?${c}`,{headers:$f(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?ee(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 Mf(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Yr(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 P({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:ue(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}L();K();var aA="https://across.to/api",sA="https://api.hop.exchange/v1",cA="https://api.relay.link",lA={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function Ff(e={}){try{return{ok:!0,estimatedFillTimeSec:(await $c({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 $c(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||aA).replace(/\/$/,"");return x(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Uf(e={}){try{let t=await Bc({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 Bc(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=Oe({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||sA).replace(/\/$/,""),u=await x(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?ee(u,{chainId:Number(e.originChainId||e.chainId||lA[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 qf(e={}){try{let t=await Bi({user:$t,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 Bi(e={},t={}){let{user:n=$t,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=Oe({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||cA).replace(/\/$/,""),d=await x(`${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}:ee(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 Df(e={},t={}){let n=await Bi(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:ue(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return P({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}L();import{TypedDataEncoder as dA,getAddress as Xr,isAddress as pA}from"ethers";var SB=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Mc(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Hf(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}K();var jf={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"},mA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),fA=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Uc={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},zf={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Wf=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"}]}),OB=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function qc(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=jf[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Mi(e,t){let n=String(e||"").trim();if(!pA(n))throw new Error(`cowswap: ${t} must be an address`);return Xr(n).toLowerCase()}function Fc(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 hA(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 gA(e){let t=mA[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:Xr(t)}}function yA(e={},t,n){let r=Mi(e.sellToken,"sellToken"),o=Mi(e.buyToken,"buyToken"),i=Mi(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=hA(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Fc(e.sellAmount,"sellAmount"),buyAmount:Fc(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:Fc(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Vf(e={}){try{let t=await Mn({chainId:1,sellToken:Uc[1],buyToken:zf[1],sellAmountBeforeFee:"1000000000000000",from:$t},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 Mn(e={},t={}){let n=Number(e.chainId??1),r=Nc(e.from||e.owner),o=e.sellToken||Uc[n],i=e.buyToken||zf[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=Uc[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 x(`${qc(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?ee(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Gf(e={},t={}){let n=Number(e.chainId??1),r=Mi(Nc(e.from||e.owner||e.signer),"owner"),o=await Mn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=yA(o?.quote||o,n,r),a=gA(n),s={domain:a,types:Wf,primaryType:"Order",message:i},c=dA.hash(a,Wf,i),l=fA[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return P({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:Xr(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:Xr(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:Xr(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Kf(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return x(`${qc(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Yf(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return x(`${qc(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Xf(){return Object.keys(jf).map(Number)}L();K();var wA="https://api.1inch.dev/swap/v6.0";function Jf(e={}){return Ze({provider:"oneinch",defaultUrl:wA,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Dc(e={}){return Jf(e).baseUrl}function Jr(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Hc(e={}){let t=Jr(e);return He({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Jf(e).trusted)}async function Qf(e={}){if(!Jr(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Wc({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 Wc(e={},t={}){if(!Jr(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 x(`${Dc(t)}/${n}/quote?${a}`,{headers:Hc(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?ee(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function vA(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function jc(e={},t={}){if(!Jr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return x(`${Dc(t)}/${n}/approve/spender`,{headers:Hc(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Zf(e={},t={}){if(!Jr(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=Oe({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 x(`${Dc(t)}/${n}/swap?${c}`,{headers:Hc(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=ee(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),f=null;if(!vA(r)){let m=l?.spender||l?.approvalAddress||(await jc({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 P({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:ue(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var kA=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Qr(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||kA,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 y;try{y=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{y={raw:String(h.data).slice(0,200)}}u.push(y),y.channel&&y.channel!=="subscriptionResponse"?d+=1:y.data&&y.channel==="subscriptionResponse"||y.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 eh(e={}){try{let t=await Qr({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 th(e={}){let t=await Qr({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function nh(e,t={}){if(!e)throw new Error("coin required");let n=await Qr({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var EA=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Fi(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||EA,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",y=>{let w;try{w=JSON.parse(typeof y.data=="string"?y.data:String(y.data))}catch{w={raw:String(y.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]})))}),f.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function rh(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Fi([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 oh(e,t={}){if(!e)throw new Error("assetId required");let n=await Fi([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}L();import{getAddress as OA,Interface as Un,keccak256 as Gc}from"ethers";import{createHash as Kc,createHmac as RA,timingSafeEqual as wh}from"node:crypto";de();import{Interface as sh,getAddress as zc,isAddress as AA}from"ethers";var _A="0x0000000000000000000000000000000000000000",ch=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),PA=new sh(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),CA=new sh(["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 TA(e){let t=Number(e??4663),n=ch[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function ih(e,t){if(/^weth$/i.test(String(e||"")))return zc(ch[t].weth);if(!AA(String(e||"")))throw new Error(`up33: invalid token ${e}`);return zc(e)}function NA(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function ah(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 lh(e,t={},n={}){try{let r=TA(t.chainId),o=ih(t.tokenIn,r.chainId),i=ih(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=NA(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||M,l=await ah(c,r.chainId,r.factory,PA,"getPool",[o,i,s]),u=zc(l[0]);if(u.toLowerCase()===_A)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 ah(c,r.chainId,r.quoter,CA,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 uh(e={},t={}){return lh("exact-input",e,t)}async function dh(e={},t={}){return lh("exact-output",e,t)}K();var D=4663,Ui="https://anvil.clutch.market",LA=`${Ui}/api/markets/snapshot?chainId=${D}`,$A=`${Ui}/api/rpc?chainId=${D}`,BA=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Fe="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Yc="0x0000000000000000000000000000000000000000",cn=1e5,MA=256e3,ph=256,FA=3e4,UA=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"}),Ge=Object.freeze({chainId:D,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ae=new Un(["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"]),qA=new Un(["function allowance(address owner,address spender) view returns (uint256)"]),vh=new Un(["function decimals() view returns (uint8)"]),mh=new Un(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),Ke=new Un(["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)"]),Mt=new Un(["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 F(e,t){try{return OA(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function xt(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 Ue(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 Y(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(D,"eth_call",[{to:F(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function xh(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 fh(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>ph)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${ph}`);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)!==D)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${D}`);return{name:n.name||n.collectionName||null,chainId:D,collection:F(n.collection||n.collectionAddress,"Anvil collection"),market:F(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?F(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 DA(e,t,n=[],r={}){if(Number(e)!==D)throw new Error(`stonkbrokers: Anvil supports chain ${D} only`);if(!BA.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await x($A,{method:"POST",headers:{origin:Ui,referer:`${Ui}/`,"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 nt(e={}){return e.rpcCall||((t,n,r)=>DA(t,n,r,e))}async function qn(e={},t={}){if(e.snapshot){let s=fh(e.snapshot),c={kind:"anvil-markets",chainId:D,total:s.length,contentHash:Kc("sha256").update(Fn(s)).digest("hex")},l=Xc(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 x(LA,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:MA,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=fh(r),i={kind:"anvil-markets",chainId:D,total:o.length,contentHash:Kc("sha256").update(Fn(o)).digest("hex")},a=Xc(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 qi(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 kh({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 qn({},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=UA[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=nt(n),c=qi(await s(D,"eth_blockNumber",[])),l=await s(D,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||qi(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(D,"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=Gc(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+FA}}function Sh(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:D,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 eo(e={},t={}){let n=F(e.market,"Anvil market"),r=F(e.collection,"NFT collection"),o=xt(e.tokenId),i=await kh({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,f]=await Promise.all([Y(a,n,Ae,"quoteSpecificBuy",[BigInt(o)],s),Y(a,n,Ae,"inventory",[BigInt(o)],s),Y(a,r,Ke,"ownerOf",[BigInt(o)],s),Y(a,n,Ae,"collection",[],s),Y(a,n,Ae,"token",[],s),Y(a,n,Ae,"robinhoodSwapFeeWei",[],s)]),m=F(d[0],"Anvil market collection");if(m!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=F(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let y=Number((await Y(a,h,vh,"decimals",[],s))[0]);if(!Number.isSafeInteger(y)||y<0||y>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(f[0]).toString(),v=Sh(i,{paymentToken:h,paymentTokenDecimals:y,nativeSwapFeeWei:w}),g=!!c[4],b=!!l[0],k=F(u[0],"NFT owner")===n,E=g&&b&&k;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:D,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:y,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:w,fees:xh(c[2],c[3]),available:E,evidence:{quoteAvailable:g,inventory:b,ownerIsMarket:k,marketCollection:m,attestation:v},reason:E?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function Di(e={},t={}){let n=F(e.market,"Anvil market"),r=F(e.collection,"NFT collection"),o=await kh({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([Y(i,n,Ae,"quoteSellNFT",[],a),Y(i,n,Ae,"collection",[],a),Y(i,n,Ae,"token",[],a),Y(i,n,Ae,"robinhoodSwapFeeWei",[],a)]),d=F(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=F(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let f=Number((await Y(i,p,vh,"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=Sh(o,{paymentToken:p,paymentTokenDecimals:f,nativeSwapFeeWei:m});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:D,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:xh(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function Eh(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 vt(e,t){let n=Ue(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function Ih({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:D,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:vt(o,"gasLimit").toString(),maxFeePerGas:vt(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=vt(a,"maxPriorityFeePerGasWei").toString()),c}function Ah(e,t){return P({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 _h(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=F(e.buyer,"buyer"),r=F(e.market,"Anvil market"),o=F(e.collection,"NFT collection"),i=xt(e.tokenId),a=vt(e.maxTotalCostRaw,"maxTotalCostRaw"),s=Ue(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 eo({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=vt(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=F(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),y=l.evidence.attestation,w={blockHash:y.blockHash,requireCanonical:!0},v=BigInt((await Y(nt(t),m,qA,"allowance",[n,r],w))[0]);if(v<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let g={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},b=[Ih({...g,to:r,data:Ae.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],k={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},E={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:y,anvilQuote:k,preconditions:{allowanceVerified:!0,allowanceRaw:v.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:Eh(e.tradeId),slippageBps:0,expiresAtMs:p+f,fee:{oracleFeeBps:0},artifact:{chainId:D,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:m,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:y,anvilQuote:k,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:b}};return Ah(E,l)}async function Ph(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=nt(t),r=F(e.seller,"seller"),o=F(e.market,"Anvil market"),i=F(e.collection,"NFT collection"),a=xt(e.tokenId),s=vt(e.minPayoutRaw,"minPayoutRaw"),c=Ue(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 Di({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[f,m,h]=await Promise.all([Y(n,i,Ke,"ownerOf",[BigInt(a)],p).then(N=>F(N[0],"NFT owner")),Y(n,i,Ke,"getApproved",[BigInt(a)],p).then(N=>F(N[0],"NFT approval")),Y(n,i,Ke,"isApprovedForAll",[r,o],p).then(N=>!!N[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 y=BigInt(u.netPayoutRaw),w=vt(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==y)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let v=Number(t.nowMs??Date.now()),g=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),b=F(u.paymentToken,"Anvil payment token"),k=Number(u.paymentTokenDecimals),E={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},I=[Ih({...E,to:o,data:Ae.encodeFunctionData("sellNFT",[BigInt(a),y]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],_={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},O={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:b,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:y.toString(),minPayoutRaw:y.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:_,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:m,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:w.toString()},tradeId:Eh(e.tradeId),slippageBps:0,expiresAtMs:v+g,fee:{oracleFeeBps:0},artifact:{chainId:D,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:b,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:_,exactQuoteNetPayoutRaw:y.toString(),minPayoutRaw:y.toString(),transactions:I}};return Ah(O,u)}async function HA(e={},t={}){if(Array.isArray(e.tokenIds)){let v=e.tokenIds.map(k=>xt(k)),g={kind:"anvil-inventory",chainId:D,market:F(e.market,"Anvil market"),collection:F(e.collection,"NFT collection"),total:v.length,contentHash:Kc("sha256").update(Fn(v)).digest("hex")},b=Xc(e.inventoryCompletenessEvidence,g,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:v,total:v.length,scanned:v.length,complete:b.valid,continuation:b.valid?null:{offset:v.length,evidenceRequired:!0},completenessEvidence:b.evidence,completenessError:b.error}}let n=nt(t),r=F(e.market,"Anvil market"),o=qi(await n(D,"eth_blockNumber",[])),i=await n(D,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||qi(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await Y(n,r,Ae,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>cn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${cn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>cn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${cn}`);let p=u?Math.min(d,l):l,f={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:cn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:f};let m=BigInt((await Y(n,r,Ae,"oldestTokenId",[],s))[0]),h=[],y=new Set;for(;h.length<l&&h.length<p&&!y.has(m.toString());){let v=m.toString();y.add(v),h.push(v),m=BigInt((await Y(n,r,Ae,"getNextTokenId",[m],s))[0])}let w=h.length===l;return{ids:h,total:l,scanned:h.length,complete:w,continuation:w?null:{offset:h.length,tokenId:m.toString()},completenessEvidence:f}}function WA(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 jA(e,t,n){let r=nt(n);try{let o=String((await Y(r,e,Ke,"tokenURI",[BigInt(t)]))[0]),i=WA(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await x(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 Y(r,e,Ke,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function Ch(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 zA(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 Hi(e={},t={}){let n=F(e.market,"Anvil market"),r=F(e.collection,"NFT collection"),o=await HA({...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=nt(t),p=(await Ne(i,s,async h=>{try{let y=await Y(u,r,Ke,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(y[0])+1}}catch(y){return e.includeErrors?{tokenId:h,stars:null,error:String(y.message||y)}:null}})).filter(h=>h&&h.stars>=a),m=(await Ne(p,s,async h=>{try{let y=await eo({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:y.available,quote:y,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(y){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(y.message||y)}:null}})).filter(Boolean).sort((h,y)=>Number(y.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(y.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:D,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 Ne(i,s,async u=>{try{let[d,p]=await Promise.all([jA(r,u,t),eo({market:n,collection:r,tokenId:u},t)]),f=Ch(d,e.traitType||"Stars"),m=Array.isArray(e.traitFilters)?e.traitFilters:[];return(m.length?zA(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:D,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 Th(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function hh(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 Nh(e={}){return{maxMarkets:hh(e,"maxMarkets",cn),maxItemsPerMarket:hh(e,"maxItemsPerMarket",cn)}}function Oh(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Zr(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 Rh(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 Lh(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Nh(e),o=await qn(e,t),i=Oh(o,e,n),a=t.scanCollection||Hi,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ne(i,s,async l=>{let u=Th(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,...Zr(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Zr(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:D,marketCount:i.length,...Rh(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 $h(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Nh(e),o=await qn(e,t),i=o.snapshotCoverage?.complete===!0,a=Oh(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Jc,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ne(a,l,async d=>{let p=Th(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",...Zr(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),y=Zr(d,h);return{...d,decision:i&&y.complete&&h.arbCount>0?"ARB":"WATCH",slug:f,scan:h,...y}}catch(m){return{...d,decision:"WATCH",slug:f,reason:String(m.message||m).slice(0,240),...Zr(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:D,marketCount:a.length,...Rh(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 gh(e,t){return e>t?"ARB":"PASS"}async function VA(e={},t={}){let n=String(e.direction||""),r=Ue(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=F(e.paymentToken,"Anvil payment token"),i={chainId:D,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:nt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||dh)({chainId:D,tokenIn:Fe,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:Fe,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||Ud)({...i,tokenIn:Fe,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Fe,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||uh)({chainId:D,tokenIn:o,tokenOut:Fe,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:Fe,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||Ko)({...i,tokenIn:o,tokenOut:Fe,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Fe,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 yh(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=F(e.quoteToken,"conversion quote token");if(n!==Fe)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=Ue(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=Ue(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function GA(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 Fn(e){return Array.isArray(e)?`[${e.map(Fn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Fn(e[t])}`).join(",")}}`:JSON.stringify(e)}function Bh(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:RA("sha256",n).update(Fn(r)).digest("hex")}}function KA(e,t){return Bh(e,t)}function Xc(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=KA(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!wh(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 YA(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:GA(e,t)}function Vc(e,t,n,r,o,i){let a=YA(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==D)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=Bh(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!wh(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&&F(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=Ue(f,`${r} evidence amountWei`);if(m<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=vt(a.gasLimit,`${r} evidence gasLimit`),y=vt(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*y!==m)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)!==D)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(F(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let g=F(w.sender,`${r} simulation sender`),b=F(w.owner,`${r} simulation owner`);if(!o.owner||g!==o.owner||b!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Ue(w.valueWei,`${r} simulation valueWei`))!==String(Ue(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&&F(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 k=Number(w.quotedAtMs),E=Number(w.expiresAtMs);if(!Number.isFinite(k)||!Number.isFinite(E)||k>n||E<=n||E<=k)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 bh(e){let t=F(e,"OpenSea payment token");if(t!==Yc&&t!==Fe)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Jc(e={},t={}){let n=await Hi(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=F(e.owner,"execution owner")}catch{}let a=(w,v,g,b={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(v?.blockNumber??""),blockHash:String(v?.blockHash||"").toLowerCase(),leg:g,owner:i,...b}),s=(w,v,g,b,k)=>Vc(e.gasEvidence??e.gasCostEvidence,w,r,`${v} gas`,a(g,b,v,k),o),c=(w,v)=>{let g=null;try{g=F(w?.target,"conversion target")}catch{}let b=a(w?.calldataHash,w,"conversion",{target:g,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(b.calldataHash)||!/^0x[0-9a-f]{64}$/.test(b.blockHash)||!/^\d+$/.test(b.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let k=Vc(e.conversionGasEvidence??e.conversionGasCostEvidence,v,r,"conversion gas",b,o);if(k.amount!=null||w?.gasEstimate==null)return k;let E=Vc(e.gasPriceEvidence,v,r,"gas price",{...b,leg:"conversion-gas-price"},o);if(E.amount==null)return{amount:null,evidence:null,error:E.error};let I=Ue(w.gasEstimate,"conversion gasEstimate");return{amount:I*E.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:v,leg:"conversion",gasEstimate:I.toString(),gasPriceEvidence:E.evidence},error:null}},l=(w,v,g,b,k)=>{try{let E=String(v?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(E))throw new Error("exact Seaport order hash is required");let I=F(v?.protocolAddress,"Seaport protocol address"),_=String(v?.executionCalldataHash||"").toLowerCase(),O=/^0x[0-9a-f]{64}$/.test(_)?_:null,N=b==="seaport-fulfillment"&&k===Yc?String(v?.priceWei??""):"0",T={orderHash:E,protocolAddress:I,target:I,valueWei:N},q=s(w,b,O,g,T);if(q.amount==null)throw new Error(q.error);if(q.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let se=q.evidence?.approvalRequired;if(typeof se!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof v?.approvalRequired=="boolean"&&v.approvalRequired!==se)throw new Error("Seaport approval requirement evidence mismatch");let Z=[q];if(se){let H=String(v?.approvalCalldataHash||"").toLowerCase(),U=/^0x[0-9a-f]{64}$/.test(H)?H:null,Q=b==="seaport-offer-acceptance"?n.collection:k;Z.push(s(w,"seaport-approval",U,g,{...T,target:Q,valueWei:"0"}))}if(k===Yc){let H=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",U=String(v?.prerequisiteCalldataHash||"").toLowerCase(),Q=/^0x[0-9a-f]{64}$/.test(U)?U:null,be=H==="wrap-native-to-weth"?String(v?.sellerNetWei??""):"0";Z.push(s(w,H,Q,g,{...T,target:Fe,valueWei:be}))}let R=Z.find(H=>H.amount==null);if(R)throw new Error(R.error);return{amount:Z.reduce((H,U)=>H+U.amount,0n),evidence:Z.map(H=>H.evidence),error:null}}catch(E){return{amount:null,evidence:null,error:String(E.message||E)}}},u=Ue(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Zo,p=t.openSeaBestOffer||ei,f=t.paymentTokenConversion||(w=>VA({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),m=await Di({market:n.market,collection:n.collection},t),h=[];for(let w of n.candidates){let v=null;try{v=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId},t)}catch{}let g=w.quote,b=Gc(Ae.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(g.totalCostRaw)])).toLowerCase(),k=s("anvil-to-opensea","anvil-call",b,g.evidence.attestation,{target:n.market,valueWei:g.nativeSwapFeeWei}),E=null,I=null;if(v)try{E=bh(v.paymentToken)}catch(U){I=String(U.message||U)}let _=I||!v?{amount:null,evidence:null,error:I||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",v,g.evidence.attestation,"seaport-offer-acceptance",E),O={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:g.paymentToken,amountUnits:g.amountUnits,anvilTotalCostRaw:g.totalCostRaw,anvilBaseCostRaw:g.baseCostRaw,anvilFeeRaw:g.fees.totalFeeRaw,paymentTokenDecimals:g.paymentTokenDecimals,nativeSwapFeeWei:g.nativeSwapFeeWei,openSeaGrossOfferWei:v?.grossOfferWei==null?null:String(v.grossOfferWei),openSeaSellingValueWei:v?.sellerNetWei==null?null:String(v.sellerNetWei),openSeaFeeWei:v?.feeWei==null?null:String(v.feeWei),openSeaPaymentToken:E,gasCostWei:k.amount==null?null:k.amount.toString(),gasEvidence:k.evidence,marketplaceGasCostWei:_.amount==null?null:_.amount.toString(),marketplaceGasEvidence:_.evidence,conversionGasCostWei:null};if(v?.sellerNetWei==null||!g.available)h.push({...O,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(I)h.push({...O,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${I}`});else if(k.amount==null)h.push({...O,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${k.error}`});else if(_.amount==null)h.push({...O,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${_.error}`});else if(typeof f!="function")h.push({...O,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let U=yh(await f({chainId:D,direction:"acquire-exact-output",amountRaw:g.totalCostRaw,paymentToken:g.paymentToken,quoteToken:Fe}),{direction:"acquire-exact-output",amountRaw:g.totalCostRaw}),Q=c(U,"anvil-to-opensea");if(Q.amount==null)h.push({...O,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${Q.error}`});else{let be=k.amount+_.amount+Q.amount,ke=BigInt(v.sellerNetWei)-BigInt(U.amountInWei)-BigInt(g.nativeSwapFeeWei)-be;h.push({...O,conversionGasCostWei:Q.amount.toString(),conversionGasEvidence:Q.evidence,totalExecutionGasWei:be.toString(),anvilCostInWethWei:U.amountInWei,conversion:U,netWei:ke.toString(),decision:gh(ke,u),reason:ke>u?"exact inventory, exact conversion, native fee, gas, and exact OpenSea seller net clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(U){h.push({...O,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}let N=null;try{N=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!N)continue;let T=Gc(Ae.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(m.netPayoutRaw)])).toLowerCase(),q=s("opensea-to-anvil","anvil-call",T,m.evidence.attestation,{target:n.market,valueWei:m.nativeSwapFeeWei}),se=null,Z=null;try{se=bh(N.paymentToken)}catch(U){Z=String(U.message||U)}let R=Z?{amount:null,evidence:null,error:Z}:l("opensea-to-anvil",N,m.evidence.attestation,"seaport-fulfillment",se),H={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:m.paymentToken,amountUnits:m.amountUnits,openSeaBuyPriceWei:String(N.priceWei),anvilGrossPayoutRaw:m.grossPayoutRaw,anvilNetPayoutRaw:m.netPayoutRaw,anvilFeeRaw:m.fees.totalFeeRaw,paymentTokenDecimals:m.paymentTokenDecimals,nativeSwapFeeWei:m.nativeSwapFeeWei,openSeaPaymentToken:se,gasCostWei:q.amount==null?null:q.amount.toString(),gasEvidence:q.evidence,marketplaceGasCostWei:R.amount==null?null:R.amount.toString(),marketplaceGasEvidence:R.evidence,conversionGasCostWei:null};if(Z){h.push({...H,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${Z}`});continue}if(q.amount==null){h.push({...H,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${q.error}`});continue}if(R.amount==null){h.push({...H,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${R.error}`});continue}if(typeof f!="function"){h.push({...H,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let U=yh(await f({chainId:D,direction:"liquidate-exact-input",amountRaw:m.netPayoutRaw,paymentToken:m.paymentToken,quoteToken:Fe}),{direction:"liquidate-exact-input",amountRaw:m.netPayoutRaw}),Q=c(U,"opensea-to-anvil");if(Q.amount==null)h.push({...H,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${Q.error}`});else{let be=q.amount+R.amount+Q.amount,ke=BigInt(U.amountOutWei)-BigInt(N.priceWei)-BigInt(m.nativeSwapFeeWei)-be;h.push({...H,conversionGasCostWei:Q.amount.toString(),conversionGasEvidence:Q.evidence,totalExecutionGasWei:be.toString(),anvilPayoutInWethWei:U.amountOutWei,conversion:U,netWei:ke.toString(),decision:gh(ke,u),reason:ke>u?"exact OpenSea listing, exact conversion, native fee, gas, and current Anvil payout clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(U){h.push({...H,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}}let y=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:D,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:y.sort((w,v)=>{let g=BigInt(w.netWei??"-1"),b=BigInt(v.netWei??"-1");return b>g?1:b<g?-1:0}),arbCount:y.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Wi(e={},t={}){let n=nt(t),r=xt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([Y(n,Ge.ammVault,mh,"quoteSpecificBuy",[BigInt(r)]),Y(n,Ge.ammVault,mh,"inventory",[BigInt(r)]),Y(n,Ge.nft,Ke,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:F(a[0],"broker owner")===Ge.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:D,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 Mh(e,t){try{return F((await Y(t,Ge.nft,Ke,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return F((await Y(t,Ge.nft,Ke,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Fh(e={},t={}){let n=nt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ne(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=xt(a.brokerTokenId,"brokerTokenId"),c=xt(a.nestedTokenId,"nestedTokenId"),l=F(a.tba,"TBA"),u=F(a.nestedCollection,"nested collection"),d=Ch({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,f,m]=await Promise.all([Mh(s,n),Y(n,u,Ke,"ownerOf",[BigInt(c)]).then(y=>F(y[0],"nested owner")),Wi({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:D,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function Uh(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=F(e.buyer,"buyer"),r=xt(e.brokerTokenId,"brokerTokenId"),o=Ue(e.maxTokenCostWei,"maxTokenCostWei"),i=Ue(e.maxEthFeeWei,"maxEthFeeWei"),a=await Wi({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 P({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:D,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:Ge.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 to(e={},t={}){let n=nt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?Ge.overtimeBooster:Ge.stockBooster,[i,a,s,c,l,u]=await Promise.all([Y(n,o,Mt,"pendingEth"),Y(n,o,Mt,"minDropWei"),Y(n,o,Mt,"roundActive"),Y(n,o,Mt,"currentRound"),Y(n,o,Mt,"roundState").catch(()=>null),Y(n,o,Mt,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),f=!!s[0],m=!f&&d>=p,h=f;return{provider:"stonkbrokers",chainId:D,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(y=>F(y,"stock token")):[],canStart:m,canContinue:h,action:h?"continueDrop":m?"startDropPublic":"wait",exec:!1,readOnly:!0}}function qh(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?Ge.overtimeBooster:Ge.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Mt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Mt.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return P({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:D,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:D,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function Dh(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>xt(s,"brokerTokenId")):[],r=nt(t),o=await Ne(n,8,async s=>{let[c,l]=await Promise.all([Y(r,Ge.nft,Ke,"ownerOf",[BigInt(s)]).then(u=>F(u[0],"broker owner")),Mh(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([to({which:"stock"},t),to({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:D,owner:e.owner?F(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Hh(e={},t={}){try{let n=await qn(e,t);return{ok:!0,chainId:D,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:D,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Wh(e={},t={}){try{let n=await to({which:"stock"},t);return{ok:!0,chainId:D,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:D,error:String(n.message||n).slice(0,180)}}}K();import{createHash as JA}from"node:crypto";var ji="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",QA=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"}]),ln=Object.freeze(Object.fromEntries(QA.map(e=>[e.name,e.selector]))),ZA=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),e1=new Set(["name","endpoint","version","skills","domains"]),t1=new Set(["agentId","agentRegistry"]),jh=new Set(["reputation","crypto-economic","tee-attestation"]),n1=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,r1=64*1024;function no(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 Qc(e,t,n){for(let r of Object.keys(e)){if(n1.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 Dn(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 zh(e,t,{service:n=!1}={}){let r=Dn(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 Zc(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 zi(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function el(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 tl(e){let t=zi(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Zc(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Gh(){let e=[];try{let t=zi(process.env.ORACLE_ERC8004_CHAIN_ID);tl(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 o1(e){return JSON.parse(JSON.stringify(e))}function Vi(e){let t=no(e,"registration file");if(Qc(t,ZA,"registration"),t.type!==ji)throw new Error("erc8004: registration-v1 type required");let n={type:ji,name:Dn(t.name,"name",128),description:Dn(t.description,"description",4096),image:zh(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=no(a,`services[${s}]`);Qc(c,e1,`services[${s}]`);let l=Dn(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:zh(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=Dn(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=no(a,`registrations[${s}]`);Qc(c,t1,`registrations[${s}]`);let l=el(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>jh.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!jh.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>r1)throw new Error("erc8004: registration metadata oversized");return o1(n)}function i1(e){if(no(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==ji)throw new Error("erc8004: registration-v1 type required");return Vi({type:ji,...e})}function a1(e){let t=Vi(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 Kh(e){let t=Buffer.from(e,"utf8").toString("hex");return`${ro(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function s1(e){return`${ln.register}${ro(32)}${Kh(e)}`}function c1(e,t){return`${ln.setAgentURI}${ro(e)}${ro(64)}${Kh(t)}`}function l1(e,t){return`${e}${ro(t)}`}function u1(e){return JA("sha256").update(e,"utf8").digest("hex")}function nl(e,t){no(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 Yh(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=zi(e.chainId),c=Zc(e.owner,"owner"),l=tl(s),u=Number(t?.nowMs??Date.now());return P({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:u1(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 Xh(e={},t={}){nl(e,new Set(["chainId","owner","registration"]));let n=a1(i1(e.registration));return Yh(e,t,{kind:"erc8004-register",uri:n,selector:ln.register,data:s1(n)})}function Jh(e={},t={}){nl(e,new Set(["chainId","owner","agentId","agentURI"]));let n=el(e.agentId),r=Qh(e.agentURI);return Yh(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:ln.setAgentURI,data:c1(n,r),id:n})}function Qh(e){let t=Dn(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 Vi(o),t}function Vh(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 Zc(`0x${e.slice(-40)}`,t)}function d1(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 Zh(e={},t={}){nl(e,new Set(["chainId","agentId"]));let n=zi(e.chainId),r=el(e.agentId),o=tl(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:l1(d,r)},"latest"]),[a,s,c]=await Promise.all([i(ln.ownerOf),i(ln.tokenURI),i(ln.getAgentWallet)]),l=Qh(d1(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Vi(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Vh(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Vh(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}de();var e0=999;async function t0(e={}){let t={chainId:e0,rpc:null,dex:null};try{t.rpc=await Sn(e0,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await xr("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 n0(e="HYPE",t={}){let r=(await xr(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 r0(e,t={}){return Jt(e,t)}L();K();var f1="https://api-mainnet.magiceden.dev/v2",oo=1e9;function o0(e={}){return Ze({provider:"magiceden",defaultUrl:f1,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Wn(e={}){return o0(e).baseUrl}function un(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function jn(e={}){let t=un(e);return He({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},o0(e).trusted)}function rl(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 Hn(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 h1(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 g1(e){return Math.round(Hn(e,"priceSol")*oo)}function y1(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 b1({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function w1(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=b1(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function i0(e={}){try{let t=await ol({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!un(e),readTier:"keyless",prepareTier:un(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!un(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function ol(e={},t={}){let n=rl(e.symbol||e.collection),r=await x(`${Wn(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:jn(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/oo:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/oo:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/oo:null,exec:!1,raw:r}}function a0(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*oo):null,tokenSize:e.tokenSize??1}}async function s0(e={},t={}){let n=rl(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(`${Wn(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 x(i.toString(),{headers:jn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(a0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function c0(e={},t={}){let n=ce(e.tokenMint||e.mint,"tokenMint"),r=await x(`${Wn(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:jn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(a0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function l0(e={},t={}){if(!un(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=ce(e.buyer||e.userPublicKey,"buyer"),r=ce(e.seller,"seller"),o=ce(e.tokenMint,"tokenMint"),i=ce(e.tokenATA||e.tokenAddress,"tokenATA"),a=ce(e.auctionHouse,"auctionHouse"),s=Hn(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:Hn(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Wn(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 x(l.toString(),{headers:jn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});wt("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 P({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:g1(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Gi(e={},t={}){if(!un(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=ce(e.seller||e.userPublicKey,"seller"),r=ce(e.tokenMint,"tokenMint"),o=ce(e.tokenATA||e.tokenAddress,"tokenATA"),i=ce(e.auctionHouse,"auctionHouse"),a=Hn(e.priceSol??e.price,"priceSol"),s=y1(e.expiry),c=w1(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${Wn(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",ce(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await x(l.toString(),{headers:jn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});wt("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 P({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 u0(e={},t={}){if(!un(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=ce(e.buyer||e.userPublicKey,"buyer"),r=rl(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=Hn(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:Hn(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${Wn(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await x(a.toString(),{headers:jn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=h1(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`);wt("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 P({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})}K();Xs();L();et();var zn=8,il=10n**BigInt(zn),x1="0xa4b1",d0=7,al=1,k1=2n**64n-1n;function S1(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 ao(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Gn(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 io(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>zn)throw new Error(`hl-staking: ${t} has more than ${zn} decimals`);let i=BigInt(r)*il+BigInt((o+"0".repeat(zn)).slice(0,zn)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>k1)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Vn(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function kt(e){let t=BigInt(String(e||"0")),n=t/il,r=(t%il).toString().padStart(zn,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function p0(e={}){try{let t=await sl(e);return{ok:t.count>0,provider:"hl-staking",chain:ao(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 sl(e={}){let t=await oe({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 cl(e={},t={}){let n=Gn(e.user||e.address,"user"),r=await oe({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 ll(e={},t={}){let n=Gn(e.user||e.address,"user"),r=await oe({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 m0(e={},t={}){let n=Gn(e.user||e.address,"user"),r=await oe({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function f0(e={},t={}){let n=Gn(e.user||e.address,"user"),r=await oe({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function ul(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 Ki(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||x1)}function E1(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ki(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function dl({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:ao(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:S1(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:E1(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=gi(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,P(l,{provider:"hl-staking",kind:e})}function h0(e={},t={}){let n=io(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:io(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${kt(n)} HYPE exceeds maxHype cap ${kt(r)} HYPE`);let o=ul(e),i=ao(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ki(t),wei:Vn(n),nonce:o};return dl({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:Vn(n),nonce:o},opts:t,args:e,caps:{amountHype:kt(n),maxHype:r?kt(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 g0(e={},t={}){let n=io(e.amountHype??e.amount,"amountHype"),r=ul(e),o=ao(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ki(t),wei:Vn(n),nonce:r};return dl({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:Vn(n),nonce:r},opts:t,args:e,caps:{amountHype:kt(n)},notes:[`Starts the ${d0} 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 y0(e={},t={}){let n=Gn(e.validator,"validator"),r=io(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:io(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${kt(r)} HYPE exceeds maxHype cap ${kt(s)} HYPE`);let c=ul(e),l=ao(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ki(t),validator:n,wei:Vn(r),isUndelegate:a,nonce:c};return dl({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:Vn(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:kt(r),maxHype:s?kt(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${al} 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 ${al} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function b0(e={},t={}){let n=Gn(e.user||e.address,"user"),r=await cl({user:n},t),o=await ll({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:d0,validatorLockupDays:al,exec:!1}}et();async function pl(e={}){let t=Date.now();try{let n=await ht(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 A1=24*365,_1=8;function _e(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function P1(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Yi(e={},t={}){let[n,r]=await Promise.all([je(t),ht(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=_e(u.markPx),p=_e(u.prevDayPx),f=_e(u.openInterest),m=_e(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:_e(u.oraclePx),midPx:_e(u.midPx)??_e(r?.[c.name]),prevDayPx:p,change24hPct:P1(d,p),dayNtlVolumeUsd:_e(u.dayNtlVlm),premium:_e(u.premium),fundingRate:m,fundingRateAprPct:m==null?null:m*(A1/_1)*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 w0(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Yi(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 v0(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([Yi({},t),ci({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),_n(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:_e(h.o),high:_e(h.h),low:_e(h.l),close:_e(h.c),volume:_e(h.v)})),p=l?.levels??[],f=_e(p?.[0]?.[0]?.px),m=_e(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 x0(e={},t={}){let n=await li(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 G1,readFileSync as K1,readdirSync as Y1,renameSync as X1,writeFileSync as J1}from"node:fs";import{homedir as Q1}from"node:os";import{join as Zi}from"node:path";var so=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});L();de();K();import{Interface as ml,getAddress as P0,isAddress as T1}from"ethers";var k0=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),S0=Object.freeze({42161:{name:"arbitrum",api:k0[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:k0[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),E0="0x0000000000000000000000000000000000000000",N1=`0x${"0".repeat(64)}`,I0=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),A0=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Xi=new ml(["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"]),C0=new ml(["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)"]),O1=new ml(["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)"]),R1=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Yn(e){let t=Number(e??42161),n=S0[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(S0).join(", ")})`);return{chainId:t,...n}}function Ji(e,t={}){let n=Yn(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function Ye(e,t){if(!T1(e))throw new Error(`${t} must be a valid EVM address`);return P0(e)}function J(e){return P0(e).toLowerCase()}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 dn(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 L1(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 $1(e){let t=String(e||"marketIncrease").trim();if(!(t in I0))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:I0[t]}}function B1(e){let t=String(e||"noSwap").trim();if(!(t in A0))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:A0[t]}}function M1(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function F1(e,t){let n=J(t);return e.find(r=>J(r.marketToken||r.market||r.address)===n)||null}function U1(e,t){let n=J(t);return e.find(r=>J(r.tokenAddress||r.address)===n)||null}function q1({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Kn(e?.minPrice,"gmx minPrice"),i=Kn(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 D1(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function H1(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function ut(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 W1(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:ut(t,"account",a=>J(a)),market:ut(t,"market",a=>J(a)),initialCollateralToken:ut(t,"initialCollateralToken",a=>J(a)),key:ut(o,"key",a=>String(a).toLowerCase()),reason:ut(i,"reason",a=>String(a)),sizeDeltaUsd:ut(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:ut(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:ut(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:ut(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:ut(r,"isLong",a=>!!a)}}function j1(e={},t){if(J(e.address)!==J(t.eventEmitter))return null;let n;try{n=O1.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=R1[r];if(!o)return null;let i=W1(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||H1(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?J(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 _0(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function z1(e=[],{chainId:t}={}){let n=Yn(t);return(Array.isArray(e)?e:[]).map(r=>j1(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function T0(e={},t={}){return x(`${Ji(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fl(e={},t={}){return x(`${Ji(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function N0(e={},t={}){return x(`${Ji(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Xn(e={},t={}){return x(`${Ji(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function O0(e={}){let t=await Xn({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function R0(e={},t={}){let n=Yn(e.chainId??42161),r=Ye(e.account||e.owner||e.user,"gmx account"),o=dn(e.start??0,"gmx start"),i=dn(e.end??e.limit??20,"gmx end"),a=C0.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||M)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:J(n.reader),dataStore:J(n.dataStore),account:J(r),raw:c}}async function L0(e={},t={}){let n=Yn(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=C0.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||M)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:J(n.reader),dataStore:J(n.dataStore),key:r,raw:a}}async function $0(e={},t={}){let n=Yn(e.chainId??42161),r=t.receipt||await vr({chainId:n.chainId,txHash:e.txHash,expectedTo:e.expectedTo||n.exchangeRouter},t),o=String(e.txHash||r.txHash||"").toLowerCase();if(r.ok!==!0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:r.status||"unknown",reason:r.reason||"receipt not successful",receipt:r};let i=z1(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)=>_0(d.status)>=_0(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?J(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:J(n.eventEmitter),events:s,receipt:r}}async function B0(e={},t={}){let n=Yn(e.chainId??42161),r=$1(e.orderType||e.type),o=B1(e.decreasePositionSwapType),i=Ye(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=Ye(e.receiver||i,"gmx receiver"),s=Ye(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?Ye(e.callbackContract,"gmx callbackContract"):E0,l=e.uiFeeReceiver?Ye(e.uiFeeReceiver,"gmx uiFeeReceiver"):E0,u=Ye(e.market||e.marketToken,"gmx market"),d=Ye(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Kn(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):dn(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),f=Kn(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),m=Kn(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(m>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let y=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(f>y)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let w=L1(e.maxSlippageBps??e.slippageBps,50),v=e.isLong==null?!0:!!e.isLong,[g,b]=await Promise.all([fl({chainId:n.chainId},t),Xn({chainId:n.chainId},t)]),k=F1(M1(g,"markets"),u);if(!k)throw new Error("gmx market not found in public registry");if(k.isListed===!1)throw new Error("gmx market is not listed");let E=Ye(k.indexToken,"gmx market indexToken"),I=Ye(k.longToken,"gmx market longToken"),_=Ye(k.shortToken,"gmx market shortToken"),O=J(d);if(![J(I),J(_)].includes(O))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let N=D1(k,v);if(N>0n&&f>N)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=U1(b,E);if(!T)throw new Error("gmx index ticker not found");let q=e.acceptablePrice?Kn(e.acceptablePrice,"gmx acceptablePrice").toString():q1({ticker:T,isLong:v,typeKey:r.key,maxSlippageBps:w}),se=(e.swapPath||[]).map(le=>Ye(le,"gmx swapPath market"));if(se.length>3)throw new Error("gmx swapPath too long for guarded slice");let Z=dn(e.triggerPrice??"0","gmx triggerPrice"),R=dn(e.callbackGasLimit??"0","gmx callbackGasLimit"),H=dn(e.minOutputAmount??"0","gmx minOutputAmount"),U=dn(e.validFromTime??"0","gmx validFromTime"),Q=!!e.shouldUnwrapNativeToken,be=e.autoCancel==null?!0:!!e.autoCancel,ke=String(e.referralCode||N1);if(!/^0x[0-9a-fA-F]{64}$/.test(ke))throw new Error("gmx referralCode must be bytes32 hex");let mt=Array.isArray(e.dataList)?e.dataList:[];for(let le of mt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(le)))throw new Error("gmx dataList entries must be bytes32 hex");let It={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:se},numbers:{sizeDeltaUsd:f,initialCollateralDeltaAmount:p,triggerPrice:Z,acceptablePrice:BigInt(q),executionFee:m,callbackGasLimit:R,minOutputAmount:H,validFromTime:U},orderType:r.code,decreasePositionSwapType:o.code,isLong:v,shouldUnwrapNativeToken:Q,autoCancel:be,referralCode:ke,dataList:mt},C=[];r.key==="marketIncrease"&&p>0n&&C.push(Xi.encodeFunctionData("sendTokens",[d,n.orderVault,p])),C.push(Xi.encodeFunctionData("sendWnt",[n.orderVault,m])),C.push(Xi.encodeFunctionData("createOrder",[It]));let B=Xi.encodeFunctionData("multicall",[C]),V={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:J(i),receiver:J(a),exchangeRouter:J(n.exchangeRouter),router:J(n.router),orderVault:J(n.orderVault),market:J(u),indexToken:J(E),initialCollateralToken:J(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:f.toString(),executionFee:m.toString(),acceptablePrice:q,maxSlippageBps:w,isLong:v,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return P({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:J(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:J(d),spender:J(n.router),amount:p.toString()}:null,gmxGuard:V,transaction:{chainId:n.chainId,from:J(i),to:J(n.exchangeRouter),data:B,value:m.toString(),gmxGuard:V}},{provider:"gmx",kind:"gmx-order"})}et();var Ft="oracle.hl.entry-state.v1",Z1=8,e_=24*365;function ie(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Jn(e){return e==null||e===0?0:e>0?1:-1}function co(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function t_(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Zi(Q1(),".config","oracle")}function U0(e={}){return Zi(t_(e),"hl-entry-states")}function Qi(e,t,n){return n==null&&e.push(t),n}function n_(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 St(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function r_(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:ie(a.time),rate:ie(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return St("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)Jn(o[a].rate)!==Jn(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 o_(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return St("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=ie(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}:St("defillama.stablecoins","no peggedUSD")}function M0(e,t){let n=ie(e);if(n==null)return null;if(t!=null&&t>0){for(let r of[1,1e12,1e22,1e30]){let o=n/r;if(o>t*.5&&o<t*1.5)return o}return null}return n>1e20?n/1e22:n>1e12?n/1e30:n}function i_(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),a=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],s=o.find(p=>a.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!s)return St("gmx.tickers","no matching symbol");let c=M0(s.minPrice,n),l=M0(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return St("gmx.tickers","unreadable price");let d=n!=null&&n>0?co(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?St("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 a_({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?St("hl-info.fundingHistory","not fetched"):r_(r,{coin:e,asOfMs:n}),llamaStables:o==null?St("defillama.stablecoins","not fetched"):o_(o,n),gmxTicker:i==null?St("gmx.tickers","not fetched"):i_(i,{coin:e,hlMark:t,asOfMs:n})}}function F0(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=ie(s?.px),l=ie(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 s_(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=ie(i.szi),s=ie(i.positionValue)!=null&&a?Math.abs(ie(i.positionValue)/a):null,c=ie(i.entryPx),l=ie(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:ie(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:f}}function c_({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:Ft,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=n_(n,e);if(!d)return{schema:Ft,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:f}=d,m=Qi(u,"markPx",ie(f.markPx)),h=Qi(u,"oraclePx",ie(f.oraclePx)),y=ie(f.midPx),w=ie(f.premium),v=Qi(u,"fundingRate",ie(f.funding)),g=Qi(u,"openInterestCoin",ie(f.openInterest)),b=ie(f.dayNtlVlm),k=Array.isArray(f.impactPxs)?f.impactPxs:[],E=ie(k[0]),I=ie(k[1]),_=v==null?null:v*(e_/Z1)*100,O=g==null||m==null?null:g*m,N=i==null||i===0||g==null?null:(g-i)/i*100;N==null&&u.push("oiDeltaPct");let T=r?.levels,q=Array.isArray(T)?T[0]:[],se=Array.isArray(T)?T[1]:[],Z=ie(q?.[0]?.px),R=ie(se?.[0]?.px);Z==null&&u.push("book.bidPx"),R==null&&u.push("book.askPx");let H=F0(se,Number(t)||0,"buy"),U=F0(q,Number(t)||0,"sell");H.fillable||u.push("book.buyFillable"),U.fillable||u.push("book.sellFillable");let Q=y??m,be=H.avgFillPx==null||Q==null?null:co(H.avgFillPx,Q),ke=U.avgFillPx==null||Q==null?null:co(Q,U.avgFillPx),mt=s_(o,e);for(let V of mt.unknown||[])u.push(V);let It=ie(f.prevDayPx),C=m==null||It==null||It===0?null:(m-It)/It*100;C==null&&u.push("change24hPct");let B=a_({coin:String(p.name),hlMark:m,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return B.fundingPath.unknown&&u.push("overlays.fundingPath"),B.llamaStables.unknown&&u.push("overlays.llamaStables"),B.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Ft,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:m,oraclePx:h,midPx:y,premium:w,markOracleBps:co(m,h),fundingRate:v,fundingAprPct:_,openInterestCoin:g,openInterestUsd:O,oiDeltaPct:N,dayNtlVolumeUsd:b,change24hPct:C,impactBidPx:E,impactAskPx:I,maxLeverage:p.maxLeverage??null,book:{bidPx:Z,askPx:R,spreadBps:Z==null||R==null?null:co(R,Z),notionalUsd:Number(t)||0,buy:H,sell:U,buySlipBps:be,sellSlipBps:ke},position:mt,overlays:B,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function q0(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 l_(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 u_({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Ft||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=l_(n),a=q0(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Ft,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:so.ALERT_ONLY},c=U0({...o,configDir:r||o.configDir});G1(c,{recursive:!0,mode:448});let l=Zi(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return J1(u,`${JSON.stringify(s,null,2)}
|
|
144
|
+
`,{mode:384}),X1(u,l),s}function hl(e={}){let t=U0(e),n=[];try{n=Y1(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(K1(Zi(t,r),"utf8")))}function d_(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:so.ALERT_ONLY};let r=e.see,o=t;Jn(r.fundingRate)!==Jn(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),Jn(r.premium)!==Jn(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:Ft,id:e.id,coin:e.see.coin,side:e.side,actionMode:so.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function D0(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await je(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 lo(e={},t={}){let n=e.coin,r=ie(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([je(t),n?_n(n,t).catch(()=>null):Promise.resolve(null),e.user?Pn(e.user,t).catch(()=>null):Promise.resolve(null),n?Tp({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Ri({},t).catch(()=>null),Xn({chainId:42161},t).catch(()=>null)]);return c_({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:ie(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function H0(e={},t={}){let n=e.see&&e.see.schema===Ft?e.see:await lo(e,t);return{see:n,...q0(n,e.side)}}async function W0(e={},t={}){let n=e.see&&e.see.schema===Ft?e.see:await lo(e,t);return u_({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function j0(e={},t={}){let n=e.locked||hl(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:so.ALERT_ONLY};let r=await lo({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return d_(n,r)}et();hi();xi();async function z0(e={}){let t=await Or(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function V0(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ct(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=K0(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=gl(i)));let a=n==null?null:Tt(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 Or(t))?.outcomes||[]).find(m=>{try{return Ct(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=gl(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=Ct(r,i).coin}if(a=Tt(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,On(c,t)}async function G0(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ct(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=K0(e.outcomeSide):(o=e.side,o!=null&&(o=gl(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Ct(r,o).coin}let i=Tt(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,Dr(a,t)}function K0(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function gl(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")}K();Cn();var IM="0x"+"00".repeat(32);function f_(e){let t=typeof e=="bigint"?e:Ve(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 Y0(e,t){let n=Ve(e.makerAmount,"poly: makerAmount"),r=Ve(e.takerAmount,"poly: takerAmount");return f_(t==="BUY"?n:r)}Cn();var h_=new Set(["https://clob.polymarket.com/order"]),uo=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),CM=Object.freeze(uo.map(e=>e[0])),g_=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),y_="0xe111180000d2663c0091e4f400237545b87b996b",b_="0xe2222d279d744050d28e00520010520000310f59",X0=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function J0(e){let t=String(e||"").replace(/\/$/,"");if(!h_.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Q0(e){let t=ze(e,"poly: exchange").toLowerCase();if(!g_.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Z0(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=X0(n.kind,"kind",48);if(r!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(ze(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(J0(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(Q0(o.verifyingContract),Q0(n.exchange),ze(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==ze(n.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof n.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=n.negRisk?b_:y_;if(ze(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==uo.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let I=0;I<uo.length;I+=1)if(s[I]?.name!==uo[I][0]||s[I]?.type!==uo[I][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(ze(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(ze(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=X0(n.tokenId,"tokenId",80);if(ze(a.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=Ve(a.makerAmount,"poly: makerAmount"),f=Ve(a.takerAmount,"poly: takerAmount"),m=Ve(n.makerAmount,"poly: prepared makerAmount"),h=Ve(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 y=d==="BUY"?p:f,w=d==="BUY"?f:p,v=ye(n.quantity,6,"poly: quantity");if(v<=0n||v!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let g=ye(n.price,6,"poly: price");if(g<=0n||g>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*g!==y*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(ye(n.notionalUsdc,6,"poly: notionalUsdc")!==y)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let k=Y0(a,d);if(ye(k,6,"poly: displayed notionalUsdc")!==y)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let E=t.maxNotionalUsd??t.maxNotionalUsdc;if(E!=null){let I=ye(E,6,"poly: maxNotionalUsd");if(y>I)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:y.toString(),notional:y.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:f.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:k,submitTo:J0(n.submitTo)})}function w_(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 eg(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:w_({...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 Z0(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as BM,randomInt as v_}from"node:crypto";import{keccak256 as FM,concat as UM,zeroPadValue as qM,getCreate2Address as DM,AbiCoder as HM}from"ethers";var ig=137;var x_="0xE111180000d2663C0091e4f400237545B87B996B",k_="0xe2222d279d744050d28e00520010520000310F59",tg="0x0000000000000000000000000000000000000000000000000000000000000000",yl=6;var S_={name:"Polymarket CTF Exchange",version:"2",chainId:ig},E_={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"}]},ng={"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 ea(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function ta(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function rg(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function ag(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function I_(e,t,n,r){let o=ag(Number(n),r.price);if(e==="BUY"){let c=ta(Number(t),r.size),l=c*o;return ea(l)>r.amount&&(l=rg(l,r.amount+4),ea(l)>r.amount&&(l=ta(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=ta(Number(t),r.size),s=a*o;return ea(s)>r.amount&&(s=rg(s,r.amount+4),ea(s)>r.amount&&(s=ta(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function og(e){let t=Number(e).toFixed(yl),[n,r=""]=t.split(".");return(n+r.padEnd(yl,"0").slice(0,yl)).replace(/^0+/,"")||"0"}function A_(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=tg,builder:p=tg}=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=ng[String(c)]||ng["0.01"],y=ag(f,h.price),{rawMakerAmt:w,rawTakerAmt:v}=I_(n,m,y,h),g=og(w),b=og(v),k=String(v_(1,2**31-1)),E=Date.now().toString(),I=n==="BUY"?0:1,_=s?k_:x_,O={salt:k,maker:i,signer:a,tokenId:String(t),makerAmount:g,takerAmount:b,side:I,signatureType:u,timestamp:E,metadata:d,builder:p},N={...S_,verifyingContract:_},T=n==="BUY"?w:v;return{domain:N,types:E_,value:O,orderType:l,side:n,price:String(y),quantity:String(n==="BUY"?v:w),notionalUsdc:T,exchange:_,negRisk:s}}function sg(){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 cg(e={},t={}){let n=A_(e),r={provider:"poly-clob",kind:"poly-order",chainId:ig,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=eg(r,e,t)}catch{r.oraclePrepared=!1}return P(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as K_,keccak256 as vg}from"ethers";import{wordlists as P_}from"ethers";var C_=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),T_=[/\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=>P_.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=lg(e);return $_.has(t)||L_.test(t)}var po=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function lg(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function M_(e){let t=lg(e);return[...C_].some(n=>t.includes(n))}function F_(e,t,n){if(typeof t=="string"){if(T_.some(r=>r.test(t))||O_(t))throw new po(n);if(R_.test(t)&&!B_(e))throw new po(n)}}function bl(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)=>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(M_(o))throw new po(i);e[o]!==void 0&&(r[o]=bl(e[o],i,o))}return r}function ug(e){return bl(e)}K();ca();oa();var Y_=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function X_(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=ug(e);for(let o of Object.keys(n))if(!Y_.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 xg(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=fg(n,o),a=wg(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 K_(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}:{...X_(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},f={chainId:r,to:null,data:u,value:"0x0"};return P({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:vg(s),authorityReport:hg(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:vg(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:aa},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"})}ca();Al();xi();L();var cP="https://api.geckoterminal.com/api/v2",da=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||cP).replace(/\/$/,""),Zn=e=>encodeURIComponent(String(e));async function _l(e={},t={}){let n=Math.max(1,Number(e.page||1));return x(`${da(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cg(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return x(`${da(t)}/networks/${Zn(e.network)}/pools/${Zn(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Tg(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return x(`${da(t)}/networks/${Zn(e.network)}/tokens/${Zn(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ng(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)),x(`${da(t)}/networks/${Zn(e.network)}/pools/${Zn(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Og(e={}){let t=await _l({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}L();de();import{Interface as Bg,getAddress as Mg,isAddress as uP}from"ethers";K();var dP="https://api.curve.finance/v1",Fg=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||dP).replace(/\/$/,""),pP=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),Ug="0x0000000000000000000000000000000000000000",Pl=new Bg(["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)"]),Rg=new Bg(["function coins(uint256) view returns (address)"]);function qg(e){let t=pP[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function vo(e,t){if(!uP(e))throw new Error(`${t} must be a valid EVM address`);return Mg(e)}function mP(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 Lg(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 Dg(e,t,n){return[e,t,n,...Array(8).fill(Ug)]}function Hg(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Wg(e){return[e,...Array(4).fill(Ug)]}async function fP({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=Rg.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=Rg.decodeFunctionResult("coins",c);i.push(Mg(l[0]))}return i}function $g(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 jg(e={}){return x(`${Fg(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Cl(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 x(`${Fg(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function zg(e={}){let t=await Cl({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Tl(e={},t={}){let n=Number(e.chainId??8453),r=qg(n),o=vo(e.pool,"curve pool"),i=vo(e.tokenIn,"curve tokenIn"),a=vo(e.tokenOut,"curve tokenOut"),s=mP(e.amountIn,"curve amountIn"),c=Lg(e.nCoins??2,"curve nCoins",2,8),l=Lg(e.poolType,"curve poolType",1,4),u=t.rpcCall||M,d=await fP({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=$g(d,i,"tokenIn"),f=$g(d,a,"tokenOut");if(p===f)throw new Error("Curve token indexes must differ");let m=Dg(i,o,a),h=Hg(p,f,l,c),y=Wg(o),w=Pl.encodeFunctionData("get_dy",[m,h,s,y]),v=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),g=Pl.decodeFunctionResult("get_dy",v),b=BigInt(g[0]);if(b<=0n)throw new Error("curve quote returned zero output");return ee({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:b.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:f,route:m,swapParams:h.map(k=>k.map(E=>E.toString())),pools:y},{chainId:n,venue:r,amountOut:b.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Vg(e={},t={}){let n=Number(e.chainId??8453),r=qg(n),o=vo(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=vo(e.receiver||e.recipient||o,"curve receiver"),a=await Tl({...e,sender:o},t),s=Dg(a.tokenIn,a.pool,a.tokenOut),c=Hg(a.i,a.j,a.poolType,a.nCoins),l=Wg(a.pool),u=Pl.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return P({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:ue(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}L();de();K();import{Interface as gP,getAddress as yP,isAddress as bP,keccak256 as Gg,toUtf8Bytes as Kg}from"ethers";var wP="https://api.morpho.org/graphql",pa=new gP(["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)"]),vP=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||wP;async function Ol(e,t,n={}){return x(vP(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var xP="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 } } } }",kP="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(!bP(n))throw new Error(`morpho: ${t} must be an address`);return yP(n).toLowerCase()}function SP(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 Nl(e){return Array.isArray(e)?`[${e.map(Nl).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Nl(e[t])}`).join(",")}}`:JSON.stringify(e)}async function ko(e,t,n,r,o={}){let i=pa.encodeFunctionData(n,r),s=await(o.rpcCall||M)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return pa.decodeFunctionResult(n,s)}function EP(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Yg(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ol(xP,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Rl(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ol(kP,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Xg(e={}){return{ok:(await Ol("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Jg(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=SP(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Rl({chainId:n,first:100},t),u=EP(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 ko(n,o,"asset",[],t),f=xo(p,"vault asset");if((u?.asset?.address?xo(u.asset.address,"api vault asset"):f)!==f)throw new Error("morpho: API asset and on-chain asset mismatch");let h,y;if(r==="deposit"){let[v]=await ko(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(v.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[g]=await ko(n,o,"previewDeposit",[s],t);if(BigInt(g.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");y={minSharesOut:g.toString()},h=pa.encodeFunctionData("deposit",[s,a])}else{let[v]=await ko(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(v.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[g]=await ko(n,o,"previewWithdraw",[s],t);if(BigInt(g.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");y={maxSharesIn:g.toString()},h=pa.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:f,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...y,calldataHash:Gg(Kg(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=Gg(Kg(Nl(w))),P({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:w,requiresApproval:r==="deposit"?{token:f,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}L();de();import{Interface as AP,getAddress as Ll,isAddress as _P}from"ethers";K();var PP="https://api-v3.balancer.fi/",CP=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||PP;async function ey(e,t,n={}){return x(CP(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var TP="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Qg=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"}}),NP="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",OP="0x0000000000000000000000000000000000000000",$l=new AP(["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 ty(e){let t=Number(e??8453),n=Qg[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Qg).join(", ")})`);return{chainId:t,...n}}function ny(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===OP||t===NP.toLowerCase()}function ma(e,t){if(!_P(e))throw new Error(`${t} must be a valid EVM address`);return Ll(e)}function Zg(e,t,n){let r=String(e||"");return ny(r)||/^weth$/i.test(r)?Ll(t.weth):/^usdc$/i.test(r)?Ll(t.usdc):ma(r,n)}function RP(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 ry(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 oy(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 ey(TP,{first:n,chains:r,where:{chainIn:r}},t)}async function iy(e={}){return{ok:(await ey("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Bl(e={},t={}){let n=ty(e.chainId),r=ma(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Zg(o,n,"balancer tokenIn"),a=Zg(e.tokenOut||"USDC",n,"balancer tokenOut"),s=RP(e.amountIn,"balancer amountIn"),c=ma(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=$l.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,ry(e.userData)]),d=await(t.rpcCall||M)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=$l.decodeFunctionResult("querySwapSingleTokenExactIn",d),f=BigInt(p[0]);if(f<=0n)throw new Error("balancer quote returned zero output");return ee({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 ay(e={},t={}){let n=ty(e.chainId),r=ma(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=ny(o),a=await Bl({...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=$l.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,ry(e.userData)]);return P({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:ue(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}L();import{getAddress as $P}from"ethers";K();var BP="https://api-v2.pendle.finance/core",MP=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),FP="0x0000000000000000000000000000000000000000",UP="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",sy=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||BP).replace(/\/$/,"");function fa(e,t){try{return $P(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function er(e,t){return fa(e,t).toLowerCase()}function qP(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===UP||t===FP}function Ml(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 DP(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:fa(t.token,`pendle input ${n} token`),amount:Ml(t.amount,`pendle input ${n} amount`)}))}function HP(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>fa(t,`pendle output ${n} token`))}function WP(e){let t=MP[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function jP(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 Ml(t,"pendle output amount")}function zP(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!qP(r.token)).map(r=>({token:er(r.token,"pendle approval token"),spender:er(t,"pendle approval spender"),amount:Ml(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Fl(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)),x(`${sy(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function cy(e={}){let t=await Fl({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Ul(e={},t={}){let n=Number(e.chainId??42161),r=WP(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=fa(e.receiver||o,"pendle receiver"),a=DP(e.inputs),s=HP(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=Oe({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 x(`${sy(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(er(p.to,"pendle tx target")!==er(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&er(p.from,"pendle tx sender")!==er(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let f=jP(u),m=ee(u,{chainId:n,venue:p.to,amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return P({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:m,autoSlippage:m.autoSlippage,requiresApproval:zP(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:ue(m.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function ly(e={},t={}){let n=await Ul(e,t),{transaction:r,...o}=n;return o}L();import{isAddress as GP}from"ethers";K();var KP="https://api.odos.xyz",ql=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||KP).replace(/\/$/,"");async function Dl(e={}){return x(`${ql(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function YP(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(!GP(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function uy(e={},t={}){let n=YP(e),r=Oe({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 x(`${ql(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 dy(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await uy(e,t);return{...ee(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 py(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await uy(e,t),i=await x(`${ql(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=ee(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 P({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:ue(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function my(e={}){let t=await Dl(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}L();var fy=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,JP=/[<>&`*_~[\]()|\\]/g,QP=/[\u0000-\u001F\u007F]/g;function Hl(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(fy,"").replace(QP,"").replace(JP,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Wl(e){if(e==null)return!1;let t=String(e);return fy.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var hy=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 ha(e,t={}){let n=Number(e),r=t.baseUrl||hy[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function gy(e){return!!hy[Number(e)]}async function jl(e={},t={}){return x(`${ha(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function yy(e={},t={}){if(!e.address)throw new Error("address required");return x(`${ha(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function by(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return x(`${ha(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function wy(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${ha(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await x(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function vy(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=Hl(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Hl(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:Wl(o.symbol)||Wl(o.name)||void 0})}return n}async function xy(e={}){let t=await jl({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as eC}from"ethers";L();de();et();var tC="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",Sy=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 Ut(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function ga(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function ky(e){if(!e)return null;try{return eC(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function fn(e={},t=process.env){let n=e.addresses||{},r=ky(n.evm||e.evmAddress||ga(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||ga(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||ga(t,"ORACLE_BITCOIN_ADDRESS"),a=ky(n.hyperliquid||e.hyperliquidAddress||ga(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?ce(o,"portfolio Solana address"):null,bitcoin:i?tt(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function So(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 tr(e){let t=Number(e);return Number.isFinite(t)?t:null}function ya(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function qt(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Ey(e,t){let n=Sy[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 nC(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:So(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 zl(e,t){return{family:e,status:"unsupported",reason:t}}function Vl(e,t){if(!e||e.status!=="ok")return e;let n=Ey(t,e.symbol),r=tr(e.amount),o=r!=null&&n.priceUsd!=null?ya(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Iy(e={}){let t=fn({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function ba(e={},t={}){let n=new Date().toISOString(),r=fn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(An.map(C=>[C.chainId,C])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(Sy))],u=o?ge(()=>sn(l,Ut(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Ne(c,e.concurrency||5,async C=>{let B=s.get(C);if(!B)return{family:"evm",chainId:C,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:C,name:B.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let V={...Ut(t,"evm"),rpcUrl:e.rpcUrls?.[C]||t.evm?.rpcUrls?.[C]},le=await ge(()=>Xt(C,r.evm,V));if(!le.ok)return{family:"evm",chainId:C,name:B.name,address:r.evm,status:"unavailable",latencyMs:le.ms,error:le.error};let Ie=B.nativeCurrency?.decimals??18,$e=B.nativeCurrency?.symbol||"NATIVE",W=le.data.balanceWei,fe={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&gy(C)){let Kt=await ge(()=>wy({chainId:C,address:r.evm},{...Ut(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Kt.ok?fe={status:"ok",assets:vy(Kt.data,{fungibleOnly:!0}).map(fr=>{let hr=So(fr.amountRaw,fr.decimals);return{...fr,amount:hr,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Kt.ms}:fe={status:"unavailable",assets:[],reason:Kt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Kt.ms}}return{family:"evm",chainId:C,name:B.name,address:r.evm,status:"ok",latencyMs:le.ms,native:{status:"ok",symbol:$e,amountRaw:W,decimals:Ie,amount:So(W,Ie)},fungibleTokens:fe,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:fe.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 C=Ut(t,"solana"),B=await ge(()=>ki({address:r.solana},C)),V=i||a?await Promise.all([ge(()=>zr({owner:r.solana,programId:wc},C)).then(fe=>({...fe,program:"spl-token"})),ge(()=>zr({owner:r.solana,programId:tC},C)).then(fe=>({...fe,program:"token-2022"}))]):[],le=nC(V),Ie=le.filter(fe=>fe.classification==="collectible-candidate"),$e=le.filter(fe=>fe.classification!=="collectible-candidate"),W=V.filter(fe=>!fe.ok).map(fe=>fe.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:B.ok||V.some(fe=>fe.ok)?"ok":"unavailable",native:B.ok?{status:"ok",symbol:"SOL",amountRaw:B.data.lamports,decimals:9,amount:So(B.data.lamports,9),slot:B.data.slot}:{status:"unavailable",symbol:"SOL",error:B.error},fungibleTokens:{status:i?W.length===V.length?"unavailable":W.length?"partial":"ok":"not-requested",assets:i?$e:[],errors:W,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?W.length===V.length?"unavailable":"partial":"not-requested",assets:a?Ie:[],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 C=Ut(t,"bitcoin"),B=Ut(t,"bitcoinMeta"),[V,le,Ie]=await Promise.all([ge(()=>Ei({address:r.bitcoin},C)),i?ge(()=>Ai({address:r.bitcoin},B)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?ge(()=>Bn({address:r.bitcoin},B)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),$e=le.ok?le.data:null,W=Ie.ok?Ie.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:V.ok||$e?.ok||W?.ok?"ok":"unavailable",native:V.ok?{status:"ok",symbol:"BTC",amountRaw:V.data.balanceSats,decimals:8,amount:So(V.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:V.error},fungibleTokens:{status:i?$e?.ok?"ok":"unavailable":"not-requested",assets:$e?.balances||[],error:$e?.ok?null:$e?.error||le.error,verification:"indexer-reported"},collectibles:{status:a?W?.ok?"ok":"unavailable":"not-requested",assets:W?.inscriptions||[],error:W?.ok?null:W?.error||Ie.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 C=Ut(t,"hyperliquid"),[B,V,le]=await Promise.all([ge(()=>si(r.hyperliquid,C)),ge(()=>Pn(r.hyperliquid,C)),ge(()=>ht(C))]),Ie=(B.ok&&Array.isArray(B.data?.balances)?B.data.balances:[]).filter(W=>qt(W.total)||qt(W.hold)).map(W=>({coin:W.coin||null,total:String(W.total??"0"),hold:String(W.hold??"0"),priceUsd:null,usdValue:null})),$e=(V.ok&&Array.isArray(V.data?.assetPositions)?V.data.assetPositions:[]).map(W=>W.position||W).filter(W=>qt(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:B.ok||V.ok?"ok":"unavailable",spot:{status:B.ok?"ok":"unavailable",balances:Ie,error:B.ok?null:B.error},perps:{status:V.ok?"ok":"unavailable",accountValueUsd:V.data?.marginSummary?.accountValue??null,withdrawableUsd:V.data?.withdrawable??null,positions:$e,error:V.ok?null:V.error},mids:le.ok?le.data:{},source:"hyperliquid-info"}})(),[h,y,w,v,g]=await Promise.all([d,p,f,m,u]),b=g.ok?g.data:null,k=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),E=[];for(let C of h){if(C.family!=="evm"||C.fungibleTokens?.status!=="ok")continue;let B=k[C.chainId];if(B)for(let V of C.fungibleTokens.assets||[])V.address&&E.push(`${B}:${String(V.address).toLowerCase()}`)}let I=null;if(o&&E.length){let C=[...new Set(E)],B=await ge(()=>sn(C,Ut(t,"prices")));B.ok&&(I=B.data)}let _=h.map(C=>{let B=C.native?{...C,native:Vl(C.native,b)}:C;if(B.fungibleTokens?.status==="ok"&&Array.isArray(B.fungibleTokens.assets)){let V=k[B.chainId],le=B.fungibleTokens.assets.map(Ie=>{let $e=String(Ie.symbol||"").toUpperCase(),W=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes($e)&&(W=1),W==null&&V&&Ie.address&&I?.coins){let od=`${V}:${String(Ie.address).toLowerCase()}`,fr=I.coins[od],hr=Number(fr?.price);Number.isFinite(hr)&&hr>0&&(W=hr)}let fe=tr(Ie.amount),Kt=fe!=null&&W!=null?ya(fe*W):null;return{...Ie,priceUsd:W,usdValue:Kt}});B={...B,fungibleTokens:{...B.fungibleTokens,assets:le}}}return B});y.native&&(y.native=Vl(y.native,b)),w.native&&(w.native=Vl(w.native,b));let O=0,N=0,T=0;for(let C of[..._,y,w]){C.native?.status==="ok"&&qt(C.native.amount)&&(C.native.usdValue!=null?(O+=C.native.usdValue,N+=1):T+=1);for(let B of C.fungibleTokens?.assets||[])!qt(B.amount)&&!qt(B.amountRaw)||(B.usdValue!=null?(O+=B.usdValue,N+=1):T+=1)}let q=Ey(b,"HYPE");for(let C of v.spot?.balances||[]){let B=String(C.coin||"").toUpperCase(),V=B==="USDC"||B==="USDT"||B==="USDT0"?1:B==="HYPE"?q.priceUsd||tr(v.mids?.HYPE):tr(v.mids?.[C.coin]),le=tr(C.total);C.priceUsd=V,C.usdValue=le!=null&&V!=null?ya(le*V):null,qt(C.total)&&(C.usdValue!=null?(O+=C.usdValue,N+=1):T+=1)}let se=tr(v.perps?.accountValueUsd);se!=null&&se!==0&&(O+=se,N+=1);let Z=[...y.fungibleTokens?.assets||[],...y.collectibles?.assets||[]].filter(C=>qt(C.amount)).length,R=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;T+=Z+R;let H=[..._,y,w,v],U=C=>H.filter(B=>B.status===C).length,Q=[],be=_.filter(C=>C.fungibleTokens?.status==="unavailable"),ke=_.filter(C=>C.fungibleTokens?.status==="ok");be.length&&!ke.length?Q.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):be.length&&Q.push(`EVM token discovery partial: Blockscout covered ${ke.length} chain(s); ${be.length} chain(s) still native-only.`),(y.fungibleTokens?.assets?.length||y.collectibles?.assets?.length)&&Q.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&Q.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),g.ok||Q.push(`Price provider unavailable: ${g.error}`);let mt=[zl("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),zl("sui","Sui balance adapter is not installed"),zl("aptos","Aptos balance adapter is not installed")],It=H.some(C=>["unavailable","partial","not-configured"].includes(C.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(C.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:H.length,ok:U("ok"),unavailable:U("unavailable"),notConfigured:U("not-configured"),unsupported:U("unsupported")+mt.length,evmChainsRequested:c.length,evmChainsOk:_.filter(C=>C.status==="ok").length},valuation:{knownUsd:ya(O),label:"known priced value, not a complete portfolio total",pricedItems:N,unpricedNonzeroItems:T,complete:T===0&&!It&&U("unavailable")===0&&U("not-configured")===0&&mt.length===0,priceSource:o?"DefiLlama":null,priceStatus:g.ok?"ok":"unavailable",priceQueriedAt:n},chains:[..._,y,w,v],unsupportedFamilies:mt,warnings:Q}}import{constants as va}from"node:fs";import{chmod as _C,mkdir as PC,open as CC,readFile as TC}from"node:fs/promises";import{createHash as NC,randomUUID as OC}from"node:crypto";import RC from"node:os";import rr from"node:path";L();L();var oC=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"]),iC=new Set(["image/jpeg","image/png","image/webp"]);function aC(e){let t=String(e||"").toLowerCase();return oC.some(n=>t===n||t.endsWith(`.${n}`))}function sC(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 Ay(e){let t=sC(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!aC(n.hostname)?null:n}async function cC(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=Ay(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 ge(()=>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=Ay(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(!iC.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 Gl(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function lC(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function _y(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 b=await cC(g.imageUrl||g.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=b.bytes,s.push({item:g,image:b,error:null})}catch(b){s.push({item:g,image:null,error:String(b?.message||b).slice(0,180)})}}let u=3,d=340,p=400,f=76,m=Math.ceil(a.length/u),h=u*d,y=f+m*p,w=s.map(({item:g,image:b,error:k},E)=>{let I=E%u,_=Math.floor(E/u),O=I*d,N=f+_*p,T=b?`<image x="${O+14}" y="${N+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${b.mimeType};base64,${b.data}"/>`:`<rect x="${O+14}" y="${N+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${O+170}" y="${N+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,q=Gl(lC(g,E).slice(0,34)),se=Gl(g.chain||"unknown chain");return`${T}<text x="${O+16}" y="${N+350}" fill="#f3f5f7" font-size="17" font-weight="600">${q}</text><text x="${O+16}" y="${N+376}" fill="#8d98a8" font-size="13">${se}${k?" \xB7 placeholder":""}</text>`}).join(""),v=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${y}" viewBox="0 0 ${h} ${y}"><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 ${Gl(new Date().toISOString())}</text>${w}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(v).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 uC=[/\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],dC=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,pC=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function mC(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;dC.test(n)&&t.push("url-in-name");let i=uC.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),pC.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 Py(e={}){let t=mC(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}K();var fC=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"}]),hC=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 hn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Eo(e,t){let n=await ge(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function gC(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 yC(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 bC(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 Ny(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function wC(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 vC(e,t){let n=Ny(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 xC(e){let t=new Map;for(let n of e){let r=Ny(n);t.has(r)||t.set(r,n)}return[...t.values()]}function kC(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 Oy(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function nr(e={},t={}){let n=new Date().toISOString(),r=fn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(b=>String(b).toLowerCase())):null,i=fC.filter(b=>!o||o.has(b.chain)),a=[],s=[],c=hn(t,"opensea"),l=r.evm?i.filter(b=>b.family!=="solana"):[],u=await Ne(l,4,async b=>({row:b,result:await Eo(`opensea-${b.chain}`,()=>_r({chain:b.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:b,result:k}of u)if(k.ok){let E=k.data.nfts.map(I=>({...I,family:b.family,chainId:b.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...E),a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:k.data.complete?"ok":"partial",count:E.length,complete:k.data.complete,next:k.data.next,source:"opensea"})}else a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"unavailable",error:k.error,source:"opensea"});if(!r.evm)for(let b of i.filter(k=>k.family!=="solana"))a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let b=await Eo("opensea-solana",()=>_r({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(b.ok){let k=b.data.nfts.map(E=>({...E,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...k),a.push({family:"solana",chain:"solana",status:b.data.complete?"ok":"partial",count:k.length,complete:b.data.complete,next:b.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:b.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 b=await Eo("satflow-wallet-contents",()=>Pi({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},hn(t,"satflow")),t.timeoutMs??35e3);if(b.ok){let k=gC(b.data.contents).map(I=>yC(I,r.bitcoin));s.push(...k);let E=k.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:E?"ok":"partial",count:k.length,complete:E,source:"satflow"})}else{let k=await Eo("bitcoin-meta-inscriptions",()=>Bn({address:r.bitcoin},hn(t,"bitcoinMeta")),t.timeoutMs??35e3),E=k.ok&&k.data?.ok&&Array.isArray(k.data.inscriptions)?k.data.inscriptions:[];s.push(...E.map(I=>bC(I,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:E.length?"partial":"unavailable",count:E.length,complete:!1,source:E.length?"bitcoin-meta":"satflow",error:E.length?"Satflow unavailable; fallback has IDs only":b.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 b of[...new Set([r.evm,r.solana].filter(Boolean))]){let k=await Eo(`opensea-pnl-${b}`,()=>Jo({address:b},c),t.timeoutMs??35e3);d.push(k.ok?{status:"ok",...k.data}:{status:"unavailable",address:b,source:"opensea-indexed-account-pnl",error:k.error})}let p=wC(e.costBasis),f=xC(s).map(b=>vC(b,p)).map(b=>Py(b)),m=f.filter(b=>!b.spam),h=f.filter(b=>b.spam),y=m.filter(b=>b.estimatedValueUsd!=null&&Number.isFinite(Number(b.estimatedValueUsd))),w=Math.round(y.reduce((b,k)=>b+Number(k.estimatedValueUsd),0)*100)/100,v=m.length-y.length,g=a.filter(b=>b.status!=="ok"||b.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:hC,inventory:{count:f.length,visibleCount:m.length,flaggedCount:h.length,items:f,visibleItems:m,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:y.length,unvaluedItems:v,complete:v===0&&g.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:kC(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 Cy(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 SC(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 Ry(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 ri(e,hn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=Cy(e.expiry??e.endTime,"Solana NFT listing expiry");return Gi({...e,expiry:r},hn(t,"magiceden"))}if(n==="satflow"){let r=Cy(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Ci({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:SC(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},hn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Kl(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 Yl(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function wa(e){return String(e??"").trim().toLowerCase()}function EC(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=wa(t),i=wa(n);return!o||!i?!1:r.some(a=>wa(a.trait_type??a.traitType??a.type)===o&&wa(a.value??a.trait_value??a.traitValue)===i)}function IC(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function Ty(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 Xl(e){return Math.round(Number(e)*1e6)/1e6}function Dt(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 Ly(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return Dt(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(I=>e[I]==null||e[I]==="");if(o.length)return Dt(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Kl(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Kl(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Kl(e.traitFloorEth,"traitFloorEth"),d=Yl(e.collectionFloorEth),p=Yl(e.maxListingAgeMs),f=Yl(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return Dt(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return Dt(e,"invalid-min-trait-sales");if(u<=0)return Dt(e,"trait-floor-unavailable");let m=I=>EC(I,e.traitType,e.traitValue)&&IC(I,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(m).filter(I=>{if(!f)return!0;let _=Ty(I,["timestamp","soldAt","createdAt"]);return _!=null&&i-_<=f}),y=Xl(h.reduce((I,_)=>I+Number(_.priceEth??_.price??0),0)),w={count:h.length,volumeEth:y,minSales:c,minVolumeEth:l};if(h.length<c||y<l)return Dt(e,"trait-liquidity-insufficient",{traitSales:w});let v=(Array.isArray(e.listings)?e.listings:[]).filter(m).filter(I=>{let _=Number(I.priceEth??I.price);if(!Number.isFinite(_)||_<=0||_>a)return!1;if(!p)return!0;let O=Ty(I,["listedAt","createdAt","timestamp"]);return O!=null&&i-O<=p}).map(I=>{let _=Number(I.priceEth??I.price),O=Math.round((u-_)/u*1e4);return{...I,priceEth:_,discountBps:O}}).filter(I=>I.discountBps>=s).sort((I,_)=>I.priceEth-_.priceEth||_.discountBps-I.discountBps),g={traitSales:w,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:v.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."},b=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(b)||b<1)return Dt(e,"invalid-min-trait-listings",g);if(v.length<b)return Dt(e,"trait-listing-depth-insufficient",g);let k=v[0],E=P({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Xl(k.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:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Xl(k.priceEth),discountBps:k.discountBps},evidence:g,prepareIntent:E}}async function $y(e={},t={}){let n=await nr({...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 By(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await nr({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await _y({...e,items:n},hn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var My=10*1024*1024,qy=1e3;function Ht(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function or(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Fy(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 Dy(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 LC(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Hy(e={}){return`portfolio_${NC("sha256").update(LC(e)).digest("hex").slice(0,20)}`}function Wy(e={}){if(e.historyFile)return rr.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return rr.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||rr.join(RC.homedir(),".hermes");return rr.join(rr.resolve(n),"state","oracle","portfolio-history.jsonl")}function $C(e){let t=Ht(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?or(t):null}function BC(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Ht(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?or(t):null}function MC(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=Ht(c.usdValue);return l==null?s:s+l},0),i=Ht(n.perps?.accountValueUsd),a=or(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>Ht(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=Ht(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:or(r)})}return t}function FC(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 UC(e,t){let n=Wy(t),r=`${JSON.stringify(e)}
|
|
145
|
+
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await PC(rr.dirname(n),{recursive:!0,mode:448});let o=va.O_APPEND|va.O_CREAT|va.O_WRONLY|(va.O_NOFOLLOW||0),i=await CC(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await _C(n,384),n}async function jy(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||ba,o=t.nftInventoryImpl||nr,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(k=>({status:"unavailable",error:String(k?.message||k).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=$C(s),u=BC(c),d=[l,u].filter(k=>k!=null),p=d.length?or(d.reduce((k,E)=>k+E,0)):null,f=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),m=typeof t.now=="function"?t.now():new Date,h=new Date(m).toISOString(),y=s?.addresses||fn(e,t.env||process.env),w=Hy(y),v=[...s?.warnings||[]];n&&c?.status==="unavailable"&&v.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&v.push("NFT estimated value is incomplete and is not an executable bid.");let g={schemaVersion:1,id:`snapshot_${OC()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(k=>[k,!!y?.[k]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:f,label:f?"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:MC(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:FC(s,c,n),warnings:[...new Set(v)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await UC(g,t),snapshot:g,balance:s,nfts:c}}async function qC(e){let t=Wy(e);try{let n=await TC(t);if(n.byteLength>My)throw new Error(`portfolio history exceeds ${My} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
146
|
+
`))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 DC(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=fn(e,t.env||process.env);return Object.values(n).some(Boolean)?Hy(n):null}async function Jl(e={},t={}){let n=Dy(e.limit,100,1,qy,"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=Fy(e.since,"portfolio history since"),i=Fy(e.until,"portfolio history until"),a=DC(e,t),s=await qC(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=>Ht(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 Uy(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function xa(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function HC(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 WC(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,b)=>`${b?"L":"M"}${d(b).toFixed(2)},${p(g.value).toFixed(2)}`).join(" "),m=Array.from({length:5},(g,b)=>{let k=b/4,E=100+k*470,I=u-k*(u-l);return`<line x1="100" y1="${E}" x2="1140" y2="${E}" stroke="#26313c" stroke-width="1"/><text x="86" y="${E+5}" text-anchor="end" fill="#8795a5" font-size="15">${Uy(I)}</text>`}).join(""),h=e.map((g,b)=>`<circle cx="${d(b)}" cy="${p(g.value)}" r="5" fill="#b8f0ff"><title>${xa(g.recordedAt)}: ${Uy(g.value)}</title></circle>`).join(""),y=xa(e[0].recordedAt.slice(0,10)),w=xa(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 ${xa(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">${y}</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 zy(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Dy(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Jl({...e,order:"asc",limit:e.limit??qy},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:Ht(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=HC(o,n),a=i[0].value,s=i.at(-1).value,c=or(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=WC(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"}}}de();var zC=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"}}),VC=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),GC=`0x${"0".repeat(64)}`;function KC(e){return!e||e==="0x"||e===GC}async function gn(e={},t={}){let n=t.rpcCall||M,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(zC))c.includes(m)&&s.push({selector:`0x${m}`,...h});let l=!1,u=null,d=null;for(let{label:m,slot:h}of VC)try{let y=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!KC(y)){l=!0,u=m,d=`0x${String(y).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 Vy(e={}){let t=Date.now();try{let n=await gn({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 XC=/^0x[0-9a-fA-F]{40}$/,Gy=4663;function ka(e,t){let n=String(e||"").trim();if(!XC.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Ql(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 Io(e,t){return e==null||e===""?null:Ql(e,t)}function JC({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=ka(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=Ql(u.value??r,"prepared native value");if(BigInt(f)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let m=Io(u.gasLimit??c.gasLimit,"gasLimit"),h=Io(u.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let y=Number(l.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),v=cs({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:y,ttlMs:w,secret:l.routeAttestationSecret}),g=ue(v,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),b={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:h,slippageBps:g.selectedBps,expiresAtMs:y+w},k=Io(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return k&&(b.maxPriorityFeePerGas=k),c.nonce!==void 0&&(b.nonce=Number(c.nonce)),(c.txType!==void 0||k)&&(b.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(b.l1FeeWei=Io(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(b.operatorFeeWei=Io(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:y+w,fee:{oracleFeeBps:5},autoSlippage:g,artifact:{chainId:e,owner:o,transactions:[b]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function QC(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}Ps();let n=yp(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function ZC({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!==j.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==j.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==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 Ky(e={},t={}){let n=Number(e.chainId??Gy);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=ka(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ka(e.tokenIn,"tokenIn"):null,i=e.recipient?ka(e.recipient,"recipient"):null,a=e.amountIn==null?null:Ql(e.amountIn,"amountIn"),s=QC(n,t.scanner),c=t.scanContractRisk||gn,[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},y=ZC({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:h,scanner:s}),w=null,v=null,g=null;if(e.prepare===!0&&y.length===0){w=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{v=JC({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:m,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(b){g=String(b?.message||b).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!v,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:y,prepared:!!w,unsignedTx:w,localSignerEnvelope:v,localSignerBlockedReason:g,signed:v?"pending-local-signer":!1,broadcast:v?"pending-local-signer":!1}}async function Yy(){Ps();let e=bp();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Gy,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"}}de();de();var tT=5,Zl=[50,75,90],Xy=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function yn(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 nT(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 Sa(e={},t={}){let n=t.rpcCall||M,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Xy[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Xy).join(", ")}`};let i,a,s,c;try{i=yn(e.maxFeePerGasWei,"maxFeePerGasWei"),a=yn(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=yn(e.gasLimit,"gasLimit"),c=yn(e.maxTotalGasWei,"maxTotalGasWei")}catch(I){return{status:"error",viable:!1,error:I.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${tT.toString(16)}`,"pending",Zl],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(I){return{status:"unavailable",viable:!1,error:I?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=yn(u?.baseFeePerGas,"baseFeePerGas")??yn(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(I=>{try{return yn(I?.[o.percentile],"reward")}catch{return null}}).filter(I=>I!=null&&I>0n),m=nT(f),h=[];m==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let y=m??1000000000n,w=d*o.baseFeeMultiplier+y,v=[];a!=null&&y>a&&(v.push({field:"maxPriorityFeePerGas",wanted:y.toString(),capped:a.toString()}),y=a,w=d*o.baseFeeMultiplier+y),i!=null&&w>i&&(v.push({field:"maxFeePerGas",wanted:w.toString(),capped:i.toString()}),w=i,y>w&&(y=w));let g=s!=null?s*w:null;c!=null&&g!=null&&g>c&&v.push({field:"totalGas",wanted:g.toString(),capped:c.toString()});let b=m==null||y>=m,k=c==null||g==null||g<=c,E=b&&k;return b||h.push(`tip cap ${y} is below the observed ${Zl[o.percentile]}th-percentile tip ${m}; this bid is unlikely to land`),k||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:E,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:m==null?null:m.toString(),percentile:Zl[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:y.toString(),worstCaseGasWei:g==null?null:g.toString(),clamps:v,notes:h}}de();var oT="08c379a0",iT="4e487b71",aT=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 sT(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===oT)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===iT){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:aT[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 cT(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 lT(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 uT(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 Ao(e={},t={}){let n=t.rpcCall||M,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=uT(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(m){let h=cT(m);if(!lT(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=sT(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 Jy(e={}){let t=Date.now();try{let n=await Ao({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 pT=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 mT(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 fT(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 Qy(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=fT(t);else if(o==="quantity")r+=mT(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function hT({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 Ea(e={},t={}){let n=t.rpcCall||M,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=pT.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 Zy(e={}){let t=Date.now();try{let n=await Ea({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 eu(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 Ea({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 gn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Ao({chainId:r,tx:{from:o,to:n,data:Qy(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 Sa({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=Qy(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=ys({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 y=[];c&&y.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"&&y.push(`contract risk HIGH: ${l.findings.map(g=>g.name).join(", ")}`),p.viable||y.push(p.notes[0]),h.skipped&&y.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let w=null,v=null;try{w=hT({address:n,chainId:r,minter:o,quantity:i,tx:m,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(g){v=String(g?.message||g).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:m,localSignerEnvelope:w,localSignerBlockedReason:v,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:y}}K();import{createHash as pN}from"node:crypto";import{createHash as yT}from"node:crypto";var bT=1,wT=8,Ee=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},vT=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),xT=new Set(["family","id"]),kT=new Set(["id","startsAt","endsAt","eligibility"]),ST=new Set(["kind","proofFormat","proofDigest"]),ET=new Set(["amount","unit"]),IT=new Set(["value","unit"]);function ir(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Ee(`${t} must be a plain object`);return e}function ar(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Ee(`${n} has unknown field ${r}`,"unknown-field")}function Je(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Ee(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function AT(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Ee(`${t} must be a positive safe integer`);return e}function tu(e,t){if(e=ir(e,t),ar(e,ET,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Ee(`${t} requires amount and unit`,"ambiguous-unit");let n=Je(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Ee(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:Je(e.unit,`${t}.unit`)}}function nu(e,t){if(e=ir(e,t),ar(e,IT,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Ee(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function _T(e,t){e=ir(e,t),ar(e,ST,t);let n=Je(e.kind,`${t}.kind`),r=Je(e.proofFormat,`${t}.proofFormat`),o=Je(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Ee(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function PT(e,t){let n=`stages[${t}]`;e=ir(e,n),ar(e,kT,n);let r=nu(e.startsAt,`${n}.startsAt`),o=nu(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Ee(`${n} must end after it starts`,"invalid-stage-range");return{id:Je(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:_T(e.eligibility,`${n}.eligibility`)}}function ru(e){if(e=ir(e,"input"),ar(e,vT,"input"),e.version!==bT)throw new Ee("version must be 1");let t=ir(e.chain,"chain");ar(t,xT,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>wT)throw new Ee("stages must contain 1 through 8 entries","stage-count");let r=n.map(PT).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 Ee("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 Ee("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Ee("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:Je(t.family,"chain.family"),id:Je(t.id,"chain.id")},marketplace:Je(e.marketplace,"marketplace"),mechanism:Je(e.mechanism,"mechanism"),collection:Je(e.collection,"collection"),recipient:Je(e.recipient,"recipient"),quantity:AT(e.quantity,"quantity"),stages:r,mintValueCap:tu(e.mintValueCap,"mintValueCap"),networkFeeCap:tu(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:tu(e.priorityFeeCap,"priorityFeeCap"),expiry:nu(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Ee("every stage must end no later than expiry","stage-after-expiry");return i}function CT(e){return JSON.stringify(ru(e))}function eb(e){return`sha256:${yT("sha256").update(CT(e),"utf8").digest("hex")}`}var ou=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),bn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),iu=Object.freeze(Object.values(bn)),tb=new Set(iu),nb=Object.freeze(iu.slice(0,4)),TT=iu,NT=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Pe=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function Ia(e,t){if(!Array.isArray(e)||e.length===0)throw new Pe(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Pe(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Pe(`${t} contains duplicates`);return[...n].sort()}function OT(e){if(!Array.isArray(e))throw new Pe("capabilities must be an array");let t=new Set(e);for(let n of t)if(!tb.has(n))throw new Pe(`unknown capability ${n}`,"unknown-capability");return TT.every(n=>t.has(n))?ou.AUTOMINT_READY:nb.every(n=>t.has(n))?ou.PREPARE_READY:ou.RESEARCH_ONLY}function au(e=[]){if(!Array.isArray(e))throw new Pe("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Pe("entry must be an object");for(let i of Object.keys(n))if(!NT.has(i))throw new Pe(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Pe("entry id must be an exact string");if(t.has(n.id))throw new Pe(`duplicate entry id ${n.id}`,"duplicate-entry");let r=Ia(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(Ia(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(Ia(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(Ia(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:OT(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=nb){let o=t.get(n);if(!o)throw new Pe(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!tb.has(i))throw new Pe(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Pe(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var C5=au([]);K();import{getAddress as RT,Interface as su,keccak256 as LT}from"ethers";var Wt=Object.freeze({manifold:new su(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new su(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new su(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),lu=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"})}),R5=Object.freeze(Object.fromEntries(Object.entries(lu).map(([e,t])=>[Wt[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function te(e){throw new Error(`evm-mint-launchpads: ${e}`)}function qe(e,t){try{return RT(String(e||""))}catch{return te(`invalid ${t}`)}}function Ce(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&te(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return te(`${t} must be an unsigned integer`)}}function cu(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&te(`invalid ${t}`),e.map(String)}function $T(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&te("invalid chainId");let o=qe(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&qe(u.contract,"reviewed contract")===o);a||te("unsupported contract or wrong chain");let s=qe(a.mintTarget||a.contract,"reviewed mint target"),c=Wt[e].getFunction(lu[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))&&te("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function BT(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);te("runtime bytecode verification required")}function MT(e,t){let n=e.stage;if(!n)return null;let r=Ce(n.startTime,"stage startTime"),o=Ce(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&te("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function FT(e,t){let n=lu[e];String(t).slice(0,10).toLowerCase()!==Wt[e].getFunction(n.signature).selector.toLowerCase()&&te("unknown selector");let r;try{r=Wt[e].decodeFunctionData(n.signature,t)}catch{te("invalid calldata layout")}let o;return e==="manifold"&&(o=Wt.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Wt.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Wt.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&te("calldata must be canonical with no suffix"),r}async function rb(e,t={},n={}){Wt[e]||te("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=$T(e,t,n),s=qe(t.recipient||t.minter,"recipient"),c=Ce(t.quantity,"quantity",{positive:!0}),l=Ce(t.priceWei,"priceWei"),u=Ce(t.maxValueWei,"maxValueWei"),d=Ce(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&te("transaction chain mismatch"),qe(p.to,"transaction target")!==i&&te("transaction target mismatch");let f=await BT(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(f))||f==="0x"||LT(f).toLowerCase()!==String(a.codeHash).toLowerCase())&&te("runtime bytecode is not reviewed");let m=FT(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),y=MT(t,h),w,v,g,b=null,k=[];if(e==="manifold")qe(m[0],"calldata contract")!==o&&te("calldata contract mismatch"),(t.instanceId==null||Ce(m[1],"instanceId")!==Ce(t.instanceId,"instanceId"))&&te("instance/stage mismatch"),(t.mintIndex==null||Ce(m[2],"mintIndex")!==Ce(t.mintIndex,"mintIndex"))&&te("mint index/stage mismatch"),k=cu([...m[3]]),w=qe(m[4],"calldata recipient"),v=1n,g=l;else if(e==="zora")w=qe(m[0],"calldata recipient"),v=BigInt(m[1]),g=l,t.comment!=null&&m[2]!==String(t.comment)&&te("comment mismatch"),t.mintReferral!=null&&qe(m[3],"mint referral")!==qe(t.mintReferral,"expected mint referral")&&te("mint referral mismatch");else{w=qe(m[0],"calldata recipient"),v=BigInt(m[1]),g=BigInt(m[3]);let N=m[4];k=cu([...N.proof]),b=BigInt(N.quantityLimitPerWallet),b<c&&te("wallet allowance below quantity"),(BigInt(N.pricePerToken)!==l||qe(N.currency,"allowlist currency")!==qe(m[2],"currency"))&&te("allowlist terms mismatch")}w!==s&&te("recipient mismatch"),v!==c&&te("quantity mismatch"),g!==l&&te("price mismatch"),t.proof!=null&&JSON.stringify(k.map(N=>N.toLowerCase()))!==JSON.stringify(cu(t.proof).map(N=>N.toLowerCase()))&&te("proof mismatch");let E=Ce(p.value??0,"transaction value"),I=l*c;(E<I||E-I>d||E>u)&&te("transaction value or fee cap exceeded");let _=p.gasLimit==null?null:Ce(p.gasLimit,"gasLimit"),O=p.maxFeePerGas==null?null:Ce(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(_==null||_>Ce(t.maxGasLimit,"maxGasLimit"))&&te("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(O==null||O>Ce(t.maxFeePerGasWei,"maxFeePerGasWei"))&&te("gas fee cap exceeded"),P({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:E.toString(),platformFeeWei:(E-I).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...y?{stage:y}:{},...b==null?{}:{walletAllowance:b.toString()},proof:k,transaction:{chainId:r,to:i,data:p.data,value:E.toString(),..._==null?{}:{gasLimit:_.toString()},...O==null?{}:{maxFeePerGas:O.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var UT="RESEARCH_ONLY";var qT="canonical serialized-message decoding and program-specific instruction validation are not implemented",Aa=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),$5=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function DT(){throw new Error(`solana-mint: ${UT}; disabled until ${qT}`)}function ob(){DT()}K();import{Address as HT,CompactSize as WT,NETWORK as jT,OutScript as hb,Script as zT,TEST_NETWORK as ib,Transaction as VT,utils as GT}from"@scure/btc-signer";import{createHash as _o}from"node:crypto";var ab="universal-ordinals-mint",sb="bitcoin-ordinals-mint-plan",KT=1800*1e3,YT=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),cb=new Set,XT=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function ot(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function jt(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 uu(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 gb(e,t){let n=ot(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 JT(e){return e==="bitcoin"||e==="mainnet"?jT:e==="regtest"?{...ib,bech32:"bcrt"}:ib}function lb(e,t){try{let n=hb.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 QT(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function ZT(e){let t=_o("sha256").update(e.unsignedTx).digest();return _o("sha256").update(t).digest().reverse().toString("hex")}function ub(e,...t){let n=_o("sha256").update(e,"ascii").digest();return _o("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function eN(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=ub("TapLeaf",Buffer.from([a]),Buffer.from(WT.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=ub("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=GT.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 db(e,t){let n=ot(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=VT.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(QT(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=lb(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)=>eN(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 lb(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:ZT(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 tN(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 nN(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 rN=new Set([1,3]);function oN(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=nN(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!rN.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 iN(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=zT.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(oN(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(_o("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||tN(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 pb(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 aN(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 yb(e,t="parentId"){let n=ot(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 bb(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=ot(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=jt(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function sN(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:ot(a.role,`revealOutputs[${s}].role`),address:ot(a.address,`revealOutputs[${s}].address`),valueSats:jt(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:gb(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:yb(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 cN(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:ot(n?.role,`commitOutputs[${r}].role`),valueSats:jt(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:gb(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 mb(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 fb(e,t,n){try{return Buffer.from(hb.encode(HT(JT(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 lN(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)=>bb({...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 uN(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");aN(e);for(let T of["content","contentBytes","body","file","path","url","contentUrl"])if(e[T]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let T of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[T]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=ot(e.network,"network").toLowerCase();if(!YT.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=ot(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=ot(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=yb(e.parentId??e.parentInscriptionId),a=ot(e.recipient??e.destination,"recipient"),s=jt(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(bb);if(new Set(c.map(T=>T.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");lN(e,c);let l=db(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=db(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=cN(e.commitOutputs),p=sN(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((T,q)=>T.txid!==c[q].txid||T.vout!==c[q].vout||T.valueSats!==c[q].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");mb(l.outputs,d,"commit PSBT"),mb(u.outputs,p,"reveal PSBT");let f=fb(a,n,"recipient");if(p.find(T=>T.role==="inscription").scriptHex!==f)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[T,q]of p.entries())if(q.scriptHex!==fb(q.address,n,`revealOutputs[${T}].address`))throw new Error(`ordinals mint: reveal output ${T} script does not pay its bound address`);let m=d.findIndex(T=>T.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(T=>T.txid===l.txid&&T.vout===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");iN(u,{contentHash:r,contentType:o,parentId:i});let y=uu(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=uu(e.revealFeeRateSatVb,"revealFeeRateSatVb"),v=uu(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(v<=0||y>v||w>v)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let g=jt(e.commitFeeSats,"commitFeeSats"),b=jt(e.revealFeeSats,"revealFeeSats"),k=jt(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(g+b>k)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==g.toString()||u.feeSats!==b.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(g)/l.vsizeLowerBound>y||Number(b)/u.vsizeLowerBound>w)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(T=>T.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let _=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:jt(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(_.enabled){if(!Number.isSafeInteger(_.outputIndex)||_.outputIndex<0||p[_.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[_.outputIndex].valueSats!==_.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(T=>T.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let O=Number(t.nowMs??Date.now()),N=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(N)||N<=O||N-O>KT)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(pb),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(pb),revealPsbt:u.encoded,revealOutputs:p,commitRate:y,revealRate:w,maxRate:v,commitFee:g.toString(),revealFee:b.toString(),maxTotalFee:k.toString(),rbf:e.rbf,cpfp:_,expiresAt:N}}function dN(e={},t={}){let n=uN(e,t),r=n.commitInputs.find(s=>cb.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:ab,kind:sb,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...XT},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=P(i,{provider:ab,kind:sb,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)cb.add(s.outpoint);return a}var wb=dN;var mN=Object.freeze([bn.DISCOVERY,bn.ELIGIBILITY,bn.PREPARATION,bn.SIMULATION]),vb=[["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",Aa.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",Aa.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",Aa.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],xb=Object.freeze(vb.map(([e,t,n,r])=>Object.freeze({id:e,family:t,chainFamilies:Object.freeze([t]),marketplaces:Object.freeze(n),mechanisms:Object.freeze(r),enabled:t!=="solana",capabilities:t==="solana"?Object.freeze([bn.DISCOVERY]):mN,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),Y5=au(xb.map(({family:e,tier:t,enabled:n,...r})=>r)),kb=new Map(vb.map(e=>[e[0],e])),fN=new Set(["intent","adapterId","input"]),hN=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,_a=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ae(e,t,n){throw new _a(e,t,n?{cause:n}:{})}function $(e,t,n){String(e??"")!==String(t)&&ae("intent-mismatch",`${n} does not match canonical intent`)}function xe(e,t,n){let r=e[t];return r.unit!==n&&ae("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function Sb(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))hN.test(n)&&ae("custody-refused",`${t}.${n} is outside the prepare-only boundary`),Sb(r,`${t}.${n}`)}function gN(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function yN(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ae("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ae("intent-mismatch","stageId does not match canonical intent"),$(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${pN("sha256").update(JSON.stringify(gN(n,t))).digest("hex")}`;$(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))&&ae("invalid-request","decoded input requires exact stage bounds"),$(a,o.startsAt.value,"stage start"),$(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&ae("expired-intent","canonical mint stage is not active at authoritative now"),o}function bN(e,t){let n=kb.get(t);n||ae("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return $(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&ae("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function wN(e,t){e.chain.family==="evm"?($(t.chainId,e.chain.id,"network"),$(t.contract,e.collection,"collection/drop"),$(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity"),$(t.maxValueWei??t.maxTotalWei,xe(e,"mintValueCap","wei"),"mint-value cap"),$(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,xe(e,"networkFeeCap","wei"),"network-fee cap"),$(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,xe(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?($(t.network,e.chain.id,"network"),$(t.collection??t.drop??t.identity,e.collection,"collection/drop"),$(t.recipientOwner??t.recipient,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity"),$(t.priceLamports,xe(e,"mintValueCap","lamports"),"mint-value cap"),$(t.networkFeeCapLamports,xe(e,"networkFeeCap","lamports"),"network-fee cap"),$(t.priorityFeeCapLamports,xe(e,"priorityFeeCap","lamports"),"priority-fee cap")):($(t.network,e.chain.id,"network"),$(t.parentId,e.collection,"collection/drop"),$(t.recipient,e.recipient,"recipient"),$(e.quantity,1,"Ordinals quantity"),$(t.postageSats,xe(e,"mintValueCap","sats"),"mint-value cap"),$(t.maxTotalFeeSats,xe(e,"networkFeeCap","sats"),"network-fee cap"),$(t.maxFeeRateSatVb,xe(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function vN(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==Qt(e))&&ae("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ae("custody-refused","leaf artifact is not strictly prepare-only")}function xN(e,t,n){$(t.chainId,e.chain.id,"network"),$(t.contract,e.collection,"collection/drop"),$(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity");let r=xe(e,"mintValueCap","wei"),o=xe(e,"networkFeeCap","wei"),i=xe(e,"priorityFeeCap","wei-per-gas");$(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),$(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),$(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||ae("artifact-mismatch","prepared EVM transaction is missing"),$(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&ae("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)&&ae("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),$(n.contract,e.collection,"artifact collection/drop"),$(n.recipient??n.buyer,e.recipient,"artifact recipient"),$(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&ae("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function kN(e,t,n){$(t.network,e.chain.id,"network"),$(t.collection??t.drop??t.identity,e.collection,"collection/drop"),$(t.recipientOwner??t.recipient,e.recipient,"recipient"),$(t.quantity,e.quantity,"quantity"),$(t.priceLamports,xe(e,"mintValueCap","lamports"),"mint-value cap");let r=xe(e,"networkFeeCap","lamports"),o=xe(e,"priorityFeeCap","lamports");$(t.networkFeeCapLamports,r,"network-fee cap"),$(t.priorityFeeCapLamports,o,"priority-fee cap"),$(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)&&ae("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function SN(e,t,n){return $(t.network,e.chain.id,"network"),$(t.parentId,e.collection,"collection/drop"),$(t.recipient,e.recipient,"recipient"),$(e.quantity,1,"Ordinals quantity"),$(t.postageSats,xe(e,"mintValueCap","sats"),"mint-value cap"),$(t.maxTotalFeeSats,xe(e,"networkFeeCap","sats"),"network-fee cap"),$(t.maxFeeRateSatVb,xe(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),$(n.plan.network,e.chain.id,"artifact network"),$(n.plan.parentId,e.collection,"artifact collection/drop"),$(n.plan.recipient,e.recipient,"artifact recipient"),$(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),$(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),$(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 du(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:xb})}async function Eb(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:du()}}async function Ib(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ae("invalid-request","request must be a plain object");for(let u of Object.keys(e))fN.has(u)||ae("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ae("invalid-request","explicit adapterId is required; adapter inference is refused"),kb.has(e.adapterId)||ae("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ae("invalid-request","family-specific decoded input is required"),Sb(n);let r;try{r=ru(e.intent)}catch(u){ae("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ae("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ae("expired-intent","canonical mint intent has expired");let i=bN(r,e.adapterId);i[1]==="solana"&&ae("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=yN(r,n,r.chain.family,o);wN(r,n);let s;try{i[4]==="evm"?s=await rb(i[5],n,t):i[4]==="opensea"?s=await ni(n,t):i[4]==="solana"?($(n.programId,i[5],"selected Solana adapter program"),s=await ob(n,t)):s=await wb(n,t)}catch(u){if(u instanceof _a)throw u;ae("adapter-refused",u?.message||"adapter preparation failed",u)}vN(s);let c=i[4]==="bitcoin"?SN(r,n,s):i[4]==="solana"?kN(r,n,s):xN(r,n,s),l=Object.freeze({intentHash:eb(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 P({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 pu="ROUTE_ONLY",mu=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),_b=new Set(Object.values(mu)),IN=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),AN=new Set(["amount","currency"]),_N=new Set(["value","unit"]),PN=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),CN=new Set(["provider","operations"]),re=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function lr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new re(`${t} must be a plain object`);return e}function Po(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new re(`${n} has unknown field ${r}`,"unknown-field")}function pe(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new re(`${t} must be an exact non-empty string`);return e}function Pb(e,t,{positive:n=!1}={}){if(e=pe(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new re(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function sr(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new re(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>pe(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new re(`${t} contains duplicates`);return r}function Cb(e,t){return e=lr(e,t),Po(e,AN,t),{amount:Pb(e.amount,`${t}.amount`),currency:pe(e.currency,`${t}.currency`)}}function Ab(e,t){if(!Array.isArray(e))throw new re(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>Cb(n,`${t}[${r}]`))}function TN(e){if(e=lr(e,"expiry"),Po(e,_N,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new re("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function NN(e,t,n){Object.hasOwn(e,n)&&(t[n]=pe(e[n],n))}function Tb(e){e=lr(e,"intent"),Po(e,IN,"intent");let t=pe(e.action,"action");if(!_b.has(t))throw new re(`unsupported action ${t}`,"invalid-action");let n={action:t,family:pe(e.family,"family"),network:pe(e.network,"network"),standard:pe(e.standard,"standard"),collection:pe(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])NN(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 re("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new re("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new re("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=pe(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new re("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=pe(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=pe(e.sender,"sender"))}else n.owner=pe(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=pe(e.recipient,"recipient")),n.quantity=Pb(e.quantity,"quantity",{positive:!0}),n.marketplace=pe(e.marketplace,"marketplace"),n.protocol=pe(e.protocol,"protocol"),n.artifactKind=pe(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new re(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=Cb(e.price,"price"),n.expiry=TN(e.expiry),n.fees=Ab(e.fees,"fees"),n.royalties=Ab(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=pe(e.listingId,"listingId")),n}function ON(e){e=lr(e,"adapter"),Po(e,PN,"adapter");let t=sr(e.actions,"adapter.actions");for(let o of t)if(!_b.has(o))throw new re(`adapter has unknown action ${o}`,"invalid-action");let n=lr(e.surface,"adapter.surface");Po(n,CN,"adapter.surface");let r=lr(n.operations,"adapter.surface.operations");for(let o of t)pe(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new re(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:pe(e.id,"adapter.id"),family:pe(e.family,"adapter.family"),networks:Object.freeze(sr(e.networks,"adapter.networks")),standards:Object.freeze(sr(e.standards,"adapter.standards")),marketplaces:Object.freeze(sr(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(sr(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(sr(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:pu,custody:"user",surface:Object.freeze({provider:pe(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function RN(e=[]){if(!Array.isArray(e))throw new re("entries must be an array");let t=e.map(ON);if(new Set(t.map(r=>r.id)).size!==t.length)throw new re("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:pu,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=Tb(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new re("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new re(`adapter lacks ${o.action}`,"unsupported-operation"):new re("no exact adapter route","unsupported-operation")}})}var cr=(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}}),fu=RN([cr("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"}),cr("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"}),cr("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"}),cr("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),cr("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),cr("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function Nb(e,{access:t="public",feeProfile:n="default",registry:r=fu,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new re("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new re("nowMs must be a non-negative safe integer","invalid-expiry");let i=Tb(e);if(i.expiry&&o>=i.expiry.value)throw new re("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:pu,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:pe(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)})}K();var Ca="universal-evm-nft-transfer",Ob="evm-nft-safe-transfer",$N=1800*1e3,BN=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),MN=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function Rb(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(MN.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);Rb(r,t)}}}function hu(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 wn(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 Co=e=>e.toString(16).padStart(64,"0"),Pa=e=>e.slice(2).padStart(64,"0");function FN(e,t,n,r,o){return e==="erc721"?`0x42842e0e${Pa(t)}${Pa(n)}${Co(r)}`:`0xf242432a${Pa(t)}${Pa(n)}${Co(r)}${Co(o)}${Co(160n)}${Co(0n)}`}function UN(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(Rb(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=wn(e.chainId,"chainId",{positive:!0,safe:!0}),o=hu(e.sender??e.from,"sender"),i=hu(e.recipient??e.to,"recipient"),a=hu(e.contract??e.contractAddress??e.tokenContract,"contract"),s=wn(e.tokenId,"tokenId"),c=wn(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(wn(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=wn(e.gasLimit,"gasLimit",{positive:!0}),u=wn(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=wn(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)>$N)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let f=FN(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 Lb(e={},t={}){let n=UN(e,t),r={provider:Ca,kind:Ob,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...BN},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 P(r,{provider:Ca,kind:Ob,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}K();var Ta="universal-solana-nft-transfer",$b="solana-verified-nft-transfer",Mb="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",vn=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Bb=new Set(Object.values(vn)),DN=new Set([vn.token,vn.token2022]),HN=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),WN=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function X(e){throw new Error(`solana nft transfer: ${e}`)}function it(e,t){let n=String(e??"").trim();return n||X(`${t} required`),n}function pt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||X(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&X(`${t} must be positive`),r}function he(e,t,n){String(e??"")!==String(t)&&X(`${n} mismatch; mutation refused`)}function Fb(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))WN.test(r)&&o!=null&&o!==!1&&X(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),Fb(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&X(`${r} refused; adapter is prepare-only`)}}function jN(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&X(`${t} must be decoded`),Array.isArray(e.accounts)||X(`${t} decoded accounts required`),e.decoded}function zN(e,t,n){for(let r of e.accounts){let o=it(r.pubkey,"account pubkey");t.has(o)||X(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&X(`unexpected writable account ${o}`)}}function VN(e={}){(!e||typeof e!="object"||Array.isArray(e))&&X("request object required"),Fb(e),(e.network!=="mainnet-beta"||e.genesisHash!==Mb)&&X("mainnet genesis/network mismatch"),e.reviewed!==!0&&X("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=it(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&X("standard must be metaplex or core");let n=it(e.mint??e.asset,"mint/asset"),r=it(e.collection,"collection");e.collectionVerified!==!0&&X("verified collection required");let o=it(e.owner,"owner"),i=it(e.recipient,"recipient"),a=pt(e.quantity,"quantity",{positive:!0}),s=pt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&X("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&X("Core quantity must be exactly 1");let c=it(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==vn.core:!DN.has(c))&&X("reviewed transfer program mismatch");let l=t==="metaplex"?it(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?it(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&he(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(pt(e.decimals??0,"decimals")):null,p=pt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),f=pt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),m=pt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*f+999999n)/1000000n;h>m&&X("priority fee exceeds reviewed cap");let y=pt(e.networkFeeLamports,"networkFeeLamports"),w=pt(e.networkFeeCapLamports,"networkFeeCapLamports");y>w&&X("network fee cap exceeded");let v=e.transaction;(!v||typeof v!="object"||Array.isArray(v))&&X("transaction object required"),v.version!==0&&v.version!=="legacy"&&X("transaction version must be 0 or legacy");let g=it(v.recentBlockhash,"recentBlockhash");he(g,e.approvedBlockhash,"blockhash mutation after approval");let b=pt(v.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),k=pt(e.currentBlockHeight,"currentBlockHeight");k>b&&X("expired blockhash"),(!Array.isArray(v.instructions)||v.instructions.length<3)&&X("canonical instructions required");let E=new Set([o,n,l,u].filter(Boolean)),I=new Set([o,i,n,r,l,u,...Bb].filter(Boolean)),_=0,O=0,N=0,T=0;for(let[q,se]of v.instructions.entries()){let Z=it(se.programId,`instructions[${q}].programId`);Bb.has(Z)||X(`unknown program ${Z}`);let R=jN(se,`instructions[${q}]`);zN(se,I,E);let H=String(R.type??R.instruction??"").toLowerCase();Z===vn.computeBudget?H.includes("limit")?(he(R.units??R.computeUnitLimit,p,"compute-unit limit"),_++):H.includes("price")?(he(R.microLamports??R.computeUnitPriceMicroLamports,f,"compute-unit price"),O++):X("unsupported compute budget instruction"):Z===vn.associatedToken?((t!=="metaplex"||H!=="createassociatedtokenaccountidempotent")&&X("non-canonical associated token instruction"),he(R.payer,o,"ATA payer"),he(R.owner,i,"ATA recipient"),he(R.mint,n,"ATA mint"),he(R.tokenAccount,u,"recipient ATA"),he(R.tokenProgramId,c,"ATA token program"),T++):t==="metaplex"&&Z===c?(H!=="transferchecked"&&X("only canonical transferChecked is allowed"),he(R.mint,n,"mint"),he(R.owner,o,"owner"),he(R.recipient,i,"recipient"),he(R.sourceTokenAccount,l,"source token account"),he(R.destinationTokenAccount,u,"recipient ATA"),he(R.amount,a,"quantity"),he(R.decimals,d,"decimals"),N++):t==="core"&&Z===vn.core?(H!=="transfer"&&X("only canonical Core transfer is allowed"),he(R.asset,n,"mint/asset"),he(R.collection,r,"collection"),R.collectionVerified!==!0&&X("verified collection required in Core instruction"),he(R.owner,o,"owner"),he(R.newOwner,i,"recipient"),he(R.amount??1,1,"quantity"),N++):X(`program ${Z} is not valid for ${t} transfer`)}return(_!==1||O!==1)&&X("exactly one compute-unit limit and price instruction required"),N!==1&&X("exactly one canonical transfer instruction required"),t==="metaplex"&&T>1&&X("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:b.toString(),currentBlockHeight:k.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:f.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:m.toString(),networkFeeLamports:y.toString(),networkFeeCapLamports:w.toString(),transaction:v}}function Ub(e={},t={}){let n=VN(e),r=Number(t.nowMs??Date.now()),o={provider:Ta,kind:$b,chain:"solana-mainnet-beta",genesisHash:Mb,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...HN},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 P(o,{provider:Ta,kind:$b,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}K();var Na="universal-ordinals-transfer",qb="bitcoin-ordinals-transfer-plan",Db=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),KN=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ne(e){throw new Error(`ordinals transfer: ${e}`)}function Vt(e,t){let n=String(e??"").trim();return n||ne(`${t} required`),n}function zt(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ne(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ne(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ne(`${t} out of range`),o}function Hb(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ne(`${t} must be positive`),n}function Vb(e,t){let n=Vt(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ne(`${t} must be 64 hex`),n}function Gb(e,t="inscriptionId"){let n=Vt(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ne(`${t} must be canonical`),n}function Kb(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&&ne(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Kb(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ne(`${r} bypass refused; adapter is prepare-only`)}function Yb(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ne(`${t}.${n} arbitrary script refused; use a bound address`)}function Wb(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Yb(e,t);let n=Vb(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ne(`${t}.vout invalid`),{txid:n,vout:r,valueSats:zt(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:Vt(e.address,`${t}.address`),sequence:Number(zt(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function jb(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Yb(e,t),{role:Vt(e.role,`${t}.role`),address:Vt(e.address,`${t}.address`),valueSats:zt(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:Gb(e.inscriptionId,`${t}.inscriptionId`)}}}function zb(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ne(`${n} mismatch; mutation refused`)}function YN(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ne("request object required"),Kb(e);let t=Vt(e.network,"network").toLowerCase(),n=Vb(e.genesisHash,"genesisHash");(!Db[t]||n!==Db[t])&&ne("network/genesis mismatch");let r=Gb(e.inscriptionId),o=Wb(e.ownerInput,"ownerInput");Vt(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ne("current inscription outpoint mismatch");let i=Vt(e.destination,"destination"),a=zt(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:jb(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ne("exact change output invalid");let c=Hb(e.feeRateSatVb,"feeRateSatVb"),l=Hb(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ne("fee rate exceeds reviewed cap");let u=zt(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=zt(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ne("total fee exceeds reviewed cap");let p=Number(zt(e.locktime,"locktime",{max:0xffffffffn})),f=Number(zt(e.sequence,"sequence",{max:0xffffffffn}));f<4294967294&&ne("RBF sequence refused"),o.sequence!==f&&ne("owner input sequence mismatch");let m=e.psbt;(!m||typeof m!="object"||Array.isArray(m))&&ne("decoded PSBT plan required"),(m.version!==0||m.unsigned!==!0)&&ne("PSBT v0 must be explicitly unsigned"),Number(m.locktime)!==p&&ne("PSBT locktime mismatch"),(!Array.isArray(m.inputs)||m.inputs.length!==1)&&ne("exactly one PSBT input required; extra inputs refused"),zb(Wb(m.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(m.outputs)?m.outputs.map((g,b)=>jb(g,`psbt.outputs[${b}]`)):ne("PSBT outputs required"),y={role:"inscription",address:i,valueSats:a,inscriptionId:r};zb(h,s?[y,s]:[y],"exact PSBT outputs"),h.filter(g=>g.role==="inscription"&&g.inscriptionId===r).length!==1&&ne("exactly one inscription-carrying output required");let v=h.reduce((g,b)=>g+BigInt(b.valueSats),0n);return BigInt(o.valueSats)!==v+u&&ne("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 Xb(e={},t={}){let n=YN(e);return P({provider:Na,kind:qb,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...KN},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:Na,kind:qb,env:t.env})}de();function JN(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 Jb(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(!Mc(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=JN(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 Qb(e={},t={}){let n=t.rpcCall||M,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 ZN=1440*60*1e3;function e2(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>ZN&&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 Zb="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",t2=4663,n2="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",ew="a22cb465",r2="a0712d68";function gu(e){return String(e||"").trim().toLowerCase()}function ur(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function o2(e){let t=ur(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${ew}${t.padStart(64,"0")}${"0".repeat(64)}`}function i2(e){return ur(e).includes(ur(Zb))}function a2(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>ur(n?.data).startsWith(ew))}function s2(e={},t){let n=ur(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return gu(i[0])!==n2?!1:ur(i[2])===n})}function c2(e=1){return`0x${r2}${BigInt(e).toString(16).padStart(64,"0")}`}function tw(e={},t={}){let n=gu(e.contract),r=gu(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!==t2&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),i2(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"),a2(s)&&a.push("simulation sets approval / setApprovalForAll"),s2(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:c2(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:o2(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Hf(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=e2(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:Zb.toLowerCase(),reasons:a,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}L();K();wi();var u2="https://api.paraswap.io",yu=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||u2).replace(/\/$/,"");function dr(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 bu(e={},t={}){let n=Number(e.chainId||1);return x(`${yu(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:dr(e.srcToken,"srcToken"),destToken:dr(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 bi({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(Qp(o)))r.set(s,c);let i=await x(`${yu(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...ee(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 nw(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=dr(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:dr(e.srcToken,"srcToken"),destToken:dr(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=dr(e.receiver,"receiver"));let c=await x(`${yu(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 P({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:ue(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function rw(e={}){let t=await bu({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 p2}from"node:crypto";import{getAddress as lw,isAddress as wu}from"ethers";var ow="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",m2=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),f2=Object.freeze(["lifi"]),iw=/^0x[0-9a-fA-F]{64}$/,h2=/^\d+$/;function me(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function aw(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&me(t,"must be a positive chainId"),n}function Oa(e,t){let n=String(e??"").trim();return(!h2.test(n)||BigInt(n)<=0n)&&me(t,"must be a positive integer string"),n}function g2(e,t){return e==null||e===""?null:Oa(e,t)}function sw(e,t){let n=String(e??"").trim();return n.toLowerCase()===ow.toLowerCase()?ow:(wu(n)||me(t,"must be an EVM address or native token sentinel"),lw(n))}function uw(e,t){let n=String(e??"").trim();return wu(n)||me(t,"must be an EVM address"),lw(n)}function y2(e,t){return e==null||e===""?null:uw(e,t)}function cw(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||me(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function b2(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||me(r,"must be a finite millisecond timestamp"),o<=t&&me(r,"expired"),o>t+n&&me(r,"exceeds maxDeadlineMs"),Math.floor(o)}function mr(e){if(Array.isArray(e))return e.map(mr);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=mr(e[n]));return t}return e}function w2(e){return JSON.stringify(mr(e))}function Ra(e){return`0x${p2("sha256").update(w2(e)).digest("hex")}`}function dw(e,t){let n={...e};for(let r of t)delete n[r];return n}function v2(e){return Ra(dw(e,["intentHash"]))}function x2(e){return Ra(dw(e,["firmQuoteHash"]))}function vu(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&me("time","is invalid");let o=aw(e.fromChainId??e.fromChain,"fromChainId"),i=aw(e.toChainId??e.toChain,"toChainId"),s=o===i?m2:f2,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:sw(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:sw(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Oa(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:uw(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:b2(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:g2(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:cw(e.allowedSources,"allowedSources",s),allowedRouters:cw(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)?mr(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&me("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Ra({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=v2(c),Object.freeze(c)}function k2(e){return(!e||typeof e!="object"||Array.isArray(e))&&me("artifact","required"),e.typedDataHash!=null&&!iw.test(String(e.typedDataHash))&&me("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!iw.test(String(e.calldataHash))&&me("artifact.calldataHash","must be bytes32"),e.to!=null&&!wu(String(e.to))&&me("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&me("artifact.data","must be hex"),mr(e)}function pw(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&me("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||me("quote expiry","required"),o<=r&&me("quote","expired"),o>e.deadlineMs&&me("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||me("source","required"),e.allowedSources.includes(i)||me("source","not allowed by intent");let a=Oa(t.amountOut??t.buyAmount,"amountOut"),s=Oa(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&me("minBuyAmount","exceeds amountOut");let c=k2(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||me("quotedAtMs","must be finite");let u=y2(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)?mr(t.metadata):{}};return d.quoteId||(d.quoteId=Ra({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=x2(d),Object.freeze(d)}function To(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function mw(e,t){return String(e?.[t]??"").trim()}function No(e,t){return Object.freeze({source:e,run:t})}function S2(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??Be,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return To(e,"lifi")&&a.push(No("lifi",async()=>{let c=await(r.lifiQuote??Gr)({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 E2(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(To(e,"paraswap")&&a.push(No("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}}})),To(e,"0x")&&(mw(n,"ZEROX_API_KEY")||mw(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(No("0x",async()=>{let c=await(r.zeroxQuote??Yr)({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}}})),To(e,"cow")&&a.push(No("cow",async()=>{let c=await(r.cowQuote??Mn)({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}}})),To(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(No("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??En)({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 E2(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function I2(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function A2(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>I2(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(pw(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 _2(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 fw(e,t={}){let n=S2(e,t),{quotes:r,failed:o}=await A2(e,n,t),i=_2(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 hw(e={},t={}){return vu(e,t)}async function gw(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:vu(e,t);return fw(n,t)}async function yw(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}L();var C2="https://app.across.to";function xu(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||C2).replace(/\/$/,"")}async function bw(e={}){try{let t=await x(`${xu(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 ww(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return x(`${xu(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function vw(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)),x(`${xu(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var N2="https://api.beefy.finance";function ku(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||N2).replace(/\/$/,"")}async function xw(e={}){try{let t=await x(`${ku(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 kw(e={},t={}){let n=await x(`${ku(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 Sw(e={}){return x(`${ku(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}L();var R2="https://public-api.birdeye.so";function Ew(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||R2).replace(/\/$/,"")}async function Iw(e={}){try{let t=await x(`${Ew(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 Aw(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 x(`${Ew(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var $2="https://api.celenium.io";function Su(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||$2).replace(/\/$/,"")}async function _w(e={}){try{let t=await x(`${Su(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 Pw(e={}){return x(`${Su(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function Cw(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 x(`${Su(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var M2="https://api.mainnet-beta.solana.com";function F2(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||M2).replace(/\/$/,"")}async function La(e,t,n={}){let r=F2(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 Tw(e={}){try{let t=await La("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 Nw(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 La("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function Ow(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)),La("searchAssets",o,t)}async function Rw(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return La("getAssetProof",{id:n},t)}L();var q2="https://api.l2beat.com";function Eu(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||q2).replace(/\/$/,"")}async function Lw(e={}){try{let t=await x(`${Eu(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 $w(e={},t={}){let n=await x(`${Eu(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 Bw(e={},t={}){return x(`${Eu(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var H2="https://api.spark.fi";function Iu(e={}){return(e.baseUrl||process.env.SPARK_API_URL||H2).replace(/\/$/,"")}async function Mw(e={}){try{return{ok:(await x(`${Iu(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 Fw(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?x(`${Iu(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):x(`${Iu(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var j2="https://api.symbiotic.fi";function Au(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||j2).replace(/\/$/,"")}async function Uw(e={}){try{let t=await x(`${Au(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 qw(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await x(`${Au(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 Dw(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return x(`${Au(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var V2="https://staking-api.polygon.technology/api/v2",G2=18,K2=200,Y2=50,X2=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Pu(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||V2).replace(/\/$/,"")}function J2(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 Q2(e,t=Y2){let n=Number(e??t);return Number.isFinite(n)?Math.min(K2,Math.max(1,Math.trunc(n))):t}function _u(e){let t=Number(e);return Number.isFinite(t)?t/10**G2:null}async function Cu(e,t={}){let n=await x(`${Pu(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 Hw(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:_u(e.totalStaked),selfStakePolApprox:_u(e.selfStake),delegatedStakePolApprox:_u(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function Ww(e={},t={}){let n=await Cu("/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=X2.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=Q2(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(Hw)}}async function jw(e={},t={}){let n=J2(e.id??e.validatorId,"id"),o=(await Cu(`/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:{...Hw(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 zw(e={}){try{let t=await Cu("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Pu(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Pu(e),error:String(t?.message||t),exec:!1}}}L();var eO="https://api.v3.aave.com/graphql",TF=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),tO=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||eO;async function $a(e,t,n={}){let r=await x(tO(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 nO=`query Markets($request: MarketsRequest!) {
|
|
147
147
|
markets(request: $request) {
|
|
148
148
|
name
|
|
149
149
|
address
|
|
@@ -151,7 +151,7 @@ anchor-lang = "0.31.1"
|
|
|
151
151
|
totalMarketSize
|
|
152
152
|
totalAvailableLiquidity
|
|
153
153
|
}
|
|
154
|
-
}`,
|
|
154
|
+
}`,rO=`query Market($request: MarketRequest!) {
|
|
155
155
|
market(request: $request) {
|
|
156
156
|
name
|
|
157
157
|
address
|
|
@@ -184,6 +184,6 @@ anchor-lang = "0.31.1"
|
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
|
-
}`,
|
|
187
|
+
}`,oO=`query Chains($filter: ChainsFilter!) {
|
|
188
188
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
189
|
-
}`;function oO(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 zw(e={},t={}){let n={chainIds:oO(e)};return e.user&&(n.user=String(e.user)),{markets:(await La(tO,{request:n},t))?.data?.markets??[]}}async function Vw(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 La(nO,{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 Gw(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 La(rO,{filter:r},t))?.data?.chains??[]}}async function Kw(e={}){return{ok:(await La("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}L();var aO="https://staking-api.babylonlabs.io";function Tu(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||aO).replace(/\/$/,"")}function $a(e,t={}){return x(`${Tu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function Yw(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 Xw(e={}){try{let n=(await $a("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Tu(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Tu(e),error:String(t?.message||t),exec:!1}}}async function Jw(e={},t={}){let r=(await $a("/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 Qw(e={},t={}){let n=await $a("/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=Yw(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 Zw(e={},t={}){let n=Yw(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 $a(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}L();var cO="https://markets.bisq.network";function Nu(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||cO).replace(/\/$/,"")}function ev(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 Ba(e,t={}){return x(`${Nu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function tv(e={}){try{let t=await Ba("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Nu(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Nu(e),error:String(t?.message||t),exec:!1}}}async function nv(e={},t={}){let n=await Ba("/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 rv(e={},t={}){let n=ev(e.market||e.pair||"btc_usd","market"),r=await Ba(`/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 ov(e={},t={}){let n=ev(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 Ba(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}L();var St=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"}}),uO=new Map([["bob",60808],["rootstock",30],["rsk",30]]),dO=60808;function No(e){if(e==null||e==="")return dO;let t=uO.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!St[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(St).join(", ")} / bob, rootstock)`);return n}function Ou(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=No(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||St[n].url).replace(/\/$/,"")}function iv(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 Ma(e,t,n={}){return x(`${Ou(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function av(e={},t={}){let n;try{n=No(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=St[n];try{let o=await Ma(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Ou(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:Ou(n,e),error:String(o?.message||o),exec:!1}}}async function Ru(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(St).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Ru({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:St[c].name,error:String(l?.message||l)}}}))}}let r=No(n),o=St[r],i=await Ma(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 sv(e={},t={}){let n=No(e.chainId??e.chain),r=iv(e.address||e.addr,"address"),o=St[n],i=await Ma(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 cv(e={},t={}){let n=No(e.chainId??e.chain),r=iv(e.address||e.addr,"address"),o=await Ma(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:St[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}L();var mO="https://insights.braiins.com/api/v1.0";function Lu(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||mO).replace(/\/$/,"")}function $u(e,t={}){return x(`${Lu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function lv(e={}){try{let t=await $u("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Lu(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Lu(e),error:String(t?.message||t),exec:!1}}}async function uv(e={},t={}){let n=await $u("/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 dv(e={},t={}){let n=await $u("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:a.length,pools:a.slice(0,s).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:a.slice(0,s)}}L();var hO="https://api.cow.fi",pv=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function mv(e={}){return(e.baseUrl||process.env.COW_API_URL||hO).replace(/\/$/,"")}function gO(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=pv[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(pv).join(", ")})`);return n}function Bu(e,t,n){return`${mv(n)}/${gO(e)}/api/v1${t}`}function fv(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 hv(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function gv(e={},t={}){return x(Bu(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yv(e={},t={}){let n=fv(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(hv(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await x(`${Bu(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 bv(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",fv(e.owner||e.address||e.user,"owner"));let r=await x(`${Bu(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,hv(e))}}async function wv(e={}){let t=await x(`${mv(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}L();var bO="https://api.hiro.so",wO=20;function Mu(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||bO).replace(/\/$/,"")}function vO(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Oo(e,t={}){return x(`${Mu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:vO(t)})}async function vv(e={}){try{let t=await Oo("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Mu(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:wO,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Mu(e),error:String(t?.message||t),exec:!1}}}async function xv(e={},t={}){let n=await Oo("/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 kv(e={},t={}){let n=await Oo("/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 Sv(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Oo(`/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 Ev(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Oo(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}L();var kO="https://bundles.jito.wtf",Av=1e9;function Fu(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||kO).replace(/\/$/,"")}function SO(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function Iv(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*Av):null}function EO(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/Av:null,raw:e}}async function _v(e={}){try{let t=await x(`${Fu(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 Pv(e={},t={}){let n=SO(e.limit,5,100),r=new URL(`${Fu(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 x(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(EO),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 Cv(e={}){let t=await x(`${Fu(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,Iv(i)])),suggestedTipLamports:Iv(r.p75||r.p50),raw:n}}L();var AO="https://api.kamino.finance";function _O(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||AO).replace(/\/$/,"")}function De(e){let t=Number(e);return Number.isFinite(t)?t:null}function Tv(e={}){let t=De(e.totalValueLocked)??0,n=De(e.apy?.totalApy)??0,r=De(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:De(e.sharePrice),sharesIssued:De(e.sharesIssued),profitAndLoss:De(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:De(e.apy?.vault?.totalApr),apy24h:De(e.kaminoApy?.vault?.apy24h),apy7d:De(e.kaminoApy?.vault?.apy7d),apy30d:De(e.kaminoApy?.vault?.apy30d),poolPrice:De(e.apy?.vault?.poolPrice),priceLower:De(e.apy?.vault?.priceLower),priceUpper:De(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Uu(e={},t={}){let n=new URL(`${_O(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function Nv(e={}){try{let t=await Uu({},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 Ov(e={},t={}){let r=(await Uu(e,t)).map(Tv),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 Rv(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Uu({...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",...Tv(o),raw:o}}L();var CO="https://blockstream.info/liquid/api",Lv="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Fa(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||CO).replace(/\/$/,"")}function TO(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 NO(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 $v(e,t={}){let n=`${Fa(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 Bv(e,t={}){return x(`${Fa(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Mv(e={}){try{let t=await $v("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Fa(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Fa(e),error:String(t?.message||t),exec:!1}}}async function Fv(e={},t={}){let n=await $v("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function Uv(e={},t={}){let n=TO(e.address||e.addr,"address"),r=await Bv(`/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 qv(e={},t={}){let n=NO(e.assetId||e.asset||Lv,"assetId"),r=await Bv(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Lv,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}L();var RO="https://api-mainnet.magiceden.dev/v2/ord/btc",LO=600;function qu(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||RO).replace(/\/$/,"")}function $O(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Dv(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 Hv(e,t={}){return x(`${qu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:$O(t),retries:t.retries??1})}async function Wv(e={}){let t=Dv(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Hv(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:qu(e),probeCollection:t,rateLimitRpm:LO,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:qu(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 jv(e={},t={}){let n=Dv(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Hv(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}L();var MO="https://mempool.space/api",FO=7;function Du(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||MO).replace(/\/$/,"")}function Ua(e,t={}){return x(`${Du(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function zv(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>FO}}async function Vv(e={}){try{let n=(await Ua("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=zv(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Du(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:Du(e),error:String(t?.message||t),exec:!1}}}async function Gv(e={},t={}){let r=(await Ua("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=zv(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 Kv(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 Ua(`/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 Yv(e={},t={}){let n=await Ua("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}L();var qO="https://mempool.space/api",Xv=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Hu(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||qO).replace(/\/$/,"")}function Jv(e,t){let n=String(e||t).trim().toLowerCase();if(!Xv.has(n))throw new Error(`mempool-mining: window must be one of ${[...Xv].join(", ")}`);return n}function Ro(e,t={}){return x(`${Hu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Qv(e={}){try{let t=await Ro("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Hu(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Hu(e),error:String(t?.message||t),exec:!1}}}async function Zv(e={},t={}){let n=await Ro("/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 ex(e={},t={}){let n=Jv(e.window||e.timeframe,"1w"),r=await Ro(`/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 tx(e={},t={}){let n=Jv(e.window||e.timeframe,"3d"),r=await Ro(`/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 nx(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Ro(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}L();var HO="https://amm-v2.meteora.ag",rx=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),ox=new Set(["dynamic","multitoken","lst","farms"]),WO=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function jO(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||HO).replace(/\/$/,"")}function Te(e){let t=Number(e);return Number.isFinite(t)?t:null}function zO(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:Te(e.pool_lp_price_in_usd),tvlUsd:Te(e.pool_tvl),farmTvlUsd:Te(e.farm_tvl),volume24hUsd:Te(e.trading_volume),volume7dUsd:Te(e.weekly_trading_volume),fee24hUsd:Te(e.fee_volume),fee7dUsd:Te(e.weekly_fee_volume),tradeApyPct:Te(e.trade_apy),weeklyTradeApyPct:Te(e.weekly_trade_apy),baseApyPct:Te(e.daily_base_apy),farmingApyPct:Te(e.farming_apy),totalApyPct:(Te(e.trade_apy)??0)+(Te(e.farming_apy)??0),aprPct:Te(e.apr),feePct:Te(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 VO(e={},t={}){let n=new URL(`${jO(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(!rx.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...rx].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(!ox.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...ox].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(!WO.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 Wu(e={},t={}){let{url:n,page:r,size:o}=VO(e,t),i=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(zO),totalCount:i?.total_count??null,page:r,size:o}}async function ix(e={}){try{let{pools:t,totalCount:n}=await Wu({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 ax(e={},t={}){let n=await Wu({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 sx(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 Wu({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}L();var KO="https://ordinals.com";function qa(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||KO).replace(/\/$/,"")}function YO(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 cx(e,t={}){let n=`${qa(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 ju(e,t={}){return x(`${qa(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function lx(e={}){try{let t=await cx("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:qa(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:qa(e),error:String(t?.message||t),exec:!1}}}async function ux(e={},t={}){let n=await cx("/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 dx(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 ju(`/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 px(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 ju(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 mx(e={},t={}){let n=YO(e.name||e.rune||e.runeName,"name"),r=await ju(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}L();var JO="https://hermes.pyth.network",Vu={"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"},QO=/^[0-9a-fA-F]{64}$/;function fx(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||JO).replace(/\/$/,"")}function hx(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Vu[n.toUpperCase()]||Vu[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!QO.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 zu(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Gu(e={}){let t=zu({price:Number(e.price?.conf),expo:e.price?.expo}),n=zu(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:zu(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 Ku(e,t={}){let n=new URL(`${fx(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"),x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function gx(e={}){try{let t=await Ku([Vu["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Gu):[])[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 yx(e={},t={}){let n=hx(e.feedId||e.id||e.symbol,"feedId"),r=await Ku([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Gu):[],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 bx(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>hx(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 Ku(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Gu):[]),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 wx(e={},t={}){let n=new URL(`${fx(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 x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}L();var eR="https://relayscan.io",vx=new Set(["1h","12h","24h","7d"]);function Yu(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||eR).replace(/\/$/,"")}function xx(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!vx.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...vx].join(", ")}`);return t}function tR(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 Xu(e={},t={}){return x(`${Yu(t)}/overview/json?t=${xx(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function kx(e={},t={}){return x(`${Yu(t)}/builder-profit/json?t=${xx(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Sx(e={},t={}){let n=tR(e);return x(`${Yu(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function Ex(e={}){let t=await Xu({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}L();var rR="https://extra-api.sanctum.so",oR=30,iR=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Ju(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||rR).replace(/\/$/,"")}function Ix(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 aR(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function vn(e,t,n={}){let r={},o={};for(let i of aR(t,oR)){let a=new URL(`${Ju(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await x(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 Ax(e={}){try{let[t,n]=await Promise.all([x(`${Ju(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),vn("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 Qu(e={},t={}){let n=await x(`${Ju(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 _x(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Qu({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=iR);let r=[...new Set(n.map(s=>Ix(s,"lsts[]")))],[o,i]=await Promise.all([vn("apy/latest",r,t),vn("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 Px(e={},t={}){let n=Ix(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([vn("apy/latest",[n],t),vn("apy/inception",[n],t),vn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),vn("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}L();var cR="https://api.save.finance",lR="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",Cx="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",uR=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Zu(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||cR).replace(/\/$/,"")}function Tx(e,t="address"){let n=String(e??"").trim();if(!uR.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function Nx(e){let t=Number(e);return Number.isFinite(t)?t:null}function dR(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 pR(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:Nx(e.rates?.supplyInterest),borrowApyPct:Nx(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 Ox(e={}){try{let t=await x(`${Zu(e)}/v1/reserves?ids=${Cx}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:Cx,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function ed(e={},t={}){let n=new URL(`${Zu(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 x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(dR);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 Rx(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=>Tx(String(s).trim(),"reserve"));else{let a=Tx(e.market||e.marketAddress||lR,"market"),c=(await ed({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 x(`${Zu(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...pR(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 td(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 xn(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 Lo(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:td(e.amount,"amount")}}function nd(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 $o(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 rd(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 fR(e={},t={}){let n=Lo(e),r=xn(e.slices??10,"slices",2,100),o=xn(e.durationSec??3600,"durationSec",r,604800),i=nd(n.total,Array(r).fill(1));return $o(n,"TWAP",rd(i,o,t.nowMs),{durationSec:o})}function hR(e={},t={}){let n=Lo(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=xn(e.durationSec??3600,"durationSec",r.length,604800),i=nd(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=rd(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return $o(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function gR(e={}){let t=Lo(e),n=xn(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=td(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 $o(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function yR(e={}){let t=Lo(e),n=td(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 $o(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function bR(e={},t={}){let n=Lo(e),r=xn(e.slices??10,"slices",2,100),o=xn(e.durationSec??3600,"durationSec",r,604800),i=xn(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=nd(n.total,a);return $o(n,"IS",rd(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Lx(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return fR(e,t);if(n==="VWAP")return hR(e,t);if(n==="POV")return gR(e,t);if(n==="ICEBERG")return yR(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return bR(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function $x(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var Dx=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 Ux(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:mu,adapters:Object.freeze(fu.adapters.map(e=>{let t=Dx[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function $R(e,t={}){let n=Tb(e,t),r=Dx[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new re(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var BR={"hl-info":{health:e=>_p(e),allMids:e=>ft(e),l2Book:(e,t={})=>An(t.coin,e),outcomeMeta:e=>Nr(e),clearinghouse:(e,t={})=>ai(t.user,e),userFills:(e,t={})=>Pp(t.user,e),meta:e=>Cp(e),metaAndAssetCtxs:e=>je(e),candleSnapshot:(e,t={})=>si(t,e),openOrders:(e,t={})=>Np(t.user,e),frontendOpenOrders:(e,t={})=>Op(t.user,e),userState:(e,t={})=>_n(t.user,e),spotMeta:e=>ci(e)},"hl-vaults":{health:e=>$p(e),summaries:(e,t={})=>Rs(t,e),details:(e,t={})=>li(t,e),userEquities:(e,t={})=>Ls(t,e),tracker:(e,t={})=>$s(t,e)},"hl-precompiles":{health:e=>Mp(e),read:(e,t={})=>Bp(t,e),l1BlockNumber:e=>ui(e),markPx:(e,t={})=>Fs(t,e),oraclePx:(e,t={})=>Us(t,e),spotPx:(e,t={})=>qs(t,e),position:(e,t={})=>Ds(t,e),spotBalance:(e,t={})=>Hs(t,e),vaultEquity:(e,t={})=>Ws(t,e),withdrawable:(e,t={})=>js(t,e)},"hl-delta-neutral":{health:()=>im(),scan:(e,t={})=>dc(t,e),quote:(e,t={})=>pc(t,e),prepare:(e,t={})=>mc(t,e),loop:(e,t={})=>pm(t,e)},"lighter-delta-neutral":{health:()=>wm(),scan:(e,t={})=>hc(t,e),quote:(e,t={})=>gc(t,e),prepare:(e,t={})=>yc(t,e),loop:(e,t={})=>_m(t,e)},"poly-public":{health:e=>Cm(e),time:e=>bc(e),markets:(e,t={})=>Tm(t,e),book:(e,t={})=>Nm(t.tokenId,e),midpoint:(e,t={})=>Om(t.tokenId,e),spread:(e,t={})=>Rm(t.tokenId,e),price:(e,t={})=>Lm(t.tokenId,{side:t.side},e),events:(e,t={})=>$m(t,e)},"evm-rpc":{health:(e,t={})=>kn(t.chainId??1,e),healthAll:(e,t={})=>os({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>yr(t.chainId??1,e),chainId:(e,t={})=>ns(t.chainId??1,e),getBalance:(e,t={})=>Yt(t.chainId??1,t.address,e),call:(e,t={})=>M(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>rs(t,e),erc20Balance:(e,t={})=>br(t,e),transactionReceipt:(e,t={})=>wr(t,e)},portfolio:{health:e=>Ey(e),balances:(e,t={})=>ya(t,e),snapshot:(e,t={})=>Wy(t,e),history:(e,t={})=>Jl(t,e),valueGraph:(e,t={})=>jy(t,e)},"nft-portfolio":{health:e=>Ny(e),inventory:(e,t={})=>tr(t,e),gallery:(e,t={})=>$y(t,e),pnl:(e,t={})=>Ly(t,e),prepareList:(e,t={})=>Oy(t,e),traitSnipe:(e,t={})=>Ry(t,e)},"contract-risk":{health:e=>zy(e),scan:(e,t={})=>hn(t,e)},"evm-token-sniper":{health:e=>Ky(e),scan:(e,t={})=>Gy(t,e)},"evm-simulate":{health:e=>Xy(e),simulate:(e,t={})=>Io(t,e)},"nft-mint":{health:e=>Qy(e),discover:(e,t={})=>Sa(t,e),prepare:(e,t={})=>eu(t,e),priceGas:(e,t={})=>ka(t,e),createTrigger:(e,t={})=>Xb(t,e),checkOpen:(e,t={})=>Jb(t,e),evaluateMancerOs:(e,t={})=>ew(t,e)},"universal-mint-router":{health:()=>Sb(),capabilities:()=>du(),prepare:(e,t={})=>Eb(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:Ux()}),capabilities:()=>Ux(),route:(e,t={})=>$R(t,e)},"erc8004-identity":{health:()=>Gh(),prepareIdentityRegistration:(e,t={})=>Xh(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Jh(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Zh(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:Pa,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Rb(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:Ca,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Fb(t,e)},"universal-ordinals-transfer":{health:()=>({provider:Ta,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Yb(t,e)},"solana-rpc":{health:e=>Mm(e),latestBlockhash:(e,t={})=>vc(t,e),getBalance:(e,t={})=>xi(t,e),tokenAccounts:(e,t={})=>jr(t,e),simulate:(e,t={})=>Fm(t,e)},"bitcoin-esplora":{health:e=>Um(e),tipHeight:e=>qm(e),fees:e=>Dm(e),address:(e,t={})=>Si(t,e),utxos:(e,t={})=>Hm(t,e),tx:(e,t={})=>Wm(t,e),decode:(e,t={})=>jm(t,e)},"bitcoin-meta":{health:e=>Vm(e),runeBalances:(e,t={})=>Ii(t,e),inscriptions:(e,t={})=>$n(t,e),inscriptionInfo:(e,t={})=>Gm(t,e),inscriptionChildren:(e,t={})=>Km(t,e),ordBlockInfo:(e,t={})=>Ym(t,e)},satflow:{health:e=>Jm(e),collectionFloors:(e,t={})=>Qm(t,e),collectionStats:(e,t={})=>Zm(t,e),item:(e,t={})=>ef(t,e),walletContents:(e,t={})=>_i(t,e),floorListings:(e,t={})=>tf(t,e),preparePurchase:(e,t={})=>rf(t,e),prepareList:(e,t={})=>Pi(t,e)},jupiter:{health:e=>pf(e),venues:(e,t={})=>df(t,e),quote:(e,t={})=>Ni(t,e),prepare:(e,t={})=>mf(t,e)},defillama:{health:e=>hf(e),prices:(e,t={})=>an(t.coins||[],e),pricesBySymbol:(e,t={})=>wf(t.symbols,e),protocols:e=>gf(e),yields:(e,t={})=>yf(t,e),stablecoins:(e,t={})=>Oi(t,e),dexVolumes:(e,t={})=>bf(t,e)},lifi:{health:e=>xf(e),quote:(e,t={})=>Vr(t,e),prepare:(e,t={})=>kf(t,e),chains:e=>Sf(e)},dexscreener:{health:e=>yd(e),token:(e,t={})=>Xt(t.address||t.tokenAddress,e),search:(e,t={})=>vr(t.q||t.query,e),pair:(e,t={})=>bd(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Od({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Sn(t,e),prepare:(e,t={})=>Nd(t,e),quotePath:(e,t={})=>Td(t,e),ethUsdc:(e,t={})=>ms(t,e),chains:()=>Rd()},"uniswap-v4":{health:(e,t={})=>Dd({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Go(t,e),chains:()=>qd()},aerodrome:{health:(e,t={})=>Nf({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Ri(t,e),prepare:(e,t={})=>Tf(t,e),chains:()=>Of()},zerox:{health:e=>Bf(e),price:(e,t={})=>Lc(t,e),quote:(e,t={})=>Kr(t,e),prepare:(e,t={})=>Mf(t,e)},across:{health:e=>Ff(e),suggestedFees:(e,t={})=>$c(t,e)},hop:{health:e=>Uf(e),quote:(e,t={})=>Bc(t,e)},relay:{health:e=>qf(e),quote:(e,t={})=>$i(t,e),prepare:(e,t={})=>Df(t,e)},cowswap:{health:e=>Vf(e),quote:(e,t={})=>Bn(t,e),prepareOrder:(e,t={})=>Gf(t,e),order:(e,t={})=>Yf(t,e),status:(e,t={})=>Kf(t,e),chains:()=>Xf()},oneinch:{health:e=>Qf(e),quote:(e,t={})=>Wc(t,e),prepare:(e,t={})=>Zf(t,e),approveSpender:(e,t={})=>jc(t,e)},"hl-ws":{health:e=>eh(e),allMids:e=>th(e),l2Book:(e,t={})=>nh(t.coin,e),snapshot:(e,t={})=>Jr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>rh({...e,assetId:t.assetId}),book:(e,t={})=>oh(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Mi(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>ep(e),collection:(e,t={})=>Ir(t.slug,e),floor:(e,t={})=>tp(t.slug,e),bestListings:(e,t={})=>ws(t,e),bestListing:(e,t={})=>Qo(t,e),bestOffer:(e,t={})=>Zo(t,e),accountNfts:(e,t={})=>Ar(t,e),accountPnl:(e,t={})=>Xo(t,e),prepareBuy:(e,t={})=>mp(t,e),prepareSweep:(e,t={})=>fp(t,e),prepareMint:(e,t={})=>ti(t,e),prepareList:(e,t={})=>ni(t,e),prepareCancel:(e,t={})=>hp(t,e)},"anvil-nft":{health:(e,t={})=>Hh(t,e),markets:(e,t={})=>Un(t,e),quoteSpecificBuy:(e,t={})=>Zr(t,e),quoteSell:(e,t={})=>qi(t,e),scanCollection:(e,t={})=>Di(t,e),scanAllMarkets:(e,t={})=>Lh(t,e),scanCrossVenueArb:(e,t={})=>Jc(t,e),scanAllMarketsArb:(e,t={})=>$h(t,e),prepareSpecificBuy:(e,t={})=>_h(t,e),prepareSell:(e,t={})=>Ph(t,e)},stonkbrokers:{health:(e,t={})=>Wh(t,e),quoteBrokerBuy:(e,t={})=>Hi(t,e),scanBrokerLoot:(e,t={})=>Fh(t,e),prepareBrokerBuy:(e,t={})=>Uh(t,e),brokerDesk:(e,t={})=>Dh(t,e),clockInStatus:(e,t={})=>eo(t,e),prepareClockIn:(e,t={})=>qh(t,e)},"hl-outcome":{list:e=>z0(e),prepareOrder:(e,t={})=>V0(t,e),prepareCancel:(e,t={})=>G0(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:aa().map(e=>e.id),nativeTemplates:yo().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>aa(),listNative:()=>yo(),gate:(e,t={})=>ho(t.templateId||t.id,e),prepareDeploy:(e,t={})=>vg(t,e),buildNative:(e,t={})=>bo(t),eval:async()=>(await Promise.resolve().then(()=>(Fx(),Mx))).runContractsEval()},"poly-clob":{health:()=>ag(),prepareOrder:(e,t={})=>sg(t||{},e)},"hl-perps":{health:e=>pl(e),assetInfo:(e,t={})=>Nt(t,e),prepareOrder:(e,t={})=>Nn(t,e),prepareCancel:(e,t={})=>qr(t,e),prepareLeverage:(e,t={})=>sc(t,e),prepareIsolatedMargin:(e,t={})=>cc(t,e),prepareBracket:(e,t={})=>lc(t,e),prepareBuilderApproval:(e,t={})=>ac(t,e)},"hl-markets":{health:e=>pl(e),markets:(e,t={})=>Ki(t,e),leaderboards:(e,t={})=>w0(t,e),coin:(e,t={})=>v0(t,e),spot:(e,t={})=>x0(t,e)},"hl-entry-state":{health:e=>D0(e),see:(e,t={})=>co(t,e),qualify:(e,t={})=>H0(t,e),lock:(e,t={})=>W0(t,e),list:e=>hl(e),watch:(e,t={})=>j0(t,e)},"magiceden-sol":{health:e=>i0(e),stats:(e,t={})=>ol(t,e),listings:(e,t={})=>s0(t,e),tokenListings:(e,t={})=>c0(t,e),prepareBuy:(e,t={})=>l0(t,e),prepareList:(e,t={})=>Vi(t,e),prepareMint:(e,t={})=>u0(t,e)},"hl-staking":{health:e=>p0(e),validators:e=>sl(e),delegatorSummary:(e,t={})=>cl(t,e),delegations:(e,t={})=>ll(t,e),rewards:(e,t={})=>m0(t,e),history:(e,t={})=>f0(t,e),preflight:(e,t={})=>b0(t,e),prepareStakeDeposit:(e,t={})=>h0(t,e),prepareStakeWithdraw:(e,t={})=>g0(t,e),prepareDelegate:(e,t={})=>y0(t,e)},"hyperevm-dex":{health:e=>t0(e),search:(e,t={})=>n0(t.q||t.query||"HYPE",e),token:(e,t={})=>r0(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Ng(e),networks:(e,t={})=>_l(t,e),pool:(e,t={})=>Pg(t,e),token:(e,t={})=>Cg(t,e),ohlcv:(e,t={})=>Tg(t,e)},curve:{health:e=>jg(e),openapi:e=>Wg(e),pools:(e,t={})=>Cl(t,e),quote:(e,t={})=>Tl(t,e),prepare:(e,t={})=>zg(t,e)},gmx:{health:e=>O0(e),tickers:(e,t={})=>Yn(t,e),markets:(e,t={})=>T0(t,e),marketsInfo:(e,t={})=>fl(t,e),tokens:(e,t={})=>N0(t,e),prepareOrder:(e,t={})=>B0(t,e),positions:(e,t={})=>R0(t,e),orderStatus:(e,t={})=>L0(t,e),verifyOrder:(e,t={})=>$0(t,e)},morpho:{health:e=>Yg(e),markets:(e,t={})=>Kg(t,e),vaults:(e,t={})=>Rl(t,e),prepareVault:(e,t={})=>Xg(t,e)},balancer:{health:e=>oy(e),pools:(e,t={})=>ry(t,e),quote:(e,t={})=>Bl(t,e),prepare:(e,t={})=>iy(t,e)},pendle:{health:e=>sy(e),markets:(e,t={})=>Fl(t,e),quote:(e,t={})=>cy(t,e),prepare:(e,t={})=>Ul(t,e)},odos:{health:e=>py(e),chains:e=>Dl(e),quote:(e,t={})=>uy(t,e),prepare:(e,t={})=>dy(t,e)},blockscout:{health:e=>vy(e),stats:(e,t={})=>jl(t,e),address:(e,t={})=>gy(t,e),token:(e,t={})=>yy(t,e)},paraswap:{health:e=>nw(e),tokens:(e,t={})=>bu(t,e),price:(e,t={})=>dr(t,e),quote:(e,t={})=>dr(t,e),prepare:(e,t={})=>tw(t,e)},rfq:{health:e=>gw(e),intent:(e,t={})=>fw(t,e),quote:(e,t={})=>hw(t,e)},"polygon-staking":{health:e=>jw(e),validators:(e,t={})=>Hw(t,e),validatorDetail:(e,t={})=>Ww(t,e)},"aave-v3":{health:e=>Kw(e),markets:(e,t={})=>zw(t,e),marketReserves:(e,t={})=>Vw(t,e),chains:e=>Gw(e)},"babylon-staking":{health:e=>Xw(e),stats:e=>Jw(e),finalityProviders:e=>Qw(e),delegations:(e,t={})=>Zw(t,e)},"bisq-markets":{health:e=>tv(e),markets:e=>nv(e),ticker:(e,t={})=>rv(t,e),trades:(e,t={})=>ov(t,e)},"bob-rootstock":{health:(e,t={})=>av(t.chainId,e),stats:(e,t={})=>Ru(t,e),addressInfo:(e,t={})=>sv(t,e),tokenBalances:(e,t={})=>cv(t,e)},"braiins-insights":{health:e=>lv(e),priceStats:e=>uv(e),poolStats:e=>dv(e)},"cow-protocol":{health:e=>wv(e),auction:e=>gv(e),openOrders:(e,t={})=>yv(t,e),recentTrades:(e,t={})=>bv(t,e)},"hiro-stacks":{health:e=>vv(e),networkInfo:e=>xv(e),stackingInfo:e=>kv(e),poxCycles:e=>Sv(e),blocks:(e,t={})=>Ev(t,e)},"jito-mev":{health:e=>_v(e),recentBundles:(e,t={})=>Pv(t,e),tipFloor:e=>Cv(e)},"kamino-strategies":{health:e=>Nv(e),strategies:(e,t={})=>Ov(t,e),strategyMetrics:(e,t={})=>Rv(t,e)},"liquid-esplora":{health:e=>Mv(e),tipHeight:e=>Fv(e),addressInfo:(e,t={})=>Uv(t,e),assetInfo:(e,t={})=>qv(t,e)},"magiceden-ordinals":{health:e=>Wv(e),collectionStat:(e,t={})=>jv(t,e)},"mempool-lightning":{health:e=>Vv(e),statistics:e=>Gv(e),nodeRankings:(e,t={})=>Kv(t,e),nodeCountries:e=>Yv(e)},"mempool-mining":{health:e=>Qv(e),difficulty:e=>Zv(e),poolShare:(e,t={})=>ex(t,e),hashrate:(e,t={})=>tx(t,e),rewardStats:(e,t={})=>nx(t,e)},"meteora-dlmm":{health:e=>ix(e),pools:(e,t={})=>ax(t,e),poolSearch:(e,t={})=>sx(t,e)},"ordinals-runes":{health:e=>lx(e),blockHeight:e=>ux(e),blockInfo:(e,t={})=>dx(t,e),satInfo:(e,t={})=>px(t,e),runeInfo:(e,t={})=>mx(t,e)},"pyth-price-feeds":{health:e=>gx(e),latestPrice:(e,t={})=>yx(t,e),latestPrices:(e,t={})=>bx(t,e),feedDirectory:e=>wx(e)},"relayscan-mev":{health:e=>Ex(e),overview:(e,t={})=>Xu(t,e),builderProfit:(e,t={})=>kx(t,e),dailyStats:(e,t={})=>Sx(t,e)},"sanctum-lst":{health:e=>Ax(e),lstList:e=>Qu(e),apyAll:e=>_x(e),apyIndividual:(e,t={})=>Px(t,e)},"solend-lending":{health:e=>Ox(e),markets:e=>ed(e),reserves:(e,t={})=>Rx(t,e)},"execution-strategies":{health:()=>$x(),plan:(e,t={})=>Lx(t)},"across-bridge":{health:e=>yw(e),pools:(e,t={})=>bw(t,e),suggestedFees:(e,t={})=>ww(t,e)},"beefy-yields":{health:e=>vw(e),apy:(e,t={})=>xw(t,e),apyBreakdown:e=>kw(e)},"birdeye-tokens":{health:e=>Ew(e),tokenList:(e,t={})=>Iw(t,e)},"celestia-da":{health:e=>Aw(e),stats:e=>_w(e),blockStats:(e,t={})=>Pw(t,e)},"das-assets":{health:e=>Cw(e),assetsByOwner:(e,t={})=>Tw(t,e),searchAssets:(e,t={})=>Nw(t,e),assetProof:(e,t={})=>Ow(t,e)},"l2beat-tvl":{health:e=>Rw(e),tvl:(e,t={})=>Lw(t,e),activity:(e,t={})=>$w(t,e)},"spark-lend":{health:e=>Bw(e),markets:(e,t={})=>Mw(t,e)},"symbiotic-restaking":{health:e=>Fw(e),vaults:(e,t={})=>Uw(t,e),vaultDetail:(e,t={})=>qw(t,e)}},qx=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Hx=new Set(["hl-exec"]);function MR(e){return Hx.has(String(e||""))}function FR(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Hx.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ii().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!qx.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(qx.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 S(e,t,n={},r={}){if(MR(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.`);FR(e,t,n);let o=Cs(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=BR[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function UR({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||ii().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)=>S(d,"health",p,f),u={};return await Ne(s,i??8,async d=>{if(!Cs(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},f=await ge(()=>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 Wx(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function qR(e){return e.execution==="prepare"&&Wx(e).length?"armed-local":e.execution||"read-only"}function DR(){return ii().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:qR(e),localSignerSurfaces:Wx(e),description:e.description}))}var a4={catalog:DR,health:UR,call:S,hl:{health:e=>S("hl-info","health",{},e),allMids:e=>S("hl-info","allMids",{},e),l2Book:(e,t)=>S("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>S("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>S("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>S("hl-info","userFills",{user:e},t),meta:e=>S("hl-info","meta",{},e),metaAndAssetCtxs:e=>S("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>S("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>S("hl-info","openOrders",{user:e},t),userState:(e,t)=>S("hl-info","userState",{user:e},t),spotMeta:e=>S("hl-info","spotMeta",{},e),vaults:{health:e=>S("hl-vaults","health",{},e),summaries:(e,t)=>S("hl-vaults","summaries",e||{},t),details:(e,t)=>S("hl-vaults","details",e||{},t),mine:(e,t)=>S("hl-vaults","userEquities",{user:e},t),track:(e,t)=>S("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>S("hl-entry-state","see",e||{},t),qualify:(e,t)=>S("hl-entry-state","qualify",e||{},t),lock:(e,t)=>S("hl-entry-state","lock",e||{},t),list:e=>S("hl-entry-state","list",{},e),watch:(e,t)=>S("hl-entry-state","watch",e||{},t)},staking:{health:e=>S("hl-staking","health",{},e),validators:e=>S("hl-staking","validators",{},e),summary:(e,t)=>S("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>S("hl-staking","delegations",{user:e},t),rewards:(e,t)=>S("hl-staking","rewards",{user:e},t),history:(e,t)=>S("hl-staking","history",{user:e},t),preflight:(e,t)=>S("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>S("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>S("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>S("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>S("poly-public","health",{},e),time:e=>S("poly-public","time",{},e),markets:(e,t)=>S("poly-public","markets",e||{},t),book:(e,t)=>S("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>S("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>S("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>S("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>S("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>S("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>S("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>S("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>S("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>S("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>S("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>S("evm-token-sniper","health",{},e),scan:(e,t)=>S("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>S("portfolio","balances",e||{},t),snapshot:(e,t)=>S("portfolio","snapshot",e||{},t),history:(e,t)=>S("portfolio","history",e||{},t),valueGraph:(e,t)=>S("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>S("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>S("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>S("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>S("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>S("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>S("opensea-nft","floor",{slug:e},t),collection:(e,t)=>S("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>S("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>S("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>S("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>S("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>S("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>S("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>S("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>S("universal-mint-router","health",{},e),capabilities:e=>S("universal-mint-router","capabilities",{},e),prepare:(e,t)=>S("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>S("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>S("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>S("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>S("solana-rpc","health",{},e),latestBlockhash:(e,t)=>S("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>S("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>S("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>S("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>S("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>S("jupiter","prepare",e||{},t),nftStats:(e,t)=>S("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>S("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>S("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>S("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>S("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>S("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>S("bitcoin-esplora","health",{},e),tipHeight:e=>S("bitcoin-esplora","tipHeight",{},e),fees:e=>S("bitcoin-esplora","fees",{},e),address:(e,t)=>S("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>S("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>S("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>S("bitcoin-esplora","decode",e||{},t),metaHealth:e=>S("bitcoin-meta","health",{},e),runeBalances:(e,t)=>S("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>S("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>S("satflow","health",{},e),satflowFloors:(e,t)=>S("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>S("satflow","walletContents",{address:e},t)},prices:{health:e=>S("defillama","health",{},e),current:(e,t)=>S("defillama","prices",{coins:e},t),bySymbol:(e,t)=>S("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>S("defillama","protocols",{},e)},lifi:{health:e=>S("lifi","health",{},e),quote:(e,t)=>S("lifi","quote",e||{},t),chains:e=>S("lifi","chains",{},e)},dex:{health:e=>S("dexscreener","health",{},e),token:(e,t)=>S("dexscreener","token",{address:e},t),search:(e,t)=>S("dexscreener","search",{q:e},t),pair:(e,t,n)=>S("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>S("uniswap-v3","health",e||{},t),quote:(e,t)=>S("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>S("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>S("uniswap-v3","ethUsdc",e||{},t),chains:e=>S("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>S("uniswap-v4","health",e||{},t),quote:(e,t)=>S("uniswap-v4","quote",e||{},t),chains:e=>S("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>S("across","suggestedFees",e||{},t),hop:(e,t)=>S("hop","quote",e||{},t),relay:(e,t)=>S("relay","quote",e||{},t)},cow:{quote:(e,t)=>S("cowswap","quote",e||{},t)},hlWs:{allMids:e=>S("hl-ws","allMids",{},e),l2Book:(e,t)=>S("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>S("poly-ws","book",{assetId:e},t)}};export{Hx as EXECUTION_PROVIDERS,FR as assertDataOpAllowed,a4 as data,S as dataCall,DR as dataCatalog,UR as dataHealth,MR as isExecutionProvider,$R as routeUniversalNftLifecycle,Ux as universalNftLifecycleCapabilities};
|
|
189
|
+
}`;function iO(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 Vw(e={},t={}){let n={chainIds:iO(e)};return e.user&&(n.user=String(e.user)),{markets:(await $a(nO,{request:n},t))?.data?.markets??[]}}async function Gw(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 $a(rO,{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 Kw(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 $a(oO,{filter:r},t))?.data?.chains??[]}}async function Yw(e={}){return{ok:(await $a("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}L();var sO="https://staking-api.babylonlabs.io";function Tu(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||sO).replace(/\/$/,"")}function Ba(e,t={}){return x(`${Tu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function Xw(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 Jw(e={}){try{let n=(await Ba("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Tu(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Tu(e),error:String(t?.message||t),exec:!1}}}async function Qw(e={},t={}){let r=(await Ba("/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 Zw(e={},t={}){let n=await Ba("/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=Xw(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 ev(e={},t={}){let n=Xw(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 Ba(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}L();var lO="https://markets.bisq.network";function Nu(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||lO).replace(/\/$/,"")}function tv(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 Ma(e,t={}){return x(`${Nu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function nv(e={}){try{let t=await Ma("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Nu(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Nu(e),error:String(t?.message||t),exec:!1}}}async function rv(e={},t={}){let n=await Ma("/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 ov(e={},t={}){let n=tv(e.market||e.pair||"btc_usd","market"),r=await Ma(`/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 iv(e={},t={}){let n=tv(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 Ma(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}L();var Et=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"}}),dO=new Map([["bob",60808],["rootstock",30],["rsk",30]]),pO=60808;function Oo(e){if(e==null||e==="")return pO;let t=dO.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Et[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Et).join(", ")} / bob, rootstock)`);return n}function Ou(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Oo(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Et[n].url).replace(/\/$/,"")}function av(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 Fa(e,t,n={}){return x(`${Ou(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function sv(e={},t={}){let n;try{n=Oo(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Et[n];try{let o=await Fa(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Ou(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:Ou(n,e),error:String(o?.message||o),exec:!1}}}async function Ru(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Et).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Ru({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Et[c].name,error:String(l?.message||l)}}}))}}let r=Oo(n),o=Et[r],i=await Fa(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 cv(e={},t={}){let n=Oo(e.chainId??e.chain),r=av(e.address||e.addr,"address"),o=Et[n],i=await Fa(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 lv(e={},t={}){let n=Oo(e.chainId??e.chain),r=av(e.address||e.addr,"address"),o=await Fa(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:Et[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}L();var fO="https://insights.braiins.com/api/v1.0";function Lu(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||fO).replace(/\/$/,"")}function $u(e,t={}){return x(`${Lu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function uv(e={}){try{let t=await $u("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Lu(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Lu(e),error:String(t?.message||t),exec:!1}}}async function dv(e={},t={}){let n=await $u("/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 pv(e={},t={}){let n=await $u("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:a.length,pools:a.slice(0,s).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:a.slice(0,s)}}L();var gO="https://api.cow.fi",mv=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function fv(e={}){return(e.baseUrl||process.env.COW_API_URL||gO).replace(/\/$/,"")}function yO(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=mv[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(mv).join(", ")})`);return n}function Bu(e,t,n){return`${fv(n)}/${yO(e)}/api/v1${t}`}function hv(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 gv(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function yv(e={},t={}){return x(Bu(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function bv(e={},t={}){let n=hv(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(gv(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await x(`${Bu(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 wv(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",hv(e.owner||e.address||e.user,"owner"));let r=await x(`${Bu(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,gv(e))}}async function vv(e={}){let t=await x(`${fv(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}L();var wO="https://api.hiro.so",vO=20;function Mu(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||wO).replace(/\/$/,"")}function xO(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Ro(e,t={}){return x(`${Mu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:xO(t)})}async function xv(e={}){try{let t=await Ro("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Mu(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:vO,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Mu(e),error:String(t?.message||t),exec:!1}}}async function kv(e={},t={}){let n=await Ro("/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 Sv(e={},t={}){let n=await Ro("/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 Ev(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Ro(`/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 Iv(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Ro(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}L();var SO="https://bundles.jito.wtf",_v=1e9;function Fu(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||SO).replace(/\/$/,"")}function EO(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function Av(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*_v):null}function IO(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/_v:null,raw:e}}async function Pv(e={}){try{let t=await x(`${Fu(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 Cv(e={},t={}){let n=EO(e.limit,5,100),r=new URL(`${Fu(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 x(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(IO),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 Tv(e={}){let t=await x(`${Fu(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,Av(i)])),suggestedTipLamports:Av(r.p75||r.p50),raw:n}}L();var _O="https://api.kamino.finance";function PO(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||_O).replace(/\/$/,"")}function De(e){let t=Number(e);return Number.isFinite(t)?t:null}function Nv(e={}){let t=De(e.totalValueLocked)??0,n=De(e.apy?.totalApy)??0,r=De(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:De(e.sharePrice),sharesIssued:De(e.sharesIssued),profitAndLoss:De(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:De(e.apy?.vault?.totalApr),apy24h:De(e.kaminoApy?.vault?.apy24h),apy7d:De(e.kaminoApy?.vault?.apy7d),apy30d:De(e.kaminoApy?.vault?.apy30d),poolPrice:De(e.apy?.vault?.poolPrice),priceLower:De(e.apy?.vault?.priceLower),priceUpper:De(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Uu(e={},t={}){let n=new URL(`${PO(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function Ov(e={}){try{let t=await Uu({},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 Rv(e={},t={}){let r=(await Uu(e,t)).map(Nv),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 Lv(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Uu({...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",...Nv(o),raw:o}}L();var TO="https://blockstream.info/liquid/api",$v="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ua(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||TO).replace(/\/$/,"")}function NO(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 OO(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 Bv(e,t={}){let n=`${Ua(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 Mv(e,t={}){return x(`${Ua(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Fv(e={}){try{let t=await Bv("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ua(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ua(e),error:String(t?.message||t),exec:!1}}}async function Uv(e={},t={}){let n=await Bv("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function qv(e={},t={}){let n=NO(e.address||e.addr,"address"),r=await Mv(`/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 Dv(e={},t={}){let n=OO(e.assetId||e.asset||$v,"assetId"),r=await Mv(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===$v,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}L();var LO="https://api-mainnet.magiceden.dev/v2/ord/btc",$O=600;function qu(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||LO).replace(/\/$/,"")}function BO(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Hv(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 Wv(e,t={}){return x(`${qu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:BO(t),retries:t.retries??1})}async function jv(e={}){let t=Hv(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Wv(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:qu(e),probeCollection:t,rateLimitRpm:$O,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:qu(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 zv(e={},t={}){let n=Hv(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Wv(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}L();var FO="https://mempool.space/api",UO=7;function Du(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||FO).replace(/\/$/,"")}function qa(e,t={}){return x(`${Du(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Vv(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>UO}}async function Gv(e={}){try{let n=(await qa("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=Vv(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Du(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:Du(e),error:String(t?.message||t),exec:!1}}}async function Kv(e={},t={}){let r=(await qa("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=Vv(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 Yv(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 qa(`/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 Xv(e={},t={}){let n=await qa("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}L();var DO="https://mempool.space/api",Jv=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Hu(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||DO).replace(/\/$/,"")}function Qv(e,t){let n=String(e||t).trim().toLowerCase();if(!Jv.has(n))throw new Error(`mempool-mining: window must be one of ${[...Jv].join(", ")}`);return n}function Lo(e,t={}){return x(`${Hu(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Zv(e={}){try{let t=await Lo("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Hu(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Hu(e),error:String(t?.message||t),exec:!1}}}async function ex(e={},t={}){let n=await Lo("/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 tx(e={},t={}){let n=Qv(e.window||e.timeframe,"1w"),r=await Lo(`/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 nx(e={},t={}){let n=Qv(e.window||e.timeframe,"3d"),r=await Lo(`/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 rx(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Lo(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}L();var WO="https://amm-v2.meteora.ag",ox=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),ix=new Set(["dynamic","multitoken","lst","farms"]),jO=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function zO(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||WO).replace(/\/$/,"")}function Te(e){let t=Number(e);return Number.isFinite(t)?t:null}function VO(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:Te(e.pool_lp_price_in_usd),tvlUsd:Te(e.pool_tvl),farmTvlUsd:Te(e.farm_tvl),volume24hUsd:Te(e.trading_volume),volume7dUsd:Te(e.weekly_trading_volume),fee24hUsd:Te(e.fee_volume),fee7dUsd:Te(e.weekly_fee_volume),tradeApyPct:Te(e.trade_apy),weeklyTradeApyPct:Te(e.weekly_trade_apy),baseApyPct:Te(e.daily_base_apy),farmingApyPct:Te(e.farming_apy),totalApyPct:(Te(e.trade_apy)??0)+(Te(e.farming_apy)??0),aprPct:Te(e.apr),feePct:Te(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 GO(e={},t={}){let n=new URL(`${zO(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(!ox.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...ox].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(!ix.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...ix].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(!jO.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 Wu(e={},t={}){let{url:n,page:r,size:o}=GO(e,t),i=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(VO),totalCount:i?.total_count??null,page:r,size:o}}async function ax(e={}){try{let{pools:t,totalCount:n}=await Wu({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 sx(e={},t={}){let n=await Wu({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 cx(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 Wu({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}L();var YO="https://ordinals.com";function Da(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||YO).replace(/\/$/,"")}function XO(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 lx(e,t={}){let n=`${Da(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 ju(e,t={}){return x(`${Da(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function ux(e={}){try{let t=await lx("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Da(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Da(e),error:String(t?.message||t),exec:!1}}}async function dx(e={},t={}){let n=await lx("/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 px(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 ju(`/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 mx(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 ju(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 fx(e={},t={}){let n=XO(e.name||e.rune||e.runeName,"name"),r=await ju(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}L();var QO="https://hermes.pyth.network",Vu={"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"},ZO=/^[0-9a-fA-F]{64}$/;function hx(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||QO).replace(/\/$/,"")}function gx(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Vu[n.toUpperCase()]||Vu[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!ZO.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 zu(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Gu(e={}){let t=zu({price:Number(e.price?.conf),expo:e.price?.expo}),n=zu(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:zu(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 Ku(e,t={}){let n=new URL(`${hx(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"),x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function yx(e={}){try{let t=await Ku([Vu["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Gu):[])[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 bx(e={},t={}){let n=gx(e.feedId||e.id||e.symbol,"feedId"),r=await Ku([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Gu):[],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 wx(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>gx(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 Ku(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Gu):[]),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 vx(e={},t={}){let n=new URL(`${hx(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 x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}L();var tR="https://relayscan.io",xx=new Set(["1h","12h","24h","7d"]);function Yu(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||tR).replace(/\/$/,"")}function kx(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!xx.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...xx].join(", ")}`);return t}function nR(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 Xu(e={},t={}){return x(`${Yu(t)}/overview/json?t=${kx(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Sx(e={},t={}){return x(`${Yu(t)}/builder-profit/json?t=${kx(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Ex(e={},t={}){let n=nR(e);return x(`${Yu(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function Ix(e={}){let t=await Xu({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}L();var oR="https://extra-api.sanctum.so",iR=30,aR=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Ju(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||oR).replace(/\/$/,"")}function Ax(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 sR(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function xn(e,t,n={}){let r={},o={};for(let i of sR(t,iR)){let a=new URL(`${Ju(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await x(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 _x(e={}){try{let[t,n]=await Promise.all([x(`${Ju(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),xn("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 Qu(e={},t={}){let n=await x(`${Ju(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 Px(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Qu({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=aR);let r=[...new Set(n.map(s=>Ax(s,"lsts[]")))],[o,i]=await Promise.all([xn("apy/latest",r,t),xn("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 Cx(e={},t={}){let n=Ax(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([xn("apy/latest",[n],t),xn("apy/inception",[n],t),xn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),xn("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}L();var lR="https://api.save.finance",uR="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",Tx="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",dR=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Zu(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||lR).replace(/\/$/,"")}function Nx(e,t="address"){let n=String(e??"").trim();if(!dR.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function Ox(e){let t=Number(e);return Number.isFinite(t)?t:null}function pR(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 mR(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:Ox(e.rates?.supplyInterest),borrowApyPct:Ox(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 Rx(e={}){try{let t=await x(`${Zu(e)}/v1/reserves?ids=${Tx}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:Tx,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function ed(e={},t={}){let n=new URL(`${Zu(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 x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(pR);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 Lx(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=>Nx(String(s).trim(),"reserve"));else{let a=Nx(e.market||e.marketAddress||uR,"market"),c=(await ed({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 x(`${Zu(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...mR(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 td(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 kn(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 $o(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:td(e.amount,"amount")}}function nd(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 Bo(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 rd(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 hR(e={},t={}){let n=$o(e),r=kn(e.slices??10,"slices",2,100),o=kn(e.durationSec??3600,"durationSec",r,604800),i=nd(n.total,Array(r).fill(1));return Bo(n,"TWAP",rd(i,o,t.nowMs),{durationSec:o})}function gR(e={},t={}){let n=$o(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=kn(e.durationSec??3600,"durationSec",r.length,604800),i=nd(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=rd(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return Bo(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function yR(e={}){let t=$o(e),n=kn(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=td(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 Bo(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function bR(e={}){let t=$o(e),n=td(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 Bo(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function wR(e={},t={}){let n=$o(e),r=kn(e.slices??10,"slices",2,100),o=kn(e.durationSec??3600,"durationSec",r,604800),i=kn(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=nd(n.total,a);return Bo(n,"IS",rd(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function $x(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return hR(e,t);if(n==="VWAP")return gR(e,t);if(n==="POV")return yR(e,t);if(n==="ICEBERG")return bR(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return wR(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Bx(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var Hx=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 qx(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:mu,adapters:Object.freeze(fu.adapters.map(e=>{let t=Hx[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function BR(e,t={}){let n=Nb(e,t),r=Hx[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new re(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var MR={"hl-info":{health:e=>_p(e),allMids:e=>ht(e),l2Book:(e,t={})=>_n(t.coin,e),outcomeMeta:e=>Or(e),clearinghouse:(e,t={})=>si(t.user,e),userFills:(e,t={})=>Pp(t.user,e),meta:e=>Cp(e),metaAndAssetCtxs:e=>je(e),candleSnapshot:(e,t={})=>ci(t,e),openOrders:(e,t={})=>Np(t.user,e),frontendOpenOrders:(e,t={})=>Op(t.user,e),userState:(e,t={})=>Pn(t.user,e),spotMeta:e=>li(e)},"hl-vaults":{health:e=>$p(e),summaries:(e,t={})=>Ls(t,e),details:(e,t={})=>ui(t,e),userEquities:(e,t={})=>$s(t,e),tracker:(e,t={})=>Bs(t,e)},"hl-precompiles":{health:e=>Mp(e),read:(e,t={})=>Bp(t,e),l1BlockNumber:e=>di(e),markPx:(e,t={})=>Us(t,e),oraclePx:(e,t={})=>qs(t,e),spotPx:(e,t={})=>Ds(t,e),position:(e,t={})=>Hs(t,e),spotBalance:(e,t={})=>Ws(t,e),vaultEquity:(e,t={})=>js(t,e),withdrawable:(e,t={})=>zs(t,e)},"hl-delta-neutral":{health:()=>im(),scan:(e,t={})=>dc(t,e),quote:(e,t={})=>pc(t,e),prepare:(e,t={})=>mc(t,e),loop:(e,t={})=>pm(t,e)},"lighter-delta-neutral":{health:()=>wm(),scan:(e,t={})=>hc(t,e),quote:(e,t={})=>gc(t,e),prepare:(e,t={})=>yc(t,e),loop:(e,t={})=>_m(t,e)},"poly-public":{health:e=>Cm(e),time:e=>bc(e),markets:(e,t={})=>Tm(t,e),book:(e,t={})=>Nm(t.tokenId,e),midpoint:(e,t={})=>Om(t.tokenId,e),spread:(e,t={})=>Rm(t.tokenId,e),price:(e,t={})=>Lm(t.tokenId,{side:t.side},e),events:(e,t={})=>$m(t,e)},"evm-rpc":{health:(e,t={})=>Sn(t.chainId??1,e),healthAll:(e,t={})=>is({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>br(t.chainId??1,e),chainId:(e,t={})=>rs(t.chainId??1,e),getBalance:(e,t={})=>Xt(t.chainId??1,t.address,e),call:(e,t={})=>M(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>os(t,e),erc20Balance:(e,t={})=>wr(t,e),transactionReceipt:(e,t={})=>vr(t,e)},portfolio:{health:e=>Iy(e),balances:(e,t={})=>ba(t,e),snapshot:(e,t={})=>jy(t,e),history:(e,t={})=>Jl(t,e),valueGraph:(e,t={})=>zy(t,e)},"nft-portfolio":{health:e=>Oy(e),inventory:(e,t={})=>nr(t,e),gallery:(e,t={})=>By(t,e),pnl:(e,t={})=>$y(t,e),prepareList:(e,t={})=>Ry(t,e),traitSnipe:(e,t={})=>Ly(t,e)},"contract-risk":{health:e=>Vy(e),scan:(e,t={})=>gn(t,e)},"evm-token-sniper":{health:e=>Yy(e),scan:(e,t={})=>Ky(t,e)},"evm-simulate":{health:e=>Jy(e),simulate:(e,t={})=>Ao(t,e)},"nft-mint":{health:e=>Zy(e),discover:(e,t={})=>Ea(t,e),prepare:(e,t={})=>eu(t,e),priceGas:(e,t={})=>Sa(t,e),createTrigger:(e,t={})=>Jb(t,e),checkOpen:(e,t={})=>Qb(t,e),evaluateMancerOs:(e,t={})=>tw(t,e)},"universal-mint-router":{health:()=>Eb(),capabilities:()=>du(),prepare:(e,t={})=>Ib(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:qx()}),capabilities:()=>qx(),route:(e,t={})=>BR(t,e)},"erc8004-identity":{health:()=>Gh(),prepareIdentityRegistration:(e,t={})=>Xh(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Jh(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Zh(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:Ca,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Lb(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:Ta,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Ub(t,e)},"universal-ordinals-transfer":{health:()=>({provider:Na,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Xb(t,e)},"solana-rpc":{health:e=>Mm(e),latestBlockhash:(e,t={})=>vc(t,e),getBalance:(e,t={})=>ki(t,e),tokenAccounts:(e,t={})=>zr(t,e),simulate:(e,t={})=>Fm(t,e)},"bitcoin-esplora":{health:e=>Um(e),tipHeight:e=>qm(e),fees:e=>Dm(e),address:(e,t={})=>Ei(t,e),utxos:(e,t={})=>Hm(t,e),tx:(e,t={})=>Wm(t,e),decode:(e,t={})=>jm(t,e)},"bitcoin-meta":{health:e=>Vm(e),runeBalances:(e,t={})=>Ai(t,e),inscriptions:(e,t={})=>Bn(t,e),inscriptionInfo:(e,t={})=>Gm(t,e),inscriptionChildren:(e,t={})=>Km(t,e),ordBlockInfo:(e,t={})=>Ym(t,e)},satflow:{health:e=>Jm(e),collectionFloors:(e,t={})=>Qm(t,e),collectionStats:(e,t={})=>Zm(t,e),item:(e,t={})=>ef(t,e),walletContents:(e,t={})=>Pi(t,e),floorListings:(e,t={})=>tf(t,e),preparePurchase:(e,t={})=>rf(t,e),prepareList:(e,t={})=>Ci(t,e)},jupiter:{health:e=>pf(e),venues:(e,t={})=>df(t,e),quote:(e,t={})=>Oi(t,e),prepare:(e,t={})=>mf(t,e)},defillama:{health:e=>hf(e),prices:(e,t={})=>sn(t.coins||[],e),pricesBySymbol:(e,t={})=>wf(t.symbols,e),protocols:e=>gf(e),yields:(e,t={})=>yf(t,e),stablecoins:(e,t={})=>Ri(t,e),dexVolumes:(e,t={})=>bf(t,e)},lifi:{health:e=>xf(e),quote:(e,t={})=>Gr(t,e),prepare:(e,t={})=>kf(t,e),chains:e=>Sf(e)},dexscreener:{health:e=>yd(e),token:(e,t={})=>Jt(t.address||t.tokenAddress,e),search:(e,t={})=>xr(t.q||t.query,e),pair:(e,t={})=>bd(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Od({...e,chainId:t.chainId??8453}),quote:(e,t={})=>En(t,e),prepare:(e,t={})=>Nd(t,e),quotePath:(e,t={})=>Td(t,e),ethUsdc:(e,t={})=>fs(t,e),chains:()=>Rd()},"uniswap-v4":{health:(e,t={})=>Dd({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Ko(t,e),chains:()=>qd()},aerodrome:{health:(e,t={})=>Nf({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Li(t,e),prepare:(e,t={})=>Tf(t,e),chains:()=>Of()},zerox:{health:e=>Bf(e),price:(e,t={})=>Lc(t,e),quote:(e,t={})=>Yr(t,e),prepare:(e,t={})=>Mf(t,e)},across:{health:e=>Ff(e),suggestedFees:(e,t={})=>$c(t,e)},hop:{health:e=>Uf(e),quote:(e,t={})=>Bc(t,e)},relay:{health:e=>qf(e),quote:(e,t={})=>Bi(t,e),prepare:(e,t={})=>Df(t,e)},cowswap:{health:e=>Vf(e),quote:(e,t={})=>Mn(t,e),prepareOrder:(e,t={})=>Gf(t,e),order:(e,t={})=>Yf(t,e),status:(e,t={})=>Kf(t,e),chains:()=>Xf()},oneinch:{health:e=>Qf(e),quote:(e,t={})=>Wc(t,e),prepare:(e,t={})=>Zf(t,e),approveSpender:(e,t={})=>jc(t,e)},"hl-ws":{health:e=>eh(e),allMids:e=>th(e),l2Book:(e,t={})=>nh(t.coin,e),snapshot:(e,t={})=>Qr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>rh({...e,assetId:t.assetId}),book:(e,t={})=>oh(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Fi(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>ep(e),collection:(e,t={})=>Ar(t.slug,e),floor:(e,t={})=>tp(t.slug,e),bestListings:(e,t={})=>vs(t,e),bestListing:(e,t={})=>Zo(t,e),bestOffer:(e,t={})=>ei(t,e),accountNfts:(e,t={})=>_r(t,e),accountPnl:(e,t={})=>Jo(t,e),prepareBuy:(e,t={})=>mp(t,e),prepareSweep:(e,t={})=>fp(t,e),prepareMint:(e,t={})=>ni(t,e),prepareList:(e,t={})=>ri(t,e),prepareCancel:(e,t={})=>hp(t,e)},"anvil-nft":{health:(e,t={})=>Hh(t,e),markets:(e,t={})=>qn(t,e),quoteSpecificBuy:(e,t={})=>eo(t,e),quoteSell:(e,t={})=>Di(t,e),scanCollection:(e,t={})=>Hi(t,e),scanAllMarkets:(e,t={})=>Lh(t,e),scanCrossVenueArb:(e,t={})=>Jc(t,e),scanAllMarketsArb:(e,t={})=>$h(t,e),prepareSpecificBuy:(e,t={})=>_h(t,e),prepareSell:(e,t={})=>Ph(t,e)},stonkbrokers:{health:(e,t={})=>Wh(t,e),quoteBrokerBuy:(e,t={})=>Wi(t,e),scanBrokerLoot:(e,t={})=>Fh(t,e),prepareBrokerBuy:(e,t={})=>Uh(t,e),brokerDesk:(e,t={})=>Dh(t,e),clockInStatus:(e,t={})=>to(t,e),prepareClockIn:(e,t={})=>qh(t,e)},"hl-outcome":{list:e=>z0(e),prepareOrder:(e,t={})=>V0(t,e),prepareCancel:(e,t={})=>G0(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:sa().map(e=>e.id),nativeTemplates:bo().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>sa(),listNative:()=>bo(),gate:(e,t={})=>go(t.templateId||t.id,e),prepareDeploy:(e,t={})=>xg(t,e),buildNative:(e,t={})=>wo(t),eval:async()=>(await Promise.resolve().then(()=>(Ux(),Fx))).runContractsEval()},"poly-clob":{health:()=>sg(),prepareOrder:(e,t={})=>cg(t||{},e)},"hl-perps":{health:e=>pl(e),assetInfo:(e,t={})=>Ot(t,e),prepareOrder:(e,t={})=>On(t,e),prepareCancel:(e,t={})=>Dr(t,e),prepareLeverage:(e,t={})=>sc(t,e),prepareIsolatedMargin:(e,t={})=>cc(t,e),prepareBracket:(e,t={})=>lc(t,e),prepareBuilderApproval:(e,t={})=>ac(t,e)},"hl-markets":{health:e=>pl(e),markets:(e,t={})=>Yi(t,e),leaderboards:(e,t={})=>w0(t,e),coin:(e,t={})=>v0(t,e),spot:(e,t={})=>x0(t,e)},"hl-entry-state":{health:e=>D0(e),see:(e,t={})=>lo(t,e),qualify:(e,t={})=>H0(t,e),lock:(e,t={})=>W0(t,e),list:e=>hl(e),watch:(e,t={})=>j0(t,e)},"magiceden-sol":{health:e=>i0(e),stats:(e,t={})=>ol(t,e),listings:(e,t={})=>s0(t,e),tokenListings:(e,t={})=>c0(t,e),prepareBuy:(e,t={})=>l0(t,e),prepareList:(e,t={})=>Gi(t,e),prepareMint:(e,t={})=>u0(t,e)},"hl-staking":{health:e=>p0(e),validators:e=>sl(e),delegatorSummary:(e,t={})=>cl(t,e),delegations:(e,t={})=>ll(t,e),rewards:(e,t={})=>m0(t,e),history:(e,t={})=>f0(t,e),preflight:(e,t={})=>b0(t,e),prepareStakeDeposit:(e,t={})=>h0(t,e),prepareStakeWithdraw:(e,t={})=>g0(t,e),prepareDelegate:(e,t={})=>y0(t,e)},"hyperevm-dex":{health:e=>t0(e),search:(e,t={})=>n0(t.q||t.query||"HYPE",e),token:(e,t={})=>r0(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Og(e),networks:(e,t={})=>_l(t,e),pool:(e,t={})=>Cg(t,e),token:(e,t={})=>Tg(t,e),ohlcv:(e,t={})=>Ng(t,e)},curve:{health:e=>zg(e),openapi:e=>jg(e),pools:(e,t={})=>Cl(t,e),quote:(e,t={})=>Tl(t,e),prepare:(e,t={})=>Vg(t,e)},gmx:{health:e=>O0(e),tickers:(e,t={})=>Xn(t,e),markets:(e,t={})=>T0(t,e),marketsInfo:(e,t={})=>fl(t,e),tokens:(e,t={})=>N0(t,e),prepareOrder:(e,t={})=>B0(t,e),positions:(e,t={})=>R0(t,e),orderStatus:(e,t={})=>L0(t,e),verifyOrder:(e,t={})=>$0(t,e)},morpho:{health:e=>Xg(e),markets:(e,t={})=>Yg(t,e),vaults:(e,t={})=>Rl(t,e),prepareVault:(e,t={})=>Jg(t,e)},balancer:{health:e=>iy(e),pools:(e,t={})=>oy(t,e),quote:(e,t={})=>Bl(t,e),prepare:(e,t={})=>ay(t,e)},pendle:{health:e=>cy(e),markets:(e,t={})=>Fl(t,e),quote:(e,t={})=>ly(t,e),prepare:(e,t={})=>Ul(t,e)},odos:{health:e=>my(e),chains:e=>Dl(e),quote:(e,t={})=>dy(t,e),prepare:(e,t={})=>py(t,e)},blockscout:{health:e=>xy(e),stats:(e,t={})=>jl(t,e),address:(e,t={})=>yy(t,e),token:(e,t={})=>by(t,e)},paraswap:{health:e=>rw(e),tokens:(e,t={})=>bu(t,e),price:(e,t={})=>pr(t,e),quote:(e,t={})=>pr(t,e),prepare:(e,t={})=>nw(t,e)},rfq:{health:e=>yw(e),intent:(e,t={})=>hw(t,e),quote:(e,t={})=>gw(t,e)},"polygon-staking":{health:e=>zw(e),validators:(e,t={})=>Ww(t,e),validatorDetail:(e,t={})=>jw(t,e)},"aave-v3":{health:e=>Yw(e),markets:(e,t={})=>Vw(t,e),marketReserves:(e,t={})=>Gw(t,e),chains:e=>Kw(e)},"babylon-staking":{health:e=>Jw(e),stats:e=>Qw(e),finalityProviders:e=>Zw(e),delegations:(e,t={})=>ev(t,e)},"bisq-markets":{health:e=>nv(e),markets:e=>rv(e),ticker:(e,t={})=>ov(t,e),trades:(e,t={})=>iv(t,e)},"bob-rootstock":{health:(e,t={})=>sv(t.chainId,e),stats:(e,t={})=>Ru(t,e),addressInfo:(e,t={})=>cv(t,e),tokenBalances:(e,t={})=>lv(t,e)},"braiins-insights":{health:e=>uv(e),priceStats:e=>dv(e),poolStats:e=>pv(e)},"cow-protocol":{health:e=>vv(e),auction:e=>yv(e),openOrders:(e,t={})=>bv(t,e),recentTrades:(e,t={})=>wv(t,e)},"hiro-stacks":{health:e=>xv(e),networkInfo:e=>kv(e),stackingInfo:e=>Sv(e),poxCycles:e=>Ev(e),blocks:(e,t={})=>Iv(t,e)},"jito-mev":{health:e=>Pv(e),recentBundles:(e,t={})=>Cv(t,e),tipFloor:e=>Tv(e)},"kamino-strategies":{health:e=>Ov(e),strategies:(e,t={})=>Rv(t,e),strategyMetrics:(e,t={})=>Lv(t,e)},"liquid-esplora":{health:e=>Fv(e),tipHeight:e=>Uv(e),addressInfo:(e,t={})=>qv(t,e),assetInfo:(e,t={})=>Dv(t,e)},"magiceden-ordinals":{health:e=>jv(e),collectionStat:(e,t={})=>zv(t,e)},"mempool-lightning":{health:e=>Gv(e),statistics:e=>Kv(e),nodeRankings:(e,t={})=>Yv(t,e),nodeCountries:e=>Xv(e)},"mempool-mining":{health:e=>Zv(e),difficulty:e=>ex(e),poolShare:(e,t={})=>tx(t,e),hashrate:(e,t={})=>nx(t,e),rewardStats:(e,t={})=>rx(t,e)},"meteora-dlmm":{health:e=>ax(e),pools:(e,t={})=>sx(t,e),poolSearch:(e,t={})=>cx(t,e)},"ordinals-runes":{health:e=>ux(e),blockHeight:e=>dx(e),blockInfo:(e,t={})=>px(t,e),satInfo:(e,t={})=>mx(t,e),runeInfo:(e,t={})=>fx(t,e)},"pyth-price-feeds":{health:e=>yx(e),latestPrice:(e,t={})=>bx(t,e),latestPrices:(e,t={})=>wx(t,e),feedDirectory:e=>vx(e)},"relayscan-mev":{health:e=>Ix(e),overview:(e,t={})=>Xu(t,e),builderProfit:(e,t={})=>Sx(t,e),dailyStats:(e,t={})=>Ex(t,e)},"sanctum-lst":{health:e=>_x(e),lstList:e=>Qu(e),apyAll:e=>Px(e),apyIndividual:(e,t={})=>Cx(t,e)},"solend-lending":{health:e=>Rx(e),markets:e=>ed(e),reserves:(e,t={})=>Lx(t,e)},"execution-strategies":{health:()=>Bx(),plan:(e,t={})=>$x(t)},"across-bridge":{health:e=>bw(e),pools:(e,t={})=>ww(t,e),suggestedFees:(e,t={})=>vw(t,e)},"beefy-yields":{health:e=>xw(e),apy:(e,t={})=>kw(t,e),apyBreakdown:e=>Sw(e)},"birdeye-tokens":{health:e=>Iw(e),tokenList:(e,t={})=>Aw(t,e)},"celestia-da":{health:e=>_w(e),stats:e=>Pw(e),blockStats:(e,t={})=>Cw(t,e)},"das-assets":{health:e=>Tw(e),assetsByOwner:(e,t={})=>Nw(t,e),searchAssets:(e,t={})=>Ow(t,e),assetProof:(e,t={})=>Rw(t,e)},"l2beat-tvl":{health:e=>Lw(e),tvl:(e,t={})=>$w(t,e),activity:(e,t={})=>Bw(t,e)},"spark-lend":{health:e=>Mw(e),markets:(e,t={})=>Fw(t,e)},"symbiotic-restaking":{health:e=>Uw(e),vaults:(e,t={})=>qw(t,e),vaultDetail:(e,t={})=>Dw(t,e)}},Dx=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Wx=new Set(["hl-exec"]);function FR(e){return Wx.has(String(e||""))}function UR(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Wx.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ai().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!Dx.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(Dx.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 S(e,t,n={},r={}){if(FR(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.`);UR(e,t,n);let o=Ts(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=MR[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function qR({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||ai().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)=>S(d,"health",p,f),u={};return await Ne(s,i??8,async d=>{if(!Ts(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},f=await ge(()=>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 jx(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function DR(e){return e.execution==="prepare"&&jx(e).length?"armed-local":e.execution||"read-only"}function HR(){return ai().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:DR(e),localSignerSurfaces:jx(e),description:e.description}))}var s4={catalog:HR,health:qR,call:S,hl:{health:e=>S("hl-info","health",{},e),allMids:e=>S("hl-info","allMids",{},e),l2Book:(e,t)=>S("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>S("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>S("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>S("hl-info","userFills",{user:e},t),meta:e=>S("hl-info","meta",{},e),metaAndAssetCtxs:e=>S("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>S("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>S("hl-info","openOrders",{user:e},t),userState:(e,t)=>S("hl-info","userState",{user:e},t),spotMeta:e=>S("hl-info","spotMeta",{},e),vaults:{health:e=>S("hl-vaults","health",{},e),summaries:(e,t)=>S("hl-vaults","summaries",e||{},t),details:(e,t)=>S("hl-vaults","details",e||{},t),mine:(e,t)=>S("hl-vaults","userEquities",{user:e},t),track:(e,t)=>S("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>S("hl-entry-state","see",e||{},t),qualify:(e,t)=>S("hl-entry-state","qualify",e||{},t),lock:(e,t)=>S("hl-entry-state","lock",e||{},t),list:e=>S("hl-entry-state","list",{},e),watch:(e,t)=>S("hl-entry-state","watch",e||{},t)},staking:{health:e=>S("hl-staking","health",{},e),validators:e=>S("hl-staking","validators",{},e),summary:(e,t)=>S("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>S("hl-staking","delegations",{user:e},t),rewards:(e,t)=>S("hl-staking","rewards",{user:e},t),history:(e,t)=>S("hl-staking","history",{user:e},t),preflight:(e,t)=>S("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>S("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>S("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>S("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>S("poly-public","health",{},e),time:e=>S("poly-public","time",{},e),markets:(e,t)=>S("poly-public","markets",e||{},t),book:(e,t)=>S("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>S("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>S("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>S("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>S("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>S("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>S("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>S("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>S("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>S("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>S("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>S("evm-token-sniper","health",{},e),scan:(e,t)=>S("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>S("portfolio","balances",e||{},t),snapshot:(e,t)=>S("portfolio","snapshot",e||{},t),history:(e,t)=>S("portfolio","history",e||{},t),valueGraph:(e,t)=>S("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>S("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>S("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>S("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>S("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>S("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>S("opensea-nft","floor",{slug:e},t),collection:(e,t)=>S("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>S("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>S("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>S("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>S("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>S("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>S("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>S("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>S("universal-mint-router","health",{},e),capabilities:e=>S("universal-mint-router","capabilities",{},e),prepare:(e,t)=>S("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>S("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>S("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>S("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>S("solana-rpc","health",{},e),latestBlockhash:(e,t)=>S("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>S("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>S("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>S("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>S("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>S("jupiter","prepare",e||{},t),nftStats:(e,t)=>S("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>S("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>S("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>S("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>S("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>S("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>S("bitcoin-esplora","health",{},e),tipHeight:e=>S("bitcoin-esplora","tipHeight",{},e),fees:e=>S("bitcoin-esplora","fees",{},e),address:(e,t)=>S("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>S("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>S("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>S("bitcoin-esplora","decode",e||{},t),metaHealth:e=>S("bitcoin-meta","health",{},e),runeBalances:(e,t)=>S("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>S("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>S("satflow","health",{},e),satflowFloors:(e,t)=>S("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>S("satflow","walletContents",{address:e},t)},prices:{health:e=>S("defillama","health",{},e),current:(e,t)=>S("defillama","prices",{coins:e},t),bySymbol:(e,t)=>S("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>S("defillama","protocols",{},e)},lifi:{health:e=>S("lifi","health",{},e),quote:(e,t)=>S("lifi","quote",e||{},t),chains:e=>S("lifi","chains",{},e)},dex:{health:e=>S("dexscreener","health",{},e),token:(e,t)=>S("dexscreener","token",{address:e},t),search:(e,t)=>S("dexscreener","search",{q:e},t),pair:(e,t,n)=>S("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>S("uniswap-v3","health",e||{},t),quote:(e,t)=>S("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>S("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>S("uniswap-v3","ethUsdc",e||{},t),chains:e=>S("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>S("uniswap-v4","health",e||{},t),quote:(e,t)=>S("uniswap-v4","quote",e||{},t),chains:e=>S("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>S("across","suggestedFees",e||{},t),hop:(e,t)=>S("hop","quote",e||{},t),relay:(e,t)=>S("relay","quote",e||{},t)},cow:{quote:(e,t)=>S("cowswap","quote",e||{},t)},hlWs:{allMids:e=>S("hl-ws","allMids",{},e),l2Book:(e,t)=>S("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>S("poly-ws","book",{assetId:e},t)}};export{Wx as EXECUTION_PROVIDERS,UR as assertDataOpAllowed,s4 as data,S as dataCall,HR as dataCatalog,qR as dataHealth,FR as isExecutionProvider,BR as routeUniversalNftLifecycle,qx as universalNftLifecycleCapabilities};
|