@manifoldxyz/dropkit 0.2.1 → 0.3.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/cart/react.ts","../src/cart/errors.ts","../src/cart/line.ts","../src/cart/reads.ts","../src/cart/run.ts","../src/cart/store.ts","../src/cart/links.ts","../src/cart/useCheckout.ts","../src/cart/useHoldings.ts","../src/cart/AddToCartButton.ts"],"sourcesContent":["// CartProvider and useCart (spec Step 2, Step 3). One provider per storageKey per tab (R17). Reads every line,\n// refreshes them, runs settle for pending mints once at mount, and exposes the cart through useCart().\nimport { createContext, createElement, useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore, type ReactElement } from 'react';\nimport type { PublicClient } from 'viem';\nimport { MintError, UNSUPPORTED_REASONS } from '../core/errors';\nimport type { AdapterContext } from '../core/adapters/types';\nimport { createReadClient } from '../core/rpc';\nimport { getAccount, loadConnectWidget, openConnectModal, subscribeAccount } from '../core/wallet';\nimport type { ManifoldClaimConfig, Money, RpcUrls } from '../core/types';\nimport { cartReason, type CartReasonCode } from './errors';\nimport { deriveLine, lineMaxQuantity, lineTotal, sumMoney } from './line';\nimport { Limiter, rateLimitedFetch, sharedReadClient, type SharedClient } from './reads';\nimport { adapter, CART_TIMING, settle, unconfirmedMessage, withRetries, type RunEnv, type SettleOutcome } from './run';\nimport { collectedLinks } from './links';\nimport { CartStore, canonicalConfig, defaultStorageKey, itemKey } from './store';\nimport type { AddResult, CartLine, CartProviderProps, CartState, CartValue } from './types';\nimport type { WalletRead } from '../core/adapters/types';\nimport type { DropInfo } from '../core/types';\n\n// ---------------------------------------------------------------- one provider per key (R17)\n\nconst activeKeys = new Set<string>();\n\n// ---------------------------------------------------------------- contexts\n\ntype LineData = {\n gen: number;\n controller: AbortController | null;\n drop: DropInfo | null;\n walletRead: WalletRead | null;\n readError: { reason: CartReasonCode; message: string } | null;\n /** The quantity and payer the wallet read was made for. */\n readFor: { quantity: number; payer: string | null } | null;\n};\n\n/** What useCheckout needs from the provider. Not public API. */\nexport type CartInternals = {\n chainId: number;\n store: CartStore;\n env: RunEnv;\n shared: SharedClient;\n limiter: Limiter;\n account: { address: `0x${string}`; chainId: number } | null;\n /** The provider's lifetime signal: aborted on unmount. */\n getSignal(): AbortSignal;\n /** Opens the connect modal after the widget loaded. */\n connect(): Promise<'connected' | 'dismissed'>;\n /** Periodic refreshes pause while a checkout runs. */\n setBusy(busy: boolean): void;\n /** One settle at a time per pending mint. */\n settle(id: string, extra?: { receipt?: Awaited<ReturnType<typeof import('./run').waitMint>> | null; memHash?: `0x${string}` | null }): Promise<SettleOutcome | null>;\n refreshLine(key: string): void;\n lineData(key: string): { drop: DropInfo | null; walletRead: WalletRead | null } | null;\n};\n\nconst StateContext = createContext<CartState | null>(null);\nconst InternalsContext = createContext<CartInternals | null>(null);\n\nexport function useCartInternals(): CartInternals {\n const v = useContext(InternalsContext);\n if (!v) throw new MintError('INVALID_CONFIG', 'useCheckout must be used inside <CartProvider>.');\n return v;\n}\n\nexport function useCart(): CartState {\n const v = useContext(StateContext);\n if (!v) throw new MintError('INVALID_CONFIG', 'useCart must be used inside <CartProvider>.');\n return v;\n}\n\nconst isFinalRead = (e: unknown): boolean => {\n const r = cartReason(e).reason;\n return (UNSUPPORTED_REASONS as readonly string[]).includes(r) || r === 'INVALID_CONFIG';\n};\n\nconst emptyValue = (chainId: number): CartValue => ({ v: 6, chainId, items: [], pending: [], results: [] });\n\n// ---------------------------------------------------------------- provider state (plain objects, not refs)\n\n/** Line reads and their change signal, read by React through useSyncExternalStore. */\nclass LineBook {\n readonly map = new Map<string, LineData>();\n private version = 0;\n private listeners = new Set<() => void>();\n subscribe = (cb: () => void): (() => void) => {\n this.listeners.add(cb);\n return () => void this.listeners.delete(cb);\n };\n getVersion = (): number => this.version;\n changed(): void {\n this.version += 1;\n for (const cb of [...this.listeners]) cb();\n }\n}\n\n/** Everything the provider mutates outside React's render: lifetime, scopes, limits and in-flight work. */\nclass Core {\n lifetime = new AbortController();\n scopes = new Map<string, object>();\n settling = new Map<string, Promise<SettleOutcome | null>>();\n settledAtMount = new Set<string>();\n busy = false;\n backoffUntil = 0;\n warned = false;\n registeredKey: string | null = null;\n widgetLoad: Promise<void> | null = null;\n items: CartValue['items'] = [];\n payer: string | null = null;\n sync(items: CartValue['items'], payer: string | null): void {\n this.items = items;\n this.payer = payer;\n }\n setBusy(b: boolean): void {\n this.busy = b;\n }\n setWidgetLoad(p: Promise<void>): void {\n this.widgetLoad = p;\n }\n /** True the first time it is called. */\n warnOnce(): boolean {\n const first = !this.warned;\n this.warned = true;\n return first;\n }\n setRegistered(key: string | null): void {\n this.registeredKey = key;\n }\n renewLifetime(): AbortController {\n if (this.lifetime.signal.aborted) this.lifetime = new AbortController();\n return this.lifetime;\n }\n}\n\n/** React's notify callback, adapted: subscribeAccount hands the account to its callback, React only needs the ping. */\nconst subscribeAccountChanges = (notify: () => void): (() => void) => subscribeAccount(() => notify());\n\n/** getAccount() builds a new object on each call, so React reads a string snapshot of it. */\nconst accountSnapshot = (): string => {\n const a = getAccount();\n return a ? `${a.address}:${String(a.chainId)}` : '';\n};\n\n/** `version` is the LineBook version the read data was taken at; it ties the result to that snapshot. */\nfunction buildLines(value: CartValue, book: LineBook, payer: string | null, now: number, version: number): CartLine[] {\n if (version < 0) return [];\n return value.items.map((item) => {\n const key = itemKey(item.config);\n const data = book.map.get(key);\n const drop = data?.drop ?? null;\n const walletRead = data?.walletRead ?? null;\n const d = deriveLine({ drop, walletRead, readError: data?.readError ?? null, now, pending: value.pending.some((p) => p.lineKey === key), walletConnected: payer !== null });\n return { key, config: item.config, quantity: item.quantity, state: d.state, reason: d.reason, drop, maxQuantity: lineMaxQuantity(drop, walletRead), total: lineTotal(drop, item.quantity) };\n });\n}\n\nconst currentSeconds = (): number => Math.floor(Date.now() / 1000);\n\n// ---------------------------------------------------------------- provider\n\nexport function CartProvider(props: CartProviderProps): ReactElement {\n const { chainId, rpcUrls, children } = props;\n const storageKey = props.storageKey ?? defaultStorageKey(chainId);\n const projectId = props.connect?.walletConnectProjectId;\n\n const [core] = useState(() => new Core());\n const [book] = useState(() => new LineBook());\n // A new store when the key or chain changes.\n const store = useMemo(() => new CartStore({ storageKey, chainId }), [storageKey, chainId]);\n const serverValue = useMemo(() => emptyValue(chainId), [chainId]);\n const value = useSyncExternalStore(store.subscribe, store.getSnapshot, () => serverValue);\n const bookVersion = useSyncExternalStore(book.subscribe, book.getVersion, () => 0);\n\n const accountKey = useSyncExternalStore(subscribeAccountChanges, accountSnapshot, () => '');\n const account = useMemo(() => {\n const [address, chain] = accountKey.split(':');\n return address ? { address: address as `0x${string}`, chainId: Number(chain) } : null;\n }, [accountKey]);\n const payer = account?.address ?? null;\n // Read by line reads and the refresh timer; synced in an effect that runs before them.\n useEffect(() => core.sync(value.items, payer), [core, value.items, payer]);\n\n // --- R17: register the key on mount. A second provider with the same key throws; an unmount frees the key.\n useEffect(() => {\n if (activeKeys.has(storageKey)) {\n throw new MintError('INVALID_CONFIG', 'Only one CartProvider per storageKey. Wrap your app once.', { field: 'storageKey' });\n }\n activeKeys.add(storageKey);\n core.setRegistered(storageKey);\n const life = core.renewLifetime();\n return () => {\n if (core.registeredKey === storageKey) activeKeys.delete(storageKey);\n core.setRegistered(null);\n life.abort();\n };\n }, [storageKey, core]);\n\n // --- R21 warning, once per provider instance\n useEffect(() => {\n if (!core.warnOnce()) return;\n if (!rpcUrls?.[chainId]) {\n console.warn(`dropkit cart: no rpcUrls for chain ${String(chainId)}. Receipts, holdings and balance checks fall back to a public RPC and can be rate-limited during a sale.`);\n }\n // Once per mount, as the spec says: later prop changes do not warn again.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // --- read client (one per provider), shared reads, limits\n const rpcKey = rpcUrls?.[chainId] ?? '';\n const readClient = useMemo<PublicClient>(\n () => createReadClient({ chainId, ...(rpcKey ? { rpcUrls: { [chainId]: rpcKey } as RpcUrls } : {}), useBridge: true }),\n [chainId, rpcKey],\n );\n const shared = useMemo(() => sharedReadClient(readClient), [readClient]);\n const limiter = useMemo(() => new Limiter(() => CART_TIMING.maxReadsInFlight), []);\n const merkleFetch = useMemo(() => rateLimitedFetch(undefined, () => CART_TIMING.merklePerMinute), []);\n const env = useMemo<RunEnv>(\n () => ({\n client: shared.client,\n chainId,\n fetch: merkleFetch,\n ctxFor: (key: string): AdapterContext => {\n let scope = core.scopes.get(key);\n if (!scope) {\n scope = {};\n core.scopes.set(key, scope);\n }\n return { client: shared.client, fetch: merkleFetch, cacheScope: scope, signal: core.lifetime.signal };\n },\n }),\n [shared, chainId, merkleFetch, core],\n );\n\n // --- connect widget\n useEffect(() => {\n const loading = loadConnectWidget({ chainIds: [chainId], ...(projectId ? { walletConnectProjectId: projectId } : {}) });\n core.setWidgetLoad(loading);\n loading.catch(() => undefined);\n }, [chainId, projectId, core]);\n const connect = useCallback(async (): Promise<'connected' | 'dismissed'> => {\n try {\n await core.widgetLoad;\n return await openConnectModal();\n } catch {\n return 'dismissed';\n }\n }, [core]);\n\n // --- line reads\n const setBusy = useCallback((b: boolean) => core.setBusy(b), [core]);\n\n const readLine = useCallback(\n (key: string): void => {\n const item = core.items.find((i) => itemKey(i.config) === key);\n if (!item || core.lifetime.signal.aborted) return;\n const data = book.map.get(key) ?? { gen: 0, controller: null, drop: null, walletRead: null, readError: null, readFor: null };\n book.map.set(key, data);\n data.controller?.abort();\n const controller = new AbortController();\n data.controller = controller;\n const gen = ++data.gen;\n const wantPayer = core.payer;\n const quantity = item.quantity;\n const ctx = { ...env.ctxFor(key), signal: controller.signal };\n void limiter\n .run(() =>\n withRetries(\n async () => {\n const drop = await adapter.readDrop(ctx, item.config);\n let walletRead: WalletRead | null = null;\n if (wantPayer && drop.paymentToken === null) {\n walletRead = await adapter.readWallet(ctx, item.config, { payer: wantPayer as `0x${string}`, recipient: wantPayer as `0x${string}`, quantity, drop });\n }\n return { drop, walletRead };\n },\n CART_TIMING.retryDelaysMs,\n (e) => isFinalRead(e) || controller.signal.aborted,\n controller.signal,\n ),\n )\n .then(\n ({ drop, walletRead }) => {\n if (data.gen !== gen || controller.signal.aborted) return; // a read from an older generation is dropped\n data.drop = drop;\n data.walletRead = walletRead;\n data.readError = null;\n data.readFor = { quantity, payer: wantPayer };\n book.changed();\n // R5: a first add has no limits yet, so its quantity is capped here once they load (Codex PR #11 review\n // B-F3). A cap of 0 (sold out, limit reached) leaves the quantity alone: the line shows that state instead.\n // A locked line (pending mint) keeps its quantity.\n const cap = lineMaxQuantity(drop, walletRead);\n const now = store.getSnapshot().items.find((i) => itemKey(i.config) === key);\n if (cap !== null && cap > 0 && now && now.quantity > cap && !store.pendingFor(key)) store.setQuantity(key, cap);\n },\n (e: unknown) => {\n if (data.gen !== gen || controller.signal.aborted) return;\n const r = cartReason(e);\n if (r.reason === 'RATE_LIMITED') core.backoffUntil = Date.now() + CART_TIMING.refreshBackoffMs;\n data.readError = r;\n data.walletRead = null;\n data.readFor = { quantity, payer: wantPayer };\n book.changed();\n },\n );\n },\n [env, limiter, book, core, store],\n );\n\n // New, changed (quantity, payer) and removed items. Locked lines are not read.\n const itemsSig = value.items.map((i) => `${itemKey(i.config)}#${String(i.quantity)}`).join('|');\n const pendingSig = value.pending.map((p) => p.lineKey).join('|');\n useEffect(() => {\n const keys = new Set<string>();\n for (const item of core.items) {\n const key = itemKey(item.config);\n keys.add(key);\n if (store.pendingFor(key)) continue;\n const data = book.map.get(key);\n if (!data || data.readFor === null || data.readFor.quantity !== item.quantity || data.readFor.payer !== core.payer) {\n if (!data || data.controller === null || data.readFor?.quantity !== item.quantity || data.readFor?.payer !== core.payer) readLine(key);\n }\n }\n for (const [key, data] of book.map) {\n if (!keys.has(key)) {\n data.controller?.abort();\n book.map.delete(key);\n core.scopes.delete(key);\n }\n }\n // itemsSig, payer and pendingSig stand for the item list, the account and the locked lines.\n }, [itemsSig, payer, pendingSig, readLine, store, book, core]);\n\n // Refresh every 30 s while the tab is visible and no checkout runs (useMint.ts:83, 993-1005).\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const tick = (): void => {\n const wait = Date.now() < core.backoffUntil ? CART_TIMING.refreshBackoffMs : CART_TIMING.refreshMs;\n timer = setTimeout(() => {\n const hidden = typeof document !== 'undefined' && document.visibilityState === 'hidden';\n if (!hidden && !core.busy) {\n shared.bump();\n for (const item of core.items) if (!store.pendingFor(itemKey(item.config))) readLine(itemKey(item.config));\n }\n tick();\n }, wait);\n };\n tick();\n return () => clearTimeout(timer);\n }, [shared, store, readLine, core]);\n\n // --- settle: one in flight per pending mint\n const settleOne = useCallback<CartInternals['settle']>(\n (id, extra) => {\n const hit = core.settling.get(id);\n if (hit) return hit;\n const p = store.getSnapshot().pending.find((x) => x.id === id);\n if (!p) return Promise.resolve(null);\n const run = settle({ client: readClient, ctx: env.ctxFor(p.lineKey), store, receipt: extra?.receipt ?? null, memHash: extra?.memHash ?? null }, p)\n .catch((e: unknown): SettleOutcome => ({ kind: 'unavailable', ...cartReason(e) }))\n .finally(() => core.settling.delete(id));\n core.settling.set(id, run);\n return run;\n },\n [store, env, readClient, core],\n );\n\n // Mount: the algorithm runs once for every pending mint, then nothing runs on a timer (D25).\n useEffect(() => {\n for (const p of store.getSnapshot().pending) {\n if (core.settledAtMount.has(p.id)) continue;\n core.settledAtMount.add(p.id);\n void settleOne(p.id).then((out) => {\n if (out && (out.kind === 'collected' || out.kind === 'unconfirmed')) shared.bump();\n });\n }\n }, [store, settleOne, shared, core]);\n\n // --- the CartState\n const cartLines = useMemo<CartLine[]>(\n () => buildLines(value, book, payer, currentSeconds(), bookVersion),\n [value, book, payer, bookVersion],\n );\n\n const total = useMemo<Money | null>(() => {\n const counted = cartLines.filter((l) => l.state !== 'unsupported' && l.state !== 'locked' && l.total !== null);\n if (counted.length === 0) return null;\n return sumMoney(counted.map((l) => l.total!), counted[0]!.total!);\n }, [cartLines]);\n\n const unconfirmed = useMemo(\n () => value.results.filter((r) => r.status === 'unconfirmed').map((r) => ({ id: r.id, key: r.lineKey, config: r.config, quantity: r.quantity, at: r.at, wallet: r.payer, message: unconfirmedMessage(r.payer) })),\n [value.results],\n );\n const openseaCollections = props.openseaCollections;\n const collected = useMemo(\n () =>\n value.results\n .filter((r) => r.status === 'collected')\n .map((r) => ({\n id: r.id,\n key: r.lineKey,\n quantity: r.quantity,\n at: r.at,\n txHash: r.txHash,\n wallet: r.payer,\n tokens: r.tokens,\n links: collectedLinks({ chainId, wallet: r.recipient, contract: r.config.creatorContract as `0x${string}`, txHash: r.txHash, tokens: r.tokens, collections: openseaCollections }),\n })),\n [value.results, chainId, openseaCollections],\n );\n\n const add = useCallback(\n async (config: ManifoldClaimConfig, quantity = 1, opts?: { force?: boolean }): Promise<AddResult> => {\n const canon = canonicalConfig(config, chainId); // INVALID_CONFIG: no extension, another chain, or a contract config\n const key = itemKey(canon);\n const snap = store.getSnapshot();\n if (snap.pending.some((p) => p.lineKey === key)) return 'added'; // locked: already in the cart, nothing to add\n const priors = snap.results.filter((r) => r.status === 'unconfirmed' && r.lineKey === key);\n if (priors.length > 0 && !opts?.force) {\n if (!adapter.readHoldings) return 'check-unavailable';\n for (const r of priors) {\n try {\n const now = await adapter.readHoldings(env.ctxFor(key), r.holdings, r.recipient);\n if (now - BigInt(r.holdings.before) >= BigInt(r.quantity)) return 'looks-collected';\n } catch {\n return 'check-unavailable';\n }\n }\n }\n const data = book.map.get(key);\n const cap = data?.drop ? lineMaxQuantity(data.drop, data.walletRead) : null;\n store.addItem(canon, quantity, { cap, dropResults: priors.map((r) => r.id) });\n return 'added';\n },\n [chainId, store, env, book],\n );\n\n const state = useMemo<CartState>(\n () => ({\n lines: cartLines,\n unconfirmed,\n collected,\n total,\n count: cartLines.length,\n add,\n setQuantity: (key, quantity) => {\n const line = cartLines.find((l) => l.key === key);\n const cap = line?.maxQuantity;\n store.setQuantity(key, cap !== null && cap !== undefined ? Math.min(quantity, Math.max(1, cap)) : quantity);\n },\n remove: (key) => store.removeItem(key),\n clear: () => store.clearItems(),\n has: (config) => {\n try {\n return store.hasItem(itemKey(canonicalConfig(config, chainId)));\n } catch {\n return false;\n }\n },\n dismissUnconfirmed: (id) => store.deleteResult(id),\n checkPending: async () => {\n await Promise.all(store.getSnapshot().pending.map((p) => settleOne(p.id)));\n shared.bump();\n },\n }),\n [cartLines, unconfirmed, collected, total, add, store, chainId, settleOne, shared],\n );\n\n const internals = useMemo<CartInternals>(\n () => ({\n chainId,\n store,\n env,\n shared,\n limiter,\n account,\n getSignal: () => core.lifetime.signal,\n connect,\n setBusy,\n settle: settleOne,\n refreshLine: readLine,\n lineData: (key) => book.map.get(key) ?? null,\n }),\n [chainId, store, env, shared, limiter, account, connect, setBusy, settleOne, readLine, book, core],\n );\n\n return createElement(InternalsContext.Provider, { value: internals }, createElement(StateContext.Provider, { value: state }, children));\n}\n\n","// Cart-only error type. The cart adds four reason codes without touching the core ReasonCode union (R2).\nimport type { ReasonCode } from '../core/errors';\nimport { isMintError, toReason } from '../core/errors';\n\nexport const CART_REASONS = ['CART_ERC20_UNSUPPORTED', 'PERSISTENCE_UNAVAILABLE', 'REQUEST_NOT_SENT'] as const;\nexport type CartOnlyReason = (typeof CART_REASONS)[number];\nexport type CartReasonCode = ReasonCode | CartOnlyReason;\n\nexport class CartError extends Error {\n readonly reason: CartReasonCode;\n constructor(reason: CartReasonCode, message: string, opts?: { cause?: unknown }) {\n super(message, opts?.cause === undefined ? undefined : { cause: opts.cause });\n this.name = 'CartError';\n this.reason = reason;\n }\n}\n\n/** CartError and MintError keep their reason; anything else goes through the shared toReason. */\nexport function cartReason(e: unknown): { reason: CartReasonCode; message: string } {\n if (e instanceof CartError) return { reason: e.reason, message: e.message };\n if (isMintError(e)) return toReason(e);\n return toReason(e);\n}\n","// Pure line state (spec Step 3). No I/O, no clock: `now` arrives as an argument.\nimport { formatUnits } from 'viem';\nimport type { WalletRead } from '../core/adapters/types';\nimport { UNSUPPORTED_REASONS } from '../core/errors';\nimport { MAX_QUANTITY } from '../core/machine';\nimport type { DropInfo, Money } from '../core/types';\nimport type { CartReasonCode } from './errors';\nimport type { CartLineState } from './types';\n\nexport type LineRead = {\n drop: DropInfo | null;\n walletRead: WalletRead | null;\n /** The last drop or wallet read failure, after retries. A failed wallet read is never live. */\n readError: { reason: CartReasonCode; message: string } | null;\n};\n\nconst isUnsupportedReason = (r: CartReasonCode): boolean => (UNSUPPORTED_REASONS as readonly string[]).includes(r);\n\n/**\n * In order: locked, unsupported, error, loading, ended / sold-out / upcoming (the tests of machine.ts derive),\n * ineligible, live. `walletConnected` says a wallet read is expected before the line can be live.\n */\nexport function deriveLine(args: LineRead & { now: number; pending: boolean; walletConnected: boolean }): {\n state: CartLineState;\n reason: CartReasonCode | null;\n message: string | null;\n} {\n const { drop, walletRead, readError, now, pending, walletConnected } = args;\n const out = (state: CartLineState, reason: CartReasonCode | null = null, message: string | null = null) => ({ state, reason, message });\n if (pending) return out('locked');\n if (drop !== null && drop.paymentToken !== null) {\n return out('unsupported', 'CART_ERC20_UNSUPPORTED', 'This item is priced in a token. The cart takes only items priced in the chain\\'s native token.');\n }\n if (readError && isUnsupportedReason(readError.reason)) return out('unsupported', readError.reason, readError.message);\n if (readError) return out('error', readError.reason, readError.message);\n if (drop === null) return out('loading');\n if (walletConnected && walletRead === null) return out('loading');\n if (drop.endTime !== null && drop.endTime <= now) return out('ended');\n if (drop.maxSupply !== null && drop.maxSupply > 0n && drop.totalMinted >= drop.maxSupply) return out('sold-out');\n if (drop.startTime !== null && drop.startTime > now) return out('upcoming');\n if (walletRead?.ineligible) return out('ineligible', walletRead.ineligible.reason, walletRead.ineligible.message);\n return out('live');\n}\n\n/** Copies left, capped by the wallet limit when a wallet is connected. null = no limit. */\nexport function lineMaxQuantity(drop: DropInfo | null, walletRead: WalletRead | null): number | null {\n if (drop === null) return null;\n let max: number | null = null;\n if (drop.maxSupply !== null && drop.maxSupply > 0n) {\n const left = drop.maxSupply - drop.totalMinted;\n max = left > 0n ? (left < BigInt(MAX_QUANTITY) ? Number(left) : MAX_QUANTITY) : 0;\n }\n if (walletRead !== null && walletRead.maxQuantity !== null) {\n const cap = Math.max(0, Math.floor(walletRead.maxQuantity));\n max = max === null ? cap : Math.min(max, cap);\n }\n return max;\n}\n\nconst money = (value: bigint, like: Money): Money => ({ value, decimals: like.decimals, symbol: like.symbol, formatted: formatUnits(value, like.decimals) });\n\n/** (unitPrice + unitFee) x quantity, native. Null when there is no drop or the price is not native. */\nexport function lineTotal(drop: DropInfo | null, quantity: number): Money | null {\n if (drop === null || drop.paymentToken !== null) return null;\n const q = BigInt(quantity);\n return money((drop.unitPrice.value + drop.unitFee.value) * q, drop.unitPrice);\n}\n\n/** Price and fee apart for one line (R6). */\nexport function lineParts(drop: DropInfo, quantity: number): { price: Money; fee: Money } {\n const q = BigInt(quantity);\n return { price: money(drop.unitPrice.value * q, drop.unitPrice), fee: money(drop.unitFee.value * q, drop.unitFee) };\n}\n\nexport function sumMoney(parts: Money[], like: Money): Money {\n return money(parts.reduce((a, m) => a + m.value, 0n), like);\n}\n","// Read helpers for the cart (spec Step 3): shared reads, a read concurrency limit, and the merkle call limit.\nimport type { PublicClient } from 'viem';\nimport { findExtension } from '../core/adapters/manifold-claim';\n\n/** Read client wrapper with the shared reads of Step 3. Same shape as a PublicClient. */\nexport type SharedClient = { client: PublicClient; bump(): void };\n\n/**\n * MINT_FEE is read once per extension and an extension's code once, for the provider's lifetime. The gas price and\n * a wallet's balance are read once per epoch; bump() starts a new epoch (a refresh, or a checkout start).\n * Failed reads are not kept. Everything else goes straight to the read client.\n */\nexport function sharedReadClient(raw: PublicClient): SharedClient {\n let epoch = 0;\n const forever = new Map<string, Promise<unknown>>();\n const perEpoch = new Map<string, Promise<unknown>>();\n\n const memo = <T>(cache: Map<string, Promise<unknown>>, key: string, load: () => Promise<T>): Promise<T> => {\n const hit = cache.get(key);\n if (hit) return hit as Promise<T>;\n const p = load();\n cache.set(key, p);\n p.catch(() => {\n if (cache.get(key) === p) cache.delete(key);\n });\n return p;\n };\n const chainId = (): number => raw.chain?.id ?? 0;\n\n const overrides: Record<string, (...args: never[]) => unknown> = {\n getCode: (args: { address: `0x${string}` }) => {\n const address = args.address.toLowerCase();\n // Only the claim extensions are stable; a payer's code is read fresh (once per checkout start).\n if (findExtension(chainId(), address as `0x${string}`)) return memo(forever, `code:${address}`, () => raw.getCode(args));\n return raw.getCode(args);\n },\n readContract: (args: { address: `0x${string}`; functionName: string }) => {\n if (args.functionName === 'MINT_FEE' || args.functionName === 'MINT_FEE_MERKLE') {\n return memo(forever, `fee:${args.address.toLowerCase()}:${args.functionName}`, () => raw.readContract(args as never));\n }\n return raw.readContract(args as never);\n },\n getGasPrice: () => memo(perEpoch, `gas:${String(epoch)}`, () => raw.getGasPrice()),\n getBalance: (args: { address: `0x${string}` }) => memo(perEpoch, `bal:${String(epoch)}:${args.address.toLowerCase()}`, () => raw.getBalance(args)),\n };\n\n const client = new Proxy(raw, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && prop in overrides) return overrides[prop];\n const value = Reflect.get(target, prop, receiver) as unknown;\n return typeof value === 'function' ? (value as (...a: unknown[]) => unknown).bind(target) : value;\n },\n });\n return {\n client,\n bump: () => {\n epoch += 1;\n perEpoch.clear();\n },\n };\n}\n\n/** At most `limit` tasks run at once; the rest wait in order. */\nexport class Limiter {\n private running = 0;\n private queue: (() => void)[] = [];\n constructor(private readonly limit: () => number) {}\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n if (this.running >= this.limit()) await new Promise<void>((resolve) => this.queue.push(resolve));\n this.running += 1;\n try {\n return await task();\n } finally {\n this.running -= 1;\n this.queue.shift()?.();\n }\n }\n}\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason);\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(t);\n reject(signal?.reason);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\nexport { sleep };\n\n/** Wraps fetch so at most `perMinute` calls start in any 60 seconds; the rest wait (Step 3: merkle calls, 10 per minute). */\nexport function rateLimitedFetch(base: typeof fetch | undefined, perMinute: () => number): typeof fetch {\n const starts: number[] = [];\n const target: typeof fetch = base ?? ((input, init) => globalThis.fetch(input, init));\n return (async (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => {\n for (;;) {\n const now = Date.now();\n while (starts.length && now - starts[0]! >= 60_000) starts.shift();\n if (starts.length < perMinute()) break;\n await sleep(60_000 - (now - starts[0]!) + 5, init?.signal ?? undefined);\n }\n starts.push(Date.now());\n return target(input, init);\n }) as typeof fetch;\n}\n","// The cart runner (spec Step 1, Step 5, Step 5b). No React. Built from core pieces: the claim adapter, the read\n// client, the wallet client and receipt parsing. prepareLine sends nothing; sendSwitch, sendAddChain and sendMint\n// each send exactly one wallet request; waitMint waits on the READ client; settle is the Step 5b algorithm.\nimport { createWalletClient, custom, formatUnits, type EIP1193Provider, type Hex, type PublicClient } from 'viem';\nimport { manifoldClaimAdapter } from '../core/adapters/manifold-claim';\nimport { parseMintReceipt } from '../core/adapters/receipt';\nimport type { AdapterContext, HoldingsQuery, MintPlan, WalletRead } from '../core/adapters/types';\nimport { MintError } from '../core/errors';\nimport { friendlyErrorMessage } from '../core/friendly-errors';\nimport { getChain } from '../core/rpc';\nimport { getAccount, getWalletProvider, requestAddChain, requestSwitch } from '../core/wallet';\nimport type { Address, Attempt, DropInfo, ManifoldClaimConfig, Money } from '../core/types';\nimport { CartError, type CartReasonCode, cartReason } from './errors';\nimport { deriveLine, lineMaxQuantity } from './line';\nimport { sleep } from './reads';\nimport { itemKey, newId, type CartStore } from './store';\nimport type { CollectedToken } from './links';\nimport type { CartLineState, PendingMint, Result } from './types';\n\n/** Every timing in one place. Mutable so tests do not wait in real time. */\nexport const CART_TIMING = {\n /** A failed read is retried after these delays, then the line shows error (Step 3). */\n retryDelaysMs: [1_000, 2_000, 4_000] as number[],\n /** A prepared request older than this goes back to preparing (R19). */\n preparedExpiryMs: 30_000,\n refreshMs: 30_000,\n refreshBackoffMs: 60_000,\n receiptTimeoutMs: 120_000,\n /** An unknown hash this long after hashAt is a lost hash (Step 5b). */\n unknownHashSec: 300,\n holdingsTries: 3,\n maxReadsInFlight: 4,\n merklePerMinute: 10,\n};\n\nconst nowSec = (): number => Math.floor(Date.now() / 1000);\n\nexport const adapter = manifoldClaimAdapter;\n\n// ---------------------------------------------------------------- prepare\n\n/** A line that cannot be minted right now, and why. Not an error: the checkout skips it with no prompt (R10). */\nexport class LineSkipped extends Error {\n readonly state: CartLineState | 'failed';\n readonly reason: CartReasonCode | null;\n constructor(state: CartLineState | 'failed', reason: CartReasonCode | null, message: string) {\n super(message);\n this.name = 'LineSkipped';\n this.state = state;\n this.reason = reason;\n }\n}\n\nexport type Prepared = {\n key: string;\n config: ManifoldClaimConfig;\n quantity: number;\n payer: Address;\n recipient: Address;\n plan: MintPlan;\n drop: DropInfo;\n walletRead: WalletRead;\n holdings: HoldingsQuery & { before: string };\n /** Date.now() when the reads finished. */\n preparedAt: number;\n /** The exact charge (plan.mint.value), for the button. */\n amount: Money;\n /** Cart item revision when preparing began (R19). */\n revision: number;\n};\n\nexport type RunEnv = {\n client: PublicClient;\n chainId: number;\n /** One cache scope per line, so merkle data is kept between refreshes. */\n ctxFor(key: string): AdapterContext;\n fetch?: typeof fetch;\n};\n\nconst skipText: Partial<Record<CartLineState, string>> = {\n 'sold-out': 'Sold out.',\n ended: 'The sale has ended.',\n upcoming: 'The sale has not started.',\n locked: 'A mint for this item is still being confirmed.',\n};\n\nlet attemptIds = 0;\n\nexport type Assessed = {\n key: string;\n config: ManifoldClaimConfig;\n quantity: number;\n payer: Address;\n recipient: Address;\n attempt: Attempt & { config: ManifoldClaimConfig };\n drop: DropInfo;\n walletRead: WalletRead;\n plan: MintPlan;\n ctx: AdapterContext;\n};\n\n/**\n * Re-reads the drop and the wallet and builds the plan. Throws LineSkipped (sold out, ineligible, ...) for a line\n * that cannot be minted, CartError for an ERC-20 price, or a MintError for a failed read. Sends nothing.\n */\nexport async function assessLine(env: RunEnv, line: { config: ManifoldClaimConfig; quantity: number }, payer: Address): Promise<Assessed> {\n const config = structuredClone(line.config);\n const key = itemKey(config);\n const ctx = env.ctxFor(key);\n const recipient = payer;\n const drop = await adapter.readDrop(ctx, config);\n if (drop.paymentToken !== null) throw new CartError('CART_ERC20_UNSUPPORTED', 'This item is priced in a token, which the cart does not support.');\n const walletRead = await adapter.readWallet(ctx, config, { payer, recipient, quantity: line.quantity, drop });\n const read = deriveLine({ drop, walletRead, readError: null, now: nowSec(), pending: false, walletConnected: true });\n if (read.state !== 'live') throw new LineSkipped(read.state, read.reason, read.message ?? skipText[read.state] ?? 'This item cannot be minted right now.');\n const max = lineMaxQuantity(drop, walletRead);\n if (max !== null && line.quantity > max) {\n throw new LineSkipped(max === 0 ? 'sold-out' : 'ineligible', 'WALLET_LIMIT', max === 0 ? 'Sold out.' : `Only ${String(max)} left for this wallet.`);\n }\n // Frozen the way useMint freezes an attempt (useMint.ts:731-740).\n const attempt: Attempt & { config: ManifoldClaimConfig } = Object.freeze({\n attemptId: ++attemptIds,\n config,\n payer,\n recipient,\n quantity: line.quantity,\n chainId: config.chainId,\n tokenContract: config.creatorContract,\n originChainId: config.chainId,\n });\n const plan = await adapter.buildPlan(ctx, attempt, walletRead);\n if (plan.approve) throw new CartError('CART_ERC20_UNSUPPORTED', 'This item needs a token approval, which the cart does not support.');\n return { key, config, quantity: line.quantity, payer, recipient, attempt, drop, walletRead, plan, ctx };\n}\n\n/**\n * assessLine, then the simulation and the holdings count before. Sends nothing to the wallet.\n * Throws LineSkipped (also for a reverted simulation), CartError or MintError.\n */\nexport async function prepareLine(env: RunEnv, line: { config: ManifoldClaimConfig; quantity: number; revision: number }, payer: Address): Promise<Prepared> {\n const a = await assessLine(env, line, payer);\n try {\n await adapter.simulate(a.ctx, a.attempt, a.plan);\n } catch (e) {\n if (e instanceof MintError && e.reason === 'SIMULATION_REVERTED') throw new LineSkipped('ineligible', 'SIMULATION_REVERTED', friendlyErrorMessage(e));\n throw e;\n }\n const query = adapter.holdingsQuery?.(a.drop) ?? null;\n if (!query || !adapter.readHoldings) throw new MintError('RPC_ERROR', 'The cart cannot count holdings for this item.');\n const before = await adapter.readHoldings(a.ctx, query, a.recipient);\n const unit = a.drop.unitPrice;\n return {\n key: a.key,\n config: a.config,\n quantity: a.quantity,\n payer: a.payer,\n recipient: a.recipient,\n plan: a.plan,\n drop: a.drop,\n walletRead: a.walletRead,\n holdings: { ...query, before: before.toString() },\n preparedAt: Date.now(),\n amount: { value: a.plan.mint.value, decimals: unit.decimals, symbol: unit.symbol, formatted: formatUnits(a.plan.mint.value, unit.decimals) },\n revision: line.revision,\n };\n}\n\n/** Retries a failing read: one try, then one more after each delay. Final errors and aborts are not retried. */\nexport async function withRetries<T>(fn: () => Promise<T>, delaysMs: readonly number[], isFinal: (e: unknown) => boolean, signal?: AbortSignal): Promise<T> {\n for (let i = 0; ; i++) {\n try {\n return await fn();\n } catch (e) {\n if (isFinal(e) || i >= delaysMs.length || signal?.aborted) throw e;\n await sleep(delaysMs[i]!, signal);\n }\n }\n}\n\n// ---------------------------------------------------------------- wallet requests (one each)\n\n/** wallet_switchEthereumChain only. A 4902 returns { needsAdd: true } and sends nothing more. */\nexport const sendSwitch = (chainId: number): Promise<{ needsAdd: boolean }> => requestSwitch(chainId);\n\n/** wallet_addEthereumChain only. */\nexport const sendAddChain = (chainId: number): Promise<void> => requestAddChain(chainId);\n\n/** Mints whose sendMint call is still open in this tab, and those that ended with REQUEST_NOT_SENT. */\nconst openCalls = new Set<string>();\nconst notSentCalls = new Set<string>();\nexport const markCallOpen = (id: string): void => void openCalls.add(id);\nexport const markCallClosed = (id: string): void => void openCalls.delete(id);\nexport const isCallOpen = (id: string): boolean => openCalls.has(id);\nexport const markNotSent = (id: string): void => void notSentCalls.add(id);\nexport const wasNotSent = (id: string): boolean => notSentCalls.has(id);\n\nconst SEND_METHODS: ReadonlySet<string> = new Set(['eth_sendTransaction', 'wallet_sendTransaction']);\n\n/**\n * Sends plan.mint. The payer check is synchronous. The wallet client wraps the same EIP-1193 provider getWalletClient\n * uses, in a custom transport that notes when eth_sendTransaction is forwarded. An error before that is\n * REQUEST_NOT_SENT (R22). chain stays bound, so viem checks the wallet's real chain right before the send.\n * Everything before the request is synchronous (R14); onHash fires as soon as the wallet returns the hash.\n */\nexport async function sendMint(prepared: Prepared, hooks: { onHash(hash: Hex): void }): Promise<Hex> {\n const notSent = (message: string, cause?: unknown) => new CartError('REQUEST_NOT_SENT', message, { cause });\n const live = getAccount();\n if (!live || live.address.toLowerCase() !== prepared.payer.toLowerCase()) {\n throw notSent('The connected wallet changed before the transaction was sent.');\n }\n let provider: EIP1193Provider;\n let chain;\n try {\n provider = getWalletProvider();\n chain = getChain(prepared.config.chainId);\n } catch (e) {\n throw notSent('No wallet is connected.', e);\n }\n const state = { forwarded: false };\n // viem's custom() forwards a second options argument; wallet providers take exactly one.\n const request = ((args: { method: string }) => {\n if (SEND_METHODS.has(args.method)) state.forwarded = true;\n return (provider.request as (a: unknown) => Promise<unknown>)(args);\n }) as EIP1193Provider['request'];\n const wallet = createWalletClient({ chain, transport: custom({ request }, { retryCount: 0 }) });\n let hash: Hex;\n try {\n hash = await wallet.sendTransaction({ account: prepared.payer, to: prepared.plan.mint.to, data: prepared.plan.mint.data, value: prepared.plan.mint.value, chain });\n } catch (e) {\n if (!state.forwarded) throw notSent('The transaction request did not reach the wallet.', e);\n throw e;\n }\n hooks.onHash(hash);\n return hash;\n}\n\n// ---------------------------------------------------------------- receipts\n\nexport type MintReceipt = { status: 'success' | 'reverted'; hash: Hex; minted: bigint; tokens: CollectedToken[] };\n\ntype Receiptish = { status?: unknown; logs?: readonly { address: Address; topics: readonly Hex[]; data: Hex }[]; transactionHash?: Hex };\nconst receiptOk = (status: unknown): boolean => status === 'success' || status === 1 || status === 1n || status === '0x1';\n\nexport function toMintReceipt(receipt: Receiptish, hash: Hex, tokenContract: Address, recipient: Address): MintReceipt {\n const ok = receiptOk(receipt.status);\n const parsed = ok ? parseMintReceipt(receipt.logs ?? [], { tokenContract, recipient }) : [];\n const minted = parsed.reduce((n, t) => n + t.amount, 0n);\n const tokens = parsed.map((t) => ({ contract: t.contract, tokenId: t.tokenId.toString() }));\n return { status: ok ? 'success' : 'reverted', hash: receipt.transactionHash ?? hash, minted, tokens };\n}\n\n/**\n * Waits for the receipt on the READ client (never the wallet). viem follows a sped-up or repriced replacement on its\n * own through onReplaced. Rejects on timeout or an RPC error.\n */\nexport async function waitMint(\n client: PublicClient,\n args: { hash: Hex; tokenContract: Address; recipient: Address; onReplaced?: (replacement: { reason: string; hash: Hex | null }) => void },\n): Promise<MintReceipt> {\n const receipt = (await client.waitForTransactionReceipt({\n hash: args.hash,\n confirmations: 1,\n timeout: CART_TIMING.receiptTimeoutMs,\n onReplaced: (r: { reason: string; transaction?: { hash?: Hex } }) => args.onReplaced?.({ reason: r.reason, hash: r.transaction?.hash ?? null }),\n })) as Receiptish;\n return toMintReceipt(receipt, args.hash, args.tokenContract, args.recipient);\n}\n\n// ---------------------------------------------------------------- settle (Step 5b)\n\nexport type SettleOutcome =\n | { kind: 'waiting'; message: string }\n | { kind: 'not-sent' }\n | { kind: 'collected'; result: Result; warning: string | null }\n | { kind: 'unconfirmed'; result: Result }\n | { kind: 'failed'; hash: Hex | null; message: string }\n /** An RPC or storage error. The pending mint is left as it is. */\n | { kind: 'unavailable'; reason: CartReasonCode; message: string };\n\n/** 0x1234…abcd, so a collector with several wallets knows which one to open. */\nexport const shortAddress = (a: Address): string => `${a.slice(0, 6)}\\u2026${a.slice(-4)}`;\nexport const lostHashWarning = (wallet: Address): string => `If wallet ${shortAddress(wallet)} still shows a request for this item, reject it.`;\nexport const unconfirmedMessage = (wallet: Address): string =>\n `We couldn't confirm this. Check wallet ${shortAddress(wallet)}. If it didn't go through, add it again.`;\n\nconst isNotFound = (e: unknown): boolean => {\n for (let x = e as { name?: string; cause?: unknown } | undefined, depth = 0; x && depth < 6; depth++) {\n if (x.name === 'TransactionReceiptNotFoundError' || x.name === 'TransactionNotFoundError') return true;\n x = x.cause as typeof x;\n }\n return false;\n};\n\nexport type SettleEnv = {\n client: PublicClient;\n ctx: AdapterContext;\n store: CartStore;\n /** A receipt the caller already has for this mint (from waitMint). */\n receipt?: MintReceipt | null;\n /** The hash from this tab's memory when writing it to storage failed. */\n memHash?: Hex | null;\n};\n\nasync function readHoldingsUp(env: SettleEnv, p: PendingMint): Promise<boolean | null> {\n const read = adapter.readHoldings;\n if (!read) return null;\n for (let i = 0; i < CART_TIMING.holdingsTries; i++) {\n try {\n const after = await read(env.ctx, p.holdings, p.recipient);\n return after - BigInt(p.holdings.before) >= BigInt(p.quantity);\n } catch {\n /* try again */\n }\n }\n return null;\n}\n\n/** Without a receipt the minted tokens are known only for an 1155 counted by balanceOf (its tokenId). */\nconst tokensFromQuery = (p: PendingMint): CollectedToken[] =>\n p.holdings.kind === 'balance-1155' ? [{ contract: p.holdings.creatorContract, tokenId: p.holdings.tokenId }] : [];\n\nfunction resultFor(p: PendingMint, status: Result['status'], hash: Hex | null, tokens: CollectedToken[] = []): Result {\n return { id: newId(), status, lineKey: p.lineKey, config: p.config, payer: p.payer, recipient: p.recipient, quantity: p.quantity, holdings: p.holdings, txHash: hash, tokens, at: nowSec() };\n}\n\n/** One write: remove the pending mint and its line, add the result. A failed write leaves everything as it was. */\nfunction commit(env: SettleEnv, p: PendingMint, result: Result): SettleOutcome | null {\n try {\n env.store.settle(p.id, result);\n return null;\n } catch (e) {\n const { reason, message } = cartReason(e);\n return { kind: 'unavailable', reason, message };\n }\n}\n\n/**\n * The Step 5b algorithm for one pending mint: the first branch that matches. Never sends anything to the wallet and\n * never resends a mint.\n */\nexport async function settle(env: SettleEnv, pending: PendingMint): Promise<SettleOutcome> {\n const p = pending;\n const hash = p.hash ?? env.memHash ?? null;\n\n // 1-3. No hash.\n if (!hash) {\n if (isCallOpen(p.id)) return { kind: 'waiting', message: 'Waiting for the wallet.' };\n if (wasNotSent(p.id)) {\n try {\n env.store.removePending(p.id);\n } catch (e) {\n const { reason, message } = cartReason(e);\n return { kind: 'unavailable', reason, message };\n }\n notSentCalls.delete(p.id); // handled: the mark must not outlive the pending mint\n return { kind: 'not-sent' };\n }\n return lostHash(env, p);\n }\n\n // 4. A receipt for the hash, or for the replacement viem reported.\n let receipt: MintReceipt | null = env.receipt ?? null;\n if (!receipt) {\n try {\n const r = (await env.client.getTransactionReceipt({ hash })) as Receiptish;\n receipt = toMintReceipt(r, hash, p.config.creatorContract, p.recipient);\n } catch (e) {\n if (!isNotFound(e)) {\n const { reason, message } = cartReason(e);\n return { kind: 'unavailable', reason, message };\n }\n }\n }\n if (receipt) {\n if (receipt.status === 'reverted') {\n try {\n env.store.removePending(p.id);\n } catch (e) {\n const { reason, message } = cartReason(e);\n return { kind: 'unavailable', reason, message };\n }\n return { kind: 'failed', hash: receipt.hash, message: 'The mint transaction reverted.' };\n }\n if (receipt.minted >= BigInt(p.quantity)) {\n const result = resultFor(p, 'collected', receipt.hash, receipt.tokens);\n return commit(env, p, result) ?? { kind: 'collected', result, warning: null };\n }\n const result = resultFor(p, 'unconfirmed', receipt.hash);\n return commit(env, p, result) ?? { kind: 'unconfirmed', result };\n }\n\n // 5. No receipt. A transaction the node knows, or one younger than 5 minutes, is still on its way.\n let known = false;\n try {\n await env.client.getTransaction({ hash });\n known = true;\n } catch (e) {\n if (!isNotFound(e)) {\n const { reason, message } = cartReason(e);\n return { kind: 'unavailable', reason, message };\n }\n }\n const age = p.hashAt === null ? Infinity : nowSec() - p.hashAt;\n if (known || age < CART_TIMING.unknownHashSec) return { kind: 'waiting', message: 'Still confirming.' };\n\n // 6. Lost hash.\n return lostHash(env, p);\n}\n\n/** Reads holdings with the pending mint's own query, up to 3 tries. Nothing is resent, and nobody is asked (D15). */\nasync function lostHash(env: SettleEnv, p: PendingMint): Promise<SettleOutcome> {\n const up = await readHoldingsUp(env, p);\n if (up) {\n const result = resultFor(p, 'collected', p.hash ?? env.memHash ?? null, tokensFromQuery(p));\n return commit(env, p, result) ?? { kind: 'collected', result, warning: lostHashWarning(p.payer) };\n }\n const result = resultFor(p, 'unconfirmed', p.hash ?? env.memHash ?? null);\n return commit(env, p, result) ?? { kind: 'unconfirmed', result };\n}\n","// Cart store (spec Step 2, D24): ONE sessionStorage value holding items, pending mints and results.\n// Every change is read from memory, changed, written with ONE setItem, and read back. No React.\nimport { getAddress, isAddress } from 'viem';\nimport { MAX_QUANTITY } from '../core/machine';\nimport { MintError } from '../core/errors';\nimport type { Address, Hex, ManifoldClaimConfig } from '../core/types';\nimport { CartError } from './errors';\nimport type { CartValue, CollectedToken, PendingMint, Result, StoredItem } from './types';\n\nexport const CART_VALUE_VERSION = 6 as const;\n\nexport const defaultStorageKey = (chainId: number): string => `dropkit-cart:${String(chainId)}`;\n\n/** The item key: no network lookup is needed because extension is required (D20). */\nexport function itemKey(config: ManifoldClaimConfig): string {\n return `${String(config.chainId)}:${getAddress(config.creatorContract)}:${BigInt(config.instanceId).toString()}:${getAddress(config.extension as Address)}`;\n}\n\n/** Validates a cart config and returns its canonical form (checksummed addresses, plain decimal id). Throws INVALID_CONFIG. */\nexport function canonicalConfig(config: unknown, chainId: number): ManifoldClaimConfig {\n const c = (config ?? {}) as Partial<ManifoldClaimConfig> & { type?: string };\n if (c.type !== 'manifold-claim') {\n throw new MintError('INVALID_CONFIG', 'The cart takes only Manifold claims (type: \"manifold-claim\").', { field: 'type' });\n }\n if (c.chainId !== chainId) {\n throw new MintError('INVALID_CONFIG', `This cart is on chain ${String(chainId)}; the config is on chain ${String(c.chainId)}.`, { field: 'chainId' });\n }\n if (typeof c.creatorContract !== 'string' || !isAddress(c.creatorContract, { strict: false })) {\n throw new MintError('INVALID_CONFIG', 'creatorContract is not a valid address.', { field: 'creatorContract' });\n }\n if (typeof c.extension !== 'string' || !isAddress(c.extension, { strict: false })) {\n throw new MintError('INVALID_CONFIG', 'Cart configs must set extension (the claim extension address).', { field: 'extension' });\n }\n if (typeof c.instanceId !== 'string' || !/^\\d+$/.test(c.instanceId)) {\n throw new MintError('INVALID_CONFIG', 'instanceId must be a non-negative integer string.', { field: 'instanceId' });\n }\n return {\n type: 'manifold-claim',\n chainId,\n creatorContract: getAddress(c.creatorContract),\n instanceId: BigInt(c.instanceId).toString(),\n extension: getAddress(c.extension),\n };\n}\n\nconst clampQuantity = (q: number): number => Math.max(1, Math.min(Math.floor(Number.isFinite(q) ? q : 1), MAX_QUANTITY));\n\nconst EMPTY_VALUE = (chainId: number): CartValue => ({ v: CART_VALUE_VERSION, chainId, items: [], pending: [], results: [] });\n\n// ---------- validation of a restored value ----------\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\nconst isHash = (v: unknown): v is Hex => typeof v === 'string' && /^0x[0-9a-fA-F]{64}$/.test(v);\nconst isAddr = (v: unknown): v is Address => typeof v === 'string' && isAddress(v, { strict: false });\nconst isIntStr = (v: unknown): v is string => typeof v === 'string' && /^\\d+$/.test(v);\nconst isQuantity = (v: unknown): v is number => typeof v === 'number' && Number.isInteger(v) && v >= 1 && v <= MAX_QUANTITY;\n\nfunction restoreConfig(v: unknown, chainId: number): ManifoldClaimConfig | null {\n try {\n return canonicalConfig(v, chainId);\n } catch {\n return null;\n }\n}\n\nfunction restoreHoldings(v: unknown): PendingMint['holdings'] | null {\n if (!isRecord(v) || !isIntStr(v.before)) return null;\n if (v.kind === 'total-mints' && isAddr(v.extension) && isAddr(v.creatorContract) && isIntStr(v.instanceId)) {\n return { kind: 'total-mints', extension: getAddress(v.extension), creatorContract: getAddress(v.creatorContract), instanceId: v.instanceId, before: v.before };\n }\n if (v.kind === 'balance-1155' && isAddr(v.creatorContract) && isIntStr(v.tokenId)) {\n return { kind: 'balance-1155', creatorContract: getAddress(v.creatorContract), tokenId: v.tokenId, before: v.before };\n }\n if (v.kind === 'balance-721' && isAddr(v.creatorContract)) {\n return { kind: 'balance-721', creatorContract: getAddress(v.creatorContract), before: v.before };\n }\n return null;\n}\n\nfunction restorePending(v: unknown, chainId: number): PendingMint | null {\n if (!isRecord(v)) return null;\n const config = restoreConfig(v.config, chainId);\n const holdings = restoreHoldings(v.holdings);\n if (!config || !holdings) return null;\n if (typeof v.id !== 'string' || typeof v.lineKey !== 'string' || !isAddr(v.payer) || !isAddr(v.recipient) || !isQuantity(v.quantity)) return null;\n if (v.hash !== null && !isHash(v.hash)) return null;\n if (v.hashAt !== null && typeof v.hashAt !== 'number') return null;\n if (typeof v.createdAt !== 'number') return null;\n return {\n id: v.id,\n lineKey: v.lineKey,\n config,\n payer: getAddress(v.payer),\n recipient: getAddress(v.recipient),\n quantity: v.quantity,\n holdings,\n hash: v.hash,\n hashAt: v.hashAt,\n createdAt: v.createdAt,\n };\n}\n\nfunction restoreResult(v: unknown, chainId: number): Result | null {\n if (!isRecord(v)) return null;\n const config = restoreConfig(v.config, chainId);\n const holdings = restoreHoldings(v.holdings);\n if (!config || !holdings) return null;\n if (typeof v.id !== 'string' || typeof v.lineKey !== 'string' || !isAddr(v.payer) || !isAddr(v.recipient) || !isQuantity(v.quantity)) return null;\n if (v.status !== 'collected' && v.status !== 'unconfirmed') return null;\n if (v.txHash !== null && !isHash(v.txHash)) return null;\n if (typeof v.at !== 'number') return null;\n if (!Array.isArray(v.tokens)) return null;\n const tokens: CollectedToken[] = [];\n for (const t of v.tokens as unknown[]) {\n if (!isRecord(t) || !isAddr(t.contract) || typeof t.tokenId !== 'string' || !/^\\d+$/.test(t.tokenId)) return null;\n tokens.push({ contract: getAddress(t.contract), tokenId: t.tokenId });\n }\n return { id: v.id, status: v.status, lineKey: v.lineKey, config, payer: getAddress(v.payer), recipient: getAddress(v.recipient), quantity: v.quantity, holdings, txHash: v.txHash, tokens, at: v.at };\n}\n\ntype Lock = 'foreign' | 'corrupt' | null;\n\n/**\n * Parses a stored value. A parse failure or an unknown v starts an empty cart. A value for another chain is ignored\n * and never overwritten ('foreign'). An invalid item is dropped; an invalid pending mint or result is kept out of the\n * cart and also never overwritten ('corrupt'): the code never wipes what it cannot read.\n */\nexport function restoreValue(raw: string | null, chainId: number): { value: CartValue; lock: Lock } {\n if (raw === null) return { value: EMPTY_VALUE(chainId), lock: null };\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { value: EMPTY_VALUE(chainId), lock: null };\n }\n if (!isRecord(parsed) || parsed.v !== CART_VALUE_VERSION) return { value: EMPTY_VALUE(chainId), lock: null };\n if (parsed.chainId !== chainId) return { value: EMPTY_VALUE(chainId), lock: 'foreign' };\n\n const items: StoredItem[] = [];\n const seen = new Set<string>();\n for (const it of Array.isArray(parsed.items) ? parsed.items : []) {\n if (!isRecord(it)) continue;\n const config = restoreConfig(it.config, chainId);\n if (!config || !isQuantity(it.quantity)) continue;\n const key = itemKey(config);\n if (seen.has(key)) continue;\n seen.add(key);\n items.push({ config, quantity: it.quantity });\n }\n let lock: Lock = null;\n const pending: PendingMint[] = [];\n for (const p of Array.isArray(parsed.pending) ? parsed.pending : []) {\n const r = restorePending(p, chainId);\n if (r) pending.push(r);\n else lock = 'corrupt';\n }\n const results: Result[] = [];\n for (const p of Array.isArray(parsed.results) ? parsed.results : []) {\n const r = restoreResult(p, chainId);\n if (r) results.push(r);\n else lock = 'corrupt';\n }\n if (!Array.isArray(parsed.pending) || !Array.isArray(parsed.results)) lock = 'corrupt';\n return { value: { v: CART_VALUE_VERSION, chainId, items, pending, results }, lock };\n}\n\nexport type StorageAccessor = () => Storage | null;\n\nconst defaultStorage: StorageAccessor = () => {\n try {\n return typeof window === 'undefined' ? null : window.sessionStorage;\n } catch {\n return null;\n }\n};\n\nconst newId = (): string => {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n return c?.randomUUID ? c.randomUUID() : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\nexport { newId };\n\nexport class CartStore {\n readonly storageKey: string;\n readonly chainId: number;\n private readonly storage: StorageAccessor;\n private value: CartValue | null = null;\n private lock: Lock = null;\n /** Item writes that could not reach storage (storage threw): the cart then lives in memory only. */\n private degraded = false;\n private listeners = new Set<() => void>();\n /** The raw value this store last read or wrote. A different raw value in storage was written by another store. */\n private lastRaw: string | null = null;\n /** Goes up on every item change (R19). One live provider per key (R17); a stale one merges (latest()). */\n revision = 0;\n\n constructor(opts: { storageKey: string; chainId: number; storage?: StorageAccessor }) {\n this.storageKey = opts.storageKey;\n this.chainId = opts.chainId;\n this.storage = opts.storage ?? defaultStorage;\n }\n\n /** Loads on first use (client only); never touches storage during server rendering. */\n getSnapshot = (): CartValue => {\n if (this.value === null) {\n let raw: string | null = null;\n try {\n raw = this.storage()?.getItem(this.storageKey) ?? null;\n } catch {\n this.degraded = true;\n }\n const restored = restoreValue(raw, this.chainId);\n this.value = restored.value;\n this.lock = restored.lock;\n this.lastRaw = raw;\n }\n return this.value;\n };\n\n /**\n * The value every write starts from: storage as it is now. A store left behind by an unmounted provider (a route\n * change mid-checkout) may still write once, when its wallet prompt returns; it must merge into what the newer\n * provider saved, never overwrite it (Codex PR #11 review A-F3). Memory-only stores (locked, no storage) keep\n * their own value.\n */\n private latest(): CartValue {\n const v = this.getSnapshot();\n if (this.lock !== null) return v;\n let raw: string | null;\n try {\n const st = this.storage();\n if (!st) return v;\n raw = st.getItem(this.storageKey);\n } catch {\n return v;\n }\n if (raw === null || raw === this.lastRaw) return v;\n const restored = restoreValue(raw, this.chainId);\n this.lastRaw = raw;\n if (restored.lock !== null) {\n // Another writer left a value this code cannot read: protect it, as on load.\n this.lock = restored.lock;\n return v;\n }\n this.value = restored.value;\n this.revision += 1; // items may have changed: a prepared request built on the old value is dropped (R19)\n this.notify();\n return restored.value;\n }\n\n subscribe = (cb: () => void): (() => void) => {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n };\n\n /** True when a value this code could not read protects the storage slot (writes are then memory-only). */\n get locked(): Lock {\n this.getSnapshot();\n return this.lock;\n }\n\n /** A real test write: storage must accept and return a value, and no unreadable value may be in the way. */\n persistenceOk(): boolean {\n this.getSnapshot();\n if (this.lock !== null) return false;\n try {\n const s = this.storage();\n if (!s) return false;\n const probe = `${this.storageKey}:probe`;\n s.setItem(probe, '1');\n const ok = s.getItem(probe) === '1';\n s.removeItem(probe);\n return ok;\n } catch {\n return false;\n }\n }\n\n private notify(): void {\n for (const cb of [...this.listeners]) cb();\n }\n\n /** One setItem, read back. Returns false when the value did not reach storage. */\n private persist(next: CartValue): boolean {\n if (this.lock !== null) return false;\n try {\n const s = this.storage();\n if (!s) return false;\n const raw = JSON.stringify(next);\n s.setItem(this.storageKey, raw);\n const ok = s.getItem(this.storageKey) === raw;\n if (ok) this.lastRaw = raw;\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * strict: the change must reach storage or nothing changes and PERSISTENCE_UNAVAILABLE is thrown (R15).\n * Item-only changes are not strict: a cart on a storage-less browser still works for the page's life.\n */\n private commit(next: CartValue, opts: { strict: boolean; items: boolean }): void {\n const ok = this.persist(next);\n if (!ok) {\n if (opts.strict) throw new CartError('PERSISTENCE_UNAVAILABLE', 'The cart could not save its state in this tab, so nothing was sent.');\n this.degraded = true;\n }\n this.value = next;\n if (opts.items) this.revision += 1;\n this.notify();\n }\n\n get isDegraded(): boolean {\n return this.degraded;\n }\n\n hasItem(key: string): boolean {\n return this.getSnapshot().items.some((i) => itemKey(i.config) === key);\n }\n\n pendingFor(key: string): PendingMint | undefined {\n return this.getSnapshot().pending.find((p) => p.lineKey === key);\n }\n\n // ---------- items ----------\n\n /** Adds an item, or raises the quantity of an existing key. `drop` deletes those results in the same write. */\n addItem(config: ManifoldClaimConfig, quantity: number, opts?: { cap?: number | null; dropResults?: string[] }): void {\n const v = this.latest();\n const key = itemKey(config);\n const existing = v.items.find((i) => itemKey(i.config) === key);\n const cap = opts?.cap ?? null;\n const bound = (q: number): number => clampQuantity(cap !== null ? Math.min(q, Math.max(1, cap)) : q);\n const items = existing\n ? v.items.map((i) => (i === existing ? { ...i, quantity: bound(i.quantity + quantity) } : i))\n : [...v.items, { config, quantity: bound(quantity) }];\n const drop = new Set(opts?.dropResults ?? []);\n const results = drop.size ? v.results.filter((r) => !drop.has(r.id)) : v.results;\n this.commit({ ...v, items, results }, { strict: false, items: true });\n }\n\n setQuantity(key: string, quantity: number): void {\n const v = this.latest();\n const item = v.items.find((i) => itemKey(i.config) === key);\n if (!item) return;\n const q = clampQuantity(quantity);\n if (q === item.quantity) return;\n this.commit({ ...v, items: v.items.map((i) => (i === item ? { ...i, quantity: q } : i)) }, { strict: false, items: true });\n }\n\n /** A line with a pending mint is locked and stays. */\n removeItem(key: string): void {\n const v = this.latest();\n if (v.pending.some((p) => p.lineKey === key)) return;\n const items = v.items.filter((i) => itemKey(i.config) !== key);\n if (items.length === v.items.length) return;\n this.commit({ ...v, items }, { strict: false, items: true });\n }\n\n /** Removes items only. Locked lines, pending mints and results stay. */\n clearItems(): void {\n const v = this.latest();\n const locked = new Set(v.pending.map((p) => p.lineKey));\n const items = v.items.filter((i) => locked.has(itemKey(i.config)));\n if (items.length === v.items.length) return;\n this.commit({ ...v, items }, { strict: false, items: true });\n }\n\n // ---------- pending mints and results ----------\n\n /**\n * Synchronous write plus read-back (R15). Throws CartError('PERSISTENCE_UNAVAILABLE'), changing nothing.\n * One pending mint per line: returns false, writing nothing, when the line already has one (a second\n * useCheckout under the same provider confirming the same line). The caller must not send.\n */\n writePending(p: PendingMint): boolean {\n const v = this.latest();\n if (v.pending.some((x) => x.lineKey === p.lineKey)) return false;\n this.commit({ ...v, pending: [...v.pending, p] }, { strict: true, items: false });\n return true;\n }\n\n setHash(id: string, hash: Hex, hashAt: number): void {\n const v = this.latest();\n if (!v.pending.some((p) => p.id === id)) return;\n this.commit({ ...v, pending: v.pending.map((p) => (p.id === id ? { ...p, hash, hashAt } : p)) }, { strict: true, items: false });\n }\n\n /** A failed or not-sent mint: the pending mint goes, the line stays. */\n removePending(id: string): void {\n const v = this.latest();\n if (!v.pending.some((p) => p.id === id)) return;\n this.commit({ ...v, pending: v.pending.filter((p) => p.id !== id) }, { strict: true, items: false });\n }\n\n /**\n * Settling is one write of the whole value (R16, D24): remove the pending mint, remove its line, add the result.\n */\n settle(id: string, result: Result): void {\n const v = this.latest();\n const p = v.pending.find((x) => x.id === id);\n if (!p) return;\n this.commit(\n {\n ...v,\n pending: v.pending.filter((x) => x.id !== id),\n items: v.items.filter((i) => itemKey(i.config) !== p.lineKey),\n results: [...v.results, result],\n },\n { strict: true, items: true },\n );\n }\n\n deleteResult(id: string): void {\n const v = this.latest();\n if (!v.results.some((r) => r.id === id)) return;\n this.commit({ ...v, results: v.results.filter((r) => r.id !== id) }, { strict: false, items: false });\n }\n}\n","// Links for a collected item (D32): the transaction on the chain's explorer and the tokens on OpenSea.\nimport { getAddress } from 'viem';\nimport { getChain } from '../core/rpc';\nimport type { Address, Hex } from '../core/types';\n\n/** A token the mint delivered, from the receipt (or the 1155 tokenId when the receipt was lost). */\nexport type CollectedToken = { contract: Address; tokenId: string };\n\nexport type CollectedLinks = {\n /** The transaction on the chain's block explorer. null without a hash or a known explorer. */\n tx: string | null;\n /**\n * The collector's OpenSea profile. Filtered to the collection when CartProvider has an OpenSea slug for the\n * contract; the plain profile when there is no slug and no token is known; otherwise null.\n */\n profile: string | null;\n /** One OpenSea item page per minted token. */\n tokens: { tokenId: string; url: string }[];\n};\n\n/** OpenSea's chain names. OpenSea has no testnets, so Sepolia and Base Sepolia get no OpenSea links. */\nconst OPENSEA_CHAINS: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 8453: 'base',\n 10: 'optimism',\n 360: 'shape',\n 33139: 'ape_chain',\n};\n\nexport const openseaChain = (chainId: number): string | null => OPENSEA_CHAINS[chainId] ?? null;\n\nfunction explorerTx(chainId: number, hash: Hex | null): string | null {\n if (!hash) return null;\n let base: string | undefined;\n try {\n base = getChain(chainId).blockExplorers?.default.url;\n } catch {\n return null;\n }\n return base ? `${base.replace(/\\/$/, '')}/tx/${hash}` : null;\n}\n\n/** Looks a contract up in CartProvider's openseaCollections, case-insensitively. */\nexport function slugFor(collections: Readonly<Record<string, string>> | undefined, contract: Address): string | null {\n if (!collections) return null;\n const want = getAddress(contract);\n for (const [k, v] of Object.entries(collections)) {\n try {\n if (getAddress(k) === want && v) return v;\n } catch {\n /* not an address: ignore */\n }\n }\n return null;\n}\n\nexport function collectedLinks(args: {\n chainId: number;\n wallet: Address;\n contract: Address;\n txHash: Hex | null;\n tokens: readonly CollectedToken[];\n collections?: Readonly<Record<string, string>>;\n}): CollectedLinks {\n const tx = explorerTx(args.chainId, args.txHash);\n const chain = openseaChain(args.chainId);\n if (!chain) return { tx, profile: null, tokens: [] };\n const wallet = args.wallet.toLowerCase();\n const tokens = args.tokens.map((t) => ({ tokenId: t.tokenId, url: `https://opensea.io/item/${chain}/${t.contract.toLowerCase()}/${t.tokenId}` }));\n const slug = slugFor(args.collections, args.contract);\n const profile = slug\n ? `https://opensea.io/${wallet}/holdings?collectionSlugs=${encodeURIComponent(slug)}`\n : tokens.length === 0\n ? `https://opensea.io/${wallet}`\n : null;\n return { tx, profile, tokens };\n}\n","// useCheckout: the checkout state machine (spec \"Checkout states\", every row of the transition table).\n// The machine's facts live in a ref (`c`); React state is only a published copy of them. confirm() claims its action\n// through a synchronous ref and reaches the wallet with no await and no network call before the request (R13, R14).\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useSyncExternalStore } from 'react';\nimport { formatUnits } from 'viem';\nimport { isRejection } from '../core/errors';\nimport { getAccount } from '../core/wallet';\nimport type { Address, Hex, Money } from '../core/types';\nimport { cartReason, CartError, type CartReasonCode } from './errors';\nimport { useCartInternals } from './react';\nimport {\n assessLine,\n CART_TIMING,\n LineSkipped,\n markCallClosed,\n markCallOpen,\n markNotSent,\n prepareLine,\n sendAddChain,\n sendMint,\n sendSwitch,\n unconfirmedMessage,\n waitMint,\n withRetries,\n type MintReceipt,\n type Prepared,\n type SettleOutcome,\n} from './run';\nimport { itemKey, newId } from './store';\nimport type { CheckoutAction, CheckoutState, CheckoutStateName, CheckoutStep, PendingMint } from './types';\n\nconst nowSec = (): number => Math.floor(Date.now() / 1000);\nconst BUSY: ReadonlySet<CheckoutStateName> = new Set(['preparing', 'ready', 'sending', 'checking', 'paused']);\n\ntype Control = {\n state: CheckoutStateName;\n action: CheckoutAction | null;\n reason: CartReasonCode | null;\n message: string | null;\n steps: CheckoutStep[];\n /** Key of the active step. */\n currentKey: string | null;\n /** Bumped for every entry into preparing, so an older run stops. */\n run: number;\n /** The wallet answered 4902 to a switch: the next action is add-chain. */\n needsAddChain: boolean;\n /** The whole-cart balance is checked once per checkout (and again for a new payer, or when a quantity rises). */\n initialDone: boolean;\n /** Quantity per line at the last whole-cart balance check (D7). A higher quantity since then checks again. */\n assessedQty: Record<string, number>;\n prepared: Prepared | null;\n payer: string | null;\n /** The pending mint a `checking` state waits on. */\n waiting: { id: string; key: string; memHash: Hex | null } | null;\n /** The synchronous claim: set by confirm(), cleared when the action ends. */\n claimed: boolean;\n expiry: ReturnType<typeof setTimeout> | null;\n};\n\nconst fresh = (): Control => ({\n state: 'idle',\n action: null,\n reason: null,\n message: null,\n steps: [],\n currentKey: null,\n run: 0,\n needsAddChain: false,\n initialDone: false,\n assessedQty: {},\n prepared: null,\n payer: null,\n waiting: null,\n claimed: false,\n expiry: null,\n});\n\nconst step = (key: string, patch: Partial<CheckoutStep> = {}): CheckoutStep => ({ key, status: 'pending', reason: null, message: null, txHash: null, ...patch });\n\nexport function useCheckout(): CheckoutState {\n const cart = useCartInternals();\n const { store } = cart;\n const value = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const [, publish] = useReducer((n: number) => n + 1, 0);\n const cRef = useRef<Control>(fresh());\n const c = cRef.current;\n const cartRef = useRef(cart);\n cartRef.current = cart;\n const alive = useRef(true);\n\n useEffect(() => {\n alive.current = true;\n const ctl = cRef.current; // the same object for the hook's whole life: fresh() runs once\n const k = cartRef;\n return () => {\n // Unmount: every state aborts the lifetime signal and leaves the cart value as it is (D25).\n alive.current = false;\n ctl.run += 1;\n if (ctl.expiry) clearTimeout(ctl.expiry);\n k.current.setBusy(false);\n };\n }, []);\n\n const set = useCallback((patch: Partial<Control>): void => {\n const ctl = cRef.current;\n Object.assign(ctl, patch);\n if (ctl.expiry && ctl.state !== 'ready') {\n clearTimeout(ctl.expiry);\n ctl.expiry = null;\n }\n cartRef.current.setBusy(BUSY.has(ctl.state));\n if (alive.current) publish();\n }, []);\n\n const setStep = useCallback(\n (key: string, patch: Partial<CheckoutStep>): void => {\n const ctl = cRef.current;\n ctl.steps = ctl.steps.map((s) => (s.key === key ? { ...s, ...patch } : s));\n },\n [],\n );\n\n // ------------------------------------------------------------ preparing\n\n const startPreparing = useCallback((patch: Partial<Control> = {}): void => {\n const ctl = cRef.current;\n const run = ctl.run + 1;\n set({ state: 'preparing', action: null, reason: null, message: null, prepared: null, claimed: false, run, ...patch });\n void prepare(run);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const prepare = useCallback(async (run: number): Promise<void> => {\n const ctl = cRef.current;\n const live = (): boolean => alive.current && ctl.run === run;\n const k = cartRef.current;\n const blocked = (reason: CartReasonCode, message: string): void => {\n if (live()) set({ state: 'blocked', action: null, reason, message, prepared: null, currentKey: null, claimed: false });\n };\n const idle = (): void => {\n if (live()) set({ ...fresh(), run: ctl.run + 1 });\n };\n try {\n // 1. sessionStorage must accept a test write.\n if (!k.store.persistenceOk()) return blocked('PERSISTENCE_UNAVAILABLE', 'The cart could not save its state in this tab, so nothing was sent.');\n\n // 2. A wallet. A dismissed modal returns to idle.\n let account = getAccount();\n if (!account) {\n const outcome = await k.connect();\n if (!live()) return;\n account = getAccount();\n if (outcome === 'dismissed' || !account) return idle();\n }\n const payer = account.address as Address;\n if (ctl.payer !== null && ctl.payer.toLowerCase() !== payer.toLowerCase()) {\n ctl.initialDone = false;\n }\n ctl.payer = payer;\n\n // 3. Any wallet is accepted, contract wallets included (D30). A wallet that answers with a hash the chain never\n // sees (a Safe safeTxHash) settles through the lost-hash path and is never resent (D15).\n\n // 4. The chain. One request per click: switch, then add, then switch again.\n if (account.chainId !== k.chainId) {\n const action: CheckoutAction = ctl.needsAddChain ? { kind: 'add-chain', chainId: k.chainId } : { kind: 'switch-chain', chainId: k.chainId };\n return set({ state: 'ready', action, reason: null, message: null, claimed: false });\n }\n\n // 5. Every line again, then the balance for the whole cart (R8, D7). Once per checkout, and again whenever a\n // remaining line's quantity rose since the last check (a cart edit while ready or during the check itself).\n const qtyNow = (key: string): number => k.store.getSnapshot().items.find((i) => itemKey(i.config) === key)?.quantity ?? 0;\n const grew = (): boolean =>\n ctl.steps.some((s) => (s.status === 'pending' || s.status === 'active') && qtyNow(s.key) > (ctl.assessedQty[s.key] ?? 0));\n while (!ctl.initialDone || grew()) {\n const ok = await assessAll(run, payer);\n if (!ok || !live()) return;\n ctl.initialDone = true;\n }\n\n // 6. The next pending step.\n for (;;) {\n // An 'active' step is one whose prepared request was dropped (R19: the cart changed, or 30 s passed): build it again.\n const next = ctl.steps.find((s) => s.status === 'pending' || s.status === 'active');\n if (!next) break;\n const item = k.store.getSnapshot().items.find((i) => itemKey(i.config) === next.key);\n if (!item) {\n setStep(next.key, { status: 'skipped', reason: null, message: 'This item left the cart.' });\n continue;\n }\n if (k.store.pendingFor(next.key)) {\n setStep(next.key, { status: 'skipped', reason: null, message: 'A mint for this item is still being confirmed.' });\n continue;\n }\n try {\n const prepared = await withRetries(\n () => k.limiter.run(() => prepareLine(k.env, { config: item.config, quantity: item.quantity, revision: k.store.revision }, payer)),\n CART_TIMING.retryDelaysMs,\n (e) => e instanceof LineSkipped || e instanceof CartError,\n k.getSignal(),\n );\n if (!live()) return;\n setStep(next.key, { status: 'active', reason: null, message: null });\n const action: CheckoutAction = { kind: 'mint', key: prepared.key, amount: prepared.amount };\n ctl.expiry = setTimeout(() => {\n // R19: a prepared request older than 30 seconds is dropped and built again. Reads only.\n if (alive.current && ctl.run === run && ctl.state === 'ready') startPreparing();\n }, CART_TIMING.preparedExpiryMs);\n set({ state: 'ready', action, reason: null, message: null, prepared, currentKey: prepared.key, claimed: false });\n // set() cleared the timer because state was still preparing: arm it after the state changed.\n if (!ctl.expiry) {\n ctl.expiry = setTimeout(() => {\n if (alive.current && ctl.run === run && ctl.state === 'ready') startPreparing();\n }, CART_TIMING.preparedExpiryMs);\n }\n return;\n } catch (e) {\n if (!live()) return;\n if (e instanceof LineSkipped) setStep(next.key, { status: 'skipped', reason: e.reason, message: e.message });\n else {\n const r = cartReason(e);\n setStep(next.key, { status: 'skipped', reason: r.reason, message: r.message });\n }\n publish();\n }\n }\n\n // 7. No pending step left.\n const settled = ctl.steps.some((s) => s.status === 'success' || s.status === 'unconfirmed');\n const first = ctl.steps.find((s) => s.status === 'skipped');\n if (!settled && first) return blocked(first.reason ?? 'RPC_ERROR', first.message ?? 'No item in the cart can be collected right now.');\n if (live()) set({ state: 'done', action: null, reason: null, message: null, prepared: null, currentKey: null, claimed: false });\n } catch (e) {\n if (!live()) return;\n const r = cartReason(e);\n blocked(r.reason, r.message);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /** Re-reads every pending step, skips what cannot mint, and checks the native balance for the whole remaining cart. */\n const assessAll = useCallback(async (run: number, payer: Address): Promise<boolean> => {\n const ctl = cRef.current;\n const k = cartRef.current;\n const live = (): boolean => alive.current && ctl.run === run;\n k.shared.bump();\n const plans: { value: bigint; gas: bigint; symbol: string; decimals: number }[] = [];\n const assessedQty: Record<string, number> = {};\n // 'active' = the step whose prepared request was dropped: it is still to be paid, so it counts.\n for (const s of ctl.steps.filter((x) => x.status === 'pending' || x.status === 'active')) {\n const item = k.store.getSnapshot().items.find((i) => itemKey(i.config) === s.key);\n if (!item) {\n setStep(s.key, { status: 'skipped', message: 'This item left the cart.' });\n continue;\n }\n if (k.store.pendingFor(s.key)) {\n setStep(s.key, { status: 'skipped', message: 'A mint for this item is still being confirmed.' });\n continue;\n }\n try {\n const a = await withRetries(\n () => k.limiter.run(() => assessLine(k.env, { config: item.config, quantity: item.quantity }, payer)),\n CART_TIMING.retryDelaysMs,\n (e) => e instanceof LineSkipped || e instanceof CartError,\n k.getSignal(),\n );\n if (!live()) return false;\n assessedQty[s.key] = item.quantity;\n plans.push({ value: a.plan.mint.value, gas: a.walletRead.gasReserve, symbol: a.drop.unitPrice.symbol, decimals: a.drop.unitPrice.decimals });\n } catch (e) {\n if (!live()) return false;\n if (e instanceof LineSkipped) setStep(s.key, { status: 'skipped', reason: e.reason, message: e.message });\n else {\n const r = cartReason(e);\n setStep(s.key, { status: 'skipped', reason: r.reason, message: r.message });\n }\n }\n }\n if (plans.length > 0) {\n const balance = await withRetries(() => k.limiter.run(() => k.shared.client.getBalance({ address: payer })), CART_TIMING.retryDelaysMs, () => false, k.getSignal());\n if (!live()) return false;\n const need = plans.reduce((n, p) => n + p.value + p.gas, 0n);\n if (balance < need) {\n const p = plans[0]!;\n const short = need - balance;\n set({\n state: 'blocked',\n action: null,\n reason: 'INSUFFICIENT_FUNDS',\n message: `Your balance is ${formatUnits(short, p.decimals)} ${p.symbol} short of this cart (price, fees and gas).`,\n prepared: null,\n currentKey: null,\n claimed: false,\n });\n return false;\n }\n }\n ctl.assessedQty = assessedQty;\n return true;\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ------------------------------------------------------------ outcomes\n\n /** Applies a settle outcome to the steps and the machine. Returns after the state changed. */\n const applyOutcome = useCallback(\n (key: string, id: string, out: SettleOutcome | null, memHash: Hex | null): void => {\n const ctl = cRef.current;\n if (!alive.current) return;\n if (!out) return startPreparing(); // the pending mint is gone already: continue\n switch (out.kind) {\n case 'collected':\n setStep(key, { status: 'success', reason: null, message: out.warning, txHash: out.result.txHash });\n cartRef.current.shared.bump();\n return startPreparing();\n case 'unconfirmed':\n setStep(key, { status: 'unconfirmed', reason: null, message: unconfirmedMessage(out.result.payer), txHash: out.result.txHash });\n cartRef.current.shared.bump();\n return startPreparing();\n case 'not-sent':\n setStep(key, { status: 'pending', reason: null, message: null });\n return startPreparing();\n case 'failed':\n setStep(key, { status: 'failed', reason: 'SIMULATION_REVERTED', message: out.message, txHash: out.hash });\n return set({ state: 'paused', action: null, reason: 'SIMULATION_REVERTED', message: out.message, prepared: null, waiting: null, claimed: false });\n case 'waiting':\n setStep(key, { status: 'unknown', reason: null, message: out.message });\n return set({ state: 'checking', action: null, reason: null, message: out.message, prepared: null, waiting: { id, key, memHash }, claimed: false });\n case 'unavailable':\n setStep(key, { status: 'unknown', reason: out.reason, message: out.message });\n return set({ state: 'checking', action: null, reason: out.reason, message: out.message, prepared: null, waiting: { id, key, memHash }, claimed: false });\n }\n void ctl;\n },\n [set, setStep, startPreparing],\n );\n\n // ------------------------------------------------------------ public actions\n\n const checkout = useCallback((): void => {\n const ctl = cRef.current;\n if (ctl.state !== 'idle') return;\n const k = cartRef.current;\n const items = k.store.getSnapshot().items;\n const steps = items.map((i) => step(itemKey(i.config)));\n k.shared.bump();\n startPreparing({ steps, currentKey: null, needsAddChain: false, initialDone: false, payer: null, waiting: null });\n void steps;\n }, [startPreparing]);\n\n const confirm = useCallback((): void => {\n const ctl = cRef.current;\n // The synchronous claim: a second call in the same tick, or before React commits, finds it taken (R17).\n if (ctl.claimed || ctl.state !== 'ready' || !ctl.action) return;\n ctl.claimed = true;\n const action = ctl.action;\n const k = cartRef.current;\n const run = ctl.run;\n\n // ----- switch or add: one wallet request\n if (action.kind === 'switch-chain' || action.kind === 'add-chain') {\n set({ state: 'sending', claimed: true });\n const request = action.kind === 'switch-chain' ? sendSwitch(action.chainId) : sendAddChain(action.chainId).then(() => ({ needsAdd: false }));\n request.then(\n (r) => {\n if (!alive.current || ctl.run !== run) return;\n if (r.needsAdd) return set({ state: 'ready', action: { kind: 'add-chain', chainId: k.chainId }, needsAddChain: true, claimed: false });\n startPreparing({ needsAddChain: false });\n },\n (e: unknown) => {\n if (!alive.current || ctl.run !== run) return;\n const m = cartReason(e);\n set({ ...fresh(), run: ctl.run + 1, steps: ctl.steps, state: 'idle', reason: 'CHAIN_SWITCH_FAILED', message: m.reason === 'USER_REJECTED' ? 'You rejected the network request.' : m.message });\n },\n );\n return;\n }\n\n // ----- mint\n const prepared = ctl.prepared;\n const item = k.store.getSnapshot().items.find((i) => itemKey(i.config) === action.key);\n if (!prepared || prepared.key !== action.key || !item || item.quantity !== prepared.quantity || k.store.revision !== prepared.revision) {\n // R19: the cart changed since the request was built. Nothing is sent.\n startPreparing();\n return;\n }\n const pending: PendingMint = {\n id: newId(),\n lineKey: prepared.key,\n config: prepared.config,\n payer: prepared.payer,\n recipient: prepared.recipient,\n quantity: prepared.quantity,\n holdings: prepared.holdings,\n hash: null,\n hashAt: null,\n createdAt: nowSec(),\n };\n try {\n // Synchronous setItem plus read-back (R15). false = this line already has a pending mint (another checkout\n // hook sent it): send nothing, and prepare again, which skips the line as still being confirmed.\n if (!k.store.writePending(pending)) {\n startPreparing();\n return;\n }\n } catch (e) {\n const m = cartReason(e);\n set({ state: 'blocked', action: null, reason: m.reason, message: m.message, prepared: null, claimed: false });\n return;\n }\n markCallOpen(pending.id);\n set({ state: 'sending', claimed: true, waiting: { id: pending.id, key: pending.lineKey, memHash: null } });\n\n let memHash: Hex | null = null;\n let hashWriteFailed = false;\n // sendMint's own work before the wallet request is synchronous (R14).\n const sent = sendMint(prepared, {\n onHash: (hash) => {\n memHash = hash;\n try {\n k.store.setHash(pending.id, hash, nowSec());\n } catch {\n hashWriteFailed = true;\n }\n },\n });\n void sent.then(\n async (hash) => {\n markCallClosed(pending.id);\n if (!alive.current || ctl.run !== run) return;\n setStep(pending.lineKey, { txHash: hash });\n if (hashWriteFailed) {\n // The hash stays in memory and check() retries the write.\n setStep(pending.lineKey, { status: 'unknown', message: 'Still confirming' });\n return set({ state: 'checking', action: null, message: 'Still confirming', prepared: null, waiting: { id: pending.id, key: pending.lineKey, memHash }, claimed: false });\n }\n let receipt: MintReceipt | null;\n try {\n receipt = await waitMint(k.env.client, { hash, tokenContract: prepared.config.creatorContract, recipient: prepared.recipient });\n } catch {\n receipt = null; // timeout or an RPC error: the step becomes unknown and the collector presses Check again\n }\n if (!alive.current || ctl.run !== run) return;\n if (!receipt) {\n setStep(pending.lineKey, { status: 'unknown', message: 'Still confirming' });\n return set({ state: 'checking', action: null, message: 'Still confirming', prepared: null, waiting: { id: pending.id, key: pending.lineKey, memHash }, claimed: false });\n }\n const out = await k.settle(pending.id, { receipt, memHash });\n applyOutcome(pending.lineKey, pending.id, out, memHash);\n },\n async (e: unknown) => {\n markCallClosed(pending.id);\n if (!alive.current || ctl.run !== run) return;\n if (e instanceof CartError && e.reason === 'REQUEST_NOT_SENT') {\n markNotSent(pending.id);\n const out = await k.settle(pending.id);\n return applyOutcome(pending.lineKey, pending.id, out, null);\n }\n if (isRejection(e)) {\n // A wallet rejection is a failure, not a lost hash. The pending mint goes at once.\n try {\n k.store.removePending(pending.id);\n } catch {\n /* a failed write leaves the pending mint; the line stays locked until it settles */\n }\n setStep(pending.lineKey, { status: 'failed', reason: 'USER_REJECTED', message: 'You rejected the request.' });\n return set({ state: 'paused', action: null, reason: 'USER_REJECTED', message: 'You rejected the request.', prepared: null, waiting: null, claimed: false });\n }\n // eth_sendTransaction was forwarded and no hash came back: a lost hash (Step 5b).\n const out = await k.settle(pending.id, { memHash });\n applyOutcome(pending.lineKey, pending.id, out, memHash);\n },\n );\n }, [applyOutcome, set, setStep, startPreparing]);\n\n const check = useCallback((): void => {\n const ctl = cRef.current;\n if (ctl.state !== 'checking' || !ctl.waiting || ctl.claimed) return;\n ctl.claimed = true;\n const w = ctl.waiting;\n const k = cartRef.current;\n const run = ctl.run;\n void (async () => {\n // Retry the hash write the first time failed.\n const p = k.store.getSnapshot().pending.find((x) => x.id === w.id);\n if (p && p.hash === null && w.memHash) {\n try {\n k.store.setHash(w.id, w.memHash, nowSec());\n } catch {\n /* settle below still works from memory */\n }\n }\n const out = await k.settle(w.id, { memHash: w.memHash });\n if (!alive.current || ctl.run !== run) return;\n ctl.claimed = false;\n if (out && (out.kind === 'waiting' || out.kind === 'unavailable')) {\n setStep(w.key, { status: 'unknown', reason: out.kind === 'unavailable' ? out.reason : null, message: out.kind === 'waiting' ? 'Still confirming' : out.message });\n return set({ state: 'checking', reason: out.kind === 'unavailable' ? out.reason : null, message: out.kind === 'waiting' ? 'Still confirming' : out.message });\n }\n applyOutcome(w.key, w.id, out, w.memHash);\n })();\n }, [applyOutcome, set, setStep]);\n\n const retry = useCallback((): void => {\n const ctl = cRef.current;\n if (ctl.state !== 'paused' || !ctl.currentKey) return;\n setStep(ctl.currentKey, { status: 'pending', reason: null, message: null, txHash: null });\n startPreparing();\n }, [setStep, startPreparing]);\n\n const skip = useCallback((): void => {\n const ctl = cRef.current;\n if (ctl.state !== 'paused' || !ctl.currentKey) return;\n const s = ctl.steps.find((x) => x.key === ctl.currentKey);\n setStep(ctl.currentKey, { status: 'skipped', reason: s?.reason ?? null, message: s?.message ?? null });\n startPreparing();\n }, [setStep, startPreparing]);\n\n const stop = useCallback((): void => {\n const ctl = cRef.current;\n if (ctl.state !== 'ready' && ctl.state !== 'checking' && ctl.state !== 'paused') return;\n set({ state: 'done', action: null, prepared: null, claimed: false, run: ctl.run + 1 });\n }, [set]);\n\n const reset = useCallback((): void => {\n const ctl = cRef.current;\n if (ctl.state !== 'blocked' && ctl.state !== 'done') return;\n set({ ...fresh(), run: ctl.run + 1 });\n }, [set]);\n\n // ------------------------------------------------------------ reactions: account, chain and cart changes\n\n const accountAddress = cart.account?.address ?? null;\n const accountChain = cart.account?.chainId ?? null;\n const lastAccount = useRef<{ address: string | null; chain: number | null }>({ address: accountAddress, chain: accountChain });\n useEffect(() => {\n const prev = lastAccount.current;\n lastAccount.current = { address: accountAddress, chain: accountChain };\n const ctl = cRef.current;\n if (prev.address === accountAddress && prev.chain === accountChain) return;\n if (ctl.state !== 'preparing' && ctl.state !== 'ready' && ctl.state !== 'paused') return;\n if (accountAddress === null) {\n // Wallet disconnected: steps cleared.\n set({ ...fresh(), run: ctl.run + 1 });\n return;\n }\n if (prev.address !== accountAddress) {\n // Account changed: the prepared request is dropped and lines are re-read for the new payer.\n startPreparing({ initialDone: false, payer: null });\n return;\n }\n // Chain changed.\n if (ctl.state === 'ready') startPreparing();\n }, [accountAddress, accountChain, set, startPreparing]);\n\n // A cart change while ready: the prepared request is cancelled (R19).\n useEffect(() => {\n const ctl = cRef.current;\n if (ctl.state !== 'ready' || !ctl.prepared) return;\n const p = ctl.prepared;\n const item = value.items.find((i) => itemKey(i.config) === p.key);\n if (!item || item.quantity !== p.quantity || store.revision !== p.revision) startPreparing();\n }, [value, store, startPreparing]);\n\n const published = cRef.current;\n return useMemo<CheckoutState>(() => {\n const live = published.steps.filter((s) => s.status !== 'skipped');\n const idx = published.currentKey === null ? -1 : live.findIndex((s) => s.key === published.currentKey);\n return {\n state: published.state,\n action: published.action,\n reason: published.reason,\n message: published.message,\n steps: published.steps.map((s) => ({ ...s })),\n current: idx >= 0 ? idx + 1 : null,\n checkout,\n confirm,\n check,\n retry,\n skip,\n stop,\n reset,\n };\n // `c` is mutated in place; every change goes through set(), which re-renders.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [c.state, c.action, c.reason, c.message, c.steps, c.currentKey, checkout, confirm, check, retry, skip, stop, reset, renderKey(published)]);\n}\n\n/** Changes whenever the control object was published, so the memo above never serves a stale copy. */\nfunction renderKey(ctl: Control): string {\n return `${ctl.run}|${ctl.state}|${ctl.steps.map((s) => s.status).join(',')}|${ctl.message ?? ''}|${ctl.currentKey ?? ''}`;\n}\n\nexport type { Money };\n","// useHoldings (D33): what a wallet holds of each drop, for \"You own N\" on a drop page. Reads the chain directly\n// through the cart's read client: one call per drop after the drop is known, at most maxReadsInFlight at a time.\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getAddress } from 'viem';\nimport type { Address, ManifoldClaimConfig } from '../core/types';\nimport { useCart, useCartInternals } from './react';\nimport { adapter, CART_TIMING, withRetries } from './run';\nimport { canonicalConfig, itemKey } from './store';\n\nexport type Holding = {\n /**\n * owned: tokens of this drop the wallet holds now (ERC-1155).\n * minted: how many it minted from this drop (ERC-721 with a wallet limit).\n * owned-in-contract: tokens it holds on the drop's contract, any drop (other ERC-721). Equals \"owned\" when the\n * contract has only this drop.\n */\n kind: 'owned' | 'minted' | 'owned-in-contract';\n count: number;\n};\n\nexport type HoldingsState = {\n /** The wallet read: opts.wallet, else the connected account. null = no wallet, nothing read. */\n wallet: Address | null;\n /** Keyed like cart lines (itemKey). A drop is missing until its first read finishes; null when it failed. */\n byKey: Record<string, Holding | null>;\n /** Read for one config. undefined while loading or without a wallet. */\n get(config: ManifoldClaimConfig): Holding | null | undefined;\n loading: boolean;\n /** Reads every drop again. */\n refresh(): void;\n};\n\n/**\n * Reads on mount, when the wallet changes, when the config list changes, after each collected mint, and on refresh().\n * No timer. Configs need extension, like cart configs.\n */\nexport function useHoldings(configs: readonly ManifoldClaimConfig[], opts?: { wallet?: Address }): HoldingsState {\n const k = useCartInternals();\n const { collected } = useCart();\n const wallet = useMemo<Address | null>(() => {\n const w = opts?.wallet ?? k.account?.address ?? null;\n return w ? getAddress(w) : null;\n }, [opts?.wallet, k.account?.address]);\n\n const keyed = useMemo(() => {\n const out: { key: string; config: ManifoldClaimConfig }[] = [];\n for (const c of configs) {\n try {\n const config = canonicalConfig(c, k.chainId);\n out.push({ key: itemKey(config), config });\n } catch {\n /* an invalid config gets no entry; add() reports the same config as INVALID_CONFIG */\n }\n }\n return out;\n }, [configs, k.chainId]);\n const listKey = keyed.map((x) => x.key).join('|');\n\n // Results are tagged with the wallet they were read for, so a wallet change shows nothing stale.\n const [read, setRead] = useState<{ wallet: Address | null; byKey: Record<string, Holding | null> }>({ wallet: null, byKey: {} });\n const [tick, setTick] = useState(0);\n const run = useRef(0);\n\n useEffect(() => {\n const id = ++run.current;\n if (!wallet || keyed.length === 0) return;\n // One cancel flag per round (Codex PR #11 review B-F4): a newer round, an unmount of this hook, or of the\n // provider stops this round's remaining RPC calls, not just their results.\n const round = new AbortController();\n const providerSignal = k.getSignal();\n const onProviderAbort = (): void => round.abort();\n providerSignal.addEventListener('abort', onProviderAbort);\n const signal = round.signal;\n const live = () => run.current === id && !signal.aborted;\n void Promise.all(\n keyed.map(async ({ key, config }) => {\n let holding: Holding | null = null;\n try {\n holding = await withRetries(\n () =>\n k.limiter.run(async () => {\n // Checked after the slot is granted, before each call: a cancelled round makes no more calls.\n if (signal.aborted) throw signal.reason;\n const ctx = { ...k.env.ctxFor(key), signal };\n const drop = k.lineData(key)?.drop ?? (await adapter.readDrop(ctx, config));\n if (signal.aborted) throw signal.reason;\n const query = adapter.holdingsQuery?.(drop, 'display') ?? null;\n if (!query || !adapter.readHoldings) return null;\n const n = await adapter.readHoldings(ctx, query, wallet);\n const kind: Holding['kind'] = query.kind === 'balance-1155' ? 'owned' : query.kind === 'total-mints' ? 'minted' : 'owned-in-contract';\n return { kind, count: Number(n) } satisfies Holding;\n }),\n CART_TIMING.retryDelaysMs,\n () => signal.aborted,\n signal,\n );\n } catch {\n holding = null;\n }\n if (live()) setRead((prev) => (prev.wallet === wallet ? { wallet, byKey: { ...prev.byKey, [key]: holding } } : { wallet, byKey: { [key]: holding } }));\n }),\n );\n return () => {\n round.abort();\n providerSignal.removeEventListener('abort', onProviderAbort);\n };\n // listKey stands for keyed; collected.length re-reads after each collected mint.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [wallet, listKey, collected.length, tick, k]);\n\n const byKey = useMemo(() => (wallet && read.wallet === wallet ? read.byKey : {}), [wallet, read]);\n const loading = wallet !== null && keyed.some((x) => !(x.key in byKey));\n\n const get = useCallback(\n (config: ManifoldClaimConfig): Holding | null | undefined => {\n try {\n return byKey[itemKey(canonicalConfig(config, k.chainId))];\n } catch {\n return undefined;\n }\n },\n [byKey, k.chainId],\n );\n const refresh = useCallback(() => setTick((t) => t + 1), []);\n return useMemo(() => ({ wallet, byKey, get, loading, refresh }), [wallet, byKey, get, loading, refresh]);\n}\n","// AddToCartButton: headless button with data-state, like MintButton (spec Public API). No event callback in v1 (D28).\nimport { createElement, useCallback, useState, type ReactNode } from 'react';\nimport type { ManifoldClaimConfig } from '../core/types';\nimport { useCart } from './react';\nimport type { AddResult, CartLine } from './types';\n\nexport type AddToCartState = 'add' | 'adding' | 'in-cart' | 'locked' | 'unconfirmed' | 'sold-out' | 'upcoming' | 'unsupported';\n\nexport type AddToCartButtonProps = {\n config: ManifoldClaimConfig;\n quantity?: number;\n className?: string;\n /** A function child replaces the default markup. It gets the state, the last AddResult and add(opts). */\n children?: ReactNode | ((b: AddToCartRender) => ReactNode);\n};\n\nexport type AddToCartRender = {\n state: AddToCartState;\n /** The last AddResult of this button, or null. 'looks-collected' and 'check-unavailable' ask the site to confirm. */\n result: AddResult | null;\n line: CartLine | null;\n add(opts?: { force?: boolean }): void;\n};\n\nconst LABELS: Record<AddToCartState, string> = {\n add: 'Add to cart',\n adding: 'Adding\\u2026',\n 'in-cart': 'In cart',\n locked: 'Confirming\\u2026',\n unconfirmed: 'Check your wallet',\n 'sold-out': 'Sold out',\n upcoming: 'Not started',\n unsupported: 'Unavailable',\n};\n\nexport function AddToCartButton(props: AddToCartButtonProps): ReactNode {\n const { config, quantity = 1, className, children } = props;\n const cart = useCart();\n const [adding, setAdding] = useState(false);\n const [result, setResult] = useState<AddResult | null>(null);\n\n const inCart = cart.has(config); // synchronous\n const same = (c: ManifoldClaimConfig): boolean => {\n try {\n return c.creatorContract.toLowerCase() === config.creatorContract.toLowerCase() && BigInt(c.instanceId) === BigInt(config.instanceId) && c.extension?.toLowerCase() === config.extension?.toLowerCase();\n } catch {\n return false;\n }\n };\n const line: CartLine | null = inCart ? (cart.lines.find((l) => same(l.config)) ?? null) : null;\n const prior = cart.unconfirmed.some((u) => same(u.config));\n\n let state: AddToCartState = 'add';\n if (adding) state = 'adding';\n else if (line?.state === 'locked') state = 'locked';\n else if (line?.state === 'unsupported') state = 'unsupported';\n else if (inCart) state = line?.state === 'sold-out' ? 'sold-out' : line?.state === 'upcoming' ? 'upcoming' : 'in-cart';\n else if (prior) state = 'unconfirmed';\n\n const add = useCallback(\n (opts?: { force?: boolean }): void => {\n if (adding) return;\n setAdding(true);\n cart.add(config, quantity, opts).then(\n (r) => {\n setResult(r);\n setAdding(false);\n },\n () => {\n setResult(null);\n setAdding(false);\n },\n );\n },\n [adding, cart, config, quantity],\n );\n\n const render: AddToCartRender = { state, result, line, add };\n if (typeof children === 'function') return (children as (b: AddToCartRender) => ReactNode)(render);\n\n const disabled = state === 'adding' || state === 'in-cart' || state === 'locked' || state === 'sold-out' || state === 'upcoming' || state === 'unsupported';\n return createElement(\n 'button',\n {\n type: 'button',\n className,\n 'data-state': state,\n disabled,\n 'aria-busy': state === 'adding' ? true : undefined,\n onClick: () => add(),\n },\n children ?? LABELS[state],\n );\n}\n"],"mappings":"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","names":["formatUnits","formatUnits","result","getAddress","getAddress","useCallback","useEffect","useMemo","useSyncExternalStore","formatUnits","nowSec","useSyncExternalStore","useEffect","useCallback","formatUnits","out","useMemo","useCallback","useEffect","useMemo","useRef","useState","getAddress","useMemo","getAddress","useState","useRef","useEffect","useCallback","createElement","useCallback","useState","useState","useCallback","createElement"]}