@manifoldxyz/dropkit 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/cart.cjs +37 -35
- package/dist/cart.cjs.map +1 -1
- package/dist/cart.js +3 -1
- package/dist/cart.js.map +1 -1
- package/dist/{chunk-SUJQB3SL.js → chunk-MXKJAZDW.js} +39 -2
- package/dist/chunk-MXKJAZDW.js.map +1 -0
- package/dist/{chunk-GO4TR3HB.cjs → chunk-X4P6BUV4.cjs} +39 -2
- package/dist/chunk-X4P6BUV4.cjs.map +1 -0
- package/dist/index.cjs +182 -139
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +50 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-GO4TR3HB.cjs.map +0 -1
- package/dist/chunk-SUJQB3SL.js.map +0 -1
|
@@ -1368,6 +1368,42 @@ function parseMintReceipt(logs, { tokenContract, recipient }) {
|
|
|
1368
1368
|
return [...out].map(([tokenId, amount]) => ({ contract, tokenId, amount }));
|
|
1369
1369
|
}
|
|
1370
1370
|
|
|
1371
|
+
// src/core/mint-record.ts
|
|
1372
|
+
var APPS_API = "https://apps.api.manifoldxyz.dev";
|
|
1373
|
+
var isRecord2 = (v) => typeof v === "object" && v !== null;
|
|
1374
|
+
var appIds = /* @__PURE__ */ new Map();
|
|
1375
|
+
async function loadAppId(fetchFn, instanceId) {
|
|
1376
|
+
const res = await fetchFn(`${APPS_API}/public/instance/data?id=${encodeURIComponent(instanceId)}`, { keepalive: true });
|
|
1377
|
+
if (!res.ok) throw new Error(`instance data HTTP ${res.status}`);
|
|
1378
|
+
const body = await res.json();
|
|
1379
|
+
const appId = isRecord2(body) ? body.appId : void 0;
|
|
1380
|
+
if (typeof appId !== "number" && typeof appId !== "string") throw new Error("instance data has no appId");
|
|
1381
|
+
return String(appId);
|
|
1382
|
+
}
|
|
1383
|
+
function appIdFor(fetchFn, instanceId) {
|
|
1384
|
+
const hit = appIds.get(instanceId);
|
|
1385
|
+
if (hit) return hit;
|
|
1386
|
+
const p = loadAppId(fetchFn, instanceId);
|
|
1387
|
+
appIds.set(instanceId, p);
|
|
1388
|
+
p.catch(() => {
|
|
1389
|
+
if (appIds.get(instanceId) === p) appIds.delete(instanceId);
|
|
1390
|
+
});
|
|
1391
|
+
return p;
|
|
1392
|
+
}
|
|
1393
|
+
function recordClaimMint(args) {
|
|
1394
|
+
const fetchFn = args.fetch ?? ((input, init) => globalThis.fetch(input, init));
|
|
1395
|
+
const send = async () => {
|
|
1396
|
+
let appId = "";
|
|
1397
|
+
try {
|
|
1398
|
+
appId = await appIdFor(fetchFn, args.instanceId);
|
|
1399
|
+
} catch {
|
|
1400
|
+
}
|
|
1401
|
+
const query = new URLSearchParams({ appId, instanceId: args.instanceId, hash: args.hash });
|
|
1402
|
+
await fetchFn(`${APPS_API}/public/instance/tx?${query.toString()}`, { method: "POST", keepalive: true });
|
|
1403
|
+
};
|
|
1404
|
+
return send().catch(() => void 0);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1371
1407
|
export {
|
|
1372
1408
|
friendlyErrorMessage,
|
|
1373
1409
|
UNSUPPORTED_REASONS,
|
|
@@ -1401,6 +1437,7 @@ export {
|
|
|
1401
1437
|
canAct,
|
|
1402
1438
|
findExtension,
|
|
1403
1439
|
manifoldClaimAdapter,
|
|
1404
|
-
parseMintReceipt
|
|
1440
|
+
parseMintReceipt,
|
|
1441
|
+
recordClaimMint
|
|
1405
1442
|
};
|
|
1406
|
-
//# sourceMappingURL=chunk-
|
|
1443
|
+
//# sourceMappingURL=chunk-MXKJAZDW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/friendly-errors.ts","../src/core/errors.ts","../src/core/machine.ts","../src/core/rpc/index.ts","../src/core/wallet/index.ts","../src/core/adapters/manifold-claim/index.ts","../src/core/adapters/manifold-claim/abis.ts","../src/core/adapters/manifold-claim/merkle.ts","../src/core/adapters/receipt.ts","../src/core/mint-record.ts"],"sourcesContent":["import { isMintError } from './errors';\n\nconst GENERIC = 'Transaction failed. Please try again. If it fails again, please contact support.';\nconst REVERTED = 'Transaction reverted';\nconst record = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === 'object' ? value as Record<string, unknown> : undefined;\nconst text = (value: unknown): string => typeof value === 'string' ? value.toLowerCase() : '';\n\ntype Seen = { name: unknown; code: unknown; message: string; cancelled: unknown; replacement: unknown };\n\n// Inspect both common provider envelopes, with identity tracking for cyclic causes.\nfunction collect(error: unknown): Seen[] {\n const pending: unknown[] = [error];\n const seen = new Set<object>();\n const errors: Seen[] = [];\n while (pending.length) {\n const e = record(pending.pop());\n if (!e || seen.has(e)) continue;\n seen.add(e);\n const data = record(e.data);\n errors.push({\n name: e.name, code: e.code, cancelled: e.cancelled, replacement: e.replacement,\n message: [e.message, e.shortMessage, isMintError(e) ? undefined : e.reason, data?.message].map(text).join('\\n'),\n });\n pending.push(e.cause, data?.originalError);\n }\n return errors;\n}\n\nfunction fundsMessage(errors: Seen[]): string | null {\n const hasText = (phrase: string): boolean => errors.some(e => e.message.includes(phrase));\n // Gas-specific funds must win, including when only a nested cause supplies the gas detail.\n if (hasText('insufficient funds for gas')) {\n return 'Your wallet does not have enough funds to pay for gas fees. Please try again with a different wallet or add more funds to your wallet.';\n }\n if (errors.some(e => e.name === 'InsufficientFundsError' || e.code === 'INSUFFICIENT_FUNDS') ||\n hasText('insufficient funds') || hasText('balance too low to proceed')) {\n return 'Your wallet does not have enough funds to complete this transaction. Please try again with a different wallet or add more funds to your wallet.';\n }\n return null;\n}\n\n/** Display text only: never mutate the error or classify its reason/state. Not a public export. */\nexport function friendlyErrorMessage(error: unknown): string {\n if (isMintError(error)) {\n // Only a recognized provider cause is reworded; a funds error without one keeps its own text.\n if (error.reason === 'INSUFFICIENT_FUNDS') return fundsMessage(collect(error.cause)) ?? error.message;\n if (error.reason !== 'RPC_ERROR' && error.reason !== 'SIMULATION_REVERTED') return error.message;\n // Relay's decoded destination revert (\"Invalid amount\", \"ClaimInactive\") is already the useful text.\n if (error.reason === 'SIMULATION_REVERTED' && (error.domain === 'relay' || error.domain === 'tl-stacks')) return error.message;\n // These are hook-owned domain messages, not provider diagnostics or decoded revert text.\n if (error.reason === 'SIMULATION_REVERTED' && (\n error.message === 'The token refused the approval.' ||\n error.message === 'The drop is no longer available for this quantity.'\n )) return error.message;\n }\n\n const errors = collect(error);\n const hasText = (phrase: string): boolean => errors.some(e => e.message.includes(phrase));\n const hasName = (name: string): boolean => errors.some(e => e.name === name);\n const hasCode = (code: string | number): boolean => errors.some(e => e.code === code);\n\n // Wording and precedence ported from client-sdk @7eac330 adapters/{viem,ethers5}-adapter/utils.ts.\n // Existing 4001/ChainMismatch handling remains in toReason, ahead of this formatter.\n if (hasName('UserRejectedRequestError') || hasCode('ACTION_REJECTED') || hasCode(4001) ||\n hasText('user denied transaction signature') || hasText('userrefusedondevice') ||\n hasText('rejected transaction') || hasText('user rejected') ||\n errors.some(e => e.message.includes('cancelled') && !e.cancelled)) {\n return 'Transaction Rejected';\n }\n if (hasCode(4902)) return 'Network not available in wallet';\n const replaced = errors.find(e => e.name === 'TransactionReplacedError' || e.code === 'TRANSACTION_REPLACED');\n if (replaced?.cancelled) return 'Transaction was cancelled';\n if (replaced?.replacement) return 'Transaction was replaced with a new transaction (usually due to speed up)';\n if (hasText('ledger')) return 'Error with Ledger device. Please ensure device is connected and unlocked';\n // Either message field is sufficient evidence; a bare -32002 is not.\n if (errors.some(e => e.code === -32002 && e.message.includes('pending'))) {\n return 'Transaction already pending in wallet. Please check your wallet';\n }\n if (hasText('invalid amount')) return 'Price calculation is incorrect, contact support!';\n const funds = fundsMessage(errors);\n if (funds) return funds;\n if (hasName('NonceTooLowError') || hasName('NonceExhaustedError') || hasText('nonce too low')) {\n return 'Transaction nonce is too low. Please try again';\n }\n if (hasName('FeeCapTooLowError') || hasText('max fee per gas less than block base fee')) {\n return 'Gas price too low for current network conditions. Please try again';\n }\n if (hasName('TimeoutError') || hasCode('TIMEOUT') || hasText('timeout')) {\n return 'Transaction timed out. Your wallet connection is having issues. Disconnect and reconnect your wallet, then please try again';\n }\n if (hasText('network disconnected')) return 'Network connection lost. Please check your internet connection and try again';\n if (hasName('ChainMismatchError') || hasText('wrong network')) return 'Wrong network selected. Please switch to the correct network';\n if (hasText('erc20: transfer amount exceeds balance')) {\n return 'You do not have the required amount of ERC20 tokens to complete this transaction.';\n }\n if (hasName('EstimateGasExecutionError') || hasCode('UNPREDICTABLE_GAS_LIMIT') || hasText('cannot estimate gas')) {\n return 'Unable to estimate gas for transaction. The transaction may fail. Please try again.';\n }\n if (hasName('ContractFunctionExecutionError') || hasCode('CALL_EXCEPTION')) {\n return 'Transaction failed due to contract execution error';\n }\n if (hasName('ContractFunctionRevertedError') || hasName('ExecutionRevertedError') || hasText('revert')) return REVERTED;\n if (hasName('TransactionExecutionError')) return 'Transaction execution failed';\n if (hasCode('NETWORK_ERROR') || hasName('HttpRequestError') || hasText('network')) return 'Network error occurred';\n return isMintError(error) && error.reason === 'SIMULATION_REVERTED' ? REVERTED : GENERIC;\n}\n","import { friendlyErrorMessage } from './friendly-errors';\n\n// Interface contract (orchestrator-owned). Spec: #ui-ux-flow state table.\n\nexport const UNSUPPORTED_REASONS = [\n 'UNKNOWN_EXTENSION',\n 'AMBIGUOUS_EXTENSION',\n 'CLAIM_NOT_FOUND',\n 'DROP_NOT_FOUND',\n 'SIGNATURE_CLAIM',\n 'INVALID_CONFIG',\n 'CONNECT_WIDGET_TOO_OLD',\n] as const;\n\nexport const INELIGIBLE_REASONS = ['NOT_ON_ALLOWLIST', 'ALLOWLIST_USED', 'WALLET_LIMIT', 'SIMULATION_REVERTED'] as const;\n\nexport const ERROR_REASONS = [\n 'USER_REJECTED',\n 'TX_REVERTED',\n 'RATE_LIMITED',\n 'RPC_ERROR',\n 'CHAIN_SWITCH_FAILED',\n 'ALLOWLIST_UNAVAILABLE',\n // Relay cross-chain mint (spec relay-cross-chain-mint #execute-click).\n 'BRIDGE_UNAVAILABLE',\n 'BRIDGE_REFUNDED',\n 'BRIDGE_FAILED',\n 'BRIDGE_TIMEOUT',\n] as const;\n\n/** insufficient-funds carries this reason so data-reason is never empty in that state. */\nexport const FUNDS_REASONS = ['INSUFFICIENT_FUNDS'] as const;\n\nexport type UnsupportedReason = (typeof UNSUPPORTED_REASONS)[number];\nexport type IneligibleReason = (typeof INELIGIBLE_REASONS)[number];\nexport type ErrorReason = (typeof ERROR_REASONS)[number];\nexport type ReasonCode = UnsupportedReason | IneligibleReason | ErrorReason | (typeof FUNDS_REASONS)[number];\n\nexport const REASON_CODES: readonly ReasonCode[] = [\n ...UNSUPPORTED_REASONS,\n ...INELIGIBLE_REASONS,\n ...ERROR_REASONS,\n ...FUNDS_REASONS,\n];\n\n/**\n * Thrown by adapters, rpc and wallet code; the hook maps it to the matching state.\n * `message` is plain English and, for INVALID_CONFIG, names the exact bad field\n * (e.g. `mint.args[1] \"{qty}\" is not a known placeholder`).\n */\nexport class MintError extends Error {\n readonly reason: ReasonCode;\n /** INVALID_CONFIG only: dotted path of the bad field, e.g. \"mint.args[1]\" or \"price\". */\n readonly field?: string;\n /** 'relay' or 'tl-stacks': the message is a decoded destination revert, shown as-is. */\n readonly domain?: 'relay' | 'tl-stacks';\n constructor(reason: ReasonCode, message: string, opts?: { field?: string; cause?: unknown; domain?: 'relay' | 'tl-stacks' }) {\n super(message, opts?.cause === undefined ? undefined : { cause: opts.cause });\n this.name = 'MintError';\n this.reason = reason;\n if (opts?.field !== undefined) this.field = opts.field;\n if (opts?.domain !== undefined) this.domain = opts.domain;\n }\n}\n\nexport function isMintError(e: unknown): e is MintError {\n return e instanceof MintError;\n}\n\nexport function notImplemented(story: string): never {\n throw new Error(`not implemented (${story})`);\n}\n\nexport function isRejection(error: unknown): boolean {\n for (let e = error as { code?: unknown; cause?: unknown } | undefined, depth = 0; e && depth < 8; depth++) {\n if (e.code === 4001) return true;\n e = e.cause as typeof e;\n }\n return false;\n}\n\n/** MintError keeps its reason; a bare wallet rejection becomes USER_REJECTED; anything else is an RPC error. */\nexport function toReason(e: unknown): { reason: ReasonCode; message: string } {\n if (isMintError(e)) return { reason: e.reason, message: friendlyErrorMessage(e) };\n if (isRejection(e)) return { reason: 'USER_REJECTED', message: 'You rejected the request.' };\n for (let cause = e as { name?: string; cause?: unknown } | undefined, depth = 0; cause && depth < 8; depth++) {\n if (cause.name === 'ChainMismatchError') return { reason: 'CHAIN_SWITCH_FAILED', message: 'The wallet network changed before the transaction was sent.' };\n cause = cause.cause as typeof cause;\n }\n return { reason: 'RPC_ERROR', message: friendlyErrorMessage(e) };\n}\n","// Interface contract (orchestrator-owned). Implementation: story s3.\n// Pure reducer, no I/O, no Date.now(): time arrives in events.\nimport { formatUnits } from 'viem';\nimport type { Address, Attempt, DropInfo, MintResult, Money, Route } from './types';\nimport { INELIGIBLE_REASONS } from './errors';\nimport type { ErrorReason, ReasonCode, UnsupportedReason } from './errors';\nimport type { WalletRead } from './adapters/types';\n\nexport const MINT_STATES = [\n 'loading',\n 'unsupported',\n 'upcoming',\n 'ended',\n 'sold-out',\n 'disconnected',\n 'connecting',\n 'live',\n 'ineligible',\n 'insufficient-funds',\n 'switching-chain',\n 'approving',\n 'minting',\n 'confirming',\n 'success',\n 'error',\n] as const;\nexport type MintStateName = (typeof MINT_STATES)[number];\n\n/** States where mint() does something (spec: Clickable column). */\nexport const CLICKABLE_STATES: readonly MintStateName[] = ['disconnected', 'live', 'success', 'error'];\n/** An attempt is in flight; reads/prop changes are deferred (pendingRefresh) until a terminal state. */\nexport const IN_FLIGHT_STATES: readonly MintStateName[] = ['switching-chain', 'approving', 'minting', 'confirming'];\n\n/** uint16 mintCount cap on Manifold extensions; also the global quantity cap. */\nexport const MAX_QUANTITY = 65535;\n\nexport type Account = { address: Address; chainId: number };\n\n/** The wallet's chain cannot cover the Relay quote (spec R3). */\nexport type PayShort = { chainId: number; symbol: string; name: string };\n\nexport type MachineState = {\n name: MintStateName;\n reason: ReasonCode | null;\n /** Plain-English text for reason (decoded revert for SIMULATION_REVERTED / TX_REVERTED). */\n message: string | null;\n /** Generation of the current drop read; DROP_* events with another gen are ignored. */\n readGen: number;\n /** Generation of the current wallet read; bumped by ACCOUNT_CHANGED. WALLET_* with another gen are ignored. */\n walletGen: number;\n drop: DropInfo | null;\n account: Account | null;\n walletRead: WalletRead | null;\n /**\n * Set by ATTEMPT_FAILED for ineligible / insufficient-funds reasons. Sticky: survives drop refreshes and is\n * cleared by the next WALLET_LOADED, ACCOUNT_CHANGED, config LOAD or RESET.\n */\n blocked: Derived | null;\n quantity: number;\n attempt: Attempt | null;\n result: MintResult | null;\n /** Set when a read/account/quantity change arrived during an in-flight attempt. */\n pendingRefresh: boolean;\n /** Monotonic Unix seconds: the maximum accepted DROP_LOADED / TICK time. */\n now: number;\n /** Relay may mint this drop for this wallet (set by WALLET_LOADED). */\n crossChain: boolean;\n /** A Relay route read for the current walletGen is in flight: show loading, not insufficient-funds. */\n routePending: boolean;\n /** How the current wallet pays. null = no route read (direct by default). */\n route: Route | null;\n /** Set when the wallet's chain cannot cover the Relay quote. */\n short: PayShort | null;\n};\n\nexport type MachineEvent =\n /**\n * Sets readGen = gen. kind 'refresh' (30s timer, visibilitychange): keeps the known drop on screen.\n * kind 'config' (mount, config/recipient change): clears drop + walletRead, bumps walletGen, shows 'loading'.\n */\n | { type: 'LOAD'; gen: number; kind: 'config' | 'refresh' }\n | { type: 'DROP_LOADED'; gen: number; drop: DropInfo; now: number }\n | { type: 'DROP_UNSUPPORTED'; gen: number; reason: UnsupportedReason; message: string }\n | { type: 'READ_FAILED'; gen: number; reason: ErrorReason; message: string }\n /** Wallet connected / switched account / switched chain / disconnected (null). Bumps walletGen. */\n | { type: 'ACCOUNT_CHANGED'; account: Account | null }\n /**\n * crossChain: Relay may mint this drop. routePending: a ROUTE_LOADED for this walletGen will follow\n * (the wallet is on another pay chain), so the drop-chain funds check must wait for it.\n */\n | { type: 'WALLET_LOADED'; gen: number; read: WalletRead; crossChain?: boolean; routePending?: boolean }\n /** Result of the Relay route read for walletGen `gen`. Stale gens are ignored. */\n | { type: 'ROUTE_LOADED'; gen: number; route: Route | null; short: PayShort | null }\n | { type: 'WALLET_FAILED'; gen: number; reason: ErrorReason; message: string }\n | { type: 'CONNECT_STARTED' }\n | { type: 'CONNECT_DISMISSED' }\n | { type: 'TICK'; now: number }\n | { type: 'SET_QUANTITY'; quantity: number }\n /** resume: re-attach to a paid Relay request (spec R12); accepted from any idle state. */\n | { type: 'ATTEMPT_STARTED'; attempt: Attempt; resume?: boolean }\n | { type: 'SWITCHING_CHAIN'; attemptId: number }\n | { type: 'APPROVING'; attemptId: number }\n | { type: 'MINT_PROMPTED'; attemptId: number }\n | { type: 'TX_SUBMITTED'; attemptId: number }\n | { type: 'ATTEMPT_SUCCEEDED'; attemptId: number; result: MintResult }\n | { type: 'ATTEMPT_FAILED'; attemptId: number; reason: ReasonCode; message: string }\n /**\n * Click in success/error: clears result/error/walletRead, sets readGen = gen, bumps walletGen and\n * re-derives; with an account it shows 'loading' until the fresh WALLET_LOADED (AC-15).\n */\n | { type: 'RESET'; gen: number };\n\nexport function initialState(opts?: { quantity?: number }): MachineState {\n return {\n name: 'loading',\n reason: null,\n message: null,\n readGen: 0,\n walletGen: 0,\n drop: null,\n account: null,\n walletRead: null,\n blocked: null,\n quantity: toQuantity(opts?.quantity ?? 1, MAX_QUANTITY),\n attempt: null,\n result: null,\n pendingRefresh: false,\n now: 0,\n crossChain: false,\n routePending: false,\n route: null,\n short: null,\n };\n}\n\nconst NO_ROUTE = { crossChain: false, routePending: false, route: null, short: null } as const;\nconst PICK_ANOTHER = 'Pick another network to pay from.';\n\n/** Floor, then clamp to [1, max]. NaN becomes 1. */\nfunction toQuantity(q: number, max: number): number {\n if (Number.isNaN(q)) return 1;\n return Math.max(1, Math.min(Math.floor(q), max));\n}\n\n/** An attempt is in flight from ATTEMPT_STARTED until success/error, including the 'live' gap before the first step. */\nfunction isInFlight(s: MachineState): boolean {\n return s.attempt !== null || IN_FLIGHT_STATES.includes(s.name);\n}\n\n/** Names that are re-derived from data on every change (rule 2). */\nfunction isIdle(s: MachineState): boolean {\n return !isInFlight(s) && s.name !== 'connecting' && s.name !== 'success' && s.name !== 'error';\n}\n\ntype Derived = Pick<MachineState, 'name' | 'reason' | 'message'>;\n\nfunction derive(s: MachineState, unsupported: boolean): Derived {\n const named = (name: MintStateName): Derived => ({ name, reason: null, message: null });\n const { drop, walletRead } = s;\n if (unsupported) return { name: 'unsupported', reason: s.reason, message: s.message };\n if (drop === null) return named('loading');\n if (drop.endTime !== null && drop.endTime <= s.now) return named('ended');\n if (drop.maxSupply !== null && drop.maxSupply > 0n && drop.totalMinted >= drop.maxSupply) return named('sold-out');\n if (drop.startTime !== null && drop.startTime > s.now) return named('upcoming');\n if (s.account === null) return named('disconnected');\n if (walletRead === null) return named('loading');\n if (s.blocked !== null) return s.blocked;\n if (walletRead.ineligible !== null) {\n return { name: 'ineligible', reason: walletRead.ineligible.reason, message: walletRead.ineligible.message };\n }\n // Relay route (spec #machine-changes): pending -> loading, relay -> live, short wallet chain -> insufficient-funds.\n if (s.routePending) return named('loading');\n if (s.route?.kind === 'relay') return named('live');\n if (s.short !== null) {\n return { name: 'insufficient-funds', reason: 'INSUFFICIENT_FUNDS', message: `Not enough ${s.short.symbol} on ${s.short.name}. ${PICK_ANOTHER}` };\n }\n const total = selectTotal(s);\n if (total !== null) {\n const { native, erc20 } = total;\n if (native.value + walletRead.gasReserve > walletRead.balances.native) {\n const more = s.crossChain ? ` ${PICK_ANOTHER}` : '';\n return { name: 'insufficient-funds', reason: 'INSUFFICIENT_FUNDS', message: `Not enough ${native.symbol} to cover the mint.${more}` };\n }\n // A null ERC20 balance means the adapter could not read it; the simulation catches a real shortfall.\n if (erc20 !== null && walletRead.balances.erc20 !== null && erc20.value > walletRead.balances.erc20) {\n return { name: 'insufficient-funds', reason: 'INSUFFICIENT_FUNDS', message: `Not enough ${erc20.symbol} to cover the mint.` };\n }\n }\n return named('live');\n}\n\n/** Re-derive the name when idle; otherwise keep it. `unsupported` stays sticky until a new read result replaces it. */\nfunction settle(s: MachineState, unsupported = s.name === 'unsupported'): MachineState {\n if (!isIdle(s)) return s;\n return { ...s, ...derive(s, unsupported) };\n}\n\n/** Shrink quantity when new data lowers the cap. Never raises it. */\nfunction clampQuantity(s: MachineState): MachineState {\n const quantity = toQuantity(s.quantity, selectMaxQuantity(s) ?? MAX_QUANTITY);\n return quantity === s.quantity ? s : { ...s, quantity };\n}\n\n/**\n * Rules (all are tested):\n * 1. Stale results: DROP_LOADED / DROP_UNSUPPORTED / READ_FAILED with gen !== readGen, WALLET_LOADED /\n * WALLET_FAILED with gen !== walletGen, and attempt events whose attemptId !== attempt?.attemptId\n * return the SAME state object (reference-equal).\n * 2. Derivation when idle (no attempt, not connecting/success/error), in priority order:\n * unsupported (DROP_UNSUPPORTED) > loading (no drop) > ended (endTime !== null && endTime <= now)\n * > sold-out (maxSupply !== null && maxSupply > 0n && totalMinted >= maxSupply)\n * > upcoming (startTime !== null && startTime > now) > disconnected (account null)\n * > loading (account set, no walletRead for the current walletGen)\n * > ineligible (walletRead.ineligible) > insufficient-funds (selectTotal vs walletRead.balances,\n * native leg includes walletRead.gasReserve) > live.\n * Wrong chain is NOT a derived state: live stays live; switching happens on click.\n * 3. TICK only changes time and time never goes backward (now = max(now, event.now)); it can flip\n * upcoming -> live/disconnected and live -> ended, never ended -> anything.\n * 4. CONNECT_STARTED from disconnected -> connecting. CONNECT_DISMISSED from connecting -> derived\n * (disconnected). ACCOUNT_CHANGED with an account while connecting -> derived (loading until WALLET_LOADED).\n * 5. ATTEMPT_STARTED is accepted only from live. The attempt is frozen; name stays 'live' until the\n * first step event (SWITCHING_CHAIN -> switching-chain, APPROVING -> approving,\n * MINT_PROMPTED -> minting, TX_SUBMITTED -> confirming). Steps only move forward in that order\n * (skips allowed); a duplicate or backward step returns the SAME state object.\n * 6. During IN_FLIGHT_STATES: LOAD, ACCOUNT_CHANGED, SET_QUANTITY, TICK, DROP_LOADED and WALLET_LOADED\n * do not change name/attempt; they store data where applicable and set pendingRefresh = true\n * (TICK only updates now). ACCOUNT_CHANGED still bumps walletGen.\n * 7. ATTEMPT_SUCCEEDED -> success with result. ATTEMPT_FAILED maps by reason category:\n * INELIGIBLE_REASONS -> ineligible, INSUFFICIENT_FUNDS -> insufficient-funds (both stored in `blocked`,\n * sticky until the next WALLET_LOADED / ACCOUNT_CHANGED / config LOAD / RESET, and not clickable),\n * ERROR_REASONS -> error. All clear attempt. In success/error, reads still update data but name\n * stays until RESET. Every success and every submitted error clears the drop and invalidates its\n * read generation, so RESET cannot become live until a post-terminal DROP_LOADED and a fresh\n * WALLET_LOADED arrive.\n * 8. SET_QUANTITY clamps to [1, selectMaxQuantity(state) ?? MAX_QUANTITY]; non-integers floor.\n * 9. READ_FAILED (current gen) when idle -> error with reason/message.\n */\nexport function reducer(state: MachineState, event: MachineEvent): MachineState {\n const inFlight = isInFlight(state);\n // A failed read/wallet result: error when idle or connecting, deferred in flight, ignored in success/error.\n const failed = (reason: ErrorReason, message: string): MachineState => {\n if (inFlight) return { ...state, pendingRefresh: true };\n if (state.name === 'success' || state.name === 'error') return state;\n return { ...state, name: 'error', reason, message };\n };\n\n switch (event.type) {\n case 'LOAD': {\n if (event.kind === 'refresh') {\n const next = { ...state, readGen: event.gen };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next);\n }\n // A config change is a read boundary: nothing from the previous drop or wallet may stay actionable.\n const next = { ...state, ...NO_ROUTE, readGen: event.gen, drop: null, walletRead: null, blocked: null, walletGen: state.walletGen + 1 };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next, false);\n }\n case 'DROP_LOADED': {\n if (event.gen !== state.readGen) return state;\n let next = { ...state, drop: event.drop, now: Math.max(state.now, event.now) };\n // A drop that sets walletKey (tl-stacks) says which wallet reads still describe it. A changed key drops the\n // read and bumps the generation, so a read started for the old stage is ignored. Other drops never set it.\n const oldKey = state.drop?.walletKey;\n const newKey = event.drop.walletKey;\n if (oldKey !== undefined && newKey !== undefined && oldKey !== newKey) {\n next = { ...next, walletRead: null, walletGen: state.walletGen + 1 };\n }\n if (inFlight) return { ...next, pendingRefresh: true };\n return isIdle(next) ? settle(clampQuantity(next), false) : clampQuantity(next);\n }\n case 'DROP_UNSUPPORTED': {\n if (event.gen !== state.readGen) return state;\n if (inFlight) return { ...state, pendingRefresh: true };\n if (state.name === 'success' || state.name === 'error') return state;\n return { ...state, name: 'unsupported', reason: event.reason, message: event.message };\n }\n case 'READ_FAILED':\n return event.gen !== state.readGen ? state : failed(event.reason, event.message);\n case 'ACCOUNT_CHANGED': {\n const next = { ...state, ...NO_ROUTE, account: event.account, walletRead: null, blocked: null, walletGen: state.walletGen + 1 };\n if (inFlight) return { ...next, pendingRefresh: true };\n // Connecting only ends when an account arrives; a null account keeps the connect UI open.\n if (state.name === 'connecting') return event.account === null ? next : settle({ ...next, name: 'loading' }, false);\n return settle(next);\n }\n case 'WALLET_LOADED': {\n if (event.gen !== state.walletGen) return state;\n // A refresh keeps the last route on screen until the new ROUTE_LOADED replaces it.\n const route = event.routePending\n ? { routePending: state.route === null && state.short === null, route: state.route, short: state.short }\n : { routePending: false, route: null, short: null };\n const next = { ...state, ...route, crossChain: event.crossChain ?? false, walletRead: event.read, blocked: null };\n return inFlight ? { ...next, pendingRefresh: true } : settle(clampQuantity(next));\n }\n case 'ROUTE_LOADED': {\n if (event.gen !== state.walletGen) return state;\n const next = { ...state, routePending: false, route: event.route, short: event.short };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next);\n }\n case 'WALLET_FAILED':\n return event.gen !== state.walletGen ? state : failed(event.reason, event.message);\n case 'CONNECT_STARTED':\n return state.name === 'disconnected' && state.attempt === null\n ? { ...state, name: 'connecting', reason: null, message: null }\n : state;\n case 'CONNECT_DISMISSED':\n return state.name === 'connecting' ? settle({ ...state, name: 'disconnected' }, false) : state;\n case 'TICK':\n return settle({ ...state, now: Math.max(state.now, event.now) });\n case 'SET_QUANTITY': {\n const next = { ...state, quantity: toQuantity(event.quantity, selectMaxQuantity(state) ?? MAX_QUANTITY) };\n return inFlight ? { ...next, pendingRefresh: true } : settle(next);\n }\n case 'ATTEMPT_STARTED':\n if (state.attempt !== null) return state;\n // A resume re-attaches to a deposit that already left the wallet, so it may start from any idle state.\n if (event.resume === true) return IN_FLIGHT_STATES.includes(state.name) ? state : { ...state, attempt: event.attempt };\n return state.name === 'live' ? { ...state, attempt: event.attempt } : state;\n case 'SWITCHING_CHAIN':\n return step(state, event.attemptId, 'switching-chain');\n case 'APPROVING':\n return step(state, event.attemptId, 'approving');\n case 'MINT_PROMPTED':\n return step(state, event.attemptId, 'minting');\n case 'TX_SUBMITTED':\n return step(state, event.attemptId, 'confirming');\n case 'ATTEMPT_SUCCEEDED':\n return state.attempt?.attemptId === event.attemptId\n ? { ...state, name: 'success', reason: null, message: null, attempt: null, result: event.result,\n drop: null, readGen: state.readGen + 1 }\n : state;\n case 'ATTEMPT_FAILED': {\n if (state.attempt?.attemptId !== event.attemptId) return state;\n const { reason, message } = event;\n const done = { ...state, reason, message, attempt: null, result: null };\n if ((INELIGIBLE_REASONS as readonly string[]).includes(reason)) {\n return { ...done, name: 'ineligible', blocked: { name: 'ineligible', reason, message } };\n }\n if (reason === 'INSUFFICIENT_FUNDS') {\n return { ...done, name: 'insufficient-funds', blocked: { name: 'insufficient-funds', reason, message } };\n }\n // Reads before the receipt cannot establish post-transaction freshness.\n return { ...done, name: 'error', drop: state.name === 'confirming' ? null : state.drop,\n readGen: state.name === 'confirming' ? state.readGen + 1 : state.readGen };\n }\n case 'RESET': {\n if (state.name !== 'success' && state.name !== 'error') return state;\n // The wallet data is stale after an attempt: re-read it before the button can be live again (AC-15).\n const next = {\n ...state,\n readGen: event.gen,\n ...NO_ROUTE,\n walletRead: null,\n blocked: null,\n walletGen: state.walletGen + 1,\n result: null,\n pendingRefresh: false,\n };\n // Leave the terminal name so settle() treats the state as idle.\n return settle(clampQuantity({ ...next, name: 'loading' }), false);\n }\n }\n}\n\n/** Attempt steps in lifecycle order; the pre-step 'live' gap ranks below all of them. */\nconst STEP_ORDER: readonly MintStateName[] = ['switching-chain', 'approving', 'minting', 'confirming'];\n\nfunction step(state: MachineState, attemptId: number, name: MintStateName): MachineState {\n if (state.attempt?.attemptId !== attemptId) return state;\n if (STEP_ORDER.indexOf(name) <= STEP_ORDER.indexOf(state.name)) return state;\n return { ...state, name, reason: null, message: null };\n}\n\n/**\n * min(remaining supply, branch limit, MAX_QUANTITY). Remaining supply = maxSupply - totalMinted when\n * maxSupply is a positive bigint. Branch limit = walletRead.maxQuantity when not null.\n * null only when no drop is loaded.\n */\nexport function selectMaxQuantity(state: MachineState): number | null {\n const { drop, walletRead } = state;\n if (drop === null) return null;\n let max = MAX_QUANTITY;\n if (drop.maxSupply !== null && drop.maxSupply > 0n) {\n const remaining = drop.maxSupply - drop.totalMinted;\n if (remaining < BigInt(max)) max = remaining > 0n ? Number(remaining) : 0;\n }\n if (walletRead !== null && walletRead.maxQuantity !== null) {\n max = Math.min(max, Math.max(0, Math.floor(walletRead.maxQuantity)));\n }\n return max;\n}\n\n/**\n * Totals for state.quantity, fee included.\n * native price: native = (unitPrice + unitFee) * q (pricePer 'total': unitPrice + unitFee * q).\n * ERC20 price: native = unitFee * q, erc20 = unitPrice * q (or unitPrice when pricePer 'total').\n * null when no drop. Money.formatted uses viem formatUnits.\n */\nexport function selectTotal(state: MachineState): { native: Money; erc20: Money | null } | null {\n const { drop } = state;\n if (drop === null) return null;\n const q = BigInt(state.quantity);\n const price = drop.unitPrice;\n const fee = drop.unitFee;\n const priceTotal = drop.pricePer === 'total' ? price.value : price.value * q;\n if (drop.paymentToken !== null) {\n return {\n native: money(fee.value * q, fee),\n erc20: money(priceTotal, price),\n };\n }\n // pricePer 'total': the fee is still per unit.\n return { native: money(priceTotal + fee.value * q, price), erc20: null };\n}\n\nfunction money(value: bigint, like: Money): Money {\n return { value, decimals: like.decimals, symbol: like.symbol, formatted: formatUnits(value, like.decimals) };\n}\n\nexport function canAct(state: MachineState): boolean {\n return state.attempt === null && CLICKABLE_STATES.includes(state.name);\n}\n","// Interface contract (orchestrator-owned). Implementation: story s4. Spec D7 + #api-endpoints.\nimport { createPublicClient, http, type Chain, type EIP1193RequestFn, type PublicClient, type Transport } from 'viem';\nimport { apeChain, base, baseSepolia, mainnet, optimism, sepolia, shape } from 'viem/chains';\nimport type { RpcUrls } from '../types';\nimport { MintError } from '../errors';\n\n/** Manifold read bridge per chain (allowlisted contracts + methods only; no receipts). */\nexport const BRIDGE_URLS: Readonly<Record<number, string>> = {\n 1: 'https://bridge.manifoldxyz.dev/rpc',\n 11155111: 'https://sepolia.bridge.manifoldxyz.dev/rpc',\n 8453: 'https://base.bridge.manifoldxyz.dev/rpc',\n 10: 'https://optimism.bridge.manifoldxyz.dev/rpc',\n 360: 'https://shape.bridge.manifoldxyz.dev/rpc',\n 33139: 'https://apechain.bridge.manifoldxyz.dev/rpc',\n};\n\nconst CHAINS: Readonly<Record<number, Chain>> = {\n [mainnet.id]: mainnet,\n [sepolia.id]: sepolia,\n [base.id]: base,\n [optimism.id]: optimism,\n [shape.id]: shape,\n [apeChain.id]: apeChain,\n // Relay pay chain for Sepolia drops only: never a drop chain, no Manifold bridge.\n [baseSepolia.id]: baseSepolia,\n};\n\nconst CHAIN_NAMES: Readonly<Record<number, string>> = {\n 1: 'Ethereum',\n 8453: 'Base',\n 10: 'Optimism',\n 360: 'Shape',\n 33139: 'ApeChain',\n 11155111: 'Sepolia',\n 84532: 'Base Sepolia',\n};\n\n/** Short display name for a chain (\"Base\", \"Optimism\"); falls back to viem's name or the id. */\nexport function chainName(chainId: number): string {\n return CHAIN_NAMES[chainId] ?? CHAINS[chainId]?.name ?? `chain ${String(chainId)}`;\n}\n\n/** Per-transport request timeout; a slow endpoint falls through to the next one. */\nconst TRANSPORT_TIMEOUT_MS = 8_000;\n\n/** viem chain for an id; throws MintError('INVALID_CONFIG', ..., { field: 'chainId' }) when unknown. */\nexport function getChain(chainId: number): Chain {\n const chain = CHAINS[chainId];\n if (!chain) {\n throw new MintError('INVALID_CONFIG', `chainId ${String(chainId)} is not supported`, { field: 'chainId' });\n }\n return chain;\n}\n\n/** Codes reserved for request/user failures remain final, even under an internal-error wrapper. */\nconst TERMINAL_CODES: ReadonlySet<number> = new Set([3, -32602, -32003, 4001, 4100, 4200, 4900, 4901, 4902]);\n/** Endpoint/routing errors can be answered by another server, unless they also carry execution evidence. */\nconst FALLBACK_CODES: ReadonlySet<number> = new Set([-32700, -32600, -32601, -32001, -32002, -32004, -32005, 429]);\nconst EXECUTION_WORDING = /execution reverted|execution error|\\breverted?\\b|out of gas|invalid opcode|insufficient funds|nonce too low|gas required exceeds/i;\nconst UPSTREAM_WORDING = /\\btimeout\\b|\\btimed out\\b|\\btoo many requests\\b|\\brate limit\\b|\\brequest limit reached\\b|\\b(?:exceeded.*capacity|capacity.*exceeded)\\b|\\bheader not found\\b|\\binternal (?:json-rpc )?(?:server )?error\\b|\\bnon-200 status code:\\s*['\"]?503\\b/i;\nconst TRANSPORT_ERROR_NAMES: ReadonlySet<string> = new Set(['HttpRequestError', 'TimeoutError', 'SocketClosedError', 'WebSocketRequestError']);\n\n/** Inspect nested provider payloads without mistaking a diagnostic request id for EVM return data. */\nfunction carriesExecutionEvidence(value: unknown, seen = new Set<object>()): boolean {\n if (typeof value === 'string') return /^(?:Reverted\\s+)?0x(?:[a-f\\d]{2})*$/i.test(value) || EXECUTION_WORDING.test(value);\n if (!value || typeof value !== 'object' || seen.has(value)) return false;\n seen.add(value);\n const e = value as Record<string, unknown>;\n if (typeof e.code === 'number' && TERMINAL_CODES.has(e.code)) return true;\n if (typeof e.message === 'string' && EXECUTION_WORDING.test(e.message)) return true;\n return ['data', 'error', 'originalError', 'cause', 'result'].some((key) => carriesExecutionEvidence(e[key], seen));\n}\n\n/** Execution evidence anywhere in the ancestry wins. Unknown failures are final, not blanket retries. */\nfunction shouldFallback(err: unknown): boolean {\n let retry = false;\n const seen = new Set<object>();\n for (let e = err; e && typeof e === 'object' && !seen.has(e); ) {\n seen.add(e);\n const error = e as Record<string, unknown>;\n // viem's message embeds request metadata. Prefer provider details to avoid matching request content.\n const message = typeof error.details === 'string' ? error.details : typeof error.shortMessage !== 'string' ? error.message : '';\n if (typeof message === 'string' && EXECUTION_WORDING.test(message)) return false;\n if (carriesExecutionEvidence(error.data)) return false;\n if (typeof error.code === 'number' && TERMINAL_CODES.has(error.code)) return false;\n if (error.name === 'ContractFunctionRevertedError' || error.name === 'ExecutionRevertedError') return false;\n if (typeof error.name === 'string' && TRANSPORT_ERROR_NAMES.has(error.name)) retry = true;\n if (typeof error.code === 'number' && FALLBACK_CODES.has(error.code)) retry = true;\n if (typeof message === 'string' && UPSTREAM_WORDING.test(message)) retry = true;\n e = error.cause;\n }\n return retry;\n}\n\n/**\n * Read client with ordered fallback: rpcUrls[chainId] -> BRIDGE_URLS[chainId] (only when useBridge) ->\n * the chain's default public RPC. A request that fails for a reason that belongs to the endpoint (HTTP error,\n * timeout, rate limit, -32004 Not allowed, recognized internal/server-error or relayed 503 wording,\n * \"header not found\", -32099 capacity) is retried on\n * the next; when all fail it throws MintError('RPC_ERROR') and logs a console hint to pass rpcUrls.\n * Execution results (reverts, identified by revert data or revert wording, and request/user-determined codes)\n * are NOT retried: they surface as-is. See shouldFallback.\n */\nexport function createReadClient(opts: { chainId: number; rpcUrls?: RpcUrls; useBridge: boolean }): PublicClient {\n const chain = getChain(opts.chainId);\n const urls = [opts.rpcUrls?.[opts.chainId], opts.useBridge ? BRIDGE_URLS[opts.chainId] : undefined, chain.rpcUrls.default.http[0]].filter(\n (u, i, all): u is string => !!u && all.indexOf(u) === i,\n );\n\n // Own Transport (not viem's fallback): viem wraps every transport error that is not a viem BaseError,\n // which would hide the MintError('RPC_ERROR') this contract requires.\n const transport: Transport = ({ chain: c, pollingInterval }) => {\n const transports = urls.map((url) => http(url, { timeout: TRANSPORT_TIMEOUT_MS, retryCount: 0 })({ chain: c, pollingInterval, retryCount: 0, timeout: TRANSPORT_TIMEOUT_MS }));\n const request = (async (args: { method: string; params?: unknown }) => {\n let last: unknown;\n for (const t of transports) {\n try {\n return await t.request(args);\n } catch (err) {\n if (!shouldFallback(err)) throw err;\n last = err;\n }\n }\n console.warn(`dropkit: all RPC endpoints failed for chain ${String(opts.chainId)}; pass rpcUrls={{ ${String(opts.chainId)}: '<your RPC url>' }} to <MintButton>.`);\n throw new MintError('RPC_ERROR', `All RPC endpoints failed for chain ${String(opts.chainId)}`, { cause: last });\n }) as EIP1193RequestFn;\n return {\n config: { key: 'dropkit-fallback', name: 'Dropkit fallback', request, retryCount: 0, retryDelay: 0, timeout: TRANSPORT_TIMEOUT_MS, type: 'fallback' },\n request,\n value: {},\n };\n };\n\n return createPublicClient({ chain, transport }) as PublicClient;\n}\n","// Interface contract (orchestrator-owned). Implementation: story s4. Spec #state-management\n// \"Connect widget lifecycle\" + Q20 (no getProvider; use ManifoldEthereumProvider).\nimport { createWalletClient, custom, getAddress, publicActions, type Address, type EIP1193Provider, type Hex, type WalletClient } from 'viem';\nimport type { Account } from '../machine';\nimport { MintError } from '../errors';\nimport { getChain } from '../rpc';\n\nexport const CONNECT_WIDGET_VERSION = '6.5.0';\nexport const CONNECT_BASE_URL = `https://connect.manifoldxyz.dev/${CONNECT_WIDGET_VERSION}`;\nexport const CONNECT_ID = 'mint-button';\n/** Event names copied from @manifoldxyz/frontend-provider-types (not imported). */\nexport const ADDRESS_CHANGED = 'ethereum-address-changed';\nexport const CHAIN_CHANGED = 'frontend-provider-chain-changed';\nexport const LOADER_KEY = '__manifoldMintConnectLoader';\n/** Manifold's WalletConnect project id, used when no caller passes one so the WalletConnect option always shows. */\nexport const DEFAULT_WALLETCONNECT_PROJECT_ID = 'a03ac1695f309dc8d756e7b4006e5e7d';\n\nexport type ConnectOptions = { chainIds: number[]; walletConnectProjectId?: string };\n\ntype ConnectGlobal = { version?: string; capabilities?: string[]; ready?: Promise<unknown> };\ntype EthProviderGlobal = {\n selectedAddress?: () => string | undefined;\n chainId?: () => number | undefined;\n provider?: (withSigner?: boolean) => { provider?: EIP1193Provider } | undefined;\n browserChainId?: () => number | undefined;\n browserProvider?: () => { provider?: EIP1193Provider } | undefined;\n};\nconst STATE_KEY = '__manifoldMintConnectStateV1';\ntype LoadState = { promise: Promise<void>; networks: number[]; projectId?: string; div?: HTMLElement; nodes: Node[] };\ntype PageState = { load?: LoadState; pendingModal?: Promise<'connected' | 'dismissed'> };\ntype Win = Window & { [LOADER_KEY]?: Promise<void>; [STATE_KEY]?: PageState; ManifoldConnect?: ConnectGlobal; ManifoldEthereumProvider?: EthProviderGlobal };\nconst win = () => window as unknown as Win;\n// Lazily accessed so importing this module never reads window during SSR.\nconst pageState = (): PageState => (win()[STATE_KEY] ??= {});\n\nconst TOO_OLD = 'A Manifold connect widget older than 6.4.0 is already on this page; update it or remove it so dropkit can load ' + CONNECT_WIDGET_VERSION + '.';\n\nconst MANIFOLD_HOST = /(^|\\.)(manifoldxyz\\.dev|manifold\\.xyz)$/;\n\n/** Only Manifold connect-widget bundles count as an old widget: connect.manifoldxyz.dev, or connect.umd*.js on a Manifold host. */\nfunction isManifoldConnectScript(src: string): boolean {\n try {\n const url = new URL(src, document.baseURI);\n return url.hostname === 'connect.manifoldxyz.dev' || (MANIFOLD_HOST.test(url.hostname) && /\\/connect\\.umd[^/]*\\.js$/.test(url.pathname));\n } catch {\n return false;\n }\n}\n\nfunction applyState(state: LoadState): void {\n if (!state.div) return;\n const network = state.networks.join(',');\n // Connect 6.4 remounts on every attribute mutation, even an identical value.\n if (state.div.dataset.network !== network) state.div.dataset.network = network;\n // A caller's id wins; otherwise keep a host page's own id, else use Manifold's default.\n const projectId = state.projectId ?? state.div.dataset.walletConnectProjectId ?? DEFAULT_WALLETCONNECT_PROJECT_ID;\n if (state.div.dataset.walletConnectProjectId !== projectId) state.div.dataset.walletConnectProjectId = projectId;\n}\n\n/** Adds a caller's chains (first-call order) and promotes the first nonempty project id; a conflicting later id only warns. */\nfunction register(state: LoadState, opts: ConnectOptions): void {\n for (const id of opts.chainIds) if (!state.networks.includes(id)) state.networks.push(id);\n const id = opts.walletConnectProjectId;\n if (id) {\n if (!state.projectId) state.projectId = id;\n else if (state.projectId !== id) {\n console.warn(`dropkit: walletConnectProjectId \"${id}\" ignored; this page already uses \"${state.projectId}\" for the shared connect widget.`);\n }\n }\n applyState(state);\n}\n\nfunction startLoad(state: LoadState): Promise<void> {\n const connect = win().ManifoldConnect;\n if (connect?.capabilities?.includes('open')) return Promise.resolve(connect.ready).then(() => undefined);\n\n const hasScript = Array.from(document.querySelectorAll('script[src]')).some((s) => isManifoldConnectScript((s as HTMLScriptElement).src));\n if (hasScript || document.querySelector('[data-widget=\"m-connect\"]')) {\n return Promise.reject(new MintError('CONNECT_WIDGET_TOO_OLD', TOO_OLD));\n }\n\n return new Promise<void>((resolve, reject) => {\n const css = document.createElement('link');\n css.rel = 'stylesheet';\n css.href = `${CONNECT_BASE_URL}/connect.css`;\n document.head.appendChild(css);\n state.nodes.push(css);\n\n const div = document.createElement('div');\n div.hidden = true;\n div.style.display = 'none';\n div.dataset.widget = 'm-connect';\n div.dataset.connectId = CONNECT_ID;\n div.dataset.autoReconnect = 'true';\n div.dataset.enableNetworkSwitching = 'true';\n state.div = div;\n applyState(state);\n document.body.appendChild(div);\n state.nodes.push(div);\n\n const script = document.createElement('script');\n script.src = `${CONNECT_BASE_URL}/connect.umd.min.js`;\n script.async = true;\n script.addEventListener('load', () => {\n const ready = win().ManifoldConnect?.ready;\n if (!ready) return reject(new MintError('CONNECT_WIDGET_TOO_OLD', TOO_OLD));\n Promise.resolve(ready).then(() => resolve(), reject);\n });\n script.addEventListener('error', () => reject(new MintError('RPC_ERROR', `Could not load the Manifold connect widget from ${CONNECT_BASE_URL}`)));\n document.head.appendChild(script);\n state.nodes.push(script);\n });\n}\n\n/**\n * Idempotent across buttons, React Strict Mode and repeated calls: the promise is stored on\n * window[LOADER_KEY] BEFORE anything is appended. Order: window.ManifoldConnect lists 'open' -> reuse;\n * else an existing Manifold connect script tag or [data-widget=\"m-connect\"] -> reject MintError('CONNECT_WIDGET_TOO_OLD')\n * and inject nothing; else inject CONNECT_BASE_URL/connect.umd.min.js + connect.css and one hidden\n * <div data-widget=\"m-connect\" data-connect-id=\"mint-button\" data-auto-reconnect=\"true\"\n * data-enable-network-switching=\"true\" data-network=\"<ids joined by ,>\" [data-wallet-connect-project-id]>,\n * then await window.ManifoldConnect.ready. Every caller (also after load) adds its chains to the one widget's\n * data-network and may promote the first nonempty project id. A failed load clears window[LOADER_KEY] and\n * removes the nodes it created, so the next call retries.\n */\nexport function loadConnectWidget(opts: ConnectOptions): Promise<void> {\n const w = win();\n const page = pageState();\n const existing = w[LOADER_KEY];\n if (existing) {\n // Adopt a legacy promise without replacing it or taking ownership of its DOM.\n if (page.load?.promise !== existing) {\n const div = document.querySelector<HTMLElement>(`[data-widget=\"m-connect\"][data-connect-id=\"${CONNECT_ID}\"]`) ?? undefined;\n page.load = {\n promise: existing,\n networks: div?.dataset.network?.split(',').filter(Boolean).map(Number) ?? [],\n // The default id is a placeholder, not a choice: a caller's real id may still replace it.\n projectId: div?.dataset.walletConnectProjectId === DEFAULT_WALLETCONNECT_PROJECT_ID ? undefined : div?.dataset.walletConnectProjectId,\n div,\n nodes: [],\n };\n }\n register(page.load, opts);\n return existing;\n }\n let resolve!: () => void;\n let reject!: (reason: unknown) => void;\n const p = new Promise<void>((res, rej) => { resolve = res; reject = rej; });\n const state: LoadState = { promise: p, networks: [], nodes: [] };\n // Publish before DOM insertion: synchronous observers and other copies must see the same load.\n page.load = state;\n w[LOADER_KEY] = p;\n p.catch(() => {\n if (w[LOADER_KEY] === p) delete w[LOADER_KEY];\n if (page.load === state) page.load = undefined;\n for (const node of state.nodes) node.parentNode?.removeChild(node);\n state.nodes.length = 0;\n state.div = undefined;\n });\n register(state, opts);\n try {\n startLoad(state).then(resolve, reject);\n } catch (error) {\n reject(error);\n }\n return p;\n}\n\n/**\n * Dispatches m-connect:open {connectId: CONNECT_ID}; resolves with the next m-connect:closed reason.\n * Calls made before that close share one pending promise and one listener.\n */\nexport function openConnectModal(): Promise<'connected' | 'dismissed'> {\n const page = pageState();\n if (page.pendingModal) return page.pendingModal;\n const p = new Promise<'connected' | 'dismissed'>((resolve) => {\n const onClosed = (e: Event) => {\n const detail = (e as CustomEvent<{ connectId?: string; reason?: string }>).detail ?? {};\n if (detail.connectId !== undefined && detail.connectId !== CONNECT_ID) return;\n window.removeEventListener('m-connect:closed', onClosed);\n page.pendingModal = undefined;\n resolve(detail.reason === 'connected' ? 'connected' : 'dismissed');\n };\n window.addEventListener('m-connect:closed', onClosed);\n });\n page.pendingModal = p;\n window.dispatchEvent(new CustomEvent('m-connect:open', { detail: { connectId: CONNECT_ID } }));\n return p;\n}\n\n/**\n * From window.ManifoldEthereumProvider.selectedAddress()/chainId(); null when not connected.\n * When the wallet is on a chain outside the widget's data-network, chainId() is undefined, so the\n * chain falls back to browserChainId() (the wallet's real chain, updated before CHAIN_CHANGED fires).\n * chainId() wins when present; a throwing browserChainId() counts as unknown (null).\n */\nexport function getAccount(): Account | null {\n const p = win().ManifoldEthereumProvider;\n const address = p?.selectedAddress?.();\n let chainId = p?.chainId?.();\n if (chainId === undefined || chainId === null) {\n try {\n chainId = p?.browserChainId?.();\n } catch {\n chainId = undefined;\n }\n }\n if (!address || chainId === undefined || chainId === null) return null;\n return { address: getAddress(address), chainId: Number(chainId) };\n}\n\n/** Calls cb(getAccount()) on ADDRESS_CHANGED and CHAIN_CHANGED window events. Returns unsubscribe. */\nexport function subscribeAccount(cb: (account: Account | null) => void): () => void {\n const handler = () => cb(getAccount());\n window.addEventListener(ADDRESS_CHANGED, handler);\n window.addEventListener(CHAIN_CHANGED, handler);\n return () => {\n window.removeEventListener(ADDRESS_CHANGED, handler);\n window.removeEventListener(CHAIN_CHANGED, handler);\n };\n}\n\nfunction eip1193(): EIP1193Provider {\n const p = win().ManifoldEthereumProvider;\n const provider = (p?.provider?.(true) ?? p?.browserProvider?.())?.provider;\n if (!provider) throw new MintError('CHAIN_SWITCH_FAILED', 'No wallet is connected.');\n return provider;\n}\n\n/** viem WalletClient over (ManifoldEthereumProvider.provider(true) ?? browserProvider()).provider. */\nexport function getWalletClient(chainId: number): WalletClient {\n const provider = eip1193();\n // viem's custom() forwards a second options argument; wallet providers take exactly one.\n const request = ((args: Parameters<EIP1193Provider['request']>[0]) => provider.request(args)) as EIP1193Provider['request'];\n return createWalletClient({ chain: getChain(chainId), transport: custom({ request }) });\n}\n\nexport type DepositOutcome = 'mined' | 'reverted' | 'unknown';\n\n/**\n * Waits for a Relay deposit through the wallet's own provider (D14). Only a reverted receipt is final;\n * anything else ('unknown': no receipt in time) keeps polling Relay, same as claim-widgets.\n */\nexport async function waitForDeposit(chainId: number, hash: Hex, timeoutMs = 120_000): Promise<DepositOutcome> {\n try {\n const receipt = await getWalletClient(chainId).extend(publicActions).waitForTransactionReceipt({ hash, confirmations: 1, timeout: timeoutMs });\n return receipt.status === 'reverted' ? 'reverted' : 'mined';\n } catch {\n return 'unknown';\n }\n}\n\n/** A wallet that never answers must not wedge the button (N3). Mutable for tests. */\nexport const WALLET_READ_TIMEOUT = { ms: 10_000 };\n\n/**\n * Native balance of `address` on `chainId`, read through the connected wallet's own provider (spec D14):\n * the wallet is the only provider Dropkit can count on for a chain other than the drop chain.\n * Throws MintError('CHAIN_SWITCH_FAILED') when the wallet is not on `chainId`.\n */\nexport async function getConnectedBalance(address: Address, chainId: number): Promise<bigint> {\n const provider = eip1193();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new MintError('RPC_ERROR', 'The wallet did not report a balance in time.')), WALLET_READ_TIMEOUT.ms);\n });\n try {\n return await Promise.race([\n (async () => {\n const current = Number(await provider.request({ method: 'eth_chainId' }));\n if (current !== chainId) {\n throw new MintError('CHAIN_SWITCH_FAILED', `The wallet is on chain ${String(current)}, not ${String(chainId)}.`);\n }\n const hex = await provider.request({ method: 'eth_getBalance', params: [address, 'latest'] });\n return BigInt(hex as string);\n })(),\n timeout,\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nconst code = (e: unknown): unknown => (e as { code?: unknown } | null)?.code;\n\ntype Eip1193Request = EIP1193Provider['request'];\nconst hexChainId = (chainId: number): Hex => `0x${chainId.toString(16)}`;\n\n/** The one wallet_switchEthereumChain request body, shared by switchToChain and requestSwitch. */\nconst sendSwitchRequest = (provider: { request: Eip1193Request }, chainId: number) =>\n provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: hexChainId(chainId) }] });\n\n/** The one wallet_addEthereumChain request body (from getChain), shared by switchToChain and requestAddChain. */\nconst sendAddRequest = (provider: { request: Eip1193Request }, chainId: number) => {\n const chain = getChain(chainId);\n return provider.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: hexChainId(chainId),\n chainName: chain.name,\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: [...chain.rpcUrls.default.http],\n ...(chain.blockExplorers ? { blockExplorerUrls: [chain.blockExplorers.default.url] } : {}),\n },\n ],\n });\n};\n\n/** 4001 -> USER_REJECTED; anything else -> CHAIN_SWITCH_FAILED. */\nfunction chainRequestError(e: unknown, chainId: number): MintError {\n if (code(e) === 4001) return new MintError('USER_REJECTED', 'You rejected the network switch.', { cause: e });\n return new MintError('CHAIN_SWITCH_FAILED', `Could not switch the wallet to chain ${String(chainId)}.`, { cause: e });\n}\n\n/**\n * wallet_switchEthereumChain; on error code 4902 wallet_addEthereumChain (from getChain) then switch again.\n * 4001 -> MintError('USER_REJECTED'); anything else -> MintError('CHAIN_SWITCH_FAILED').\n */\nexport async function switchToChain(chainId: number): Promise<void> {\n getChain(chainId);\n const provider = eip1193();\n try {\n try {\n await sendSwitchRequest(provider, chainId);\n } catch (e) {\n if (code(e) !== 4902) throw e;\n await sendAddRequest(provider, chainId);\n await sendSwitchRequest(provider, chainId);\n }\n } catch (e) {\n throw chainRequestError(e, chainId);\n }\n}\n\n/**\n * Sends wallet_switchEthereumChain and nothing else (one wallet request, for the cart).\n * Error 4902 (unknown chain) returns { needsAdd: true } and sends nothing more; the caller adds the chain on its own click.\n * 4001 -> MintError('USER_REJECTED'); anything else -> MintError('CHAIN_SWITCH_FAILED').\n */\nexport async function requestSwitch(chainId: number): Promise<{ needsAdd: boolean }> {\n getChain(chainId);\n const provider = eip1193();\n try {\n await sendSwitchRequest(provider, chainId);\n return { needsAdd: false };\n } catch (e) {\n if (code(e) === 4902) return { needsAdd: true };\n throw chainRequestError(e, chainId);\n }\n}\n\n/** Sends wallet_addEthereumChain and nothing else. Same error mapping as requestSwitch. */\nexport async function requestAddChain(chainId: number): Promise<void> {\n getChain(chainId);\n const provider = eip1193();\n try {\n await sendAddRequest(provider, chainId);\n } catch (e) {\n throw chainRequestError(e, chainId);\n }\n}\n\n/** The connected wallet's EIP-1193 provider (the one getWalletClient wraps). Throws MintError('CHAIN_SWITCH_FAILED') when none. */\nexport function getWalletProvider(): EIP1193Provider {\n return eip1193();\n}\n","// Manifold Edition claim adapter. Spec #how, #data-models section 3, D3/D10. Calls the extension contract directly.\nimport {\n BaseError,\n ContractFunctionRevertedError,\n decodeErrorResult,\n encodeFunctionData,\n formatUnits,\n getAddress,\n isAddress,\n isHex,\n zeroAddress,\n zeroHash,\n type Hex,\n type PublicClient,\n} from 'viem';\nimport type { Address, DropInfo, ManifoldClaimConfig, Money } from '../../types';\nimport type { AdapterContext, HoldingsQuery, MintAdapter, MintPlan, WalletRead } from '../types';\nimport { MintError } from '../../errors';\nimport {\n CLAIM_1155_V5_ABI,\n CLAIM_1155_V7_ABI,\n CLAIM_721_V5_ABI,\n CLAIM_721_V7_ABI,\n CREATOR_ABI,\n ERC1155_BALANCE_ABI,\n ERC721_BALANCE_ABI,\n ERC20_ABI,\n EXTENSION_COMMON_ABI,\n EXTENSION_ERRORS_ABI,\n} from './abis';\nimport { fetchMerkleEntries, type MerkleEntry } from './merkle';\n\nexport type ExtensionSpec = '721' | '1155';\nexport type ExtensionAbi = 'Claim721V5Optimization' | 'Claim1155V5Optimization' | 'Claim721V7' | 'Claim1155V7';\nexport type ExtensionEntry = { chainId: number; address: Address; generation: 'V6' | 'V7' | 'V8'; spec: ExtensionSpec; abi: ExtensionAbi };\n\nconst V6_721: Address = '0x1eb73fee2090fb1c20105d5ba887e3c3ba14a17e';\nconst V6_1155: Address = '0x04ba6cf3c5aa6d4946f5b7f7adf111012a9fac65';\nconst V7_721: Address = '0x23aa05a271debffaa3d75739af5581f744b326e4';\nconst V7_1155: Address = '0x26bbea7803dcac346d5f5f135b57cf2c752a02be';\nconst V8_721: Address = '0x5889e848b2423344f7969bc158100c07595c0137';\nconst V8_1155: Address = '0x88438f4d4b8516e758a319ad16924da60e1e56cc';\n\nconst v6 = (chainId: number): ExtensionEntry[] => [\n { chainId, address: V6_721, generation: 'V6', spec: '721', abi: 'Claim721V5Optimization' },\n { chainId, address: V6_1155, generation: 'V6', spec: '1155', abi: 'Claim1155V5Optimization' },\n];\nconst v7 = (chainId: number): ExtensionEntry[] => [\n { chainId, address: V7_721, generation: 'V7', spec: '721', abi: 'Claim721V7' },\n { chainId, address: V7_1155, generation: 'V7', spec: '1155', abi: 'Claim1155V7' },\n];\n\n/**\n * Embedded registry keyed by (chainId, lowercase address). Bytecode measured with eth_getCode:\n * mainnet, Base, Optimism have V6 + V7 (identical code hashes); Shape has V7 + V8 ERC-1155 (no V6, no V8 ERC-721);\n * Sepolia has all six. V8 has no code on mainnet, Base or Optimism. ApeChain has none of the six.\n */\nexport const EXTENSIONS: readonly ExtensionEntry[] = [\n ...v6(1),\n ...v7(1),\n ...v6(8453),\n ...v7(8453),\n ...v6(10),\n ...v7(10),\n ...v7(360),\n { chainId: 360, address: V8_1155, generation: 'V8', spec: '1155', abi: 'Claim1155V7' },\n ...v6(11155111),\n ...v7(11155111),\n { chainId: 11155111, address: V8_721, generation: 'V8', spec: '721', abi: 'Claim721V7' },\n { chainId: 11155111, address: V8_1155, generation: 'V8', spec: '1155', abi: 'Claim1155V7' },\n];\n\nexport function findExtension(chainId: number, address: Address): ExtensionEntry | undefined {\n const a = address.toLowerCase();\n return EXTENSIONS.find((e) => e.chainId === chainId && e.address === a);\n}\n\nexport const MERKLE_API = 'https://apps.api.manifoldxyz.dev';\n\n/** uint16 mintCount cap of mintProxy. */\nconst MAX_MINT_COUNT = 65535;\n/** Gas units kept aside in WalletRead.gasReserve: an estimate, simulate() is the authoritative check. */\nconst GAS_UNITS_BASE = 100_000n;\nconst GAS_UNITS_PER_TOKEN = 150_000n;\nconst GAS_UNITS_APPROVE = 60_000n;\n\n// ---------- claim decoding ----------\n\ntype Claim = {\n total: bigint;\n totalMax: bigint;\n walletMax: bigint;\n startDate: bigint;\n endDate: bigint;\n merkleRoot: Hex;\n cost: bigint;\n erc20: Address;\n /** null on V6 (no signature claims). */\n signingAddress: Address | null;\n /** ERC-1155 token id minted by this claim (not the Manifold instance id); null for ERC-721. */\n tokenId: bigint | null;\n};\n\ntype Resolved = { entry: ExtensionEntry; claim: Claim; fee: bigint; creator: Address; instanceId: bigint };\n\n/** Carried from readDrop to readWallet (keyed by the DropInfo object) so readWallet does not re-discover. */\nconst dropResolved = new WeakMap<DropInfo, Resolved>();\n\n/** Carried from readWallet to buildPlan in WalletRead.data. */\ntype WalletData = {\n brand: typeof WALLET_DATA_BRAND;\n resolved: Resolved;\n config: ManifoldClaimConfig;\n recipient: Address;\n /** Allowlist only: unused (mintIndex, proof) pairs for the recipient. */\n unused: MerkleEntry[];\n};\nconst WALLET_DATA_BRAND = Symbol('manifold-claim-wallet-data');\nconst isWalletData = (d: unknown): d is WalletData => typeof d === 'object' && d !== null && (d as WalletData).brand === WALLET_DATA_BRAND;\n\nconst isAllowlist = (claim: Claim) => claim.merkleRoot !== zeroHash;\n\n// ---------- errors ----------\n\n/** Contract-level failure of an eth_call (revert or empty return), as opposed to a transport failure. */\nfunction isContractFailure(e: unknown): boolean {\n if (!(e instanceof BaseError)) return false;\n return e.walk((x) => x instanceof ContractFunctionRevertedError || (x as Error).name === 'ContractFunctionZeroDataError') !== null;\n}\n\nfunction toRpcError(e: unknown): MintError {\n if (e instanceof MintError) return e;\n const msg = e instanceof BaseError ? e.shortMessage : e instanceof Error ? e.message : String(e);\n return new MintError('RPC_ERROR', `RPC request failed: ${msg}`, { cause: e });\n}\n\nasync function rpc<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (e) {\n throw toRpcError(e);\n }\n}\n\n/** Raw revert bytes anywhere in a viem error chain. */\nfunction revertData(e: BaseError): Hex | undefined {\n const hit = e.walk((x) => {\n const d = (x as { data?: unknown }).data;\n return (isHex(d) && d.length >= 10) || (typeof d === 'object' && d !== null && isHex((d as { data?: unknown }).data));\n });\n const d = (hit as { data?: unknown } | null)?.data;\n if (isHex(d)) return d;\n const inner = (d as { data?: unknown } | undefined)?.data;\n return isHex(inner) ? inner : undefined;\n}\n\n/** Decoded revert text for a failed simulation, or null when the error is not a revert. */\nfunction decodeRevert(e: unknown): string | null {\n if (!(e instanceof BaseError)) return null;\n const data = revertData(e);\n if (data) {\n try {\n const d = decodeErrorResult({ abi: EXTENSION_ERRORS_ABI, data });\n if (d.errorName === 'Error' && typeof d.args?.[0] === 'string') return d.args[0];\n if (d.errorName === 'Panic') return `Panic(${String(d.args?.[0])})`;\n return d.errorName;\n } catch {\n return `reverted with unknown error ${data.slice(0, 10)}`;\n }\n }\n const named = e.walk((x) => ['ExecutionRevertedError', 'InsufficientFundsError'].includes((x as Error).name));\n return named instanceof BaseError ? named.shortMessage : null;\n}\n\n// ---------- reads ----------\n\nconst money = (value: bigint, decimals: number, symbol: string): Money => ({ value, decimals, symbol, formatted: formatUnits(value, decimals) });\n\nfunction timestamp(v: bigint, field: string): number | null {\n if (v === 0n) return null;\n if (v > BigInt(Number.MAX_SAFE_INTEGER)) throw new MintError('RPC_ERROR', `Claim ${field} does not fit a safe integer`);\n return Number(v);\n}\n\nfunction parseConfig(config: ManifoldClaimConfig): { creator: Address; instanceId: bigint; extension: Address | undefined } {\n if (!isAddress(config.creatorContract, { strict: false })) {\n throw new MintError('INVALID_CONFIG', 'creatorContract is not a valid address.', { field: 'creatorContract' });\n }\n if (config.extension !== undefined && !isAddress(config.extension, { strict: false })) {\n throw new MintError('INVALID_CONFIG', 'extension is not a valid address.', { field: 'extension' });\n }\n if (typeof config.instanceId !== 'string' || !/^\\d+$/.test(config.instanceId)) {\n throw new MintError('INVALID_CONFIG', 'instanceId must be a non-negative integer string.', { field: 'instanceId' });\n }\n return {\n creator: getAddress(config.creatorContract),\n instanceId: BigInt(config.instanceId),\n extension: config.extension === undefined ? undefined : getAddress(config.extension),\n };\n}\n\nconst notFound = (config: ManifoldClaimConfig) =>\n new MintError('CLAIM_NOT_FOUND', `No Manifold claim ${config.instanceId} found on ${config.creatorContract}.`);\n\n/** getClaim with the exact ABI for the entry. Contract failures throw CLAIM_NOT_FOUND, transport failures RPC_ERROR. */\nasync function readClaim(client: PublicClient, entry: ExtensionEntry, creator: Address, instanceId: bigint, config: ManifoldClaimConfig): Promise<Claim> {\n const address = getAddress(entry.address);\n const args = [creator, instanceId] as const;\n try {\n switch (entry.abi) {\n case 'Claim721V5Optimization': {\n const c = await client.readContract({ address, abi: CLAIM_721_V5_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: null, tokenId: null };\n }\n case 'Claim1155V5Optimization': {\n const c = await client.readContract({ address, abi: CLAIM_1155_V5_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: null, tokenId: c.tokenId };\n }\n case 'Claim721V7': {\n const c = await client.readContract({ address, abi: CLAIM_721_V7_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: c.signingAddress, tokenId: null };\n }\n case 'Claim1155V7': {\n const c = await client.readContract({ address, abi: CLAIM_1155_V7_ABI, functionName: 'getClaim', args });\n return { ...base(c), signingAddress: c.signingAddress, tokenId: c.tokenId };\n }\n }\n } catch (e) {\n // Uninitialized claims revert as ClaimNotInitialized() (0x7f07ad49) or Error(\"Claim not initialized\"); both land here.\n if (isContractFailure(e)) throw notFound(config);\n throw toRpcError(e);\n }\n}\n\nfunction base(c: {\n total: number;\n totalMax: number;\n walletMax: number;\n startDate: number;\n endDate: number;\n merkleRoot: Hex;\n cost: bigint;\n erc20: Address;\n}): Omit<Claim, 'signingAddress' | 'tokenId'> {\n return {\n total: BigInt(c.total),\n totalMax: BigInt(c.totalMax),\n walletMax: BigInt(c.walletMax),\n startDate: BigInt(c.startDate),\n endDate: BigInt(c.endDate),\n merkleRoot: c.merkleRoot,\n cost: c.cost,\n erc20: c.erc20,\n };\n}\n\nasync function hasCode(client: PublicClient, address: Address): Promise<boolean> {\n const code = await rpc(() => client.getCode({ address: getAddress(address) }));\n return code !== undefined && code !== '0x';\n}\n\nconst unknownExtension = (address: Address, why: string) => new MintError('UNKNOWN_EXTENSION', `Extension ${address} ${why}.`);\n\nasync function resolveExtension(ctx: AdapterContext, config: ManifoldClaimConfig): Promise<{ entry: ExtensionEntry; claim: Claim }> {\n const { creator, instanceId, extension } = parseConfig(config);\n const { client } = ctx;\n\n if (extension) {\n const entry = findExtension(config.chainId, extension);\n if (!entry) throw unknownExtension(extension, `is not a supported Manifold claim extension on chain ${config.chainId}`);\n if (!(await hasCode(client, extension))) throw unknownExtension(extension, 'has no contract code on this chain');\n return { entry, claim: await readClaim(client, entry, creator, instanceId, config) };\n }\n\n // Auto-discovery: registered extensions of the creator contract that are in the registry for this chain.\n let registered: readonly Address[];\n try {\n registered = await client.readContract({ address: creator, abi: CREATOR_ABI, functionName: 'getExtensions' });\n } catch (e) {\n if (isContractFailure(e)) throw notFound(config);\n throw toRpcError(e);\n }\n const candidates = [...new Set(registered.map((a) => a.toLowerCase()))]\n .map((a) => findExtension(config.chainId, a as Address))\n .filter((e): e is ExtensionEntry => e !== undefined);\n const found = await Promise.all(\n candidates.map(async (entry) => {\n if (!(await hasCode(client, entry.address))) return null;\n try {\n return { entry, claim: await readClaim(client, entry, creator, instanceId, config) };\n } catch (e) {\n if (e instanceof MintError && e.reason === 'CLAIM_NOT_FOUND') return null;\n throw e;\n }\n }),\n );\n const hits = found.filter((f): f is { entry: ExtensionEntry; claim: Claim } => f !== null);\n if (hits.length === 0) throw notFound(config);\n if (hits.length > 1) {\n throw new MintError(\n 'AMBIGUOUS_EXTENSION',\n `Claim ${config.instanceId} exists on ${hits.length} extensions (${hits.map((h) => h.entry.address).join(', ')}). Set config.extension.`,\n );\n }\n return hits[0]!;\n}\n\nasync function loadDrop(ctx: AdapterContext, config: ManifoldClaimConfig): Promise<{ drop: DropInfo; resolved: Resolved }> {\n const { entry, claim } = await resolveExtension(ctx, config);\n if (claim.signingAddress !== null && claim.signingAddress !== zeroAddress) {\n throw new MintError('SIGNATURE_CLAIM', 'This claim mints with a signature (redemption code), which this button does not support.');\n }\n const { client } = ctx;\n const extension = getAddress(entry.address);\n const fee = await rpc(() =>\n client.readContract({ address: extension, abi: EXTENSION_COMMON_ABI, functionName: isAllowlist(claim) ? 'MINT_FEE_MERKLE' : 'MINT_FEE' }),\n );\n\n const native = client.chain?.nativeCurrency ?? { symbol: 'ETH', decimals: 18 };\n let unitPrice: Money;\n let paymentToken: Address | null = null;\n if (claim.erc20 === zeroAddress) {\n unitPrice = money(claim.cost, native.decimals, native.symbol);\n } else {\n paymentToken = getAddress(claim.erc20);\n const token = paymentToken;\n const [symbol, decimals] = await rpc(() =>\n Promise.all([\n client.readContract({ address: token, abi: ERC20_ABI, functionName: 'symbol' }),\n client.readContract({ address: token, abi: ERC20_ABI, functionName: 'decimals' }),\n ]),\n );\n unitPrice = money(claim.cost, decimals, symbol);\n }\n\n const drop: DropInfo = {\n chainId: config.chainId,\n unitPrice,\n unitFee: money(fee, native.decimals, native.symbol),\n totalMinted: claim.total,\n maxSupply: claim.totalMax === 0n ? null : claim.totalMax,\n startTime: timestamp(claim.startDate, 'startDate'),\n endTime: timestamp(claim.endDate, 'endDate'),\n isAllowlist: isAllowlist(claim),\n paymentToken,\n pricePer: 'unit',\n };\n const { creator, instanceId } = parseConfig(config);\n const resolved = { entry, claim, fee, creator, instanceId };\n dropResolved.set(drop, resolved);\n return { drop, resolved };\n}\n\nasync function loadWallet(\n ctx: AdapterContext,\n config: ManifoldClaimConfig,\n args: { payer: Address; recipient: Address; quantity: number; drop: DropInfo },\n): Promise<WalletRead> {\n const { creator, instanceId } = parseConfig(config);\n const { client } = ctx;\n const resolved = dropResolved.get(args.drop) ?? (await loadDrop(ctx, config)).resolved;\n const { entry, claim } = resolved;\n const extension = getAddress(entry.address);\n const payer = getAddress(args.payer);\n const recipient = getAddress(args.recipient);\n\n let walletMinted: bigint | null = null;\n let walletMax: bigint | null = null;\n let allowlistRemaining: number | null = null;\n let maxQuantity: number | null = null;\n let ineligible: WalletRead['ineligible'] = null;\n let unused: MerkleEntry[] = [];\n\n if (isAllowlist(claim)) {\n // Branch 1: allowlist ignores walletMax and limits by unused mint indices; proofs are for the recipient.\n const entries = await fetchMerkleEntries({ scope: ctx.cacheScope ?? args.drop, api: MERKLE_API, instanceId: config.instanceId, recipient, fetch: ctx.fetch, signal: ctx.signal });\n if (entries.length > 0) {\n const minted = await rpc(() =>\n client.readContract({\n address: extension,\n abi: EXTENSION_COMMON_ABI,\n functionName: 'checkMintIndices',\n args: [creator, instanceId, entries.map((e) => e.mintIndex)],\n }),\n );\n unused = entries.filter((_, i) => minted[i] === false);\n }\n allowlistRemaining = unused.length;\n maxQuantity = unused.length;\n if (entries.length === 0) {\n ineligible = { reason: 'NOT_ON_ALLOWLIST', message: 'This wallet is not on the allowlist.' };\n } else if (unused.length === 0) {\n ineligible = { reason: 'ALLOWLIST_USED', message: 'This wallet has already used all its allowlist spots.' };\n }\n } else if (claim.walletMax > 0n) {\n // Branch 2: public with a wallet limit, counted against the recipient.\n walletMax = claim.walletMax;\n walletMinted = BigInt(\n await rpc(() => client.readContract({ address: extension, abi: EXTENSION_COMMON_ABI, functionName: 'getTotalMints', args: [recipient, creator, instanceId] })),\n );\n const left = walletMax > walletMinted ? walletMax - walletMinted : 0n;\n maxQuantity = Number(left);\n if (left === 0n) ineligible = { reason: 'WALLET_LIMIT', message: `This wallet has already minted its limit of ${walletMax}.` };\n }\n // Branch 3: public with walletMax = 0 is unlimited. getTotalMints reverts there, so it is never called.\n\n const token = claim.erc20 === zeroAddress ? null : getAddress(claim.erc20);\n const [native, erc20, gasPrice] = await rpc(() =>\n Promise.all([\n client.getBalance({ address: payer }),\n token ? client.readContract({ address: token, abi: ERC20_ABI, functionName: 'balanceOf', args: [payer] }) : Promise.resolve(null),\n client.getGasPrice(),\n ]),\n );\n const gasUnits = GAS_UNITS_BASE + GAS_UNITS_PER_TOKEN * BigInt(Math.max(1, args.quantity)) + (token ? GAS_UNITS_APPROVE : 0n);\n\n const data: WalletData = { brand: WALLET_DATA_BRAND, resolved, config, recipient, unused };\n return {\n walletMinted,\n walletMax,\n allowlistRemaining,\n maxQuantity,\n ineligible,\n balances: { native, erc20 },\n gasReserve: gasPrice * gasUnits,\n data,\n };\n}\n\n// ---------- plan + simulate ----------\n\nconst sameClaim = (a: ManifoldClaimConfig, b: ManifoldClaimConfig) =>\n a.chainId === b.chainId &&\n a.creatorContract.toLowerCase() === b.creatorContract.toLowerCase() &&\n a.instanceId === b.instanceId &&\n a.extension?.toLowerCase() === b.extension?.toLowerCase();\n\nasync function buildPlan(ctx: AdapterContext, attempt: Parameters<MintAdapter<ManifoldClaimConfig>['buildPlan']>[1], wallet: WalletRead): Promise<MintPlan> {\n const { config, quantity } = attempt;\n if (!Number.isInteger(quantity) || quantity < 1 || quantity > MAX_MINT_COUNT) {\n throw new MintError('INVALID_CONFIG', `quantity must be an integer from 1 to ${MAX_MINT_COUNT}.`, { field: 'quantity' });\n }\n const { creator, instanceId } = parseConfig(config);\n const recipient = getAddress(attempt.recipient);\n const payer = getAddress(attempt.payer);\n\n // Proofs belong to the recipient they were fetched for; anything else is re-read.\n let data = wallet.data;\n if (!isWalletData(data) || !sameClaim(data.config, config) || data.recipient !== recipient) {\n const drop = (await loadDrop(ctx, config)).drop;\n data = (await loadWallet(ctx, config, { payer, recipient, quantity, drop })).data;\n }\n if (!isWalletData(data)) throw new MintError('RPC_ERROR', 'Wallet read produced no plan data.');\n const { entry, claim, fee } = data.resolved;\n const extension = getAddress(entry.address);\n\n let mintIndices: number[] = [];\n let merkleProofs: (readonly Hex[])[] = [];\n if (isAllowlist(claim)) {\n if (quantity > data.unused.length) {\n throw new MintError('WALLET_LIMIT', `Only ${data.unused.length} allowlist spot(s) left for this wallet.`);\n }\n const picked = data.unused.slice(0, quantity);\n mintIndices = picked.map((p) => p.mintIndex);\n merkleProofs = picked.map((p) => p.proof);\n }\n\n const qty = BigInt(quantity);\n const erc20 = claim.erc20 === zeroAddress ? null : getAddress(claim.erc20);\n const cost = claim.cost * qty;\n const value = fee * qty + (erc20 ? 0n : cost);\n\n let approve: MintPlan['approve'] = null;\n if (erc20 && cost > 0n) {\n const allowance = await rpc(() => ctx.client.readContract({ address: erc20, abi: ERC20_ABI, functionName: 'allowance', args: [payer, extension] }));\n if (allowance < cost) {\n approve = {\n token: erc20,\n spender: extension,\n amount: cost,\n tx: { to: erc20, data: encodeFunctionData({ abi: ERC20_ABI, functionName: 'approve', args: [extension, cost] }), value: 0n },\n };\n }\n }\n\n return {\n approve,\n mint: {\n to: extension,\n data: encodeFunctionData({\n abi: EXTENSION_COMMON_ABI,\n functionName: 'mintProxy',\n args: [creator, instanceId, quantity, mintIndices, merkleProofs.map((p) => [...p]), recipient],\n }),\n value,\n },\n tokenContract: creator,\n };\n}\n\n/**\n * Extension generations whose deployed mintProxy mints to mintFor and checks proofs and walletMax\n * against mintFor (spec D12, verified from Sourcify source on chain 1). V8 has no verified source.\n */\nexport const RELAY_VERIFIED: readonly ExtensionEntry['generation'][] = ['V6', 'V7'];\n\n/**\n * What counts a recipient's holdings of this claim (cart settlement). getTotalMints answers only for a non-allowlist\n * claim with a wallet limit; the extension reverts otherwise (\"Can only retrieve for non-merkle claims with\n * walletMax\", seen on Sepolia V7). Every other claim uses the token balance on the creator contract (ERC-1155 by the\n * claim's token id, which is not the instance id). null when the drop did not come from readDrop.\n */\nfunction holdingsQueryFor(drop: DropInfo, purpose: 'settle' | 'display' = 'settle'): HoldingsQuery | null {\n const resolved = dropResolved.get(drop);\n if (!resolved) return null;\n const { entry, claim, creator, instanceId } = resolved;\n if (purpose === 'display') {\n // What the wallet holds of THIS drop now: an 1155 token balance counts transfers in and out. A 721 balance\n // counts the whole contract, so a 721 drop shows mints from this drop where the extension can count them\n // (non-allowlist claims with a wallet limit), else the contract balance.\n if (entry.spec === '1155') {\n if (claim.tokenId === null) return null;\n return { kind: 'balance-1155', creatorContract: creator, tokenId: claim.tokenId.toString() };\n }\n if (!isAllowlist(claim) && claim.walletMax > 0n) {\n return { kind: 'total-mints', extension: getAddress(entry.address), creatorContract: creator, instanceId: instanceId.toString() };\n }\n return { kind: 'balance-721', creatorContract: creator };\n }\n if (!isAllowlist(claim) && claim.walletMax > 0n) {\n return { kind: 'total-mints', extension: getAddress(entry.address), creatorContract: creator, instanceId: instanceId.toString() };\n }\n if (entry.spec === '1155') {\n if (claim.tokenId === null) return null;\n return { kind: 'balance-1155', creatorContract: creator, tokenId: claim.tokenId.toString() };\n }\n return { kind: 'balance-721', creatorContract: creator };\n}\n\nasync function readHoldings(ctx: AdapterContext, query: HoldingsQuery, recipient: Address): Promise<bigint> {\n const { client } = ctx;\n const owner = getAddress(recipient);\n switch (query.kind) {\n case 'total-mints':\n return BigInt(\n await rpc(() =>\n client.readContract({\n address: getAddress(query.extension),\n abi: EXTENSION_COMMON_ABI,\n functionName: 'getTotalMints',\n args: [owner, getAddress(query.creatorContract), BigInt(query.instanceId)],\n }),\n ),\n );\n case 'balance-1155':\n return rpc(() =>\n client.readContract({ address: getAddress(query.creatorContract), abi: ERC1155_BALANCE_ABI, functionName: 'balanceOf', args: [owner, BigInt(query.tokenId)] }),\n );\n case 'balance-721':\n return rpc(() => client.readContract({ address: getAddress(query.creatorContract), abi: ERC721_BALANCE_ABI, functionName: 'balanceOf', args: [owner] }));\n }\n}\n\nexport const manifoldClaimAdapter: MintAdapter<ManifoldClaimConfig> = {\n holdingsQuery: holdingsQueryFor,\n readHoldings,\n supportsRelay: (drop) => {\n const resolved = dropResolved.get(drop);\n return resolved !== undefined && RELAY_VERIFIED.includes(resolved.entry.generation) && drop.paymentToken === null;\n },\n readDrop: async (ctx, config) => (await loadDrop(ctx, config)).drop,\n readWallet: loadWallet,\n buildPlan,\n simulate: async (ctx, attempt, plan) => {\n try {\n await ctx.client.call({ account: getAddress(attempt.payer), to: plan.mint.to, data: plan.mint.data, value: plan.mint.value });\n } catch (e) {\n const text = decodeRevert(e);\n if (text === null) throw toRpcError(e);\n throw new MintError('SIMULATION_REVERTED', text, { cause: e });\n }\n },\n};\n","// Embedded viem ABI fragments for the supported Manifold Edition claim extensions (spec #data-models section 3).\n// Source: @manifoldxyz/claim-contracts 3.3.0 (src/abis). getClaim is the only function whose shape differs:\n// 721 and 1155 tuples differ within one generation (721 has contractVersion/identical, 1155 has tokenId),\n// and V7 adds signingAddress. Each (generation, spec) gets its own exact fragment; nothing is decoded by position.\nimport { parseAbi } from 'viem';\n\nexport const CLAIM_721_V5_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, uint8 contractVersion, bool identical, bytes32 merkleRoot, string location, uint256 cost, address paymentReceiver, address erc20) claim)',\n]);\n\nexport const CLAIM_1155_V5_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, bytes32 merkleRoot, string location, uint256 tokenId, uint256 cost, address paymentReceiver, address erc20) claim)',\n]);\n\nexport const CLAIM_721_V7_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, uint8 contractVersion, bool identical, bytes32 merkleRoot, string location, uint256 cost, address paymentReceiver, address erc20, address signingAddress) claim)',\n]);\n\nexport const CLAIM_1155_V7_ABI = parseAbi([\n 'function getClaim(address creatorContractAddress, uint256 instanceId) view returns ((uint32 total, uint32 totalMax, uint32 walletMax, uint48 startDate, uint48 endDate, uint8 storageProtocol, bytes32 merkleRoot, string location, uint256 tokenId, uint256 cost, address paymentReceiver, address erc20, address signingAddress) claim)',\n]);\n\n/** Identical on all four extension ABIs. */\nexport const EXTENSION_COMMON_ABI = parseAbi([\n 'function MINT_FEE() view returns (uint256)',\n 'function MINT_FEE_MERKLE() view returns (uint256)',\n 'function getTotalMints(address minter, address creatorContractAddress, uint256 instanceId) view returns (uint32)',\n 'function checkMintIndices(address creatorContractAddress, uint256 instanceId, uint32[] mintIndices) view returns (bool[] minted)',\n 'function mintProxy(address creatorContractAddress, uint256 instanceId, uint16 mintCount, uint32[] mintIndices, bytes32[][] merkleProofs, address mintFor) payable',\n]);\n\n/** Custom errors used by the V7 generation, plus the two built-in Solidity errors. */\nexport const EXTENSION_ERRORS_ABI = parseAbi([\n 'error Error(string message)',\n 'error Panic(uint256 code)',\n 'error ClaimInactive()',\n 'error ClaimNotInitialized()',\n 'error ExpiredSignature()',\n 'error FailedToTransfer()',\n 'error InvalidAirdrop()',\n 'error InvalidInput()',\n 'error InvalidInstance()',\n 'error InvalidSignature()',\n 'error InvalidStartDate()',\n 'error InvalidStorageProtocol()',\n 'error MustUseSignatureMinting()',\n 'error TokenDNE()',\n 'error TooManyRequested()',\n]);\n\n/** Creator core: registered extensions, for auto-discovery. */\nexport const CREATOR_ABI = parseAbi(['function getExtensions() view returns (address[])']);\n\nexport const ERC20_ABI = parseAbi([\n 'function symbol() view returns (string)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address owner) view returns (uint256)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n]);\n\n/** Creator contract balances, for holdings counts (cart settlement). */\nexport const ERC1155_BALANCE_ABI = parseAbi(['function balanceOf(address account, uint256 id) view returns (uint256)']);\nexport const ERC721_BALANCE_ABI = parseAbi(['function balanceOf(address owner) view returns (uint256)']);\n","// Manifold public merkle API client (spec #api-endpoints, D10). Two calls per allowlist wallet read:\n// instance data (merkleTreeId, appId) then merkleInfo for the recipient. All HTTP goes through ctx.fetch.\nimport { MintError } from '../../errors';\nimport type { Address } from '../../types';\n\nexport type MerkleEntry = { mintIndex: number; proof: readonly `0x${string}`[] };\n\nconst UINT32_MAX = 0xffffffff;\n\ntype Fetch = typeof fetch;\n\nasync function getJson(fetchFn: Fetch, url: string, signal: AbortSignal | undefined, what: string): Promise<unknown> {\n let res: Response;\n try {\n signal?.throwIfAborted();\n res = await fetchFn(url, signal ? { signal } : undefined);\n } catch (cause) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', `Could not reach the allowlist service (${what}).`, { cause });\n }\n if (res.status === 429) throw new MintError('RATE_LIMITED', 'The allowlist service is rate limiting requests. Try again shortly.');\n if (!res.ok) throw new MintError('ALLOWLIST_UNAVAILABLE', `The allowlist service has no data for this claim (${what}: HTTP ${res.status}).`);\n try {\n return await res.json();\n } catch (cause) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', `The allowlist service returned an unreadable response (${what}).`, { cause });\n }\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null;\n\ntype Instance = { merkleTreeId: string | number; appId: string | number };\n\n/** Both API caches belong to a hook/config lifetime, not a refresh or another consumer. */\ntype ScopeCache = {\n signal: AbortSignal | undefined;\n instances: Map<string, Promise<Instance>>;\n entries: Map<string, Promise<MerkleEntry[]>>;\n};\nconst scopeCaches = new WeakMap<object, ScopeCache>();\n\nfunction memo<T>(cache: Map<string, Promise<T>>, key: string, signal: AbortSignal | undefined, load: () => Promise<T>): Promise<T> {\n const hit = cache.get(key);\n if (hit) return hit;\n const p = withSignal(load(), signal);\n cache.set(key, p);\n p.catch(() => {\n if (cache.get(key) === p) cache.delete(key);\n });\n return p;\n}\n\n/** Reject and evict cancelled loads even if an injected fetch ignores the shared lifetime signal. */\nfunction withSignal<T>(p: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n if (!signal) return p;\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist request was cancelled.', { cause: signal.reason }));\n p.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n if (signal.aborted) return onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function loadInstance(fetchFn: Fetch, api: string, instanceId: string, signal: AbortSignal | undefined): Promise<Instance> {\n const instance = await getJson(fetchFn, `${api}/public/instance/data?id=${instanceId}`, signal, 'instance data');\n const publicData = isRecord(instance) ? instance.publicData : undefined;\n const allowlist = isRecord(publicData) ? publicData.instanceAllowlist : undefined;\n const merkleTreeId = isRecord(allowlist) ? allowlist.merkleTreeId : undefined;\n const appId = isRecord(instance) ? instance.appId : undefined;\n if ((typeof merkleTreeId !== 'number' && typeof merkleTreeId !== 'string') || (typeof appId !== 'number' && typeof appId !== 'string')) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist for this claim is not published yet.');\n }\n return { merkleTreeId, appId };\n}\n\nasync function loadEntries(fetchFn: Fetch, api: string, instanceId: string, recipient: Address, scoped: ScopeCache): Promise<MerkleEntry[]> {\n const { signal } = scoped;\n const { merkleTreeId, appId } = await memo(scoped.instances, `${api}|${instanceId}`, signal, () => loadInstance(fetchFn, api, instanceId, signal));\n const url = `${api}/public/merkleTree/${encodeURIComponent(String(merkleTreeId))}/merkleInfo?address=${recipient}&appId=${encodeURIComponent(String(appId))}`;\n const body = await getJson(fetchFn, url, signal, 'merkle info');\n if (!Array.isArray(body)) throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist service returned an unexpected response.');\n return body.map((row): MerkleEntry => {\n const proof = isRecord(row) ? row.merkleProof : undefined;\n const value = isRecord(row) ? row.value : undefined;\n if (\n !Array.isArray(proof) ||\n !proof.every((p) => typeof p === 'string' && /^0x[0-9a-fA-F]{64}$/.test(p)) ||\n typeof value !== 'number' ||\n !Number.isInteger(value) ||\n value < 0 ||\n value > UINT32_MAX\n ) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist service returned an unexpected response.');\n }\n return { mintIndex: value, proof: proof as `0x${string}`[] };\n });\n}\n\n/** (mintIndex, proof) pairs for `recipient` on the claim's allowlist. [] = not on the list. */\nexport async function fetchMerkleEntries(args: {\n scope: object;\n api: string;\n instanceId: string;\n recipient: Address;\n fetch: Fetch | undefined;\n signal: AbortSignal | undefined;\n}): Promise<MerkleEntry[]> {\n if (args.signal?.aborted) {\n throw new MintError('ALLOWLIST_UNAVAILABLE', 'The allowlist request was cancelled.', { cause: args.signal.reason });\n }\n const fetchFn: Fetch = args.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const key = `${args.api}|${args.instanceId}|${args.recipient.toLowerCase()}`;\n let scoped = scopeCaches.get(args.scope);\n // A reused scope with a fresh lifetime must not inherit an aborted load or stale instance data.\n if (!scoped || scoped.signal?.aborted) {\n scoped = { signal: args.signal, instances: new Map(), entries: new Map() };\n scopeCaches.set(args.scope, scoped);\n }\n const cache = scoped;\n const entries = await memo(cache.entries, key, cache.signal, () => loadEntries(fetchFn, args.api, args.instanceId, args.recipient, cache));\n return entries.slice();\n}\n","// Shared receipt parsing (orchestrator-owned, spec #edge-cases \"Receipt has other Transfer logs\").\nimport { decodeAbiParameters, getAddress, zeroAddress } from 'viem';\nimport type { Address, MintedToken } from '../types';\nimport type { ParseReceiptArgs, ReceiptLog } from './types';\n\n// keccak256 of the event signatures\nexport const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\nexport const TRANSFER_SINGLE_TOPIC = '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62';\nexport const TRANSFER_BATCH_TOPIC = '0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb';\n\nconst topicAddress = (t: string | undefined): Address | null =>\n t && t.length === 66 ? getAddress(`0x${t.slice(26)}`) : null;\n\n/**\n * Mints to recipient emitted by tokenContract: ERC721 Transfer (4 topics), ERC1155 TransferSingle and\n * TransferBatch, with from = 0x0 and to = recipient. Batch ids/amounts are zipped (lengths must match,\n * else the log is skipped); duplicate token ids are aggregated; order of first appearance is kept.\n */\nexport function parseMintReceipt(logs: readonly ReceiptLog[], { tokenContract, recipient }: ParseReceiptArgs): MintedToken[] {\n const contract = getAddress(tokenContract);\n const to = getAddress(recipient);\n const out = new Map<bigint, bigint>();\n const add = (id: bigint, amount: bigint) => out.set(id, (out.get(id) ?? 0n) + amount);\n for (const log of logs) {\n if (getAddress(log.address) !== contract) continue;\n const [t0, t1, t2, t3] = log.topics;\n if (t0 === TRANSFER_TOPIC && log.topics.length === 4) {\n if (topicAddress(t1) !== zeroAddress || topicAddress(t2) !== to || !t3) continue;\n add(BigInt(t3), 1n);\n } else if (t0 === TRANSFER_SINGLE_TOPIC && log.topics.length === 4) {\n if (topicAddress(t2) !== zeroAddress || topicAddress(t3) !== to) continue;\n const [id, value] = decodeAbiParameters([{ type: 'uint256' }, { type: 'uint256' }], log.data);\n add(id, value);\n } else if (t0 === TRANSFER_BATCH_TOPIC && log.topics.length === 4) {\n if (topicAddress(t2) !== zeroAddress || topicAddress(t3) !== to) continue;\n const [ids, values] = decodeAbiParameters([{ type: 'uint256[]' }, { type: 'uint256[]' }], log.data);\n if (ids.length !== values.length) continue;\n ids.forEach((id, i) => add(id, values[i]!));\n }\n }\n return [...out].map(([tokenId, amount]) => ({ contract, tokenId, amount }));\n}\n","// Manifold's mint record for a claim mint, the same request the Manifold claim widget sends\n// (claim-widgets src/api/apps.ts postTransaction, called from src/lib/transactionsFlow/steps/mint.tsx).\n//\n// After a mint transaction is sent, the widget calls POST {apps API}/public/instance/tx with appId, instanceId and\n// hash in the query string. dropkit sends the same request so its claim mints are recorded like the widget's.\n//\n// Fire and forget: it never throws, never delays the mint, and is not cancelled by unmount (keepalive, no lifetime\n// signal), so a collector who closes the tab right after sending still gets recorded.\nimport type { Hex } from './types';\n\nexport const APPS_API = 'https://apps.api.manifoldxyz.dev';\n\ntype Fetch = typeof fetch;\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null;\n\n/** instanceId -> the claim's Studio appId, for the page lifetime. Failed lookups are evicted so the next mint retries. */\nconst appIds = new Map<string, Promise<string>>();\n\nasync function loadAppId(fetchFn: Fetch, instanceId: string): Promise<string> {\n const res = await fetchFn(`${APPS_API}/public/instance/data?id=${encodeURIComponent(instanceId)}`, { keepalive: true });\n if (!res.ok) throw new Error(`instance data HTTP ${res.status}`);\n const body: unknown = await res.json();\n const appId = isRecord(body) ? body.appId : undefined;\n if (typeof appId !== 'number' && typeof appId !== 'string') throw new Error('instance data has no appId');\n return String(appId);\n}\n\nfunction appIdFor(fetchFn: Fetch, instanceId: string): Promise<string> {\n const hit = appIds.get(instanceId);\n if (hit) return hit;\n const p = loadAppId(fetchFn, instanceId);\n appIds.set(instanceId, p);\n p.catch(() => {\n if (appIds.get(instanceId) === p) appIds.delete(instanceId);\n });\n return p;\n}\n\n/**\n * Sends Manifold's mint record for a claim mint. `instanceId` is the claim's instance id (the widget sends\n * publicData.claimIndex, falling back to the Studio id; both equal the on-chain claim index dropkit is configured\n * with). The appId is looked up from the public instance data. If that lookup fails the record still goes out with\n * an empty appId: the hash identifies the mint, and the request keeps the widget's shape (appId key present).\n */\nexport function recordClaimMint(args: { instanceId: string; hash: Hex; fetch?: Fetch }): Promise<void> {\n const fetchFn: Fetch = args.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const send = async () => {\n let appId = '';\n try {\n appId = await appIdFor(fetchFn, args.instanceId);\n } catch {\n /* send with an empty appId */\n }\n const query = new URLSearchParams({ appId, instanceId: args.instanceId, hash: args.hash });\n await fetchFn(`${APPS_API}/public/instance/tx?${query.toString()}`, { method: 'POST', keepalive: true });\n };\n return send().catch(() => undefined);\n}\n\n/** Tests only. */\nexport const resetMintRecordCache = (): void => appIds.clear();\n"],"mappings":"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","names":["hasCode","code","next","id","formatUnits","getAddress","d","money","formatUnits","getAddress","base","code","text","getAddress","zeroAddress","isRecord"]}
|
|
@@ -1368,6 +1368,43 @@ function parseMintReceipt(logs, { tokenContract, recipient }) {
|
|
|
1368
1368
|
return [...out].map(([tokenId, amount]) => ({ contract, tokenId, amount }));
|
|
1369
1369
|
}
|
|
1370
1370
|
|
|
1371
|
+
// src/core/mint-record.ts
|
|
1372
|
+
var APPS_API = "https://apps.api.manifoldxyz.dev";
|
|
1373
|
+
var isRecord2 = (v) => typeof v === "object" && v !== null;
|
|
1374
|
+
var appIds = /* @__PURE__ */ new Map();
|
|
1375
|
+
async function loadAppId(fetchFn, instanceId) {
|
|
1376
|
+
const res = await fetchFn(`${APPS_API}/public/instance/data?id=${encodeURIComponent(instanceId)}`, { keepalive: true });
|
|
1377
|
+
if (!res.ok) throw new Error(`instance data HTTP ${res.status}`);
|
|
1378
|
+
const body = await res.json();
|
|
1379
|
+
const appId = isRecord2(body) ? body.appId : void 0;
|
|
1380
|
+
if (typeof appId !== "number" && typeof appId !== "string") throw new Error("instance data has no appId");
|
|
1381
|
+
return String(appId);
|
|
1382
|
+
}
|
|
1383
|
+
function appIdFor(fetchFn, instanceId) {
|
|
1384
|
+
const hit = appIds.get(instanceId);
|
|
1385
|
+
if (hit) return hit;
|
|
1386
|
+
const p = loadAppId(fetchFn, instanceId);
|
|
1387
|
+
appIds.set(instanceId, p);
|
|
1388
|
+
p.catch(() => {
|
|
1389
|
+
if (appIds.get(instanceId) === p) appIds.delete(instanceId);
|
|
1390
|
+
});
|
|
1391
|
+
return p;
|
|
1392
|
+
}
|
|
1393
|
+
function recordClaimMint(args) {
|
|
1394
|
+
const fetchFn = _nullishCoalesce(args.fetch, () => ( ((input, init) => globalThis.fetch(input, init))));
|
|
1395
|
+
const send = async () => {
|
|
1396
|
+
let appId = "";
|
|
1397
|
+
try {
|
|
1398
|
+
appId = await appIdFor(fetchFn, args.instanceId);
|
|
1399
|
+
} catch (e6) {
|
|
1400
|
+
}
|
|
1401
|
+
const query = new URLSearchParams({ appId, instanceId: args.instanceId, hash: args.hash });
|
|
1402
|
+
await fetchFn(`${APPS_API}/public/instance/tx?${query.toString()}`, { method: "POST", keepalive: true });
|
|
1403
|
+
};
|
|
1404
|
+
return send().catch(() => void 0);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
|
|
1371
1408
|
|
|
1372
1409
|
|
|
1373
1410
|
|
|
@@ -1402,5 +1439,5 @@ function parseMintReceipt(logs, { tokenContract, recipient }) {
|
|
|
1402
1439
|
|
|
1403
1440
|
|
|
1404
1441
|
|
|
1405
|
-
exports.friendlyErrorMessage = friendlyErrorMessage; exports.UNSUPPORTED_REASONS = UNSUPPORTED_REASONS; exports.REASON_CODES = REASON_CODES; exports.MintError = MintError; exports.isMintError = isMintError; exports.isRejection = isRejection; exports.toReason = toReason; exports.chainName = chainName; exports.getChain = getChain; exports.createReadClient = createReadClient; exports.loadConnectWidget = loadConnectWidget; exports.openConnectModal = openConnectModal; exports.getAccount = getAccount; exports.subscribeAccount = subscribeAccount; exports.getWalletClient = getWalletClient; exports.waitForDeposit = waitForDeposit; exports.getConnectedBalance = getConnectedBalance; exports.switchToChain = switchToChain; exports.requestSwitch = requestSwitch; exports.requestAddChain = requestAddChain; exports.getWalletProvider = getWalletProvider; exports.MINT_STATES = MINT_STATES; exports.CLICKABLE_STATES = CLICKABLE_STATES; exports.IN_FLIGHT_STATES = IN_FLIGHT_STATES; exports.MAX_QUANTITY = MAX_QUANTITY; exports.initialState = initialState; exports.reducer = reducer; exports.selectMaxQuantity = selectMaxQuantity; exports.selectTotal = selectTotal; exports.canAct = canAct; exports.findExtension = findExtension; exports.manifoldClaimAdapter = manifoldClaimAdapter; exports.parseMintReceipt = parseMintReceipt;
|
|
1406
|
-
//# sourceMappingURL=chunk-
|
|
1442
|
+
exports.friendlyErrorMessage = friendlyErrorMessage; exports.UNSUPPORTED_REASONS = UNSUPPORTED_REASONS; exports.REASON_CODES = REASON_CODES; exports.MintError = MintError; exports.isMintError = isMintError; exports.isRejection = isRejection; exports.toReason = toReason; exports.chainName = chainName; exports.getChain = getChain; exports.createReadClient = createReadClient; exports.loadConnectWidget = loadConnectWidget; exports.openConnectModal = openConnectModal; exports.getAccount = getAccount; exports.subscribeAccount = subscribeAccount; exports.getWalletClient = getWalletClient; exports.waitForDeposit = waitForDeposit; exports.getConnectedBalance = getConnectedBalance; exports.switchToChain = switchToChain; exports.requestSwitch = requestSwitch; exports.requestAddChain = requestAddChain; exports.getWalletProvider = getWalletProvider; exports.MINT_STATES = MINT_STATES; exports.CLICKABLE_STATES = CLICKABLE_STATES; exports.IN_FLIGHT_STATES = IN_FLIGHT_STATES; exports.MAX_QUANTITY = MAX_QUANTITY; exports.initialState = initialState; exports.reducer = reducer; exports.selectMaxQuantity = selectMaxQuantity; exports.selectTotal = selectTotal; exports.canAct = canAct; exports.findExtension = findExtension; exports.manifoldClaimAdapter = manifoldClaimAdapter; exports.parseMintReceipt = parseMintReceipt; exports.recordClaimMint = recordClaimMint;
|
|
1443
|
+
//# sourceMappingURL=chunk-X4P6BUV4.cjs.map
|