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