@manifoldxyz/dropkit 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/react/useMint.ts","../src/core/rpc/index.ts","../src/core/errors.ts","../src/core/wallet/index.ts","../src/core/adapters/manifold-claim/index.ts","../src/core/adapters/manifold-claim/abis.ts","../src/core/adapters/manifold-claim/merkle.ts","../src/core/adapters/contract/index.ts","../src/core/machine.ts","../src/core/adapters/receipt.ts","../src/core/friendly-errors.ts","../src/react/MintButton.ts"],"sourcesContent":["export const VERSION = '0.1.0';\n\n// React surface (story s7).\nexport { MintButton, useMint } from './react';\nexport type { MintButtonProps, MintState, UseMintOptions } from './react';\n\n// Core types an agent writes or reads.\nexport type {\n Address,\n ArgTemplate,\n Attempt,\n ContractConfig,\n DropInfo,\n Erc20Ref,\n FieldSource,\n Hex,\n ManifoldClaimConfig,\n MintConfig,\n MintEvent,\n MintEventType,\n MintResult,\n MintedToken,\n Money,\n RpcUrls,\n WalletInfo,\n} from './core/types';\nexport { MINT_STATES, CLICKABLE_STATES, MAX_QUANTITY } from './core/machine';\nexport type { MintStateName } from './core/machine';\nexport { MintError, isMintError, REASON_CODES } from './core/errors';\nexport type { ErrorReason, IneligibleReason, ReasonCode, UnsupportedReason } from './core/errors';\n","// Story s7: the React layer. One useReducer over core/machine per instance, no globals.\n// Spec: docs/specs/mint-button.html #package-api, #ui-ux-flow, #state-management, #edge-cases.\nimport { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { BaseError, ExecutionRevertedError, publicActions, type PublicClient, type WalletClient } from 'viem';\n\nimport { createReadClient, getChain } from '../core/rpc';\nimport { getAccount, getWalletClient, loadConnectWidget, openConnectModal, subscribeAccount, switchToChain } from '../core/wallet';\nimport { manifoldClaimAdapter } from '../core/adapters/manifold-claim';\nimport { contractAdapter } from '../core/adapters/contract';\nimport { parseMintReceipt } from '../core/adapters/receipt';\nimport { MintError, UNSUPPORTED_REASONS, isMintError } from '../core/errors';\nimport type { ErrorReason, ReasonCode, UnsupportedReason } from '../core/errors';\nimport { friendlyErrorMessage } from '../core/friendly-errors';\nimport {\n IN_FLIGHT_STATES,\n canAct as coreCanAct,\n initialState,\n reducer,\n selectMaxQuantity,\n selectTotal,\n} from '../core/machine';\nimport type { Account, MachineState, MintStateName } from '../core/machine';\nimport type { AdapterContext, MintAdapter, MintPlan, ReceiptLog, TxRequest, WalletRead } from '../core/adapters/types';\nimport type { Address, Attempt, DropInfo, Hex, MintConfig, MintEvent, MintEventType, MintResult, Money, RpcUrls, WalletInfo } from '../core/types';\n\n/** Options for useMint and the props MintButton forwards to it (spec #package-api). */\nexport type UseMintOptions = {\n config: MintConfig;\n /** chainId -> JSON-RPC URL (agent's domain-restricted key). */\n rpcUrls?: RpcUrls;\n /** Defaults to the connected wallet. */\n recipient?: Address;\n /** Controlled when onQuantityChange is also supplied. */\n quantity?: number;\n onQuantityChange?: (quantity: number) => void;\n connect?: { walletConnectProjectId?: string };\n onEvent?: (event: MintEvent) => void;\n};\n\n/** Spec #data-models table 2. */\nexport type MintState = {\n state: MintStateName;\n reason: ReasonCode | null;\n message: string | null;\n drop: DropInfo | null;\n wallet: WalletInfo | null;\n quantity: number;\n setQuantity: (quantity: number) => void;\n maxQuantity: number | null;\n total: { native: Money; erc20: Money | null } | null;\n mint: () => void;\n result: MintResult | null;\n refresh: () => Promise<void>;\n canAct: boolean;\n};\n\nconst REFRESH_MS = 30_000;\nconst TICK_MS = 1_000;\nconst ASYNC_STATES: readonly MintStateName[] = ['loading', 'connecting', 'switching-chain', 'approving', 'minting', 'confirming'];\n\nexport function isAsyncState(name: MintStateName): boolean {\n return ASYNC_STATES.includes(name);\n}\n\nconst nowSec = (): number => Math.floor(Date.now() / 1000);\n\n/** Stable identity for a config: a change starts a new read lifetime (new AbortController + cacheScope). */\nfunction configKeyOf(config: MintConfig): string {\n return JSON.stringify(config, (_k, v) => (typeof v === 'bigint' ? { __dropkitBigInt: v.toString() } : v));\n}\n\nfunction adapterFor(config: MintConfig): MintAdapter {\n return (config.type === 'manifold-claim' ? manifoldClaimAdapter : contractAdapter) as unknown as MintAdapter;\n}\n\n/** The Manifold read bridge only serves the Manifold preset's allowlisted contracts (spec #api-endpoints). */\nconst bridgeEnabled = (config: MintConfig): boolean => config.type === 'manifold-claim';\n\n/** Logs come from the creator contract for the preset, else config.tokenContract ?? the mint target. */\nfunction tokenContractOf(config: MintConfig): Address {\n return config.type === 'manifold-claim' ? config.creatorContract : (config.tokenContract ?? config.address);\n}\n\n/** onEvent payload address: the preset reports the creator contract (never a wallet). */\nfunction eventAddressOf(config: MintConfig): Address {\n return config.type === 'manifold-claim' ? config.creatorContract : config.address;\n}\n\nconst isUnsupported = (reason: ReasonCode): reason is UnsupportedReason => (UNSUPPORTED_REASONS as readonly string[]).includes(reason);\n\nfunction isRejection(error: unknown): boolean {\n for (let e = error as { code?: unknown; cause?: unknown } | undefined, depth = 0; e && depth < 8; depth++) {\n if (e.code === 4001) return true;\n e = e.cause as typeof e;\n }\n return false;\n}\n\n/** MintError keeps its reason; a bare wallet rejection becomes USER_REJECTED; anything else is an RPC error. */\nfunction toReason(e: unknown): { reason: ReasonCode; message: string } {\n if (isMintError(e)) return { reason: e.reason, message: friendlyErrorMessage(e) };\n if (isRejection(e)) return { reason: 'USER_REJECTED', message: 'You rejected the request.' };\n for (let cause = e as { name?: string; cause?: unknown } | undefined, depth = 0; cause && depth < 8; depth++) {\n if (cause.name === 'ChainMismatchError') return { reason: 'CHAIN_SWITCH_FAILED', message: 'The wallet network changed before the transaction was sent.' };\n cause = cause.cause as typeof cause;\n }\n return { reason: 'RPC_ERROR', message: friendlyErrorMessage(e) };\n}\n\nfunction errorReasonOf(e: unknown): { reason: ErrorReason; message: string } {\n const { reason, message } = toReason(e);\n const ok: readonly string[] = ['USER_REJECTED', 'TX_REVERTED', 'RATE_LIMITED', 'RPC_ERROR', 'CHAIN_SWITCH_FAILED', 'ALLOWLIST_UNAVAILABLE'];\n return { reason: (ok.includes(reason) ? reason : 'RPC_ERROR') as ErrorReason, message };\n}\n\nfunction explorerUrlFor(chainId: number, hash: Hex): string | null {\n try {\n const url = getChain(chainId).blockExplorers?.default.url;\n return url ? `${url.replace(/\\/$/, '')}/tx/${hash}` : null;\n } catch {\n return null;\n }\n}\n\n/** A read lifetime: one AbortController + one stable cacheScope per hook/config, shared across refreshes. */\ntype Lifetime = {\n key: string;\n controller: AbortController;\n /** Stable object identity for the whole lifetime (adapters key their shared fetches on it). */\n cacheScope: object;\n /** Current read generation; a result from another generation is dropped. */\n gen: number;\n client?: PublicClient;\n rpcUrl?: string;\n};\n\nconst receiptOk = (status: unknown): boolean => status === 'success' || status === 1 || status === 1n || status === '0x1';\n\ntype Receiptish = { status?: unknown; logs?: readonly ReceiptLog[]; transactionHash?: Hex };\n\nexport function useMint(options: UseMintOptions): MintState {\n const { config, recipient, quantity: quantityProp, connect } = options;\n\n const [machine, rawDispatch] = useReducer(reducer, undefined, () => initialState({ quantity: quantityProp }));\n /** Widget verdict is held OUTSIDE the reducer so a later successful drop read cannot overwrite it (AC-20). */\n const [widgetFail, setWidgetFail] = useState<{ reason: ReasonCode; message: string } | null>(null);\n const [widgetRetry, setWidgetRetry] = useState(0);\n\n const configKey = configKeyOf(config);\n\n\n // --- refs: everything the stable callbacks and async flows read.\n const mounted = useRef(false);\n const stateRef = useRef(machine);\n const propsRef = useRef(options);\n const lifeRef = useRef<Lifetime | null>(null);\n const genRef = useRef(0);\n const attemptRef = useRef<Attempt | null>(null);\n const attemptIdRef = useRef(0);\n const accountKeyRef = useRef<string | null>(null);\n const connectingRef = useRef(false);\n const pendingRefreshRef = useRef(false);\n const pendingQuantityRef = useRef<number | null>(null);\n const widgetFailRef = useRef<{ reason: ReasonCode; message: string } | null>(null);\n const widgetLoadRef = useRef<Promise<void> | null>(null);\n const pushAccountRef = useRef<((a: Account | null) => void) | null>(null);\n\n // Mirrors of the committed render: the async flows and the stable callbacks read these instead of\n // closing over one render's values. Written on commit, never during render.\n useEffect(() => {\n stateRef.current = machine;\n propsRef.current = options;\n widgetFailRef.current = widgetFail;\n });\n\n const dispatch = useCallback<typeof rawDispatch>((event) => {\n // Nothing may touch React state after unmount (spec #edge-cases) or for a dead lifecycle.\n if (!mounted.current) return;\n stateRef.current = reducer(stateRef.current, event);\n rawDispatch(event);\n }, []);\n\n const emit = useCallback((type: MintEventType, over: Partial<MintEvent> = {}) => {\n const handler = propsRef.current.onEvent;\n if (!handler || !mounted.current) return;\n const cfg = attemptRef.current?.config ?? propsRef.current.config;\n const s = stateRef.current;\n const payload: MintEvent = {\n type,\n state: s.name,\n reason: s.reason,\n chainId: cfg.chainId,\n quantity: s.quantity,\n config: { type: cfg.type, chainId: cfg.chainId, address: eventAddressOf(cfg) },\n ...over,\n };\n // Consumer analytics must not interrupt a transaction or change its outcome.\n try { handler(payload); } catch { /* the host owns its callback errors */ }\n }, []);\n\n // ---------------------------------------------------------------- reads\n\n const clientFor = useCallback((life: Lifetime, cfg: MintConfig): PublicClient => {\n const rpcUrl = propsRef.current.rpcUrls?.[cfg.chainId];\n if (!life.client || life.rpcUrl !== rpcUrl) {\n life.rpcUrl = rpcUrl;\n life.client = createReadClient({ chainId: cfg.chainId, rpcUrls: propsRef.current.rpcUrls, useBridge: bridgeEnabled(cfg) });\n }\n return life.client;\n }, []);\n\n const ctxFor = useCallback(\n (life: Lifetime, cfg: MintConfig): AdapterContext => ({\n client: clientFor(life, cfg),\n cacheScope: life.cacheScope,\n // The lifetime signal: a config change or unmount cancels every adapter call, including shared merkle fetches.\n signal: life.controller.signal,\n }),\n [clientFor],\n );\n\n const readDrop = useCallback(\n async (life: Lifetime, gen: number, cfg: MintConfig): Promise<void> => {\n const adapter = adapterFor(cfg);\n try {\n const drop = await adapter.readDrop(ctxFor(life, cfg), cfg);\n if (life.controller.signal.aborted || life.gen !== gen || lifeRef.current !== life) return;\n dispatch({ type: 'DROP_LOADED', gen, drop, now: Math.max(stateRef.current.now, nowSec()) });\n } catch (e) {\n if (life.controller.signal.aborted || life.gen !== gen || lifeRef.current !== life) return;\n const { reason, message } = toReason(e);\n if (isUnsupported(reason)) dispatch({ type: 'DROP_UNSUPPORTED', gen, reason, message });\n else dispatch({ type: 'READ_FAILED', gen, ...errorReasonOf(e) });\n }\n },\n [ctxFor, dispatch],\n );\n\n const startLifetime = useCallback(\n (key: string, cfg: MintConfig) => {\n const prev = lifeRef.current;\n lifeRef.current = null;\n prev?.controller.abort();\n const gen = ++genRef.current;\n const life: Lifetime = { key, controller: new AbortController(), cacheScope: {}, gen };\n lifeRef.current = life;\n dispatch({ type: 'LOAD', gen, kind: 'config' });\n void readDrop(life, gen, cfg);\n },\n [dispatch, readDrop],\n );\n\n const refreshNow = useCallback(\n async (kind: 'refresh' | 'config' = 'refresh'): Promise<void> => {\n const life = lifeRef.current;\n if (!life || !mounted.current) return;\n if (connectingRef.current || attemptRef.current || stateRef.current.attempt) {\n pendingRefreshRef.current = true;\n return;\n }\n const gen = ++genRef.current;\n life.gen = gen;\n dispatch({ type: 'LOAD', gen, kind });\n await readDrop(life, gen, propsRef.current.config);\n },\n [dispatch, readDrop],\n );\n\n const refresh = useCallback(() => refreshNow('refresh'), [refreshNow]);\n\n /** True while a click owns the flow: the synchronous claim wins before the reducer has moved. */\n const isBusy = useCallback(\n () => connectingRef.current || attemptRef.current !== null || stateRef.current.attempt !== null || IN_FLIGHT_STATES.includes(stateRef.current.name),\n [],\n );\n\n // ---------------------------------------------------------------- mint\n\n const executeAttempt = useCallback(\n async (attempt: Attempt, walletRead: WalletRead, life: Lifetime, account: Account): Promise<void> => {\n const cfg = attempt.config;\n const adapter = adapterFor(cfg);\n const ctx = ctxFor(life, cfg);\n const client = clientFor(life, cfg);\n\n /** The frozen payer must still be the selected wallet before every prompt. */\n const assertActive = (): void => {\n if (!mounted.current || life.controller.signal.aborted || lifeRef.current !== life || attemptRef.current !== attempt) {\n throw new DOMException('Mint attempt cancelled', 'AbortError');\n }\n };\n const assertPayer = (): void => {\n assertActive();\n const live = getAccount();\n if (!live || live.address.toLowerCase() !== attempt.payer.toLowerCase()) {\n throw new MintError('USER_REJECTED', 'The connected wallet changed before the transaction was sent.');\n }\n // The widget's cached chain can lag a successful switch. sendTransaction below\n // verifies the actual provider chain via viem, with the frozen chain bound.\n };\n\n let wallet: WalletClient | null = null;\n const walletFor = (): WalletClient => {\n if (!wallet) wallet = getWalletClient(attempt.chainId);\n return wallet;\n };\n\n const submit = async (tx: TxRequest): Promise<Hex> => {\n assertPayer();\n const w = walletFor() as unknown as {\n sendTransaction: (a: Record<string, unknown>) => Promise<Hex>;\n };\n return w.sendTransaction({ account: attempt.payer, to: tx.to, data: tx.data, value: tx.value, chain: getChain(attempt.chainId) });\n };\n\n const waitReceipt = async (hash: Hex): Promise<Receiptish> => {\n let cancelled = false;\n const params = {\n hash,\n confirmations: 1,\n timeout: 120_000,\n onReplaced: ({ reason }: { reason: string }) => {\n // Only repricing preserves the signed mint intent. Other replacements may succeed without minting.\n if (reason !== 'repriced') cancelled = true;\n },\n };\n let receipt: Receiptish;\n try {\n receipt = await client.waitForTransactionReceipt(params);\n } catch (e) {\n assertActive();\n if (cancelled) throw new MintError('USER_REJECTED', 'The transaction was cancelled or replaced with a different transaction.');\n // WalletClient has no receipt actions until explicitly extended with publicActions.\n if (await walletFor().getChainId() !== attempt.chainId) throw e;\n assertActive();\n receipt = await walletFor().extend(publicActions).waitForTransactionReceipt(params);\n }\n assertActive();\n if (cancelled) throw new MintError('USER_REJECTED', 'The transaction was cancelled or replaced with a different transaction.');\n return receipt;\n };\n\n // 1. wrong chain: switch before anything is signed (AC-4).\n assertPayer();\n if (account.chainId !== attempt.chainId) {\n dispatch({ type: 'SWITCHING_CHAIN', attemptId: attempt.attemptId });\n await switchToChain(attempt.chainId);\n }\n assertPayer();\n\n // 2. plan for the frozen attempt.\n let plan: MintPlan = await adapter.buildPlan(ctx, attempt, walletRead);\n assertPayer();\n\n // 3. ERC20 approval leg, simulated through the read client immediately before the prompt (AC-7).\n if (plan.approve) {\n const a = plan.approve;\n try {\n const simulated = await client.call({ account: attempt.payer, to: a.tx.to, data: a.tx.data, value: a.tx.value });\n if (simulated.data && simulated.data !== '0x' && BigInt(simulated.data) === 0n) {\n throw new MintError('SIMULATION_REVERTED', 'The token refused the approval.');\n }\n } catch (e) {\n if (isMintError(e)) throw e;\n const reverted = e instanceof BaseError ? e.walk(cause => cause instanceof ExecutionRevertedError) : null;\n if (reverted instanceof ExecutionRevertedError) {\n throw new MintError('SIMULATION_REVERTED', reverted.shortMessage);\n }\n throw e;\n }\n assertPayer();\n dispatch({ type: 'APPROVING', attemptId: attempt.attemptId });\n const approveHash = await submit(a.tx);\n assertActive();\n emit('approve-submitted', { state: 'approving', reason: null, txHash: approveHash, quantity: attempt.quantity, chainId: attempt.chainId });\n const approveReceipt = await waitReceipt(approveHash);\n assertActive();\n if (!receiptOk(approveReceipt.status)) {\n throw new MintError('TX_REVERTED', `The approval transaction reverted (${approveHash}).`);\n }\n // Approval does not guarantee the drop is still live or the recipient is still eligible.\n const freshDrop = await adapter.readDrop(ctx, cfg);\n assertActive();\n const freshWallet = await adapter.readWallet(ctx, cfg, {\n payer: attempt.payer,\n recipient: attempt.recipient,\n quantity: attempt.quantity,\n drop: freshDrop,\n });\n assertPayer();\n let checked = reducer(initialState({ quantity: attempt.quantity }), { type: 'ACCOUNT_CHANGED', account });\n checked = reducer(checked, { type: 'DROP_LOADED', gen: checked.readGen, drop: freshDrop, now: nowSec() });\n checked = reducer(checked, { type: 'WALLET_LOADED', gen: checked.walletGen, read: freshWallet });\n if (checked.name !== 'live' || (selectMaxQuantity(checked) ?? 0) < attempt.quantity) {\n throw new MintError(checked.reason ?? 'SIMULATION_REVERTED', checked.message ?? 'The drop is no longer available for this quantity.');\n }\n plan = await adapter.buildPlan(ctx, attempt, freshWallet);\n assertPayer();\n }\n\n // 4. simulate the mint from the payer: a revert never becomes a wallet prompt (AC-13).\n await adapter.simulate(ctx, attempt, plan);\n assertPayer();\n\n // 5. mint prompt.\n dispatch({ type: 'MINT_PROMPTED', attemptId: attempt.attemptId });\n const hash = await submit(plan.mint);\n assertActive();\n dispatch({ type: 'TX_SUBMITTED', attemptId: attempt.attemptId });\n emit('tx-submitted', { state: 'confirming', reason: null, txHash: hash, quantity: attempt.quantity, chainId: attempt.chainId });\n\n const receipt = await waitReceipt(hash);\n assertActive();\n const confirmedHash = receipt.transactionHash ?? hash;\n if (!receiptOk(receipt.status)) {\n throw new MintError('TX_REVERTED', `The mint transaction reverted (${confirmedHash}).`);\n }\n const tokens = parseMintReceipt(receipt.logs ?? [], {\n tokenContract: plan.tokenContract ?? attempt.tokenContract,\n recipient: attempt.recipient,\n });\n const result: MintResult = { txHash: confirmedHash, explorerUrl: explorerUrlFor(attempt.chainId, confirmedHash), tokens };\n dispatch({ type: 'ATTEMPT_SUCCEEDED', attemptId: attempt.attemptId, result });\n emit('success', { state: 'success', reason: null, txHash: confirmedHash, quantity: attempt.quantity, chainId: attempt.chainId });\n },\n [clientFor, ctxFor, dispatch, emit],\n );\n\n const runMint = useCallback(async (): Promise<void> => {\n if (!mounted.current) return;\n if (attemptRef.current !== null) return; // synchronous guard before any retry or await\n if (widgetFailRef.current) {\n if (isUnsupported(widgetFailRef.current.reason)) return;\n widgetFailRef.current = null;\n setWidgetFail(null);\n setWidgetRetry(n => n + 1);\n void refreshNow('config');\n return;\n }\n\n const s = stateRef.current;\n if (!coreCanAct(s) || s.attempt !== null) return;\n\n // --- connect\n if (s.name === 'disconnected') {\n if (connectingRef.current) return;\n connectingRef.current = true;\n dispatch({ type: 'CONNECT_STARTED' });\n const connectLife = lifeRef.current;\n const active = () => mounted.current && lifeRef.current === connectLife && !connectLife?.controller.signal.aborted;\n try {\n await widgetLoadRef.current;\n if (!active()) return;\n const outcome = await openConnectModal();\n if (!active()) return;\n connectingRef.current = false;\n if (outcome === 'connected') {\n accountKeyRef.current = null;\n pushAccountRef.current?.(getAccount());\n }\n else dispatch({ type: 'CONNECT_DISMISSED' });\n } catch {\n if (active()) dispatch({ type: 'CONNECT_DISMISSED' });\n } finally {\n connectingRef.current = false;\n }\n return;\n }\n\n // --- reset after a terminal state: a fresh drop + wallet read must land before the button is live again.\n if (s.name === 'success' || s.name === 'error') {\n const life = lifeRef.current;\n const gen = ++genRef.current;\n if (life) life.gen = gen;\n dispatch({ type: 'RESET', gen });\n // Current core RESET retains the old drop. Clear it before the wallet effect can read.\n dispatch({ type: 'LOAD', gen, kind: 'config' });\n if (life) void readDrop(life, gen, propsRef.current.config);\n return;\n }\n\n if (s.name !== 'live') return;\n const account = s.account;\n const walletRead = s.walletRead;\n const life = lifeRef.current;\n if (!account || !walletRead || !life) return;\n\n const cfg = propsRef.current.config;\n const attempt: Attempt = Object.freeze({\n attemptId: ++attemptIdRef.current,\n config: structuredClone(cfg),\n payer: account.address,\n recipient: propsRef.current.recipient ?? account.address,\n quantity: s.quantity,\n chainId: cfg.chainId,\n tokenContract: tokenContractOf(cfg),\n });\n attemptRef.current = attempt;\n dispatch({ type: 'ATTEMPT_STARTED', attempt });\n emit('attempt', { state: 'live', reason: null, quantity: attempt.quantity, chainId: attempt.chainId });\n\n try {\n await executeAttempt(attempt, walletRead, life, account);\n } catch (e) {\n if (!mounted.current || life.controller.signal.aborted || lifeRef.current !== life) return;\n const { reason, message } = toReason(e);\n dispatch({ type: 'ATTEMPT_FAILED', attemptId: attempt.attemptId, reason, message });\n emit('error', { quantity: attempt.quantity, chainId: attempt.chainId });\n } finally {\n attemptRef.current = null;\n }\n }, [dispatch, emit, readDrop, executeAttempt, refreshNow]);\n\n const mint = useCallback(() => {\n void runMint();\n }, [runMint]);\n\n // ---------------------------------------------------------------- effects (none run on the server)\n\n // Declared first so a StrictMode remount re-arms before the read effects run.\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n lifeRef.current?.controller.abort();\n lifeRef.current = null;\n };\n }, []);\n\n // Account subscription, de-duplicated by address:chainId:recipient so one real change is read once.\n useEffect(() => {\n const push = (a: Account | null): void => {\n const key = a ? `${a.address.toLowerCase()}:${a.chainId}:${(propsRef.current.recipient ?? '').toLowerCase()}` : 'null';\n if (key === accountKeyRef.current) return;\n accountKeyRef.current = key;\n if (attemptRef.current || stateRef.current.attempt) pendingRefreshRef.current = true;\n dispatch({ type: 'ACCOUNT_CHANGED', account: a });\n };\n pushAccountRef.current = push;\n push(getAccount());\n const unsubscribe = subscribeAccount(push);\n return () => {\n unsubscribe();\n };\n }, [dispatch]);\n\n // Recipient change: the same wallet needs a fresh eligibility read for the new recipient.\n const recipientRef = useRef(recipient);\n useEffect(() => {\n if (isBusy() || recipientRef.current === recipient) return;\n recipientRef.current = recipient;\n accountKeyRef.current = null;\n pushAccountRef.current?.(getAccount());\n }, [recipient, machine.attempt, isBusy]);\n\n // Connect widget: the verdict lives outside the reducer and wins over the derived state (AC-20).\n const projectId = connect?.walletConnectProjectId;\n useEffect(() => {\n let alive = true;\n const loading = loadConnectWidget({ chainIds: [config.chainId], ...(projectId ? { walletConnectProjectId: projectId } : {}) });\n widgetLoadRef.current = loading;\n loading.then(\n () => {\n if (alive) setWidgetFail(null);\n },\n (e: unknown) => {\n if (!alive) return;\n const { reason, message } = toReason(e);\n setWidgetFail({ reason, message });\n },\n );\n return () => {\n alive = false;\n };\n }, [config.chainId, projectId, widgetRetry]);\n\n // Read lifetime. No dependency array: a deferred config change is applied on the render after the\n // attempt reaches a terminal state (spec #state-management \"Attempt snapshot\").\n useEffect(() => {\n if (!mounted.current) return;\n if (isBusy()) return; // frozen until terminal\n if (pendingQuantityRef.current !== null) {\n const quantity = pendingQuantityRef.current;\n pendingQuantityRef.current = null;\n dispatch({ type: 'SET_QUANTITY', quantity });\n }\n if (lifeRef.current?.key !== configKey) {\n pendingRefreshRef.current = false;\n startLifetime(configKey, config);\n } else if (pendingRefreshRef.current || lifeRef.current.rpcUrl !== options.rpcUrls?.[config.chainId]) {\n pendingRefreshRef.current = false;\n void refreshNow();\n }\n });\n\n // Quantity changes also change simulation inputs and gas reserve. Invalidate before re-reading.\n const previousQuantity = useRef(machine.quantity);\n useEffect(() => {\n if (previousQuantity.current === machine.quantity || isBusy()) return;\n previousQuantity.current = machine.quantity;\n if (stateRef.current.walletRead) dispatch({ type: 'ACCOUNT_CHANGED', account: stateRef.current.account });\n }, [machine.quantity, machine.attempt, dispatch, isBusy]);\n\n // Wallet read: bound to the current account, drop and quantity.\n const loadedDrop = machine.drop;\n const walletGen = machine.walletGen;\n const account = machine.account;\n const lastWalletRead = useRef<{ drop: DropInfo; gen: number; quantity: number } | null>(null);\n useEffect(() => {\n if (!account || !loadedDrop || isBusy()) return;\n // A failed preflight remains blocked until its inputs change or a fresh drop arrives.\n const previous = lastWalletRead.current;\n if (stateRef.current.blocked && previous?.drop === loadedDrop && previous.gen === walletGen && previous.quantity === machine.quantity) return;\n lastWalletRead.current = { drop: loadedDrop, gen: walletGen, quantity: machine.quantity };\n const life = lifeRef.current;\n const drop = stateRef.current.drop;\n if (!life || !drop || life.key !== configKeyOf(propsRef.current.config)) return;\n const readGen = life.gen;\n const cfg = propsRef.current.config;\n const adapter = adapterFor(cfg);\n let alive = true;\n void (async () => {\n try {\n const read = await adapter.readWallet(ctxFor(life, cfg), cfg as never, {\n payer: account.address,\n recipient: propsRef.current.recipient ?? account.address,\n quantity: stateRef.current.quantity,\n drop,\n });\n if (!alive || life.controller.signal.aborted || lifeRef.current !== life || life.gen !== readGen) return;\n // A preflight revert arrives as data, not a thrown error, so it gets the same public text here.\n const ineligible = read.ineligible?.reason === 'SIMULATION_REVERTED'\n ? { ...read.ineligible, message: friendlyErrorMessage(new MintError('SIMULATION_REVERTED', read.ineligible.message)) }\n : read.ineligible;\n dispatch({ type: 'WALLET_LOADED', gen: walletGen, read: { ...read, ineligible } });\n } catch (e) {\n if (!alive || life.controller.signal.aborted || lifeRef.current !== life || life.gen !== readGen) return;\n dispatch({ type: 'WALLET_FAILED', gen: walletGen, ...errorReasonOf(e) });\n }\n })();\n return () => {\n alive = false;\n };\n }, [account, loadedDrop, walletGen, machine.quantity, machine.attempt, ctxFor, dispatch, isBusy]);\n\n // Controlled quantity: the prop is the source of truth.\n const prevQuantityProp = useRef(quantityProp);\n useEffect(() => {\n if (isBusy()) return;\n const propChanged = prevQuantityProp.current !== quantityProp;\n prevQuantityProp.current = quantityProp;\n if (quantityProp === undefined || (!propChanged && !propsRef.current.onQuantityChange)) return;\n const state = stateRef.current;\n // Do not oscillate between the supply cap and a tighter wallet cap while wallet reads are pending.\n if (!propChanged && state.account && !state.walletRead) return;\n const event = { type: 'SET_QUANTITY' as const, quantity: quantityProp };\n const clamped = reducer(state, event).quantity;\n if (clamped !== state.quantity) dispatch(event);\n if (clamped !== quantityProp) propsRef.current.onQuantityChange?.(clamped);\n }, [quantityProp, machine.quantity, machine.drop, machine.walletRead, machine.attempt, dispatch, isBusy]);\n\n // Freshness: re-read every 30s and on visibilitychange (spec #state-management).\n useEffect(() => {\n const timer = setInterval(() => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n void refreshNow('refresh');\n }, REFRESH_MS);\n const onVisible = (): void => {\n if (document.visibilityState === 'visible') void refreshNow('refresh');\n };\n document.addEventListener('visibilitychange', onVisible);\n return () => {\n clearInterval(timer);\n document.removeEventListener('visibilitychange', onVisible);\n };\n }, [refreshNow]);\n\n // Clock: only runs while a start/end boundary is still ahead, so an idle button never re-renders.\n const boundary = machine.drop\n ? [machine.drop.startTime, machine.drop.endTime].some((t) => t !== null && t > machine.now)\n : false;\n useEffect(() => {\n if (!boundary) return;\n const timer = setInterval(() => {\n const s = stateRef.current;\n const now = nowSec();\n const crossed = s.drop && [s.drop.startTime, s.drop.endTime].some(t => t !== null && t > s.now && t <= now);\n dispatch({ type: 'TICK', now });\n if (crossed) void refreshNow();\n }, TICK_MS);\n return () => clearInterval(timer);\n }, [boundary, dispatch, refreshNow]);\n\n // 'state' events (spec #package-api onEvent payload).\n const prevName = useRef<MintStateName | null>(null);\n useEffect(() => {\n const name = widgetFail ? (isUnsupported(widgetFail.reason) ? 'unsupported' : 'error') : machine.name;\n if (prevName.current === name) return;\n prevName.current = name;\n emit('state', { state: name, reason: widgetFail?.reason ?? machine.reason });\n }, [machine.name, machine.reason, widgetFail, emit]);\n\n // ---------------------------------------------------------------- public state\n\n const setQuantity = useCallback(\n (next: number) => {\n const s = stateRef.current;\n const max = selectMaxQuantity(s) ?? 65535;\n const clamped = Math.max(1, Math.min(Math.floor(Number.isNaN(next) ? 1 : next), max));\n const handler = propsRef.current.onQuantityChange;\n if (handler) {\n handler(clamped); // controlled: the prop drives m.quantity\n return;\n }\n if (attemptRef.current) {\n pendingQuantityRef.current = clamped;\n return;\n }\n dispatch({ type: 'SET_QUANTITY', quantity: clamped });\n if (s.quantity !== stateRef.current.quantity) {\n dispatch({ type: 'ACCOUNT_CHANGED', account: stateRef.current.account });\n }\n },\n [dispatch],\n );\n\n\n const effective: Pick<MachineState, 'name' | 'reason' | 'message'> = widgetFail\n ? { name: isUnsupported(widgetFail.reason) ? 'unsupported' : 'error', reason: widgetFail.reason, message: widgetFail.message }\n : { name: machine.name, reason: machine.reason, message: machine.message };\n\n const wallet: WalletInfo | null =\n machine.account && machine.walletRead\n ? {\n address: machine.account.address,\n chainId: machine.account.chainId,\n recipient: recipient ?? machine.account.address,\n walletMinted: machine.walletRead.walletMinted,\n walletMax: machine.walletRead.walletMax,\n allowlistRemaining: machine.walletRead.allowlistRemaining,\n }\n : null;\n\n return {\n state: effective.name,\n reason: effective.reason,\n message: effective.message,\n drop: machine.drop,\n wallet,\n quantity: machine.quantity,\n setQuantity,\n maxQuantity: selectMaxQuantity(machine),\n total: selectTotal(machine),\n mint,\n result: machine.result,\n refresh,\n // An attempt claimed by a click is not clickable, even while the reducer still reads 'live'.\n canAct: coreCanAct({ ...machine, name: effective.name }) && machine.attempt === null,\n };\n}\n","// Interface contract (orchestrator-owned). Implementation: story s4. Spec D7 + #api-endpoints.\nimport { createPublicClient, http, type Chain, type EIP1193RequestFn, type PublicClient, type Transport } from 'viem';\nimport { apeChain, base, mainnet, optimism, sepolia, shape } from 'viem/chains';\nimport type { RpcUrls } from '../types';\nimport { MintError } from '../errors';\n\n/** Manifold read bridge per chain (allowlisted contracts + methods only; no receipts). */\nexport const BRIDGE_URLS: Readonly<Record<number, string>> = {\n 1: 'https://bridge.manifoldxyz.dev/rpc',\n 11155111: 'https://sepolia.bridge.manifoldxyz.dev/rpc',\n 8453: 'https://base.bridge.manifoldxyz.dev/rpc',\n 10: 'https://optimism.bridge.manifoldxyz.dev/rpc',\n 360: 'https://shape.bridge.manifoldxyz.dev/rpc',\n 33139: 'https://apechain.bridge.manifoldxyz.dev/rpc',\n};\n\nconst CHAINS: Readonly<Record<number, Chain>> = {\n [mainnet.id]: mainnet,\n [sepolia.id]: sepolia,\n [base.id]: base,\n [optimism.id]: optimism,\n [shape.id]: shape,\n [apeChain.id]: apeChain,\n};\n\n/** Per-transport request timeout; a slow endpoint falls through to the next one. */\nconst TRANSPORT_TIMEOUT_MS = 8_000;\n\n/** viem chain for an id; throws MintError('INVALID_CONFIG', ..., { field: 'chainId' }) when unknown. */\nexport function getChain(chainId: number): Chain {\n const chain = CHAINS[chainId];\n if (!chain) {\n throw new MintError('INVALID_CONFIG', `chainId ${String(chainId)} is not supported`, { field: 'chainId' });\n }\n return chain;\n}\n\n/** Codes reserved for request/user failures remain final, even under an internal-error wrapper. */\nconst TERMINAL_CODES: ReadonlySet<number> = new Set([3, -32602, -32003, 4001, 4100, 4200, 4900, 4901, 4902]);\n/** Endpoint/routing errors can be answered by another server, unless they also carry execution evidence. */\nconst FALLBACK_CODES: ReadonlySet<number> = new Set([-32700, -32600, -32601, -32001, -32002, -32004, -32005, 429]);\nconst EXECUTION_WORDING = /execution reverted|execution error|\\breverted?\\b|out of gas|invalid opcode|insufficient funds|nonce too low|gas required exceeds/i;\nconst UPSTREAM_WORDING = /\\btimeout\\b|\\btimed out\\b|\\btoo many requests\\b|\\brate limit\\b|\\brequest limit reached\\b|\\b(?:exceeded.*capacity|capacity.*exceeded)\\b|\\bheader not found\\b|\\binternal (?:json-rpc )?(?:server )?error\\b|\\bnon-200 status code:\\s*['\"]?503\\b/i;\nconst TRANSPORT_ERROR_NAMES: ReadonlySet<string> = new Set(['HttpRequestError', 'TimeoutError', 'SocketClosedError', 'WebSocketRequestError']);\n\n/** Inspect nested provider payloads without mistaking a diagnostic request id for EVM return data. */\nfunction carriesExecutionEvidence(value: unknown, seen = new Set<object>()): boolean {\n if (typeof value === 'string') return /^(?:Reverted\\s+)?0x(?:[a-f\\d]{2})*$/i.test(value) || EXECUTION_WORDING.test(value);\n if (!value || typeof value !== 'object' || seen.has(value)) return false;\n seen.add(value);\n const e = value as Record<string, unknown>;\n if (typeof e.code === 'number' && TERMINAL_CODES.has(e.code)) return true;\n if (typeof e.message === 'string' && EXECUTION_WORDING.test(e.message)) return true;\n return ['data', 'error', 'originalError', 'cause', 'result'].some((key) => carriesExecutionEvidence(e[key], seen));\n}\n\n/** Execution evidence anywhere in the ancestry wins. Unknown failures are final, not blanket retries. */\nfunction shouldFallback(err: unknown): boolean {\n let retry = false;\n const seen = new Set<object>();\n for (let e = err; e && typeof e === 'object' && !seen.has(e); ) {\n seen.add(e);\n const error = e as Record<string, unknown>;\n // viem's message embeds request metadata. Prefer provider details to avoid matching request content.\n const message = typeof error.details === 'string' ? error.details : typeof error.shortMessage !== 'string' ? error.message : '';\n if (typeof message === 'string' && EXECUTION_WORDING.test(message)) return false;\n if (carriesExecutionEvidence(error.data)) return false;\n if (typeof error.code === 'number' && TERMINAL_CODES.has(error.code)) return false;\n if (error.name === 'ContractFunctionRevertedError' || error.name === 'ExecutionRevertedError') return false;\n if (typeof error.name === 'string' && TRANSPORT_ERROR_NAMES.has(error.name)) retry = true;\n if (typeof error.code === 'number' && FALLBACK_CODES.has(error.code)) retry = true;\n if (typeof message === 'string' && UPSTREAM_WORDING.test(message)) retry = true;\n e = error.cause;\n }\n return retry;\n}\n\n/**\n * Read client with ordered fallback: rpcUrls[chainId] -> BRIDGE_URLS[chainId] (only when useBridge) ->\n * the chain's default public RPC. A request that fails for a reason that belongs to the endpoint (HTTP error,\n * timeout, rate limit, -32004 Not allowed, recognized internal/server-error or relayed 503 wording,\n * \"header not found\", -32099 capacity) is retried on\n * the next; when all fail it throws MintError('RPC_ERROR') and logs a console hint to pass rpcUrls.\n * Execution results (reverts, identified by revert data or revert wording, and request/user-determined codes)\n * are NOT retried: they surface as-is. See shouldFallback.\n */\nexport function createReadClient(opts: { chainId: number; rpcUrls?: RpcUrls; useBridge: boolean }): PublicClient {\n const chain = getChain(opts.chainId);\n const urls = [opts.rpcUrls?.[opts.chainId], opts.useBridge ? BRIDGE_URLS[opts.chainId] : undefined, chain.rpcUrls.default.http[0]].filter(\n (u, i, all): u is string => !!u && all.indexOf(u) === i,\n );\n\n // Own Transport (not viem's fallback): viem wraps every transport error that is not a viem BaseError,\n // which would hide the MintError('RPC_ERROR') this contract requires.\n const transport: Transport = ({ chain: c, pollingInterval }) => {\n const transports = urls.map((url) => http(url, { timeout: TRANSPORT_TIMEOUT_MS, retryCount: 0 })({ chain: c, pollingInterval, retryCount: 0, timeout: TRANSPORT_TIMEOUT_MS }));\n const request = (async (args: { method: string; params?: unknown }) => {\n let last: unknown;\n for (const t of transports) {\n try {\n return await t.request(args);\n } catch (err) {\n if (!shouldFallback(err)) throw err;\n last = err;\n }\n }\n console.warn(`dropkit: all RPC endpoints failed for chain ${String(opts.chainId)}; pass rpcUrls={{ ${String(opts.chainId)}: '<your RPC url>' }} to <MintButton>.`);\n throw new MintError('RPC_ERROR', `All RPC endpoints failed for chain ${String(opts.chainId)}`, { cause: last });\n }) as EIP1193RequestFn;\n return {\n config: { key: 'dropkit-fallback', name: 'Dropkit fallback', request, retryCount: 0, retryDelay: 0, timeout: TRANSPORT_TIMEOUT_MS, type: 'fallback' },\n request,\n value: {},\n };\n };\n\n return createPublicClient({ chain, transport }) as PublicClient;\n}\n","// Interface contract (orchestrator-owned). Spec: #ui-ux-flow state table.\n\nexport const UNSUPPORTED_REASONS = [\n 'UNKNOWN_EXTENSION',\n 'AMBIGUOUS_EXTENSION',\n 'CLAIM_NOT_FOUND',\n 'SIGNATURE_CLAIM',\n 'INVALID_CONFIG',\n 'CONNECT_WIDGET_TOO_OLD',\n] as const;\n\nexport const INELIGIBLE_REASONS = ['NOT_ON_ALLOWLIST', 'ALLOWLIST_USED', 'WALLET_LIMIT', 'SIMULATION_REVERTED'] as const;\n\nexport const ERROR_REASONS = [\n 'USER_REJECTED',\n 'TX_REVERTED',\n 'RATE_LIMITED',\n 'RPC_ERROR',\n 'CHAIN_SWITCH_FAILED',\n 'ALLOWLIST_UNAVAILABLE',\n] as const;\n\n/** insufficient-funds carries this reason so data-reason is never empty in that state. */\nexport const FUNDS_REASONS = ['INSUFFICIENT_FUNDS'] as const;\n\nexport type UnsupportedReason = (typeof UNSUPPORTED_REASONS)[number];\nexport type IneligibleReason = (typeof INELIGIBLE_REASONS)[number];\nexport type ErrorReason = (typeof ERROR_REASONS)[number];\nexport type ReasonCode = UnsupportedReason | IneligibleReason | ErrorReason | (typeof FUNDS_REASONS)[number];\n\nexport const REASON_CODES: readonly ReasonCode[] = [\n ...UNSUPPORTED_REASONS,\n ...INELIGIBLE_REASONS,\n ...ERROR_REASONS,\n ...FUNDS_REASONS,\n];\n\n/**\n * Thrown by adapters, rpc and wallet code; the hook maps it to the matching state.\n * `message` is plain English and, for INVALID_CONFIG, names the exact bad field\n * (e.g. `mint.args[1] \"{qty}\" is not a known placeholder`).\n */\nexport class MintError extends Error {\n readonly reason: ReasonCode;\n /** INVALID_CONFIG only: dotted path of the bad field, e.g. \"mint.args[1]\" or \"price\". */\n readonly field?: string;\n constructor(reason: ReasonCode, message: string, opts?: { field?: string; cause?: unknown }) {\n super(message, opts?.cause === undefined ? undefined : { cause: opts.cause });\n this.name = 'MintError';\n this.reason = reason;\n if (opts?.field !== undefined) this.field = opts.field;\n }\n}\n\nexport function isMintError(e: unknown): e is MintError {\n return e instanceof MintError;\n}\n\nexport function notImplemented(story: string): never {\n throw new Error(`not implemented (${story})`);\n}\n","// Interface contract (orchestrator-owned). Implementation: story s4. Spec #state-management\n// \"Connect widget lifecycle\" + Q20 (no getProvider; use ManifoldEthereumProvider).\nimport { createWalletClient, custom, getAddress, type EIP1193Provider, type WalletClient } from 'viem';\nimport type { Account } from '../machine';\nimport { MintError } from '../errors';\nimport { getChain } from '../rpc';\n\nexport const CONNECT_WIDGET_VERSION = '6.4.0';\nexport const CONNECT_BASE_URL = `https://connect.manifoldxyz.dev/${CONNECT_WIDGET_VERSION}`;\nexport const CONNECT_ID = 'mint-button';\n/** Event names copied from @manifoldxyz/frontend-provider-types (not imported). */\nexport const ADDRESS_CHANGED = 'ethereum-address-changed';\nexport const CHAIN_CHANGED = 'frontend-provider-chain-changed';\nexport const LOADER_KEY = '__manifoldMintConnectLoader';\n\nexport type ConnectOptions = { chainIds: number[]; walletConnectProjectId?: string };\n\ntype ConnectGlobal = { version?: string; capabilities?: string[]; ready?: Promise<unknown> };\ntype EthProviderGlobal = {\n selectedAddress?: () => string | undefined;\n chainId?: () => number | undefined;\n provider?: (withSigner?: boolean) => { provider?: EIP1193Provider } | undefined;\n browserChainId?: () => number | undefined;\n browserProvider?: () => { provider?: EIP1193Provider } | undefined;\n};\nconst STATE_KEY = '__manifoldMintConnectStateV1';\ntype LoadState = { promise: Promise<void>; networks: number[]; projectId?: string; div?: HTMLElement; nodes: Node[] };\ntype PageState = { load?: LoadState; pendingModal?: Promise<'connected' | 'dismissed'> };\ntype Win = Window & { [LOADER_KEY]?: Promise<void>; [STATE_KEY]?: PageState; ManifoldConnect?: ConnectGlobal; ManifoldEthereumProvider?: EthProviderGlobal };\nconst win = () => window as unknown as Win;\n// Lazily accessed so importing this module never reads window during SSR.\nconst pageState = (): PageState => (win()[STATE_KEY] ??= {});\n\nconst TOO_OLD = 'A Manifold connect widget older than 6.4.0 is already on this page; update it or remove it so dropkit can load 6.4.0.';\n\nconst MANIFOLD_HOST = /(^|\\.)(manifoldxyz\\.dev|manifold\\.xyz)$/;\n\n/** Only Manifold connect-widget bundles count as an old widget: connect.manifoldxyz.dev, or connect.umd*.js on a Manifold host. */\nfunction isManifoldConnectScript(src: string): boolean {\n try {\n const url = new URL(src, document.baseURI);\n return url.hostname === 'connect.manifoldxyz.dev' || (MANIFOLD_HOST.test(url.hostname) && /\\/connect\\.umd[^/]*\\.js$/.test(url.pathname));\n } catch {\n return false;\n }\n}\n\nfunction applyState(state: LoadState): void {\n if (!state.div) return;\n const network = state.networks.join(',');\n // Connect 6.4 remounts on every attribute mutation, even an identical value.\n if (state.div.dataset.network !== network) state.div.dataset.network = network;\n if (state.projectId && state.div.dataset.walletConnectProjectId !== state.projectId) state.div.dataset.walletConnectProjectId = state.projectId;\n}\n\n/** Adds a caller's chains (first-call order) and promotes the first nonempty project id; a conflicting later id only warns. */\nfunction register(state: LoadState, opts: ConnectOptions): void {\n for (const id of opts.chainIds) if (!state.networks.includes(id)) state.networks.push(id);\n const id = opts.walletConnectProjectId;\n if (id) {\n if (!state.projectId) state.projectId = id;\n else if (state.projectId !== id) {\n console.warn(`dropkit: walletConnectProjectId \"${id}\" ignored; this page already uses \"${state.projectId}\" for the shared connect widget.`);\n }\n }\n applyState(state);\n}\n\nfunction startLoad(state: LoadState): Promise<void> {\n const connect = win().ManifoldConnect;\n if (connect?.capabilities?.includes('open')) return Promise.resolve(connect.ready).then(() => undefined);\n\n const hasScript = Array.from(document.querySelectorAll('script[src]')).some((s) => isManifoldConnectScript((s as HTMLScriptElement).src));\n if (hasScript || document.querySelector('[data-widget=\"m-connect\"]')) {\n return Promise.reject(new MintError('CONNECT_WIDGET_TOO_OLD', TOO_OLD));\n }\n\n return new Promise<void>((resolve, reject) => {\n const css = document.createElement('link');\n css.rel = 'stylesheet';\n css.href = `${CONNECT_BASE_URL}/connect.css`;\n document.head.appendChild(css);\n state.nodes.push(css);\n\n const div = document.createElement('div');\n div.hidden = true;\n div.style.display = 'none';\n div.dataset.widget = 'm-connect';\n div.dataset.connectId = CONNECT_ID;\n div.dataset.autoReconnect = 'true';\n div.dataset.enableNetworkSwitching = 'true';\n state.div = div;\n applyState(state);\n document.body.appendChild(div);\n state.nodes.push(div);\n\n const script = document.createElement('script');\n script.src = `${CONNECT_BASE_URL}/connect.umd.min.js`;\n script.async = true;\n script.addEventListener('load', () => {\n const ready = win().ManifoldConnect?.ready;\n if (!ready) return reject(new MintError('CONNECT_WIDGET_TOO_OLD', TOO_OLD));\n Promise.resolve(ready).then(() => resolve(), reject);\n });\n script.addEventListener('error', () => reject(new MintError('RPC_ERROR', `Could not load the Manifold connect widget from ${CONNECT_BASE_URL}`)));\n document.head.appendChild(script);\n state.nodes.push(script);\n });\n}\n\n/**\n * Idempotent across buttons, React Strict Mode and repeated calls: the promise is stored on\n * window[LOADER_KEY] BEFORE anything is appended. Order: window.ManifoldConnect lists 'open' -> reuse;\n * else an existing Manifold connect script tag or [data-widget=\"m-connect\"] -> reject MintError('CONNECT_WIDGET_TOO_OLD')\n * and inject nothing; else inject CONNECT_BASE_URL/connect.umd.min.js + connect.css and one hidden\n * <div data-widget=\"m-connect\" data-connect-id=\"mint-button\" data-auto-reconnect=\"true\"\n * data-enable-network-switching=\"true\" data-network=\"<ids joined by ,>\" [data-wallet-connect-project-id]>,\n * then await window.ManifoldConnect.ready. Every caller (also after load) adds its chains to the one widget's\n * data-network and may promote the first nonempty project id. A failed load clears window[LOADER_KEY] and\n * removes the nodes it created, so the next call retries.\n */\nexport function loadConnectWidget(opts: ConnectOptions): Promise<void> {\n const w = win();\n const page = pageState();\n const existing = w[LOADER_KEY];\n if (existing) {\n // Adopt a legacy promise without replacing it or taking ownership of its DOM.\n if (page.load?.promise !== existing) {\n const div = document.querySelector<HTMLElement>(`[data-widget=\"m-connect\"][data-connect-id=\"${CONNECT_ID}\"]`) ?? undefined;\n page.load = {\n promise: existing,\n networks: div?.dataset.network?.split(',').filter(Boolean).map(Number) ?? [],\n projectId: div?.dataset.walletConnectProjectId,\n div,\n nodes: [],\n };\n }\n register(page.load, opts);\n return existing;\n }\n let resolve!: () => void;\n let reject!: (reason: unknown) => void;\n const p = new Promise<void>((res, rej) => { resolve = res; reject = rej; });\n const state: LoadState = { promise: p, networks: [], nodes: [] };\n // Publish before DOM insertion: synchronous observers and other copies must see the same load.\n page.load = state;\n w[LOADER_KEY] = p;\n p.catch(() => {\n if (w[LOADER_KEY] === p) delete w[LOADER_KEY];\n if (page.load === state) page.load = undefined;\n for (const node of state.nodes) node.parentNode?.removeChild(node);\n state.nodes.length = 0;\n state.div = undefined;\n });\n register(state, opts);\n try {\n startLoad(state).then(resolve, reject);\n } catch (error) {\n reject(error);\n }\n return p;\n}\n\n/**\n * Dispatches m-connect:open {connectId: CONNECT_ID}; resolves with the next m-connect:closed reason.\n * Calls made before that close share one pending promise and one listener.\n */\nexport function openConnectModal(): Promise<'connected' | 'dismissed'> {\n const page = pageState();\n if (page.pendingModal) return page.pendingModal;\n const p = new Promise<'connected' | 'dismissed'>((resolve) => {\n const onClosed = (e: Event) => {\n const detail = (e as CustomEvent<{ connectId?: string; reason?: string }>).detail ?? {};\n if (detail.connectId !== undefined && detail.connectId !== CONNECT_ID) return;\n window.removeEventListener('m-connect:closed', onClosed);\n page.pendingModal = undefined;\n resolve(detail.reason === 'connected' ? 'connected' : 'dismissed');\n };\n window.addEventListener('m-connect:closed', onClosed);\n });\n page.pendingModal = p;\n window.dispatchEvent(new CustomEvent('m-connect:open', { detail: { connectId: CONNECT_ID } }));\n return p;\n}\n\n/**\n * From window.ManifoldEthereumProvider.selectedAddress()/chainId(); null when not connected.\n * When the wallet is on a chain outside the widget's data-network, chainId() is undefined, so the\n * chain falls back to browserChainId() (the wallet's real chain, updated before CHAIN_CHANGED fires).\n * chainId() wins when present; a throwing browserChainId() counts as unknown (null).\n */\nexport function getAccount(): Account | null {\n const p = win().ManifoldEthereumProvider;\n const address = p?.selectedAddress?.();\n let chainId = p?.chainId?.();\n if (chainId === undefined || chainId === null) {\n try {\n chainId = p?.browserChainId?.();\n } catch {\n chainId = undefined;\n }\n }\n if (!address || chainId === undefined || chainId === null) return null;\n return { address: getAddress(address), chainId: Number(chainId) };\n}\n\n/** Calls cb(getAccount()) on ADDRESS_CHANGED and CHAIN_CHANGED window events. Returns unsubscribe. */\nexport function subscribeAccount(cb: (account: Account | null) => void): () => void {\n const handler = () => cb(getAccount());\n window.addEventListener(ADDRESS_CHANGED, handler);\n window.addEventListener(CHAIN_CHANGED, handler);\n return () => {\n window.removeEventListener(ADDRESS_CHANGED, handler);\n window.removeEventListener(CHAIN_CHANGED, handler);\n };\n}\n\nfunction eip1193(): EIP1193Provider {\n const p = win().ManifoldEthereumProvider;\n const provider = (p?.provider?.(true) ?? p?.browserProvider?.())?.provider;\n if (!provider) throw new MintError('CHAIN_SWITCH_FAILED', 'No wallet is connected.');\n return provider;\n}\n\n/** viem WalletClient over (ManifoldEthereumProvider.provider(true) ?? browserProvider()).provider. */\nexport function getWalletClient(chainId: number): WalletClient {\n const provider = eip1193();\n // viem's custom() forwards a second options argument; wallet providers take exactly one.\n const request = ((args: Parameters<EIP1193Provider['request']>[0]) => provider.request(args)) as EIP1193Provider['request'];\n return createWalletClient({ chain: getChain(chainId), transport: custom({ request }) });\n}\n\nconst code = (e: unknown): unknown => (e as { code?: unknown } | null)?.code;\n\n/**\n * wallet_switchEthereumChain; on error code 4902 wallet_addEthereumChain (from getChain) then switch again.\n * 4001 -> MintError('USER_REJECTED'); anything else -> MintError('CHAIN_SWITCH_FAILED').\n */\nexport async function switchToChain(chainId: number): Promise<void> {\n const chain = getChain(chainId);\n const provider = eip1193();\n const hexId = `0x${chainId.toString(16)}` as const;\n const switchChain = () => provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: hexId }] });\n try {\n try {\n await switchChain();\n } catch (e) {\n if (code(e) !== 4902) throw e;\n await provider.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: hexId,\n chainName: chain.name,\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: [...chain.rpcUrls.default.http],\n ...(chain.blockExplorers ? { blockExplorerUrls: [chain.blockExplorers.default.url] } : {}),\n },\n ],\n });\n await switchChain();\n }\n } catch (e) {\n if (code(e) === 4001) throw new MintError('USER_REJECTED', 'You rejected the network switch.', { cause: e });\n throw new MintError('CHAIN_SWITCH_FAILED', `Could not switch the wallet to chain ${String(chainId)}.`, { cause: e });\n }\n}\n","// Manifold Edition claim adapter. Spec #how, #data-models section 3, D3/D10. Calls the extension contract directly.\nimport {\n BaseError,\n ContractFunctionRevertedError,\n decodeErrorResult,\n encodeFunctionData,\n formatUnits,\n getAddress,\n isAddress,\n isHex,\n zeroAddress,\n zeroHash,\n type Hex,\n type PublicClient,\n} from 'viem';\nimport type { Address, DropInfo, ManifoldClaimConfig, Money } from '../../types';\nimport type { AdapterContext, MintAdapter, MintPlan, WalletRead } from '../types';\nimport { MintError } from '../../errors';\nimport {\n CLAIM_1155_V5_ABI,\n CLAIM_1155_V7_ABI,\n CLAIM_721_V5_ABI,\n CLAIM_721_V7_ABI,\n CREATOR_ABI,\n ERC20_ABI,\n EXTENSION_COMMON_ABI,\n EXTENSION_ERRORS_ABI,\n} from './abis';\nimport { fetchMerkleEntries, type MerkleEntry } from './merkle';\n\nexport type ExtensionSpec = '721' | '1155';\nexport type ExtensionAbi = 'Claim721V5Optimization' | 'Claim1155V5Optimization' | 'Claim721V7' | 'Claim1155V7';\nexport type ExtensionEntry = { chainId: number; address: Address; generation: 'V6' | 'V7' | 'V8'; spec: ExtensionSpec; abi: ExtensionAbi };\n\nconst V6_721: Address = '0x1eb73fee2090fb1c20105d5ba887e3c3ba14a17e';\nconst V6_1155: Address = '0x04ba6cf3c5aa6d4946f5b7f7adf111012a9fac65';\nconst V7_721: Address = '0x23aa05a271debffaa3d75739af5581f744b326e4';\nconst V7_1155: Address = '0x26bbea7803dcac346d5f5f135b57cf2c752a02be';\nconst V8_721: Address = '0x5889e848b2423344f7969bc158100c07595c0137';\nconst V8_1155: Address = '0x88438f4d4b8516e758a319ad16924da60e1e56cc';\n\nconst v6 = (chainId: number): ExtensionEntry[] => [\n { chainId, address: V6_721, generation: 'V6', spec: '721', abi: 'Claim721V5Optimization' },\n { chainId, address: V6_1155, generation: 'V6', spec: '1155', abi: 'Claim1155V5Optimization' },\n];\nconst v7 = (chainId: number): ExtensionEntry[] => [\n { chainId, address: V7_721, generation: 'V7', spec: '721', abi: 'Claim721V7' },\n { chainId, address: V7_1155, generation: 'V7', spec: '1155', abi: 'Claim1155V7' },\n];\n\n/**\n * Embedded registry keyed by (chainId, lowercase address). Bytecode measured with eth_getCode:\n * mainnet, Base, Optimism have V6 + V7 (identical code hashes); Shape has V7 + V8 ERC-1155 (no V6, no V8 ERC-721);\n * Sepolia has all six. V8 has no code on mainnet, Base or Optimism. ApeChain has none of the six.\n */\nexport const EXTENSIONS: readonly ExtensionEntry[] = [\n ...v6(1),\n ...v7(1),\n ...v6(8453),\n ...v7(8453),\n ...v6(10),\n ...v7(10),\n ...v7(360),\n { chainId: 360, address: V8_1155, generation: 'V8', spec: '1155', abi: 'Claim1155V7' },\n ...v6(11155111),\n ...v7(11155111),\n { chainId: 11155111, address: V8_721, generation: 'V8', spec: '721', abi: 'Claim721V7' },\n { chainId: 11155111, address: V8_1155, generation: 'V8', spec: '1155', abi: 'Claim1155V7' },\n];\n\nexport function findExtension(chainId: number, address: Address): ExtensionEntry | undefined {\n const a = address.toLowerCase();\n return EXTENSIONS.find((e) => e.chainId === chainId && e.address === a);\n}\n\nexport const MERKLE_API = 'https://apps.api.manifoldxyz.dev';\n\n/** uint16 mintCount cap of mintProxy. */\nconst MAX_MINT_COUNT = 65535;\n/** Gas units kept aside in WalletRead.gasReserve: an estimate, simulate() is the authoritative check. */\nconst GAS_UNITS_BASE = 100_000n;\nconst GAS_UNITS_PER_TOKEN = 150_000n;\nconst GAS_UNITS_APPROVE = 60_000n;\n\n// ---------- claim decoding ----------\n\ntype Claim = {\n total: bigint;\n totalMax: bigint;\n walletMax: bigint;\n startDate: bigint;\n endDate: bigint;\n merkleRoot: Hex;\n cost: bigint;\n erc20: Address;\n /** null on V6 (no signature claims). */\n signingAddress: Address | null;\n};\n\ntype Resolved = { entry: ExtensionEntry; claim: Claim; fee: bigint };\n\n/** Carried from readDrop to readWallet (keyed by the DropInfo object) so readWallet does not re-discover. */\nconst dropResolved = new WeakMap<DropInfo, Resolved>();\n\n/** Carried from readWallet to buildPlan in WalletRead.data. */\ntype WalletData = {\n brand: typeof WALLET_DATA_BRAND;\n resolved: Resolved;\n config: ManifoldClaimConfig;\n recipient: Address;\n /** Allowlist only: unused (mintIndex, proof) pairs for the recipient. */\n unused: MerkleEntry[];\n};\nconst WALLET_DATA_BRAND = Symbol('manifold-claim-wallet-data');\nconst isWalletData = (d: unknown): d is WalletData => typeof d === 'object' && d !== null && (d as WalletData).brand === WALLET_DATA_BRAND;\n\nconst isAllowlist = (claim: Claim) => claim.merkleRoot !== zeroHash;\n\n// ---------- errors ----------\n\n/** Contract-level failure of an eth_call (revert or empty return), as opposed to a transport failure. */\nfunction isContractFailure(e: unknown): boolean {\n if (!(e instanceof BaseError)) return false;\n return e.walk((x) => x instanceof ContractFunctionRevertedError || (x as Error).name === 'ContractFunctionZeroDataError') !== null;\n}\n\nfunction toRpcError(e: unknown): MintError {\n if (e instanceof MintError) return e;\n const msg = e instanceof BaseError ? e.shortMessage : e instanceof Error ? e.message : String(e);\n return new MintError('RPC_ERROR', `RPC request failed: ${msg}`, { cause: e });\n}\n\nasync function rpc<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (e) {\n throw toRpcError(e);\n }\n}\n\n/** Raw revert bytes anywhere in a viem error chain. */\nfunction revertData(e: BaseError): Hex | undefined {\n const hit = e.walk((x) => {\n const d = (x as { data?: unknown }).data;\n return (isHex(d) && d.length >= 10) || (typeof d === 'object' && d !== null && isHex((d as { data?: unknown }).data));\n });\n const d = (hit as { data?: unknown } | null)?.data;\n if (isHex(d)) return d;\n const inner = (d as { data?: unknown } | undefined)?.data;\n return isHex(inner) ? inner : undefined;\n}\n\n/** Decoded revert text for a failed simulation, or null when the error is not a revert. */\nfunction decodeRevert(e: unknown): string | null {\n if (!(e instanceof BaseError)) return null;\n const data = revertData(e);\n if (data) {\n try {\n const d = decodeErrorResult({ abi: EXTENSION_ERRORS_ABI, data });\n if (d.errorName === 'Error' && typeof d.args?.[0] === 'string') return d.args[0];\n if (d.errorName === 'Panic') return `Panic(${String(d.args?.[0])})`;\n return d.errorName;\n } catch {\n return `reverted with unknown error ${data.slice(0, 10)}`;\n }\n }\n const named = e.walk((x) => ['ExecutionRevertedError', 'InsufficientFundsError'].includes((x as Error).name));\n return named instanceof BaseError ? named.shortMessage : null;\n}\n\n// ---------- reads ----------\n\nconst money = (value: bigint, decimals: number, symbol: string): Money => ({ value, decimals, symbol, formatted: formatUnits(value, decimals) });\n\nfunction timestamp(v: bigint, field: string): number | null {\n if (v === 0n) return null;\n if (v > BigInt(Number.MAX_SAFE_INTEGER)) throw new MintError('RPC_ERROR', `Claim ${field} does not fit a safe integer`);\n return Number(v);\n}\n\nfunction parseConfig(config: ManifoldClaimConfig): { creator: Address; instanceId: bigint; extension: Address | undefined } {\n if (!isAddress(config.creatorContract, { strict: false })) {\n throw new MintError('INVALID_CONFIG', 'creatorContract is not a valid address.', { field: 'creatorContract' });\n }\n if (config.extension !== undefined && !isAddress(config.extension, { strict: false })) {\n throw new MintError('INVALID_CONFIG', 'extension is not a valid address.', { field: 'extension' });\n }\n if (typeof config.instanceId !== 'string' || !/^\\d+$/.test(config.instanceId)) {\n throw new MintError('INVALID_CONFIG', 'instanceId must be a non-negative integer string.', { field: 'instanceId' });\n }\n return {\n creator: getAddress(config.creatorContract),\n instanceId: BigInt(config.instanceId),\n extension: config.extension === undefined ? undefined : getAddress(config.extension),\n };\n}\n\nconst notFound = (config: ManifoldClaimConfig) =>\n new MintError('CLAIM_NOT_FOUND', `No Manifold claim ${config.instanceId} found on ${config.creatorContract}.`);\n\n/** getClaim with the exact ABI for the entry. Contract failures throw CLAIM_NOT_FOUND, transport failures RPC_ERROR. */\nasync function readClaim(client: PublicClient, entry: ExtensionEntry, creator: Address, instanceId: bigint, config: ManifoldClaimConfig): Promise<Claim> {\n const address = getAddress(entry.address);\n const args = [creator, instanceId] as const;\n try {\n switch (entry.abi) {\n case 'Claim721V5Optimization': {\n const c = await client.readContract({ address, abi: CLAIM_721_V5_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: null };\n }\n case 'Claim1155V5Optimization': {\n const c = await client.readContract({ address, abi: CLAIM_1155_V5_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: null };\n }\n case 'Claim721V7': {\n const c = await client.readContract({ address, abi: CLAIM_721_V7_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: c.signingAddress };\n }\n case 'Claim1155V7': {\n const c = await client.readContract({ address, abi: CLAIM_1155_V7_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: c.signingAddress };\n }\n }\n } catch (e) {\n // Uninitialized claims revert as ClaimNotInitialized() (0x7f07ad49) or Error(\"Claim not initialized\"); both land here.\n if (isContractFailure(e)) throw notFound(config);\n throw toRpcError(e);\n }\n}\n\nfunction base(c: {\n total: number;\n totalMax: number;\n walletMax: number;\n startDate: number;\n endDate: number;\n merkleRoot: Hex;\n cost: bigint;\n erc20: Address;\n}): Omit<Claim, 'signingAddress'> {\n return {\n total: BigInt(c.total),\n totalMax: BigInt(c.totalMax),\n walletMax: BigInt(c.walletMax),\n startDate: BigInt(c.startDate),\n endDate: BigInt(c.endDate),\n merkleRoot: c.merkleRoot,\n cost: c.cost,\n erc20: c.erc20,\n };\n}\n\nasync function hasCode(client: PublicClient, address: Address): Promise<boolean> {\n const code = await rpc(() => client.getCode({ address: getAddress(address) }));\n return code !== undefined && code !== '0x';\n}\n\nconst unknownExtension = (address: Address, why: string) => new MintError('UNKNOWN_EXTENSION', `Extension ${address} ${why}.`);\n\nasync function resolveExtension(ctx: AdapterContext, config: ManifoldClaimConfig): Promise<{ entry: ExtensionEntry; claim: Claim }> {\n const { creator, instanceId, extension } = parseConfig(config);\n const { client } = ctx;\n\n if (extension) {\n const entry = findExtension(config.chainId, extension);\n if (!entry) throw unknownExtension(extension, `is not a supported Manifold claim extension on chain ${config.chainId}`);\n if (!(await hasCode(client, extension))) throw unknownExtension(extension, 'has no contract code on this chain');\n return { entry, claim: await readClaim(client, entry, creator, instanceId, config) };\n }\n\n // Auto-discovery: registered extensions of the creator contract that are in the registry for this chain.\n let registered: readonly Address[];\n try {\n registered = await client.readContract({ address: creator, abi: CREATOR_ABI, functionName: 'getExtensions' });\n } catch (e) {\n if (isContractFailure(e)) throw notFound(config);\n throw toRpcError(e);\n }\n const candidates = [...new Set(registered.map((a) => a.toLowerCase()))]\n .map((a) => findExtension(config.chainId, a as Address))\n .filter((e): e is ExtensionEntry => e !== undefined);\n const found = await Promise.all(\n candidates.map(async (entry) => {\n if (!(await hasCode(client, entry.address))) return null;\n try {\n return { entry, claim: await readClaim(client, entry, creator, instanceId, config) };\n } catch (e) {\n if (e instanceof MintError && e.reason === 'CLAIM_NOT_FOUND') return null;\n throw e;\n }\n }),\n );\n const hits = found.filter((f): f is { entry: ExtensionEntry; claim: Claim } => f !== null);\n if (hits.length === 0) throw notFound(config);\n if (hits.length > 1) {\n throw new MintError(\n 'AMBIGUOUS_EXTENSION',\n `Claim ${config.instanceId} exists on ${hits.length} extensions (${hits.map((h) => h.entry.address).join(', ')}). Set config.extension.`,\n );\n }\n return hits[0]!;\n}\n\nasync function loadDrop(ctx: AdapterContext, config: ManifoldClaimConfig): Promise<{ drop: DropInfo; resolved: Resolved }> {\n const { entry, claim } = await resolveExtension(ctx, config);\n if (claim.signingAddress !== null && claim.signingAddress !== zeroAddress) {\n throw new MintError('SIGNATURE_CLAIM', 'This claim mints with a signature (redemption code), which this button does not support.');\n }\n const { client } = ctx;\n const extension = getAddress(entry.address);\n const fee = await rpc(() =>\n client.readContract({ address: extension, abi: EXTENSION_COMMON_ABI, functionName: isAllowlist(claim) ? 'MINT_FEE_MERKLE' : 'MINT_FEE' }),\n );\n\n const native = client.chain?.nativeCurrency ?? { symbol: 'ETH', decimals: 18 };\n let unitPrice: Money;\n let paymentToken: Address | null = null;\n if (claim.erc20 === zeroAddress) {\n unitPrice = money(claim.cost, native.decimals, native.symbol);\n } else {\n paymentToken = getAddress(claim.erc20);\n const token = paymentToken;\n const [symbol, decimals] = await rpc(() =>\n Promise.all([\n client.readContract({ address: token, abi: ERC20_ABI, functionName: 'symbol' }),\n client.readContract({ address: token, abi: ERC20_ABI, functionName: 'decimals' }),\n ]),\n );\n unitPrice = money(claim.cost, decimals, symbol);\n }\n\n const drop: DropInfo = {\n chainId: config.chainId,\n unitPrice,\n unitFee: money(fee, native.decimals, native.symbol),\n totalMinted: claim.total,\n maxSupply: claim.totalMax === 0n ? null : claim.totalMax,\n startTime: timestamp(claim.startDate, 'startDate'),\n endTime: timestamp(claim.endDate, 'endDate'),\n isAllowlist: isAllowlist(claim),\n paymentToken,\n pricePer: 'unit',\n };\n const resolved = { entry, claim, fee };\n dropResolved.set(drop, resolved);\n return { drop, resolved };\n}\n\nasync function loadWallet(\n ctx: AdapterContext,\n config: ManifoldClaimConfig,\n args: { payer: Address; recipient: Address; quantity: number; drop: DropInfo },\n): Promise<WalletRead> {\n const { creator, instanceId } = parseConfig(config);\n const { client } = ctx;\n const resolved = dropResolved.get(args.drop) ?? (await loadDrop(ctx, config)).resolved;\n const { entry, claim } = resolved;\n const extension = getAddress(entry.address);\n const payer = getAddress(args.payer);\n const recipient = getAddress(args.recipient);\n\n let walletMinted: bigint | null = null;\n let walletMax: bigint | null = null;\n let allowlistRemaining: number | null = null;\n let maxQuantity: number | null = null;\n let ineligible: WalletRead['ineligible'] = null;\n let unused: MerkleEntry[] = [];\n\n if (isAllowlist(claim)) {\n // Branch 1: allowlist ignores walletMax and limits by unused mint indices; proofs are for the recipient.\n const entries = await fetchMerkleEntries({ scope: ctx.cacheScope ?? args.drop, api: MERKLE_API, instanceId: config.instanceId, recipient, fetch: ctx.fetch, signal: ctx.signal });\n if (entries.length > 0) {\n const minted = await rpc(() =>\n client.readContract({\n address: extension,\n abi: EXTENSION_COMMON_ABI,\n functionName: 'checkMintIndices',\n args: [creator, instanceId, entries.map((e) => e.mintIndex)],\n }),\n );\n unused = entries.filter((_, i) => minted[i] === false);\n }\n allowlistRemaining = unused.length;\n maxQuantity = unused.length;\n if (entries.length === 0) {\n ineligible = { reason: 'NOT_ON_ALLOWLIST', message: 'This wallet is not on the allowlist.' };\n } else if (unused.length === 0) {\n ineligible = { reason: 'ALLOWLIST_USED', message: 'This wallet has already used all its allowlist spots.' };\n }\n } else if (claim.walletMax > 0n) {\n // Branch 2: public with a wallet limit, counted against the recipient.\n walletMax = claim.walletMax;\n walletMinted = BigInt(\n await rpc(() => client.readContract({ address: extension, abi: EXTENSION_COMMON_ABI, functionName: 'getTotalMints', args: [recipient, creator, instanceId] })),\n );\n const left = walletMax > walletMinted ? walletMax - walletMinted : 0n;\n maxQuantity = Number(left);\n if (left === 0n) ineligible = { reason: 'WALLET_LIMIT', message: `This wallet has already minted its limit of ${walletMax}.` };\n }\n // Branch 3: public with walletMax = 0 is unlimited. getTotalMints reverts there, so it is never called.\n\n const token = claim.erc20 === zeroAddress ? null : getAddress(claim.erc20);\n const [native, erc20, gasPrice] = await rpc(() =>\n Promise.all([\n client.getBalance({ address: payer }),\n token ? client.readContract({ address: token, abi: ERC20_ABI, functionName: 'balanceOf', args: [payer] }) : Promise.resolve(null),\n client.getGasPrice(),\n ]),\n );\n const gasUnits = GAS_UNITS_BASE + GAS_UNITS_PER_TOKEN * BigInt(Math.max(1, args.quantity)) + (token ? GAS_UNITS_APPROVE : 0n);\n\n const data: WalletData = { brand: WALLET_DATA_BRAND, resolved, config, recipient, unused };\n return {\n walletMinted,\n walletMax,\n allowlistRemaining,\n maxQuantity,\n ineligible,\n balances: { native, erc20 },\n gasReserve: gasPrice * gasUnits,\n data,\n };\n}\n\n// ---------- plan + simulate ----------\n\nconst sameClaim = (a: ManifoldClaimConfig, b: ManifoldClaimConfig) =>\n a.chainId === b.chainId &&\n a.creatorContract.toLowerCase() === b.creatorContract.toLowerCase() &&\n a.instanceId === b.instanceId &&\n a.extension?.toLowerCase() === b.extension?.toLowerCase();\n\nasync function buildPlan(ctx: AdapterContext, attempt: Parameters<MintAdapter<ManifoldClaimConfig>['buildPlan']>[1], wallet: WalletRead): Promise<MintPlan> {\n const { config, quantity } = attempt;\n if (!Number.isInteger(quantity) || quantity < 1 || quantity > MAX_MINT_COUNT) {\n throw new MintError('INVALID_CONFIG', `quantity must be an integer from 1 to ${MAX_MINT_COUNT}.`, { field: 'quantity' });\n }\n const { creator, instanceId } = parseConfig(config);\n const recipient = getAddress(attempt.recipient);\n const payer = getAddress(attempt.payer);\n\n // Proofs belong to the recipient they were fetched for; anything else is re-read.\n let data = wallet.data;\n if (!isWalletData(data) || !sameClaim(data.config, config) || data.recipient !== recipient) {\n const drop = (await loadDrop(ctx, config)).drop;\n data = (await loadWallet(ctx, config, { payer, recipient, quantity, drop })).data;\n }\n if (!isWalletData(data)) throw new MintError('RPC_ERROR', 'Wallet read produced no plan data.');\n const { entry, claim, fee } = data.resolved;\n const extension = getAddress(entry.address);\n\n let mintIndices: number[] = [];\n let merkleProofs: (readonly Hex[])[] = [];\n if (isAllowlist(claim)) {\n if (quantity > data.unused.length) {\n throw new MintError('WALLET_LIMIT', `Only ${data.unused.length} allowlist spot(s) left for this wallet.`);\n }\n const picked = data.unused.slice(0, quantity);\n mintIndices = picked.map((p) => p.mintIndex);\n merkleProofs = picked.map((p) => p.proof);\n }\n\n const qty = BigInt(quantity);\n const erc20 = claim.erc20 === zeroAddress ? null : getAddress(claim.erc20);\n const cost = claim.cost * qty;\n const value = fee * qty + (erc20 ? 0n : cost);\n\n let approve: MintPlan['approve'] = null;\n if (erc20 && cost > 0n) {\n const allowance = await rpc(() => ctx.client.readContract({ address: erc20, abi: ERC20_ABI, functionName: 'allowance', args: [payer, extension] }));\n if (allowance < cost) {\n approve = {\n token: erc20,\n spender: extension,\n amount: cost,\n tx: { to: erc20, data: encodeFunctionData({ abi: ERC20_ABI, functionName: 'approve', args: [extension, cost] }), value: 0n },\n };\n }\n }\n\n return {\n approve,\n mint: {\n to: extension,\n data: encodeFunctionData({\n abi: EXTENSION_COMMON_ABI,\n functionName: 'mintProxy',\n args: [creator, instanceId, quantity, mintIndices, merkleProofs.map((p) => [...p]), recipient],\n }),\n value,\n },\n tokenContract: creator,\n };\n}\n\nexport const manifoldClaimAdapter: MintAdapter<ManifoldClaimConfig> = {\n readDrop: async (ctx, config) => (await loadDrop(ctx, config)).drop,\n readWallet: loadWallet,\n buildPlan,\n simulate: async (ctx, attempt, plan) => {\n try {\n await ctx.client.call({ account: getAddress(attempt.payer), to: plan.mint.to, data: plan.mint.data, value: plan.mint.value });\n } catch (e) {\n const text = decodeRevert(e);\n if (text === null) throw toRpcError(e);\n throw new MintError('SIMULATION_REVERTED', text, { cause: e });\n }\n },\n};\n","// Embedded viem ABI fragments for the supported Manifold Edition claim extensions (spec #data-models section 3).\n// Source: @manifoldxyz/claim-contracts 3.3.0 (src/abis). getClaim is the only function whose shape differs:\n// 721 and 1155 tuples differ within one generation (721 has contractVersion/identical, 1155 has tokenId),\n// and V7 adds signingAddress. Each (generation, spec) gets its own exact fragment; nothing is decoded by position.\nimport { parseAbi } from 'viem';\n\nexport const CLAIM_721_V5_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, uint8 contractVersion, bool identical, bytes32 merkleRoot, string location, uint256 cost, address paymentReceiver, address erc20) claim)',\n]);\n\nexport const CLAIM_1155_V5_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, bytes32 merkleRoot, string location, uint256 tokenId, uint256 cost, address paymentReceiver, address erc20) claim)',\n]);\n\nexport const CLAIM_721_V7_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, uint8 contractVersion, bool identical, bytes32 merkleRoot, string location, uint256 cost, address paymentReceiver, address erc20, address signingAddress) claim)',\n]);\n\nexport const CLAIM_1155_V7_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, bytes32 merkleRoot, string location, uint256 tokenId, uint256 cost, address paymentReceiver, address erc20, address signingAddress) claim)',\n]);\n\n/** Identical on all four extension ABIs. */\nexport const EXTENSION_COMMON_ABI = parseAbi([\n 'function MINT_FEE() view returns (uint256)',\n 'function MINT_FEE_MERKLE() view returns (uint256)',\n 'function getTotalMints(address minter, address creatorContractAddress, uint256 instanceId) view returns (uint32)',\n 'function checkMintIndices(address creatorContractAddress, uint256 instanceId, uint32[] mintIndices) view returns (bool[] minted)',\n 'function mintProxy(address creatorContractAddress, uint256 instanceId, uint16 mintCount, uint32[] mintIndices, bytes32[][] merkleProofs, address mintFor) payable',\n]);\n\n/** Custom errors used by the V7 generation, plus the two built-in Solidity errors. */\nexport const EXTENSION_ERRORS_ABI = parseAbi([\n 'error Error(string message)',\n 'error Panic(uint256 code)',\n 'error ClaimInactive()',\n 'error ClaimNotInitialized()',\n 'error ExpiredSignature()',\n 'error FailedToTransfer()',\n 'error InvalidAirdrop()',\n 'error InvalidInput()',\n 'error InvalidInstance()',\n 'error InvalidSignature()',\n 'error InvalidStartDate()',\n 'error InvalidStorageProtocol()',\n 'error MustUseSignatureMinting()',\n 'error TokenDNE()',\n 'error TooManyRequested()',\n]);\n\n/** Creator core: registered extensions, for auto-discovery. */\nexport const CREATOR_ABI = parseAbi(['function getExtensions() view returns (address[])']);\n\nexport const ERC20_ABI = parseAbi([\n 'function symbol() view returns (string)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address owner) view returns (uint256)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n]);\n","// Manifold public merkle API client (spec #api-endpoints, D10). Two calls per allowlist wallet read:\n// instance data (merkleTreeId, appId) then merkleInfo for the recipient. All HTTP goes through ctx.fetch.\nimport { MintError } from '../../errors';\nimport type { Address } from '../../types';\n\nexport type MerkleEntry = { mintIndex: number; proof: readonly `0x${string}`[] };\n\nconst UINT32_MAX = 0xffffffff;\n\ntype Fetch = typeof fetch;\n\nasync function getJson(fetchFn: Fetch, url: string, signal: AbortSignal | undefined, what: string): Promise<unknown> {\n let res: Response;\n try {\n signal?.throwIfAborted();\n res = await fetchFn(url, signal ? { signal } : undefined);\n } catch (cause) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', `Could not reach the allowlist service (${what}).`, { cause });\n }\n if (res.status === 429) throw new MintError('RATE_LIMITED', 'The allowlist service is rate limiting requests. Try again shortly.');\n if (!res.ok) throw new MintError('ALLOWLIST_UNAVAILABLE', `The allowlist service has no data for this claim (${what}: HTTP ${res.status}).`);\n try {\n return await res.json();\n } catch (cause) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', `The allowlist service returned an unreadable response (${what}).`, { cause });\n }\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null;\n\ntype Instance = { merkleTreeId: string | number; appId: string | number };\n\n/** Both API caches belong to a hook/config lifetime, not a refresh or another consumer. */\ntype ScopeCache = {\n signal: AbortSignal | undefined;\n instances: Map<string, Promise<Instance>>;\n entries: Map<string, Promise<MerkleEntry[]>>;\n};\nconst scopeCaches = new WeakMap<object, ScopeCache>();\n\nfunction memo<T>(cache: Map<string, Promise<T>>, key: string, signal: AbortSignal | undefined, load: () => Promise<T>): Promise<T> {\n const hit = cache.get(key);\n if (hit) return hit;\n const p = withSignal(load(), signal);\n cache.set(key, p);\n p.catch(() => {\n if (cache.get(key) === p) cache.delete(key);\n });\n return p;\n}\n\n/** Reject and evict cancelled loads even if an injected fetch ignores the shared lifetime signal. */\nfunction withSignal<T>(p: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n if (!signal) return p;\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist request was cancelled.', { cause: signal.reason }));\n p.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n if (signal.aborted) return onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function loadInstance(fetchFn: Fetch, api: string, instanceId: string, signal: AbortSignal | undefined): Promise<Instance> {\n const instance = await getJson(fetchFn, `${api}/public/instance/data?id=${instanceId}`, signal, 'instance data');\n const publicData = isRecord(instance) ? instance.publicData : undefined;\n const allowlist = isRecord(publicData) ? publicData.instanceAllowlist : undefined;\n const merkleTreeId = isRecord(allowlist) ? allowlist.merkleTreeId : undefined;\n const appId = isRecord(instance) ? instance.appId : undefined;\n if ((typeof merkleTreeId !== 'number' && typeof merkleTreeId !== 'string') || (typeof appId !== 'number' && typeof appId !== 'string')) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist for this claim is not published yet.');\n }\n return { merkleTreeId, appId };\n}\n\nasync function loadEntries(fetchFn: Fetch, api: string, instanceId: string, recipient: Address, scoped: ScopeCache): Promise<MerkleEntry[]> {\n const { signal } = scoped;\n const { merkleTreeId, appId } = await memo(scoped.instances, `${api}|${instanceId}`, signal, () => loadInstance(fetchFn, api, instanceId, signal));\n const url = `${api}/public/merkleTree/${encodeURIComponent(String(merkleTreeId))}/merkleInfo?address=${recipient}&appId=${encodeURIComponent(String(appId))}`;\n const body = await getJson(fetchFn, url, signal, 'merkle info');\n if (!Array.isArray(body)) throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist service returned an unexpected response.');\n return body.map((row): MerkleEntry => {\n const proof = isRecord(row) ? row.merkleProof : undefined;\n const value = isRecord(row) ? row.value : undefined;\n if (\n !Array.isArray(proof) ||\n !proof.every((p) => typeof p === 'string' && /^0x[0-9a-fA-F]{64}$/.test(p)) ||\n typeof value !== 'number' ||\n !Number.isInteger(value) ||\n value < 0 ||\n value > UINT32_MAX\n ) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist service returned an unexpected response.');\n }\n return { mintIndex: value, proof: proof as `0x${string}`[] };\n });\n}\n\n/** (mintIndex, proof) pairs for `recipient` on the claim's allowlist. [] = not on the list. */\nexport async function fetchMerkleEntries(args: {\n scope: object;\n api: string;\n instanceId: string;\n recipient: Address;\n fetch: Fetch | undefined;\n signal: AbortSignal | undefined;\n}): Promise<MerkleEntry[]> {\n if (args.signal?.aborted) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist request was cancelled.', { cause: args.signal.reason });\n }\n const fetchFn: Fetch = args.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const key = `${args.api}|${args.instanceId}|${args.recipient.toLowerCase()}`;\n let scoped = scopeCaches.get(args.scope);\n // A reused scope with a fresh lifetime must not inherit an aborted load or stale instance data.\n if (!scoped || scoped.signal?.aborted) {\n scoped = { signal: args.signal, instances: new Map(), entries: new Map() };\n scopeCaches.set(args.scope, scoped);\n }\n const cache = scoped;\n const entries = await memo(cache.entries, key, cache.signal, () => loadEntries(fetchFn, args.api, args.instanceId, args.recipient, cache));\n return entries.slice();\n}\n","// Interface contract (orchestrator-owned). Implementation: story s6. Spec ContractConfig.\nimport {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionZeroDataError,\n InsufficientFundsError,\n decodeErrorResult,\n encodeFunctionData,\n formatUnits,\n getAddress,\n isAddress,\n parseAbi,\n parseUnits,\n type Abi,\n type AbiFunction,\n type AbiParameter,\n type Hex,\n} from 'viem';\nimport type { Address, ArgTemplate, Attempt, ContractConfig, DropInfo, FieldSource, Money } from '../../types';\nimport type { AdapterContext, MintAdapter, MintPlan, WalletRead } from '../types';\nimport { MintError, isMintError } from '../../errors';\nimport { MAX_QUANTITY } from '../../machine';\n\nexport const PLACEHOLDERS = ['{recipient}', '{payer}', '{quantity}', '{unitPrice}', '{totalPrice}'] as const;\n\ntype Placeholder = (typeof PLACEHOLDERS)[number];\n\nconst ERC20_ABI = parseAbi([\n 'function symbol() view returns (string)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address) view returns (uint256)',\n 'function allowance(address,address) view returns (uint256)',\n 'function approve(address,uint256) returns (bool)',\n]);\n\n/** Gas units kept aside when the mint cannot be estimated (ERC20-priced mints, estimate failure). */\nconst FALLBACK_MINT_GAS = 300_000n;\n/** Extra gas for the approve that precedes an ERC20-priced mint. */\nconst APPROVE_GAS = 65_000n;\n\nconst PLACEHOLDER_TOKEN = /\\{[A-Za-z_]\\w*\\}/g;\nconst DISPLAY_AMOUNT = /^\\d+(\\.\\d+)?$/;\nconst NUMERIC_TYPE = /^u?int\\d*$/;\n\n// ---------- validation ----------\n\nfunction bad(field: string, message: string): never {\n throw new MintError('INVALID_CONFIG', `${field} ${message}`, { field });\n}\n\nconst isHexAddress = (a: unknown): a is Address => typeof a === 'string' && isAddress(a, { strict: false });\n\nfunction functionsNamed(abi: Abi, name: string): AbiFunction[] {\n return abi.filter((i): i is AbiFunction => i.type === 'function' && i.name === name);\n}\n\nfunction validateTemplate(t: unknown, path: string, allowed: readonly Placeholder[]): void {\n if (typeof t === 'string') {\n for (const token of t.match(PLACEHOLDER_TOKEN) ?? []) {\n if (!(PLACEHOLDERS as readonly string[]).includes(token)) bad(path, `\"${t}\" is not a known placeholder (${token})`);\n if (!allowed.includes(token as Placeholder)) bad(path, `\"${t}\" uses ${token}, which is not available in this field`);\n }\n } else if (Array.isArray(t)) {\n t.forEach((x, i) => validateTemplate(x, `${path}[${i}]`, allowed));\n } else if (typeof t === 'number') {\n if (!Number.isSafeInteger(t)) bad(path, `${t} is not a safe integer; pass larger or fractional values as a bigint or decimal string`);\n } else if (typeof t !== 'bigint' && typeof t !== 'boolean') {\n bad(path, 'must be a string, number, bigint, boolean or array');\n }\n}\n\n// ---------- template vs ABI input types ----------\n\ntype Issue = { path: string; message: string };\n\nconst ARRAY_TYPE = /^(.*)\\[(\\d*)\\]$/;\nconst BYTES_TYPE = /^bytes(\\d*)$/;\nconst INT_TYPE = /^(u?)int(\\d*)$/;\nconst isExactPlaceholder = (t: unknown): t is Placeholder => typeof t === 'string' && (PLACEHOLDERS as readonly string[]).includes(t);\nconst hasPlaceholder = (t: unknown): boolean => typeof t === 'string' && (t.match(PLACEHOLDER_TOKEN) ?? []).length > 0;\n\nfunction intBounds(type: string): { min: bigint; max: bigint } | null {\n const m = INT_TYPE.exec(type);\n if (!m) return null;\n const bits = BigInt(m[2] ? Number(m[2]) : 256);\n return m[1] ? { min: 0n, max: 2n ** bits - 1n } : { min: -(2n ** (bits - 1n)), max: 2n ** (bits - 1n) - 1n };\n}\n\nconst elementParam = (p: AbiParameter, type: string): AbiParameter => ({ ...p, type }) as AbiParameter;\nconst componentsOf = (p: AbiParameter): readonly AbiParameter[] => (p as { components?: readonly AbiParameter[] }).components ?? [];\n\n/** First way template `t` cannot be encoded as ABI input `p`, or null when it fits. */\nfunction typeIssue(t: ArgTemplate, p: AbiParameter, path: string): Issue | null {\n const no = (message: string): Issue => ({ path, message });\n const arr = ARRAY_TYPE.exec(p.type);\n if (arr) {\n if (!Array.isArray(t)) return no(`must be an array for ${p.type}`);\n if (arr[2] !== '' && t.length !== Number(arr[2])) return no(`has ${t.length} item(s) but ${p.type} takes ${arr[2]}`);\n const el = elementParam(p, arr[1]!);\n for (let i = 0; i < t.length; i++) {\n const issue = typeIssue(t[i]!, el, `${path}[${i}]`);\n if (issue) return issue;\n }\n return null;\n }\n if (p.type === 'tuple') {\n const comps = componentsOf(p);\n if (!Array.isArray(t)) return no('must be an array for a tuple');\n if (t.length !== comps.length) return no(`has ${t.length} item(s) but the tuple takes ${comps.length}`);\n for (let i = 0; i < comps.length; i++) {\n const issue = typeIssue(t[i]!, comps[i]!, `${path}[${i}]`);\n if (issue) return issue;\n }\n return null;\n }\n if (Array.isArray(t)) return no(`must not be an array for ${p.type}`);\n if (p.type === 'address') {\n if (isExactPlaceholder(t)) return t === '{recipient}' || t === '{payer}' ? null : no(`${t} is a number, but the abi input is an address`);\n return typeof t === 'string' && !hasPlaceholder(t) && isAddress(t) ? null : no(`${JSON.stringify(String(t))} is not an address`);\n }\n if (p.type === 'bool') return typeof t === 'boolean' ? null : no(`${JSON.stringify(String(t))} is not a boolean`);\n if (p.type === 'string') return typeof t === 'string' ? null : no(`${JSON.stringify(String(t))} is not a string`);\n const bytes = BYTES_TYPE.exec(p.type);\n if (bytes) {\n const ok = typeof t === 'string' && !hasPlaceholder(t) && /^0x([0-9a-fA-F]{2})*$/.test(t) && (!bytes[1] || t.length === 2 + 2 * Number(bytes[1]));\n return ok ? null : no(`${JSON.stringify(String(t))} is not ${bytes[1] ? `${bytes[1]} bytes of` : ''} hex data`);\n }\n const bounds = intBounds(p.type);\n if (bounds) {\n let n: bigint;\n if (isExactPlaceholder(t)) return t === '{recipient}' || t === '{payer}' ? no(`${t} is an address, but the abi input is ${p.type}`) : null;\n if (typeof t === 'bigint') n = t;\n else if (typeof t === 'number') n = BigInt(t);\n else if (typeof t === 'string' && !hasPlaceholder(t) && /^-?\\d+$/.test(t)) n = BigInt(t);\n else return no(`${JSON.stringify(String(t))} is not an integer for ${p.type}`);\n return n >= bounds.min && n <= bounds.max ? null : no(`${n} is out of range for ${p.type}`);\n }\n return no(`abi type ${p.type} is not supported in an argument template`);\n}\n\nconst signature = (f: AbiFunction): string => `${f.name}(${f.inputs.map((i) => i.type).join(',')})`;\n\n/** Placeholders that exist before a wallet is connected. */\nconst NO_PLACEHOLDERS: readonly Placeholder[] = [];\n\n/** Resolves one ABI function by name and by input types compatible with the arg templates. */\nfunction validateCall(\n abi: Abi,\n call: unknown,\n prefix: string,\n kind: 'read' | 'mint',\n allowed: readonly Placeholder[],\n): AbiFunction {\n const c = (call ?? {}) as { functionName?: unknown; args?: unknown };\n const named = typeof c.functionName === 'string' ? functionsNamed(abi, c.functionName) : [];\n if (named.length === 0) bad(`${prefix}.functionName`, `\"${String(c.functionName)}\" is not a function in the abi`);\n if (c.args !== undefined && !Array.isArray(c.args)) bad(`${prefix}.args`, 'must be an array');\n if (kind === 'mint' && c.args === undefined) bad(`${prefix}.args`, 'is required');\n const args = (c.args ?? []) as unknown[];\n args.forEach((a, i) => validateTemplate(a, `${prefix}.args[${i}]`, allowed));\n const sameArity = named.filter((f) => f.inputs.length === args.length);\n if (sameArity.length === 0) {\n const want = [...new Set(named.map((f) => f.inputs.length))].join(' or ');\n bad(`${prefix}.args`, `has ${args.length} argument(s) but \"${String(c.functionName)}\" takes ${want}`);\n }\n const checked = sameArity.map((f) => {\n let issue: Issue | null = null;\n for (let i = 0; i < args.length && !issue; i++) issue = typeIssue(args[i] as ArgTemplate, f.inputs[i]!, `${prefix}.args[${i}]`);\n return { f, issue };\n });\n const fits = checked.filter((x) => !x.issue);\n if (fits.length === 0) {\n const first = checked[0]!.issue!;\n if (sameArity.length === 1) bad(first.path, first.message);\n bad(`${prefix}.args`, `fit none of the overloads ${sameArity.map(signature).join(', ')}: ${first.path} ${first.message}`);\n }\n const roleFits = fits.filter(({ f }) =>\n kind === 'read'\n ? f.stateMutability === 'view' || f.stateMutability === 'pure'\n : f.stateMutability === 'payable' || f.stateMutability === 'nonpayable',\n );\n if (roleFits.length === 0) {\n const name = fits[0]!.f.name;\n if (kind === 'read') bad(`${prefix}.functionName`, `\"${name}\" is not a view or pure function`);\n if (fits.some(({ f }) => f.stateMutability !== 'view' && f.stateMutability !== 'pure')) {\n bad(`${prefix}.functionName`, `\"${name}\" has missing or invalid stateMutability; mint requires payable or nonpayable`);\n }\n bad(`${prefix}.functionName`, `\"${name}\" is a view or pure function and cannot mint`);\n }\n if (roleFits.length > 1) {\n bad(`${prefix}.functionName`, `\"${String(c.functionName)}\" is ambiguous: ${roleFits.map((x) => signature(x.f)).join(' and ')} both accept these arguments`);\n }\n return roleFits[0]!.f;\n}\n\ntype OutputRef = { tuple: boolean; index: number; type: string };\n\n/** Resolves which return value a read field uses. Throws INVALID_CONFIG naming the bad field. */\nfunction resolveOutput(fn: AbiFunction, output: unknown, path: string): OutputRef {\n const outs = fn.outputs;\n if (outs.length === 0) bad(`${path}.functionName`, `\"${fn.name}\" returns nothing`);\n const first = outs[0]!;\n const tuple = outs.length === 1 && first.type === 'tuple';\n const members = tuple ? ((first as { components?: readonly { name?: string; type: string }[] }).components ?? []) : outs;\n const memberNames = members.map((m, i) => m.name || String(i)).join(', ');\n let index: number;\n if (output === undefined) {\n if (members.length !== 1) bad(`${path}.output`, `is required: \"${fn.name}\" returns several values (${memberNames})`);\n index = 0;\n } else if (typeof output === 'number') {\n if (!Number.isInteger(output) || output < 0 || output >= members.length) {\n bad(`${path}.output`, `${output} is not in the abi outputs of \"${fn.name}\" (${memberNames})`);\n }\n index = output;\n } else if (typeof output === 'string') {\n index = members.findIndex((m) => m.name === output);\n if (index < 0) bad(`${path}.output`, `\"${output}\" is not in the abi outputs of \"${fn.name}\" (${memberNames})`);\n } else {\n return bad(`${path}.output`, 'must be an index or a name');\n }\n const type = members[index]!.type;\n if (!NUMERIC_TYPE.test(type)) {\n const reason = `returns ${type}, not a number`;\n if (output === undefined) bad(`${path}.functionName`, `\"${fn.name}\" ${reason}`);\n bad(`${path}.output`, `selects a value that is ${type}, not a number`);\n }\n return { tuple, index, type };\n}\n\nfunction validateField(\n abi: Abi,\n name: string,\n src: unknown,\n allowed: readonly Placeholder[],\n isPrice: boolean,\n): void {\n if (typeof src !== 'object' || src === null) bad(name, 'is required and must be { value } or { read }');\n const s = src as { value?: unknown; unit?: unknown; read?: unknown };\n const hasRead = Object.hasOwn(s, 'read');\n const hasValue = Object.hasOwn(s, 'value');\n if (hasRead && hasValue) bad(name, 'must be exactly one of { value } or { read }, not both');\n if (hasRead) {\n if (typeof s.read !== 'object' || s.read === null) bad(`${name}.read`, 'must be { functionName, args?, output? }');\n if (s.unit !== undefined) bad(name, 'unit is only valid with a string value');\n const fn = validateCall(abi, s.read, `${name}.read`, 'read', allowed);\n resolveOutput(fn, (s.read as { output?: unknown }).output, `${name}.read`);\n } else if (typeof s.value === 'bigint') {\n if (s.unit !== undefined) bad(name, 'unit is only valid with a string value');\n if (s.value < 0n) bad(`${name}.value`, 'must not be negative');\n } else if (typeof s.value === 'string') {\n if (s.unit !== 'display') bad(name, 'string values need unit: \"display\"');\n if (!isPrice) bad(name, 'display units are only valid for price; use a bigint in base units');\n if (!DISPLAY_AMOUNT.test(s.value)) bad(`${name}.value`, `\"${s.value}\" is not a decimal number like \"0.01\"`);\n } else {\n bad(name, 'must be { value: bigint }, { value: string, unit: \"display\" } (price only) or { read: {...} }');\n }\n}\n\nfunction hasNonzeroStaticPrice(price: unknown): boolean {\n if (typeof price !== 'object' || price === null || !Object.hasOwn(price, 'value')) return false;\n const v = (price as { value: unknown }).value;\n return typeof v === 'bigint' ? v > 0n : typeof v === 'string' && /[1-9]/.test(v);\n}\n\n/**\n * Validates an agent-written config before any network call. Throws MintError('INVALID_CONFIG', msg,\n * { field }) naming the exact bad field: unknown mint.functionName / read functionName, unknown\n * placeholder (field \"mint.args[i]\"), arg count mismatch, missing price, read output index/name not in the\n * ABI outputs or not a numeric type, display unit outside price, bad addresses.\n */\nexport function validateContractConfig(config: ContractConfig): void {\n const c = config as Partial<ContractConfig> | null | undefined;\n if (!c || typeof c !== 'object') bad('config', 'must be an object');\n if (c.type !== 'contract') bad('type', 'must be \"contract\"');\n if (!Number.isSafeInteger(c.chainId) || (c.chainId as number) <= 0) bad('chainId', 'must be a positive safe integer');\n if (!isHexAddress(c.address)) bad('address', `\"${String(c.address)}\" is not a valid address`);\n if (c.tokenContract !== undefined && !isHexAddress(c.tokenContract)) {\n bad('tokenContract', `\"${String(c.tokenContract)}\" is not a valid address`);\n }\n if (!Array.isArray(c.abi)) bad('abi', 'must be an abi array');\n const abi = c.abi;\n\n const mintFn = validateCall(abi, c.mint, 'mint', 'mint', PLACEHOLDERS);\n\n if (c.price === undefined || c.price === null) bad('price', 'is required');\n validateField(abi, 'price', c.price, NO_PLACEHOLDERS, true);\n const cur = (c.price as { currency?: unknown }).currency;\n if (cur !== 'native' && !(typeof cur === 'object' && cur !== null && isHexAddress((cur as { address?: unknown }).address))) {\n bad('price.currency', 'must be \"native\" or { address } with a valid ERC20 address');\n }\n if (cur === 'native' && mintFn.stateMutability === 'nonpayable' && hasNonzeroStaticPrice(c.price)) {\n bad('price', `is a native price, but \"${mintFn.name}\" is nonpayable and cannot take value`);\n }\n const per = (c.price as { per?: unknown }).per;\n if (per !== undefined && per !== 'unit' && per !== 'total') bad('price.per', 'must be \"unit\" or \"total\"');\n\n // Drop-level reads happen before a wallet is connected, so wallet placeholders do not exist there.\n validateOptional(abi, 'totalMinted', c.totalMinted, NO_PLACEHOLDERS);\n validateOptional(abi, 'maxSupply', c.maxSupply, NO_PLACEHOLDERS);\n validateOptional(abi, 'startTime', c.startTime, NO_PLACEHOLDERS);\n validateOptional(abi, 'endTime', c.endTime, NO_PLACEHOLDERS);\n validateOptional(abi, 'walletMinted', c.walletMinted, PLACEHOLDERS);\n validateOptional(abi, 'walletMax', c.walletMax, PLACEHOLDERS);\n}\n\nfunction validateOptional(abi: Abi, name: string, src: unknown, allowed: readonly Placeholder[]): void {\n if (src !== undefined) validateField(abi, name, src, allowed, false);\n}\n\n// ---------- templating ----------\n\ntype Vars = { recipient?: Address; payer?: Address; quantity?: bigint; unitPrice?: bigint; totalPrice?: bigint };\n\nfunction varFor(token: string, vars: Vars): bigint | Address {\n const key = token.slice(1, -1) as keyof Vars;\n const v = vars[key];\n if (v === undefined) throw new MintError('INVALID_CONFIG', `placeholder ${token} has no value here`);\n return typeof v === 'string' ? getAddress(v) : v;\n}\n\n/**\n * Fills a template for ABI input `p` (already checked by typeIssue). A string that is exactly one placeholder\n * becomes the typed value; embedded placeholders are stringified; integer literals become bigint.\n */\nfunction fill(t: ArgTemplate, p: AbiParameter, vars: Vars): unknown {\n const arr = ARRAY_TYPE.exec(p.type);\n if (arr && Array.isArray(t)) return t.map((x) => fill(x, elementParam(p, arr[1]!), vars));\n if (p.type === 'tuple' && Array.isArray(t)) return t.map((x, i) => fill(x, componentsOf(p)[i]!, vars));\n if (typeof t === 'number') return BigInt(t);\n if (typeof t !== 'string') return t;\n if (p.type === 'string') return t.replace(PLACEHOLDER_TOKEN, (token) => String(varFor(token, vars)));\n if (isExactPlaceholder(t)) return varFor(t, vars);\n if (intBounds(p.type)) return BigInt(t);\n return t;\n}\n\nconst fillArgs = (args: readonly ArgTemplate[] | undefined, inputs: readonly AbiParameter[], vars: Vars): unknown[] =>\n (args ?? []).map((a, i) => fill(a, inputs[i]!, vars));\n\n/** {unitPrice} is the configured price as reported in DropInfo; {totalPrice} is what the mint costs. */\nconst totalFor = (per: 'unit' | 'total', price: bigint, quantity: bigint): bigint => (per === 'total' ? price : price * quantity);\n\n// ---------- chain reads ----------\n\nfunction shortMessage(e: unknown): string {\n return e instanceof BaseError ? e.shortMessage : e instanceof Error ? e.message : String(e);\n}\n\nconst abortError = (): Error => new DOMException('The operation was aborted', 'AbortError');\nconst isAbortError = (e: unknown): boolean => (e as { name?: unknown } | null)?.name === 'AbortError';\n\n/** Rejects a pre-aborted signal before any work starts. */\nfunction throwIfAborted(ctx: AdapterContext): void {\n if (ctx.signal?.aborted) throw abortError();\n}\n\n/** Runs one client operation; an abort rejects promptly even if the transport never settles. */\nfunction io<T>(ctx: AdapterContext, start: () => Promise<T>): Promise<T> {\n const signal = ctx.signal;\n if (!signal) return start();\n if (signal.aborted) return Promise.reject(abortError());\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(abortError());\n signal.addEventListener('abort', onAbort, { once: true });\n start().then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n });\n}\n\nfunction rpcError(e: unknown): never {\n if (isMintError(e) || isAbortError(e)) throw e;\n throw new MintError('RPC_ERROR', `RPC request failed: ${shortMessage(e)}`, { cause: e });\n}\n\n/** A contract that reverts or returns no data is a config problem; anything else is the RPC's. */\nfunction classifyReadError(e: unknown, field: string): never {\n if (isMintError(e) || isAbortError(e)) throw e;\n if (e instanceof BaseError && e.walk((x) => x instanceof ContractFunctionRevertedError || x instanceof ContractFunctionZeroDataError)) {\n throw new MintError('INVALID_CONFIG', `${field} read reverted or returned no data: ${e.shortMessage}`, { field, cause: e });\n }\n return rpcError(e);\n}\n\nasync function readCall(\n ctx: AdapterContext,\n params: { address: Address; abi: Abi; functionName: string; args?: readonly unknown[] },\n field: string,\n): Promise<unknown> {\n try {\n return await io(ctx, () => ctx.client.readContract(params as never));\n } catch (e) {\n return classifyReadError(e, field);\n }\n}\n\nfunction toBigInt(v: unknown, field: string): bigint {\n const n = typeof v === 'number' ? BigInt(v) : v;\n if (typeof n !== 'bigint') throw new MintError('INVALID_CONFIG', `${field} did not return a number`, { field });\n if (n < 0n) throw new MintError('INVALID_CONFIG', `${field} returned a negative number`, { field });\n return n;\n}\n\nasync function readField(ctx: AdapterContext, config: ContractConfig, name: string, src: FieldSource, vars: Vars): Promise<bigint> {\n if (Object.hasOwn(src, 'read') && (src as { read?: unknown }).read != null) {\n const read = (src as Extract<FieldSource, { read: unknown }>).read;\n const path = `${name}.read`;\n const fn = validateCall(config.abi, read, path, 'read', PLACEHOLDERS);\n const args = fillArgs(read.args, fn.inputs, vars);\n const ref = resolveOutput(fn, read.output, path);\n const res = await readCall(ctx, { address: config.address, abi: [fn], functionName: fn.name, args }, `${path}.functionName`);\n const members = fn.outputs.length === 1 && !ref.tuple ? [res] : ref.tuple ? tupleMembers(res, fn, ref.index) : (res as readonly unknown[]);\n return toBigInt(members[ref.index], path);\n }\n const value = (src as { value: unknown }).value;\n if (typeof value === 'bigint') return value;\n throw new MintError('INVALID_CONFIG', `${name} display units are only valid for price`, { field: name });\n}\n\n/** viem returns a struct as an object when every component is named, else as an array. */\nfunction tupleMembers(res: unknown, fn: AbiFunction, index: number): unknown[] {\n if (Array.isArray(res)) return res;\n const comps = (fn.outputs[0] as { components?: readonly { name?: string }[] }).components ?? [];\n const out: unknown[] = [];\n out[index] = (res as Record<string, unknown>)[comps[index]?.name ?? ''];\n return out;\n}\n\nconst optField = (ctx: AdapterContext, config: ContractConfig, name: string, src: FieldSource | undefined, vars: Vars) =>\n src ? readField(ctx, config, name, src, vars) : Promise.resolve(null);\n\nfunction toSeconds(v: bigint | null, field: string): number | null {\n if (v === null || v === 0n) return null;\n if (v > BigInt(Number.MAX_SAFE_INTEGER)) throw new MintError('INVALID_CONFIG', `${field} is too large for a unix timestamp`, { field });\n return Number(v);\n}\n\n// ---------- currency and price ----------\n\ntype Meta = { token: Address | null; decimals: number; symbol: string };\n\nfunction nativeMeta(ctx: AdapterContext): { decimals: number; symbol: string } {\n const n = ctx.client.chain?.nativeCurrency;\n return { decimals: n?.decimals ?? 18, symbol: n?.symbol ?? 'ETH' };\n}\n\nconst erc20Of = (config: ContractConfig): Address | null =>\n config.price.currency === 'native' ? null : getAddress(config.price.currency.address);\n\nasync function currencyMeta(ctx: AdapterContext, config: ContractConfig): Promise<Meta> {\n const token = erc20Of(config);\n if (!token) return { token, ...nativeMeta(ctx) };\n const field = 'price.currency.address';\n const [symbol, decimals] = await Promise.all([\n readCall(ctx, { address: token, abi: ERC20_ABI, functionName: 'symbol' }, field),\n readCall(ctx, { address: token, abi: ERC20_ABI, functionName: 'decimals' }, field),\n ]);\n if (typeof symbol !== 'string' || typeof decimals !== 'number') {\n throw new MintError('INVALID_CONFIG', `${field} ${token} is not an ERC20 (symbol/decimals unreadable)`, { field });\n }\n return { token, decimals, symbol };\n}\n\nfunction parseDisplay(value: string, decimals: number): bigint {\n const frac = value.split('.')[1] ?? '';\n if (frac.length > decimals) {\n throw new MintError('INVALID_CONFIG', `price.value \"${value}\" has more than ${decimals} decimal places`, { field: 'price.value' });\n }\n return parseUnits(value, decimals);\n}\n\nasync function resolvePrice(ctx: AdapterContext, config: ContractConfig, meta?: Meta): Promise<bigint> {\n const price = config.price;\n if (Object.hasOwn(price, 'read')) return readField(ctx, config, 'price', price, {});\n const value = (price as { value: bigint | string }).value;\n if (typeof value === 'bigint') return value;\n return parseDisplay(value, (meta ?? (await currencyMeta(ctx, config))).decimals);\n}\n\nconst money = (value: bigint, decimals: number, symbol: string): Money => ({\n value,\n decimals,\n symbol,\n formatted: formatUnits(value, decimals),\n});\n\n// ---------- simulation ----------\n\nfunction revertData(e: unknown): Hex | null {\n for (let cur: unknown = e, depth = 0; cur && depth < 12; depth++) {\n const d = (cur as { data?: unknown }).data;\n if (typeof d === 'string' && d.startsWith('0x') && d.length >= 10) return d as Hex;\n if (d && typeof d === 'object' && typeof (d as { data?: unknown }).data === 'string') {\n const inner = (d as { data: string }).data;\n if (inner.startsWith('0x') && inner.length >= 10) return inner as Hex;\n }\n cur = (cur as { cause?: unknown }).cause;\n }\n return null;\n}\n\nfunction describeRevert(abi: Abi, data: Hex): string {\n try {\n const d = decodeErrorResult({ abi, data });\n const args = (d.args ?? []) as readonly unknown[];\n if (d.errorName === 'Error') return String(args[0] ?? 'execution reverted');\n const inputs = ((d as { abiItem?: { inputs?: readonly { name?: string }[] } }).abiItem?.inputs ?? []) as readonly { name?: string }[];\n const shown = args.map((a, i) => (inputs[i]?.name ? `${inputs[i]!.name}: ${String(a)}` : String(a)));\n return `${d.errorName}(${shown.join(', ')})`;\n } catch {\n return `reverted with unrecognized error ${data.slice(0, 10)}`;\n }\n}\n\nfunction toSimulationError(e: unknown, abi: Abi): MintError {\n if (isMintError(e)) return e;\n if (isAbortError(e)) throw e;\n if (e instanceof BaseError && e.walk((x) => x instanceof InsufficientFundsError)) {\n return new MintError('INSUFFICIENT_FUNDS', `Payer cannot cover the mint: ${e.shortMessage}`, { cause: e });\n }\n const data = revertData(e);\n if (data) return new MintError('SIMULATION_REVERTED', describeRevert(abi, data), { cause: e });\n const isRevert = e instanceof BaseError && e.walk((x) => (x as { code?: number }).code === 3 || /execution reverted/i.test((x as Error).message));\n if (isRevert) return new MintError('SIMULATION_REVERTED', shortMessage(e), { cause: e });\n return new MintError('RPC_ERROR', `RPC request failed: ${shortMessage(e)}`, { cause: e });\n}\n\ntype MintCall = { payer: Address; to: Address; data: Hex; value: bigint };\n\nasync function simulateMint(ctx: AdapterContext, config: ContractConfig, call: MintCall): Promise<void> {\n try {\n await io(ctx, () => ctx.client.call({ account: call.payer, to: call.to, data: call.data, value: call.value }));\n } catch (e) {\n throw toSimulationError(e, config.abi);\n }\n}\n\nfunction encodeMint(config: ContractConfig, vars: Vars): Hex {\n const fn = validateCall(config.abi, config.mint, 'mint', 'mint', PLACEHOLDERS);\n try {\n return encodeFunctionData({ abi: [fn], functionName: fn.name, args: fillArgs(config.mint.args, fn.inputs, vars) as never } as never);\n } catch (e) {\n if (isMintError(e)) throw e;\n throw new MintError('INVALID_CONFIG', `mint.args cannot be encoded for ${signature(fn)}: ${shortMessage(e)}`, { field: 'mint.args', cause: e });\n }\n}\n\n/** Native value goes only to a payable mint; a nonpayable mint with a nonzero native total would always revert. */\nfunction mintValue(config: ContractConfig, token: Address | null, totalPrice: bigint): bigint {\n if (token) return 0n;\n const fn = validateCall(config.abi, config.mint, 'mint', 'mint', PLACEHOLDERS);\n if (fn.stateMutability === 'nonpayable') {\n if (totalPrice > 0n) bad('price', `is ${totalPrice} wei in native currency, but \"${fn.name}\" is nonpayable and cannot take value`);\n return 0n;\n }\n return totalPrice;\n}\n\n// ---------- adapter ----------\n\nasync function readDrop(ctx: AdapterContext, config: ContractConfig): Promise<DropInfo> {\n validateContractConfig(config);\n throwIfAborted(ctx);\n const meta = await currencyMeta(ctx, config);\n const none: Vars = {};\n const [price, totalMinted, maxSupply, start, end] = await Promise.all([\n resolvePrice(ctx, config, meta),\n optField(ctx, config, 'totalMinted', config.totalMinted, none),\n optField(ctx, config, 'maxSupply', config.maxSupply, none),\n optField(ctx, config, 'startTime', config.startTime, none),\n optField(ctx, config, 'endTime', config.endTime, none),\n ]);\n mintValue(config, meta.token, price);\n const native = nativeMeta(ctx);\n return {\n chainId: config.chainId,\n unitPrice: money(price, meta.decimals, meta.symbol),\n unitFee: money(0n, native.decimals, native.symbol),\n totalMinted: totalMinted ?? 0n,\n maxSupply: maxSupply === null || maxSupply === 0n ? null : maxSupply,\n startTime: toSeconds(start, 'startTime'),\n endTime: toSeconds(end, 'endTime'),\n isAllowlist: false,\n paymentToken: meta.token,\n pricePer: config.price.per ?? 'unit',\n };\n}\n\nasync function readWallet(\n ctx: AdapterContext,\n config: ContractConfig,\n { payer, recipient, quantity, drop }: { payer: Address; recipient: Address; quantity: number; drop: DropInfo },\n): Promise<WalletRead> {\n validateContractConfig(config);\n throwIfAborted(ctx);\n const qty = BigInt(quantity);\n const unitPrice = drop.unitPrice.value;\n const totalPrice = totalFor(drop.pricePer, unitPrice, qty);\n const vars: Vars = { payer, recipient, quantity: qty, unitPrice, totalPrice };\n\n const [walletMinted, rawMax, native, erc20] = await Promise.all([\n optField(ctx, config, 'walletMinted', config.walletMinted, vars),\n optField(ctx, config, 'walletMax', config.walletMax, vars),\n io(ctx, () => ctx.client.getBalance({ address: payer })).catch(rpcError),\n drop.paymentToken\n ? readCall(ctx, { address: drop.paymentToken, abi: ERC20_ABI, functionName: 'balanceOf', args: [payer] }, 'price.currency.address').then((v) =>\n toBigInt(v, 'price.currency.address'),\n )\n : Promise.resolve(null),\n ]);\n // walletMax 0 = no limit\n const walletMax = rawMax === null || rawMax === 0n ? null : rawMax;\n const remaining = walletMax === null ? null : walletMax > (walletMinted ?? 0n) ? walletMax - (walletMinted ?? 0n) : 0n;\n const maxQuantity = remaining === null ? null : Number(remaining < BigInt(MAX_QUANTITY) ? remaining : BigInt(MAX_QUANTITY));\n\n let ineligible: WalletRead['ineligible'] = null;\n let gas = FALLBACK_MINT_GAS;\n if (remaining === 0n) {\n ineligible = { reason: 'WALLET_LIMIT', message: `This wallet has already minted its limit of ${walletMax}.` };\n } else if (drop.paymentToken === null && native >= totalPrice) {\n // An ERC20-priced mint cannot be simulated before its approve, and a payer who cannot cover the value\n // is reported as insufficient funds by the machine, so only simulate when the call can run.\n const call: MintCall = { payer, to: getAddress(config.address), data: encodeMint(config, vars), value: mintValue(config, null, totalPrice) };\n try {\n await simulateMint(ctx, config, call);\n gas = await io(ctx, () => ctx.client.estimateGas({ account: payer, to: call.to, data: call.data, value: call.value })).catch((e) => {\n throw toSimulationError(e, config.abi);\n });\n } catch (e) {\n if (!isMintError(e) || e.reason !== 'SIMULATION_REVERTED') throw e;\n ineligible = { reason: 'SIMULATION_REVERTED', message: e.message };\n }\n }\n if (drop.paymentToken) gas += APPROVE_GAS;\n const gasPrice = await io(ctx, () => ctx.client.getGasPrice()).catch(rpcError);\n\n return {\n walletMinted,\n walletMax,\n allowlistRemaining: null,\n maxQuantity,\n ineligible,\n balances: { native, erc20 },\n gasReserve: gas * gasPrice,\n };\n}\n\nasync function buildPlan(ctx: AdapterContext, attempt: Attempt & { config: ContractConfig }, wallet: WalletRead): Promise<MintPlan> {\n void wallet;\n const { config, payer, recipient } = attempt;\n validateContractConfig(config);\n throwIfAborted(ctx);\n const qty = BigInt(attempt.quantity);\n const unitPrice = await resolvePrice(ctx, config);\n const totalPrice = totalFor(config.price.per ?? 'unit', unitPrice, qty);\n const to = getAddress(config.address);\n const token = erc20Of(config);\n const mint = {\n to,\n data: encodeMint(config, { payer, recipient, quantity: qty, unitPrice, totalPrice }),\n value: mintValue(config, token, totalPrice),\n };\n let approve: MintPlan['approve'] = null;\n if (token) {\n const allowance = toBigInt(\n await readCall(ctx, { address: token, abi: ERC20_ABI, functionName: 'allowance', args: [payer, to] }, 'price.currency.address'),\n 'price.currency.address',\n );\n if (allowance < totalPrice) {\n approve = {\n token,\n spender: to,\n amount: totalPrice,\n tx: { to: token, data: encodeFunctionData({ abi: ERC20_ABI, functionName: 'approve', args: [to, totalPrice] }), value: 0n },\n };\n }\n }\n return { approve, mint, tokenContract: getAddress(attempt.tokenContract) };\n}\n\nasync function simulate(ctx: AdapterContext, attempt: Attempt & { config: ContractConfig }, plan: MintPlan): Promise<void> {\n throwIfAborted(ctx);\n await simulateMint(ctx, attempt.config, { payer: attempt.payer, to: plan.mint.to, data: plan.mint.data, value: plan.mint.value });\n}\n\nexport const contractAdapter: MintAdapter<ContractConfig> = { readDrop, readWallet, buildPlan, simulate };\n","// Interface contract (orchestrator-owned). Implementation: story s3.\n// Pure reducer, no I/O, no Date.now(): time arrives in events.\nimport { formatUnits } from 'viem';\nimport type { Address, Attempt, DropInfo, MintResult, Money } from './types';\nimport { INELIGIBLE_REASONS } from './errors';\nimport type { ErrorReason, ReasonCode, UnsupportedReason } from './errors';\nimport type { WalletRead } from './adapters/types';\n\nexport const MINT_STATES = [\n 'loading',\n 'unsupported',\n 'upcoming',\n 'ended',\n 'sold-out',\n 'disconnected',\n 'connecting',\n 'live',\n 'ineligible',\n 'insufficient-funds',\n 'switching-chain',\n 'approving',\n 'minting',\n 'confirming',\n 'success',\n 'error',\n] as const;\nexport type MintStateName = (typeof MINT_STATES)[number];\n\n/** States where mint() does something (spec: Clickable column). */\nexport const CLICKABLE_STATES: readonly MintStateName[] = ['disconnected', 'live', 'success', 'error'];\n/** An attempt is in flight; reads/prop changes are deferred (pendingRefresh) until a terminal state. */\nexport const IN_FLIGHT_STATES: readonly MintStateName[] = ['switching-chain', 'approving', 'minting', 'confirming'];\n\n/** uint16 mintCount cap on Manifold extensions; also the global quantity cap. */\nexport const MAX_QUANTITY = 65535;\n\nexport type Account = { address: Address; chainId: number };\n\nexport type MachineState = {\n name: MintStateName;\n reason: ReasonCode | null;\n /** Plain-English text for reason (decoded revert for SIMULATION_REVERTED / TX_REVERTED). */\n message: string | null;\n /** Generation of the current drop read; DROP_* events with another gen are ignored. */\n readGen: number;\n /** Generation of the current wallet read; bumped by ACCOUNT_CHANGED. WALLET_* with another gen are ignored. */\n walletGen: number;\n drop: DropInfo | null;\n account: Account | null;\n walletRead: WalletRead | null;\n /**\n * Set by ATTEMPT_FAILED for ineligible / insufficient-funds reasons. Sticky: survives drop refreshes and is\n * cleared by the next WALLET_LOADED, ACCOUNT_CHANGED, config LOAD or RESET.\n */\n blocked: Derived | null;\n quantity: number;\n attempt: Attempt | null;\n result: MintResult | null;\n /** Set when a read/account/quantity change arrived during an in-flight attempt. */\n pendingRefresh: boolean;\n /** Monotonic Unix seconds: the maximum accepted DROP_LOADED / TICK time. */\n now: number;\n};\n\nexport type MachineEvent =\n /**\n * Sets readGen = gen. kind 'refresh' (30s timer, visibilitychange): keeps the known drop on screen.\n * kind 'config' (mount, config/recipient change): clears drop + walletRead, bumps walletGen, shows 'loading'.\n */\n | { type: 'LOAD'; gen: number; kind: 'config' | 'refresh' }\n | { type: 'DROP_LOADED'; gen: number; drop: DropInfo; now: number }\n | { type: 'DROP_UNSUPPORTED'; gen: number; reason: UnsupportedReason; message: string }\n | { type: 'READ_FAILED'; gen: number; reason: ErrorReason; message: string }\n /** Wallet connected / switched account / switched chain / disconnected (null). Bumps walletGen. */\n | { type: 'ACCOUNT_CHANGED'; account: Account | null }\n | { type: 'WALLET_LOADED'; gen: number; read: WalletRead }\n | { type: 'WALLET_FAILED'; gen: number; reason: ErrorReason; message: string }\n | { type: 'CONNECT_STARTED' }\n | { type: 'CONNECT_DISMISSED' }\n | { type: 'TICK'; now: number }\n | { type: 'SET_QUANTITY'; quantity: number }\n | { type: 'ATTEMPT_STARTED'; attempt: Attempt }\n | { type: 'SWITCHING_CHAIN'; attemptId: number }\n | { type: 'APPROVING'; attemptId: number }\n | { type: 'MINT_PROMPTED'; attemptId: number }\n | { type: 'TX_SUBMITTED'; attemptId: number }\n | { type: 'ATTEMPT_SUCCEEDED'; attemptId: number; result: MintResult }\n | { type: 'ATTEMPT_FAILED'; attemptId: number; reason: ReasonCode; message: string }\n /**\n * Click in success/error: clears result/error/walletRead, sets readGen = gen, bumps walletGen and\n * re-derives; with an account it shows 'loading' until the fresh WALLET_LOADED (AC-15).\n */\n | { type: 'RESET'; gen: number };\n\nexport function initialState(opts?: { quantity?: number }): MachineState {\n return {\n name: 'loading',\n reason: null,\n message: null,\n readGen: 0,\n walletGen: 0,\n drop: null,\n account: null,\n walletRead: null,\n blocked: null,\n quantity: toQuantity(opts?.quantity ?? 1, MAX_QUANTITY),\n attempt: null,\n result: null,\n pendingRefresh: false,\n now: 0,\n };\n}\n\n/** Floor, then clamp to [1, max]. NaN becomes 1. */\nfunction toQuantity(q: number, max: number): number {\n if (Number.isNaN(q)) return 1;\n return Math.max(1, Math.min(Math.floor(q), max));\n}\n\n/** An attempt is in flight from ATTEMPT_STARTED until success/error, including the 'live' gap before the first step. */\nfunction isInFlight(s: MachineState): boolean {\n return s.attempt !== null || IN_FLIGHT_STATES.includes(s.name);\n}\n\n/** Names that are re-derived from data on every change (rule 2). */\nfunction isIdle(s: MachineState): boolean {\n return !isInFlight(s) && s.name !== 'connecting' && s.name !== 'success' && s.name !== 'error';\n}\n\ntype Derived = Pick<MachineState, 'name' | 'reason' | 'message'>;\n\nfunction derive(s: MachineState, unsupported: boolean): Derived {\n const named = (name: MintStateName): Derived => ({ name, reason: null, message: null });\n const { drop, walletRead } = s;\n if (unsupported) return { name: 'unsupported', reason: s.reason, message: s.message };\n if (drop === null) return named('loading');\n if (drop.endTime !== null && drop.endTime <= s.now) return named('ended');\n if (drop.maxSupply !== null && drop.maxSupply > 0n && drop.totalMinted >= drop.maxSupply) return named('sold-out');\n if (drop.startTime !== null && drop.startTime > s.now) return named('upcoming');\n if (s.account === null) return named('disconnected');\n if (walletRead === null) return named('loading');\n if (s.blocked !== null) return s.blocked;\n if (walletRead.ineligible !== null) {\n return { name: 'ineligible', reason: walletRead.ineligible.reason, message: walletRead.ineligible.message };\n }\n const total = selectTotal(s);\n if (total !== null) {\n const { native, erc20 } = total;\n if (native.value + walletRead.gasReserve > walletRead.balances.native) {\n return { name: 'insufficient-funds', reason: 'INSUFFICIENT_FUNDS', message: `Not enough ${native.symbol} to cover the mint.` };\n }\n // A null ERC20 balance means the adapter could not read it; the simulation catches a real shortfall.\n if (erc20 !== null && walletRead.balances.erc20 !== null && erc20.value > walletRead.balances.erc20) {\n return { name: 'insufficient-funds', reason: 'INSUFFICIENT_FUNDS', message: `Not enough ${erc20.symbol} to cover the mint.` };\n }\n }\n return named('live');\n}\n\n/** Re-derive the name when idle; otherwise keep it. `unsupported` stays sticky until a new read result replaces it. */\nfunction settle(s: MachineState, unsupported = s.name === 'unsupported'): MachineState {\n if (!isIdle(s)) return s;\n return { ...s, ...derive(s, unsupported) };\n}\n\n/** Shrink quantity when new data lowers the cap. Never raises it. */\nfunction clampQuantity(s: MachineState): MachineState {\n const quantity = toQuantity(s.quantity, selectMaxQuantity(s) ?? MAX_QUANTITY);\n return quantity === s.quantity ? s : { ...s, quantity };\n}\n\n/**\n * Rules (all are tested):\n * 1. Stale results: DROP_LOADED / DROP_UNSUPPORTED / READ_FAILED with gen !== readGen, WALLET_LOADED /\n * WALLET_FAILED with gen !== walletGen, and attempt events whose attemptId !== attempt?.attemptId\n * return the SAME state object (reference-equal).\n * 2. Derivation when idle (no attempt, not connecting/success/error), in priority order:\n * unsupported (DROP_UNSUPPORTED) > loading (no drop) > ended (endTime !== null && endTime <= now)\n * > sold-out (maxSupply !== null && maxSupply > 0n && totalMinted >= maxSupply)\n * > upcoming (startTime !== null && startTime > now) > disconnected (account null)\n * > loading (account set, no walletRead for the current walletGen)\n * > ineligible (walletRead.ineligible) > insufficient-funds (selectTotal vs walletRead.balances,\n * native leg includes walletRead.gasReserve) > live.\n * Wrong chain is NOT a derived state: live stays live; switching happens on click.\n * 3. TICK only changes time and time never goes backward (now = max(now, event.now)); it can flip\n * upcoming -> live/disconnected and live -> ended, never ended -> anything.\n * 4. CONNECT_STARTED from disconnected -> connecting. CONNECT_DISMISSED from connecting -> derived\n * (disconnected). ACCOUNT_CHANGED with an account while connecting -> derived (loading until WALLET_LOADED).\n * 5. ATTEMPT_STARTED is accepted only from live. The attempt is frozen; name stays 'live' until the\n * first step event (SWITCHING_CHAIN -> switching-chain, APPROVING -> approving,\n * MINT_PROMPTED -> minting, TX_SUBMITTED -> confirming). Steps only move forward in that order\n * (skips allowed); a duplicate or backward step returns the SAME state object.\n * 6. During IN_FLIGHT_STATES: LOAD, ACCOUNT_CHANGED, SET_QUANTITY, TICK, DROP_LOADED and WALLET_LOADED\n * do not change name/attempt; they store data where applicable and set pendingRefresh = true\n * (TICK only updates now). ACCOUNT_CHANGED still bumps walletGen.\n * 7. ATTEMPT_SUCCEEDED -> success with result. ATTEMPT_FAILED maps by reason category:\n * INELIGIBLE_REASONS -> ineligible, INSUFFICIENT_FUNDS -> insufficient-funds (both stored in `blocked`,\n * sticky until the next WALLET_LOADED / ACCOUNT_CHANGED / config LOAD / RESET, and not clickable),\n * ERROR_REASONS -> error. All clear attempt. In success/error, reads still update data but name\n * stays until RESET. Every success and every submitted error clears the drop and invalidates its\n * read generation, so RESET cannot become live until a post-terminal DROP_LOADED and a fresh\n * WALLET_LOADED arrive.\n * 8. SET_QUANTITY clamps to [1, selectMaxQuantity(state) ?? MAX_QUANTITY]; non-integers floor.\n * 9. READ_FAILED (current gen) when idle -> error with reason/message.\n */\nexport function reducer(state: MachineState, event: MachineEvent): MachineState {\n const inFlight = isInFlight(state);\n // A failed read/wallet result: error when idle or connecting, deferred in flight, ignored in success/error.\n const failed = (reason: ErrorReason, message: string): MachineState => {\n if (inFlight) return { ...state, pendingRefresh: true };\n if (state.name === 'success' || state.name === 'error') return state;\n return { ...state, name: 'error', reason, message };\n };\n\n switch (event.type) {\n case 'LOAD': {\n if (event.kind === 'refresh') {\n const next = { ...state, readGen: event.gen };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next);\n }\n // A config change is a read boundary: nothing from the previous drop or wallet may stay actionable.\n const next = { ...state, readGen: event.gen, drop: null, walletRead: null, blocked: null, walletGen: state.walletGen + 1 };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next, false);\n }\n case 'DROP_LOADED': {\n if (event.gen !== state.readGen) return state;\n const next = { ...state, drop: event.drop, now: Math.max(state.now, event.now) };\n if (inFlight) return { ...next, pendingRefresh: true };\n return isIdle(next) ? settle(clampQuantity(next), false) : clampQuantity(next);\n }\n case 'DROP_UNSUPPORTED': {\n if (event.gen !== state.readGen) return state;\n if (inFlight) return { ...state, pendingRefresh: true };\n if (state.name === 'success' || state.name === 'error') return state;\n return { ...state, name: 'unsupported', reason: event.reason, message: event.message };\n }\n case 'READ_FAILED':\n return event.gen !== state.readGen ? state : failed(event.reason, event.message);\n case 'ACCOUNT_CHANGED': {\n const next = { ...state, account: event.account, walletRead: null, blocked: null, walletGen: state.walletGen + 1 };\n if (inFlight) return { ...next, pendingRefresh: true };\n // Connecting only ends when an account arrives; a null account keeps the connect UI open.\n if (state.name === 'connecting') return event.account === null ? next : settle({ ...next, name: 'loading' }, false);\n return settle(next);\n }\n case 'WALLET_LOADED': {\n if (event.gen !== state.walletGen) return state;\n const next = { ...state, walletRead: event.read, blocked: null };\n return inFlight ? { ...next, pendingRefresh: true } : settle(clampQuantity(next));\n }\n case 'WALLET_FAILED':\n return event.gen !== state.walletGen ? state : failed(event.reason, event.message);\n case 'CONNECT_STARTED':\n return state.name === 'disconnected' && state.attempt === null\n ? { ...state, name: 'connecting', reason: null, message: null }\n : state;\n case 'CONNECT_DISMISSED':\n return state.name === 'connecting' ? settle({ ...state, name: 'disconnected' }, false) : state;\n case 'TICK':\n return settle({ ...state, now: Math.max(state.now, event.now) });\n case 'SET_QUANTITY': {\n const next = { ...state, quantity: toQuantity(event.quantity, selectMaxQuantity(state) ?? MAX_QUANTITY) };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next);\n }\n case 'ATTEMPT_STARTED':\n return state.name === 'live' && state.attempt === null ? { ...state, attempt: event.attempt } : state;\n case 'SWITCHING_CHAIN':\n return step(state, event.attemptId, 'switching-chain');\n case 'APPROVING':\n return step(state, event.attemptId, 'approving');\n case 'MINT_PROMPTED':\n return step(state, event.attemptId, 'minting');\n case 'TX_SUBMITTED':\n return step(state, event.attemptId, 'confirming');\n case 'ATTEMPT_SUCCEEDED':\n return state.attempt?.attemptId === event.attemptId\n ? { ...state, name: 'success', reason: null, message: null, attempt: null, result: event.result,\n drop: null, readGen: state.readGen + 1 }\n : state;\n case 'ATTEMPT_FAILED': {\n if (state.attempt?.attemptId !== event.attemptId) return state;\n const { reason, message } = event;\n const done = { ...state, reason, message, attempt: null, result: null };\n if ((INELIGIBLE_REASONS as readonly string[]).includes(reason)) {\n return { ...done, name: 'ineligible', blocked: { name: 'ineligible', reason, message } };\n }\n if (reason === 'INSUFFICIENT_FUNDS') {\n return { ...done, name: 'insufficient-funds', blocked: { name: 'insufficient-funds', reason, message } };\n }\n // Reads before the receipt cannot establish post-transaction freshness.\n return { ...done, name: 'error', drop: state.name === 'confirming' ? null : state.drop,\n readGen: state.name === 'confirming' ? state.readGen + 1 : state.readGen };\n }\n case 'RESET': {\n if (state.name !== 'success' && state.name !== 'error') return state;\n // The wallet data is stale after an attempt: re-read it before the button can be live again (AC-15).\n const next = {\n ...state,\n readGen: event.gen,\n walletRead: null,\n blocked: null,\n walletGen: state.walletGen + 1,\n result: null,\n pendingRefresh: false,\n };\n // Leave the terminal name so settle() treats the state as idle.\n return settle(clampQuantity({ ...next, name: 'loading' }), false);\n }\n }\n}\n\n/** Attempt steps in lifecycle order; the pre-step 'live' gap ranks below all of them. */\nconst STEP_ORDER: readonly MintStateName[] = ['switching-chain', 'approving', 'minting', 'confirming'];\n\nfunction step(state: MachineState, attemptId: number, name: MintStateName): MachineState {\n if (state.attempt?.attemptId !== attemptId) return state;\n if (STEP_ORDER.indexOf(name) <= STEP_ORDER.indexOf(state.name)) return state;\n return { ...state, name, reason: null, message: null };\n}\n\n/**\n * min(remaining supply, branch limit, MAX_QUANTITY). Remaining supply = maxSupply - totalMinted when\n * maxSupply is a positive bigint. Branch limit = walletRead.maxQuantity when not null.\n * null only when no drop is loaded.\n */\nexport function selectMaxQuantity(state: MachineState): number | null {\n const { drop, walletRead } = state;\n if (drop === null) return null;\n let max = MAX_QUANTITY;\n if (drop.maxSupply !== null && drop.maxSupply > 0n) {\n const remaining = drop.maxSupply - drop.totalMinted;\n if (remaining < BigInt(max)) max = remaining > 0n ? Number(remaining) : 0;\n }\n if (walletRead !== null && walletRead.maxQuantity !== null) {\n max = Math.min(max, Math.max(0, Math.floor(walletRead.maxQuantity)));\n }\n return max;\n}\n\n/**\n * Totals for state.quantity, fee included.\n * native price: native = (unitPrice + unitFee) * q (pricePer 'total': unitPrice + unitFee * q).\n * ERC20 price: native = unitFee * q, erc20 = unitPrice * q (or unitPrice when pricePer 'total').\n * null when no drop. Money.formatted uses viem formatUnits.\n */\nexport function selectTotal(state: MachineState): { native: Money; erc20: Money | null } | null {\n const { drop } = state;\n if (drop === null) return null;\n const q = BigInt(state.quantity);\n const price = drop.unitPrice;\n const fee = drop.unitFee;\n const priceTotal = drop.pricePer === 'total' ? price.value : price.value * q;\n if (drop.paymentToken !== null) {\n return {\n native: money(fee.value * q, fee),\n erc20: money(priceTotal, price),\n };\n }\n // pricePer 'total': the fee is still per unit.\n return { native: money(priceTotal + fee.value * q, price), erc20: null };\n}\n\nfunction money(value: bigint, like: Money): Money {\n return { value, decimals: like.decimals, symbol: like.symbol, formatted: formatUnits(value, like.decimals) };\n}\n\nexport function canAct(state: MachineState): boolean {\n return state.attempt === null && CLICKABLE_STATES.includes(state.name);\n}\n","// Shared receipt parsing (orchestrator-owned, spec #edge-cases \"Receipt has other Transfer logs\").\nimport { decodeAbiParameters, getAddress, zeroAddress } from 'viem';\nimport type { Address, MintedToken } from '../types';\nimport type { ParseReceiptArgs, ReceiptLog } from './types';\n\n// keccak256 of the event signatures\nexport const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\nexport const TRANSFER_SINGLE_TOPIC = '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62';\nexport const TRANSFER_BATCH_TOPIC = '0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb';\n\nconst topicAddress = (t: string | undefined): Address | null =>\n t && t.length === 66 ? getAddress(`0x${t.slice(26)}`) : null;\n\n/**\n * Mints to recipient emitted by tokenContract: ERC721 Transfer (4 topics), ERC1155 TransferSingle and\n * TransferBatch, with from = 0x0 and to = recipient. Batch ids/amounts are zipped (lengths must match,\n * else the log is skipped); duplicate token ids are aggregated; order of first appearance is kept.\n */\nexport function parseMintReceipt(logs: readonly ReceiptLog[], { tokenContract, recipient }: ParseReceiptArgs): MintedToken[] {\n const contract = getAddress(tokenContract);\n const to = getAddress(recipient);\n const out = new Map<bigint, bigint>();\n const add = (id: bigint, amount: bigint) => out.set(id, (out.get(id) ?? 0n) + amount);\n for (const log of logs) {\n if (getAddress(log.address) !== contract) continue;\n const [t0, t1, t2, t3] = log.topics;\n if (t0 === TRANSFER_TOPIC && log.topics.length === 4) {\n if (topicAddress(t1) !== zeroAddress || topicAddress(t2) !== to || !t3) continue;\n add(BigInt(t3), 1n);\n } else if (t0 === TRANSFER_SINGLE_TOPIC && log.topics.length === 4) {\n if (topicAddress(t2) !== zeroAddress || topicAddress(t3) !== to) continue;\n const [id, value] = decodeAbiParameters([{ type: 'uint256' }, { type: 'uint256' }], log.data);\n add(id, value);\n } else if (t0 === TRANSFER_BATCH_TOPIC && log.topics.length === 4) {\n if (topicAddress(t2) !== zeroAddress || topicAddress(t3) !== to) continue;\n const [ids, values] = decodeAbiParameters([{ type: 'uint256[]' }, { type: 'uint256[]' }], log.data);\n if (ids.length !== values.length) continue;\n ids.forEach((id, i) => add(id, values[i]!));\n }\n }\n return [...out].map(([tokenId, amount]) => ({ contract, tokenId, amount }));\n}\n","import { isMintError } from './errors';\n\nconst GENERIC = 'Transaction failed. Please try again. If it fails again, please contact support.';\nconst REVERTED = 'Transaction reverted';\nconst record = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === 'object' ? value as Record<string, unknown> : undefined;\nconst text = (value: unknown): string => typeof value === 'string' ? value.toLowerCase() : '';\n\ntype Seen = { name: unknown; code: unknown; message: string; cancelled: unknown; replacement: unknown };\n\n// Inspect both common provider envelopes, with identity tracking for cyclic causes.\nfunction collect(error: unknown): Seen[] {\n const pending: unknown[] = [error];\n const seen = new Set<object>();\n const errors: Seen[] = [];\n while (pending.length) {\n const e = record(pending.pop());\n if (!e || seen.has(e)) continue;\n seen.add(e);\n const data = record(e.data);\n errors.push({\n name: e.name, code: e.code, cancelled: e.cancelled, replacement: e.replacement,\n message: [e.message, e.shortMessage, isMintError(e) ? undefined : e.reason, data?.message].map(text).join('\\n'),\n });\n pending.push(e.cause, data?.originalError);\n }\n return errors;\n}\n\nfunction fundsMessage(errors: Seen[]): string | null {\n const hasText = (phrase: string): boolean => errors.some(e => e.message.includes(phrase));\n // Gas-specific funds must win, including when only a nested cause supplies the gas detail.\n if (hasText('insufficient funds for gas')) {\n return 'Your wallet does not have enough funds to pay for gas fees. Please try again with a different wallet or add more funds to your wallet.';\n }\n if (errors.some(e => e.name === 'InsufficientFundsError' || e.code === 'INSUFFICIENT_FUNDS') ||\n hasText('insufficient funds') || hasText('balance too low to proceed')) {\n return 'Your wallet does not have enough funds to complete this transaction. Please try again with a different wallet or add more funds to your wallet.';\n }\n return null;\n}\n\n/** Display text only: never mutate the error or classify its reason/state. Not a public export. */\nexport function friendlyErrorMessage(error: unknown): string {\n if (isMintError(error)) {\n // Only a recognized provider cause is reworded; a funds error without one keeps its own text.\n if (error.reason === 'INSUFFICIENT_FUNDS') return fundsMessage(collect(error.cause)) ?? error.message;\n if (error.reason !== 'RPC_ERROR' && error.reason !== 'SIMULATION_REVERTED') return error.message;\n // These are hook-owned domain messages, not provider diagnostics or decoded revert text.\n if (error.reason === 'SIMULATION_REVERTED' && (\n error.message === 'The token refused the approval.' ||\n error.message === 'The drop is no longer available for this quantity.'\n )) return error.message;\n }\n\n const errors = collect(error);\n const hasText = (phrase: string): boolean => errors.some(e => e.message.includes(phrase));\n const hasName = (name: string): boolean => errors.some(e => e.name === name);\n const hasCode = (code: string | number): boolean => errors.some(e => e.code === code);\n\n // Wording and precedence ported from client-sdk @7eac330 adapters/{viem,ethers5}-adapter/utils.ts.\n // Existing 4001/ChainMismatch handling remains in toReason, ahead of this formatter.\n if (hasName('UserRejectedRequestError') || hasCode('ACTION_REJECTED') || hasCode(4001) ||\n hasText('user denied transaction signature') || hasText('userrefusedondevice') ||\n hasText('rejected transaction') || hasText('user rejected') ||\n errors.some(e => e.message.includes('cancelled') && !e.cancelled)) {\n return 'Transaction Rejected';\n }\n if (hasCode(4902)) return 'Network not available in wallet';\n const replaced = errors.find(e => e.name === 'TransactionReplacedError' || e.code === 'TRANSACTION_REPLACED');\n if (replaced?.cancelled) return 'Transaction was cancelled';\n if (replaced?.replacement) return 'Transaction was replaced with a new transaction (usually due to speed up)';\n if (hasText('ledger')) return 'Error with Ledger device. Please ensure device is connected and unlocked';\n // Either message field is sufficient evidence; a bare -32002 is not.\n if (errors.some(e => e.code === -32002 && e.message.includes('pending'))) {\n return 'Transaction already pending in wallet. Please check your wallet';\n }\n if (hasText('invalid amount')) return 'Price calculation is incorrect, contact support!';\n const funds = fundsMessage(errors);\n if (funds) return funds;\n if (hasName('NonceTooLowError') || hasName('NonceExhaustedError') || hasText('nonce too low')) {\n return 'Transaction nonce is too low. Please try again';\n }\n if (hasName('FeeCapTooLowError') || hasText('max fee per gas less than block base fee')) {\n return 'Gas price too low for current network conditions. Please try again';\n }\n if (hasName('TimeoutError') || hasCode('TIMEOUT') || hasText('timeout')) {\n return 'Transaction timed out. Your wallet connection is having issues. Disconnect and reconnect your wallet, then please try again';\n }\n if (hasText('network disconnected')) return 'Network connection lost. Please check your internet connection and try again';\n if (hasName('ChainMismatchError') || hasText('wrong network')) return 'Wrong network selected. Please switch to the correct network';\n if (hasText('erc20: transfer amount exceeds balance')) {\n return 'You do not have the required amount of ERC20 tokens to complete this transaction.';\n }\n if (hasName('EstimateGasExecutionError') || hasCode('UNPREDICTABLE_GAS_LIMIT') || hasText('cannot estimate gas')) {\n return 'Unable to estimate gas for transaction. The transaction may fail. Please try again.';\n }\n if (hasName('ContractFunctionExecutionError') || hasCode('CALL_EXCEPTION')) {\n return 'Transaction failed due to contract execution error';\n }\n if (hasName('ContractFunctionRevertedError') || hasName('ExecutionRevertedError') || hasText('revert')) return REVERTED;\n if (hasName('TransactionExecutionError')) return 'Transaction execution failed';\n if (hasCode('NETWORK_ERROR') || hasName('HttpRequestError') || hasText('network')) return 'Network error occurred';\n return isMintError(error) && error.reason === 'SIMULATION_REVERTED' ? REVERTED : GENERIC;\n}\n","// Story s7: the default rendering surface. Spec #ui-ux-flow (state table) + #package-api.\nimport { createElement, type ReactNode } from 'react';\n\nimport { isAsyncState, useMint, type MintState, type UseMintOptions } from './useMint';\nimport type { MintStateName } from '../core/machine';\n\nexport type MintButtonProps = UseMintOptions & {\n className?: string;\n /** Per-state text override, e.g. { live: 'Collect', 'sold-out': 'Gone' }. */\n labels?: Partial<Record<MintStateName, string>>;\n /** A function child replaces the default markup entirely; m.mint still drives the flow. */\n children?: ReactNode | ((m: MintState) => ReactNode);\n};\n\n/** Spec #ui-ux-flow \"Default label\" column. No CSS ships. */\nexport function defaultLabel(m: MintState): string {\n const symbol = m.total?.erc20?.symbol ?? m.total?.native.symbol ?? m.drop?.unitPrice.symbol ?? '';\n switch (m.state) {\n case 'loading':\n return 'Loading…';\n case 'unsupported':\n return 'Unavailable';\n case 'upcoming': {\n const t = m.drop?.startTime;\n return `Starts ${t ? new Date(t * 1000).toLocaleString() : 'soon'}`;\n }\n case 'ended':\n return 'Ended';\n case 'sold-out':\n return 'Sold out';\n case 'disconnected':\n return 'Connect wallet';\n case 'connecting':\n return 'Connecting…';\n case 'live': {\n const total = m.total;\n if (!total) return 'Mint';\n const legs = total.erc20 ? [total.erc20, ...(total.native.value > 0n ? [total.native] : [])] : [total.native];\n return `Mint · ${legs.map(leg => `${leg.formatted} ${leg.symbol}`).join(' + ')}`.trimEnd();\n }\n case 'ineligible':\n return 'Not eligible';\n case 'insufficient-funds': {\n const erc20 = m.total?.erc20;\n // Core supplies the failing currency in its funds message; native has priority when both are short.\n const shortage = erc20 && m.message === `Not enough ${erc20.symbol} to cover the mint.`\n ? erc20.symbol : m.total?.native.symbol ?? symbol;\n return `Insufficient ${shortage}`.trimEnd();\n }\n case 'switching-chain':\n return 'Switching network…';\n case 'approving':\n return `Approving ${symbol}…`.replace(' …', '…');\n case 'minting':\n return 'Confirm in wallet…';\n case 'confirming':\n return 'Minting…';\n case 'success':\n return 'Minted';\n case 'error':\n return 'Try again';\n }\n}\n\nexport function MintButton(props: MintButtonProps): ReactNode {\n const { className, labels, children, ...options } = props;\n const m = useMint(options);\n\n if (typeof children === 'function') return (children as (m: MintState) => ReactNode)(m);\n\n const label = labels?.[m.state] ?? defaultLabel(m);\n return createElement(\n 'button',\n {\n type: 'button',\n className,\n 'data-state': m.state,\n ...(m.reason ? { 'data-reason': m.reason } : {}),\n ...(isAsyncState(m.state) ? { 'aria-busy': 'true' } : {}),\n disabled: !m.canAct,\n onClick: m.mint,\n },\n children ?? label,\n );\n}\n"],"mappings":"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","names":["import_viem","import_viem","id","import_viem","import_viem","d","base","code","text","import_viem","import_viem","next","money","ERC20_ABI","money","revertData","buildPlan","import_viem","hasCode","code","readDrop","account","wallet","hash","receipt","life","import_react"]}