@manifoldxyz/dropkit 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/cart.cjs +38 -36
- package/dist/cart.cjs.map +1 -1
- package/dist/cart.js +12 -10
- package/dist/cart.js.map +1 -1
- package/dist/{chunk-MXKJAZDW.js → chunk-VHAAGH7Z.js} +60 -642
- package/dist/chunk-VHAAGH7Z.js.map +1 -0
- package/dist/chunk-W7OBZPCY.js +619 -0
- package/dist/chunk-W7OBZPCY.js.map +1 -0
- package/dist/{chunk-X4P6BUV4.cjs → chunk-XWONUCGA.cjs} +46 -628
- package/dist/chunk-XWONUCGA.cjs.map +1 -0
- package/dist/chunk-YGBIJOKQ.cjs +619 -0
- package/dist/chunk-YGBIJOKQ.cjs.map +1 -0
- package/dist/index.cjs +125 -123
- 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 +14 -12
- package/dist/index.js.map +1 -1
- package/dist/status.cjs +570 -0
- package/dist/status.cjs.map +1 -0
- package/dist/status.d.cts +259 -0
- package/dist/status.d.ts +259 -0
- package/dist/status.js +570 -0
- package/dist/status.js.map +1 -0
- package/package.json +11 -1
- package/dist/chunk-MXKJAZDW.js.map +0 -1
- package/dist/chunk-X4P6BUV4.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/dropkit/dropkit/packages/react/dropkit/dist/chunk-XWONUCGA.cjs","../src/core/friendly-errors.ts","../src/core/errors.ts","../src/core/rpc/index.ts","../src/core/adapters/manifold-claim/index.ts","../src/core/adapters/manifold-claim/abis.ts","../src/core/adapters/manifold-claim/merkle.ts"],"names":["hasCode"],"mappings":"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","file":"/home/runner/work/dropkit/dropkit/packages/react/dropkit/dist/chunk-XWONUCGA.cjs","sourcesContent":[null,"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 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","// 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 Abi,\n type Hex,\n type PublicClient,\n type ReadContractReturnType,\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\nexport type 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\nexport function 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\n/** The getClaim fragment for an extension generation. Used by callers that batch the call themselves (status). */\nexport const CLAIM_ABIS: Readonly<Record<ExtensionAbi, Abi>> = {\n Claim721V5Optimization: CLAIM_721_V5_ABI,\n Claim1155V5Optimization: CLAIM_1155_V5_ABI,\n Claim721V7: CLAIM_721_V7_ABI,\n Claim1155V7: CLAIM_1155_V7_ABI,\n};\n\n/** Decodes the value getClaim returned for `abi` (already ABI-decoded, e.g. a multicall result). */\nexport function decodeClaim(abi: ExtensionAbi, raw: unknown): Claim {\n switch (abi) {\n case 'Claim721V5Optimization':\n return { ...base(raw as ReadContractReturnType<typeof CLAIM_721_V5_ABI, 'getClaim'>), signingAddress: null, tokenId: null };\n case 'Claim1155V5Optimization': {\n const c = raw as ReadContractReturnType<typeof CLAIM_1155_V5_ABI, 'getClaim'>;\n return { ...base(c), signingAddress: null, tokenId: c.tokenId };\n }\n case 'Claim721V7': {\n const c = raw as ReadContractReturnType<typeof CLAIM_721_V7_ABI, 'getClaim'>;\n return { ...base(c), signingAddress: c.signingAddress, tokenId: null };\n }\n case 'Claim1155V7': {\n const c = raw as ReadContractReturnType<typeof CLAIM_1155_V7_ABI, 'getClaim'>;\n return { ...base(c), signingAddress: c.signingAddress, tokenId: c.tokenId };\n }\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"]}
|