@oracle-agent/oracle 0.35.49 → 0.35.51

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.
Files changed (86) hide show
  1. package/README.md +3 -2
  2. package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
  3. package/dist/agent-sessions.mjs +19 -19
  4. package/dist/artifacts/token-dashboard.mjs +1 -1
  5. package/dist/assets/profiles/near-agent/SOUL.md +46 -0
  6. package/dist/assets/profiles/near-agent/profile.json +30 -0
  7. package/dist/assets/profiles/oracle/SOUL.md +1 -0
  8. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  9. package/dist/assets/skills/oracle-near/SKILL.md +66 -0
  10. package/dist/automation-plan.mjs +1 -1
  11. package/dist/bin/desk-server.mjs +33 -33
  12. package/dist/bin/oracle-data-mcp.mjs +16 -16
  13. package/dist/bin/oracle-gateway.mjs +3 -3
  14. package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
  15. package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
  16. package/dist/bin/oracle-mev-shadow.mjs +4 -4
  17. package/dist/bin/oracle-public-server.mjs +5 -5
  18. package/dist/bin/oracle-route.mjs +27 -27
  19. package/dist/bin/oracle-scan.mjs +3 -3
  20. package/dist/bin/oracle-telegram-mcp.mjs +1 -1
  21. package/dist/chains.mjs +1 -1
  22. package/dist/cli/commands/account.mjs +22 -22
  23. package/dist/cli/commands/agent-session.mjs +23 -23
  24. package/dist/cli/commands/auth.mjs +16 -15
  25. package/dist/cli/commands/chain.mjs +5 -5
  26. package/dist/cli/commands/chat.mjs +310 -228
  27. package/dist/cli/commands/data.mjs +37 -37
  28. package/dist/cli/commands/doctor.mjs +5 -5
  29. package/dist/cli/commands/eval.mjs +249 -167
  30. package/dist/cli/commands/farm.mjs +1 -1
  31. package/dist/cli/commands/follow.mjs +4 -4
  32. package/dist/cli/commands/harness.mjs +5 -5
  33. package/dist/cli/commands/mint.mjs +11 -11
  34. package/dist/cli/commands/model.mjs +313 -231
  35. package/dist/cli/commands/project.mjs +8 -7
  36. package/dist/cli/commands/quickstart.mjs +2 -2
  37. package/dist/cli/commands/receipt.mjs +2 -2
  38. package/dist/cli/commands/resolve.mjs +4 -4
  39. package/dist/cli/commands/session-vault.mjs +4 -4
  40. package/dist/cli/commands/setup.mjs +53 -52
  41. package/dist/cli/commands/snipe.mjs +13 -13
  42. package/dist/cli/commands/strategy.mjs +5 -5
  43. package/dist/cli/commands/swap.mjs +11 -11
  44. package/dist/cli/commands/telegram.mjs +7 -7
  45. package/dist/cli/commands/venues.mjs +1 -1
  46. package/dist/cli/project-access.mjs +4 -3
  47. package/dist/data/desk-data.mjs +31 -31
  48. package/dist/data/holder-table.mjs +2 -2
  49. package/dist/data/market-tape.mjs +1 -1
  50. package/dist/data/names.mjs +3 -3
  51. package/dist/data/providers/farming.mjs +2 -2
  52. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  53. package/dist/index.mjs +49 -49
  54. package/dist/launch-radar/index.mjs +5 -5
  55. package/dist/lp/index.mjs +4 -4
  56. package/dist/nft/universal-mint-router.mjs +4 -4
  57. package/dist/notifications/index.mjs +1 -1
  58. package/dist/router/index.mjs +3 -3
  59. package/dist/router/prepare-bridge.mjs +2 -2
  60. package/dist/router/prepare-route.mjs +3 -3
  61. package/dist/scanner/index.mjs +3 -3
  62. package/dist/strategy/index.mjs +4 -4
  63. package/dist/task.mjs +1 -1
  64. package/dist/teams/index.mjs +6 -6
  65. package/dist/telegram/chart-card.mjs +5 -5
  66. package/dist/telegram/market-commands.mjs +1 -1
  67. package/dist/tui/standalone-client.mjs +179 -97
  68. package/package.json +2 -2
  69. package/public/oracle-splash/assets/desktop-app.jpg +0 -0
  70. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  71. package/public/oracle-splash/docs/connectors/index.html +2 -2
  72. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  73. package/public/oracle-splash/docs/index.html +3 -3
  74. package/public/oracle-splash/docs/reference/index.html +2 -2
  75. package/public/oracle-splash/docs/security/index.html +2 -2
  76. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  77. package/public/oracle-splash/download/index.html +219 -5
  78. package/public/oracle-splash/downloads/index.html +1 -1
  79. package/public/oracle-splash/eval/index.html +19 -19
  80. package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
  81. package/public/oracle-splash/index.html +262 -37
  82. package/public/oracle-splash/pricing/index.html +215 -1
  83. package/public/oracle-splash/security/index.html +215 -1
  84. package/public/oracle-splash/what-it-does/index.html +215 -1
  85. package/public/oracle-splash/where-it-works/index.html +215 -1
  86. package/server.json +2 -2
