@oracle-agent/oracle 0.35.37 → 0.35.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/agent-sessions.mjs +18 -18
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/venue-capability-boundaries/SKILL.md +4 -0
- package/dist/bin/desk-server.mjs +29 -29
- package/dist/bin/oracle-gateway.mjs +53 -42
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-telegram-mcp.mjs +4 -4
- package/dist/cli/commands/agent-session.mjs +22 -22
- package/dist/cli/commands/chat.mjs +158 -158
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/eval.mjs +88 -88
- package/dist/cli/commands/farm.mjs +1 -1
- package/dist/cli/commands/model.mjs +161 -161
- package/dist/cli/commands/quickstart.mjs +1 -1
- package/dist/cli/commands/sign.mjs +1 -1
- package/dist/cli/commands/signer.mjs +1 -1
- package/dist/cli/commands/swap.mjs +1 -1
- package/dist/cli/commands/telegram.mjs +3 -3
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/data/desk-data.mjs +27 -27
- package/dist/data/providers/farming.mjs +1 -1
- package/dist/index.mjs +46 -46
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +1 -1
- package/dist/local-signer/runtime.mjs +1 -1
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +9 -3
- package/dist/tui/standalone-client.mjs +74 -74
- package/package.json +1 -1
- package/public/agent-connect/index.html +2 -2
- package/public/eval-report.json +95 -95
- package/public/oracle-console/index.html +3 -2
- package/public/oracle-splash/_variants/ice.html +4 -4
- package/public/oracle-splash/_variants/ivory.html +4 -4
- package/public/oracle-splash/assets/vendor/gsap-3.13.0.min.js +10 -0
- package/public/oracle-splash/assets/vendor/gsap-scrolltrigger-3.13.0.min.js +10 -0
- package/public/oracle-splash/assets/vendor/lenis-1.3.11.min.js +1 -0
- package/public/oracle-splash/index.html +558 -71
- package/server.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var xn=Object.defineProperty;var he=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var
|
|
2
|
-
`)};a("method",e),a("url",t),Object.keys(n||{}).map((s,l)=>({name:s.toLowerCase(),order:l,value:String(n[s])})).sort((s,l)=>s.name.localeCompare(l.name)||s.order-l.order).forEach((s,l)=>{a(`header-name-${l}`,s.name),a(`header-value-${l}`,s.value)}),a("body",o??"-");for(let s of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])a(`context-${s}`,r[s]??"-");return i.digest("hex")}function Vr(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Rt):Math.min(250*2**e,Rt)+Math.floor(Math.random()*100)}function ee(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ye(e,t,n){return ee(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ae(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Kr(e){return e?e.byteLength??e.length??0:0}async function Jr(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&&(ae(e),!r))throw Ye(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let p=await e.text(),d=Buffer.byteLength(p,"utf8");if(d>t){if(!r)throw Ye(n,`body ${d} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let c=[],s=0,l=!1;try{for(;;){let{value:p,done:d}=await a.read();if(d)break;if(p&&(c.push(Buffer.from(p)),s+=Kr(p),s>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Ye(n,`streamed ${s} bytes`,t);let u=Buffer.concat(c);return(l?u.subarray(0,t):u).toString("utf8")}function Xr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Zr(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:c,untrustedUrl:s=!1,maxResponseBytes:l=null,sameOriginRedirectsOnly:u=!1,importUndici:p,validateResponse:d,signal:w,redirectPolicy:h="follow",maxRedirects:v=Se}){let S=new AbortController,A=setTimeout(()=>S.abort(),i),k=w?$t?$t([w,S.signal]):w:S.signal,y=null,g=t,L=a?{lookupFn:a}:{};if(s&&!c&&!ze(g))throw ee(`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 F=async(b,{status:E=null}={})=>{let T=await Ue(b,L);if(!T.ok)throw ee(E==null?`HTTP refused ${b}: ${T.error}`:`HTTP redirect to ${b} ${T.error}`,E==null?{}:{status:E});let _=new URL(b).hostname;if(c){if(y&&(await y.close(),y=null),!y)try{y=await We({requireUndici:!0,...p?{importUndici:p}:{}})}catch(f){throw ee(E==null?`HTTP refused ${b}: ${f?.message||f}`:`HTTP redirect to ${b} refused: ${f?.message||f}`,E==null?{}:{status:E})}y.pin(_,T.addresses),g=y.fetch}else Ot(g,_,T.addresses);return T};try{let b=String(e),E=Object.assign(Object.create(null),r||{});s&&await F(b);for(let T=0;T<=v;T+=1){let _=Object.assign(Object.create(null),{method:n,headers:E,body:o,signal:k,redirect:"manual",dispatcher:void 0}),f=await g(b,_);if((h==="error"||v===0)&&f.status>=300&&f.status<400)throw ae(f),ee(`HTTP ${f.status} ${n} redirect refused`,{status:f.status,redirectRefused:!0});if(Mr.has(f.status)){let D=u===!0&&n==="POST"&&[307,308].includes(f.status)&&Lt(n,o);if(n!=="GET"&&n!=="HEAD"&&!D){ae(f);let R=new Error(`HTTP ${f.status} ${n} ${b} redirected non-idempotent request`);throw R.status=f.status,R}if(T===v)throw ae(f),ee(`HTTP ${f.status} ${n} redirect budget exhausted`,{status:f.status,redirectRefused:!0});let $=f.headers?.get?.("location"),M;try{M=Dr($,b)}catch(R){throw ae(f),R}let z=!Ur(M,b);if(ae(f),z&&n==="POST"){let R=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw R.status=f.status,R}if(z&&u){let R=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw R.status=f.status,R.retryable=!1,R}if(z&&(E=qr(E)),s)await F(M,{status:f.status});else if(z){let R=await Ue(M,L);if(!R.ok){let P=new Error(`HTTP redirect from ${b} ${R.error}`);throw P.status=f.status,P.retryable=!1,P}c&&R.addresses?.length&&(y||(y=await We(p?{importUndici:p}:{})),y&&(y.pin(new URL(M).hostname,R.addresses),g=y.fetch))}b=M;continue}if(typeof d=="function")try{await d(f,{url:b})}catch(D){throw ae(f),ee(D?.message||String(D))}let N=await Jr(f,l,{url:b,onOversize:()=>S.abort()}),ne=Xr(N);if(!f.ok){let D=new Error(`HTTP ${f.status} ${n} ${b}`);throw D.status=f.status,D.retryAfter=f.headers?.get?.("retry-after")??null,D.body=ne??N.slice(0,300),D}return ne??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(b){if(S.signal.aborted&&!Ke(w)){let E=b&&(typeof b=="object"||typeof b=="function")&&!Y.isProxy(b)?b:null,T=E?Object.getOwnPropertyDescriptor(E,"oversize"):null;if(!(T&&Object.hasOwn(T,"value")&&T.value===!0))try{if(!E)throw new TypeError("unsafe rejection");Object.defineProperties(E,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let f=new Error("HTTP request timed out");throw Object.defineProperties(f,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),f}}throw b}finally{clearTimeout(A),y&&await y.close()}}async function fe(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Y.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let P of Object.getOwnPropertyNames(t)){let O=Object.getOwnPropertyDescriptor(t,P);if(!(P==="toJSON"&&O&&Object.hasOwn(O,"value")&&O.value===void 0)){if(!n.has(P))throw new TypeError("HTTP options contain unknown fields");if(!O||!O.enumerable||!Object.hasOwn(O,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=P=>{if(t==null||!Object.hasOwn(t,P))return;let O=Object.getOwnPropertyDescriptor(t,P);if(!O||!Object.hasOwn(O,"value"))throw new TypeError("HTTP options must contain own data properties");return O.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let a=r("retries");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>10))throw new TypeError("HTTP retries must be a bounded integer");let c=r("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let s=r("maxRedirects");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>Se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Se}`);if(c==="error"&&s!==void 0&&s!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let l=c??"follow",u=l==="error"?0:s??Se;for(let P of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let O=r(P);if(O!==void 0&&typeof O!="boolean")throw new TypeError(`HTTP ${P} must be boolean`)}let p=r("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let d=r("signal");if(d!==void 0){if(Y.isProxy(d)||!(d instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Ke(d)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let P of["importUndici","lookupFn","validateResponse"]){let O=r(P);if(O!==void 0&&typeof O!="function")throw new TypeError(`HTTP ${P} must be a function`)}let w=r("fetchImpl"),h=w||globalThis.fetch;if(typeof h!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let v=i??12e3,S=(o||"GET").toUpperCase(),A=r("headers"),k=Hr(A),y=Object.assign(Object.create(null),k);Object.keys(y).some(P=>P.toLowerCase()==="accept")||(y.Accept="application/json");let g=r("body");g!=null&&typeof g!="string"&&(Object.keys(y).find(O=>O.toLowerCase()==="content-type")||(y["Content-Type"]="application/json"),g=jr(g));let L=a??Rr,F=r("lookupFn"),b=!w,E=r("untrustedUrl")===!0,T=r("sameOriginRedirectsOnly")===!0,_=r("importUndici"),f=r("validateResponse"),N=d,ne=p??null,D=async()=>{let P;for(let O=0;O<=L;O++){N&&kr.call(N);try{return await Zr(e,{fetchImpl:h,method:S,headers:y,body:g,timeoutMs:v,lookupFn:F,realFetch:b,untrustedUrl:E,maxResponseBytes:ne,sameOriginRedirectsOnly:T,importUndici:_,validateResponse:f,signal:N,redirectPolicy:l,maxRedirects:u})}catch(re){P=re;let ce=Oe=>{if(!re||typeof re!="object"&&typeof re!="function"||Y.isProxy(re))return;let pe=Object.getOwnPropertyDescriptor(re,Oe);return pe&&Object.hasOwn(pe,"value")?pe.value:void 0},Pe=ce("status"),gn=ce("oracleTimeout")===!0||ce("name")==="AbortError"||ce("name")==="TimeoutError"||Ke(N),bn=new Set([408,425,429]),En=ce("retryable")===!1?!1:Pe!=null?bn.has(Pe)||Nr.has(Pe)&&Nt.has(S):!gn&&Nt.has(S);if(O===L||!En)throw re;let it=Vr(O,ce("retryAfter"));N?await new Promise((Oe,pe)=>{let Sn=setTimeout(Oe,it);Fr.call(N,"abort",()=>{clearTimeout(Sn),pe(Lr(N)||new DOMException("Aborted","AbortError"))},{once:!0})}):await Yr(it)}}throw P};if(!(r("dedupe")!==!1&&!N&&Lt(S,g)))return D();let M=zr(S,e,y,{untrustedUrl:E,maxResponseBytes:ne,sameOriginRedirectsOnly:T,redirectPolicy:l,maxRedirects:u,timeoutMs:v,retries:L,fetchImpl:Ee(h),realFetch:b,lookupFn:Ee(F),importUndici:Ee(_),validateResponse:Ee(f)},g),z=Ve.get(M);if(z)return z;let R=D().finally(()=>Ve.delete(M));return Ve.set(M,R),R}async function Mt(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 c=a++;i[c]=await n(r[c],c)}})),i}var Nr,Nt,Rr,Rt,$r,Cr,kr,Fr,$t,Ke,Lr,Mr,Se,Si,V,Ve,Ct,kt,Wr,Gr,Yr,Je=he(()=>{_t();Nr=new Set([408,425,429,500,502,503,504]),Nt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Rr=2,Rt=4e3,$r=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Cr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,kr=AbortSignal.prototype.throwIfAborted,Fr=EventTarget.prototype.addEventListener,$t=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ke=e=>e?$r.call(e):!1,Lr=e=>e?Cr.call(e):void 0,Mr=new Set([301,302,303,307,308]),Se=3,Si=64*1024,V=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ve=new Map,Ct=new WeakMap,kt=1;Wr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Gr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Yr=e=>new Promise(t=>setTimeout(t,e))});function Qe(e){return Ut.get(Number(e))||null}function Wt(e,t=process.env){let n=Qe(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Gt(e){return Ut.has(Number(e))}var Ze,Ut,zt=he(()=>{Ze={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}},Ut=new Map(Object.values(Ze).map(e=>[e.chainId,e]))});var nt={};vn(nt,{PUBLIC_RPC_FALLBACKS:()=>tt,erc20Allowance:()=>mo,erc20BalanceOf:()=>ho,resolveRpcUrl:()=>ve,rpcBatch:()=>Zt,rpcBlockNumber:()=>uo,rpcCall:()=>K,rpcChainId:()=>lo,rpcGasPrice:()=>po,rpcGetBalance:()=>fo,rpcHealth:()=>Qt,rpcHealthAll:()=>yo,transactionReceipt:()=>wo});import{Interface as ro,getAddress as oo}from"ethers";function te(e,t){try{return oo(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function io(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 et(e){return e==null?null:Number.parseInt(String(e),16)}function ve(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Wt(e,n);return r||tt[Number(e)]||null}function Kt(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!ao.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function so(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Jt(e){if(e?.error)throw so(e.error);return e?.result}function co(e,t,n){return`${e}
|
|
1
|
+
var xn=Object.defineProperty;var he=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Tn=(e,t)=>{for(var n in t)xn(e,n,{get:t[n],enumerable:!0})};import ie from"node:net";import Ar from"node:dns";function be(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=u=>{if(!u)return[];let p=u.split(":"),d=p.at(-1);if(d?.includes(".")){let w=d.split(".").map(Number);if(w.length!==4||w.some(h=>!Number.isInteger(h)||h<0||h>255))return null;p.splice(p.length-1,1,(w[0]<<8|w[1]).toString(16),(w[2]<<8|w[3]).toString(16))}return p.some(w=>!/^[0-9a-f]{1,4}$/.test(w))?null:p.map(w=>Number.parseInt(w,16))},[r,o]=t.split("::"),i=n(r),a=n(o);if(!i||!a)return null;let c=t.includes("::"),s=8-i.length-a.length;if(!c&&s!==0||c&&s<1)return null;let l=[...i,...Array(Math.max(0,s)).fill(0),...a];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function qe(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 De(e){if(ie.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(ie.isIPv6(e)){let t=be(e);if(!t)return!1;let n=be("::ffff:0:0");return qe(t,n,96)?De([...t.slice(12)].join(".")):qe(t,be("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>qe(t,be(o),i)):!1}return!1}function Pr(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(Ir.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ie.isIP(n);return r!==0&&!De(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Ue(e,{lookupFn:t=Ar.promises.lookup}={}){let n=Pr(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ie.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=>!De(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function We({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let p=await t();n=p.Agent,r=p.fetch}catch(p){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);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=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=p=>(Array.isArray(p)?p:[p]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(ie.isIPv6(d.address)?6:4)})),c=(p,d,w)=>{i.set(o(p),a(typeof d=="string"?[{address:d,family:w}]:d))},s=p=>{let d=o(p);if(ie.isIP(d))return[{address:d,family:ie.isIPv6(d)?6:4}];let w=i.get(d);if(!w||!w.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return w},l=new n({connect:{lookup(p,d,w){let h;try{h=s(p)}catch(T){return w(T)}return d?.all?w(null,h):w(null,h[0].address,h[0].family)}}}),u=Or((p,d={})=>r(p,{...d,dispatcher:l}),c);return{dispatcher:l,fetch:u,pin:c,resolve:s,async close(){try{await l.destroy()}catch{}}}}function Or(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[Ge]=Object.freeze({pin:t}),e}function ze(e){return typeof e=="function"&&typeof e[Ge]?.pin=="function"}function Ot(e,t,n){if(!ze(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ge].pin(t,n)}var Ir,Ge,_t=he(()=>{Ir=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ge=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as _r}from"node:crypto";import{types as Y}from"node:util";function $(e){return ee(`HTTP JSON body refused: ${e}`)}function Br(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof Y[t]=="function"&&Y[t](e))}function jr(e){let t=[],n=0,r=0,o=0,i=0,a=new WeakSet,c=u=>{if(n+=Buffer.byteLength(u,"utf8"),n>V.bytes)throw $("serialized byte limit exceeded");t.push(u)},s=u=>{if(Buffer.byteLength(u,"utf8")>V.bytes)throw $("serialized byte limit exceeded");return JSON.stringify(u)},l=(u,p)=>{if(r+=1,r>V.nodes)throw $("node limit exceeded");if(p>V.depth)throw $("depth limit exceeded");if(u===null){c("null");return}if(typeof u=="string"){c(s(u));return}if(typeof u=="boolean"){c(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw $("non-finite number");c(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw $("unsupported non-JSON value");if(Y.isProxy(u))throw $("proxy value");if(Br(u))throw $("unsupported exotic object");if(a.has(u))throw $("cyclic value");a.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw $("symbol-keyed fields are unsupported");if(Array.isArray(u)){let h=Object.getPrototypeOf(u),T=0;for(;h!==null;){if(Y.isProxy(h))throw $("proxy array prototype");if(T+=1,T>V.depth)throw $("array prototype depth limit exceeded");h=Object.getPrototypeOf(h)}if(u.length>V.arrayLength)throw $("array length limit exceeded");for(let A=0;A<u.length;A+=1){let k=Object.getOwnPropertyDescriptor(u,String(A));if(!k||!Object.hasOwn(k,"value")||k.enumerable!==!0)throw $("array entries must be dense enumerable own data")}let S=0;for(let A in u){if(i+=1,i>V.fields)throw $("enumeration limit exceeded");if(Object.hasOwn(u,A)&&(S+=1,S>u.length))throw $("named array fields are unsupported")}if(S!==u.length)throw $("array entries must be dense enumerable own data");c("[");for(let A=0;A<u.length;A+=1)A&&c(","),l(Object.getOwnPropertyDescriptor(u,String(A)).value,p+1);c("]");return}let d=Object.getPrototypeOf(u);if(d!==Object.prototype&&d!==null)throw $("non-plain object");let w=[];for(let h in u){if(i+=1,i>V.fields)throw $("enumeration limit exceeded");if(!Object.hasOwn(u,h))continue;if(o+=1,o>V.fields)throw $("field limit exceeded");let T=Object.getOwnPropertyDescriptor(u,h);if(!T||!Object.hasOwn(T,"value")||T.enumerable!==!0)throw $("object fields must be enumerable own data");w.push([h,T.value])}c("{");for(let h=0;h<w.length;h+=1)h&&c(","),c(s(w[h][0])),c(":"),l(w[h][1],p+1);c("}")}finally{a.delete(u)}};return l(e,0),t.join("")}function Hr(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(Y.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let a=i.value;if(a==null||["object","function","symbol"].includes(typeof a))throw new TypeError("HTTP header values must be scalar");t[r]=String(a)}return t}function qr(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Dr(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 Ur(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Ee(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=$t.get(e);return t||(t=kt,kt+=1,$t.set(e,t)),`reference:${t}`}function Ft(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?Wr.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Lt(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}if(Array.isArray(n))return n.length>0&&n.every(Ft);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Ft(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Gr.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function zr(e,t,n,r={},o=null){let i=_r("sha256"),a=(s,l)=>{let u=String(l);i.update(String(Buffer.byteLength(s,"utf8"))).update(":").update(s),i.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
|
|
2
|
+
`)};a("method",e),a("url",t),Object.keys(n||{}).map((s,l)=>({name:s.toLowerCase(),order:l,value:String(n[s])})).sort((s,l)=>s.name.localeCompare(l.name)||s.order-l.order).forEach((s,l)=>{a(`header-name-${l}`,s.name),a(`header-value-${l}`,s.value)}),a("body",o??"-");for(let s of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])a(`context-${s}`,r[s]??"-");return i.digest("hex")}function Vr(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Rt):Math.min(250*2**e,Rt)+Math.floor(Math.random()*100)}function ee(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ye(e,t,n){return ee(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ae(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Kr(e){return e?e.byteLength??e.length??0:0}async function Jr(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&&(ae(e),!r))throw Ye(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let p=await e.text(),d=Buffer.byteLength(p,"utf8");if(d>t){if(!r)throw Ye(n,`body ${d} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let c=[],s=0,l=!1;try{for(;;){let{value:p,done:d}=await a.read();if(d)break;if(p&&(c.push(Buffer.from(p)),s+=Kr(p),s>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Ye(n,`streamed ${s} bytes`,t);let u=Buffer.concat(c);return(l?u.subarray(0,t):u).toString("utf8")}function Xr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Zr(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:c,untrustedUrl:s=!1,maxResponseBytes:l=null,sameOriginRedirectsOnly:u=!1,importUndici:p,validateResponse:d,signal:w,redirectPolicy:h="follow",maxRedirects:T=Se}){let S=new AbortController,A=setTimeout(()=>S.abort(),i),k=w?Ct?Ct([w,S.signal]):w:S.signal,y=null,g=t,L=a?{lookupFn:a}:{};if(s&&!c&&!ze(g))throw ee(`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 F=async(b,{status:E=null}={})=>{let v=await Ue(b,L);if(!v.ok)throw ee(E==null?`HTTP refused ${b}: ${v.error}`:`HTTP redirect to ${b} ${v.error}`,E==null?{}:{status:E});let _=new URL(b).hostname;if(c){if(y&&(await y.close(),y=null),!y)try{y=await We({requireUndici:!0,...p?{importUndici:p}:{}})}catch(f){throw ee(E==null?`HTTP refused ${b}: ${f?.message||f}`:`HTTP redirect to ${b} refused: ${f?.message||f}`,E==null?{}:{status:E})}y.pin(_,v.addresses),g=y.fetch}else Ot(g,_,v.addresses);return v};try{let b=String(e),E=Object.assign(Object.create(null),r||{});s&&await F(b);for(let v=0;v<=T;v+=1){let _=Object.assign(Object.create(null),{method:n,headers:E,body:o,signal:k,redirect:"manual",dispatcher:void 0}),f=await g(b,_);if((h==="error"||T===0)&&f.status>=300&&f.status<400)throw ae(f),ee(`HTTP ${f.status} ${n} redirect refused`,{status:f.status,redirectRefused:!0});if(Mr.has(f.status)){let D=u===!0&&n==="POST"&&[307,308].includes(f.status)&&Lt(n,o);if(n!=="GET"&&n!=="HEAD"&&!D){ae(f);let R=new Error(`HTTP ${f.status} ${n} ${b} redirected non-idempotent request`);throw R.status=f.status,R}if(v===T)throw ae(f),ee(`HTTP ${f.status} ${n} redirect budget exhausted`,{status:f.status,redirectRefused:!0});let C=f.headers?.get?.("location"),M;try{M=Dr(C,b)}catch(R){throw ae(f),R}let z=!Ur(M,b);if(ae(f),z&&n==="POST"){let R=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw R.status=f.status,R}if(z&&u){let R=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw R.status=f.status,R.retryable=!1,R}if(z&&(E=qr(E)),s)await F(M,{status:f.status});else if(z){let R=await Ue(M,L);if(!R.ok){let P=new Error(`HTTP redirect from ${b} ${R.error}`);throw P.status=f.status,P.retryable=!1,P}c&&R.addresses?.length&&(y||(y=await We(p?{importUndici:p}:{})),y&&(y.pin(new URL(M).hostname,R.addresses),g=y.fetch))}b=M;continue}if(typeof d=="function")try{await d(f,{url:b})}catch(D){throw ae(f),ee(D?.message||String(D))}let N=await Jr(f,l,{url:b,onOversize:()=>S.abort()}),ne=Xr(N);if(!f.ok){let D=new Error(`HTTP ${f.status} ${n} ${b}`);throw D.status=f.status,D.retryAfter=f.headers?.get?.("retry-after")??null,D.body=ne??N.slice(0,300),D}return ne??N}throw new Error(`HTTP redirect loop for ${e}`)}catch(b){if(S.signal.aborted&&!Ke(w)){let E=b&&(typeof b=="object"||typeof b=="function")&&!Y.isProxy(b)?b:null,v=E?Object.getOwnPropertyDescriptor(E,"oversize"):null;if(!(v&&Object.hasOwn(v,"value")&&v.value===!0))try{if(!E)throw new TypeError("unsafe rejection");Object.defineProperties(E,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let f=new Error("HTTP request timed out");throw Object.defineProperties(f,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),f}}throw b}finally{clearTimeout(A),y&&await y.close()}}async function fe(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Y.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let P of Object.getOwnPropertyNames(t)){let O=Object.getOwnPropertyDescriptor(t,P);if(!(P==="toJSON"&&O&&Object.hasOwn(O,"value")&&O.value===void 0)){if(!n.has(P))throw new TypeError("HTTP options contain unknown fields");if(!O||!O.enumerable||!Object.hasOwn(O,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=P=>{if(t==null||!Object.hasOwn(t,P))return;let O=Object.getOwnPropertyDescriptor(t,P);if(!O||!Object.hasOwn(O,"value"))throw new TypeError("HTTP options must contain own data properties");return O.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let a=r("retries");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>10))throw new TypeError("HTTP retries must be a bounded integer");let c=r("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let s=r("maxRedirects");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>Se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Se}`);if(c==="error"&&s!==void 0&&s!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let l=c??"follow",u=l==="error"?0:s??Se;for(let P of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let O=r(P);if(O!==void 0&&typeof O!="boolean")throw new TypeError(`HTTP ${P} must be boolean`)}let p=r("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let d=r("signal");if(d!==void 0){if(Y.isProxy(d)||!(d instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Ke(d)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let P of["importUndici","lookupFn","validateResponse"]){let O=r(P);if(O!==void 0&&typeof O!="function")throw new TypeError(`HTTP ${P} must be a function`)}let w=r("fetchImpl"),h=w||globalThis.fetch;if(typeof h!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let T=i??12e3,S=(o||"GET").toUpperCase(),A=r("headers"),k=Hr(A),y=Object.assign(Object.create(null),k);Object.keys(y).some(P=>P.toLowerCase()==="accept")||(y.Accept="application/json");let g=r("body");g!=null&&typeof g!="string"&&(Object.keys(y).find(O=>O.toLowerCase()==="content-type")||(y["Content-Type"]="application/json"),g=jr(g));let L=a??Rr,F=r("lookupFn"),b=!w,E=r("untrustedUrl")===!0,v=r("sameOriginRedirectsOnly")===!0,_=r("importUndici"),f=r("validateResponse"),N=d,ne=p??null,D=async()=>{let P;for(let O=0;O<=L;O++){N&&kr.call(N);try{return await Zr(e,{fetchImpl:h,method:S,headers:y,body:g,timeoutMs:T,lookupFn:F,realFetch:b,untrustedUrl:E,maxResponseBytes:ne,sameOriginRedirectsOnly:v,importUndici:_,validateResponse:f,signal:N,redirectPolicy:l,maxRedirects:u})}catch(re){P=re;let ce=Oe=>{if(!re||typeof re!="object"&&typeof re!="function"||Y.isProxy(re))return;let pe=Object.getOwnPropertyDescriptor(re,Oe);return pe&&Object.hasOwn(pe,"value")?pe.value:void 0},Pe=ce("status"),gn=ce("oracleTimeout")===!0||ce("name")==="AbortError"||ce("name")==="TimeoutError"||Ke(N),bn=new Set([408,425,429]),En=ce("retryable")===!1?!1:Pe!=null?bn.has(Pe)||Nr.has(Pe)&&Nt.has(S):!gn&&Nt.has(S);if(O===L||!En)throw re;let it=Vr(O,ce("retryAfter"));N?await new Promise((Oe,pe)=>{let Sn=setTimeout(Oe,it);Fr.call(N,"abort",()=>{clearTimeout(Sn),pe(Lr(N)||new DOMException("Aborted","AbortError"))},{once:!0})}):await Yr(it)}}throw P};if(!(r("dedupe")!==!1&&!N&&Lt(S,g)))return D();let M=zr(S,e,y,{untrustedUrl:E,maxResponseBytes:ne,sameOriginRedirectsOnly:v,redirectPolicy:l,maxRedirects:u,timeoutMs:T,retries:L,fetchImpl:Ee(h),realFetch:b,lookupFn:Ee(F),importUndici:Ee(_),validateResponse:Ee(f)},g),z=Ve.get(M);if(z)return z;let R=D().finally(()=>Ve.delete(M));return Ve.set(M,R),R}async function Mt(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 c=a++;i[c]=await n(r[c],c)}})),i}var Nr,Nt,Rr,Rt,Cr,$r,kr,Fr,Ct,Ke,Lr,Mr,Se,Si,V,Ve,$t,kt,Wr,Gr,Yr,Je=he(()=>{_t();Nr=new Set([408,425,429,500,502,503,504]),Nt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Rr=2,Rt=4e3,Cr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,$r=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,kr=AbortSignal.prototype.throwIfAborted,Fr=EventTarget.prototype.addEventListener,Ct=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ke=e=>e?Cr.call(e):!1,Lr=e=>e?$r.call(e):void 0,Mr=new Set([301,302,303,307,308]),Se=3,Si=64*1024,V=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ve=new Map,$t=new WeakMap,kt=1;Wr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Gr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Yr=e=>new Promise(t=>setTimeout(t,e))});function Qe(e){return Ut.get(Number(e))||null}function Wt(e,t=process.env){let n=Qe(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Gt(e){return Ut.has(Number(e))}var Ze,Ut,zt=he(()=>{Ze={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}},Ut=new Map(Object.values(Ze).map(e=>[e.chainId,e]))});var nt={};Tn(nt,{PUBLIC_RPC_FALLBACKS:()=>tt,erc20Allowance:()=>mo,erc20BalanceOf:()=>ho,resolveRpcUrl:()=>Te,rpcBatch:()=>Zt,rpcBlockNumber:()=>uo,rpcCall:()=>K,rpcChainId:()=>lo,rpcGasPrice:()=>po,rpcGetBalance:()=>fo,rpcHealth:()=>Qt,rpcHealthAll:()=>yo,transactionReceipt:()=>wo});import{Interface as ro,getAddress as oo}from"ethers";function te(e,t){try{return oo(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function io(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 et(e){return e==null?null:Number.parseInt(String(e),16)}function Te(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Wt(e,n);return r||tt[Number(e)]||null}function Kt(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!ao.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function so(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Jt(e){if(e?.error)throw so(e.error);return e?.result}function co(e,t,n){return`${e}
|
|
3
3
|
${t}
|
|
4
|
-
${JSON.stringify(n??[])}`}async function Xt(e,t,n){return fe(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function Zt(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>Vt)throw new Error(`rpcBatch: at most ${Vt} calls`);for(let i of t)Kt(i?.method);let r=ve(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,a)=>({jsonrpc:"2.0",id:a+1,method:i.method,params:i.params||[]}));try{let i=await Xt(r,o,n);if(Array.isArray(i)&&i.length===t.length){let a=new Map(i.map(c=>[Number(c?.id),c]));return t.map((c,s)=>Jt(a.get(s+1)??i[s]))}}catch{}return Promise.all(t.map(i=>K(e,i.method,i.params||[],n)))}async function K(e,t,n=[],r={}){let o=String(t||""),i=Kt(o),a=ve(e,r);if(!a)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=Yt.get(a);if(u!=null)return u}let s=r.dedupe!==!1&&!r.signal?co(a,o,n):null;if(s&&me.has(s))return me.get(s);let l=(async()=>{let u=await Xt(a,{jsonrpc:"2.0",id:1,method:t,params:n},r),p=Jt(u);return i==="eth_chainid"&&typeof p=="string"&&Yt.set(a,p),p})();return s&&(me.set(s,l),l.finally(()=>{me.get(s)===l&&me.delete(s)}).catch(()=>{})),l}async function Qt(e,t={}){let[n,r]=await Zt(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:Qe(e)?.name||null}}async function uo(e,t={}){let n=await K(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function lo(e,t={}){let n=await K(e,"eth_chainId",[],t);return parseInt(n,16)}async function po(e,t={}){let n=await K(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function fo(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await K(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function mo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=te(e.token||e.tokenAddress,"token"),o=te(e.owner,"owner"),i=te(e.spender,"spender"),a=xe.encodeFunctionData("allowance",[o,i]),c=await K(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),s=xe.decodeFunctionResult("allowance",c),l=BigInt(s[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function ho(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=te(e.token||e.tokenAddress,"token"),o=te(e.account||e.owner||e.address,"account"),i=xe.encodeFunctionData("balanceOf",[o]),a=await K(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),c=xe.decodeFunctionResult("balanceOf",a),s=BigInt(c[0]);return{chainId:n,token:r,account:o,balance:s.toString(),balanceHex:`0x${s.toString(16)}`,blockTag:e.blockTag||"latest"}}async function wo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=io(e.txHash||e.hash||e.transactionHash),o=await K(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=et(o.status),a=i===1,c=i===1?"success":i===0?"reverted":"unknown",s=a?null:c==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?te(e.expectedTo,"expectedTo"):null,u=o.to?te(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,s=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:c,reason:s,statusCode:i,to:u,from:o.from?te(o.from,"receipt.from"):null,blockNumber:et(o.blockNumber),transactionIndex:et(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function yo(e={}){let t=e.chainIds||Object.values(Ze).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Gt(r)&&!tt[r]&&!ve(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Qt(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var xe,tt,ao,Vt,me,Yt,rt=he(()=>{Je();zt();xe=new ro(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);tt={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"};ao=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Vt=32,me=new Map,Yt=new Map});import{createHash as Bo}from"node:crypto";import{createHash as Tn,createHmac as An,timingSafeEqual as Qo}from"node:crypto";var In=2,Ne=300*1e3,Pn=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function _e(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(_e).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${_e(e[n])}`).join(",")}}`}function at(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function st(e=process.env){return at(process.env)||at(e)}function On(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function we(e){let t=On(e);return Tn("sha256").update(_e(t)).digest("hex")}function _n(e,t=st()){return t?An("sha256",t).update(String(e)).digest("hex"):""}function X(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 c={...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(!c.provider)throw new Error("stampPrepared: provider required");if(!c.kind)throw new Error("stampPrepared: kind required");let s=Number(o),l=i==null?s+Ne:Number(i),u=l-s;if(!Number.isSafeInteger(s)||!Number.isSafeInteger(l)||u<=0||u>Pn)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let d={...c,preparedAt:s,expiresAt:l,prepareVersion:In},w=we(d),h=st(r),v=h?_n(w,h):void 0,S={...d,prepareHash:w};return v&&(S.prepareMac=v),S}import{createHash as Nn}from"node:crypto";var Rn=1,$n=8,j=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},Cn=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),kn=new Set(["family","id"]),Fn=new Set(["id","startsAt","endsAt","eligibility"]),Ln=new Set(["kind","proofFormat","proofDigest"]),Mn=new Set(["amount","unit"]),Bn=new Set(["value","unit"]);function ue(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new j(`${t} must be a plain object`);return e}function le(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new j(`${n} has unknown field ${r}`,"unknown-field")}function W(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new j(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function jn(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new j(`${t} must be a positive safe integer`);return e}function Re(e,t){if(e=ue(e,t),le(e,Mn,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new j(`${t} requires amount and unit`,"ambiguous-unit");let n=W(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new j(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:W(e.unit,`${t}.unit`)}}function $e(e,t){if(e=ue(e,t),le(e,Bn,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new j(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function Hn(e,t){e=ue(e,t),le(e,Ln,t);let n=W(e.kind,`${t}.kind`),r=W(e.proofFormat,`${t}.proofFormat`),o=W(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new j(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function qn(e,t){let n=`stages[${t}]`;e=ue(e,n),le(e,Fn,n);let r=$e(e.startsAt,`${n}.startsAt`),o=$e(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new j(`${n} must end after it starts`,"invalid-stage-range");return{id:W(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:Hn(e.eligibility,`${n}.eligibility`)}}function Ce(e){if(e=ue(e,"input"),le(e,Cn,"input"),e.version!==Rn)throw new j("version must be 1");let t=ue(e.chain,"chain");le(t,kn,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>$n)throw new j("stages must contain 1 through 8 entries","stage-count");let r=n.map(qn).sort((a,c)=>a.startsAt.value-c.startsAt.value||a.id.localeCompare(c.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new j("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 j("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new j("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:W(t.family,"chain.family"),id:W(t.id,"chain.id")},marketplace:W(e.marketplace,"marketplace"),mechanism:W(e.mechanism,"mechanism"),collection:W(e.collection,"collection"),recipient:W(e.recipient,"recipient"),quantity:jn(e.quantity,"quantity"),stages:r,mintValueCap:Re(e.mintValueCap,"mintValueCap"),networkFeeCap:Re(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:Re(e.priorityFeeCap,"priorityFeeCap"),expiry:$e(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new j("every stage must end no later than expiry","stage-after-expiry");return i}function Dn(e){return JSON.stringify(Ce(e))}function ct(e){return`sha256:${Nn("sha256").update(Dn(e),"utf8").digest("hex")}`}var ke=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),oe=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Fe=Object.freeze(Object.values(oe)),ut=new Set(Fe),lt=Object.freeze(Fe.slice(0,4)),Un=Fe,Wn=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),H=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function ye(e,t){if(!Array.isArray(e)||e.length===0)throw new H(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new H(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new H(`${t} contains duplicates`);return[...n].sort()}function Gn(e){if(!Array.isArray(e))throw new H("capabilities must be an array");let t=new Set(e);for(let n of t)if(!ut.has(n))throw new H(`unknown capability ${n}`,"unknown-capability");return Un.every(n=>t.has(n))?ke.AUTOMINT_READY:lt.every(n=>t.has(n))?ke.PREPARE_READY:ke.RESEARCH_ONLY}function Le(e=[]){if(!Array.isArray(e))throw new H("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new H("entry must be an object");for(let i of Object.keys(n))if(!Wn.has(i))throw new H(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new H("entry id must be an exact string");if(t.has(n.id))throw new H(`duplicate entry id ${n.id}`,"duplicate-entry");let r=ye(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(ye(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(ye(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(ye(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:Gn(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=lt){let o=t.get(n);if(!o)throw new H(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!ut.has(i))throw new H(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new H(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var ri=Le([]);import{getAddress as zn,Interface as Me,keccak256 as Vn}from"ethers";var Z=Object.freeze({manifold:new Me(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Me(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Me(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),je=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"})}),si=Object.freeze(Object.fromEntries(Object.entries(je).map(([e,t])=>[Z[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function x(e){throw new Error(`evm-mint-launchpads: ${e}`)}function U(e,t){try{return zn(String(e||""))}catch{return x(`invalid ${t}`)}}function q(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&x(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return x(`${t} must be an unsigned integer`)}}function Be(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&x(`invalid ${t}`),e.map(String)}function Yn(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&x("invalid chainId");let o=U(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&U(u.contract,"reviewed contract")===o);a||x("unsupported contract or wrong chain");let c=U(a.mintTarget||a.contract,"reviewed mint target"),s=Z[e].getFunction(je[e].signature).selector.toLowerCase();return(!(a.selectors||[s]).map(u=>String(u).toLowerCase()).includes(s)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&x("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:c,selector:s,review:a}}async function Kn(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);x("runtime bytecode verification required")}function Jn(e,t){let n=e.stage;if(!n)return null;let r=q(n.startTime,"stage startTime"),o=q(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&x("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function Xn(e,t){let n=je[e];String(t).slice(0,10).toLowerCase()!==Z[e].getFunction(n.signature).selector.toLowerCase()&&x("unknown selector");let r;try{r=Z[e].decodeFunctionData(n.signature,t)}catch{x("invalid calldata layout")}let o;return e==="manifold"&&(o=Z.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Z.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Z.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&x("calldata must be canonical with no suffix"),r}async function pt(e,t={},n={}){Z[e]||x("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=Yn(e,t,n),c=U(t.recipient||t.minter,"recipient"),s=q(t.quantity,"quantity",{positive:!0}),l=q(t.priceWei,"priceWei"),u=q(t.maxValueWei,"maxValueWei"),p=q(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),d=t.transaction||t.tx;(!d||Number(d.chainId)!==r)&&x("transaction chain mismatch"),U(d.to,"transaction target")!==i&&x("transaction target mismatch");let w=await Kn(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(w))||w==="0x"||Vn(w).toLowerCase()!==String(a.codeHash).toLowerCase())&&x("runtime bytecode is not reviewed");let h=Xn(e,d.data),v=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),S=Jn(t,v),A,k,y,g=null,L=[];if(e==="manifold")U(h[0],"calldata contract")!==o&&x("calldata contract mismatch"),(t.instanceId==null||q(h[1],"instanceId")!==q(t.instanceId,"instanceId"))&&x("instance/stage mismatch"),(t.mintIndex==null||q(h[2],"mintIndex")!==q(t.mintIndex,"mintIndex"))&&x("mint index/stage mismatch"),L=Be([...h[3]]),A=U(h[4],"calldata recipient"),k=1n,y=l;else if(e==="zora")A=U(h[0],"calldata recipient"),k=BigInt(h[1]),y=l,t.comment!=null&&h[2]!==String(t.comment)&&x("comment mismatch"),t.mintReferral!=null&&U(h[3],"mint referral")!==U(t.mintReferral,"expected mint referral")&&x("mint referral mismatch");else{A=U(h[0],"calldata recipient"),k=BigInt(h[1]),y=BigInt(h[3]);let _=h[4];L=Be([..._.proof]),g=BigInt(_.quantityLimitPerWallet),g<s&&x("wallet allowance below quantity"),(BigInt(_.pricePerToken)!==l||U(_.currency,"allowlist currency")!==U(h[2],"currency"))&&x("allowlist terms mismatch")}A!==c&&x("recipient mismatch"),k!==s&&x("quantity mismatch"),y!==l&&x("price mismatch"),t.proof!=null&&JSON.stringify(L.map(_=>_.toLowerCase()))!==JSON.stringify(Be(t.proof).map(_=>_.toLowerCase()))&&x("proof mismatch");let F=q(d.value??0,"transaction value"),b=l*s;(F<b||F-b>p||F>u)&&x("transaction value or fee cap exceeded");let E=d.gasLimit==null?null:q(d.gasLimit,"gasLimit"),T=d.maxFeePerGas==null?null:q(d.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>q(t.maxGasLimit,"maxGasLimit"))&&x("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(T==null||T>q(t.maxFeePerGasWei,"maxFeePerGasWei"))&&x("gas fee cap exceeded"),X({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:c,quantity:s.toString(),priceWei:l.toString(),valueWei:F.toString(),platformFeeWei:(F-b).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:p.toString(),...S?{stage:S}:{},...g==null?{}:{walletAllowance:g.toString()},proof:L,transaction:{chainId:r,to:i,data:d.data,value:F.toString(),...E==null?{}:{gasLimit:E.toString()},...T==null?{}:{maxFeePerGas:T.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var Zn="RESEARCH_ONLY";var Qn="canonical serialized-message decoding and program-specific instruction validation are not implemented",ge=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),ui=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function er(){throw new Error(`solana-mint: ${Zn}; disabled until ${Qn}`)}function dt(){er()}import{Address as tr,CompactSize as nr,NETWORK as rr,OutScript as vt,Script as or,TEST_NETWORK as ft,Transaction as ir,utils as ar}from"@scure/btc-signer";import{createHash as de}from"node:crypto";var mt="universal-ordinals-mint",ht="bitcoin-ordinals-mint-plan",sr=1800*1e3,cr=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),wt=new Set,ur=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function G(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function Q(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 He(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 Tt(e,t){let n=G(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 lr(e){return e==="bitcoin"||e==="mainnet"?rr:e==="regtest"?{...ft,bech32:"bcrt"}:ft}function yt(e,t){try{let n=vt.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 pr(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function dr(e){let t=de("sha256").update(e.unsignedTx).digest();return de("sha256").update(t).digest().reverse().toString("hex")}function gt(e,...t){let n=de("sha256").update(e,"ascii").digest();return de("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function fr(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 c=gt("TapLeaf",Buffer.from([a]),Buffer.from(nr.encode(BigInt(i.length))),i);for(let u of e.merklePath){let p=Buffer.from(u);c=gt("TapBranch",...Buffer.compare(c,p)<0?[c,p]:[p,c])}let[s,l]=ar.taprootTweakPubkey(e.internalKey,c);if(!Buffer.from(s).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 bt(e,t){let n=G(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=ir.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},(c,s)=>{let l=o.getInput(s);for(let d of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(pr(l[d]))throw new Error(`${t} contains signed/finalized input ${s}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${s} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${s} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${s} requires witnessUtxo value and script`);let u=yt(l.witnessUtxo.script,`${t} input ${s} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${s} uses SIGHASH_DEFAULT for a non-taproot prevout`);let p=(l.tapLeafScript||[]).map(([d,w],h)=>fr(d,w,u,`${t} input ${s} tapLeafScript ${h}`));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:p}}),a=Array.from({length:o.outputsLength},(c,s)=>{let l=o.getOutput(s);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${s} contains opaque unknown/proprietary fields`);return yt(l.script,`${t} output ${s} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:dr(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 mr(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 hr(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 wr=new Set([1,3]);function yr(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=hr(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!wr.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let c=r.get(i)||[];c.push(Buffer.from(a)),r.set(i,c)}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 gr(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let p;try{p=or.decode(u)}catch(d){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${d?.message||"script decode failed"})`)}for(let d=0;d+2<p.length;d+=1)p[d]===0&&p[d+1]==="IF"&&p[d+2]instanceof Uint8Array&&Buffer.from(p[d+2]).equals(Buffer.from("ord","ascii"))&&o.push(yr(p,d))}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 c;try{c=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(c!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(de("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||mr(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 Et(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 br(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 At(e,t="parentId"){let n=G(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 It(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=G(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=Q(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function Er(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,c)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${c} invalid`);return{role:G(a.role,`revealOutputs[${c}].role`),address:G(a.address,`revealOutputs[${c}].address`),valueSats:Q(a.valueSats??a.value,`revealOutputs[${c}].valueSats`).toString(),scriptHex:Tt(a.scriptHex,`revealOutputs[${c}].scriptHex`),...a.parentId==null?{}:{parentId:At(a.parentId,`revealOutputs[${c}].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 Sr(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:G(n?.role,`commitOutputs[${r}].role`),valueSats:Q(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:Tt(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 St(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 xt(e,t,n){try{return Buffer.from(vt.encode(tr(lr(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 xr(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)=>It({...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 vr(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");br(e);for(let f of["content","contentBytes","body","file","path","url","contentUrl"])if(e[f]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let f of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[f]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=G(e.network,"network").toLowerCase();if(!cr.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=G(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=G(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=At(e.parentId??e.parentInscriptionId),a=G(e.recipient??e.destination,"recipient"),c=Q(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 s=e.commitInputs.map(It);if(new Set(s.map(f=>f.outpoint)).size!==s.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");xr(e,s);let l=bt(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=bt(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),p=Sr(e.commitOutputs),d=Er(e.revealOutputs,{recipient:a,parentId:i,postageSats:c});if(l.inputs.length!==s.length||l.inputs.some((f,N)=>f.txid!==s[N].txid||f.vout!==s[N].vout||f.valueSats!==s[N].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");St(l.outputs,p,"commit PSBT"),St(u.outputs,d,"reveal PSBT");let w=xt(a,n,"recipient");if(d.find(f=>f.role==="inscription").scriptHex!==w)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[f,N]of d.entries())if(N.scriptHex!==xt(N.address,n,`revealOutputs[${f}].address`))throw new Error(`ordinals mint: reveal output ${f} script does not pay its bound address`);let h=p.findIndex(f=>f.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let v=u.inputs.filter(f=>f.txid===l.txid&&f.vout===h);if(v.length!==1||v[0].valueSats!==p[h].valueSats||v[0].scriptHex!==p[h].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");gr(u,{contentHash:r,contentType:o,parentId:i});let S=He(e.commitFeeRateSatVb,"commitFeeRateSatVb"),A=He(e.revealFeeRateSatVb,"revealFeeRateSatVb"),k=He(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(k<=0||S>k||A>k)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let y=Q(e.commitFeeSats,"commitFeeSats"),g=Q(e.revealFeeSats,"revealFeeSats"),L=Q(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(y+g>L)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==y.toString()||u.feeSats!==g.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(y)/l.vsizeLowerBound>S||Number(g)/u.vsizeLowerBound>A)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(f=>f.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let E=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:Q(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(E.enabled){if(!Number.isSafeInteger(E.outputIndex)||E.outputIndex<0||d[E.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(d[E.outputIndex].valueSats!==E.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(d.some(f=>f.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let T=Number(t.nowMs??Date.now()),_=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(_)||_<=T||_-T>sr)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:c,commitInputs:l.inputs.map(Et),commitPsbt:l.encoded,commitOutputs:p,revealInputs:u.inputs.map(Et),revealPsbt:u.encoded,revealOutputs:d,commitRate:S,revealRate:A,maxRate:k,commitFee:y.toString(),revealFee:g.toString(),maxTotalFee:L.toString(),rbf:e.rbf,cpfp:E,expiresAt:_}}function Tr(e={},t={}){let n=vr(e,t),r=n.commitInputs.find(c=>wt.has(c.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:mt,kind:ht,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...ur},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=X(i,{provider:mt,kind:ht,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let c of n.commitInputs)wt.add(c.outpoint);return a}var Pt=Tr;Je();import{readFileSync as go,existsSync as bo}from"node:fs";import{getAddress as Eo,Interface as Ae,TypedDataEncoder as Ri,parseUnits as $i}from"ethers";var Bt="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ht({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:jt(t)};let c;try{c=new URL(a)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(c.protocol!=="http:"&&c.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let s=c.host;if(!s)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([jt(t),...n]).has(s)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(s);return c.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:s,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:s}}if(String(process.env[Bt]||"")==="1")return{baseUrl:a,trusted:!1,host:s};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${s} (set ${Bt}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:s}}function jt(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function qt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var Qr=/^(0|[1-9][0-9]*)$/,Xe=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function se(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(!Qr.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 eo(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function to(e={}){return e.maxFeePerGas!=null?se(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?se(e.gasPrice,"gasPrice"):null}function no(e={}){try{let t=eo(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=se(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=se(n.gasLimit??n.gas,"gasLimit"),c=to(n);if(c==null)throw new Error("maxFeePerGas or gasPrice required");let s=se(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=se(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:se(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),p=a*c;return p>i?{ok:!1,status:"BLOCK",reason:`total gas ${p} exceeds cap ${i}`,chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:s!=null&&c>s?{ok:!1,status:"BLOCK",reason:`unit fee ${c} exceeds cap ${s}`,chainId:t,unitFeeWei:c.toString(),maxFeePerGasWei:s.toString(),totalGasWei:p.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:p.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString(),unitFeeWei:c.toString(),maxFeePerGasWei:s?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function Dt(e={}){let t=no(e);if(!t.ok)throw new Xe(t);return t}var So="https://api.opensea.io/api/v2",xo="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)",vo=new Ae([`function ${xo}`]),Te=new Ae(["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"]),To=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"]),Mi=new Set(To);function Ao(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!bo(e))return"";try{for(let t of go(e,"utf8").split(`
|
|
5
|
-
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function ot(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||Ao()}function nn(e={}){return Ht({provider:"opensea",defaultUrl:So,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function rn(e={}){return nn(e).baseUrl}function on(e={}){return qt({accept:"application/json"},{"x-api-key":ot(e)},nn(e).trusted)}function J(e,t="address"){try{return Eo(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}async function Io(e,t={}){if(!e)throw new Error("collection slug required");if(!ot(t))throw new Error("OPENSEA_API_KEY required");return fe(`${rn(t)}/collections/${encodeURIComponent(e)}`,{headers:on(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var Po=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 Oo(e){let t=String(e||"").trim().toLowerCase(),n=Po[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function en(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 _o(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 No(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 Ro(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()}var Bi=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 $o(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 an(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"&&an(n))}function sn(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function cn(e){return!e||typeof e!="object"?!1:sn(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&cn(t))}function un(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"&&un(o,t,n);return t}function tn(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Co(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(sn(e))throw new Error("opensea: signed transaction material refused");if((e.from?J(tn(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=J(tn(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,c=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&c){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=vo.encodeFunctionData("fulfillAdvancedOrder",[c.advancedOrder,c.criteriaResolvers,c.fulfillerConduitKey,c.recipient])}let s=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(s))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");s.endsWith(l.slice(2))||(s+=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 p=_o(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:s,value:p.hex,chainId:n,valueWei:p.amount}}function ln(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 ko(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Mt(e,4,async s=>{let{chainId:l,...u}=ln(s);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,h]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(h).toString()}let{rpcCall:p}=await Promise.resolve().then(()=>(rt(),nt)),d={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,w]=await Promise.all([p(t,"eth_call",[u,"pending"],d),p(t,"eth_estimateGas",[u],d)]);return BigInt(w).toString()}),a=null,c=null;if(r&&typeof r.getFeeData=="function"){let s=await r.getFeeData();c=s?.maxPriorityFeePerGas==null?0n:BigInt(s.maxPriorityFeePerGas),a=s?.maxFeePerGas==null?s?.gasPrice==null?null:BigInt(s.gasPrice):BigInt(s.maxFeePerGas)}else if(o){let{rpcCall:s}=await Promise.resolve().then(()=>(rt(),nt)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await s(t,"eth_gasPrice",[],l));try{c=BigInt(await s(t,"eth_maxPriorityFeePerGas",[],l))}catch{c=0n}let p=await s(t,"eth_getBlockByNumber",["pending",!1],l),w=(p?.baseFeePerGas==null?0n:BigInt(p.baseFeePerGas))*2n+c;a=u>w?u:w}return a!=null&&c!=null&&e.forEach((s,l)=>{let p=(BigInt(i[l])*120n+99n)/100n;s.gasLimit=p.toString(),s.maxPriorityFeePerGas=c.toString(),s.maxFeePerGas=a.toString(),s.worstCaseFeeWei=(p*a).toString()}),{simulated:!0,gasEstimates:i}}function Fo(e,t){if(an(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(cn(e))throw new Error("opensea: signed transaction material refused");let n=un(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=>Co(r,t))}function Lo(e,t,n={}){return X({...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)}function Mo(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=J(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function pn(e={},t={}){if(!ot(t))throw new Error("OPENSEA_API_KEY required");$o(e);let{chain:n,chainId:r}=Oo(e.chain),o=J(e.buyer||e.minter||e.address,"buyer"),i=J(e.contract,"NFT contract"),a=No(e.quantity),c=en(e.priceWei,"priceWei"),s=en(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Ro(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 p=String(e.slug||"").trim();if(!p)throw new Error("opensea: collection slug required");let d=await Io(p,t),w=Mo(d,n,i),h=c*BigInt(a);if(h>s)throw new Error("opensea: mint total exceeds total cap");let v=await fe(`${rn(t)}/drops/${encodeURIComponent(p)}/mint`,{method:"POST",headers:on(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),S=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,A=Array.isArray(S)?S:S?[S]:[];if(!A.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let k=new Set(A.map($=>J($,"SeaDrop mint target"))),y=Fo(v,{buyer:o,chainId:r,targets:k});if(y.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let g,L,F=null,b;try{g=Te.decodeFunctionData("mintPublic",y[0].data),L="public",b=Te.encodeFunctionData("mintPublic",[g[0],g[1],g[2],g[3]])}catch{try{g=Te.decodeFunctionData("mintAllowList",y[0].data),L="allowlist";let $=g[4],M=[...g[5]].map(String);if(M.length<1||M.length>64||M.some(O=>!/^0x[0-9a-fA-F]{64}$/.test(O)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let z=BigInt($.startTime),R=BigInt($.endTime),P=BigInt(Math.floor(l/1e3));if(z>P||R<=P)throw new Error("opensea: allowlist mint stage is not open");if(BigInt($.mintPrice)!==c)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt($.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");b=Te.encodeFunctionData("mintAllowList",[g[0],g[1],g[2],g[3],$,M]),F={mintPrice:BigInt($.mintPrice).toString(),maxTotalMintableByWallet:BigInt($.maxTotalMintableByWallet).toString(),startTime:z.toString(),endTime:R.toString(),dropStageIndex:BigInt($.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt($.maxTokenSupplyForStage).toString(),feeBps:Number($.feeBps),restrictFeeRecipients:!!$.restrictFeeRecipients,proof:M}}catch($){throw/opensea:/.test(String($?.message||""))?$:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=J(g[0],"mint NFT contract"),T=J(g[1],"mint fee recipient"),_=J(g[2],"mint recipient");if(E!==w)throw new Error("opensea: mint calldata collection mismatch");if(_!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(g[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(b.toLowerCase()!==y[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let f=y.reduce(($,M)=>$+M.valueWei,0n);if(f!==h)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(f>s)throw new Error("opensea: mint total exceeds total cap");let N=await ko(y,r,{...t,provider:e.provider||t.provider});if(N.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let ne=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},D=Dt({chainId:r,tx:y[0],policy:ne});return Lo({action:"mint",mintType:L,...F?{stage:F}:{},chain:n,chainId:r,slug:p,buyer:o,contract:w,quantity:a,priceWei:c.toString(),totalWei:f.toString(),maxTotalWei:s.toString(),mintTarget:y[0].to,feeRecipient:T,expiry:u,transactions:y.map(ln),gasWar:D,...N},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Ne,Date.parse(u),F?Number(BigInt(F.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}var ji=new Ae(["function setApprovalForAll(address operator,bool approved)"]),Hi=new Ae(["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)"]);var jo=Object.freeze([oe.DISCOVERY,oe.ELIGIBILITY,oe.PREPARATION,oe.SIMULATION]),dn=[["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",ge.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",ge.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",ge.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],fn=Object.freeze(dn.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([oe.DISCOVERY]):jo,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),Ji=Le(fn.map(({family:e,tier:t,enabled:n,...r})=>r)),mn=new Map(dn.map(e=>[e[0],e])),Ho=new Set(["intent","adapterId","input"]),qo=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Ie=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function I(e,t,n){throw new Ie(e,t,n?{cause:n}:{})}function m(e,t,n){String(e??"")!==String(t)&&I("intent-mismatch",`${n} does not match canonical intent`)}function B(e,t,n){let r=e[t];return r.unit!==n&&I("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function hn(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))qo.test(n)&&I("custody-refused",`${t}.${n} is outside the prepare-only boundary`),hn(r,`${t}.${n}`)}function Do(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function Uo(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&I("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(s=>s.id===t.stageId);o||I("intent-mismatch","stageId does not match canonical intent"),m(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${Bo("sha256").update(JSON.stringify(Do(n,t))).digest("hex")}`;m(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),c=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(c))&&I("invalid-request","decoded input requires exact stage bounds"),m(a,o.startsAt.value,"stage start"),m(c,o.endsAt.value,"stage end"),(r<a||r>=c)&&I("expired-intent","canonical mint stage is not active at authoritative now"),o}function Wo(e,t){let n=mn.get(t);n||I("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return m(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&I("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function Go(e,t){e.chain.family==="evm"?(m(t.chainId,e.chain.id,"network"),m(t.contract,e.collection,"collection/drop"),m(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity"),m(t.maxValueWei??t.maxTotalWei,B(e,"mintValueCap","wei"),"mint-value cap"),m(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,B(e,"networkFeeCap","wei"),"network-fee cap"),m(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,B(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(m(t.network,e.chain.id,"network"),m(t.collection??t.drop??t.identity,e.collection,"collection/drop"),m(t.recipientOwner??t.recipient,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity"),m(t.priceLamports,B(e,"mintValueCap","lamports"),"mint-value cap"),m(t.networkFeeCapLamports,B(e,"networkFeeCap","lamports"),"network-fee cap"),m(t.priorityFeeCapLamports,B(e,"priorityFeeCap","lamports"),"priority-fee cap")):(m(t.network,e.chain.id,"network"),m(t.parentId,e.collection,"collection/drop"),m(t.recipient,e.recipient,"recipient"),m(e.quantity,1,"Ordinals quantity"),m(t.postageSats,B(e,"mintValueCap","sats"),"mint-value cap"),m(t.maxTotalFeeSats,B(e,"networkFeeCap","sats"),"network-fee cap"),m(t.maxFeeRateSatVb,B(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function zo(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==we(e))&&I("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&I("custody-refused","leaf artifact is not strictly prepare-only")}function Vo(e,t,n){m(t.chainId,e.chain.id,"network"),m(t.contract,e.collection,"collection/drop"),m(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity");let r=B(e,"mintValueCap","wei"),o=B(e,"networkFeeCap","wei"),i=B(e,"priorityFeeCap","wei-per-gas");m(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),m(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),m(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||I("artifact-mismatch","prepared EVM transaction is missing"),m(a.chainId,e.chain.id,"artifact network");let c=BigInt(a.gasLimit??0),s=BigInt(a.maxFeePerGas??0);(!c||!s||c*s>o)&&I("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)&&I("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),m(n.contract,e.collection,"artifact collection/drop"),m(n.recipient??n.buyer,e.recipient,"artifact recipient"),m(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&I("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(c*s).toString(),priorityFee:l.toString()}}function Yo(e,t,n){m(t.network,e.chain.id,"network"),m(t.collection??t.drop??t.identity,e.collection,"collection/drop"),m(t.recipientOwner??t.recipient,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity"),m(t.priceLamports,B(e,"mintValueCap","lamports"),"mint-value cap");let r=B(e,"networkFeeCap","lamports"),o=B(e,"priorityFeeCap","lamports");m(t.networkFeeCapLamports,r,"network-fee cap"),m(t.priorityFeeCapLamports,o,"priority-fee cap"),m(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let c of a.instructions)if(String(c.decoded?.type).toLowerCase().includes("price")){let s=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(s)*BigInt(c.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&I("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function Ko(e,t,n){return m(t.network,e.chain.id,"network"),m(t.parentId,e.collection,"collection/drop"),m(t.recipient,e.recipient,"recipient"),m(e.quantity,1,"Ordinals quantity"),m(t.postageSats,B(e,"mintValueCap","sats"),"mint-value cap"),m(t.maxTotalFeeSats,B(e,"networkFeeCap","sats"),"network-fee cap"),m(t.maxFeeRateSatVb,B(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),m(n.plan.network,e.chain.id,"artifact network"),m(n.plan.parentId,e.collection,"artifact collection/drop"),m(n.plan.recipient,e.recipient,"artifact recipient"),m(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),m(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),m(n.plan.caps.maxFeeRateSatVb,e.priorityFeeCap.amount,"artifact priority-fee cap"),{networkFee:(BigInt(n.plan.commit.feeSats)+BigInt(n.plan.reveal.feeSats)).toString(),priorityFee:String(n.plan.caps.maxFeeRateSatVb)}}function wn(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:fn})}async function Jo(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:wn()}}async function yn(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&I("invalid-request","request must be a plain object");for(let u of Object.keys(e))Ho.has(u)||I("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&I("invalid-request","explicit adapterId is required; adapter inference is refused"),mn.has(e.adapterId)||I("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&I("invalid-request","family-specific decoded input is required"),hn(n);let r;try{r=Ce(e.intent)}catch(u){I("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||I("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&I("expired-intent","canonical mint intent has expired");let i=Wo(r,e.adapterId);i[1]==="solana"&&I("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=Uo(r,n,r.chain.family,o);Go(r,n);let c;try{i[4]==="evm"?c=await pt(i[5],n,t):i[4]==="opensea"?c=await pn(n,t):i[4]==="solana"?(m(n.programId,i[5],"selected Solana adapter program"),c=await dt(n,t)):c=await Pt(n,t)}catch(u){if(u instanceof Ie)throw u;I("adapter-refused",u?.message||"adapter preparation failed",u)}zo(c);let s=i[4]==="bitcoin"?Ko(r,n,c):i[4]==="solana"?Yo(r,n,c):Vo(r,n,c),l=Object.freeze({intentHash:ct(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:s.networkFee,observedPriorityFee:s.priorityFee});return X({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:c},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(c.expiresAt))})}var Xi=yn,Zi=yn,Qi=wn,ea=Jo;export{fn as UNIVERSAL_MINT_ADAPTERS,Ji as UNIVERSAL_MINT_ROUTER_REGISTRY,Ie as UniversalMintRouterError,Qi as getUniversalMintCapabilities,ea as getUniversalMintHealth,yn as prepareUniversalMint,Zi as prepareUniversalMintAdmin,Xi as prepareUniversalMintPublic,wn as universalMintCapabilities,Jo as universalMintHealth};
|
|
4
|
+
${JSON.stringify(n??[])}`}async function Xt(e,t,n){return fe(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function Zt(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>Vt)throw new Error(`rpcBatch: at most ${Vt} calls`);for(let i of t)Kt(i?.method);let r=Te(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,a)=>({jsonrpc:"2.0",id:a+1,method:i.method,params:i.params||[]}));try{let i=await Xt(r,o,n);if(Array.isArray(i)&&i.length===t.length){let a=new Map(i.map(c=>[Number(c?.id),c]));return t.map((c,s)=>Jt(a.get(s+1)??i[s]))}}catch{}return Promise.all(t.map(i=>K(e,i.method,i.params||[],n)))}async function K(e,t,n=[],r={}){let o=String(t||""),i=Kt(o),a=Te(e,r);if(!a)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=Yt.get(a);if(u!=null)return u}let s=r.dedupe!==!1&&!r.signal?co(a,o,n):null;if(s&&me.has(s))return me.get(s);let l=(async()=>{let u=await Xt(a,{jsonrpc:"2.0",id:1,method:t,params:n},r),p=Jt(u);return i==="eth_chainid"&&typeof p=="string"&&Yt.set(a,p),p})();return s&&(me.set(s,l),l.finally(()=>{me.get(s)===l&&me.delete(s)}).catch(()=>{})),l}async function Qt(e,t={}){let[n,r]=await Zt(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:Qe(e)?.name||null}}async function uo(e,t={}){let n=await K(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function lo(e,t={}){let n=await K(e,"eth_chainId",[],t);return parseInt(n,16)}async function po(e,t={}){let n=await K(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function fo(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await K(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function mo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=te(e.token||e.tokenAddress,"token"),o=te(e.owner,"owner"),i=te(e.spender,"spender"),a=xe.encodeFunctionData("allowance",[o,i]),c=await K(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),s=xe.decodeFunctionResult("allowance",c),l=BigInt(s[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function ho(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=te(e.token||e.tokenAddress,"token"),o=te(e.account||e.owner||e.address,"account"),i=xe.encodeFunctionData("balanceOf",[o]),a=await K(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),c=xe.decodeFunctionResult("balanceOf",a),s=BigInt(c[0]);return{chainId:n,token:r,account:o,balance:s.toString(),balanceHex:`0x${s.toString(16)}`,blockTag:e.blockTag||"latest"}}async function wo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=io(e.txHash||e.hash||e.transactionHash),o=await K(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=et(o.status),a=i===1,c=i===1?"success":i===0?"reverted":"unknown",s=a?null:c==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?te(e.expectedTo,"expectedTo"):null,u=o.to?te(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,s=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:c,reason:s,statusCode:i,to:u,from:o.from?te(o.from,"receipt.from"):null,blockNumber:et(o.blockNumber),transactionIndex:et(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function yo(e={}){let t=e.chainIds||Object.values(Ze).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Gt(r)&&!tt[r]&&!Te(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Qt(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var xe,tt,ao,Vt,me,Yt,rt=he(()=>{Je();zt();xe=new ro(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);tt={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"};ao=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Vt=32,me=new Map,Yt=new Map});import{createHash as Bo}from"node:crypto";import{createHash as vn,createHmac as An,timingSafeEqual as Qo}from"node:crypto";var In=2,Ne=300*1e3,Pn=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function _e(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(_e).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${_e(e[n])}`).join(",")}}`}function at(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function st(e=process.env){return at(process.env)||at(e)}function On(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function we(e){let t=On(e);return vn("sha256").update(_e(t)).digest("hex")}function _n(e,t=st()){return t?An("sha256",t).update(String(e)).digest("hex"):""}function X(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 c={...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(!c.provider)throw new Error("stampPrepared: provider required");if(!c.kind)throw new Error("stampPrepared: kind required");let s=Number(o),l=i==null?s+Ne:Number(i),u=l-s;if(!Number.isSafeInteger(s)||!Number.isSafeInteger(l)||u<=0||u>Pn)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let d={...c,preparedAt:s,expiresAt:l,prepareVersion:In},w=we(d),h=st(r),T=h?_n(w,h):void 0,S={...d,prepareHash:w};return T&&(S.prepareMac=T),S}import{createHash as Nn}from"node:crypto";var Rn=1,Cn=8,j=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},$n=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),kn=new Set(["family","id"]),Fn=new Set(["id","startsAt","endsAt","eligibility"]),Ln=new Set(["kind","proofFormat","proofDigest"]),Mn=new Set(["amount","unit"]),Bn=new Set(["value","unit"]);function ue(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new j(`${t} must be a plain object`);return e}function le(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new j(`${n} has unknown field ${r}`,"unknown-field")}function W(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new j(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function jn(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new j(`${t} must be a positive safe integer`);return e}function Re(e,t){if(e=ue(e,t),le(e,Mn,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new j(`${t} requires amount and unit`,"ambiguous-unit");let n=W(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new j(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:W(e.unit,`${t}.unit`)}}function Ce(e,t){if(e=ue(e,t),le(e,Bn,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new j(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function Hn(e,t){e=ue(e,t),le(e,Ln,t);let n=W(e.kind,`${t}.kind`),r=W(e.proofFormat,`${t}.proofFormat`),o=W(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new j(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function qn(e,t){let n=`stages[${t}]`;e=ue(e,n),le(e,Fn,n);let r=Ce(e.startsAt,`${n}.startsAt`),o=Ce(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new j(`${n} must end after it starts`,"invalid-stage-range");return{id:W(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:Hn(e.eligibility,`${n}.eligibility`)}}function $e(e){if(e=ue(e,"input"),le(e,$n,"input"),e.version!==Rn)throw new j("version must be 1");let t=ue(e.chain,"chain");le(t,kn,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>Cn)throw new j("stages must contain 1 through 8 entries","stage-count");let r=n.map(qn).sort((a,c)=>a.startsAt.value-c.startsAt.value||a.id.localeCompare(c.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new j("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 j("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new j("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:W(t.family,"chain.family"),id:W(t.id,"chain.id")},marketplace:W(e.marketplace,"marketplace"),mechanism:W(e.mechanism,"mechanism"),collection:W(e.collection,"collection"),recipient:W(e.recipient,"recipient"),quantity:jn(e.quantity,"quantity"),stages:r,mintValueCap:Re(e.mintValueCap,"mintValueCap"),networkFeeCap:Re(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:Re(e.priorityFeeCap,"priorityFeeCap"),expiry:Ce(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new j("every stage must end no later than expiry","stage-after-expiry");return i}function Dn(e){return JSON.stringify($e(e))}function ct(e){return`sha256:${Nn("sha256").update(Dn(e),"utf8").digest("hex")}`}var ke=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),oe=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Fe=Object.freeze(Object.values(oe)),ut=new Set(Fe),lt=Object.freeze(Fe.slice(0,4)),Un=Fe,Wn=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),H=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function ye(e,t){if(!Array.isArray(e)||e.length===0)throw new H(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new H(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new H(`${t} contains duplicates`);return[...n].sort()}function Gn(e){if(!Array.isArray(e))throw new H("capabilities must be an array");let t=new Set(e);for(let n of t)if(!ut.has(n))throw new H(`unknown capability ${n}`,"unknown-capability");return Un.every(n=>t.has(n))?ke.AUTOMINT_READY:lt.every(n=>t.has(n))?ke.PREPARE_READY:ke.RESEARCH_ONLY}function Le(e=[]){if(!Array.isArray(e))throw new H("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new H("entry must be an object");for(let i of Object.keys(n))if(!Wn.has(i))throw new H(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new H("entry id must be an exact string");if(t.has(n.id))throw new H(`duplicate entry id ${n.id}`,"duplicate-entry");let r=ye(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(ye(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(ye(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(ye(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:Gn(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=lt){let o=t.get(n);if(!o)throw new H(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!ut.has(i))throw new H(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new H(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var ri=Le([]);import{getAddress as zn,Interface as Me,keccak256 as Vn}from"ethers";var Z=Object.freeze({manifold:new Me(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Me(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Me(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),je=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"})}),si=Object.freeze(Object.fromEntries(Object.entries(je).map(([e,t])=>[Z[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function x(e){throw new Error(`evm-mint-launchpads: ${e}`)}function U(e,t){try{return zn(String(e||""))}catch{return x(`invalid ${t}`)}}function q(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&x(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return x(`${t} must be an unsigned integer`)}}function Be(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&x(`invalid ${t}`),e.map(String)}function Yn(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&x("invalid chainId");let o=U(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&U(u.contract,"reviewed contract")===o);a||x("unsupported contract or wrong chain");let c=U(a.mintTarget||a.contract,"reviewed mint target"),s=Z[e].getFunction(je[e].signature).selector.toLowerCase();return(!(a.selectors||[s]).map(u=>String(u).toLowerCase()).includes(s)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&x("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:c,selector:s,review:a}}async function Kn(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);x("runtime bytecode verification required")}function Jn(e,t){let n=e.stage;if(!n)return null;let r=q(n.startTime,"stage startTime"),o=q(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&x("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function Xn(e,t){let n=je[e];String(t).slice(0,10).toLowerCase()!==Z[e].getFunction(n.signature).selector.toLowerCase()&&x("unknown selector");let r;try{r=Z[e].decodeFunctionData(n.signature,t)}catch{x("invalid calldata layout")}let o;return e==="manifold"&&(o=Z.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Z.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Z.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&x("calldata must be canonical with no suffix"),r}async function pt(e,t={},n={}){Z[e]||x("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=Yn(e,t,n),c=U(t.recipient||t.minter,"recipient"),s=q(t.quantity,"quantity",{positive:!0}),l=q(t.priceWei,"priceWei"),u=q(t.maxValueWei,"maxValueWei"),p=q(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),d=t.transaction||t.tx;(!d||Number(d.chainId)!==r)&&x("transaction chain mismatch"),U(d.to,"transaction target")!==i&&x("transaction target mismatch");let w=await Kn(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(w))||w==="0x"||Vn(w).toLowerCase()!==String(a.codeHash).toLowerCase())&&x("runtime bytecode is not reviewed");let h=Xn(e,d.data),T=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),S=Jn(t,T),A,k,y,g=null,L=[];if(e==="manifold")U(h[0],"calldata contract")!==o&&x("calldata contract mismatch"),(t.instanceId==null||q(h[1],"instanceId")!==q(t.instanceId,"instanceId"))&&x("instance/stage mismatch"),(t.mintIndex==null||q(h[2],"mintIndex")!==q(t.mintIndex,"mintIndex"))&&x("mint index/stage mismatch"),L=Be([...h[3]]),A=U(h[4],"calldata recipient"),k=1n,y=l;else if(e==="zora")A=U(h[0],"calldata recipient"),k=BigInt(h[1]),y=l,t.comment!=null&&h[2]!==String(t.comment)&&x("comment mismatch"),t.mintReferral!=null&&U(h[3],"mint referral")!==U(t.mintReferral,"expected mint referral")&&x("mint referral mismatch");else{A=U(h[0],"calldata recipient"),k=BigInt(h[1]),y=BigInt(h[3]);let _=h[4];L=Be([..._.proof]),g=BigInt(_.quantityLimitPerWallet),g<s&&x("wallet allowance below quantity"),(BigInt(_.pricePerToken)!==l||U(_.currency,"allowlist currency")!==U(h[2],"currency"))&&x("allowlist terms mismatch")}A!==c&&x("recipient mismatch"),k!==s&&x("quantity mismatch"),y!==l&&x("price mismatch"),t.proof!=null&&JSON.stringify(L.map(_=>_.toLowerCase()))!==JSON.stringify(Be(t.proof).map(_=>_.toLowerCase()))&&x("proof mismatch");let F=q(d.value??0,"transaction value"),b=l*s;(F<b||F-b>p||F>u)&&x("transaction value or fee cap exceeded");let E=d.gasLimit==null?null:q(d.gasLimit,"gasLimit"),v=d.maxFeePerGas==null?null:q(d.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>q(t.maxGasLimit,"maxGasLimit"))&&x("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(v==null||v>q(t.maxFeePerGasWei,"maxFeePerGasWei"))&&x("gas fee cap exceeded"),X({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:c,quantity:s.toString(),priceWei:l.toString(),valueWei:F.toString(),platformFeeWei:(F-b).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:p.toString(),...S?{stage:S}:{},...g==null?{}:{walletAllowance:g.toString()},proof:L,transaction:{chainId:r,to:i,data:d.data,value:F.toString(),...E==null?{}:{gasLimit:E.toString()},...v==null?{}:{maxFeePerGas:v.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var Zn="RESEARCH_ONLY";var Qn="canonical serialized-message decoding and program-specific instruction validation are not implemented",ge=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),ui=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function er(){throw new Error(`solana-mint: ${Zn}; disabled until ${Qn}`)}function dt(){er()}import{Address as tr,CompactSize as nr,NETWORK as rr,OutScript as Tt,Script as or,TEST_NETWORK as ft,Transaction as ir,utils as ar}from"@scure/btc-signer";import{createHash as de}from"node:crypto";var mt="universal-ordinals-mint",ht="bitcoin-ordinals-mint-plan",sr=1800*1e3,cr=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),wt=new Set,ur=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function G(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function Q(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 He(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 vt(e,t){let n=G(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 lr(e){return e==="bitcoin"||e==="mainnet"?rr:e==="regtest"?{...ft,bech32:"bcrt"}:ft}function yt(e,t){try{let n=Tt.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 pr(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function dr(e){let t=de("sha256").update(e.unsignedTx).digest();return de("sha256").update(t).digest().reverse().toString("hex")}function gt(e,...t){let n=de("sha256").update(e,"ascii").digest();return de("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function fr(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 c=gt("TapLeaf",Buffer.from([a]),Buffer.from(nr.encode(BigInt(i.length))),i);for(let u of e.merklePath){let p=Buffer.from(u);c=gt("TapBranch",...Buffer.compare(c,p)<0?[c,p]:[p,c])}let[s,l]=ar.taprootTweakPubkey(e.internalKey,c);if(!Buffer.from(s).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 bt(e,t){let n=G(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=ir.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},(c,s)=>{let l=o.getInput(s);for(let d of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(pr(l[d]))throw new Error(`${t} contains signed/finalized input ${s}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${s} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${s} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${s} requires witnessUtxo value and script`);let u=yt(l.witnessUtxo.script,`${t} input ${s} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${s} uses SIGHASH_DEFAULT for a non-taproot prevout`);let p=(l.tapLeafScript||[]).map(([d,w],h)=>fr(d,w,u,`${t} input ${s} tapLeafScript ${h}`));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:p}}),a=Array.from({length:o.outputsLength},(c,s)=>{let l=o.getOutput(s);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${s} contains opaque unknown/proprietary fields`);return yt(l.script,`${t} output ${s} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:dr(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 mr(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 hr(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 wr=new Set([1,3]);function yr(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=hr(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!wr.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let c=r.get(i)||[];c.push(Buffer.from(a)),r.set(i,c)}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 gr(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let p;try{p=or.decode(u)}catch(d){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${d?.message||"script decode failed"})`)}for(let d=0;d+2<p.length;d+=1)p[d]===0&&p[d+1]==="IF"&&p[d+2]instanceof Uint8Array&&Buffer.from(p[d+2]).equals(Buffer.from("ord","ascii"))&&o.push(yr(p,d))}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 c;try{c=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(c!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(de("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||mr(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 Et(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 br(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 At(e,t="parentId"){let n=G(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 It(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=G(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=Q(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function Er(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,c)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${c} invalid`);return{role:G(a.role,`revealOutputs[${c}].role`),address:G(a.address,`revealOutputs[${c}].address`),valueSats:Q(a.valueSats??a.value,`revealOutputs[${c}].valueSats`).toString(),scriptHex:vt(a.scriptHex,`revealOutputs[${c}].scriptHex`),...a.parentId==null?{}:{parentId:At(a.parentId,`revealOutputs[${c}].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 Sr(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:G(n?.role,`commitOutputs[${r}].role`),valueSats:Q(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:vt(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 St(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 xt(e,t,n){try{return Buffer.from(Tt.encode(tr(lr(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 xr(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)=>It({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function Tr(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");br(e);for(let f of["content","contentBytes","body","file","path","url","contentUrl"])if(e[f]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let f of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[f]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=G(e.network,"network").toLowerCase();if(!cr.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=G(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=G(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=At(e.parentId??e.parentInscriptionId),a=G(e.recipient??e.destination,"recipient"),c=Q(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 s=e.commitInputs.map(It);if(new Set(s.map(f=>f.outpoint)).size!==s.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");xr(e,s);let l=bt(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=bt(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),p=Sr(e.commitOutputs),d=Er(e.revealOutputs,{recipient:a,parentId:i,postageSats:c});if(l.inputs.length!==s.length||l.inputs.some((f,N)=>f.txid!==s[N].txid||f.vout!==s[N].vout||f.valueSats!==s[N].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");St(l.outputs,p,"commit PSBT"),St(u.outputs,d,"reveal PSBT");let w=xt(a,n,"recipient");if(d.find(f=>f.role==="inscription").scriptHex!==w)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[f,N]of d.entries())if(N.scriptHex!==xt(N.address,n,`revealOutputs[${f}].address`))throw new Error(`ordinals mint: reveal output ${f} script does not pay its bound address`);let h=p.findIndex(f=>f.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let T=u.inputs.filter(f=>f.txid===l.txid&&f.vout===h);if(T.length!==1||T[0].valueSats!==p[h].valueSats||T[0].scriptHex!==p[h].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");gr(u,{contentHash:r,contentType:o,parentId:i});let S=He(e.commitFeeRateSatVb,"commitFeeRateSatVb"),A=He(e.revealFeeRateSatVb,"revealFeeRateSatVb"),k=He(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(k<=0||S>k||A>k)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let y=Q(e.commitFeeSats,"commitFeeSats"),g=Q(e.revealFeeSats,"revealFeeSats"),L=Q(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(y+g>L)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==y.toString()||u.feeSats!==g.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(y)/l.vsizeLowerBound>S||Number(g)/u.vsizeLowerBound>A)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(f=>f.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let E=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:Q(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(E.enabled){if(!Number.isSafeInteger(E.outputIndex)||E.outputIndex<0||d[E.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(d[E.outputIndex].valueSats!==E.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(d.some(f=>f.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let v=Number(t.nowMs??Date.now()),_=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(_)||_<=v||_-v>sr)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:c,commitInputs:l.inputs.map(Et),commitPsbt:l.encoded,commitOutputs:p,revealInputs:u.inputs.map(Et),revealPsbt:u.encoded,revealOutputs:d,commitRate:S,revealRate:A,maxRate:k,commitFee:y.toString(),revealFee:g.toString(),maxTotalFee:L.toString(),rbf:e.rbf,cpfp:E,expiresAt:_}}function vr(e={},t={}){let n=Tr(e,t),r=n.commitInputs.find(c=>wt.has(c.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:mt,kind:ht,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...ur},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=X(i,{provider:mt,kind:ht,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let c of n.commitInputs)wt.add(c.outpoint);return a}var Pt=vr;Je();import{readFileSync as go,existsSync as bo}from"node:fs";import{getAddress as Eo,Interface as Ae,TypedDataEncoder as Ri,parseUnits as Ci}from"ethers";var Bt="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ht({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:jt(t)};let c;try{c=new URL(a)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(c.protocol!=="http:"&&c.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let s=c.host;if(!s)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([jt(t),...n]).has(s)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(s);return c.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:s,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:s}}if(String(process.env[Bt]||"")==="1")return{baseUrl:a,trusted:!1,host:s};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${s} (set ${Bt}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:s}}function jt(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function qt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var Qr=/^(0|[1-9][0-9]*)$/,Xe=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function se(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(!Qr.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 eo(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function to(e={}){return e.maxFeePerGas!=null?se(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?se(e.gasPrice,"gasPrice"):null}function no(e={}){try{let t=eo(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=se(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=se(n.gasLimit??n.gas,"gasLimit"),c=to(n);if(c==null)throw new Error("maxFeePerGas or gasPrice required");let s=se(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=se(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:se(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),p=a*c;return p>i?{ok:!1,status:"BLOCK",reason:`total gas ${p} exceeds cap ${i}`,chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:s!=null&&c>s?{ok:!1,status:"BLOCK",reason:`unit fee ${c} exceeds cap ${s}`,chainId:t,unitFeeWei:c.toString(),maxFeePerGasWei:s.toString(),totalGasWei:p.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:p.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString(),unitFeeWei:c.toString(),maxFeePerGasWei:s?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function Dt(e={}){let t=no(e);if(!t.ok)throw new Xe(t);return t}var So="https://api.opensea.io/api/v2",xo="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)",To=new Ae([`function ${xo}`]),ve=new Ae(["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"]),vo=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"]),Mi=new Set(vo);function Ao(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!bo(e))return"";try{for(let t of go(e,"utf8").split(`
|
|
5
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function ot(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||Ao()}function nn(e={}){return Ht({provider:"opensea",defaultUrl:So,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function rn(e={}){return nn(e).baseUrl}function on(e={}){return qt({accept:"application/json"},{"x-api-key":ot(e)},nn(e).trusted)}function J(e,t="address"){try{return Eo(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}async function Io(e,t={}){if(!e)throw new Error("collection slug required");if(!ot(t))throw new Error("OPENSEA_API_KEY required");return fe(`${rn(t)}/collections/${encodeURIComponent(e)}`,{headers:on(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var Po=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 Oo(e){let t=String(e||"").trim().toLowerCase(),n=Po[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function en(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 _o(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 No(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 Ro(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()}var Bi=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 Co(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 an(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"&&an(n))}function sn(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function cn(e){return!e||typeof e!="object"?!1:sn(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&cn(t))}function un(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"&&un(o,t,n);return t}function tn(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function $o(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(sn(e))throw new Error("opensea: signed transaction material refused");if((e.from?J(tn(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=J(tn(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,c=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&c){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=To.encodeFunctionData("fulfillAdvancedOrder",[c.advancedOrder,c.criteriaResolvers,c.fulfillerConduitKey,c.recipient])}let s=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(s))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");s.endsWith(l.slice(2))||(s+=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 p=_o(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:s,value:p.hex,chainId:n,valueWei:p.amount}}function ln(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 ko(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Mt(e,4,async s=>{let{chainId:l,...u}=ln(s);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,h]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(h).toString()}let{rpcCall:p}=await Promise.resolve().then(()=>(rt(),nt)),d={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,w]=await Promise.all([p(t,"eth_call",[u,"pending"],d),p(t,"eth_estimateGas",[u],d)]);return BigInt(w).toString()}),a=null,c=null;if(r&&typeof r.getFeeData=="function"){let s=await r.getFeeData();c=s?.maxPriorityFeePerGas==null?0n:BigInt(s.maxPriorityFeePerGas),a=s?.maxFeePerGas==null?s?.gasPrice==null?null:BigInt(s.gasPrice):BigInt(s.maxFeePerGas)}else if(o){let{rpcCall:s}=await Promise.resolve().then(()=>(rt(),nt)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await s(t,"eth_gasPrice",[],l));try{c=BigInt(await s(t,"eth_maxPriorityFeePerGas",[],l))}catch{c=0n}let p=await s(t,"eth_getBlockByNumber",["pending",!1],l),w=(p?.baseFeePerGas==null?0n:BigInt(p.baseFeePerGas))*2n+c;a=u>w?u:w}return a!=null&&c!=null&&e.forEach((s,l)=>{let p=(BigInt(i[l])*120n+99n)/100n;s.gasLimit=p.toString(),s.maxPriorityFeePerGas=c.toString(),s.maxFeePerGas=a.toString(),s.worstCaseFeeWei=(p*a).toString()}),{simulated:!0,gasEstimates:i}}function Fo(e,t){if(an(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(cn(e))throw new Error("opensea: signed transaction material refused");let n=un(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=>$o(r,t))}function Lo(e,t,n={}){return X({...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)}function Mo(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=J(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function pn(e={},t={}){if(!ot(t))throw new Error("OPENSEA_API_KEY required");Co(e);let{chain:n,chainId:r}=Oo(e.chain),o=J(e.buyer||e.minter||e.address,"buyer"),i=J(e.contract,"NFT contract"),a=No(e.quantity),c=en(e.priceWei,"priceWei"),s=en(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Ro(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 p=String(e.slug||"").trim();if(!p)throw new Error("opensea: collection slug required");let d=await Io(p,t),w=Mo(d,n,i),h=c*BigInt(a);if(h>s)throw new Error("opensea: mint total exceeds total cap");let T=await fe(`${rn(t)}/drops/${encodeURIComponent(p)}/mint`,{method:"POST",headers:on(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),S=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,A=Array.isArray(S)?S:S?[S]:[];if(!A.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let k=new Set(A.map(C=>J(C,"SeaDrop mint target"))),y=Fo(T,{buyer:o,chainId:r,targets:k});if(y.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let g,L,F=null,b;try{g=ve.decodeFunctionData("mintPublic",y[0].data),L="public",b=ve.encodeFunctionData("mintPublic",[g[0],g[1],g[2],g[3]])}catch{try{g=ve.decodeFunctionData("mintAllowList",y[0].data),L="allowlist";let C=g[4],M=[...g[5]].map(String);if(M.length<1||M.length>64||M.some(O=>!/^0x[0-9a-fA-F]{64}$/.test(O)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let z=BigInt(C.startTime),R=BigInt(C.endTime),P=BigInt(Math.floor(l/1e3));if(z>P||R<=P)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(C.mintPrice)!==c)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(C.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");b=ve.encodeFunctionData("mintAllowList",[g[0],g[1],g[2],g[3],C,M]),F={mintPrice:BigInt(C.mintPrice).toString(),maxTotalMintableByWallet:BigInt(C.maxTotalMintableByWallet).toString(),startTime:z.toString(),endTime:R.toString(),dropStageIndex:BigInt(C.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(C.maxTokenSupplyForStage).toString(),feeBps:Number(C.feeBps),restrictFeeRecipients:!!C.restrictFeeRecipients,proof:M}}catch(C){throw/opensea:/.test(String(C?.message||""))?C:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=J(g[0],"mint NFT contract"),v=J(g[1],"mint fee recipient"),_=J(g[2],"mint recipient");if(E!==w)throw new Error("opensea: mint calldata collection mismatch");if(_!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(g[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(b.toLowerCase()!==y[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let f=y.reduce((C,M)=>C+M.valueWei,0n);if(f!==h)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(f>s)throw new Error("opensea: mint total exceeds total cap");let N=await ko(y,r,{...t,provider:e.provider||t.provider});if(N.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let ne=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},D=Dt({chainId:r,tx:y[0],policy:ne});return Lo({action:"mint",mintType:L,...F?{stage:F}:{},chain:n,chainId:r,slug:p,buyer:o,contract:w,quantity:a,priceWei:c.toString(),totalWei:f.toString(),maxTotalWei:s.toString(),mintTarget:y[0].to,feeRecipient:v,expiry:u,transactions:y.map(ln),gasWar:D,...N},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Ne,Date.parse(u),F?Number(BigInt(F.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}var ji=new Ae(["function setApprovalForAll(address operator,bool approved)"]),Hi=new Ae(["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)"]);var jo=Object.freeze([oe.DISCOVERY,oe.ELIGIBILITY,oe.PREPARATION,oe.SIMULATION]),dn=[["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",ge.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",ge.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",ge.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],fn=Object.freeze(dn.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([oe.DISCOVERY]):jo,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),Ji=Le(fn.map(({family:e,tier:t,enabled:n,...r})=>r)),mn=new Map(dn.map(e=>[e[0],e])),Ho=new Set(["intent","adapterId","input"]),qo=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Ie=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function I(e,t,n){throw new Ie(e,t,n?{cause:n}:{})}function m(e,t,n){String(e??"")!==String(t)&&I("intent-mismatch",`${n} does not match canonical intent`)}function B(e,t,n){let r=e[t];return r.unit!==n&&I("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function hn(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))qo.test(n)&&I("custody-refused",`${t}.${n} is outside the prepare-only boundary`),hn(r,`${t}.${n}`)}function Do(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function Uo(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&I("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(s=>s.id===t.stageId);o||I("intent-mismatch","stageId does not match canonical intent"),m(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${Bo("sha256").update(JSON.stringify(Do(n,t))).digest("hex")}`;m(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),c=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(c))&&I("invalid-request","decoded input requires exact stage bounds"),m(a,o.startsAt.value,"stage start"),m(c,o.endsAt.value,"stage end"),(r<a||r>=c)&&I("expired-intent","canonical mint stage is not active at authoritative now"),o}function Wo(e,t){let n=mn.get(t);n||I("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return m(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&I("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function Go(e,t){e.chain.family==="evm"?(m(t.chainId,e.chain.id,"network"),m(t.contract,e.collection,"collection/drop"),m(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity"),m(t.maxValueWei??t.maxTotalWei,B(e,"mintValueCap","wei"),"mint-value cap"),m(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,B(e,"networkFeeCap","wei"),"network-fee cap"),m(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,B(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(m(t.network,e.chain.id,"network"),m(t.collection??t.drop??t.identity,e.collection,"collection/drop"),m(t.recipientOwner??t.recipient,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity"),m(t.priceLamports,B(e,"mintValueCap","lamports"),"mint-value cap"),m(t.networkFeeCapLamports,B(e,"networkFeeCap","lamports"),"network-fee cap"),m(t.priorityFeeCapLamports,B(e,"priorityFeeCap","lamports"),"priority-fee cap")):(m(t.network,e.chain.id,"network"),m(t.parentId,e.collection,"collection/drop"),m(t.recipient,e.recipient,"recipient"),m(e.quantity,1,"Ordinals quantity"),m(t.postageSats,B(e,"mintValueCap","sats"),"mint-value cap"),m(t.maxTotalFeeSats,B(e,"networkFeeCap","sats"),"network-fee cap"),m(t.maxFeeRateSatVb,B(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function zo(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==we(e))&&I("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&I("custody-refused","leaf artifact is not strictly prepare-only")}function Vo(e,t,n){m(t.chainId,e.chain.id,"network"),m(t.contract,e.collection,"collection/drop"),m(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity");let r=B(e,"mintValueCap","wei"),o=B(e,"networkFeeCap","wei"),i=B(e,"priorityFeeCap","wei-per-gas");m(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),m(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),m(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||I("artifact-mismatch","prepared EVM transaction is missing"),m(a.chainId,e.chain.id,"artifact network");let c=BigInt(a.gasLimit??0),s=BigInt(a.maxFeePerGas??0);(!c||!s||c*s>o)&&I("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)&&I("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),m(n.contract,e.collection,"artifact collection/drop"),m(n.recipient??n.buyer,e.recipient,"artifact recipient"),m(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&I("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(c*s).toString(),priorityFee:l.toString()}}function Yo(e,t,n){m(t.network,e.chain.id,"network"),m(t.collection??t.drop??t.identity,e.collection,"collection/drop"),m(t.recipientOwner??t.recipient,e.recipient,"recipient"),m(t.quantity,e.quantity,"quantity"),m(t.priceLamports,B(e,"mintValueCap","lamports"),"mint-value cap");let r=B(e,"networkFeeCap","lamports"),o=B(e,"priorityFeeCap","lamports");m(t.networkFeeCapLamports,r,"network-fee cap"),m(t.priorityFeeCapLamports,o,"priority-fee cap"),m(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let c of a.instructions)if(String(c.decoded?.type).toLowerCase().includes("price")){let s=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(s)*BigInt(c.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&I("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function Ko(e,t,n){return m(t.network,e.chain.id,"network"),m(t.parentId,e.collection,"collection/drop"),m(t.recipient,e.recipient,"recipient"),m(e.quantity,1,"Ordinals quantity"),m(t.postageSats,B(e,"mintValueCap","sats"),"mint-value cap"),m(t.maxTotalFeeSats,B(e,"networkFeeCap","sats"),"network-fee cap"),m(t.maxFeeRateSatVb,B(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),m(n.plan.network,e.chain.id,"artifact network"),m(n.plan.parentId,e.collection,"artifact collection/drop"),m(n.plan.recipient,e.recipient,"artifact recipient"),m(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),m(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),m(n.plan.caps.maxFeeRateSatVb,e.priorityFeeCap.amount,"artifact priority-fee cap"),{networkFee:(BigInt(n.plan.commit.feeSats)+BigInt(n.plan.reveal.feeSats)).toString(),priorityFee:String(n.plan.caps.maxFeeRateSatVb)}}function wn(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:fn})}async function Jo(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:wn()}}async function yn(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&I("invalid-request","request must be a plain object");for(let u of Object.keys(e))Ho.has(u)||I("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&I("invalid-request","explicit adapterId is required; adapter inference is refused"),mn.has(e.adapterId)||I("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&I("invalid-request","family-specific decoded input is required"),hn(n);let r;try{r=$e(e.intent)}catch(u){I("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||I("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&I("expired-intent","canonical mint intent has expired");let i=Wo(r,e.adapterId);i[1]==="solana"&&I("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=Uo(r,n,r.chain.family,o);Go(r,n);let c;try{i[4]==="evm"?c=await pt(i[5],n,t):i[4]==="opensea"?c=await pn(n,t):i[4]==="solana"?(m(n.programId,i[5],"selected Solana adapter program"),c=await dt(n,t)):c=await Pt(n,t)}catch(u){if(u instanceof Ie)throw u;I("adapter-refused",u?.message||"adapter preparation failed",u)}zo(c);let s=i[4]==="bitcoin"?Ko(r,n,c):i[4]==="solana"?Yo(r,n,c):Vo(r,n,c),l=Object.freeze({intentHash:ct(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:s.networkFee,observedPriorityFee:s.priorityFee});return X({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:c},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(c.expiresAt))})}var Xi=yn,Zi=yn,Qi=wn,ea=Jo;export{fn as UNIVERSAL_MINT_ADAPTERS,Ji as UNIVERSAL_MINT_ROUTER_REGISTRY,Ie as UniversalMintRouterError,Qi as getUniversalMintCapabilities,ea as getUniversalMintHealth,yn as prepareUniversalMint,Zi as prepareUniversalMintAdmin,Xi as prepareUniversalMintPublic,wn as universalMintCapabilities,Jo as universalMintHealth};
|