{
  "version": 3,
  "sources": ["../src/util.js", "../src/x402-modal.js"],
  "sourcesContent": ["// Pure, browser-API-free helpers shared by the modal. Kept in their own module\n// so they can be unit-tested in Node without a DOM, and so the core stays lean.\n\n// USDC EIP-3009 typed-data sig works against Base USDC. The domain `version`\n// must match the on-chain `EIP712_DOMAIN_SEPARATOR_VERSION` \u2014 Base USDC is \"2\".\nexport const EVM_NETWORKS = {\n\t'eip155:8453': { chainId: 8453, name: 'Base', explorer: 'https://basescan.org/tx/' },\n\t'eip155:84532': { chainId: 84532, name: 'Base Sepolia', explorer: 'https://sepolia.basescan.org/tx/' },\n\t'eip155:42161': { chainId: 42161, name: 'Arbitrum', explorer: 'https://arbiscan.io/tx/' },\n\t'eip155:10': { chainId: 10, name: 'Optimism', explorer: 'https://optimistic.etherscan.io/tx/' },\n};\n\n// Stablecoins whose atomics are already 6-decimal USD-pegged (used by caps).\nexport const STABLE_NAMES = new Set([\n\t'usdc', 'usd coin', 'usdt', 'tether', 'binance-peg usd coin', 'dai',\n]);\n\n// Normalize a single 402 `accept` entry. The x402 spec's canonical atomic-price\n// field is `maxAmountRequired`; some merchants emit `amount`. We read `amount`\n// everywhere downstream, so coerce here once. Without this a spec-compliant\n// merchant yields `accept.amount === undefined` \u2192 \"NaN USDC\".\nexport function normalizeAccept(accept) {\n\tif (!accept || typeof accept !== 'object') return accept;\n\tconst amount = accept.amount ?? accept.maxAmountRequired;\n\treturn amount != null && accept.amount == null ? { ...accept, amount: String(amount) } : accept;\n}\n\nexport function isSolanaNetwork(net) {\n\treturn typeof net === 'string' && (net === 'solana' || net.startsWith('solana:'));\n}\nexport function isEvmNetwork(net) {\n\treturn typeof net === 'string' && net.startsWith('eip155:');\n}\n// The modal only signs EIP-3009 transferWithAuthorization for EVM. When the\n// server publishes both an EIP-3009 entry and a Permit2 sibling (the\n// gas-sponsoring path), pick the EIP-3009 one \u2014 the sibling carries\n// `extra.assetTransferMethod === 'permit2'`.\nexport function isEip3009Accept(accept) {\n\tif (!isEvmNetwork(accept?.network)) return false;\n\tconst method = accept?.extra?.assetTransferMethod;\n\treturn !method || method === 'eip3009';\n}\nexport function networkLabel(net, accept) {\n\tif (isSolanaNetwork(net)) return 'Solana';\n\tconst meta = EVM_NETWORKS[net];\n\treturn meta?.name || accept?.extra?.name || net;\n}\nexport function explorerUrl(net, tx) {\n\tif (!tx) return null;\n\tif (isSolanaNetwork(net)) return `https://solscan.io/tx/${tx}`;\n\tconst meta = EVM_NETWORKS[net];\n\treturn meta ? `${meta.explorer}${tx}` : null;\n}\n\nexport function formatAmount(rawAtomics, decimals = 6) {\n\tconst n = Number(rawAtomics) / 10 ** decimals;\n\tif (n < 0.01) return n.toFixed(6).replace(/0+$/, '').replace(/\\.$/, '');\n\tif (n < 1) return n.toFixed(4).replace(/0+$/, '').replace(/\\.$/, '');\n\treturn n.toFixed(2);\n}\n\nexport function b64encode(obj) {\n\tconst json = JSON.stringify(obj);\n\tif (typeof Buffer !== 'undefined') return Buffer.from(json, 'utf8').toString('base64');\n\treturn btoa(unescape(encodeURIComponent(json)));\n}\nexport function b64decode(str) {\n\tif (!str) return null;\n\ttry {\n\t\tconst bin = typeof Buffer !== 'undefined' ? Buffer.from(str, 'base64').toString('utf8') : decodeURIComponent(escape(atob(str)));\n\t\treturn JSON.parse(bin);\n\t} catch (_) {\n\t\treturn null;\n\t}\n}\n\n// Base58 (Bitcoin alphabet) \u2014 Solana's encoding for addresses and signatures.\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nexport function base58encode(bytes) {\n\tif (!bytes || bytes.length === 0) return '';\n\tlet leadingZeros = 0;\n\twhile (leadingZeros < bytes.length && bytes[leadingZeros] === 0) leadingZeros++;\n\tlet n = 0n;\n\tfor (let i = 0; i < bytes.length; i++) n = (n << 8n) | BigInt(bytes[i]);\n\tlet out = '';\n\twhile (n > 0n) {\n\t\tout = BASE58_ALPHABET[Number(n % 58n)] + out;\n\t\tn /= 58n;\n\t}\n\tfor (let i = 0; i < leadingZeros; i++) out = BASE58_ALPHABET[0] + out;\n\treturn out;\n}\n\n// Convert an asset's atomic amount to micro-USD for cap accounting. Stablecoins\n// pass through (scaled to 6 decimals); non-stable assets pass through atomic and\n// must be capped server-side (the browser modal fetches no prices).\nexport function toMicroUsd(amount, accept) {\n\tconst atomic = BigInt(amount);\n\tconst decimals = Number(accept?.extra?.decimals ?? 6);\n\tconst name = String(accept?.extra?.name || '').toLowerCase();\n\tif (STABLE_NAMES.has(name)) {\n\t\tif (decimals === 6) return atomic;\n\t\tif (decimals > 6) return atomic / 10n ** BigInt(decimals - 6);\n\t\treturn atomic * 10n ** BigInt(6 - decimals);\n\t}\n\treturn atomic;\n}\n\nexport function spendBuckets(timestamp = Date.now()) {\n\tconst hour = Math.floor(timestamp / 3_600_000);\n\tconst day = Math.floor(timestamp / 86_400_000);\n\treturn { hour, day };\n}\n\n// Build the CAIP-122 SIWX message string. The server rebuilds the same string\n// from payload fields when verifying \u2014 any line-by-line drift makes the\n// recovered signer mismatch payload.address and the signature is rejected.\nexport function buildSiwxMessage(info, chain, address) {\n\tconst isEvm = chain.type === 'eip191';\n\tconst accountHeader = isEvm\n\t\t? `${info.domain} wants you to sign in with your Ethereum account:`\n\t\t: `${info.domain} wants you to sign in with your Solana account:`;\n\tconst [, chainTail = ''] = String(chain.chainId).split(':');\n\tconst chainRef = isEvm ? String(parseInt(chainTail, 10)) : chainTail;\n\n\tconst lines = [accountHeader, address, ''];\n\tif (info.statement) {\n\t\tlines.push(info.statement, '');\n\t} else if (isEvm) {\n\t\t// siwe's prepareMessage() reserves the statement block even when absent,\n\t\t// emitting an extra blank line. SIWS does not.\n\t\tlines.push('');\n\t}\n\tlines.push(`URI: ${info.uri}`);\n\tlines.push(`Version: ${info.version || '1'}`);\n\tlines.push(`Chain ID: ${chainRef}`);\n\tlines.push(`Nonce: ${info.nonce}`);\n\tlines.push(`Issued At: ${info.issuedAt}`);\n\tif (info.expirationTime) lines.push(`Expiration Time: ${info.expirationTime}`);\n\tif (info.notBefore) lines.push(`Not Before: ${info.notBefore}`);\n\tif (info.requestId !== undefined && info.requestId !== null) lines.push(`Request ID: ${info.requestId}`);\n\tif (Array.isArray(info.resources) && info.resources.length) {\n\t\tlines.push('Resources:');\n\t\tfor (const r of info.resources) lines.push(`- ${r}`);\n\t}\n\treturn lines.join('\\n');\n}\n", "// @three-ws/x402-modal \u2014 a drop-in payment modal for any x402 paid endpoint.\n//\n// This is the canonical, side-effect-free core. It exports the public API\n// (`pay`, `init`, `configure`, `getConfig`, `version`, `CheckoutModal`, and the\n// declarative helpers `bindElement` / `readOptsFrom`) but does NOT touch\n// `window` or auto-bind anything on import \u2014 that lives in `global.js`, which is\n// what the CDN <script> build ships.\n//\n// Bundler / npm usage:\n//\n//   import { pay, configure } from '@three-ws/x402-modal';\n//   const out = await pay({ endpoint: '/api/paid/summarize', body: { text: 'hi' } });\n//\n// Drop-in <script> usage (the global build auto-binds `data-x402-endpoint`):\n//\n//   <script type=\"module\" src=\"https://unpkg.com/@three-ws/x402-modal/global\"></script>\n//   <button data-x402-endpoint=\"/api/paid/summarize\" data-x402-method=\"POST\">Pay & run</button>\n//\n// The modal drives the full 402 \u2192 connect wallet \u2192 sign \u2192 retry \u2192 settle flow,\n// renders price/network/steps/receipt, and resolves with { ok, result, payment,\n// response }. Vanilla JS; the only network deps (Solana web3.js, a keccak for\n// EVM SIWX) are dynamic-imported from a CDN, and only when that path runs.\n\nimport {\n\tEVM_NETWORKS,\n\tnormalizeAccept,\n\tisSolanaNetwork,\n\tisEip3009Accept,\n\tnetworkLabel,\n\texplorerUrl,\n\tformatAmount,\n\tb64encode,\n\tb64decode,\n\tbase58encode,\n\ttoMicroUsd,\n\tspendBuckets,\n\tbuildSiwxMessage,\n} from './util.js';\n\nconst VERSION = '0.2.0';\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 configuration \u2500\u2500\u2500\n// Everything the host wants to brand or repoint lives here. The defaults are\n// vendor-neutral: no footer attribution and no builder-code echo until the host\n// opts in. A deployment supplies its own branding with `configure()` (global)\n// or per-call `pay({ ... })` options (which always win over the global config).\n\nconst DEFAULTS = {\n\t// Origin that serves the Solana `prepare` / `encode` checkout helpers\n\t// (POST {origin}/api/x402-checkout?action=prepare|encode). Only the Solana\n\t// payment path uses these \u2014 the EVM/EIP-3009 path is fully client-side and\n\t// needs no backend. `null` \u21D2 resolve from the script's own origin at runtime.\n\tapiOrigin: null,\n\t// Footer attribution shown at the bottom of the modal. `null` \u21D2 the footer\n\t// link is hidden until a host sets `{ label, href? }`.\n\tbrand: null,\n\t// ERC-8021 builder-code self-attribution echoed back when the 402 challenge\n\t// declares a builder code. `wallet` = your wallet code, `service` = your\n\t// integration code. `null` \u21D2 no self-attribution unless a host opts in.\n\tbuilderCode: null,\n\t// CDN modules dynamic-imported on demand. Override to self-host / satisfy a\n\t// strict Content-Security-Policy.\n\tsolanaWeb3Url: 'https://esm.sh/@solana/web3.js@1.95.3?bundle',\n\tnobleHashesUrl: 'https://esm.sh/@noble/hashes@1.4.0/sha3?bundle',\n};\n\nconst config = {\n\tapiOrigin: DEFAULTS.apiOrigin,\n\tbrand: DEFAULTS.brand ? { ...DEFAULTS.brand } : null,\n\tbuilderCode: DEFAULTS.builderCode ? { ...DEFAULTS.builderCode } : null,\n\tsolanaWeb3Url: DEFAULTS.solanaWeb3Url,\n\tnobleHashesUrl: DEFAULTS.nobleHashesUrl,\n};\n\n// Resolve the origin that hosts this script \u2014 used as the default API origin for\n// the Solana prepare/encode helpers. Falls back to the page origin.\nfunction resolveScriptOrigin() {\n\ttry {\n\t\tif (typeof document !== 'undefined') {\n\t\t\tconst current = document.currentScript;\n\t\t\tif (current?.src) return new URL(current.src).origin;\n\t\t\tconst found = document.querySelector('script[src*=\"x402\"]');\n\t\t\tif (found?.src) return new URL(found.src).origin;\n\t\t}\n\t} catch (_) {}\n\treturn typeof location !== 'undefined' ? location.origin : '';\n}\n\n// Merge user config in. `apiOrigin: ''` is honoured (same-origin); only\n// `undefined` keeps the default. Returns the resolved snapshot for inspection.\nexport function configure(opts = {}) {\n\tif (!opts || typeof opts !== 'object') return getConfig();\n\tif (opts.apiOrigin !== undefined) config.apiOrigin = opts.apiOrigin;\n\tif (opts.brand === null) config.brand = null;\n\telse if (opts.brand) config.brand = { ...(config.brand || {}), ...opts.brand };\n\tif (opts.builderCode === null) config.builderCode = null;\n\telse if (opts.builderCode) config.builderCode = { ...(config.builderCode || {}), ...opts.builderCode };\n\tif (opts.solanaWeb3Url) config.solanaWeb3Url = opts.solanaWeb3Url;\n\tif (opts.nobleHashesUrl) config.nobleHashesUrl = opts.nobleHashesUrl;\n\treturn getConfig();\n}\n\nexport function getConfig() {\n\treturn {\n\t\tapiOrigin: config.apiOrigin,\n\t\tbrand: config.brand ? { ...config.brand } : null,\n\t\tbuilderCode: config.builderCode ? { ...config.builderCode } : null,\n\t\tsolanaWeb3Url: config.solanaWeb3Url,\n\t\tnobleHashesUrl: config.nobleHashesUrl,\n\t};\n}\n\n// The effective API origin for a given pay() call: explicit per-call > global\n// config > lazily-resolved script origin (cached back into config).\nfunction apiOriginFor(opts) {\n\tif (opts && opts.apiOrigin !== undefined && opts.apiOrigin !== null) return opts.apiOrigin;\n\tif (config.apiOrigin !== null && config.apiOrigin !== undefined) return config.apiOrigin;\n\tconfig.apiOrigin = resolveScriptOrigin();\n\treturn config.apiOrigin;\n}\n\n// SIWX (\"Sign-In-With-X\" / CAIP-122) lets a wallet that has already paid for\n// an endpoint re-enter it by signing a challenge instead of paying again. The\n// server advertises support by including `extensions['sign-in-with-x']` in the\n// 402 body; clients submit signed proofs via the `SIGN-IN-WITH-X` header.\nconst SIWX_HEADER = 'SIGN-IN-WITH-X';\nconst SIWX_EXTENSION_KEY = 'sign-in-with-x';\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Spending caps \u2500\u2500\u2500\u2500\u2500\n// Persists per-wallet spend in localStorage so reload-survivable caps work in a\n// pure-browser context. Keys are bucketed by UTC hour and UTC day so the\n// sliding windows reset cleanly at midnight UTC for the daily case. Amounts are\n// stored as base-10 BigInt strings of micro-USD; stablecoin payments flow\n// through as-is since their atomics are already 6-decimal USD-pegged.\n\nconst SPEND_LS_PREFIX = 'x402.spend.';\n\nfunction spendKey(address, kind, bucket) {\n\treturn `${SPEND_LS_PREFIX}${kind}.${address.toLowerCase()}.${bucket}`;\n}\n\nfunction readSpend(address, kind, bucket) {\n\ttry {\n\t\tconst raw = localStorage.getItem(spendKey(address, kind, bucket));\n\t\tif (!raw) return 0n;\n\t\treturn BigInt(raw);\n\t} catch {\n\t\treturn 0n;\n\t}\n}\n\nfunction writeSpend(address, kind, bucket, value) {\n\ttry {\n\t\tlocalStorage.setItem(spendKey(address, kind, bucket), value.toString());\n\t} catch {\n\t\t// localStorage full / disabled \u2014 caps degrade to per-call only.\n\t}\n}\n\n// Check the configured caps and, if admitted, reserve the spend in localStorage.\n// Returns { abort, reason?, reservation? }. Reservation carries { address,\n// microUsd, buckets } so a failed payment can roll the reservation back.\nfunction browserEnforceCap({ accept, caps, address }) {\n\tif (!caps || !address) return { abort: false };\n\tconst microUsd = toMicroUsd(accept.amount, accept);\n\tconst maxPerCall = caps.maxPerCall != null ? BigInt(caps.maxPerCall) : null;\n\tconst maxPerHour = caps.maxPerHour != null ? BigInt(caps.maxPerHour) : null;\n\tconst maxPerDay = caps.maxPerDay != null ? BigInt(caps.maxPerDay) : null;\n\tif (maxPerCall != null && microUsd > maxPerCall) {\n\t\treturn { abort: true, reason: `Per-call cap exceeded (${microUsd} > ${maxPerCall} \u00B5USD)` };\n\t}\n\tconst buckets = spendBuckets();\n\tconst hourTotal = readSpend(address, 'hr', buckets.hour) + microUsd;\n\tconst dayTotal = readSpend(address, 'day', buckets.day) + microUsd;\n\tif (maxPerHour != null && hourTotal > maxPerHour) {\n\t\treturn { abort: true, reason: `Hourly cap exceeded (${hourTotal} > ${maxPerHour} \u00B5USD)` };\n\t}\n\tif (maxPerDay != null && dayTotal > maxPerDay) {\n\t\treturn { abort: true, reason: `Daily cap exceeded (${dayTotal} > ${maxPerDay} \u00B5USD)` };\n\t}\n\twriteSpend(address, 'hr', buckets.hour, hourTotal);\n\twriteSpend(address, 'day', buckets.day, dayTotal);\n\treturn { abort: false, reservation: { address, microUsd, buckets } };\n}\n\nfunction browserRollbackReservation(reservation) {\n\tif (!reservation) return;\n\tconst { address, microUsd, buckets } = reservation;\n\tconst hourCurrent = readSpend(address, 'hr', buckets.hour);\n\tconst dayCurrent = readSpend(address, 'day', buckets.day);\n\tconst hourNext = hourCurrent - microUsd;\n\tconst dayNext = dayCurrent - microUsd;\n\twriteSpend(address, 'hr', buckets.hour, hourNext < 0n ? 0n : hourNext);\n\twriteSpend(address, 'day', buckets.day, dayNext < 0n ? 0n : dayNext);\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 ERC-8021 builder-code echo \u2500\u2500\u2500\u2500\n// The server enforces that any client-echoed builder-code `a` matches what the\n// 402 challenge declared (anti-tamper). We self-attribute `w` (wallet) and `s`\n// (service) from config; both are validated against the strict code pattern.\n\nconst BUILDER_CODE_KEY = 'builder-code';\nconst BUILDER_CODE_PATTERN = /^[a-z0-9_]{1,32}$/;\n\nfunction buildBuilderCodeEcho(challenge) {\n\tconst codes = config.builderCode;\n\tif (!codes) return null;\n\tconst ext = challenge?.extensions?.[BUILDER_CODE_KEY];\n\tconst declaredA = ext?.info?.a;\n\tif (!declaredA || !BUILDER_CODE_PATTERN.test(declaredA)) return null;\n\tconst out = { a: declaredA };\n\tif (codes.service && BUILDER_CODE_PATTERN.test(codes.service)) out.s = [codes.service];\n\tif (codes.wallet && BUILDER_CODE_PATTERN.test(codes.wallet)) out.w = codes.wallet;\n\treturn out;\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 SIWX helpers \u2500\u2500\u2500\u2500\n\nfunction extractSiwxExtension(body) {\n\tconst ext = body?.extensions?.[SIWX_EXTENSION_KEY];\n\tif (!ext || !ext.info || !Array.isArray(ext.supportedChains) || !ext.supportedChains.length) return null;\n\treturn ext;\n}\n\n// Returns { chain, kind: 'evm' | 'solana' } or null. `chain` is the matching\n// entry from `ext.supportedChains` whose signature type matches the wallet kind.\nfunction pickSiwxChain(ext, walletKind) {\n\tfor (const chain of ext.supportedChains) {\n\t\tif (walletKind === 'evm' && chain.type === 'eip191') return { chain, kind: 'evm' };\n\t\tif (walletKind === 'solana' && chain.type === 'ed25519') return { chain, kind: 'solana' };\n\t}\n\treturn null;\n}\n\n// Base64-encoded JSON per x402 v2 spec. CAIP-122 fields are all ASCII/Latin-1,\n// so the unescape+encodeURIComponent dance matches what btoa expects.\nfunction encodeSiwxHeaderValue(payload) {\n\tconst json = JSON.stringify(payload);\n\tif (typeof Buffer !== 'undefined') return Buffer.from(json, 'utf8').toString('base64');\n\treturn btoa(unescape(encodeURIComponent(json)));\n}\n\n// EIP-55 checksum the address before signing. MetaMask returns lowercase\n// addresses, but the server rebuilds the SIWE message with a checksummed\n// address. If we sign a lowercase-address message and send the lowercase\n// address in the payload, the recovered signer differs and verification fails.\n// Keccak-256 is dynamic-imported from a CDN only when SIWX EVM sign-in runs.\nlet _evmChecksum = null;\nasync function loadEvmChecksum() {\n\tif (_evmChecksum) return _evmChecksum;\n\tconst sha3 = await import(/* @vite-ignore */ config.nobleHashesUrl);\n\tconst keccak = sha3.keccak_256;\n\t_evmChecksum = (addr) => {\n\t\tconst a = String(addr).toLowerCase().replace(/^0x/, '');\n\t\tif (!/^[0-9a-f]{40}$/.test(a)) throw new Error(`invalid EVM address: ${addr}`);\n\t\tconst hashBytes = keccak(new TextEncoder().encode(a));\n\t\tlet hex = '';\n\t\tfor (let i = 0; i < hashBytes.length; i++) hex += hashBytes[i].toString(16).padStart(2, '0');\n\t\tlet out = '0x';\n\t\tfor (let i = 0; i < 40; i++) {\n\t\t\tout += parseInt(hex[i], 16) >= 8 ? a[i].toUpperCase() : a[i];\n\t\t}\n\t\treturn out;\n\t};\n\treturn _evmChecksum;\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 styles \u2500\u2500\u2500\u2500\n\nconst STYLE_ID = 'x402-styles';\nconst STYLES = `\n:root {\n\t--x402-z: 2147483600;\n}\n.x402-overlay {\n\tposition: fixed; inset: 0;\n\tbackground: rgba(8, 10, 18, 0.55);\n\tbackdrop-filter: blur(10px);\n\t-webkit-backdrop-filter: blur(10px);\n\tdisplay: flex; align-items: center; justify-content: center;\n\tz-index: var(--x402-z);\n\topacity: 0; transition: opacity 0.16s ease-out;\n\tfont-family: -apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n\t-webkit-font-smoothing: antialiased;\n\tcolor: #0f0f0f;\n}\n.x402-overlay.x402-open { opacity: 1; }\n.x402-overlay * { box-sizing: border-box; }\n.x402-modal {\n\twidth: calc(100% - 32px); max-width: 420px;\n\tbackground: #ffffff;\n\tborder-radius: 18px;\n\tbox-shadow: 0 24px 80px rgba(8, 10, 18, 0.28), 0 4px 16px rgba(8, 10, 18, 0.12);\n\toverflow: hidden;\n\ttransform: translateY(8px) scale(0.985);\n\ttransition: transform 0.18s ease-out;\n\tdisplay: flex; flex-direction: column;\n\tmax-height: calc(100dvh - 32px);\n}\n.x402-overlay.x402-open .x402-modal { transform: translateY(0) scale(1); }\n.x402-head {\n\tpadding: 18px 20px 14px;\n\tborder-bottom: 1px solid #eef0f4;\n\tdisplay: flex; align-items: center; gap: 12px;\n}\n.x402-head .x402-merchant {\n\tflex: 1; min-width: 0;\n}\n.x402-merchant .x402-name {\n\tfont-size: 12px; color: #5a6378; font-weight: 600; letter-spacing: 0.02em; text-transform: uppercase;\n\tmargin-bottom: 2px;\n}\n.x402-merchant .x402-action {\n\tfont-size: 17px; font-weight: 700; color: #0f0f0f;\n\twhite-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n\tletter-spacing: -0.01em;\n}\n.x402-close {\n\twidth: 32px; height: 32px;\n\tborder-radius: 8px; border: none; background: #f3f4f7;\n\tfont-size: 16px; color: #5a6378; cursor: pointer;\n\tdisplay: flex; align-items: center; justify-content: center;\n\ttransition: background 0.12s;\n}\n.x402-close:hover { background: #e7e9ee; color: #0f0f0f; }\n\n.x402-price-row {\n\tpadding: 18px 20px;\n\tdisplay: flex; align-items: baseline; justify-content: space-between;\n\tbackground: linear-gradient(180deg, #fafbfc 0%, #ffffff 100%);\n\tborder-bottom: 1px solid #eef0f4;\n}\n.x402-price {\n\tfont-size: 32px; font-weight: 700; letter-spacing: -0.02em; color: #0f0f0f;\n\tfont-variant-numeric: tabular-nums;\n}\n.x402-price .x402-currency { font-size: 14px; color: #5a6378; font-weight: 600; margin-left: 6px; letter-spacing: 0; }\n.x402-network {\n\tfont-size: 12px; color: #5a6378; font-weight: 500;\n\tbackground: #f3f4f7; padding: 5px 10px; border-radius: 99px;\n\tdisplay: inline-flex; align-items: center; gap: 6px;\n}\n.x402-network::before {\n\tcontent: ''; width: 6px; height: 6px; border-radius: 50%;\n\tbackground: #22c55e;\n}\n\n.x402-body {\n\tpadding: 16px 20px 18px;\n\tflex: 1 1 auto; overflow-y: auto;\n\tdisplay: flex; flex-direction: column; gap: 10px;\n}\n.x402-step {\n\tdisplay: flex; gap: 12px; align-items: flex-start;\n\tpadding: 10px 0;\n}\n.x402-step + .x402-step { border-top: 1px solid #f3f4f7; }\n.x402-step-num {\n\twidth: 22px; height: 22px; flex: 0 0 auto;\n\tborder-radius: 50%; border: 1.5px solid #d0d4dd; background: #fff;\n\tcolor: #5a6378;\n\tfont-size: 11px; font-weight: 700;\n\tdisplay: flex; align-items: center; justify-content: center;\n}\n.x402-step.x402-active .x402-step-num {\n\tborder-color: #0a84ff; background: #0a84ff; color: #fff;\n\tanimation: x402-spin 1.2s linear infinite;\n}\n.x402-step.x402-done .x402-step-num {\n\tborder-color: #22c55e; background: #22c55e; color: #fff;\n}\n.x402-step.x402-error .x402-step-num {\n\tborder-color: #ef4444; background: #ef4444; color: #fff;\n}\n@keyframes x402-spin {\n\tfrom { box-shadow: 0 0 0 0 rgba(10, 132, 255, 0.4); }\n\tto { box-shadow: 0 0 0 8px rgba(10, 132, 255, 0); }\n}\n.x402-step-body { flex: 1; min-width: 0; }\n.x402-step-label { font-size: 14px; font-weight: 600; color: #0f0f0f; line-height: 1.35; }\n.x402-step-meta { font-size: 12px; color: #5a6378; margin-top: 2px; font-feature-settings: 'tnum' 1; }\n.x402-step.x402-error .x402-step-meta { color: #ef4444; }\n\n.x402-wallet-buttons {\n\tdisplay: flex; flex-direction: column; gap: 8px;\n\tmargin-top: 4px;\n}\n.x402-wallet-btn {\n\twidth: 100%; padding: 13px 14px;\n\tbackground: #ffffff; border: 1.5px solid #e2e5ec; border-radius: 11px;\n\tfont-size: 14px; font-weight: 600; color: #0f0f0f;\n\tcursor: pointer; font-family: inherit;\n\tdisplay: flex; align-items: center; gap: 12px;\n\ttransition: border-color 0.12s, background 0.12s, transform 0.05s;\n}\n.x402-wallet-btn:hover:not(:disabled) { border-color: #0a84ff; background: #f7faff; }\n.x402-wallet-btn:active:not(:disabled) { transform: translateY(1px); }\n.x402-wallet-btn:disabled { opacity: 0.45; cursor: not-allowed; }\n.x402-wallet-icon {\n\twidth: 28px; height: 28px; flex: 0 0 auto;\n\tborder-radius: 7px;\n\tdisplay: flex; align-items: center; justify-content: center;\n\tfont-size: 16px;\n\tbackground: #f3f4f7;\n}\n.x402-wallet-icon.x402-phantom { background: linear-gradient(135deg, #ab9ff2, #534bb1); color: #fff; }\n.x402-wallet-icon.x402-metamask { background: linear-gradient(135deg, #f6851b, #e2761b); color: #fff; }\n.x402-wallet-name { flex: 1; text-align: left; }\n.x402-wallet-meta { font-size: 11px; color: #8a90a8; font-weight: 500; }\n\n.x402-pay-btn {\n\twidth: 100%; padding: 14px 16px;\n\tbackground: #0f0f0f; color: #fff; border: none;\n\tborder-radius: 12px;\n\tfont-size: 15px; font-weight: 700; font-family: inherit;\n\tcursor: pointer; letter-spacing: -0.005em;\n\ttransition: background 0.12s, transform 0.05s;\n\tmargin-top: 4px;\n\tdisplay: flex; align-items: center; justify-content: center; gap: 8px;\n}\n.x402-pay-btn:hover:not(:disabled) { background: #1d1d1d; }\n.x402-pay-btn:active:not(:disabled) { transform: translateY(1px); }\n.x402-pay-btn:disabled { background: #c8ccd4; cursor: not-allowed; }\n\n.x402-pay-secondary {\n\twidth: 100%; padding: 12px 14px;\n\tbackground: #ffffff; color: #0f0f0f;\n\tborder: 1.5px solid #e2e5ec; border-radius: 11px;\n\tfont-size: 14px; font-weight: 600; font-family: inherit;\n\tcursor: pointer; letter-spacing: -0.005em;\n\tmargin-top: 6px;\n\ttransition: border-color 0.12s, background 0.12s, transform 0.05s;\n}\n.x402-pay-secondary:hover:not(:disabled) { border-color: #0a84ff; background: #f7faff; }\n.x402-pay-secondary:active:not(:disabled) { transform: translateY(1px); }\n\n.x402-siwx-hint {\n\tfont-size: 11px; color: #5a6378; text-align: center;\n\tmargin-top: 8px; line-height: 1.4;\n}\n.x402-siwx-fallback {\n\tfont-size: 12px; color: #b45309; line-height: 1.45;\n\tpadding: 8px 10px; border-radius: 8px;\n\tbackground: #fffbeb; border: 1px solid #fde68a;\n\tmargin-bottom: 6px;\n}\n\n.x402-error-box {\n\tpadding: 12px 14px; border-radius: 10px;\n\tbackground: #fef2f2; border: 1px solid #fecaca; color: #b91c1c;\n\tfont-size: 13px; line-height: 1.45;\n\tfont-family: ui-monospace, \"JetBrains Mono\", Menlo, monospace;\n\tword-break: break-word;\n}\n.x402-error-box strong { font-weight: 700; }\n\n.x402-receipt {\n\tpadding: 14px 16px; border-radius: 12px;\n\tbackground: linear-gradient(180deg, #f0fdf4 0%, #ffffff 100%);\n\tborder: 1px solid #bbf7d0;\n}\n.x402-receipt-title {\n\tfont-size: 11px; font-weight: 700; color: #15803d;\n\ttext-transform: uppercase; letter-spacing: 0.06em;\n\tmargin-bottom: 8px;\n\tdisplay: flex; align-items: center; gap: 6px;\n}\n.x402-receipt-title::before { content: '\u2713'; font-size: 14px; }\n.x402-receipt-row {\n\tdisplay: flex; justify-content: space-between; gap: 12px;\n\tfont-size: 12px; padding: 2px 0;\n\tfont-family: ui-monospace, \"JetBrains Mono\", Menlo, monospace;\n}\n.x402-receipt-row .x402-k { color: #5a6378; }\n.x402-receipt-row .x402-v { color: #0f0f0f; text-align: right; word-break: break-all; }\n.x402-receipt-row a { color: #0a84ff; text-decoration: none; }\n.x402-receipt-row a:hover { text-decoration: underline; }\n\n.x402-result {\n\tpadding: 12px 14px; border-radius: 10px;\n\tbackground: #fafbfc; border: 1px solid #e2e5ec;\n\tmax-height: 240px; overflow: auto;\n\tfont-family: ui-monospace, \"JetBrains Mono\", Menlo, monospace;\n\tfont-size: 12px; line-height: 1.5; color: #0f0f0f;\n\twhite-space: pre-wrap; word-break: break-word;\n}\n\n.x402-foot {\n\tpadding: 10px 20px 14px;\n\tborder-top: 1px solid #eef0f4;\n\tdisplay: flex; align-items: center; justify-content: space-between;\n\tfont-size: 11px; color: #8a90a8;\n}\n.x402-foot a { color: #5a6378; text-decoration: none; font-weight: 600; }\n.x402-foot a:hover { color: #0f0f0f; }\n.x402-foot .x402-secure { display: flex; align-items: center; gap: 5px; }\n.x402-foot .x402-secure::before { content: '\uD83D\uDD12'; font-size: 10px; }\n\n@media (max-width: 480px) {\n\t.x402-modal { max-width: none; width: calc(100% - 16px); border-radius: 16px; }\n\t.x402-price { font-size: 26px; }\n}\n\n@media (prefers-color-scheme: dark) {\n\t.x402-overlay { color: #e6e8f0; }\n\t.x402-modal { background: #161616; box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6); }\n\t.x402-head, .x402-price-row, .x402-foot { border-color: #272727; }\n\t.x402-step + .x402-step { border-top-color: #272727; }\n\t.x402-merchant .x402-name { color: #8a90a8; }\n\t.x402-merchant .x402-action, .x402-price, .x402-step-label { color: #e6e8f0; }\n\t.x402-step-meta { color: #8a90a8; }\n\t.x402-close { background: #222222; color: #8a90a8; }\n\t.x402-close:hover { background: #2e2e2e; color: #e6e8f0; }\n\t.x402-price-row { background: linear-gradient(180deg, #1d1d1d 0%, #161616 100%); }\n\t.x402-network { background: #222222; color: #b0b6cc; }\n\t.x402-wallet-btn { background: #1d1d1d; border-color: #2e2e2e; color: #e6e8f0; }\n\t.x402-wallet-btn:hover:not(:disabled) { background: #252525; border-color: #0a84ff; }\n\t.x402-wallet-icon { background: #2e2e2e; }\n\t.x402-wallet-meta { color: #6b7088; }\n\t.x402-pay-btn { background: #ffffff; color: #0f0f0f; }\n\t.x402-pay-btn:hover:not(:disabled) { background: #e7e9ee; }\n\t.x402-pay-btn:disabled { background: #2e2e2e; color: #5a6378; }\n\t.x402-pay-secondary { background: #1d1d1d; border-color: #2e2e2e; color: #e6e8f0; }\n\t.x402-pay-secondary:hover:not(:disabled) { background: #252525; border-color: #0a84ff; }\n\t.x402-siwx-hint { color: #8a90a8; }\n\t.x402-siwx-fallback { background: #2a1d10; border-color: #78350f; color: #fcd34d; }\n\t.x402-step-num { background: #161616; border-color: #2e2e2e; color: #8a90a8; }\n\t.x402-result { background: #1d1d1d; border-color: #2e2e2e; color: #e6e8f0; }\n\t.x402-receipt { background: linear-gradient(180deg, #0b1f17 0%, #161616 100%); border-color: #14532d; }\n\t.x402-receipt-title { color: #4ade80; }\n\t.x402-receipt-row .x402-k { color: #8a90a8; }\n\t.x402-receipt-row .x402-v { color: #e6e8f0; }\n\t.x402-receipt-row a { color: #60a5fa; }\n\t.x402-error-box { background: #1f1416; border-color: #7f1d1d; color: #fca5a5; }\n\t.x402-foot a { color: #b0b6cc; }\n\t.x402-foot a:hover { color: #ffffff; }\n}\n`;\n\nfunction injectStyles() {\n\tif (typeof document === 'undefined' || document.getElementById(STYLE_ID)) return;\n\tconst el = document.createElement('style');\n\tel.id = STYLE_ID;\n\tel.textContent = STYLES;\n\tdocument.head.appendChild(el);\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 modal class \u2500\u2500\u2500\n\nexport class CheckoutModal {\n\tconstructor(opts) {\n\t\tthis.opts = opts;\n\t\tthis.steps = [\n\t\t\t{ id: 'discover', label: 'Confirming price' },\n\t\t\t{ id: 'connect', label: 'Connect wallet' },\n\t\t\t{ id: 'authorize', label: 'Authorize payment' },\n\t\t\t{ id: 'verify', label: 'Verify & complete' },\n\t\t];\n\t\tthis.activeNetwork = null;\n\t\tthis.payerAddress = null;\n\t\tthis.accept = null;\n\t\tthis.challenge = null;\n\t\tthis.disposed = false;\n\t\t// One-shot guard for opts.autoConnect: we only auto-open the wallet on the\n\t\t// first connect render, so an error that drops the user back to this step\n\t\t// shows the manual picker instead of re-launching the wallet in a loop.\n\t\tthis.autoConnectTried = false;\n\t}\n\n\t_apiOrigin() {\n\t\treturn apiOriginFor(this.opts);\n\t}\n\n\tmount() {\n\t\tinjectStyles();\n\t\tconst brand = this.opts.brand || config.brand || {};\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.className = 'x402-overlay';\n\t\tconst brandHtml = brand.href\n\t\t\t? `<a href=\"${escapeHtml(brand.href)}\" target=\"_blank\" rel=\"noopener\">${escapeHtml(brand.label || brand.href)}</a>`\n\t\t\t: brand.label\n\t\t\t\t? `<span>${escapeHtml(brand.label)}</span>`\n\t\t\t\t: '';\n\t\toverlay.innerHTML = `\n\t\t\t<div class=\"x402-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"x402 payment\">\n\t\t\t\t<div class=\"x402-head\">\n\t\t\t\t\t<div class=\"x402-merchant\">\n\t\t\t\t\t\t<div class=\"x402-name\" data-merchant>${escapeHtml(this.opts.merchant || 'Payment')}</div>\n\t\t\t\t\t\t<div class=\"x402-action\" data-action>${escapeHtml(this.opts.action || 'Pay-per-call')}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"x402-close\" data-close aria-label=\"Close\">\u2715</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"x402-price-row\">\n\t\t\t\t\t<div class=\"x402-price\" data-price>\u2014<span class=\"x402-currency\"> USDC</span></div>\n\t\t\t\t\t<div class=\"x402-network\" data-network>resolving\u2026</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"x402-body\" data-body></div>\n\t\t\t\t<div class=\"x402-foot\">\n\t\t\t\t\t<span class=\"x402-secure\">x402 \u00B7 onchain settled</span>\n\t\t\t\t\t${brandHtml}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t\tdocument.body.appendChild(overlay);\n\t\tthis.overlay = overlay;\n\t\tthis.bodyEl = overlay.querySelector('[data-body]');\n\t\tthis.priceEl = overlay.querySelector('[data-price]');\n\t\tthis.networkEl = overlay.querySelector('[data-network]');\n\t\toverlay.querySelector('[data-close]').addEventListener('click', () => this.close('cancelled'));\n\t\toverlay.addEventListener('click', (e) => { if (e.target === overlay) this.close('cancelled'); });\n\t\tthis.onKey = (e) => { if (e.key === 'Escape') this.close('cancelled'); };\n\t\tdocument.addEventListener('keydown', this.onKey);\n\t\trequestAnimationFrame(() => overlay.classList.add('x402-open'));\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve;\n\t\t\tthis.reject = reject;\n\t\t});\n\t}\n\n\tclose(reason) {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tdocument.removeEventListener('keydown', this.onKey);\n\t\tthis.overlay.classList.remove('x402-open');\n\t\tsetTimeout(() => this.overlay.remove(), 180);\n\t\tif (reason === 'cancelled' && this.reject) {\n\t\t\tconst err = new Error('cancelled');\n\t\t\terr.code = 'cancelled';\n\t\t\tthis.reject(err);\n\t\t}\n\t}\n\n\trenderSteps(activeId, status = {}) {\n\t\tconst html = this.steps\n\t\t\t.map((s) => {\n\t\t\t\tconst state = status[s.id] || (s.id === activeId ? 'active' : 'idle');\n\t\t\t\tconst cls = state === 'active' ? 'x402-active' : state === 'done' ? 'x402-done' : state === 'error' ? 'x402-error' : '';\n\t\t\t\tconst meta = status[`${s.id}_meta`] || '';\n\t\t\t\tconst sym = state === 'done' ? '\u2713' : state === 'error' ? '!' : s.id === activeId && state === 'active' ? ' ' : (this.steps.findIndex((x) => x.id === s.id) + 1);\n\t\t\t\treturn `<div class=\"x402-step ${cls}\">\n\t\t\t\t\t<div class=\"x402-step-num\">${sym}</div>\n\t\t\t\t\t<div class=\"x402-step-body\">\n\t\t\t\t\t\t<div class=\"x402-step-label\">${s.label}</div>\n\t\t\t\t\t\t${meta ? `<div class=\"x402-step-meta\">${escapeHtml(meta)}</div>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t\t\t})\n\t\t\t.join('');\n\t\treturn html;\n\t}\n\n\tsetPrice(accept) {\n\t\tconst decimals = accept.extra?.decimals ?? 6;\n\t\tconst amount = formatAmount(accept.amount, decimals);\n\t\tconst sym = (accept.extra?.name || 'USDC').replace(/^USD Coin$/, 'USDC');\n\t\tthis.priceEl.innerHTML = `${amount}<span class=\"x402-currency\"> ${sym}</span>`;\n\t\tthis.networkEl.textContent = networkLabel(accept.network, accept);\n\t}\n\n\trenderConnect() {\n\t\tconst phantomDetected = typeof window !== 'undefined' && (window.solana?.isPhantom || window.phantom?.solana);\n\t\tconst evmDetected = typeof window !== 'undefined' && window.ethereum;\n\t\tconst solanaAccept = this.challenge?.accepts.find((a) => isSolanaNetwork(a.network));\n\t\tconst evmAccept = this.challenge?.accepts.find(isEip3009Accept);\n\n\t\t// SIWX-first path: when the 402 advertises sign-in-with-x AND we have a\n\t\t// compatible wallet, lead with \"Sign in with wallet\" (primary) and demote\n\t\t// pay to a secondary action. payFlowOverride is set true when the user\n\t\t// explicitly chooses to pay.\n\t\tif (this.siwx && !this.payFlowOverride) {\n\t\t\tconst siwxSolana = phantomDetected ? pickSiwxChain(this.siwx, 'solana') : null;\n\t\t\tconst siwxEvm = evmDetected ? pickSiwxChain(this.siwx, 'evm') : null;\n\t\t\tif (siwxSolana || siwxEvm) {\n\t\t\t\tthis.renderSiwxChoice({ siwxSolana, siwxEvm });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// autoConnect (opt-in via opts.autoConnect): when the caller knows the user\n\t\t// is wallet-ready and shouldn't have to pick, skip the picker and go\n\t\t// straight to the signature \u2014 but only when exactly one supported wallet is\n\t\t// actually detected. One-shot via autoConnectTried.\n\t\tif (this.opts.autoConnect && !this.autoConnectTried && !this.siwxFallbackNotice) {\n\t\t\tthis.autoConnectTried = true;\n\t\t\tconst solanaViable = !!(solanaAccept && phantomDetected);\n\t\t\tconst evmViable = !!(evmAccept && evmDetected);\n\t\t\tif (solanaViable && !evmViable) { this.runSolana(solanaAccept); return; }\n\t\t\tif (evmViable && !solanaViable) { this.runEvm(evmAccept); return; }\n\t\t}\n\n\t\tconst buttons = [];\n\t\tif (solanaAccept) {\n\t\t\tbuttons.push(`\n\t\t\t\t<button class=\"x402-wallet-btn\" data-wallet=\"phantom\" ${phantomDetected ? '' : 'disabled'}>\n\t\t\t\t\t<div class=\"x402-wallet-icon x402-phantom\">P</div>\n\t\t\t\t\t<span class=\"x402-wallet-name\">${phantomDetected ? 'Phantom' : 'Phantom (not detected)'}</span>\n\t\t\t\t\t<span class=\"x402-wallet-meta\">${networkLabel(solanaAccept.network, solanaAccept)}</span>\n\t\t\t\t</button>\n\t\t\t`);\n\t\t}\n\t\tif (evmAccept) {\n\t\t\tbuttons.push(`\n\t\t\t\t<button class=\"x402-wallet-btn\" data-wallet=\"evm\" ${evmDetected ? '' : 'disabled'}>\n\t\t\t\t\t<div class=\"x402-wallet-icon x402-metamask\">M</div>\n\t\t\t\t\t<span class=\"x402-wallet-name\">${evmDetected ? 'Browser wallet' : 'No EVM wallet detected'}</span>\n\t\t\t\t\t<span class=\"x402-wallet-meta\">${networkLabel(evmAccept.network, evmAccept)}</span>\n\t\t\t\t</button>\n\t\t\t`);\n\t\t}\n\t\tconst fallbackBox = this.siwxFallbackNotice\n\t\t\t? `<div class=\"x402-siwx-fallback\">${escapeHtml(this.siwxFallbackNotice)}</div>`\n\t\t\t: '';\n\t\tthis.bodyEl.innerHTML = `\n\t\t\t${this.renderSteps('connect', { discover: 'done' })}\n\t\t\t${fallbackBox}\n\t\t\t<div class=\"x402-wallet-buttons\">${buttons.join('')}</div>\n\t\t`;\n\t\tconst onClick = (e) => {\n\t\t\tconst btn = e.target.closest('[data-wallet]');\n\t\t\tif (!btn || btn.disabled) return;\n\t\t\tconst wallet = btn.dataset.wallet;\n\t\t\tif (wallet === 'phantom') this.runSolana(solanaAccept);\n\t\t\telse if (wallet === 'evm') this.runEvm(evmAccept);\n\t\t};\n\t\tthis.bodyEl.querySelectorAll('[data-wallet]').forEach((b) => b.addEventListener('click', onClick));\n\t}\n\n\trenderSiwxChoice({ siwxSolana, siwxEvm }) {\n\t\tconst priceText = formatAmount(this.accept.amount, this.accept.extra?.decimals ?? 6);\n\t\tconst siwxTarget = siwxSolana\n\t\t\t? { kind: 'solana', chain: siwxSolana.chain }\n\t\t\t: { kind: 'evm', chain: siwxEvm.chain };\n\t\tconst siwxLabel = siwxTarget.kind === 'solana' ? 'Sign in with Phantom' : 'Sign in with wallet';\n\t\tthis.bodyEl.innerHTML = `\n\t\t\t${this.renderSteps('connect', { discover: 'done' })}\n\t\t\t<button class=\"x402-pay-btn\" data-action=\"siwx\">${siwxLabel}</button>\n\t\t\t<button class=\"x402-pay-secondary\" data-action=\"pay\">Pay ${priceText} USDC instead</button>\n\t\t\t<div class=\"x402-siwx-hint\">Already paid for this once? Sign in to re-enter without paying again.</div>\n\t\t`;\n\t\tconst siwxBtn = this.bodyEl.querySelector('[data-action=\"siwx\"]');\n\t\tconst payBtn = this.bodyEl.querySelector('[data-action=\"pay\"]');\n\t\tsiwxBtn.addEventListener('click', () => {\n\t\t\tif (siwxTarget.kind === 'solana') this.runSiwxSolana(siwxTarget.chain);\n\t\t\telse this.runSiwxEvm(siwxTarget.chain);\n\t\t});\n\t\tpayBtn.addEventListener('click', () => {\n\t\t\tthis.payFlowOverride = true;\n\t\t\tthis.renderConnect();\n\t\t});\n\t\trequestAnimationFrame(() => siwxBtn.focus());\n\t}\n\n\trenderProgress(activeId, meta = {}) {\n\t\tthis.bodyEl.innerHTML = this.renderSteps(activeId, {\n\t\t\tdiscover: 'done',\n\t\t\tconnect: 'done',\n\t\t\t...(activeId === 'verify' ? { authorize: 'done' } : {}),\n\t\t\t[`${activeId}_meta`]: meta.text || '',\n\t\t\t...meta.statuses,\n\t\t});\n\t}\n\n\trenderError(stepId, message) {\n\t\tthis.bodyEl.innerHTML = `\n\t\t\t${this.renderSteps(stepId, {\n\t\t\t\t...(stepId !== 'discover' ? { discover: 'done' } : {}),\n\t\t\t\t...(stepId === 'authorize' || stepId === 'verify' ? { connect: 'done' } : {}),\n\t\t\t\t...(stepId === 'verify' ? { authorize: 'done' } : {}),\n\t\t\t\t[stepId]: 'error',\n\t\t\t\t[`${stepId}_meta`]: 'failed',\n\t\t\t})}\n\t\t\t<div class=\"x402-error-box\"><strong>${escapeHtml(stepId)}:</strong> ${escapeHtml(message)}</div>\n\t\t\t<button class=\"x402-pay-btn\" data-retry>Try again</button>\n\t\t`;\n\t\tthis.bodyEl.querySelector('[data-retry]').addEventListener('click', () => this.start());\n\t}\n\n\trenderDone({ result, payment, siwx }) {\n\t\tconst resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n\t\tlet receiptHtml;\n\t\tif (siwx) {\n\t\t\tconst addrShort = siwx.address ? `${siwx.address.slice(0, 8)}\u2026${siwx.address.slice(-6)}` : '\u2014';\n\t\t\treceiptHtml = `\n\t\t\t\t<div class=\"x402-receipt\">\n\t\t\t\t\t<div class=\"x402-receipt-title\">Welcome back!</div>\n\t\t\t\t\t<div class=\"x402-receipt-row\">\n\t\t\t\t\t\t<span class=\"x402-k\">network</span>\n\t\t\t\t\t\t<span class=\"x402-v\">${escapeHtml(networkLabel(siwx.network) || siwx.network || '\u2014')}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"x402-receipt-row\">\n\t\t\t\t\t\t<span class=\"x402-k\">wallet</span>\n\t\t\t\t\t\t<span class=\"x402-v\">${escapeHtml(addrShort)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"x402-receipt-row\">\n\t\t\t\t\t\t<span class=\"x402-k\">paid</span>\n\t\t\t\t\t\t<span class=\"x402-v\">previously \u00B7 re-entered free</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t} else {\n\t\t\tconst explorer = explorerUrl(payment?.network, payment?.transaction);\n\t\t\tconst txShort = payment?.transaction ? `${payment.transaction.slice(0, 8)}\u2026${payment.transaction.slice(-6)}` : '\u2014';\n\t\t\treceiptHtml = `\n\t\t\t\t<div class=\"x402-receipt\">\n\t\t\t\t\t<div class=\"x402-receipt-title\">Payment confirmed!</div>\n\t\t\t\t\t<div class=\"x402-receipt-row\">\n\t\t\t\t\t\t<span class=\"x402-k\">network</span>\n\t\t\t\t\t\t<span class=\"x402-v\">${escapeHtml(networkLabel(payment?.network) || '\u2014')}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"x402-receipt-row\">\n\t\t\t\t\t\t<span class=\"x402-k\">payer</span>\n\t\t\t\t\t\t<span class=\"x402-v\">${escapeHtml(payment?.payer ? `${payment.payer.slice(0, 8)}\u2026${payment.payer.slice(-6)}` : '\u2014')}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t${\n\t\t\t\t\t\tpayment?.transaction\n\t\t\t\t\t\t\t? `<div class=\"x402-receipt-row\"><span class=\"x402-k\">tx</span><span class=\"x402-v\">${\n\t\t\t\t\t\t\t\t\texplorer ? `<a href=\"${explorer}\" target=\"_blank\" rel=\"noopener\">${txShort} \u2197</a>` : txShort\n\t\t\t\t\t\t\t\t}</span></div>`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\t\tthis.bodyEl.innerHTML = `\n\t\t\t${receiptHtml}\n\t\t\t<div class=\"x402-result\">${escapeHtml(resultStr).slice(0, 4000)}</div>\n\t\t\t<button class=\"x402-pay-btn\" data-done>Done</button>\n\t\t`;\n\t\tthis.bodyEl.querySelector('[data-done]').addEventListener('click', () => {\n\t\t\tthis.disposed = true;\n\t\t\tdocument.removeEventListener('keydown', this.onKey);\n\t\t\tthis.overlay.classList.remove('x402-open');\n\t\t\tsetTimeout(() => this.overlay.remove(), 180);\n\t\t});\n\t}\n\n\tasync start() {\n\t\tthis.bodyEl.innerHTML = this.renderSteps('discover');\n\t\ttry {\n\t\t\tconst challenge = await discoverChallenge(this.opts);\n\t\t\tthis.challenge = challenge;\n\t\t\tthis.siwx = extractSiwxExtension(challenge);\n\t\t\tthis.payFlowOverride = false;\n\t\t\tthis.siwxFallbackNotice = null;\n\t\t\t// Solana-first platform default: select the Solana accept by default\n\t\t\t// whenever one is offered, regardless of which wallet is detected \u2014\n\t\t\t// renderConnect() still shows both wallet buttons (Solana listed\n\t\t\t// first), so EVM users simply click the EVM option. Falls back to the\n\t\t\t// first EIP-3009 EVM entry (skipping Permit2 siblings the modal can't\n\t\t\t// sign for), then the first accept.\n\t\t\tconst solana = challenge.accepts.find((a) => isSolanaNetwork(a.network));\n\t\t\tconst evm = challenge.accepts.find(isEip3009Accept);\n\t\t\tthis.accept = solana || evm || challenge.accepts[0];\n\t\t\tthis.setPrice(this.accept);\n\t\t\tthis.renderConnect();\n\t\t} catch (err) {\n\t\t\tthis.renderError('discover', err.message || String(err));\n\t\t}\n\t}\n\n\tasync runSolana(accept) {\n\t\tthis.accept = accept;\n\t\tthis.setPrice(accept);\n\t\tthis.renderProgress('connect', { text: 'Opening Phantom\u2026' });\n\t\ttry {\n\t\t\tconst provider = window.phantom?.solana || window.solana;\n\t\t\tif (!provider) throw new Error('Phantom wallet not detected');\n\t\t\tconst conn = await provider.connect();\n\t\t\tconst payerAddress = (conn?.publicKey || provider.publicKey)?.toString();\n\t\t\tif (!payerAddress) throw new Error('Phantom did not return a public key');\n\t\t\tthis.payerAddress = payerAddress;\n\t\t\tconst capCheck = browserEnforceCap({\n\t\t\t\taccept,\n\t\t\t\tcaps: this.opts.caps,\n\t\t\t\taddress: payerAddress,\n\t\t\t});\n\t\t\tif (capCheck.abort) {\n\t\t\t\tthis.renderError('authorize', capCheck.reason);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.spendReservation = capCheck.reservation || null;\n\t\t\tthis.renderProgress('authorize', { text: `Building Solana payment for ${payerAddress.slice(0, 6)}\u2026${payerAddress.slice(-4)}` });\n\n\t\t\tconst origin = this._apiOrigin();\n\t\t\tconst prep = await postJson(`${origin}/api/x402-checkout?action=prepare`, {\n\t\t\t\taccept,\n\t\t\t\tbuyer: payerAddress,\n\t\t\t});\n\t\t\tthis.renderProgress('authorize', { text: 'Confirm in Phantom\u2026' });\n\t\t\tconst txBytes = base64ToUint8Array(prep.tx_base64);\n\t\t\t// Phantom returns a fully-signed VersionedTransaction with the buyer's\n\t\t\t// signature added. The facilitator's fee-payer signature is added during\n\t\t\t// /settle.\n\t\t\tconst SolanaWeb3 = await loadSolanaWeb3();\n\t\t\tconst tx = SolanaWeb3.VersionedTransaction.deserialize(txBytes);\n\t\t\tconst signed = await provider.signTransaction(tx);\n\t\t\tconst signedB64 = uint8ArrayToBase64(signed.serialize());\n\n\t\t\tconst builderCodeBlock = buildBuilderCodeEcho(this.challenge);\n\t\t\tconst enc = await postJson(`${origin}/api/x402-checkout?action=encode`, {\n\t\t\t\taccept,\n\t\t\t\tsigned_tx_base64: signedB64,\n\t\t\t\tresource_url: new URL(this.opts.endpoint, location.href).href,\n\t\t\t\t...(builderCodeBlock ? { builder_code: builderCodeBlock } : {}),\n\t\t\t});\n\n\t\t\tawait this.executePaid(enc.x_payment);\n\t\t} catch (err) {\n\t\t\tif (this.spendReservation) {\n\t\t\t\tbrowserRollbackReservation(this.spendReservation);\n\t\t\t\tthis.spendReservation = null;\n\t\t\t}\n\t\t\tthis.renderError(this.payerAddress ? 'authorize' : 'connect', friendlyError(err));\n\t\t}\n\t}\n\n\tasync runEvm(accept) {\n\t\tthis.accept = accept;\n\t\tthis.setPrice(accept);\n\t\tthis.renderProgress('connect', { text: 'Opening browser wallet\u2026' });\n\t\ttry {\n\t\t\tconst eth = window.ethereum;\n\t\t\tif (!eth) throw new Error('No EVM wallet detected');\n\t\t\tconst accounts = await eth.request({ method: 'eth_requestAccounts' });\n\t\t\tconst payerAddress = accounts?.[0];\n\t\t\tif (!payerAddress) throw new Error('Wallet did not return an account');\n\t\t\tthis.payerAddress = payerAddress;\n\t\t\tconst capCheck = browserEnforceCap({\n\t\t\t\taccept,\n\t\t\t\tcaps: this.opts.caps,\n\t\t\t\taddress: payerAddress,\n\t\t\t});\n\t\t\tif (capCheck.abort) {\n\t\t\t\tthis.renderError('authorize', capCheck.reason);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.spendReservation = capCheck.reservation || null;\n\n\t\t\tconst meta = EVM_NETWORKS[accept.network];\n\t\t\tif (!meta) throw new Error(`Unknown EVM network ${accept.network}`);\n\t\t\t// Switch chain if needed.\n\t\t\tconst currentChainHex = await eth.request({ method: 'eth_chainId' });\n\t\t\tconst desiredChainHex = '0x' + meta.chainId.toString(16);\n\t\t\tif (currentChainHex !== desiredChainHex) {\n\t\t\t\tthis.renderProgress('connect', { text: `Switch wallet to ${meta.name}\u2026` });\n\t\t\t\ttry {\n\t\t\t\t\tawait eth.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: desiredChainHex }] });\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new Error(`Wallet is on ${currentChainHex}; please switch to ${meta.name} (${desiredChainHex}) and retry`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.renderProgress('authorize', { text: `Authorize ${formatAmount(accept.amount)} USDC\u2026` });\n\n\t\t\t// EIP-3009 transferWithAuthorization typed-data signature.\n\t\t\tconst validAfter = 0;\n\t\t\tconst validBefore = Math.floor(Date.now() / 1000) + (accept.maxTimeoutSeconds || 600);\n\t\t\tconst nonce = '0x' + randomHex(32);\n\t\t\tconst domain = {\n\t\t\t\tname: accept.extra?.name || 'USD Coin',\n\t\t\t\tversion: accept.extra?.version || '2',\n\t\t\t\tchainId: meta.chainId,\n\t\t\t\tverifyingContract: accept.asset,\n\t\t\t};\n\t\t\tconst types = {\n\t\t\t\tEIP712Domain: [\n\t\t\t\t\t{ name: 'name', type: 'string' },\n\t\t\t\t\t{ name: 'version', type: 'string' },\n\t\t\t\t\t{ name: 'chainId', type: 'uint256' },\n\t\t\t\t\t{ name: 'verifyingContract', type: 'address' },\n\t\t\t\t],\n\t\t\t\tTransferWithAuthorization: [\n\t\t\t\t\t{ name: 'from', type: 'address' },\n\t\t\t\t\t{ name: 'to', type: 'address' },\n\t\t\t\t\t{ name: 'value', type: 'uint256' },\n\t\t\t\t\t{ name: 'validAfter', type: 'uint256' },\n\t\t\t\t\t{ name: 'validBefore', type: 'uint256' },\n\t\t\t\t\t{ name: 'nonce', type: 'bytes32' },\n\t\t\t\t],\n\t\t\t};\n\t\t\tconst message = {\n\t\t\t\tfrom: payerAddress,\n\t\t\t\tto: accept.payTo,\n\t\t\t\tvalue: accept.amount,\n\t\t\t\tvalidAfter,\n\t\t\t\tvalidBefore,\n\t\t\t\tnonce,\n\t\t\t};\n\t\t\tconst typedData = {\n\t\t\t\tprimaryType: 'TransferWithAuthorization',\n\t\t\t\ttypes,\n\t\t\t\tdomain,\n\t\t\t\tmessage,\n\t\t\t};\n\t\t\tconst signature = await eth.request({\n\t\t\t\tmethod: 'eth_signTypedData_v4',\n\t\t\t\tparams: [payerAddress, JSON.stringify(typedData)],\n\t\t\t});\n\n\t\t\tconst paymentPayload = {\n\t\t\t\tx402Version: 2,\n\t\t\t\tscheme: 'exact',\n\t\t\t\tnetwork: accept.network,\n\t\t\t\tresource: { url: this.opts.endpoint, mimeType: 'application/json' },\n\t\t\t\taccepted: accept,\n\t\t\t\tpayload: {\n\t\t\t\t\tsignature,\n\t\t\t\t\t// The facilitator /verify requires the EIP-3009 time bounds as\n\t\t\t\t\t// decimal strings, not JSON numbers. The signature is unaffected:\n\t\t\t\t\t// uint256 0 and \"0\" encode identically.\n\t\t\t\t\tauthorization: { from: payerAddress, to: accept.payTo, value: accept.amount, validAfter: String(validAfter), validBefore: String(validBefore), nonce },\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst builderCodeBlock = buildBuilderCodeEcho(this.challenge);\n\t\t\tif (builderCodeBlock) {\n\t\t\t\tpaymentPayload.extensions = { 'builder-code': builderCodeBlock };\n\t\t\t}\n\t\t\tconst xPayment = b64encode(paymentPayload);\n\t\t\tawait this.executePaid(xPayment);\n\t\t} catch (err) {\n\t\t\tif (this.spendReservation) {\n\t\t\t\tbrowserRollbackReservation(this.spendReservation);\n\t\t\t\tthis.spendReservation = null;\n\t\t\t}\n\t\t\tthis.renderError(this.payerAddress ? 'authorize' : 'connect', friendlyError(err));\n\t\t}\n\t}\n\n\tasync executePaid(xPayment, attempt = 0) {\n\t\tthis.renderProgress('verify', {\n\t\t\ttext: attempt ? 'Retrying after upstream throttle\u2026' : 'Calling merchant endpoint\u2026',\n\t\t});\n\t\ttry {\n\t\t\tconst res = await fetch(this.opts.endpoint, {\n\t\t\t\tmethod: this.opts.method || 'GET',\n\t\t\t\theaders: {\n\t\t\t\t\t...(this.opts.headers || {}),\n\t\t\t\t\t...(this.opts.body && !this.opts.headers?.['content-type'] ? { 'content-type': 'application/json' } : {}),\n\t\t\t\t\t'X-PAYMENT': xPayment,\n\t\t\t\t},\n\t\t\t\tbody: this.opts.body ? (typeof this.opts.body === 'string' ? this.opts.body : JSON.stringify(this.opts.body)) : undefined,\n\t\t\t});\n\t\t\tconst ct = res.headers.get('content-type') || '';\n\t\t\tconst text = await res.text();\n\t\t\tlet result;\n\t\t\tif (ct.includes('json')) {\n\t\t\t\ttry {\n\t\t\t\t\tresult = JSON.parse(text);\n\t\t\t\t} catch {\n\t\t\t\t\tresult = text;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = text;\n\t\t\t}\n\t\t\tif (!res.ok) {\n\t\t\t\t// A 429 here is a transient upstream throttle. The payment is signed\n\t\t\t\t// but NOT yet settled \u2014 the merchant runs the work before settling \u2014\n\t\t\t\t// so the same X-PAYMENT can be safely re-sent once the window resets,\n\t\t\t\t// with no risk of a double charge.\n\t\t\t\tif (res.status === 429 && attempt < MAX_THROTTLE_RETRIES) {\n\t\t\t\t\tawait this.waitForThrottle(retryAfterSeconds(res, result));\n\t\t\t\t\treturn this.executePaid(xPayment, attempt + 1);\n\t\t\t\t}\n\t\t\t\tconst msg = (result && typeof result === 'object' && (result.error_description || result.error)) || `HTTP ${res.status}`;\n\t\t\t\tthrow new Error(msg);\n\t\t\t}\n\t\t\tconst settleHeader = res.headers.get('x-payment-response');\n\t\t\tconst payment = b64decode(settleHeader) || {};\n\t\t\tthis.spendReservation = null;\n\t\t\tthis.renderDone({ result, payment });\n\t\t\tthis.resolve?.({ ok: true, result, payment, response: { status: res.status, headers: headersToObject(res.headers) } });\n\t\t} catch (err) {\n\t\t\tif (this.spendReservation) {\n\t\t\t\tbrowserRollbackReservation(this.spendReservation);\n\t\t\t\tthis.spendReservation = null;\n\t\t\t}\n\t\t\tthis.renderError('verify', friendlyError(err));\n\t\t}\n\t}\n\n\t// Hold the verify step on a live countdown while an upstream throttle resets,\n\t// then return so the caller re-sends the same signed payment. The reservation\n\t// is deliberately left intact \u2014 this is the same payment, not a new one.\n\tasync waitForThrottle(seconds) {\n\t\tconst total = Math.max(1, Math.min(30, Math.round(seconds) || 6));\n\t\tfor (let left = total; left > 0; left--) {\n\t\t\tthis.renderProgress('verify', { text: `Service is busy \u2014 retrying in ${left}s\u2026` });\n\t\t\tawait new Promise((r) => setTimeout(r, 1000));\n\t\t}\n\t\tthis.renderProgress('verify', { text: 'Retrying\u2026' });\n\t}\n\n\tasync runSiwxEvm(chain) {\n\t\tthis.renderProgress('connect', { text: 'Opening browser wallet\u2026' });\n\t\ttry {\n\t\t\tconst eth = window.ethereum;\n\t\t\tif (!eth) throw new Error('No EVM wallet detected');\n\t\t\tconst accounts = await eth.request({ method: 'eth_requestAccounts' });\n\t\t\tconst rawAddress = accounts?.[0];\n\t\t\tif (!rawAddress) throw new Error('Wallet did not return an account');\n\t\t\tconst checksum = await loadEvmChecksum();\n\t\t\tconst address = checksum(rawAddress);\n\t\t\tthis.payerAddress = address;\n\t\t\tthis.renderProgress('authorize', { text: `Sign sign-in message as ${address.slice(0, 6)}\u2026${address.slice(-4)}` });\n\n\t\t\tconst message = buildSiwxMessage(this.siwx.info, chain, address);\n\t\t\tconst signature = await eth.request({\n\t\t\t\tmethod: 'personal_sign',\n\t\t\t\tparams: [message, address],\n\t\t\t});\n\n\t\t\tconst info = this.siwx.info;\n\t\t\tconst payload = {\n\t\t\t\tdomain: info.domain,\n\t\t\t\taddress,\n\t\t\t\t...(info.statement ? { statement: info.statement } : {}),\n\t\t\t\turi: info.uri,\n\t\t\t\tversion: info.version || '1',\n\t\t\t\tchainId: chain.chainId,\n\t\t\t\ttype: 'eip191',\n\t\t\t\tnonce: info.nonce,\n\t\t\t\tissuedAt: info.issuedAt,\n\t\t\t\t...(info.expirationTime ? { expirationTime: info.expirationTime } : {}),\n\t\t\t\t...(info.notBefore ? { notBefore: info.notBefore } : {}),\n\t\t\t\t...(info.requestId !== undefined && info.requestId !== null ? { requestId: info.requestId } : {}),\n\t\t\t\t...(Array.isArray(info.resources) ? { resources: info.resources } : {}),\n\t\t\t\tsignatureScheme: 'eip191',\n\t\t\t\tsignature,\n\t\t\t};\n\t\t\tawait this.executeSiwx(payload, chain.chainId);\n\t\t} catch (err) {\n\t\t\tthis.renderError(this.payerAddress ? 'authorize' : 'connect', friendlyError(err));\n\t\t}\n\t}\n\n\tasync runSiwxSolana(chain) {\n\t\tthis.renderProgress('connect', { text: 'Opening Phantom\u2026' });\n\t\ttry {\n\t\t\tconst provider = window.phantom?.solana || window.solana;\n\t\t\tif (!provider) throw new Error('Phantom wallet not detected');\n\t\t\tconst conn = await provider.connect();\n\t\t\tconst pubkey = conn?.publicKey || provider.publicKey;\n\t\t\tconst address = pubkey?.toString();\n\t\t\tif (!address) throw new Error('Phantom did not return a public key');\n\t\t\tthis.payerAddress = address;\n\t\t\tthis.renderProgress('authorize', { text: `Sign sign-in message as ${address.slice(0, 6)}\u2026${address.slice(-4)}` });\n\n\t\t\tconst message = buildSiwxMessage(this.siwx.info, chain, address);\n\t\t\tconst encoded = new TextEncoder().encode(message);\n\t\t\tconst signed = await provider.signMessage(encoded, 'utf8');\n\t\t\tconst sigBytes = signed?.signature instanceof Uint8Array ? signed.signature : new Uint8Array(signed?.signature || signed);\n\t\t\tif (!sigBytes || !sigBytes.length) throw new Error('Phantom did not return a signature');\n\t\t\tconst signature = base58encode(sigBytes);\n\n\t\t\tconst info = this.siwx.info;\n\t\t\tconst payload = {\n\t\t\t\tdomain: info.domain,\n\t\t\t\taddress,\n\t\t\t\t...(info.statement ? { statement: info.statement } : {}),\n\t\t\t\turi: info.uri,\n\t\t\t\tversion: info.version || '1',\n\t\t\t\tchainId: chain.chainId,\n\t\t\t\ttype: 'ed25519',\n\t\t\t\tnonce: info.nonce,\n\t\t\t\tissuedAt: info.issuedAt,\n\t\t\t\t...(info.expirationTime ? { expirationTime: info.expirationTime } : {}),\n\t\t\t\t...(info.notBefore ? { notBefore: info.notBefore } : {}),\n\t\t\t\t...(info.requestId !== undefined && info.requestId !== null ? { requestId: info.requestId } : {}),\n\t\t\t\t...(Array.isArray(info.resources) ? { resources: info.resources } : {}),\n\t\t\t\tsignatureScheme: 'siws',\n\t\t\t\tsignature,\n\t\t\t};\n\t\t\tawait this.executeSiwx(payload, chain.chainId);\n\t\t} catch (err) {\n\t\t\tthis.renderError(this.payerAddress ? 'authorize' : 'connect', friendlyError(err));\n\t\t}\n\t}\n\n\tasync executeSiwx(payload, chainId) {\n\t\tthis.renderProgress('verify', { text: 'Verifying sign-in\u2026' });\n\t\tconst headerValue = encodeSiwxHeaderValue(payload);\n\t\tlet res;\n\t\ttry {\n\t\t\tres = await fetch(this.opts.endpoint, {\n\t\t\t\tmethod: this.opts.method || 'GET',\n\t\t\t\theaders: {\n\t\t\t\t\t...(this.opts.headers || {}),\n\t\t\t\t\t...(this.opts.body && !this.opts.headers?.['content-type'] ? { 'content-type': 'application/json' } : {}),\n\t\t\t\t\t[SIWX_HEADER]: headerValue,\n\t\t\t\t},\n\t\t\t\tbody: this.opts.body ? (typeof this.opts.body === 'string' ? this.opts.body : JSON.stringify(this.opts.body)) : undefined,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthis.renderError('verify', friendlyError(err));\n\t\t\treturn;\n\t\t}\n\n\t\tif (res.status === 200) {\n\t\t\tconst ct = res.headers.get('content-type') || '';\n\t\t\tconst text = await res.text();\n\t\t\tlet result;\n\t\t\tif (ct.includes('json')) {\n\t\t\t\ttry { result = JSON.parse(text); } catch { result = text; }\n\t\t\t} else {\n\t\t\t\tresult = text;\n\t\t\t}\n\t\t\tconst siwx = { address: payload.address, network: chainId };\n\t\t\tthis.renderDone({ result, siwx });\n\t\t\tthis.resolve?.({\n\t\t\t\tok: true,\n\t\t\t\tresult,\n\t\t\t\tsiwx,\n\t\t\t\tresponse: { status: res.status, headers: headersToObject(res.headers) },\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (res.status === 401 || res.status === 402) {\n\t\t\t// Most likely: signature verified but this wallet hasn't actually paid\n\t\t\t// for the resource yet. Drop the SIWX offering and fall back to the\n\t\t\t// normal payment flow with a one-line notice.\n\t\t\tlet parsed = null;\n\t\t\ttry { parsed = await res.clone().json(); } catch (_) {}\n\t\t\tconst code = parsed?.code || parsed?.error;\n\t\t\tthis.siwx = null;\n\t\t\tthis.payerAddress = null;\n\t\t\tthis.payFlowOverride = false;\n\t\t\tthis.siwxFallbackNotice = code === 'siwx_not_paid' || res.status === 402\n\t\t\t\t? \"You haven't paid for this yet \u2014 pay now to unlock re-entry.\"\n\t\t\t\t: 'Sign-in not accepted \u2014 please pay to continue.';\n\t\t\tif (!this.challenge || !Array.isArray(this.challenge.accepts) || !this.challenge.accepts.length) {\n\t\t\t\tthis.start();\n\t\t\t} else {\n\t\t\t\tthis.renderConnect();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst text = await res.text().catch(() => '');\n\t\tthis.renderError('verify', `SIWX retry failed: HTTP ${res.status}${text ? ` \u00B7 ${text.slice(0, 120)}` : ''}`);\n\t}\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction escapeHtml(s) {\n\treturn String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n}\n\nfunction headersToObject(headers) {\n\tconst out = {};\n\theaders.forEach((v, k) => (out[k] = v));\n\treturn out;\n}\n\n// How many times executePaid silently re-sends a signed payment after a 429\n// throttle before falling back to the manual \"Try again\". The payment isn't\n// settled until the merchant call succeeds, so re-sending can't double-charge.\nconst MAX_THROTTLE_RETRIES = 2;\n\n// Seconds to wait before re-sending after a 429. Prefers the standard\n// Retry-After header, then the body's `retry_after` hint, then a sane default.\nfunction retryAfterSeconds(res, result, fallback = 6) {\n\tconst header = Number.parseInt(res.headers.get('retry-after') || '', 10);\n\tif (Number.isFinite(header) && header > 0) return header;\n\tconst body = result && typeof result === 'object' ? Number(result.retry_after) : NaN;\n\tif (Number.isFinite(body) && body > 0) return body;\n\treturn fallback;\n}\n\nfunction friendlyError(err) {\n\tconst msg = err?.shortMessage || err?.message || String(err);\n\tif (/user rejected|user denied|reject/i.test(msg)) return 'cancelled in wallet';\n\t// Upstream throttles often arrive as raw provider text that names the\n\t// merchant's internal billing or credit state. Never relay that to the buyer:\n\t// the payment isn't settled until the merchant call succeeds.\n\tif (/throttl|rate.?limit|too many requests|less than \\$|in credit|\\b429\\b/i.test(msg)) {\n\t\treturn 'The service is briefly busy and your payment was not taken \u2014 retry in a few seconds.';\n\t}\n\t// The Solana and EVM-sign-in paths dynamic-import a library from a CDN. A\n\t// strict host Content-Security-Policy (or the CDN being unreachable) blocks\n\t// that import. The Base/EIP-3009 payment path has no such dependency.\n\tif (/dynamically imported module|esm\\.sh|module script failed/i.test(msg)) {\n\t\treturn 'A component this wallet path needs (loaded from a CDN) was blocked \u2014 often by a strict host security policy. Pay with MetaMask on Base instead; it needs no third-party code.';\n\t}\n\treturn msg.slice(0, 240);\n}\n\nfunction base64ToUint8Array(b64) {\n\tif (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(b64, 'base64'));\n\tconst bin = atob(b64);\n\tconst arr = new Uint8Array(bin.length);\n\tfor (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n\treturn arr;\n}\nfunction uint8ArrayToBase64(arr) {\n\tif (typeof Buffer !== 'undefined') return Buffer.from(arr).toString('base64');\n\tlet bin = '';\n\tfor (let i = 0; i < arr.length; i++) bin += String.fromCharCode(arr[i]);\n\treturn btoa(bin);\n}\nfunction randomHex(bytes) {\n\tconst arr = new Uint8Array(bytes);\n\tcrypto.getRandomValues(arr);\n\treturn Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nlet _solanaWeb3 = null;\nasync function loadSolanaWeb3() {\n\tif (_solanaWeb3) return _solanaWeb3;\n\t// Dynamic import from a CDN keeps the drop-in script tiny \u2014 Solana web3.js is\n\t// only fetched when a Solana payment is actually attempted.\n\t_solanaWeb3 = await import(/* @vite-ignore */ config.solanaWeb3Url);\n\treturn _solanaWeb3;\n}\n\nasync function postJson(url, body) {\n\tconst res = await fetch(url, {\n\t\tmethod: 'POST',\n\t\theaders: { 'content-type': 'application/json' },\n\t\tbody: JSON.stringify(body),\n\t});\n\tconst text = await res.text();\n\tlet data;\n\ttry {\n\t\tdata = JSON.parse(text);\n\t} catch {\n\t\tdata = { error: 'parse_error', error_description: text.slice(0, 200) };\n\t}\n\tif (!res.ok) {\n\t\tconst err = new Error(data.error_description || data.error || `HTTP ${res.status}`);\n\t\terr.status = res.status;\n\t\terr.data = data;\n\t\tthrow err;\n\t}\n\treturn data;\n}\n\n// Probe the merchant endpoint with a benign request to extract the 402\n// challenge. Accepts HTTP 402 (standard x402) or HTTP 401 with a\n// `payment-required` header (MCP 2025-06-18 spec).\nasync function discoverChallenge(opts) {\n\tconst headers = { ...(opts.headers || {}) };\n\tconst init = {\n\t\tmethod: opts.method || 'GET',\n\t\theaders,\n\t\tbody: opts.body ? (typeof opts.body === 'string' ? opts.body : JSON.stringify(opts.body)) : undefined,\n\t};\n\tif (init.body && !headers['content-type']) headers['content-type'] = 'application/json';\n\tconst res = await fetch(opts.endpoint, init);\n\n\t// MCP 2025-06-18 endpoints return 401 with the full x402 challenge in the\n\t// `payment-required` header (base64-JSON). Accept that alongside standard 402.\n\tconst prHeader = res.headers.get('payment-required');\n\tconst is401WithChallenge = res.status === 401 && !!prHeader;\n\n\tif (res.status !== 402 && !is401WithChallenge) {\n\t\t// Endpoint isn't paid (200) or isn't an x402 endpoint at all. Surface a\n\t\t// clear error \u2014 pointing the modal at a free endpoint should not silently\n\t\t// succeed.\n\t\tconst txt = await res.text();\n\t\tthrow new Error(`Endpoint did not return 402 (got ${res.status}). Body: ${txt.slice(0, 120)}`);\n\t}\n\n\tlet body = is401WithChallenge ? b64decode(prHeader) : await res.json().catch(() => null);\n\tif (!body || !Array.isArray(body.accepts) || !body.accepts.length) {\n\t\t// Some servers only emit `{error}` in the body and put the full v2\n\t\t// PaymentRequired envelope in the base64-JSON PAYMENT-REQUIRED header.\n\t\tconst decoded = b64decode(prHeader);\n\t\tif (decoded && Array.isArray(decoded.accepts) && decoded.accepts.length) {\n\t\t\tbody = decoded;\n\t\t}\n\t}\n\tif (!body || !Array.isArray(body.accepts) || !body.accepts.length) {\n\t\tthrow new Error('Endpoint returned 402 but no `accepts` array could be found in body or header');\n\t}\n\t// Coerce spec-canonical `maxAmountRequired` \u2192 `amount` so downstream price /\n\t// caps / signing read one field.\n\tbody.accepts = body.accepts.map(normalizeAccept);\n\treturn body;\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 public api \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Open the payment modal for an x402 endpoint and resolve when the call\n * succeeds (after settlement) or reject if the user cancels.\n * @param {import('../types/index.js').PayOptions} opts\n * @returns {Promise<import('../types/index.js').PayResult>}\n */\nexport async function pay(opts) {\n\tif (!opts?.endpoint) throw new Error('X402.pay: endpoint is required');\n\tconst modal = new CheckoutModal(opts);\n\tconst result = modal.mount();\n\t// Kick off discovery on the next tick so the modal animates in first.\n\tqueueMicrotask(() => modal.start());\n\treturn result;\n}\n\nfunction readOptsFrom(el) {\n\tconst ds = el.dataset;\n\tlet body = ds.x402Body;\n\tif (body) {\n\t\ttry { body = JSON.parse(body); } catch { /* keep as string */ }\n\t}\n\tlet headers = ds.x402Headers;\n\tif (headers) {\n\t\ttry { headers = JSON.parse(headers); } catch { headers = undefined; }\n\t}\n\tlet caps = ds.x402Caps;\n\tif (caps) {\n\t\ttry { caps = JSON.parse(caps); } catch { caps = undefined; }\n\t}\n\treturn {\n\t\tendpoint: ds.x402Endpoint,\n\t\tmethod: ds.x402Method || (body ? 'POST' : 'GET'),\n\t\tbody,\n\t\theaders,\n\t\tcaps,\n\t\tapiOrigin: ds.x402ApiOrigin,\n\t\tmerchant: ds.x402Merchant,\n\t\taction: ds.x402Action || el.textContent?.trim().slice(0, 60),\n\t};\n}\n\nfunction bindElement(el) {\n\tif (el.dataset.x402Bound === '1') return;\n\tel.dataset.x402Bound = '1';\n\tel.addEventListener('click', async (e) => {\n\t\te.preventDefault();\n\t\tconst opts = readOptsFrom(el);\n\t\ttry {\n\t\t\tconst out = await pay(opts);\n\t\t\tif (out?.siwx) {\n\t\t\t\tel.dispatchEvent(new CustomEvent('x402:siwx-signed', { detail: out.siwx, bubbles: true }));\n\t\t\t}\n\t\t\tel.dispatchEvent(new CustomEvent('x402:result', { detail: out, bubbles: true }));\n\t\t} catch (err) {\n\t\t\tif (err?.code === 'cancelled') return;\n\t\t\tel.dispatchEvent(new CustomEvent('x402:error', { detail: { error: err?.message || String(err) }, bubbles: true }));\n\t\t}\n\t});\n}\n\n/** Scan the document and bind every `[data-x402-endpoint]` element. Idempotent. */\nexport function init() {\n\tif (typeof document === 'undefined') return;\n\tdocument.querySelectorAll('[data-x402-endpoint]').forEach(bindElement);\n}\n\nexport { VERSION as version, bindElement, readOptsFrom };\n"],
  "mappings": "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",
  "names": ["text", "init"]
}