@@ -1,5 +1,5 @@
1
- var Rn=Object.defineProperty;var ue=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Nn=(e,t)=>{for(var n in t)Rn(e,n,{get:t[n],enumerable:!0})};import{AsyncLocalStorage as $r}from"node:async_hooks";function xe(e){let t=kr.getStore();if(!t||t.closed||!Fr.includes(e))return null;if(t.spans.length>=Lr)return t.droppedSpans++,null;let n={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(n),(r,o=null)=>{t.closed||n.durationMs!==null||(n.durationMs=Math.max(0,t.now()-t.start-n.startMs),n.outcome=r==="succeeded"?"succeeded":"failed",n.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var kr,Fr,Lr,$t=ue(()=>{kr=new $r,Fr=["http","retry","shared"],Lr=512});import ie from"node:net";import Mr from"node:dns";function Ae(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=u=>{if(!u)return[];let p=u.split(":"),m=p.at(-1);if(m?.includes(".")){let h=m.split(".").map(Number);if(h.length!==4||h.some(d=>!Number.isInteger(d)||d<0||d>255))return null;p.splice(p.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return p.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:p.map(h=>Number.parseInt(h,16))},[r,o]=t.split("::"),i=n(r),a=n(o);if(!i||!a)return null;let c=t.includes("::"),s=8-i.length-a.length;if(!c&&s!==0||c&&s<1)return null;let l=[...i,...Array(Math.max(0,s)).fill(0),...a];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function We(e,t,n){let r=Math.floor(n/8),o=n%8;for(let a=0;a<r;a+=1)if(e[a]!==t[a])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function ze(e){if(ie.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(ie.isIPv6(e)){let t=Ae(e);if(!t)return!1;let n=Ae("::ffff:0:0");return We(t,n,96)?ze([...t.slice(12)].join(".")):We(t,Ae("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>We(t,Ae(o),i)):!1}return!1}function Hr(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(Br.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ie.isIP(n);return r!==0&&!ze(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Ve(e,{lookupFn:t=Mr.promises.lookup}={}){let n=Hr(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ie.isIPv6(n.host)?6:4}]};let r;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:n.url,addresses:[]};try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!ze(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function jr(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let n;try{n=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(n.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(n.hostname)||!n.port||n.username||n.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let r=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(r))throw new Error("egress-guard: egress proxy token is missing");return{uri:n.origin,token:r}}async function Ye({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(h){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${h?.message||h}`);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=h=>String(h).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),a=new Map,c=h=>(Array.isArray(h)?h:[h]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(ie.isIPv6(d.address)?6:4)})),s=(h,d,E)=>{a.set(i(h),c(typeof d=="string"?[{address:d,family:E}]:d))},l=h=>{let d=i(h);if(ie.isIP(d))return[{address:d,family:ie.isIPv6(d)?6:4}];let E=a.get(d);if(!E||!E.length)throw new Error(`refused: unpinned host ${h} during pinned fetch`);return E},u=jr(),p=u&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:u.uri,token:`Bearer ${u.token}`,connectTimeout:1e4}):new n({connect:{lookup(h,d,E){let w;try{w=l(h)}catch(x){return E(x)}return d?.all?E(null,w):E(null,w[0].address,w[0].family)}}}),m=qr((h,d={})=>r(h,{...d,dispatcher:p}),s);return{dispatcher:p,fetch:m,pin:s,resolve:l,async close(){try{await p.destroy()}catch{}}}}function qr(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[Ke]=Object.freeze({pin:t}),e}function Je(e){return typeof e=="function"&&typeof e[Ke]?.pin=="function"}function kt(e,t,n){if(!Je(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ke].pin(t,n)}var Br,Ke,Ft=ue(()=>{Br=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ke=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Dr}from"node:crypto";import{types as K}from"node:util";function $(e){return te(`HTTP JSON body refused: ${e}`)}function Xr(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof K[t]=="function"&&K[t](e))}function Zr(e){let t=[],n=0,r=0,o=0,i=0,a=new WeakSet,c=u=>{if(n+=Buffer.byteLength(u,"utf8"),n>Y.bytes)throw $("serialized byte limit exceeded");t.push(u)},s=u=>{if(Buffer.byteLength(u,"utf8")>Y.bytes)throw $("serialized byte limit exceeded");return JSON.stringify(u)},l=(u,p)=>{if(r+=1,r>Y.nodes)throw $("node limit exceeded");if(p>Y.depth)throw $("depth limit exceeded");if(u===null){c("null");return}if(typeof u=="string"){c(s(u));return}if(typeof u=="boolean"){c(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw $("non-finite number");c(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw $("unsupported non-JSON value");if(K.isProxy(u))throw $("proxy value");if(Xr(u))throw $("unsupported exotic object");if(a.has(u))throw $("cyclic value");a.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw $("symbol-keyed fields are unsupported");if(Array.isArray(u)){let d=Object.getPrototypeOf(u),E=0;for(;d!==null;){if(K.isProxy(d))throw $("proxy array prototype");if(E+=1,E>Y.depth)throw $("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(u.length>Y.arrayLength)throw $("array length limit exceeded");for(let x=0;x<u.length;x+=1){let k=Object.getOwnPropertyDescriptor(u,String(x));if(!k||!Object.hasOwn(k,"value")||k.enumerable!==!0)throw $("array entries must be dense enumerable own data")}let w=0;for(let x in u){if(i+=1,i>Y.fields)throw $("enumeration limit exceeded");if(Object.hasOwn(u,x)&&(w+=1,w>u.length))throw $("named array fields are unsupported")}if(w!==u.length)throw $("array entries must be dense enumerable own data");c("[");for(let x=0;x<u.length;x+=1)x&&c(","),l(Object.getOwnPropertyDescriptor(u,String(x)).value,p+1);c("]");return}let m=Object.getPrototypeOf(u);if(m!==Object.prototype&&m!==null)throw $("non-plain object");let h=[];for(let d in u){if(i+=1,i>Y.fields)throw $("enumeration limit exceeded");if(!Object.hasOwn(u,d))continue;if(o+=1,o>Y.fields)throw $("field limit exceeded");let E=Object.getOwnPropertyDescriptor(u,d);if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw $("object fields must be enumerable own data");h.push([d,E.value])}c("{");for(let d=0;d<h.length;d+=1)d&&c(","),c(s(h[d][0])),c(":"),l(h[d][1],p+1);c("}")}finally{a.delete(u)}};return l(e,0),t.join("")}function Qr(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(K.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let a=i.value;if(a==null||["object","function","symbol"].includes(typeof a))throw new TypeError("HTTP header values must be scalar");t[r]=String(a)}return t}function eo(){return Object.assign(Object.create(null),{Accept:"application/json"})}function to(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 no(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Te(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=jt.get(e);return t||(t=qt,qt+=1,jt.set(e,t)),`reference:${t}`}function Dt(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?ro.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Ut(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}if(Array.isArray(n))return n.length>0&&n.every(Dt);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Dt(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&oo.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function io(e,t,n,r={},o=null){let i=Dr("sha256"),a=(s,l)=>{let u=String(l);i.update(String(Buffer.byteLength(s,"utf8"))).update(":").update(s),i.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
2
- `)};a("method",e),a("url",t),Object.keys(n||{}).map((s,l)=>({name:s.toLowerCase(),order:l,value:String(n[s])})).sort((s,l)=>s.name.localeCompare(l.name)||s.order-l.order).forEach((s,l)=>{a(`header-name-${l}`,s.name),a(`header-value-${l}`,s.value)}),a("body",o??"-");for(let s of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])a(`context-${s}`,r[s]??"-");return i.digest("hex")}function ao(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Mt):Math.min(250*2**e,Mt)+Math.floor(Math.random()*100)}function te(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ze(e,t,n){return te(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ae(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function co(e){return e?e.byteLength??e.length??0:0}async function uo(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ae(e),!r))throw Ze(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let p=await e.text(),m=Buffer.byteLength(p,"utf8");if(m>t){if(!r)throw Ze(n,`body ${m} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let c=[],s=0,l=!1;try{for(;;){let{value:p,done:m}=await a.read();if(m)break;if(p&&(c.push(Buffer.from(p)),s+=co(p),s>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Ze(n,`streamed ${s} bytes`,t);let u=Buffer.concat(c);return(l?u.subarray(0,t):u).toString("utf8")}function lo(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function po(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:c,untrustedUrl:s=!1,maxResponseBytes:l=null,sameOriginRedirectsOnly:u=!1,importUndici:p,validateResponse:m,signal:h,redirectPolicy:d="follow",maxRedirects:E=ve}){let w=null,x=t,k=a?{lookupFn:a}:{};if(s&&!c&&!Je(x))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=new AbortController,g=setTimeout(()=>A.abort(),i),B=h?Ht?Ht([h,A.signal]):h:A.signal,F=async(b,{status:S=null}={})=>{let P=await Ve(b,k);if(!P.ok)throw te(S==null?`HTTP refused ${b}: ${P.error}`:`HTTP redirect to ${b} ${P.error}`,S==null?{}:{status:S});let R=new URL(b).hostname;if(c){if(w&&(await w.close(),w=null),!w)try{w=await Ye({requireUndici:!0,...p?{importUndici:p}:{}})}catch(f){throw te(S==null?`HTTP refused ${b}: ${f?.message||f}`:`HTTP redirect to ${b} refused: ${f?.message||f}`,S==null?{}:{status:S})}w.pin(R,P.addresses),x=w.fetch}else kt(x,R,P.addresses);return P};try{let b=String(e),S=Object.assign(Object.create(null),r||{});s&&await F(b);for(let P=0;P<=E;P+=1){let R=Object.assign(Object.create(null),{method:n,headers:S,body:o,signal:B,redirect:"manual",dispatcher:void 0}),f=await x(b,R);if((d==="error"||E===0)&&f.status>=300&&f.status<400)throw ae(f),te(`HTTP ${f.status} ${n} redirect refused`,{status:f.status,redirectRefused:!0});if(Jr.has(f.status)){let D=u===!0&&n==="POST"&&[307,308].includes(f.status)&&Ut(n,o);if(n!=="GET"&&n!=="HEAD"&&!D){ae(f);let N=new Error(`HTTP ${f.status} ${n} ${b} redirected non-idempotent request`);throw N.status=f.status,N}if(P===E)throw ae(f),te(`HTTP ${f.status} ${n} redirect budget exhausted`,{status:f.status,redirectRefused:!0});let C=f.headers?.get?.("location"),L;try{L=to(C,b)}catch(N){throw ae(f),N}let z=!no(L,b);if(ae(f),z&&n==="POST"){let N=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw N.status=f.status,N}if(z&&u){let N=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw N.status=f.status,N.retryable=!1,N}if(z&&(S=eo(S)),s)await F(L,{status:f.status});else if(z){let N=await Ve(L,k);if(!N.ok){let I=new Error(`HTTP redirect from ${b} ${N.error}`);throw I.status=f.status,I.retryable=!1,I}c&&N.addresses?.length&&(w||(w=await Ye(p?{importUndici:p}:{})),w&&(w.pin(new URL(L).hostname,N.addresses),x=w.fetch))}b=L;continue}if(typeof m=="function")try{await m(f,{url:b})}catch(D){throw ae(f),te(D?.message||String(D))}let O=await uo(f,l,{url:b,onOversize:()=>A.abort()}),re=lo(O);if(!f.ok){let D=new Error(`HTTP ${f.status} ${n} ${b}`);throw D.status=f.status,D.retryAfter=f.headers?.get?.("retry-after")??null,D.body=re??O.slice(0,300),D}return re??O}throw new Error(`HTTP redirect loop for ${e}`)}catch(b){if(A.signal.aborted&&!he(h)){let S=b&&(typeof b=="object"||typeof b=="function")&&!K.isProxy(b)?b:null,P=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let f=new Error("HTTP request timed out");throw Object.defineProperties(f,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),f}}throw b}finally{clearTimeout(g),w&&await w.close()}}async function ye(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&K.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let I of Object.getOwnPropertyNames(t)){let v=Object.getOwnPropertyDescriptor(t,I);if(!(I==="toJSON"&&v&&Object.hasOwn(v,"value")&&v.value===void 0)){if(!n.has(I))throw new TypeError("HTTP options contain unknown fields");if(!v||!v.enumerable||!Object.hasOwn(v,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=I=>{if(t==null||!Object.hasOwn(t,I))return;let v=Object.getOwnPropertyDescriptor(t,I);if(!v||!Object.hasOwn(v,"value"))throw new TypeError("HTTP options must contain own data properties");return v.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let a=r("retries");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>10))throw new TypeError("HTTP retries must be a bounded integer");let c=r("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let s=r("maxRedirects");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>ve))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ve}`);if(c==="error"&&s!==void 0&&s!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let l=c??"follow",u=l==="error"?0:s??ve;for(let I of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let v=r(I);if(v!==void 0&&typeof v!="boolean")throw new TypeError(`HTTP ${I} must be boolean`)}let p=r("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let m=r("signal");if(m!==void 0){if(K.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{he(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let I of["importUndici","lookupFn","validateResponse"]){let v=r(I);if(v!==void 0&&typeof v!="function")throw new TypeError(`HTTP ${I} must be a function`)}let h=r("fetchImpl"),d=h||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let E=i??12e3,w=(o||"GET").toUpperCase(),x=r("headers"),k=Qr(x),A=Object.assign(Object.create(null),k);Object.keys(A).some(I=>I.toLowerCase()==="accept")||(A.Accept="application/json");let g=r("body");g!=null&&typeof g!="string"&&(Object.keys(A).find(v=>v.toLowerCase()==="content-type")||(A["Content-Type"]="application/json"),g=Zr(g));let B=a??Gr,F=r("lookupFn"),b=!h,S=r("untrustedUrl")===!0,P=r("sameOriginRedirectsOnly")===!0,R=r("importUndici"),f=r("validateResponse"),O=m,re=p??null,D=async()=>{let I;for(let v=0;v<=B;v++){O&&Vr.call(O);let st=xe("http");try{let V=await po(e,{fetchImpl:d,method:w,headers:A,body:g,timeoutMs:E,lookupFn:F,realFetch:b,untrustedUrl:S,maxResponseBytes:re,sameOriginRedirectsOnly:P,importUndici:R,validateResponse:f,signal:O,redirectPolicy:l,maxRedirects:u});return st?.("succeeded"),V}catch(V){I=V;let ce=Ce=>{if(!V||typeof V!="object"&&typeof V!="function"||K.isProxy(V))return;let de=Object.getOwnPropertyDescriptor(V,Ce);return de&&Object.hasOwn(de,"value")?de.value:void 0},ge=ce("status");st?.("failed",ge);let In=ce("oracleTimeout")===!0||ce("name")==="AbortError"||ce("name")==="TimeoutError"||he(O),Pn=new Set([408,425,429]),On=ce("retryable")===!1?!1:ge!=null?Pn.has(ge)||Ur.has(ge)&&Lt.has(w):!In&&Lt.has(w);if(v===B||!On)throw V;let ct=ao(v,ce("retryAfter")),_n=xe("retry"),ut=!1;try{O?await new Promise((Ce,de)=>{let lt,fe=()=>{clearTimeout(lt),Bt.call(O,"abort",fe),de(Kr(O)||new DOMException("Aborted","AbortError"))};if(he(O)){fe();return}lt=setTimeout(()=>{Bt.call(O,"abort",fe),Ce()},ct),Yr.call(O,"abort",fe,{once:!0}),he(O)&&fe()}):await so(ct),ut=!0}finally{_n?.(ut?"succeeded":"failed")}}}throw I};if(!(r("dedupe")!==!1&&!O&&Ut(w,g)))return D();let L=io(w,e,A,{untrustedUrl:S,maxResponseBytes:re,sameOriginRedirectsOnly:P,redirectPolicy:l,maxRedirects:u,timeoutMs:E,retries:B,fetchImpl:Te(d),realFetch:b,lookupFn:Te(F),importUndici:Te(R),validateResponse:Te(f)},g),z=Xe.get(L);if(z){let I=xe("shared");try{let v=await z;return I?.("succeeded"),v}catch(v){throw I?.("failed"),v}}let N=D().finally(()=>Xe.delete(L));return Xe.set(L,N),N}async function Gt(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;a<r.length;){let c=a++;i[c]=await n(r[c],c)}})),i}var Ur,Lt,Gr,Mt,Wr,zr,Vr,Yr,Bt,Ht,he,Kr,Jr,ve,Mi,Y,Xe,jt,qt,ro,oo,so,Qe=ue(()=>{$t();Ft();Ur=new Set([408,425,429,500,502,503,504]),Lt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Gr=2,Mt=4e3,Wr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,zr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Vr=AbortSignal.prototype.throwIfAborted,Yr=EventTarget.prototype.addEventListener,Bt=EventTarget.prototype.removeEventListener,Ht=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,he=e=>e?Wr.call(e):!1,Kr=e=>e?zr.call(e):void 0,Jr=new Set([301,302,303,307,308]),ve=3,Mi=64*1024,Y=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Xe=new Map,jt=new WeakMap,qt=1;ro=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),oo=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);so=e=>new Promise(t=>setTimeout(t,e))});var Ie,Jt=ue(()=>{Ie={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}}});function tt(e){return Xt.get(Number(e))||null}function Zt(e,t=process.env){let n=tt(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Qt(e){return Xt.has(Number(e))}var Xt,en=ue(()=>{Jt();Xt=new Map(Object.values(Ie).map(e=>[e.chainId,e]))});var ot={};Nn(ot,{PUBLIC_RPC_FALLBACKS:()=>rt,erc20Allowance:()=>Po,erc20BalanceOf:()=>Oo,resolveRpcUrl:()=>Oe,rpcBatch:()=>sn,rpcBlockNumber:()=>Ao,rpcCall:()=>J,rpcChainId:()=>To,rpcGasPrice:()=>vo,rpcGetBalance:()=>Io,rpcHealth:()=>cn,rpcHealthAll:()=>Ro,transactionReceipt:()=>_o});import{Interface as wo,getAddress as go}from"ethers";function ne(e,t){try{return go(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function bo(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 nt(e){return e==null?null:Number.parseInt(String(e),16)}function Oe(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Zt(e,n);return r||rt[Number(e)]||null}function rn(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Eo.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function So(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function on(e){if(e?.error)throw So(e.error);return e?.result}function xo(e,t,n){return`${e}
1
+ var Rn=Object.defineProperty;var ue=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Nn=(e,t)=>{for(var n in t)Rn(e,n,{get:t[n],enumerable:!0})};import{AsyncLocalStorage as $r}from"node:async_hooks";function xe(e){let t=kr.getStore();if(!t||t.closed||!Fr.includes(e))return null;if(t.spans.length>=Lr)return t.droppedSpans++,null;let n={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(n),(r,o=null)=>{t.closed||n.durationMs!==null||(n.durationMs=Math.max(0,t.now()-t.start-n.startMs),n.outcome=r==="succeeded"?"succeeded":"failed",n.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var kr,Fr,Lr,$t=ue(()=>{kr=new $r,Fr=["http","retry","shared"],Lr=512});import ie from"node:net";import Mr from"node:dns";function Ae(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=u=>{if(!u)return[];let p=u.split(":"),m=p.at(-1);if(m?.includes(".")){let h=m.split(".").map(Number);if(h.length!==4||h.some(d=>!Number.isInteger(d)||d<0||d>255))return null;p.splice(p.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return p.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:p.map(h=>Number.parseInt(h,16))},[r,o]=t.split("::"),i=n(r),a=n(o);if(!i||!a)return null;let c=t.includes("::"),s=8-i.length-a.length;if(!c&&s!==0||c&&s<1)return null;let l=[...i,...Array(Math.max(0,s)).fill(0),...a];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function We(e,t,n){let r=Math.floor(n/8),o=n%8;for(let a=0;a<r;a+=1)if(e[a]!==t[a])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function ze(e){if(ie.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(ie.isIPv6(e)){let t=Ae(e);if(!t)return!1;let n=Ae("::ffff:0:0");return We(t,n,96)?ze([...t.slice(12)].join(".")):We(t,Ae("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>We(t,Ae(o),i)):!1}return!1}function Hr(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(Br.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ie.isIP(n);return r!==0&&!ze(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Ve(e,{lookupFn:t=Mr.promises.lookup}={}){let n=Hr(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ie.isIPv6(n.host)?6:4}]};let r;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:n.url,addresses:[]};try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!ze(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function jr(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let n;try{n=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(n.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(n.hostname)||!n.port||n.username||n.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let r=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(r))throw new Error("egress-guard: egress proxy token is missing");return{uri:n.origin,token:r}}async function Ye({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(h){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${h?.message||h}`);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=h=>String(h).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),a=new Map,c=h=>(Array.isArray(h)?h:[h]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(ie.isIPv6(d.address)?6:4)})),s=(h,d,E)=>{a.set(i(h),c(typeof d=="string"?[{address:d,family:E}]:d))},l=h=>{let d=i(h);if(ie.isIP(d))return[{address:d,family:ie.isIPv6(d)?6:4}];let E=a.get(d);if(!E||!E.length)throw new Error(`refused: unpinned host ${h} during pinned fetch`);return E},u=jr(),p=u&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:u.uri,token:`Bearer ${u.token}`,connectTimeout:1e4}):new n({connect:{lookup(h,d,E){let w;try{w=l(h)}catch(x){return E(x)}return d?.all?E(null,w):E(null,w[0].address,w[0].family)}}}),m=qr((h,d={})=>r(h,{...d,dispatcher:p}),s);return{dispatcher:p,fetch:m,pin:s,resolve:l,async close(){try{await p.destroy()}catch{}}}}function qr(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[Ke]=Object.freeze({pin:t}),e}function Je(e){return typeof e=="function"&&typeof e[Ke]?.pin=="function"}function kt(e,t,n){if(!Je(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ke].pin(t,n)}var Br,Ke,Ft=ue(()=>{Br=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ke=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Dr}from"node:crypto";import{types as K}from"node:util";function $(e){return te(`HTTP JSON body refused: ${e}`)}function Xr(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof K[t]=="function"&&K[t](e))}function Zr(e){let t=[],n=0,r=0,o=0,i=0,a=new WeakSet,c=u=>{if(n+=Buffer.byteLength(u,"utf8"),n>Y.bytes)throw $("serialized byte limit exceeded");t.push(u)},s=u=>{if(Buffer.byteLength(u,"utf8")>Y.bytes)throw $("serialized byte limit exceeded");return JSON.stringify(u)},l=(u,p)=>{if(r+=1,r>Y.nodes)throw $("node limit exceeded");if(p>Y.depth)throw $("depth limit exceeded");if(u===null){c("null");return}if(typeof u=="string"){c(s(u));return}if(typeof u=="boolean"){c(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw $("non-finite number");c(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw $("unsupported non-JSON value");if(K.isProxy(u))throw $("proxy value");if(Xr(u))throw $("unsupported exotic object");if(a.has(u))throw $("cyclic value");a.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw $("symbol-keyed fields are unsupported");if(Array.isArray(u)){let d=Object.getPrototypeOf(u),E=0;for(;d!==null;){if(K.isProxy(d))throw $("proxy array prototype");if(E+=1,E>Y.depth)throw $("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(u.length>Y.arrayLength)throw $("array length limit exceeded");for(let x=0;x<u.length;x+=1){let k=Object.getOwnPropertyDescriptor(u,String(x));if(!k||!Object.hasOwn(k,"value")||k.enumerable!==!0)throw $("array entries must be dense enumerable own data")}let w=0;for(let x in u){if(i+=1,i>Y.fields)throw $("enumeration limit exceeded");if(Object.hasOwn(u,x)&&(w+=1,w>u.length))throw $("named array fields are unsupported")}if(w!==u.length)throw $("array entries must be dense enumerable own data");c("[");for(let x=0;x<u.length;x+=1)x&&c(","),l(Object.getOwnPropertyDescriptor(u,String(x)).value,p+1);c("]");return}let m=Object.getPrototypeOf(u);if(m!==Object.prototype&&m!==null)throw $("non-plain object");let h=[];for(let d in u){if(i+=1,i>Y.fields)throw $("enumeration limit exceeded");if(!Object.hasOwn(u,d))continue;if(o+=1,o>Y.fields)throw $("field limit exceeded");let E=Object.getOwnPropertyDescriptor(u,d);if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw $("object fields must be enumerable own data");h.push([d,E.value])}c("{");for(let d=0;d<h.length;d+=1)d&&c(","),c(s(h[d][0])),c(":"),l(h[d][1],p+1);c("}")}finally{a.delete(u)}};return l(e,0),t.join("")}function Qr(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(K.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let a=i.value;if(a==null||["object","function","symbol"].includes(typeof a))throw new TypeError("HTTP header values must be scalar");t[r]=String(a)}return t}function eo(){return Object.assign(Object.create(null),{Accept:"application/json"})}function to(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 no(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function ve(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=jt.get(e);return t||(t=qt,qt+=1,jt.set(e,t)),`reference:${t}`}function Dt(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?ro.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Ut(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}if(Array.isArray(n))return n.length>0&&n.every(Dt);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Dt(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&oo.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function io(e,t,n,r={},o=null){let i=Dr("sha256"),a=(s,l)=>{let u=String(l);i.update(String(Buffer.byteLength(s,"utf8"))).update(":").update(s),i.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
2
+ `)};a("method",e),a("url",t),Object.keys(n||{}).map((s,l)=>({name:s.toLowerCase(),order:l,value:String(n[s])})).sort((s,l)=>s.name.localeCompare(l.name)||s.order-l.order).forEach((s,l)=>{a(`header-name-${l}`,s.name),a(`header-value-${l}`,s.value)}),a("body",o??"-");for(let s of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])a(`context-${s}`,r[s]??"-");return i.digest("hex")}function ao(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Mt):Math.min(250*2**e,Mt)+Math.floor(Math.random()*100)}function te(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ze(e,t,n){return te(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ae(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function co(e){return e?e.byteLength??e.length??0:0}async function uo(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ae(e),!r))throw Ze(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let p=await e.text(),m=Buffer.byteLength(p,"utf8");if(m>t){if(!r)throw Ze(n,`body ${m} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let c=[],s=0,l=!1;try{for(;;){let{value:p,done:m}=await a.read();if(m)break;if(p&&(c.push(Buffer.from(p)),s+=co(p),s>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Ze(n,`streamed ${s} bytes`,t);let u=Buffer.concat(c);return(l?u.subarray(0,t):u).toString("utf8")}function lo(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function po(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:c,untrustedUrl:s=!1,maxResponseBytes:l=null,sameOriginRedirectsOnly:u=!1,importUndici:p,validateResponse:m,signal:h,redirectPolicy:d="follow",maxRedirects:E=Te}){let w=null,x=t,k=a?{lookupFn:a}:{};if(s&&!c&&!Je(x))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=new AbortController,g=setTimeout(()=>A.abort(),i),B=h?Ht?Ht([h,A.signal]):h:A.signal,F=async(b,{status:S=null}={})=>{let P=await Ve(b,k);if(!P.ok)throw te(S==null?`HTTP refused ${b}: ${P.error}`:`HTTP redirect to ${b} ${P.error}`,S==null?{}:{status:S});let R=new URL(b).hostname;if(c){if(w&&(await w.close(),w=null),!w)try{w=await Ye({requireUndici:!0,...p?{importUndici:p}:{}})}catch(f){throw te(S==null?`HTTP refused ${b}: ${f?.message||f}`:`HTTP redirect to ${b} refused: ${f?.message||f}`,S==null?{}:{status:S})}w.pin(R,P.addresses),x=w.fetch}else kt(x,R,P.addresses);return P};try{let b=String(e),S=Object.assign(Object.create(null),r||{});s&&await F(b);for(let P=0;P<=E;P+=1){let R=Object.assign(Object.create(null),{method:n,headers:S,body:o,signal:B,redirect:"manual",dispatcher:void 0}),f=await x(b,R);if((d==="error"||E===0)&&f.status>=300&&f.status<400)throw ae(f),te(`HTTP ${f.status} ${n} redirect refused`,{status:f.status,redirectRefused:!0});if(Jr.has(f.status)){let D=u===!0&&n==="POST"&&[307,308].includes(f.status)&&Ut(n,o);if(n!=="GET"&&n!=="HEAD"&&!D){ae(f);let N=new Error(`HTTP ${f.status} ${n} ${b} redirected non-idempotent request`);throw N.status=f.status,N}if(P===E)throw ae(f),te(`HTTP ${f.status} ${n} redirect budget exhausted`,{status:f.status,redirectRefused:!0});let C=f.headers?.get?.("location"),L;try{L=to(C,b)}catch(N){throw ae(f),N}let z=!no(L,b);if(ae(f),z&&n==="POST"){let N=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw N.status=f.status,N}if(z&&u){let N=new Error(`HTTP ${f.status} ${n} cross-origin redirect refused`);throw N.status=f.status,N.retryable=!1,N}if(z&&(S=eo(S)),s)await F(L,{status:f.status});else if(z){let N=await Ve(L,k);if(!N.ok){let I=new Error(`HTTP redirect from ${b} ${N.error}`);throw I.status=f.status,I.retryable=!1,I}c&&N.addresses?.length&&(w||(w=await Ye(p?{importUndici:p}:{})),w&&(w.pin(new URL(L).hostname,N.addresses),x=w.fetch))}b=L;continue}if(typeof m=="function")try{await m(f,{url:b})}catch(D){throw ae(f),te(D?.message||String(D))}let O=await uo(f,l,{url:b,onOversize:()=>A.abort()}),re=lo(O);if(!f.ok){let D=new Error(`HTTP ${f.status} ${n} ${b}`);throw D.status=f.status,D.retryAfter=f.headers?.get?.("retry-after")??null,D.body=re??O.slice(0,300),D}return re??O}throw new Error(`HTTP redirect loop for ${e}`)}catch(b){if(A.signal.aborted&&!he(h)){let S=b&&(typeof b=="object"||typeof b=="function")&&!K.isProxy(b)?b:null,P=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let f=new Error("HTTP request timed out");throw Object.defineProperties(f,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),f}}throw b}finally{clearTimeout(g),w&&await w.close()}}async function ye(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&K.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let I of Object.getOwnPropertyNames(t)){let T=Object.getOwnPropertyDescriptor(t,I);if(!(I==="toJSON"&&T&&Object.hasOwn(T,"value")&&T.value===void 0)){if(!n.has(I))throw new TypeError("HTTP options contain unknown fields");if(!T||!T.enumerable||!Object.hasOwn(T,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=I=>{if(t==null||!Object.hasOwn(t,I))return;let T=Object.getOwnPropertyDescriptor(t,I);if(!T||!Object.hasOwn(T,"value"))throw new TypeError("HTTP options must contain own data properties");return T.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let a=r("retries");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>10))throw new TypeError("HTTP retries must be a bounded integer");let c=r("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let s=r("maxRedirects");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>Te))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Te}`);if(c==="error"&&s!==void 0&&s!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let l=c??"follow",u=l==="error"?0:s??Te;for(let I of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let T=r(I);if(T!==void 0&&typeof T!="boolean")throw new TypeError(`HTTP ${I} must be boolean`)}let p=r("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let m=r("signal");if(m!==void 0){if(K.isProxy(m)||!(m instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{he(m)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let I of["importUndici","lookupFn","validateResponse"]){let T=r(I);if(T!==void 0&&typeof T!="function")throw new TypeError(`HTTP ${I} must be a function`)}let h=r("fetchImpl"),d=h||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let E=i??12e3,w=(o||"GET").toUpperCase(),x=r("headers"),k=Qr(x),A=Object.assign(Object.create(null),k);Object.keys(A).some(I=>I.toLowerCase()==="accept")||(A.Accept="application/json");let g=r("body");g!=null&&typeof g!="string"&&(Object.keys(A).find(T=>T.toLowerCase()==="content-type")||(A["Content-Type"]="application/json"),g=Zr(g));let B=a??Gr,F=r("lookupFn"),b=!h,S=r("untrustedUrl")===!0,P=r("sameOriginRedirectsOnly")===!0,R=r("importUndici"),f=r("validateResponse"),O=m,re=p??null,D=async()=>{let I;for(let T=0;T<=B;T++){O&&Vr.call(O);let st=xe("http");try{let V=await po(e,{fetchImpl:d,method:w,headers:A,body:g,timeoutMs:E,lookupFn:F,realFetch:b,untrustedUrl:S,maxResponseBytes:re,sameOriginRedirectsOnly:P,importUndici:R,validateResponse:f,signal:O,redirectPolicy:l,maxRedirects:u});return st?.("succeeded"),V}catch(V){I=V;let ce=Ce=>{if(!V||typeof V!="object"&&typeof V!="function"||K.isProxy(V))return;let de=Object.getOwnPropertyDescriptor(V,Ce);return de&&Object.hasOwn(de,"value")?de.value:void 0},ge=ce("status");st?.("failed",ge);let In=ce("oracleTimeout")===!0||ce("name")==="AbortError"||ce("name")==="TimeoutError"||he(O),Pn=new Set([408,425,429]),On=ce("retryable")===!1?!1:ge!=null?Pn.has(ge)||Ur.has(ge)&&Lt.has(w):!In&&Lt.has(w);if(T===B||!On)throw V;let ct=ao(T,ce("retryAfter")),_n=xe("retry"),ut=!1;try{O?await new Promise((Ce,de)=>{let lt,fe=()=>{clearTimeout(lt),Bt.call(O,"abort",fe),de(Kr(O)||new DOMException("Aborted","AbortError"))};if(he(O)){fe();return}lt=setTimeout(()=>{Bt.call(O,"abort",fe),Ce()},ct),Yr.call(O,"abort",fe,{once:!0}),he(O)&&fe()}):await so(ct),ut=!0}finally{_n?.(ut?"succeeded":"failed")}}}throw I};if(!(r("dedupe")!==!1&&!O&&Ut(w,g)))return D();let L=io(w,e,A,{untrustedUrl:S,maxResponseBytes:re,sameOriginRedirectsOnly:P,redirectPolicy:l,maxRedirects:u,timeoutMs:E,retries:B,fetchImpl:ve(d),realFetch:b,lookupFn:ve(F),importUndici:ve(R),validateResponse:ve(f)},g),z=Xe.get(L);if(z){let I=xe("shared");try{let T=await z;return I?.("succeeded"),T}catch(T){throw I?.("failed"),T}}let N=D().finally(()=>Xe.delete(L));return Xe.set(L,N),N}async function Gt(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;a<r.length;){let c=a++;i[c]=await n(r[c],c)}})),i}var Ur,Lt,Gr,Mt,Wr,zr,Vr,Yr,Bt,Ht,he,Kr,Jr,Te,Mi,Y,Xe,jt,qt,ro,oo,so,Qe=ue(()=>{$t();Ft();Ur=new Set([408,425,429,500,502,503,504]),Lt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Gr=2,Mt=4e3,Wr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,zr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Vr=AbortSignal.prototype.throwIfAborted,Yr=EventTarget.prototype.addEventListener,Bt=EventTarget.prototype.removeEventListener,Ht=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,he=e=>e?Wr.call(e):!1,Kr=e=>e?zr.call(e):void 0,Jr=new Set([301,302,303,307,308]),Te=3,Mi=64*1024,Y=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Xe=new Map,jt=new WeakMap,qt=1;ro=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),oo=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);so=e=>new Promise(t=>setTimeout(t,e))});var Ie,Jt=ue(()=>{Ie={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},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}}});function tt(e){return Xt.get(Number(e))||null}function Zt(e,t=process.env){let n=tt(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Qt(e){return Xt.has(Number(e))}var Xt,en=ue(()=>{Jt();Xt=new Map(Object.values(Ie).map(e=>[e.chainId,e]))});var ot={};Nn(ot,{PUBLIC_RPC_FALLBACKS:()=>rt,erc20Allowance:()=>Po,erc20BalanceOf:()=>Oo,resolveRpcUrl:()=>Oe,rpcBatch:()=>sn,rpcBlockNumber:()=>Ao,rpcCall:()=>J,rpcChainId:()=>vo,rpcGasPrice:()=>To,rpcGetBalance:()=>Io,rpcHealth:()=>cn,rpcHealthAll:()=>Ro,transactionReceipt:()=>_o});import{Interface as wo,getAddress as go}from"ethers";function ne(e,t){try{return go(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function bo(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 nt(e){return e==null?null:Number.parseInt(String(e),16)}function Oe(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Zt(e,n);return r||rt[Number(e)]||null}function rn(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Eo.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function So(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function on(e){if(e?.error)throw So(e.error);return e?.result}function xo(e,t,n){return`${e}
3
3
  ${t}
4
- ${JSON.stringify(n??[])}`}async function an(e,t,n){return ye(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function sn(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>tn)throw new Error(`rpcBatch: at most ${tn} calls`);for(let i of t)rn(i?.method);let r=Oe(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,a)=>({jsonrpc:"2.0",id:a+1,method:i.method,params:i.params||[]}));try{let i=await an(r,o,n);if(Array.isArray(i)&&i.length===t.length){let a=new Map(i.map(c=>[Number(c?.id),c]));return t.map((c,s)=>on(a.get(s+1)??i[s]))}}catch{}return Promise.all(t.map(i=>J(e,i.method,i.params||[],n)))}async function J(e,t,n=[],r={}){let o=String(t||""),i=rn(o),a=Oe(e,r);if(!a)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=nn.get(a);if(u!=null)return u}let s=r.dedupe!==!1&&!r.signal?xo(a,o,n):null;if(s&&we.has(s))return we.get(s);let l=(async()=>{let u=await an(a,{jsonrpc:"2.0",id:1,method:t,params:n},r),p=on(u);return i==="eth_chainid"&&typeof p=="string"&&nn.set(a,p),p})();return s&&(we.set(s,l),l.finally(()=>{we.get(s)===l&&we.delete(s)}).catch(()=>{})),l}async function cn(e,t={}){let[n,r]=await sn(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:tt(e)?.name||null}}async function Ao(e,t={}){let n=await J(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function To(e,t={}){let n=await J(e,"eth_chainId",[],t);return parseInt(n,16)}async function vo(e,t={}){let n=await J(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Io(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await J(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Po(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ne(e.token||e.tokenAddress,"token"),o=ne(e.owner,"owner"),i=ne(e.spender,"spender"),a=Pe.encodeFunctionData("allowance",[o,i]),c=await J(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),s=Pe.decodeFunctionResult("allowance",c),l=BigInt(s[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Oo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ne(e.token||e.tokenAddress,"token"),o=ne(e.account||e.owner||e.address,"account"),i=Pe.encodeFunctionData("balanceOf",[o]),a=await J(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),c=Pe.decodeFunctionResult("balanceOf",a),s=BigInt(c[0]);return{chainId:n,token:r,account:o,balance:s.toString(),balanceHex:`0x${s.toString(16)}`,blockTag:e.blockTag||"latest"}}async function _o(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=bo(e.txHash||e.hash||e.transactionHash),o=await J(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=nt(o.status),a=i===1,c=i===1?"success":i===0?"reverted":"unknown",s=a?null:c==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?ne(e.expectedTo,"expectedTo"):null,u=o.to?ne(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,s=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:c,reason:s,statusCode:i,to:u,from:o.from?ne(o.from,"receipt.from"):null,blockNumber:nt(o.blockNumber),transactionIndex:nt(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Ro(e={}){let t=e.chainIds||Object.values(Ie).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Qt(r)&&!rt[r]&&!Oe(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await cn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Pe,rt,Eo,tn,we,nn,it=ue(()=>{Qe();en();Pe=new wo(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);rt={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"};Eo=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;tn=32,we=new Map,nn=new Map});import{createHash as Xo}from"node:crypto";import{createHash as Cn,createHmac as $n,timingSafeEqual as di}from"node:crypto";var kn=2,ke=300*1e3,Fn=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function $e(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map($e).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${$e(e[n])}`).join(",")}}`}function pt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function dt(e=process.env){return pt(process.env)||pt(e)}function Ln(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function be(e){let t=Ln(e);return Cn("sha256").update($e(t)).digest("hex")}function Mn(e,t=dt()){return t?$n("sha256",t).update(String(e)).digest("hex"):""}function Z(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let a=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(a&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let c={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:a?e.oraclePrepared:!0};if(!c.provider)throw new Error("stampPrepared: provider required");if(!c.kind)throw new Error("stampPrepared: kind required");let s=Number(o),l=i==null?s+ke:Number(i),u=l-s;if(!Number.isSafeInteger(s)||!Number.isSafeInteger(l)||u<=0||u>Fn)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...c,preparedAt:s,expiresAt:l,prepareVersion:kn},h=be(m),d=dt(r),E=d?Mn(h,d):void 0,w={...m,prepareHash:h};return E&&(w.prepareMac=E),w}import{createHash as Bn}from"node:crypto";var Hn=1,jn=8,H=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},qn=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),Dn=new Set(["family","id"]),Un=new Set(["id","startsAt","endsAt","eligibility"]),Gn=new Set(["kind","proofFormat","proofDigest"]),Wn=new Set(["amount","unit"]),zn=new Set(["value","unit"]);function le(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new H(`${t} must be a plain object`);return e}function pe(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new H(`${n} has unknown field ${r}`,"unknown-field")}function G(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new H(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function Vn(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new H(`${t} must be a positive safe integer`);return e}function Fe(e,t){if(e=le(e,t),pe(e,Wn,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new H(`${t} requires amount and unit`,"ambiguous-unit");let n=G(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new H(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:G(e.unit,`${t}.unit`)}}function Le(e,t){if(e=le(e,t),pe(e,zn,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new H(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function Yn(e,t){e=le(e,t),pe(e,Gn,t);let n=G(e.kind,`${t}.kind`),r=G(e.proofFormat,`${t}.proofFormat`),o=G(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new H(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function Kn(e,t){let n=`stages[${t}]`;e=le(e,n),pe(e,Un,n);let r=Le(e.startsAt,`${n}.startsAt`),o=Le(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new H(`${n} must end after it starts`,"invalid-stage-range");return{id:G(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:Yn(e.eligibility,`${n}.eligibility`)}}function Me(e){if(e=le(e,"input"),pe(e,qn,"input"),e.version!==Hn)throw new H("version must be 1");let t=le(e.chain,"chain");pe(t,Dn,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>jn)throw new H("stages must contain 1 through 8 entries","stage-count");let r=n.map(Kn).sort((a,c)=>a.startsAt.value-c.startsAt.value||a.id.localeCompare(c.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new H("stage ids must be unique","duplicate-stage");if(o.add(r[a].id),a&&r[a].startsAt.value<r[a-1].endsAt.value)throw new H("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new H("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:G(t.family,"chain.family"),id:G(t.id,"chain.id")},marketplace:G(e.marketplace,"marketplace"),mechanism:G(e.mechanism,"mechanism"),collection:G(e.collection,"collection"),recipient:G(e.recipient,"recipient"),quantity:Vn(e.quantity,"quantity"),stages:r,mintValueCap:Fe(e.mintValueCap,"mintValueCap"),networkFeeCap:Fe(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:Fe(e.priorityFeeCap,"priorityFeeCap"),expiry:Le(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new H("every stage must end no later than expiry","stage-after-expiry");return i}function Jn(e){return JSON.stringify(Me(e))}function ft(e){return`sha256:${Bn("sha256").update(Jn(e),"utf8").digest("hex")}`}var Be=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),oe=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),He=Object.freeze(Object.values(oe)),mt=new Set(He),ht=Object.freeze(He.slice(0,4)),Xn=He,Zn=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),j=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function Ee(e,t){if(!Array.isArray(e)||e.length===0)throw new j(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new j(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new j(`${t} contains duplicates`);return[...n].sort()}function Qn(e){if(!Array.isArray(e))throw new j("capabilities must be an array");let t=new Set(e);for(let n of t)if(!mt.has(n))throw new j(`unknown capability ${n}`,"unknown-capability");return Xn.every(n=>t.has(n))?Be.AUTOMINT_READY:ht.every(n=>t.has(n))?Be.PREPARE_READY:Be.RESEARCH_ONLY}function je(e=[]){if(!Array.isArray(e))throw new j("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new j("entry must be an object");for(let i of Object.keys(n))if(!Zn.has(i))throw new j(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new j("entry id must be an exact string");if(t.has(n.id))throw new j(`duplicate entry id ${n.id}`,"duplicate-entry");let r=Ee(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(Ee(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(Ee(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(Ee(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:Qn(r)});t.set(o.id,o)}return Object.freeze({entries:Object.freeze([...t.values()]),get(n){return t.get(n)||null},find({chainFamily:n,marketplace:r,mechanism:o}={}){return[...t.values()].filter(i=>i.chainFamilies.includes(n)&&i.marketplaces.includes(r)&&i.mechanisms.includes(o))},require(n,r=ht){let o=t.get(n);if(!o)throw new j(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!mt.has(i))throw new j(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new j(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var yi=je([]);import{getAddress as er,Interface as qe,keccak256 as tr}from"ethers";var Q=Object.freeze({manifold:new qe(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new qe(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new qe(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Ue=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"})}),Ei=Object.freeze(Object.fromEntries(Object.entries(Ue).map(([e,t])=>[Q[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function T(e){throw new Error(`evm-mint-launchpads: ${e}`)}function U(e,t){try{return er(String(e||""))}catch{return T(`invalid ${t}`)}}function q(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&T(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return T(`${t} must be an unsigned integer`)}}function De(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&T(`invalid ${t}`),e.map(String)}function nr(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&T("invalid chainId");let o=U(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&U(u.contract,"reviewed contract")===o);a||T("unsupported contract or wrong chain");let c=U(a.mintTarget||a.contract,"reviewed mint target"),s=Q[e].getFunction(Ue[e].signature).selector.toLowerCase();return(!(a.selectors||[s]).map(u=>String(u).toLowerCase()).includes(s)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&T("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:c,selector:s,review:a}}async function rr(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);T("runtime bytecode verification required")}function or(e,t){let n=e.stage;if(!n)return null;let r=q(n.startTime,"stage startTime"),o=q(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&T("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function ir(e,t){let n=Ue[e];String(t).slice(0,10).toLowerCase()!==Q[e].getFunction(n.signature).selector.toLowerCase()&&T("unknown selector");let r;try{r=Q[e].decodeFunctionData(n.signature,t)}catch{T("invalid calldata layout")}let o;return e==="manifold"&&(o=Q.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Q.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Q.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&T("calldata must be canonical with no suffix"),r}async function yt(e,t={},n={}){Q[e]||T("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=nr(e,t,n),c=U(t.recipient||t.minter,"recipient"),s=q(t.quantity,"quantity",{positive:!0}),l=q(t.priceWei,"priceWei"),u=q(t.maxValueWei,"maxValueWei"),p=q(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),m=t.transaction||t.tx;(!m||Number(m.chainId)!==r)&&T("transaction chain mismatch"),U(m.to,"transaction target")!==i&&T("transaction target mismatch");let h=await rr(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(h))||h==="0x"||tr(h).toLowerCase()!==String(a.codeHash).toLowerCase())&&T("runtime bytecode is not reviewed");let d=ir(e,m.data),E=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),w=or(t,E),x,k,A,g=null,B=[];if(e==="manifold")U(d[0],"calldata contract")!==o&&T("calldata contract mismatch"),(t.instanceId==null||q(d[1],"instanceId")!==q(t.instanceId,"instanceId"))&&T("instance/stage mismatch"),(t.mintIndex==null||q(d[2],"mintIndex")!==q(t.mintIndex,"mintIndex"))&&T("mint index/stage mismatch"),B=De([...d[3]]),x=U(d[4],"calldata recipient"),k=1n,A=l;else if(e==="zora")x=U(d[0],"calldata recipient"),k=BigInt(d[1]),A=l,t.comment!=null&&d[2]!==String(t.comment)&&T("comment mismatch"),t.mintReferral!=null&&U(d[3],"mint referral")!==U(t.mintReferral,"expected mint referral")&&T("mint referral mismatch");else{x=U(d[0],"calldata recipient"),k=BigInt(d[1]),A=BigInt(d[3]);let R=d[4];B=De([...R.proof]),g=BigInt(R.quantityLimitPerWallet),g<s&&T("wallet allowance below quantity"),(BigInt(R.pricePerToken)!==l||U(R.currency,"allowlist currency")!==U(d[2],"currency"))&&T("allowlist terms mismatch")}x!==c&&T("recipient mismatch"),k!==s&&T("quantity mismatch"),A!==l&&T("price mismatch"),t.proof!=null&&JSON.stringify(B.map(R=>R.toLowerCase()))!==JSON.stringify(De(t.proof).map(R=>R.toLowerCase()))&&T("proof mismatch");let F=q(m.value??0,"transaction value"),b=l*s;(F<b||F-b>p||F>u)&&T("transaction value or fee cap exceeded");let S=m.gasLimit==null?null:q(m.gasLimit,"gasLimit"),P=m.maxFeePerGas==null?null:q(m.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(S==null||S>q(t.maxGasLimit,"maxGasLimit"))&&T("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>q(t.maxFeePerGasWei,"maxFeePerGasWei"))&&T("gas fee cap exceeded"),Z({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:c,quantity:s.toString(),priceWei:l.toString(),valueWei:F.toString(),platformFeeWei:(F-b).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:p.toString(),...w?{stage:w}:{},...g==null?{}:{walletAllowance:g.toString()},proof:B,transaction:{chainId:r,to:i,data:m.data,value:F.toString(),...S==null?{}:{gasLimit:S.toString()},...P==null?{}:{maxFeePerGas:P.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var ar="RESEARCH_ONLY";var sr="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"}),xi=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function cr(){throw new Error(`solana-mint: ${ar}; disabled until ${sr}`)}function wt(){cr()}import{Address as ur,CompactSize as lr,NETWORK as pr,OutScript as Ot,Script as dr,TEST_NETWORK as gt,Transaction as fr,utils as mr}from"@scure/btc-signer";import{createHash as me}from"node:crypto";var bt="universal-ordinals-mint",Et="bitcoin-ordinals-mint-plan",hr=1800*1e3,yr=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),St=new Set,wr=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function W(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function ee(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`ordinals mint: ${t} must be an integer`);let o=BigInt(r);if(n?o<=0n:o<0n)throw new Error(`ordinals mint: ${t} must be ${n?"positive":"non-negative"}`);return o}function Ge(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 _t(e,t){let n=W(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 gr(e){return e==="bitcoin"||e==="mainnet"?pr:e==="regtest"?{...gt,bech32:"bcrt"}:gt}function xt(e,t){try{let n=Ot.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 br(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function Er(e){let t=me("sha256").update(e.unsignedTx).digest();return me("sha256").update(t).digest().reverse().toString("hex")}function At(e,...t){let n=me("sha256").update(e,"ascii").digest();return me("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function Sr(e,t,n,r){let o=Buffer.from(t||[]);if(o.length<1)throw new Error(`${r} has an empty tapLeafScript`);let i=o.subarray(0,-1),a=o.at(-1);if(n.type!=="tr")throw new Error(`${r} tapLeafScript requires a taproot prevout`);if(!e?.internalKey||!Array.isArray(e.merklePath))throw new Error(`${r} has malformed tapLeafScript control data`);let c=At("TapLeaf",Buffer.from([a]),Buffer.from(lr.encode(BigInt(i.length))),i);for(let u of e.merklePath){let p=Buffer.from(u);c=At("TapBranch",...Buffer.compare(c,p)<0?[c,p]:[p,c])}let[s,l]=mr.taprootTweakPubkey(e.internalKey,c);if(!Buffer.from(s).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==a)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function Tt(e,t){let n=W(e,t);try{let r=Buffer.from(n,"base64");if(!r.length||r.toString("base64")!==n||r.subarray(0,5).toString("hex")!=="70736274ff")throw new Error("bad PSBT encoding or magic");let o=fr.fromPSBT(r);if(o.global?.unknown?.length||o.global?.proprietary?.length)throw new Error(`${t} contains opaque unknown/proprietary global fields`);let i=Array.from({length:o.inputsLength},(c,s)=>{let l=o.getInput(s);for(let m of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(br(l[m]))throw new Error(`${t} contains signed/finalized input ${s}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${s} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${s} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${s} requires witnessUtxo value and script`);let u=xt(l.witnessUtxo.script,`${t} input ${s} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${s} uses SIGHASH_DEFAULT for a non-taproot prevout`);let p=(l.tapLeafScript||[]).map(([m,h],d)=>Sr(m,h,u,`${t} input ${s} tapLeafScript ${d}`));return{txid:Buffer.from(l.txid).toString("hex"),vout:Number(l.index),sequence:Number(l.sequence),valueSats:BigInt(l.witnessUtxo.amount).toString(),scriptHex:Buffer.from(l.witnessUtxo.script).toString("hex"),sighashType:l.sighashType,tapLeafScripts:p}}),a=Array.from({length:o.outputsLength},(c,s)=>{let l=o.getOutput(s);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${s} contains opaque unknown/proprietary fields`);return xt(l.script,`${t} output ${s} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:Er(o),inputs:i,outputs:a,feeSats:o.fee.toString(),vsizeLowerBound:o.unsignedTx.length}}catch(r){throw new Error(`ordinals mint: invalid ${t}; decoded PSBT required (${r?.message||"decode failed"})`)}}function xr(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 Ar(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 vr(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=Ar(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!Tr.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let c=r.get(i)||[];c.push(Buffer.from(a)),r.set(i,c)}if(e[n++]!==0)throw new Error("ordinals mint: malformed inscription envelope body separator");let o=[];for(;n<e.length&&e[n]!=="ENDIF";){if(!(e[n]instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope body");o.push(Buffer.from(e[n++]))}if(e[n]!=="ENDIF")throw new Error("ordinals mint: unterminated inscription envelope");return{fields:r,content:Buffer.concat(o)}}function Ir(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let p;try{p=dr.decode(u)}catch(m){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${m?.message||"script decode failed"})`)}for(let m=0;m+2<p.length;m+=1)p[m]===0&&p[m+1]==="IF"&&p[m+2]instanceof Uint8Array&&Buffer.from(p[m+2]).equals(Buffer.from("ord","ascii"))&&o.push(vr(p,m))}if(o.length===0)throw new Error("ordinals mint: missing tapLeafScript inscription envelope");if(o.length!==1)throw new Error("ordinals mint: ambiguous tapLeafScript inscription envelope");let i=o[0],a=i.fields.get(1)||[];if(a.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let c;try{c=new TextDecoder("utf-8",{fatal:!0}).decode(a[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(c!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(me("sha256").update(i.content).digest("hex")!==t)throw new Error("ordinals mint: inscription envelope content SHA-256 does not match contentHash");let l=i.fields.get(3)||[];if(r!=null){if(l.length!==1||xr(l[0])!==r)throw new Error("ordinals mint: inscription envelope parent linkage does not match parentId")}else if(l.length!==0)throw new Error("ordinals mint: unexpected inscription envelope parent linkage")}function vt(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 Pr(e){let t=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|signedPsbt|signedTransaction|rawTransaction|txHex)$/i,n=r=>{if(!(!r||typeof r!="object"))for(let[o,i]of Object.entries(r)){if(t.test(o))throw new Error(`ordinals mint: ${o} refused; private/signed material is outside this prepare-only adapter`);n(i)}};if(n(e),e.sign===!0||e.execute===!0||e.broadcast===!0||e.submit===!0)throw new Error("ordinals mint: sign/broadcast/execute refused; adapter is prepare-only")}function Rt(e,t="parentId"){let n=W(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 Nt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=W(e.txid,`commitInputs[${t}].txid`).toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`ordinals mint: commitInputs[${t}].txid must be 64 hex`);let r=Number(e.vout);if(!Number.isSafeInteger(r)||r<0||r>4294967295)throw new Error(`ordinals mint: commitInputs[${t}].vout invalid`);let o=ee(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,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 o=e.map((a,c)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${c} invalid`);return{role:W(a.role,`revealOutputs[${c}].role`),address:W(a.address,`revealOutputs[${c}].address`),valueSats:ee(a.valueSats??a.value,`revealOutputs[${c}].valueSats`).toString(),scriptHex:_t(a.scriptHex,`revealOutputs[${c}].scriptHex`),...a.parentId==null?{}:{parentId:Rt(a.parentId,`revealOutputs[${c}].parentId`)}}}),i=o.filter(a=>a.role==="inscription");if(i.length!==1)throw new Error("ordinals mint: exactly one inscription reveal output required");if(i[0].address!==t)throw new Error("ordinals mint: reveal destination mutation refused");if(i[0].valueSats!==r)throw new Error("ordinals mint: reveal postage does not match bound postageSats");if(i[0].parentId!==n)throw new Error("ordinals mint: missing or mutated parent linkage on inscription output");return o}function _r(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:W(n?.role,`commitOutputs[${r}].role`),valueSats:ee(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:_t(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 It(e,t,n){if(e.length!==t.length||e.some((r,o)=>r.valueSats!==t[o].valueSats||r.scriptHex!==t[o].scriptHex))throw new Error(`ordinals mint: actual ${n} outputs do not match reviewed outputs`)}function Pt(e,t,n){try{return Buffer.from(Ot.encode(ur(gr(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 Rr(e,t){let n=e.commitPsbtInputs??e.psbtInputs;if(n==null)return;if(!Array.isArray(n))throw new Error("ordinals mint: commitPsbtInputs must be an array");let r=n.map((i,a)=>Nt({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function Nr(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");Pr(e);for(let f of["content","contentBytes","body","file","path","url","contentUrl"])if(e[f]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let f of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[f]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=W(e.network,"network").toLowerCase();if(!yr.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=W(e.contentHash??e.contentSha256??e.sha256,"contentHash").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new Error("ordinals mint: contentHash must be a 32-byte SHA-256 hex digest");let o=W(e.contentType??e.mimeType,"contentType").toLowerCase();if(!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(o))throw new Error("ordinals mint: invalid contentType");let i=Rt(e.parentId??e.parentInscriptionId),a=W(e.recipient??e.destination,"recipient"),c=ee(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(Nt);if(new Set(s.map(f=>f.outpoint)).size!==s.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");Rr(e,s);let l=Tt(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=Tt(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),p=_r(e.commitOutputs),m=Or(e.revealOutputs,{recipient:a,parentId:i,postageSats:c});if(l.inputs.length!==s.length||l.inputs.some((f,O)=>f.txid!==s[O].txid||f.vout!==s[O].vout||f.valueSats!==s[O].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");It(l.outputs,p,"commit PSBT"),It(u.outputs,m,"reveal PSBT");let h=Pt(a,n,"recipient");if(m.find(f=>f.role==="inscription").scriptHex!==h)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[f,O]of m.entries())if(O.scriptHex!==Pt(O.address,n,`revealOutputs[${f}].address`))throw new Error(`ordinals mint: reveal output ${f} script does not pay its bound address`);let d=p.findIndex(f=>f.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let E=u.inputs.filter(f=>f.txid===l.txid&&f.vout===d);if(E.length!==1||E[0].valueSats!==p[d].valueSats||E[0].scriptHex!==p[d].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");Ir(u,{contentHash:r,contentType:o,parentId:i});let w=Ge(e.commitFeeRateSatVb,"commitFeeRateSatVb"),x=Ge(e.revealFeeRateSatVb,"revealFeeRateSatVb"),k=Ge(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(k<=0||w>k||x>k)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let A=ee(e.commitFeeSats,"commitFeeSats"),g=ee(e.revealFeeSats,"revealFeeSats"),B=ee(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(A+g>B)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==A.toString()||u.feeSats!==g.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(A)/l.vsizeLowerBound>w||Number(g)/u.vsizeLowerBound>x)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(f=>f.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let S=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:ee(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(S.enabled){if(!Number.isSafeInteger(S.outputIndex)||S.outputIndex<0||m[S.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(m[S.outputIndex].valueSats!==S.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(m.some(f=>f.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let P=Number(t.nowMs??Date.now()),R=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(R)||R<=P||R-P>hr)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:a,postageSats:c,commitInputs:l.inputs.map(vt),commitPsbt:l.encoded,commitOutputs:p,revealInputs:u.inputs.map(vt),revealPsbt:u.encoded,revealOutputs:m,commitRate:w,revealRate:x,maxRate:k,commitFee:A.toString(),revealFee:g.toString(),maxTotalFee:B.toString(),rbf:e.rbf,cpfp:S,expiresAt:R}}function Cr(e={},t={}){let n=Nr(e,t),r=n.commitInputs.find(c=>St.has(c.outpoint));if(r)throw new Error(`ordinals mint: commit UTXO ${r.outpoint} already reserved; reuse refused`);let o=Object.freeze({...t.feeConfig||e.feeConfiguration||{}}),i={provider:bt,kind:Et,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...wr},feeConfiguration:o,plan:{version:1,network:n.network,content:{sha256:n.contentHash,type:n.contentType,mutable:!1},parentId:n.parentId,recipient:n.recipient,postageSats:n.postageSats,commit:{unsignedPsbt:n.commitPsbt,inputs:n.commitInputs,outputs:n.commitOutputs,feeRateSatVb:n.commitRate,feeSats:n.commitFee,rbf:n.rbf},reveal:{unsignedPsbt:n.revealPsbt,inputs:n.revealInputs,outputs:n.revealOutputs,feeRateSatVb:n.revealRate,feeSats:n.revealFee,cpfp:n.cpfp},caps:{maxFeeRateSatVb:n.maxRate,maxTotalFeeSats:n.maxTotalFee},expiresAt:n.expiresAt,maxExecutions:1},note:"Unsigned commit/reveal PSBT plan only. Sign and broadcast in a user-controlled Bitcoin wallet; inscription numbers are not stable before confirmation."},a=Z(i,{provider:bt,kind:Et,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let c of n.commitInputs)St.add(c.outpoint);return a}var Ct=Cr;Qe();import{readFileSync as No,existsSync as Co}from"node:fs";import{getAddress as $o,Interface as Re,TypedDataEncoder as Ki,parseUnits as Ji}from"ethers";var Wt="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Vt({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let a=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(a===String(t).replace(/\/$/,""))return{baseUrl:a,trusted:!0,host:zt(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([zt(t),...n]).has(s)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(s);return c.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:s,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:s}}if(String(process.env[Wt]||"")==="1")return{baseUrl:a,trusted:!1,host:s};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${s} (set ${Wt}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:s}}function zt(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Yt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var fo=/^(0|[1-9][0-9]*)$/,et=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function se(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!fo.test(i))throw new Error(`${t} must be an integer wei string`);o=BigInt(i)}}else throw new Error(`${t} must be bigint, number, or integer string`);if(o<0n||!r&&o===0n)throw new Error(`${t} must be ${r?"non-negative":"positive"}`);return o}function mo(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function ho(e={}){return e.maxFeePerGas!=null?se(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?se(e.gasPrice,"gasPrice"):null}function yo(e={}){try{let t=mo(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=se(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=se(n.gasLimit??n.gas,"gasLimit"),c=ho(n);if(c==null)throw new Error("maxFeePerGas or gasPrice required");let s=se(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=se(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:se(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),p=a*c;return p>i?{ok:!1,status:"BLOCK",reason:`total gas ${p} exceeds cap ${i}`,chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:s!=null&&c>s?{ok:!1,status:"BLOCK",reason:`unit fee ${c} exceeds cap ${s}`,chainId:t,unitFeeWei:c.toString(),maxFeePerGasWei:s.toString(),totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString(),unitFeeWei:c.toString(),maxFeePerGasWei:s?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function Kt(e={}){let t=yo(e);if(!t.ok)throw new et(t);return t}var ko="https://api.opensea.io/api/v2",Fo="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)",Lo=new Re([`function ${Fo}`]),_e=new Re(["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"]),Mo=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"]),ta=new Set(Mo);function Bo(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Co(e))return"";try{for(let t of No(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 at(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||Bo()}function pn(e={}){return Vt({provider:"opensea",defaultUrl:ko,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function dn(e={}){return pn(e).baseUrl}function fn(e={}){return Yt({accept:"application/json"},{"x-api-key":at(e)},pn(e).trusted)}function X(e,t="address"){try{return $o(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}async function Ho(e,t={}){if(!e)throw new Error("collection slug required");if(!at(t))throw new Error("OPENSEA_API_KEY required");return ye(`${dn(t)}/collections/${encodeURIComponent(e)}`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var jo=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});function qo(e){let t=String(e||"").trim().toLowerCase(),n=jo[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function un(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`opensea: ${t} must be an unsigned integer`);let o=BigInt(r);if(n&&o<=0n)throw new Error(`opensea: ${t} must be positive`);return o}function Do(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 Uo(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 Go(e,t,n="listing expiry"){let r=e==null?"":String(e).trim(),o;if(/^\d+$/.test(r)){let i=Number(r);o=r.length<=10?i*1e3:i}else o=Date.parse(r);if(!r||!Number.isFinite(o))throw new Error(`opensea: ${n} missing or invalid`);if(o<=t)throw new Error(`opensea: ${n} is expired or stale`);return new Date(o).toISOString()}var na=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 Wo(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 mn(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"&&mn(n))}function hn(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function yn(e){return!e||typeof e!="object"?!1:hn(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&yn(t))}function wn(e,t=[],n=new Set){if(!e||typeof e!="object"||n.has(e))return t;n.add(e),e.transaction&&typeof e.transaction=="object"?t.push(e.transaction):e.tx&&typeof e.tx=="object"&&t.push(e.tx);for(let[r,o]of Object.entries(e))(r==="transaction"||r==="tx")&&o&&typeof o=="object"||o&&typeof o=="object"&&wn(o,t,n);return t}function ln(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function zo(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(hn(e))throw new Error("opensea: signed transaction material refused");if((e.from?X(ln(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=X(ln(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,c=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&c){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=Lo.encodeFunctionData("fulfillAdvancedOrder",[c.advancedOrder,c.criteriaResolvers,c.fulfillerConduitKey,c.recipient])}let s=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(s))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");s.endsWith(l.slice(2))||(s+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let p=Do(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:s,value:p.hex,chainId:n,valueWei:p.amount}}function gn(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 Vo(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Gt(e,4,async s=>{let{chainId:l,...u}=gn(s);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,d]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(d).toString()}let{rpcCall:p}=await Promise.resolve().then(()=>(it(),ot)),m={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,h]=await Promise.all([p(t,"eth_call",[u,"pending"],m),p(t,"eth_estimateGas",[u],m)]);return BigInt(h).toString()}),a=null,c=null;if(r&&typeof r.getFeeData=="function"){let s=await r.getFeeData();c=s?.maxPriorityFeePerGas==null?0n:BigInt(s.maxPriorityFeePerGas),a=s?.maxFeePerGas==null?s?.gasPrice==null?null:BigInt(s.gasPrice):BigInt(s.maxFeePerGas)}else if(o){let{rpcCall:s}=await Promise.resolve().then(()=>(it(),ot)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await s(t,"eth_gasPrice",[],l));try{c=BigInt(await s(t,"eth_maxPriorityFeePerGas",[],l))}catch{c=0n}let p=await s(t,"eth_getBlockByNumber",["pending",!1],l),h=(p?.baseFeePerGas==null?0n:BigInt(p.baseFeePerGas))*2n+c;a=u>h?u:h}return a!=null&&c!=null&&e.forEach((s,l)=>{let p=(BigInt(i[l])*120n+99n)/100n;s.gasLimit=p.toString(),s.maxPriorityFeePerGas=c.toString(),s.maxFeePerGas=a.toString(),s.worstCaseFeeWei=(p*a).toString()}),{simulated:!0,gasEstimates:i}}function Yo(e,t){if(mn(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(yn(e))throw new Error("opensea: signed transaction material refused");let n=wn(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=>zo(r,t))}function Ko(e,t,n={}){return Z({...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 Jo(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=X(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function bn(e={},t={}){if(!at(t))throw new Error("OPENSEA_API_KEY required");Wo(e);let{chain:n,chainId:r}=qo(e.chain),o=X(e.buyer||e.minter||e.address,"buyer"),i=X(e.contract,"NFT contract"),a=Uo(e.quantity),c=un(e.priceWei,"priceWei"),s=un(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Go(e.expiry,l,"mint expiry");if(e.tokenId!=null)throw new Error("opensea: SeaDrop mint tokenId is unknown until the mined receipt and must not be caller supplied");let p=String(e.slug||"").trim();if(!p)throw new Error("opensea: collection slug required");let m=await Ho(p,t),h=Jo(m,n,i),d=c*BigInt(a);if(d>s)throw new Error("opensea: mint total exceeds total cap");let E=await ye(`${dn(t)}/drops/${encodeURIComponent(p)}/mint`,{method:"POST",headers:fn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),w=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,x=Array.isArray(w)?w:w?[w]:[];if(!x.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let k=new Set(x.map(C=>X(C,"SeaDrop mint target"))),A=Yo(E,{buyer:o,chainId:r,targets:k});if(A.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let g,B,F=null,b;try{g=_e.decodeFunctionData("mintPublic",A[0].data),B="public",b=_e.encodeFunctionData("mintPublic",[g[0],g[1],g[2],g[3]])}catch{try{g=_e.decodeFunctionData("mintAllowList",A[0].data),B="allowlist";let C=g[4],L=[...g[5]].map(String);if(L.length<1||L.length>64||L.some(v=>!/^0x[0-9a-fA-F]{64}$/.test(v)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let z=BigInt(C.startTime),N=BigInt(C.endTime),I=BigInt(Math.floor(l/1e3));if(z>I||N<=I)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(C.mintPrice)!==c)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(C.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");b=_e.encodeFunctionData("mintAllowList",[g[0],g[1],g[2],g[3],C,L]),F={mintPrice:BigInt(C.mintPrice).toString(),maxTotalMintableByWallet:BigInt(C.maxTotalMintableByWallet).toString(),startTime:z.toString(),endTime:N.toString(),dropStageIndex:BigInt(C.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(C.maxTokenSupplyForStage).toString(),feeBps:Number(C.feeBps),restrictFeeRecipients:!!C.restrictFeeRecipients,proof:L}}catch(C){throw/opensea:/.test(String(C?.message||""))?C:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let S=X(g[0],"mint NFT contract"),P=X(g[1],"mint fee recipient"),R=X(g[2],"mint recipient");if(S!==h)throw new Error("opensea: mint calldata collection mismatch");if(R!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(g[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(b.toLowerCase()!==A[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let f=A.reduce((C,L)=>C+L.valueWei,0n);if(f!==d)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(f>s)throw new Error("opensea: mint total exceeds total cap");let O=await Vo(A,r,{...t,provider:e.provider||t.provider});if(O.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let re=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},D=Kt({chainId:r,tx:A[0],policy:re});return Ko({action:"mint",mintType:B,...F?{stage:F}:{},chain:n,chainId:r,slug:p,buyer:o,contract:h,quantity:a,priceWei:c.toString(),totalWei:f.toString(),maxTotalWei:s.toString(),mintTarget:A[0].to,feeRecipient:P,expiry:u,transactions:A.map(gn),gasWar:D,...O},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+ke,Date.parse(u),F?Number(BigInt(F.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}var ra=new Re(["function setApprovalForAll(address operator,bool approved)"]),oa=new Re(["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 Zo=Object.freeze([oe.DISCOVERY,oe.ELIGIBILITY,oe.PREPARATION,oe.SIMULATION]),En=[["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]],Sn=Object.freeze(En.map(([e,t,n,r])=>Object.freeze({id:e,family:t,chainFamilies:Object.freeze([t]),marketplaces:Object.freeze(n),mechanisms:Object.freeze(r),enabled:t!=="solana",capabilities:t==="solana"?Object.freeze([oe.DISCOVERY]):Zo,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),ma=je(Sn.map(({family:e,tier:t,enabled:n,...r})=>r)),xn=new Map(En.map(e=>[e[0],e])),Qo=new Set(["intent","adapterId","input"]),ei=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Ne=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function _(e,t,n){throw new Ne(e,t,n?{cause:n}:{})}function y(e,t,n){String(e??"")!==String(t)&&_("intent-mismatch",`${n} does not match canonical intent`)}function M(e,t,n){let r=e[t];return r.unit!==n&&_("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function An(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))ei.test(n)&&_("custody-refused",`${t}.${n} is outside the prepare-only boundary`),An(r,`${t}.${n}`)}function ti(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function ni(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&_("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(s=>s.id===t.stageId);o||_("intent-mismatch","stageId does not match canonical intent"),y(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${Xo("sha256").update(JSON.stringify(ti(n,t))).digest("hex")}`;y(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),c=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(a)||!Number.isSafeInteger(c))&&_("invalid-request","decoded input requires exact stage bounds"),y(a,o.startsAt.value,"stage start"),y(c,o.endsAt.value,"stage end"),(r<a||r>=c)&&_("expired-intent","canonical mint stage is not active at authoritative now"),o}function ri(e,t){let n=xn.get(t);n||_("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return y(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&_("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function oi(e,t){e.chain.family==="evm"?(y(t.chainId,e.chain.id,"network"),y(t.contract,e.collection,"collection/drop"),y(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity"),y(t.maxValueWei??t.maxTotalWei,M(e,"mintValueCap","wei"),"mint-value cap"),y(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,M(e,"networkFeeCap","wei"),"network-fee cap"),y(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,M(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(y(t.network,e.chain.id,"network"),y(t.collection??t.drop??t.identity,e.collection,"collection/drop"),y(t.recipientOwner??t.recipient,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity"),y(t.priceLamports,M(e,"mintValueCap","lamports"),"mint-value cap"),y(t.networkFeeCapLamports,M(e,"networkFeeCap","lamports"),"network-fee cap"),y(t.priorityFeeCapLamports,M(e,"priorityFeeCap","lamports"),"priority-fee cap")):(y(t.network,e.chain.id,"network"),y(t.parentId,e.collection,"collection/drop"),y(t.recipient,e.recipient,"recipient"),y(e.quantity,1,"Ordinals quantity"),y(t.postageSats,M(e,"mintValueCap","sats"),"mint-value cap"),y(t.maxTotalFeeSats,M(e,"networkFeeCap","sats"),"network-fee cap"),y(t.maxFeeRateSatVb,M(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function ii(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==be(e))&&_("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&_("custody-refused","leaf artifact is not strictly prepare-only")}function ai(e,t,n){y(t.chainId,e.chain.id,"network"),y(t.contract,e.collection,"collection/drop"),y(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity");let r=M(e,"mintValueCap","wei"),o=M(e,"networkFeeCap","wei"),i=M(e,"priorityFeeCap","wei-per-gas");y(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),y(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),y(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||_("artifact-mismatch","prepared EVM transaction is missing"),y(a.chainId,e.chain.id,"artifact network");let c=BigInt(a.gasLimit??0),s=BigInt(a.maxFeePerGas??0);(!c||!s||c*s>o)&&_("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(a.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&_("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),y(n.contract,e.collection,"artifact collection/drop"),y(n.recipient??n.buyer,e.recipient,"artifact recipient"),y(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&_("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(c*s).toString(),priorityFee:l.toString()}}function si(e,t,n){y(t.network,e.chain.id,"network"),y(t.collection??t.drop??t.identity,e.collection,"collection/drop"),y(t.recipientOwner??t.recipient,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity"),y(t.priceLamports,M(e,"mintValueCap","lamports"),"mint-value cap");let r=M(e,"networkFeeCap","lamports"),o=M(e,"priorityFeeCap","lamports");y(t.networkFeeCapLamports,r,"network-fee cap"),y(t.priorityFeeCapLamports,o,"priority-fee cap"),y(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let c of a.instructions)if(String(c.decoded?.type).toLowerCase().includes("price")){let s=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(s)*BigInt(c.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&_("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function ci(e,t,n){return y(t.network,e.chain.id,"network"),y(t.parentId,e.collection,"collection/drop"),y(t.recipient,e.recipient,"recipient"),y(e.quantity,1,"Ordinals quantity"),y(t.postageSats,M(e,"mintValueCap","sats"),"mint-value cap"),y(t.maxTotalFeeSats,M(e,"networkFeeCap","sats"),"network-fee cap"),y(t.maxFeeRateSatVb,M(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),y(n.plan.network,e.chain.id,"artifact network"),y(n.plan.parentId,e.collection,"artifact collection/drop"),y(n.plan.recipient,e.recipient,"artifact recipient"),y(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),y(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),y(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 Tn(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Sn})}async function ui(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Tn()}}async function vn(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&_("invalid-request","request must be a plain object");for(let u of Object.keys(e))Qo.has(u)||_("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&_("invalid-request","explicit adapterId is required; adapter inference is refused"),xn.has(e.adapterId)||_("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&_("invalid-request","family-specific decoded input is required"),An(n);let r;try{r=Me(e.intent)}catch(u){_("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||_("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&_("expired-intent","canonical mint intent has expired");let i=ri(r,e.adapterId);i[1]==="solana"&&_("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=ni(r,n,r.chain.family,o);oi(r,n);let c;try{i[4]==="evm"?c=await yt(i[5],n,t):i[4]==="opensea"?c=await bn(n,t):i[4]==="solana"?(y(n.programId,i[5],"selected Solana adapter program"),c=await wt(n,t)):c=await Ct(n,t)}catch(u){if(u instanceof Ne)throw u;_("adapter-refused",u?.message||"adapter preparation failed",u)}ii(c);let s=i[4]==="bitcoin"?ci(r,n,c):i[4]==="solana"?si(r,n,c):ai(r,n,c),l=Object.freeze({intentHash:ft(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 Z({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:c},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(c.expiresAt))})}var ha=vn,ya=vn,wa=Tn,ga=ui;export{Sn as UNIVERSAL_MINT_ADAPTERS,ma as UNIVERSAL_MINT_ROUTER_REGISTRY,Ne as UniversalMintRouterError,wa as getUniversalMintCapabilities,ga as getUniversalMintHealth,vn as prepareUniversalMint,ya as prepareUniversalMintAdmin,ha as prepareUniversalMintPublic,Tn as universalMintCapabilities,ui as universalMintHealth};
4
+ ${JSON.stringify(n??[])}`}async function an(e,t,n){return ye(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function sn(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>tn)throw new Error(`rpcBatch: at most ${tn} calls`);for(let i of t)rn(i?.method);let r=Oe(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,a)=>({jsonrpc:"2.0",id:a+1,method:i.method,params:i.params||[]}));try{let i=await an(r,o,n);if(Array.isArray(i)&&i.length===t.length){let a=new Map(i.map(c=>[Number(c?.id),c]));return t.map((c,s)=>on(a.get(s+1)??i[s]))}}catch{}return Promise.all(t.map(i=>J(e,i.method,i.params||[],n)))}async function J(e,t,n=[],r={}){let o=String(t||""),i=rn(o),a=Oe(e,r);if(!a)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=nn.get(a);if(u!=null)return u}let s=r.dedupe!==!1&&!r.signal?xo(a,o,n):null;if(s&&we.has(s))return we.get(s);let l=(async()=>{let u=await an(a,{jsonrpc:"2.0",id:1,method:t,params:n},r),p=on(u);return i==="eth_chainid"&&typeof p=="string"&&nn.set(a,p),p})();return s&&(we.set(s,l),l.finally(()=>{we.get(s)===l&&we.delete(s)}).catch(()=>{})),l}async function cn(e,t={}){let[n,r]=await sn(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:tt(e)?.name||null}}async function Ao(e,t={}){let n=await J(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function vo(e,t={}){let n=await J(e,"eth_chainId",[],t);return parseInt(n,16)}async function To(e,t={}){let n=await J(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Io(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await J(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Po(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ne(e.token||e.tokenAddress,"token"),o=ne(e.owner,"owner"),i=ne(e.spender,"spender"),a=Pe.encodeFunctionData("allowance",[o,i]),c=await J(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),s=Pe.decodeFunctionResult("allowance",c),l=BigInt(s[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Oo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ne(e.token||e.tokenAddress,"token"),o=ne(e.account||e.owner||e.address,"account"),i=Pe.encodeFunctionData("balanceOf",[o]),a=await J(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),c=Pe.decodeFunctionResult("balanceOf",a),s=BigInt(c[0]);return{chainId:n,token:r,account:o,balance:s.toString(),balanceHex:`0x${s.toString(16)}`,blockTag:e.blockTag||"latest"}}async function _o(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=bo(e.txHash||e.hash||e.transactionHash),o=await J(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=nt(o.status),a=i===1,c=i===1?"success":i===0?"reverted":"unknown",s=a?null:c==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?ne(e.expectedTo,"expectedTo"):null,u=o.to?ne(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,s=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:c,reason:s,statusCode:i,to:u,from:o.from?ne(o.from,"receipt.from"):null,blockNumber:nt(o.blockNumber),transactionIndex:nt(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Ro(e={}){let t=e.chainIds||Object.values(Ie).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Qt(r)&&!rt[r]&&!Oe(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await cn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Pe,rt,Eo,tn,we,nn,it=ue(()=>{Qe();en();Pe=new wo(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);rt={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com",1339:"https://rpc.elysiumchain.tech"};Eo=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;tn=32,we=new Map,nn=new Map});import{createHash as Xo}from"node:crypto";import{createHash as Cn,createHmac as $n,timingSafeEqual as di}from"node:crypto";var kn=2,ke=300*1e3,Fn=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function $e(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map($e).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${$e(e[n])}`).join(",")}}`}function pt(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function dt(e=process.env){return pt(process.env)||pt(e)}function Ln(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function be(e){let t=Ln(e);return Cn("sha256").update($e(t)).digest("hex")}function Mn(e,t=dt()){return t?$n("sha256",t).update(String(e)).digest("hex"):""}function Z(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let a=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(a&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let c={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:a?e.oraclePrepared:!0};if(!c.provider)throw new Error("stampPrepared: provider required");if(!c.kind)throw new Error("stampPrepared: kind required");let s=Number(o),l=i==null?s+ke:Number(i),u=l-s;if(!Number.isSafeInteger(s)||!Number.isSafeInteger(l)||u<=0||u>Fn)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...c,preparedAt:s,expiresAt:l,prepareVersion:kn},h=be(m),d=dt(r),E=d?Mn(h,d):void 0,w={...m,prepareHash:h};return E&&(w.prepareMac=E),w}import{createHash as Bn}from"node:crypto";var Hn=1,jn=8,H=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},qn=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),Dn=new Set(["family","id"]),Un=new Set(["id","startsAt","endsAt","eligibility"]),Gn=new Set(["kind","proofFormat","proofDigest"]),Wn=new Set(["amount","unit"]),zn=new Set(["value","unit"]);function le(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new H(`${t} must be a plain object`);return e}function pe(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new H(`${n} has unknown field ${r}`,"unknown-field")}function G(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new H(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function Vn(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new H(`${t} must be a positive safe integer`);return e}function Fe(e,t){if(e=le(e,t),pe(e,Wn,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new H(`${t} requires amount and unit`,"ambiguous-unit");let n=G(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new H(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:G(e.unit,`${t}.unit`)}}function Le(e,t){if(e=le(e,t),pe(e,zn,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new H(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function Yn(e,t){e=le(e,t),pe(e,Gn,t);let n=G(e.kind,`${t}.kind`),r=G(e.proofFormat,`${t}.proofFormat`),o=G(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new H(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function Kn(e,t){let n=`stages[${t}]`;e=le(e,n),pe(e,Un,n);let r=Le(e.startsAt,`${n}.startsAt`),o=Le(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new H(`${n} must end after it starts`,"invalid-stage-range");return{id:G(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:Yn(e.eligibility,`${n}.eligibility`)}}function Me(e){if(e=le(e,"input"),pe(e,qn,"input"),e.version!==Hn)throw new H("version must be 1");let t=le(e.chain,"chain");pe(t,Dn,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>jn)throw new H("stages must contain 1 through 8 entries","stage-count");let r=n.map(Kn).sort((a,c)=>a.startsAt.value-c.startsAt.value||a.id.localeCompare(c.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new H("stage ids must be unique","duplicate-stage");if(o.add(r[a].id),a&&r[a].startsAt.value<r[a-1].endsAt.value)throw new H("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new H("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:G(t.family,"chain.family"),id:G(t.id,"chain.id")},marketplace:G(e.marketplace,"marketplace"),mechanism:G(e.mechanism,"mechanism"),collection:G(e.collection,"collection"),recipient:G(e.recipient,"recipient"),quantity:Vn(e.quantity,"quantity"),stages:r,mintValueCap:Fe(e.mintValueCap,"mintValueCap"),networkFeeCap:Fe(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:Fe(e.priorityFeeCap,"priorityFeeCap"),expiry:Le(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new H("every stage must end no later than expiry","stage-after-expiry");return i}function Jn(e){return JSON.stringify(Me(e))}function ft(e){return`sha256:${Bn("sha256").update(Jn(e),"utf8").digest("hex")}`}var Be=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),oe=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),He=Object.freeze(Object.values(oe)),mt=new Set(He),ht=Object.freeze(He.slice(0,4)),Xn=He,Zn=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),j=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function Ee(e,t){if(!Array.isArray(e)||e.length===0)throw new j(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new j(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new j(`${t} contains duplicates`);return[...n].sort()}function Qn(e){if(!Array.isArray(e))throw new j("capabilities must be an array");let t=new Set(e);for(let n of t)if(!mt.has(n))throw new j(`unknown capability ${n}`,"unknown-capability");return Xn.every(n=>t.has(n))?Be.AUTOMINT_READY:ht.every(n=>t.has(n))?Be.PREPARE_READY:Be.RESEARCH_ONLY}function je(e=[]){if(!Array.isArray(e))throw new j("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new j("entry must be an object");for(let i of Object.keys(n))if(!Zn.has(i))throw new j(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new j("entry id must be an exact string");if(t.has(n.id))throw new j(`duplicate entry id ${n.id}`,"duplicate-entry");let r=Ee(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(Ee(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(Ee(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(Ee(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:Qn(r)});t.set(o.id,o)}return Object.freeze({entries:Object.freeze([...t.values()]),get(n){return t.get(n)||null},find({chainFamily:n,marketplace:r,mechanism:o}={}){return[...t.values()].filter(i=>i.chainFamilies.includes(n)&&i.marketplaces.includes(r)&&i.mechanisms.includes(o))},require(n,r=ht){let o=t.get(n);if(!o)throw new j(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!mt.has(i))throw new j(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new j(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var yi=je([]);import{getAddress as er,Interface as qe,keccak256 as tr}from"ethers";var Q=Object.freeze({manifold:new qe(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new qe(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new qe(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Ue=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"})}),Ei=Object.freeze(Object.fromEntries(Object.entries(Ue).map(([e,t])=>[Q[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function v(e){throw new Error(`evm-mint-launchpads: ${e}`)}function U(e,t){try{return er(String(e||""))}catch{return v(`invalid ${t}`)}}function q(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&v(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return v(`${t} must be an unsigned integer`)}}function De(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&v(`invalid ${t}`),e.map(String)}function nr(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&v("invalid chainId");let o=U(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&U(u.contract,"reviewed contract")===o);a||v("unsupported contract or wrong chain");let c=U(a.mintTarget||a.contract,"reviewed mint target"),s=Q[e].getFunction(Ue[e].signature).selector.toLowerCase();return(!(a.selectors||[s]).map(u=>String(u).toLowerCase()).includes(s)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&v("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:c,selector:s,review:a}}async function rr(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);v("runtime bytecode verification required")}function or(e,t){let n=e.stage;if(!n)return null;let r=q(n.startTime,"stage startTime"),o=q(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&v("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function ir(e,t){let n=Ue[e];String(t).slice(0,10).toLowerCase()!==Q[e].getFunction(n.signature).selector.toLowerCase()&&v("unknown selector");let r;try{r=Q[e].decodeFunctionData(n.signature,t)}catch{v("invalid calldata layout")}let o;return e==="manifold"&&(o=Q.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Q.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Q.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&v("calldata must be canonical with no suffix"),r}async function yt(e,t={},n={}){Q[e]||v("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=nr(e,t,n),c=U(t.recipient||t.minter,"recipient"),s=q(t.quantity,"quantity",{positive:!0}),l=q(t.priceWei,"priceWei"),u=q(t.maxValueWei,"maxValueWei"),p=q(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),m=t.transaction||t.tx;(!m||Number(m.chainId)!==r)&&v("transaction chain mismatch"),U(m.to,"transaction target")!==i&&v("transaction target mismatch");let h=await rr(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(h))||h==="0x"||tr(h).toLowerCase()!==String(a.codeHash).toLowerCase())&&v("runtime bytecode is not reviewed");let d=ir(e,m.data),E=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),w=or(t,E),x,k,A,g=null,B=[];if(e==="manifold")U(d[0],"calldata contract")!==o&&v("calldata contract mismatch"),(t.instanceId==null||q(d[1],"instanceId")!==q(t.instanceId,"instanceId"))&&v("instance/stage mismatch"),(t.mintIndex==null||q(d[2],"mintIndex")!==q(t.mintIndex,"mintIndex"))&&v("mint index/stage mismatch"),B=De([...d[3]]),x=U(d[4],"calldata recipient"),k=1n,A=l;else if(e==="zora")x=U(d[0],"calldata recipient"),k=BigInt(d[1]),A=l,t.comment!=null&&d[2]!==String(t.comment)&&v("comment mismatch"),t.mintReferral!=null&&U(d[3],"mint referral")!==U(t.mintReferral,"expected mint referral")&&v("mint referral mismatch");else{x=U(d[0],"calldata recipient"),k=BigInt(d[1]),A=BigInt(d[3]);let R=d[4];B=De([...R.proof]),g=BigInt(R.quantityLimitPerWallet),g<s&&v("wallet allowance below quantity"),(BigInt(R.pricePerToken)!==l||U(R.currency,"allowlist currency")!==U(d[2],"currency"))&&v("allowlist terms mismatch")}x!==c&&v("recipient mismatch"),k!==s&&v("quantity mismatch"),A!==l&&v("price mismatch"),t.proof!=null&&JSON.stringify(B.map(R=>R.toLowerCase()))!==JSON.stringify(De(t.proof).map(R=>R.toLowerCase()))&&v("proof mismatch");let F=q(m.value??0,"transaction value"),b=l*s;(F<b||F-b>p||F>u)&&v("transaction value or fee cap exceeded");let S=m.gasLimit==null?null:q(m.gasLimit,"gasLimit"),P=m.maxFeePerGas==null?null:q(m.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(S==null||S>q(t.maxGasLimit,"maxGasLimit"))&&v("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>q(t.maxFeePerGasWei,"maxFeePerGasWei"))&&v("gas fee cap exceeded"),Z({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:c,quantity:s.toString(),priceWei:l.toString(),valueWei:F.toString(),platformFeeWei:(F-b).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:p.toString(),...w?{stage:w}:{},...g==null?{}:{walletAllowance:g.toString()},proof:B,transaction:{chainId:r,to:i,data:m.data,value:F.toString(),...S==null?{}:{gasLimit:S.toString()},...P==null?{}:{maxFeePerGas:P.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var ar="RESEARCH_ONLY";var sr="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"}),xi=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function cr(){throw new Error(`solana-mint: ${ar}; disabled until ${sr}`)}function wt(){cr()}import{Address as ur,CompactSize as lr,NETWORK as pr,OutScript as Ot,Script as dr,TEST_NETWORK as gt,Transaction as fr,utils as mr}from"@scure/btc-signer";import{createHash as me}from"node:crypto";var bt="universal-ordinals-mint",Et="bitcoin-ordinals-mint-plan",hr=1800*1e3,yr=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),St=new Set,wr=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function W(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function ee(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`ordinals mint: ${t} must be an integer`);let o=BigInt(r);if(n?o<=0n:o<0n)throw new Error(`ordinals mint: ${t} must be ${n?"positive":"non-negative"}`);return o}function Ge(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 _t(e,t){let n=W(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 gr(e){return e==="bitcoin"||e==="mainnet"?pr:e==="regtest"?{...gt,bech32:"bcrt"}:gt}function xt(e,t){try{let n=Ot.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 br(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function Er(e){let t=me("sha256").update(e.unsignedTx).digest();return me("sha256").update(t).digest().reverse().toString("hex")}function At(e,...t){let n=me("sha256").update(e,"ascii").digest();return me("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function Sr(e,t,n,r){let o=Buffer.from(t||[]);if(o.length<1)throw new Error(`${r} has an empty tapLeafScript`);let i=o.subarray(0,-1),a=o.at(-1);if(n.type!=="tr")throw new Error(`${r} tapLeafScript requires a taproot prevout`);if(!e?.internalKey||!Array.isArray(e.merklePath))throw new Error(`${r} has malformed tapLeafScript control data`);let c=At("TapLeaf",Buffer.from([a]),Buffer.from(lr.encode(BigInt(i.length))),i);for(let u of e.merklePath){let p=Buffer.from(u);c=At("TapBranch",...Buffer.compare(c,p)<0?[c,p]:[p,c])}let[s,l]=mr.taprootTweakPubkey(e.internalKey,c);if(!Buffer.from(s).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==a)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function vt(e,t){let n=W(e,t);try{let r=Buffer.from(n,"base64");if(!r.length||r.toString("base64")!==n||r.subarray(0,5).toString("hex")!=="70736274ff")throw new Error("bad PSBT encoding or magic");let o=fr.fromPSBT(r);if(o.global?.unknown?.length||o.global?.proprietary?.length)throw new Error(`${t} contains opaque unknown/proprietary global fields`);let i=Array.from({length:o.inputsLength},(c,s)=>{let l=o.getInput(s);for(let m of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(br(l[m]))throw new Error(`${t} contains signed/finalized input ${s}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${s} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${s} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${s} requires witnessUtxo value and script`);let u=xt(l.witnessUtxo.script,`${t} input ${s} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${s} uses SIGHASH_DEFAULT for a non-taproot prevout`);let p=(l.tapLeafScript||[]).map(([m,h],d)=>Sr(m,h,u,`${t} input ${s} tapLeafScript ${d}`));return{txid:Buffer.from(l.txid).toString("hex"),vout:Number(l.index),sequence:Number(l.sequence),valueSats:BigInt(l.witnessUtxo.amount).toString(),scriptHex:Buffer.from(l.witnessUtxo.script).toString("hex"),sighashType:l.sighashType,tapLeafScripts:p}}),a=Array.from({length:o.outputsLength},(c,s)=>{let l=o.getOutput(s);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${s} contains opaque unknown/proprietary fields`);return xt(l.script,`${t} output ${s} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:Er(o),inputs:i,outputs:a,feeSats:o.fee.toString(),vsizeLowerBound:o.unsignedTx.length}}catch(r){throw new Error(`ordinals mint: invalid ${t}; decoded PSBT required (${r?.message||"decode failed"})`)}}function xr(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 Ar(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 vr=new Set([1,3]);function Tr(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=Ar(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!vr.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let c=r.get(i)||[];c.push(Buffer.from(a)),r.set(i,c)}if(e[n++]!==0)throw new Error("ordinals mint: malformed inscription envelope body separator");let o=[];for(;n<e.length&&e[n]!=="ENDIF";){if(!(e[n]instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope body");o.push(Buffer.from(e[n++]))}if(e[n]!=="ENDIF")throw new Error("ordinals mint: unterminated inscription envelope");return{fields:r,content:Buffer.concat(o)}}function Ir(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let p;try{p=dr.decode(u)}catch(m){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${m?.message||"script decode failed"})`)}for(let m=0;m+2<p.length;m+=1)p[m]===0&&p[m+1]==="IF"&&p[m+2]instanceof Uint8Array&&Buffer.from(p[m+2]).equals(Buffer.from("ord","ascii"))&&o.push(Tr(p,m))}if(o.length===0)throw new Error("ordinals mint: missing tapLeafScript inscription envelope");if(o.length!==1)throw new Error("ordinals mint: ambiguous tapLeafScript inscription envelope");let i=o[0],a=i.fields.get(1)||[];if(a.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let c;try{c=new TextDecoder("utf-8",{fatal:!0}).decode(a[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(c!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(me("sha256").update(i.content).digest("hex")!==t)throw new Error("ordinals mint: inscription envelope content SHA-256 does not match contentHash");let l=i.fields.get(3)||[];if(r!=null){if(l.length!==1||xr(l[0])!==r)throw new Error("ordinals mint: inscription envelope parent linkage does not match parentId")}else if(l.length!==0)throw new Error("ordinals mint: unexpected inscription envelope parent linkage")}function Tt(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 Pr(e){let t=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|signedPsbt|signedTransaction|rawTransaction|txHex)$/i,n=r=>{if(!(!r||typeof r!="object"))for(let[o,i]of Object.entries(r)){if(t.test(o))throw new Error(`ordinals mint: ${o} refused; private/signed material is outside this prepare-only adapter`);n(i)}};if(n(e),e.sign===!0||e.execute===!0||e.broadcast===!0||e.submit===!0)throw new Error("ordinals mint: sign/broadcast/execute refused; adapter is prepare-only")}function Rt(e,t="parentId"){let n=W(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 Nt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=W(e.txid,`commitInputs[${t}].txid`).toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`ordinals mint: commitInputs[${t}].txid must be 64 hex`);let r=Number(e.vout);if(!Number.isSafeInteger(r)||r<0||r>4294967295)throw new Error(`ordinals mint: commitInputs[${t}].vout invalid`);let o=ee(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,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 o=e.map((a,c)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${c} invalid`);return{role:W(a.role,`revealOutputs[${c}].role`),address:W(a.address,`revealOutputs[${c}].address`),valueSats:ee(a.valueSats??a.value,`revealOutputs[${c}].valueSats`).toString(),scriptHex:_t(a.scriptHex,`revealOutputs[${c}].scriptHex`),...a.parentId==null?{}:{parentId:Rt(a.parentId,`revealOutputs[${c}].parentId`)}}}),i=o.filter(a=>a.role==="inscription");if(i.length!==1)throw new Error("ordinals mint: exactly one inscription reveal output required");if(i[0].address!==t)throw new Error("ordinals mint: reveal destination mutation refused");if(i[0].valueSats!==r)throw new Error("ordinals mint: reveal postage does not match bound postageSats");if(i[0].parentId!==n)throw new Error("ordinals mint: missing or mutated parent linkage on inscription output");return o}function _r(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:W(n?.role,`commitOutputs[${r}].role`),valueSats:ee(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:_t(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 It(e,t,n){if(e.length!==t.length||e.some((r,o)=>r.valueSats!==t[o].valueSats||r.scriptHex!==t[o].scriptHex))throw new Error(`ordinals mint: actual ${n} outputs do not match reviewed outputs`)}function Pt(e,t,n){try{return Buffer.from(Ot.encode(ur(gr(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 Rr(e,t){let n=e.commitPsbtInputs??e.psbtInputs;if(n==null)return;if(!Array.isArray(n))throw new Error("ordinals mint: commitPsbtInputs must be an array");let r=n.map((i,a)=>Nt({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function Nr(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");Pr(e);for(let f of["content","contentBytes","body","file","path","url","contentUrl"])if(e[f]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let f of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[f]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=W(e.network,"network").toLowerCase();if(!yr.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=W(e.contentHash??e.contentSha256??e.sha256,"contentHash").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new Error("ordinals mint: contentHash must be a 32-byte SHA-256 hex digest");let o=W(e.contentType??e.mimeType,"contentType").toLowerCase();if(!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(o))throw new Error("ordinals mint: invalid contentType");let i=Rt(e.parentId??e.parentInscriptionId),a=W(e.recipient??e.destination,"recipient"),c=ee(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(Nt);if(new Set(s.map(f=>f.outpoint)).size!==s.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");Rr(e,s);let l=vt(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=vt(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),p=_r(e.commitOutputs),m=Or(e.revealOutputs,{recipient:a,parentId:i,postageSats:c});if(l.inputs.length!==s.length||l.inputs.some((f,O)=>f.txid!==s[O].txid||f.vout!==s[O].vout||f.valueSats!==s[O].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");It(l.outputs,p,"commit PSBT"),It(u.outputs,m,"reveal PSBT");let h=Pt(a,n,"recipient");if(m.find(f=>f.role==="inscription").scriptHex!==h)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[f,O]of m.entries())if(O.scriptHex!==Pt(O.address,n,`revealOutputs[${f}].address`))throw new Error(`ordinals mint: reveal output ${f} script does not pay its bound address`);let d=p.findIndex(f=>f.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let E=u.inputs.filter(f=>f.txid===l.txid&&f.vout===d);if(E.length!==1||E[0].valueSats!==p[d].valueSats||E[0].scriptHex!==p[d].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");Ir(u,{contentHash:r,contentType:o,parentId:i});let w=Ge(e.commitFeeRateSatVb,"commitFeeRateSatVb"),x=Ge(e.revealFeeRateSatVb,"revealFeeRateSatVb"),k=Ge(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(k<=0||w>k||x>k)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let A=ee(e.commitFeeSats,"commitFeeSats"),g=ee(e.revealFeeSats,"revealFeeSats"),B=ee(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(A+g>B)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==A.toString()||u.feeSats!==g.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(A)/l.vsizeLowerBound>w||Number(g)/u.vsizeLowerBound>x)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(f=>f.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let S=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:ee(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(S.enabled){if(!Number.isSafeInteger(S.outputIndex)||S.outputIndex<0||m[S.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(m[S.outputIndex].valueSats!==S.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(m.some(f=>f.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let P=Number(t.nowMs??Date.now()),R=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(R)||R<=P||R-P>hr)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:a,postageSats:c,commitInputs:l.inputs.map(Tt),commitPsbt:l.encoded,commitOutputs:p,revealInputs:u.inputs.map(Tt),revealPsbt:u.encoded,revealOutputs:m,commitRate:w,revealRate:x,maxRate:k,commitFee:A.toString(),revealFee:g.toString(),maxTotalFee:B.toString(),rbf:e.rbf,cpfp:S,expiresAt:R}}function Cr(e={},t={}){let n=Nr(e,t),r=n.commitInputs.find(c=>St.has(c.outpoint));if(r)throw new Error(`ordinals mint: commit UTXO ${r.outpoint} already reserved; reuse refused`);let o=Object.freeze({...t.feeConfig||e.feeConfiguration||{}}),i={provider:bt,kind:Et,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...wr},feeConfiguration:o,plan:{version:1,network:n.network,content:{sha256:n.contentHash,type:n.contentType,mutable:!1},parentId:n.parentId,recipient:n.recipient,postageSats:n.postageSats,commit:{unsignedPsbt:n.commitPsbt,inputs:n.commitInputs,outputs:n.commitOutputs,feeRateSatVb:n.commitRate,feeSats:n.commitFee,rbf:n.rbf},reveal:{unsignedPsbt:n.revealPsbt,inputs:n.revealInputs,outputs:n.revealOutputs,feeRateSatVb:n.revealRate,feeSats:n.revealFee,cpfp:n.cpfp},caps:{maxFeeRateSatVb:n.maxRate,maxTotalFeeSats:n.maxTotalFee},expiresAt:n.expiresAt,maxExecutions:1},note:"Unsigned commit/reveal PSBT plan only. Sign and broadcast in a user-controlled Bitcoin wallet; inscription numbers are not stable before confirmation."},a=Z(i,{provider:bt,kind:Et,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let c of n.commitInputs)St.add(c.outpoint);return a}var Ct=Cr;Qe();import{readFileSync as No,existsSync as Co}from"node:fs";import{getAddress as $o,Interface as Re,TypedDataEncoder as Ki,parseUnits as Ji}from"ethers";var Wt="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Vt({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let a=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(a===String(t).replace(/\/$/,""))return{baseUrl:a,trusted:!0,host:zt(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([zt(t),...n]).has(s)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(s);return c.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:s,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:s}}if(String(process.env[Wt]||"")==="1")return{baseUrl:a,trusted:!1,host:s};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${s} (set ${Wt}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:s}}function zt(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Yt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var fo=/^(0|[1-9][0-9]*)$/,et=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function se(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!fo.test(i))throw new Error(`${t} must be an integer wei string`);o=BigInt(i)}}else throw new Error(`${t} must be bigint, number, or integer string`);if(o<0n||!r&&o===0n)throw new Error(`${t} must be ${r?"non-negative":"positive"}`);return o}function mo(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function ho(e={}){return e.maxFeePerGas!=null?se(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?se(e.gasPrice,"gasPrice"):null}function yo(e={}){try{let t=mo(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=se(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=se(n.gasLimit??n.gas,"gasLimit"),c=ho(n);if(c==null)throw new Error("maxFeePerGas or gasPrice required");let s=se(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=se(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:se(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),p=a*c;return p>i?{ok:!1,status:"BLOCK",reason:`total gas ${p} exceeds cap ${i}`,chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:s!=null&&c>s?{ok:!1,status:"BLOCK",reason:`unit fee ${c} exceeds cap ${s}`,chainId:t,unitFeeWei:c.toString(),maxFeePerGasWei:s.toString(),totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:p.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:p.toString(),maxTotalGasWei:i.toString(),unitFeeWei:c.toString(),maxFeePerGasWei:s?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function Kt(e={}){let t=yo(e);if(!t.ok)throw new et(t);return t}var ko="https://api.opensea.io/api/v2",Fo="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)",Lo=new Re([`function ${Fo}`]),_e=new Re(["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"]),Mo=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"]),ta=new Set(Mo);function Bo(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Co(e))return"";try{for(let t of No(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 at(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||Bo()}function pn(e={}){return Vt({provider:"opensea",defaultUrl:ko,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function dn(e={}){return pn(e).baseUrl}function fn(e={}){return Yt({accept:"application/json"},{"x-api-key":at(e)},pn(e).trusted)}function X(e,t="address"){try{return $o(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}async function Ho(e,t={}){if(!e)throw new Error("collection slug required");if(!at(t))throw new Error("OPENSEA_API_KEY required");return ye(`${dn(t)}/collections/${encodeURIComponent(e)}`,{headers:fn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var jo=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});function qo(e){let t=String(e||"").trim().toLowerCase(),n=jo[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function un(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`opensea: ${t} must be an unsigned integer`);let o=BigInt(r);if(n&&o<=0n)throw new Error(`opensea: ${t} must be positive`);return o}function Do(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 Uo(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 Go(e,t,n="listing expiry"){let r=e==null?"":String(e).trim(),o;if(/^\d+$/.test(r)){let i=Number(r);o=r.length<=10?i*1e3:i}else o=Date.parse(r);if(!r||!Number.isFinite(o))throw new Error(`opensea: ${n} missing or invalid`);if(o<=t)throw new Error(`opensea: ${n} is expired or stale`);return new Date(o).toISOString()}var na=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 Wo(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 mn(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"&&mn(n))}function hn(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function yn(e){return!e||typeof e!="object"?!1:hn(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&yn(t))}function wn(e,t=[],n=new Set){if(!e||typeof e!="object"||n.has(e))return t;n.add(e),e.transaction&&typeof e.transaction=="object"?t.push(e.transaction):e.tx&&typeof e.tx=="object"&&t.push(e.tx);for(let[r,o]of Object.entries(e))(r==="transaction"||r==="tx")&&o&&typeof o=="object"||o&&typeof o=="object"&&wn(o,t,n);return t}function ln(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function zo(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(hn(e))throw new Error("opensea: signed transaction material refused");if((e.from?X(ln(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=X(ln(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,c=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&c){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=Lo.encodeFunctionData("fulfillAdvancedOrder",[c.advancedOrder,c.criteriaResolvers,c.fulfillerConduitKey,c.recipient])}let s=String(a??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(s))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");s.endsWith(l.slice(2))||(s+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let p=Do(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:s,value:p.hex,chainId:n,valueWei:p.amount}}function gn(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 Vo(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Gt(e,4,async s=>{let{chainId:l,...u}=gn(s);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,d]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(d).toString()}let{rpcCall:p}=await Promise.resolve().then(()=>(it(),ot)),m={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,h]=await Promise.all([p(t,"eth_call",[u,"pending"],m),p(t,"eth_estimateGas",[u],m)]);return BigInt(h).toString()}),a=null,c=null;if(r&&typeof r.getFeeData=="function"){let s=await r.getFeeData();c=s?.maxPriorityFeePerGas==null?0n:BigInt(s.maxPriorityFeePerGas),a=s?.maxFeePerGas==null?s?.gasPrice==null?null:BigInt(s.gasPrice):BigInt(s.maxFeePerGas)}else if(o){let{rpcCall:s}=await Promise.resolve().then(()=>(it(),ot)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await s(t,"eth_gasPrice",[],l));try{c=BigInt(await s(t,"eth_maxPriorityFeePerGas",[],l))}catch{c=0n}let p=await s(t,"eth_getBlockByNumber",["pending",!1],l),h=(p?.baseFeePerGas==null?0n:BigInt(p.baseFeePerGas))*2n+c;a=u>h?u:h}return a!=null&&c!=null&&e.forEach((s,l)=>{let p=(BigInt(i[l])*120n+99n)/100n;s.gasLimit=p.toString(),s.maxPriorityFeePerGas=c.toString(),s.maxFeePerGas=a.toString(),s.worstCaseFeeWei=(p*a).toString()}),{simulated:!0,gasEstimates:i}}function Yo(e,t){if(mn(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(yn(e))throw new Error("opensea: signed transaction material refused");let n=wn(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=>zo(r,t))}function Ko(e,t,n={}){return Z({...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 Jo(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=X(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function bn(e={},t={}){if(!at(t))throw new Error("OPENSEA_API_KEY required");Wo(e);let{chain:n,chainId:r}=qo(e.chain),o=X(e.buyer||e.minter||e.address,"buyer"),i=X(e.contract,"NFT contract"),a=Uo(e.quantity),c=un(e.priceWei,"priceWei"),s=un(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Go(e.expiry,l,"mint expiry");if(e.tokenId!=null)throw new Error("opensea: SeaDrop mint tokenId is unknown until the mined receipt and must not be caller supplied");let p=String(e.slug||"").trim();if(!p)throw new Error("opensea: collection slug required");let m=await Ho(p,t),h=Jo(m,n,i),d=c*BigInt(a);if(d>s)throw new Error("opensea: mint total exceeds total cap");let E=await ye(`${dn(t)}/drops/${encodeURIComponent(p)}/mint`,{method:"POST",headers:fn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),w=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,x=Array.isArray(w)?w:w?[w]:[];if(!x.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let k=new Set(x.map(C=>X(C,"SeaDrop mint target"))),A=Yo(E,{buyer:o,chainId:r,targets:k});if(A.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let g,B,F=null,b;try{g=_e.decodeFunctionData("mintPublic",A[0].data),B="public",b=_e.encodeFunctionData("mintPublic",[g[0],g[1],g[2],g[3]])}catch{try{g=_e.decodeFunctionData("mintAllowList",A[0].data),B="allowlist";let C=g[4],L=[...g[5]].map(String);if(L.length<1||L.length>64||L.some(T=>!/^0x[0-9a-fA-F]{64}$/.test(T)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let z=BigInt(C.startTime),N=BigInt(C.endTime),I=BigInt(Math.floor(l/1e3));if(z>I||N<=I)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(C.mintPrice)!==c)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(C.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");b=_e.encodeFunctionData("mintAllowList",[g[0],g[1],g[2],g[3],C,L]),F={mintPrice:BigInt(C.mintPrice).toString(),maxTotalMintableByWallet:BigInt(C.maxTotalMintableByWallet).toString(),startTime:z.toString(),endTime:N.toString(),dropStageIndex:BigInt(C.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(C.maxTokenSupplyForStage).toString(),feeBps:Number(C.feeBps),restrictFeeRecipients:!!C.restrictFeeRecipients,proof:L}}catch(C){throw/opensea:/.test(String(C?.message||""))?C:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let S=X(g[0],"mint NFT contract"),P=X(g[1],"mint fee recipient"),R=X(g[2],"mint recipient");if(S!==h)throw new Error("opensea: mint calldata collection mismatch");if(R!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(g[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(b.toLowerCase()!==A[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let f=A.reduce((C,L)=>C+L.valueWei,0n);if(f!==d)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(f>s)throw new Error("opensea: mint total exceeds total cap");let O=await Vo(A,r,{...t,provider:e.provider||t.provider});if(O.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let re=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},D=Kt({chainId:r,tx:A[0],policy:re});return Ko({action:"mint",mintType:B,...F?{stage:F}:{},chain:n,chainId:r,slug:p,buyer:o,contract:h,quantity:a,priceWei:c.toString(),totalWei:f.toString(),maxTotalWei:s.toString(),mintTarget:A[0].to,feeRecipient:P,expiry:u,transactions:A.map(gn),gasWar:D,...O},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+ke,Date.parse(u),F?Number(BigInt(F.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}var ra=new Re(["function setApprovalForAll(address operator,bool approved)"]),oa=new Re(["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 Zo=Object.freeze([oe.DISCOVERY,oe.ELIGIBILITY,oe.PREPARATION,oe.SIMULATION]),En=[["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]],Sn=Object.freeze(En.map(([e,t,n,r])=>Object.freeze({id:e,family:t,chainFamilies:Object.freeze([t]),marketplaces:Object.freeze(n),mechanisms:Object.freeze(r),enabled:t!=="solana",capabilities:t==="solana"?Object.freeze([oe.DISCOVERY]):Zo,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),ma=je(Sn.map(({family:e,tier:t,enabled:n,...r})=>r)),xn=new Map(En.map(e=>[e[0],e])),Qo=new Set(["intent","adapterId","input"]),ei=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Ne=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function _(e,t,n){throw new Ne(e,t,n?{cause:n}:{})}function y(e,t,n){String(e??"")!==String(t)&&_("intent-mismatch",`${n} does not match canonical intent`)}function M(e,t,n){let r=e[t];return r.unit!==n&&_("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function An(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))ei.test(n)&&_("custody-refused",`${t}.${n} is outside the prepare-only boundary`),An(r,`${t}.${n}`)}function ti(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function ni(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&_("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(s=>s.id===t.stageId);o||_("intent-mismatch","stageId does not match canonical intent"),y(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${Xo("sha256").update(JSON.stringify(ti(n,t))).digest("hex")}`;y(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),c=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(a)||!Number.isSafeInteger(c))&&_("invalid-request","decoded input requires exact stage bounds"),y(a,o.startsAt.value,"stage start"),y(c,o.endsAt.value,"stage end"),(r<a||r>=c)&&_("expired-intent","canonical mint stage is not active at authoritative now"),o}function ri(e,t){let n=xn.get(t);n||_("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return y(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&_("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function oi(e,t){e.chain.family==="evm"?(y(t.chainId,e.chain.id,"network"),y(t.contract,e.collection,"collection/drop"),y(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity"),y(t.maxValueWei??t.maxTotalWei,M(e,"mintValueCap","wei"),"mint-value cap"),y(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,M(e,"networkFeeCap","wei"),"network-fee cap"),y(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,M(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(y(t.network,e.chain.id,"network"),y(t.collection??t.drop??t.identity,e.collection,"collection/drop"),y(t.recipientOwner??t.recipient,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity"),y(t.priceLamports,M(e,"mintValueCap","lamports"),"mint-value cap"),y(t.networkFeeCapLamports,M(e,"networkFeeCap","lamports"),"network-fee cap"),y(t.priorityFeeCapLamports,M(e,"priorityFeeCap","lamports"),"priority-fee cap")):(y(t.network,e.chain.id,"network"),y(t.parentId,e.collection,"collection/drop"),y(t.recipient,e.recipient,"recipient"),y(e.quantity,1,"Ordinals quantity"),y(t.postageSats,M(e,"mintValueCap","sats"),"mint-value cap"),y(t.maxTotalFeeSats,M(e,"networkFeeCap","sats"),"network-fee cap"),y(t.maxFeeRateSatVb,M(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function ii(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==be(e))&&_("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&_("custody-refused","leaf artifact is not strictly prepare-only")}function ai(e,t,n){y(t.chainId,e.chain.id,"network"),y(t.contract,e.collection,"collection/drop"),y(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity");let r=M(e,"mintValueCap","wei"),o=M(e,"networkFeeCap","wei"),i=M(e,"priorityFeeCap","wei-per-gas");y(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),y(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),y(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||_("artifact-mismatch","prepared EVM transaction is missing"),y(a.chainId,e.chain.id,"artifact network");let c=BigInt(a.gasLimit??0),s=BigInt(a.maxFeePerGas??0);(!c||!s||c*s>o)&&_("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(a.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&_("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),y(n.contract,e.collection,"artifact collection/drop"),y(n.recipient??n.buyer,e.recipient,"artifact recipient"),y(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&_("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(c*s).toString(),priorityFee:l.toString()}}function si(e,t,n){y(t.network,e.chain.id,"network"),y(t.collection??t.drop??t.identity,e.collection,"collection/drop"),y(t.recipientOwner??t.recipient,e.recipient,"recipient"),y(t.quantity,e.quantity,"quantity"),y(t.priceLamports,M(e,"mintValueCap","lamports"),"mint-value cap");let r=M(e,"networkFeeCap","lamports"),o=M(e,"priorityFeeCap","lamports");y(t.networkFeeCapLamports,r,"network-fee cap"),y(t.priorityFeeCapLamports,o,"priority-fee cap"),y(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let c of a.instructions)if(String(c.decoded?.type).toLowerCase().includes("price")){let s=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(s)*BigInt(c.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&_("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function ci(e,t,n){return y(t.network,e.chain.id,"network"),y(t.parentId,e.collection,"collection/drop"),y(t.recipient,e.recipient,"recipient"),y(e.quantity,1,"Ordinals quantity"),y(t.postageSats,M(e,"mintValueCap","sats"),"mint-value cap"),y(t.maxTotalFeeSats,M(e,"networkFeeCap","sats"),"network-fee cap"),y(t.maxFeeRateSatVb,M(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),y(n.plan.network,e.chain.id,"artifact network"),y(n.plan.parentId,e.collection,"artifact collection/drop"),y(n.plan.recipient,e.recipient,"artifact recipient"),y(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),y(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),y(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 vn(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Sn})}async function ui(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:vn()}}async function Tn(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&_("invalid-request","request must be a plain object");for(let u of Object.keys(e))Qo.has(u)||_("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&_("invalid-request","explicit adapterId is required; adapter inference is refused"),xn.has(e.adapterId)||_("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&_("invalid-request","family-specific decoded input is required"),An(n);let r;try{r=Me(e.intent)}catch(u){_("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||_("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&_("expired-intent","canonical mint intent has expired");let i=ri(r,e.adapterId);i[1]==="solana"&&_("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=ni(r,n,r.chain.family,o);oi(r,n);let c;try{i[4]==="evm"?c=await yt(i[5],n,t):i[4]==="opensea"?c=await bn(n,t):i[4]==="solana"?(y(n.programId,i[5],"selected Solana adapter program"),c=await wt(n,t)):c=await Ct(n,t)}catch(u){if(u instanceof Ne)throw u;_("adapter-refused",u?.message||"adapter preparation failed",u)}ii(c);let s=i[4]==="bitcoin"?ci(r,n,c):i[4]==="solana"?si(r,n,c):ai(r,n,c),l=Object.freeze({intentHash:ft(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 Z({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:c},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(c.expiresAt))})}var ha=Tn,ya=Tn,wa=vn,ga=ui;export{Sn as UNIVERSAL_MINT_ADAPTERS,ma as UNIVERSAL_MINT_ROUTER_REGISTRY,Ne as UniversalMintRouterError,wa as getUniversalMintCapabilities,ga as getUniversalMintHealth,Tn as prepareUniversalMint,ya as prepareUniversalMintAdmin,ha as prepareUniversalMintPublic,vn as universalMintCapabilities,ui as universalMintHealth};