@happyvertical/payments 0.74.8
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/AGENT.md +33 -0
- package/LICENSE +7 -0
- package/README.md +97 -0
- package/dist/adapters/base-usdc.d.ts +85 -0
- package/dist/adapters/base-usdc.d.ts.map +1 -0
- package/dist/adapters/base-usdc.js +1182 -0
- package/dist/adapters/base-usdc.js.map +1 -0
- package/dist/adapters/btc.d.ts +63 -0
- package/dist/adapters/btc.d.ts.map +1 -0
- package/dist/adapters/btc.js +843 -0
- package/dist/adapters/btc.js.map +1 -0
- package/dist/adapters/stripe.d.ts +54 -0
- package/dist/adapters/stripe.d.ts.map +1 -0
- package/dist/adapters/stripe.js +696 -0
- package/dist/adapters/stripe.js.map +1 -0
- package/dist/chunks/errors-BgFC46qQ.js +45 -0
- package/dist/chunks/errors-BgFC46qQ.js.map +1 -0
- package/dist/chunks/shared-DGHSqDQT.js +392 -0
- package/dist/chunks/shared-DGHSqDQT.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/factory.d.ts +13 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/shared.d.ts +32 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/testing/conformance.d.ts +33 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +114 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/types.d.ts +174 -0
- package/dist/types.d.ts.map +1 -0
- package/metadata.json +30 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-usdc.js","sources":["../../src/adapters/base-usdc.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport {\n PaymentConfigurationError,\n PaymentProviderError,\n PaymentVerificationError,\n} from '../errors.js';\nimport {\n currencyMinorUnitDecimals,\n decimalToAtomicUnits,\n decimalToMinorUnitAmount,\n type FetchLike,\n getFetch,\n minorUnitsToDecimal,\n normalizeCurrency,\n normalizeDate,\n normalizeFutureDate,\n normalizeMaxStoredPaymentOptions,\n normalizeMinorUnitAmount,\n normalizeNonEmptyString,\n normalizePositiveMinorUnitAmount,\n normalizeUrlString,\n pollPaymentStatus,\n readJsonResponse,\n rememberPaymentOption,\n} from '../shared.js';\nimport type {\n CreatePaymentOptionInput,\n PaymentBackend,\n PaymentBackendCapabilities,\n PaymentEvent,\n PaymentOption,\n PaymentStatusContext,\n PaymentStatusResult,\n PayoutResult,\n RefundPaymentInput,\n RefundResult,\n SendPayoutInput,\n VerifyX402ProofInput,\n WatchPaymentInput,\n X402VerificationResult,\n} from '../types.js';\n\nexport const BASE_USDC_BACKEND_ID = 'base-usdc';\nexport const BASE_MAINNET_CHAIN_ID = 8453;\nexport const BASE_MAINNET_CAIP2 = 'eip155:8453';\nexport const BASE_USDC_CONTRACT = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';\nexport const USDC_DECIMALS = 6;\n\nconst TRANSFER_TOPIC =\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\nconst DEFAULT_LOG_LOOKBACK_BLOCKS = 10_000n;\nconst DEFAULT_MAX_SEEN_X402_TRANSACTION_IDS = 50_000;\n\nexport interface BaseUsdcAddressDeriverInput {\n quoteId: string;\n index: number;\n indexes: number[];\n path: string;\n}\n\nexport interface BaseUsdcSendTransactionInput {\n destination: string;\n amount: number;\n amountAtomic: string;\n currency: 'USDC';\n tokenAddress: string;\n memo?: string;\n quoteId?: string;\n idempotencyKey?: string;\n metadata?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface BaseUsdcAdapterOptions {\n rpcUrl: string;\n fetch?: FetchLike;\n usdcContractAddress?: string;\n masterXpub?: string;\n derivationPathPrefix?: string;\n addressDeriver?: (\n input: BaseUsdcAddressDeriverInput,\n ) => string | Promise<string>;\n addressIndexForQuote?: (quoteId: string) => number;\n fromBlock?: string | number | bigint;\n confirmations?: number;\n pollIntervalMs?: number;\n maxStoredPaymentOptions?: number;\n /**\n * Opt in only when each quote has a unique deposit address and the\n * returned metadata.searchStartBlock is persisted with quote state.\n */\n allowCumulativeTransferMatching?: boolean;\n x402FacilitatorUrl?: string;\n sendTransaction?: (\n input: BaseUsdcSendTransactionInput,\n ) => Promise<{ transactionId: string; raw?: unknown }>;\n}\n\ninterface JsonRpcResponse<T> {\n result?: T;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface RpcLog {\n address: string;\n blockNumber?: string;\n data: string;\n removed?: boolean;\n topics: string[];\n transactionHash?: string;\n}\n\ninterface RpcReceipt {\n blockNumber?: string;\n logs?: RpcLog[];\n status?: string;\n transactionHash?: string;\n}\n\ninterface StoredBaseOption extends PaymentOption {\n expectedAmountAtomic: string;\n searchStartBlock: bigint;\n}\n\nexport class BaseUsdcAdapter implements PaymentBackend {\n readonly capabilities: PaymentBackendCapabilities;\n\n private readonly fetch: FetchLike;\n private readonly rpcUrl: string;\n private readonly usdcContractAddress: string;\n private readonly confirmations: number;\n private readonly configuredFromBlock: string | undefined;\n private readonly masterXpub: string | undefined;\n private readonly derivationPathPrefix: string;\n private readonly x402FacilitatorUrl: string | undefined;\n private readonly maxStoredPaymentOptions: number;\n private readonly allowCumulativeTransferMatching: boolean;\n private readonly optionsByQuote = new Map<string, StoredBaseOption>();\n private readonly seenX402TransactionIds = new Set<string>();\n private rpcId = 0;\n\n constructor(private readonly options: BaseUsdcAdapterOptions) {\n if (typeof options.rpcUrl !== 'string' || !options.rpcUrl.trim()) {\n throw new PaymentConfigurationError(\n 'BaseUsdcAdapter requires an RPC URL.',\n );\n }\n\n this.masterXpub =\n options.masterXpub === undefined\n ? undefined\n : normalizeNonEmptyString(options.masterXpub, 'Base USDC masterXpub');\n this.derivationPathPrefix = normalizeDerivationPathPrefix(\n options.derivationPathPrefix ?? 'm/0',\n );\n\n if (!this.masterXpub && !options.addressDeriver) {\n throw new PaymentConfigurationError(\n 'BaseUsdcAdapter requires masterXpub or addressDeriver.',\n );\n }\n\n this.fetch = getFetch(options.fetch);\n this.maxStoredPaymentOptions = normalizeMaxStoredPaymentOptions(\n options.maxStoredPaymentOptions,\n 'BaseUsdcAdapter maxStoredPaymentOptions',\n );\n this.allowCumulativeTransferMatching =\n options.allowCumulativeTransferMatching === true;\n this.rpcUrl = normalizeUrlString(options.rpcUrl, 'BaseUsdcAdapter rpcUrl');\n this.usdcContractAddress = normalizeAddress(\n options.usdcContractAddress ?? BASE_USDC_CONTRACT,\n );\n this.confirmations = normalizeConfirmationCount(\n options.confirmations ?? 1,\n 'BaseUsdcAdapter confirmations',\n );\n this.configuredFromBlock =\n options.fromBlock === undefined\n ? undefined\n : normalizeFromBlock(options.fromBlock);\n this.x402FacilitatorUrl =\n options.x402FacilitatorUrl === undefined\n ? undefined\n : normalizeUrlString(\n options.x402FacilitatorUrl,\n 'BaseUsdcAdapter x402FacilitatorUrl',\n ).replace(/\\/$/, '');\n this.capabilities = {\n id: BASE_USDC_BACKEND_ID,\n displayName: 'Base USDC',\n settlementCurrency: 'USDC',\n supportedSettlementCurrencies: ['USDC'],\n chain: 'base',\n settlementShape: 'address',\n x402Capable: true,\n confirmationLatency: {\n expectedSeconds: 2,\n minConfirmations: this.confirmations,\n description: 'Base L2 USDC transfer confirmation',\n },\n supportsRefunds: true,\n supportsPayouts: true,\n supportsWebhooks: false,\n metadata: {\n chainId: BASE_MAINNET_CHAIN_ID,\n caip2Network: BASE_MAINNET_CAIP2,\n usdcContractAddress: this.usdcContractAddress,\n },\n };\n }\n\n async createPaymentOption(\n input: CreatePaymentOptionInput,\n ): Promise<PaymentOption> {\n const quoteId = normalizeNonEmptyString(input.quoteId, 'Base USDC quoteId');\n const expiresAt = normalizeFutureDate(input.expiresAt, 'Base USDC expiry');\n const currency = normalizeCurrency(input.currency, 'Base USDC');\n const amount = normalizePositiveMinorUnitAmount(\n input.amount,\n 'Base USDC amount',\n );\n const expectedAmountAtomic = amountToUsdcAtomicUnits(\n amount,\n currency,\n 'Base USDC amount',\n );\n const settlementAmount = decimalToMinorUnitAmount(\n BigInt(expectedAmountAtomic),\n USDC_DECIMALS,\n 'Base USDC settlement',\n );\n const configuredIndex = this.options.addressIndexForQuote?.(quoteId);\n const indexes =\n configuredIndex === undefined\n ? quoteIdToDerivationIndexes(quoteId)\n : [normalizeDerivationIndex(configuredIndex)];\n const index = indexes[0] ?? 0;\n const path = `${this.derivationPathPrefix}/${indexes.join('/')}`;\n const payTo = normalizeAddress(\n await this.deriveAddress({\n quoteId,\n index,\n indexes,\n path,\n }),\n );\n const searchStartBlock = await this.getCurrentBlockNumber();\n const option: PaymentOption = {\n backendId: this.capabilities.id,\n quoteId,\n payTo,\n settlementShape: 'address',\n settlementCurrency: 'USDC',\n settlementAmount,\n amount,\n currency,\n expiresAt,\n paymentUri: buildUsdcPaymentUri({\n tokenAddress: this.usdcContractAddress,\n payTo,\n amountAtomic: expectedAmountAtomic,\n }),\n metadata: {\n derivationIndex: index,\n derivationIndexes: indexes,\n derivationPath: path,\n caip2Network: BASE_MAINNET_CAIP2,\n tokenAddress: this.usdcContractAddress,\n searchStartBlock: toHexQuantity(searchStartBlock),\n },\n };\n\n rememberPaymentOption(\n this.optionsByQuote,\n quoteId,\n { ...option, expectedAmountAtomic, searchStartBlock },\n this.maxStoredPaymentOptions,\n );\n\n return option;\n }\n\n watchPayment(input: WatchPaymentInput): AsyncIterable<PaymentEvent> {\n return pollPaymentStatus(\n {\n ...input,\n pollIntervalMs:\n input.pollIntervalMs ?? this.options.pollIntervalMs ?? 2_000,\n },\n () => this.getStatus(input.quoteId, input.payTo, input.statusContext),\n );\n }\n\n async getStatus(\n quoteId: string,\n payTo: string,\n context: PaymentStatusContext = {},\n ): Promise<PaymentStatusResult> {\n const normalizedQuoteId = normalizeNonEmptyString(\n quoteId,\n 'Base USDC quoteId',\n );\n const normalizedPayTo = normalizeAddress(payTo);\n const option = this.optionsByQuote.get(normalizedQuoteId);\n const expectedAmountAtomic = resolveExpectedUsdcAmount(option, context);\n const contextSearchStartBlock =\n context.searchStartBlock === undefined\n ? undefined\n : parseHexQuantity(normalizeFromBlock(context.searchStartBlock));\n const searchStartBlock =\n option?.searchStartBlock ?? contextSearchStartBlock;\n\n if (\n !option &&\n expectedAmountAtomic !== undefined &&\n searchStartBlock === undefined &&\n this.configuredFromBlock === undefined\n ) {\n throw new PaymentConfigurationError(\n 'Base USDC getStatus requires statusContext.searchStartBlock when checking stateless payment status without a configured fromBlock.',\n );\n }\n\n const logs = await this.getTransferLogs(normalizedPayTo, searchStartBlock);\n const matchMinBlock =\n searchStartBlock ?? configuredFromBlockMinBlock(this.configuredFromBlock);\n const matchingTransfer =\n expectedAmountAtomic === undefined\n ? undefined\n : this.allowCumulativeTransferMatching\n ? pickCumulativeTransferMatch(\n logs,\n expectedAmountAtomic,\n undefined,\n matchMinBlock,\n )\n : pickSingleTransferMatch(\n logs,\n expectedAmountAtomic,\n undefined,\n matchMinBlock,\n );\n\n if (!matchingTransfer) {\n const expiresAt =\n option?.expiresAt ??\n (context.expiresAt === undefined\n ? undefined\n : normalizeDate(context.expiresAt));\n return {\n backendId: this.capabilities.id,\n quoteId: normalizedQuoteId,\n payTo: normalizedPayTo,\n status: expiresAt && expiresAt < new Date() ? 'expired' : 'pending',\n settlementCurrency: 'USDC',\n settlementAmount:\n option?.settlementAmount ??\n (context.settlementAmount === undefined\n ? undefined\n : normalizeMinorUnitAmount(\n context.settlementAmount,\n 'Base USDC settlement status',\n )),\n amount:\n option?.amount ??\n (context.amount === undefined\n ? undefined\n : normalizeMinorUnitAmount(context.amount, 'Base USDC status')),\n currency:\n option?.currency ??\n (context.currency === undefined\n ? undefined\n : normalizeCurrency(context.currency, 'Base USDC status')),\n requiredConfirmations: this.confirmations,\n updatedAt: new Date(),\n };\n }\n\n const currentBlock = await this.getCurrentBlockNumber();\n const blockNumber = readLogBlockNumber(matchingTransfer.latestLog);\n const confirmations = calculateConfirmations(currentBlock, blockNumber);\n const requiredConfirmations = this.confirmations;\n const receivedAmountAtomic = decimalToMinorUnitAmount(\n matchingTransfer.amountAtomic,\n USDC_DECIMALS,\n 'Base USDC received',\n );\n\n return {\n backendId: this.capabilities.id,\n quoteId: normalizedQuoteId,\n payTo: normalizedPayTo,\n status:\n confirmations >= requiredConfirmations ? 'confirmed' : 'processing',\n settlementCurrency: 'USDC',\n settlementAmount:\n option?.settlementAmount ??\n (context.settlementAmount === undefined\n ? undefined\n : normalizeMinorUnitAmount(\n context.settlementAmount,\n 'Base USDC settlement status',\n )),\n receivedAmount: receivedAmountAtomic,\n amount:\n option?.amount ??\n (context.amount === undefined\n ? undefined\n : normalizeMinorUnitAmount(context.amount, 'Base USDC status')),\n currency:\n option?.currency ??\n (context.currency === undefined\n ? undefined\n : normalizeCurrency(context.currency, 'Base USDC status')),\n requiredConfirmations,\n confirmations,\n transactionId: matchingTransfer.latestLog.transactionHash,\n updatedAt: new Date(),\n raw: matchingTransfer.latestLog,\n };\n }\n\n async verifyX402Proof(\n input: VerifyX402ProofInput,\n ): Promise<X402VerificationResult> {\n const quoteId = normalizeNonEmptyString(input.quoteId, 'Base USDC quoteId');\n let payload: unknown;\n\n try {\n payload = decodePaymentHeader(input.paymentHeader);\n } catch (error) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n reason: 'x402 payment header could not be decoded.',\n raw: {\n paymentHeader: input.paymentHeader,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n\n const transactionId = readX402PayloadString(payload, [\n 'transactionHash',\n 'txHash',\n 'tx',\n 'hash',\n ])?.trim();\n\n if (this.x402FacilitatorUrl) {\n return this.verifyWithFacilitator(input, payload);\n }\n\n if (!transactionId) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n reason:\n 'x402 proof did not include a transaction hash and no facilitator URL is configured.',\n raw: payload,\n };\n }\n\n if (!isEvmTransactionHash(transactionId)) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: 'x402 proof transaction hash was invalid.',\n raw: payload,\n };\n }\n\n const requirementError = validateX402PayloadRequirements(payload, input);\n\n if (requirementError) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: requirementError,\n raw: payload,\n };\n }\n\n const expectedAmountAtomic = amountToUsdcAtomicUnits(\n normalizePositiveMinorUnitAmount(input.amount, 'Base USDC x402 amount'),\n normalizeCurrency(input.currency, 'Base USDC x402'),\n 'Base USDC x402 amount',\n );\n\n return this.verifyX402Receipt(\n input,\n payload,\n quoteId,\n transactionId,\n expectedAmountAtomic,\n );\n }\n\n async sendPayout(input: SendPayoutInput): Promise<PayoutResult> {\n if (input.currency !== undefined) {\n const currency = normalizeNonEmptyString(\n input.currency,\n 'Base USDC payout currency',\n );\n\n if (currency.toUpperCase() !== 'USDC') {\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter can only send USDC payouts, received ${input.currency}.`,\n );\n }\n }\n\n if (!this.options.sendTransaction) {\n throw new PaymentConfigurationError(\n 'BaseUsdcAdapter sendPayout requires a sendTransaction callback.',\n );\n }\n\n const amount = normalizePositiveMinorUnitAmount(\n input.amount,\n 'Base USDC payout amount',\n );\n const amountAtomic = String(amount);\n const destination = normalizeAddress(input.destination);\n const quoteId =\n input.quoteId === undefined\n ? undefined\n : normalizeNonEmptyString(input.quoteId, 'Base USDC payout quoteId');\n const idempotencyKey =\n input.idempotencyKey === undefined\n ? undefined\n : normalizeNonEmptyString(\n input.idempotencyKey,\n 'Base USDC payout idempotencyKey',\n );\n const result = await this.options.sendTransaction({\n destination,\n amount,\n amountAtomic,\n currency: 'USDC',\n tokenAddress: this.usdcContractAddress,\n memo: input.memo,\n quoteId,\n idempotencyKey,\n metadata: input.metadata,\n });\n\n return {\n backendId: this.capabilities.id,\n status: 'submitted',\n transactionId: result.transactionId,\n destination,\n amount,\n currency: 'USDC',\n raw: result.raw,\n };\n }\n\n async refundPayment(input: RefundPaymentInput): Promise<RefundResult> {\n if (input.currency !== undefined) {\n const currency = normalizeNonEmptyString(\n input.currency,\n 'Base USDC refund currency',\n );\n\n if (currency.toUpperCase() !== 'USDC') {\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter refunds require USDC currency when specified, received ${input.currency}.`,\n );\n }\n }\n\n if (!input.destination) {\n throw new PaymentConfigurationError(\n 'Base USDC refunds require a destination payer address.',\n );\n }\n\n if (input.amount === undefined) {\n throw new PaymentConfigurationError(\n 'Base USDC refunds require an amount.',\n );\n }\n\n const payout = await this.sendPayout({\n destination: input.destination,\n amount: input.amount,\n currency: 'USDC',\n idempotencyKey: input.idempotencyKey,\n memo: input.reason,\n metadata: input.metadata,\n });\n\n return {\n backendId: this.capabilities.id,\n status: 'submitted',\n transactionId: payout.transactionId,\n amount: payout.amount,\n currency: payout.currency,\n raw: payout.raw,\n };\n }\n\n private async deriveAddress(\n input: BaseUsdcAddressDeriverInput,\n ): Promise<string> {\n if (this.options.addressDeriver) {\n return this.options.addressDeriver(input);\n }\n\n if (!this.masterXpub) {\n throw new PaymentConfigurationError(\n 'BaseUsdcAdapter requires masterXpub or addressDeriver.',\n );\n }\n\n return deriveBaseUsdcAddress({\n masterXpub: this.masterXpub,\n path: input.path,\n });\n }\n\n private async getTransferLogs(\n payTo: string,\n requiredFromBlock?: bigint,\n ): Promise<RpcLog[]> {\n const fromBlock =\n this.configuredFromBlock ??\n (await this.getDefaultFromBlock(requiredFromBlock));\n const logs = await this.rpc<unknown>('eth_getLogs', [\n {\n address: this.usdcContractAddress,\n fromBlock,\n toBlock: 'latest',\n topics: [TRANSFER_TOPIC, null, addressToTopic(payTo)],\n },\n ]);\n\n return Array.isArray(logs) ? (logs as RpcLog[]) : [];\n }\n\n private async getDefaultFromBlock(\n requiredFromBlock?: bigint,\n ): Promise<string> {\n const currentBlock = await this.getCurrentBlockNumber();\n const lookbackStartBlock =\n currentBlock > DEFAULT_LOG_LOOKBACK_BLOCKS\n ? currentBlock - DEFAULT_LOG_LOOKBACK_BLOCKS\n : 0n;\n const startBlock = requiredFromBlock ?? lookbackStartBlock;\n\n return toHexQuantity(startBlock);\n }\n\n private async getCurrentBlockNumber(): Promise<bigint> {\n return parseHexQuantity(await this.rpc<string>('eth_blockNumber', []));\n }\n\n private async rpc<T>(method: string, params: unknown[]): Promise<T> {\n const response = await this.fetch(this.rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: ++this.rpcId,\n method,\n params,\n }),\n });\n const json = await readJsonResponse<JsonRpcResponse<T>>(\n response,\n `Base RPC ${method}`,\n );\n\n if (json.error) {\n throw new PaymentProviderError(\n `Base RPC ${method}: ${json.error.message}`,\n { retryable: json.error.code === -32005 },\n );\n }\n\n return json.result as T;\n }\n\n private async verifyX402Receipt(\n input: VerifyX402ProofInput,\n payload: unknown,\n quoteId: string,\n transactionId: string,\n expectedAmountAtomic: string,\n extraRaw?: Record<string, unknown>,\n ): Promise<X402VerificationResult> {\n if (this.seenX402TransactionIds.has(transactionId)) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: 'x402 transaction has already been verified.',\n raw: { ...extraRaw, payload },\n };\n }\n\n this.seenX402TransactionIds.add(transactionId);\n let keepReplayMarker = false;\n\n try {\n const receipt = await this.rpc<RpcReceipt | null>(\n 'eth_getTransactionReceipt',\n [transactionId],\n );\n const raw = { ...extraRaw, payload, receipt };\n\n if (!receipt) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: 'x402 transaction receipt is not available yet.',\n raw,\n };\n }\n\n if (receipt.status !== '0x1') {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: 'x402 transaction failed onchain.',\n raw,\n };\n }\n\n const blockNumber = parseHexQuantity(receipt.blockNumber ?? '0x0');\n const currentBlock =\n blockNumber > 0n ? await this.getCurrentBlockNumber() : 0n;\n const confirmations = calculateConfirmations(currentBlock, blockNumber);\n\n if (confirmations < this.confirmations) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: `x402 transaction has ${confirmations} confirmations; ${this.confirmations} required.`,\n raw,\n };\n }\n\n const receiptLogs = Array.isArray(receipt.logs) ? receipt.logs : [];\n const matchingLog = pickBestTransferLog(\n receiptLogs.filter(\n (log) =>\n isRecord(log) &&\n safeNormalizeAddress(log.address) === this.usdcContractAddress,\n ) as RpcLog[],\n expectedAmountAtomic,\n input.payTo,\n 'exact',\n );\n\n if (!matchingLog) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: input.payTo,\n transactionId,\n reason: 'No exact USDC transfer matching the x402 proof.',\n raw,\n };\n }\n\n keepReplayMarker = true;\n trimSeenX402TransactionIds(this.seenX402TransactionIds);\n\n return {\n valid: true,\n backendId: this.capabilities.id,\n quoteId,\n payTo: normalizeAddress(input.payTo),\n transactionId,\n payer: parseTransferLog(matchingLog)?.from,\n amount: decimalToMinorUnitAmount(\n parseHexQuantity(matchingLog.data),\n USDC_DECIMALS,\n 'Base USDC x402 amount',\n ),\n currency: 'USDC',\n network: input.network ?? BASE_MAINNET_CAIP2,\n raw,\n };\n } finally {\n if (!keepReplayMarker) {\n this.seenX402TransactionIds.delete(transactionId);\n }\n }\n }\n\n private async verifyWithFacilitator(\n input: VerifyX402ProofInput,\n payload: unknown,\n ): Promise<X402VerificationResult> {\n const quoteId = normalizeNonEmptyString(input.quoteId, 'Base USDC quoteId');\n\n if (!this.x402FacilitatorUrl) {\n throw new PaymentVerificationError('x402 facilitator URL is missing.');\n }\n\n const maxAmountRequired = amountToUsdcAtomicUnits(\n normalizePositiveMinorUnitAmount(input.amount, 'Base USDC x402 amount'),\n normalizeCurrency(input.currency, 'Base USDC x402'),\n 'Base USDC x402 amount',\n );\n const response = await this.fetch(`${this.x402FacilitatorUrl}/verify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n paymentPayload: payload,\n paymentRequirements: {\n scheme: input.scheme ?? 'exact',\n network: input.network ?? BASE_MAINNET_CAIP2,\n asset: this.usdcContractAddress,\n payTo: normalizeAddress(input.payTo),\n maxAmountRequired,\n resource: input.resource,\n method: input.method,\n },\n }),\n });\n const json = await readJsonResponse<Record<string, unknown>>(\n response,\n 'x402 facilitator verify',\n );\n const valid = readBoolean(json, 'valid') ?? readBoolean(json, 'isValid');\n const transactionId = findNestedString(json, [\n 'transactionHash',\n 'txHash',\n ])?.trim();\n\n if (valid !== true) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: normalizeAddress(input.payTo),\n transactionId,\n network: input.network ?? BASE_MAINNET_CAIP2,\n reason: String(json.reason ?? 'facilitator rejected'),\n raw: json,\n };\n }\n\n if (!transactionId) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: normalizeAddress(input.payTo),\n network: input.network ?? BASE_MAINNET_CAIP2,\n reason: 'x402 facilitator did not return a transaction hash.',\n raw: json,\n };\n }\n\n if (!isEvmTransactionHash(transactionId)) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: normalizeAddress(input.payTo),\n transactionId,\n network: input.network ?? BASE_MAINNET_CAIP2,\n reason: 'x402 facilitator transaction hash was invalid.',\n raw: json,\n };\n }\n\n const requirementError = validateX402PayloadRequirements(payload, input);\n\n if (requirementError) {\n return {\n valid: false,\n backendId: this.capabilities.id,\n quoteId,\n payTo: normalizeAddress(input.payTo),\n transactionId,\n network: input.network ?? BASE_MAINNET_CAIP2,\n reason: requirementError,\n raw: json,\n };\n }\n\n return this.verifyX402Receipt(\n input,\n payload,\n quoteId,\n transactionId,\n maxAmountRequired,\n { facilitator: json },\n );\n }\n}\n\nexport async function deriveBaseUsdcAddress(input: {\n masterXpub: string;\n path: string;\n}): Promise<string> {\n const masterXpub = normalizeNonEmptyString(\n input.masterXpub,\n 'Base USDC masterXpub',\n );\n const path = normalizeNonEmptyString(input.path, 'Base USDC derivation path');\n\n try {\n const [{ HDKey }, { secp256k1 }, { keccak_256 }] = await Promise.all([\n import('@scure/bip32'),\n import('@noble/curves/secp256k1.js'),\n import('@noble/hashes/sha3.js'),\n ]);\n const root = HDKey.fromExtendedKey(masterXpub);\n const child = root.derive(path);\n\n if (!child.publicKey) {\n throw new PaymentConfigurationError(`No public key derived for ${path}.`);\n }\n\n const point = secp256k1.Point.fromBytes(child.publicKey);\n const { x, y } = point.toAffine();\n const publicKey = concatBytes(bigintToFixedBytes(x), bigintToFixedBytes(y));\n const hash = keccak_256(publicKey);\n\n return `0x${bytesToHex(hash.slice(-20))}`;\n } catch (error) {\n if (error instanceof PaymentConfigurationError) {\n throw error;\n }\n\n throw new PaymentConfigurationError(\n 'BIP32 xpub address derivation requires @scure/bip32, @noble/curves, and @noble/hashes.',\n { cause: error },\n );\n }\n}\n\nexport function quoteIdToDerivationIndex(quoteId: string): number {\n return quoteIdToDerivationIndexes(quoteId)[0] ?? 0;\n}\n\nexport function quoteIdToDerivationIndexes(quoteId: string): number[] {\n const normalizedQuoteId = normalizeNonEmptyString(\n quoteId,\n 'Base USDC quoteId',\n );\n const hash = createHash('sha256').update(normalizedQuoteId).digest();\n return [0, 4, 8, 12].map((offset) => hash.readUInt32BE(offset) & 0x7fffffff);\n}\n\nfunction normalizeDerivationIndex(index: number): number {\n if (!Number.isInteger(index) || index < 0 || index > 0x7fffffff) {\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter addressIndexForQuote must return a non-hardened BIP32 child index, received ${String(index)}.`,\n );\n }\n\n return index;\n}\n\nfunction normalizeDerivationPathPrefix(value: string): string {\n if (typeof value !== 'string') {\n throw new PaymentConfigurationError(\n 'BaseUsdcAdapter derivationPathPrefix must be a string.',\n );\n }\n\n const normalized = value.trim().replace(/\\/+$/, '');\n\n if (!normalized) {\n throw new PaymentConfigurationError(\n 'BaseUsdcAdapter derivationPathPrefix must not be empty when configured.',\n );\n }\n\n return normalized;\n}\n\nfunction normalizeConfirmationCount(value: number, label: string): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new PaymentConfigurationError(\n `${label} must be a non-negative integer, received ${String(value)}.`,\n );\n }\n\n return value;\n}\n\nfunction readBoolean(\n value: Record<string, unknown>,\n key: string,\n): boolean | undefined {\n const item = value[key];\n\n return typeof item === 'boolean' ? item : undefined;\n}\n\nfunction normalizeFromBlock(value: string | number | bigint): string {\n if (typeof value === 'bigint') {\n if (value < 0n) {\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter fromBlock must be a non-negative JSON-RPC block tag or quantity, received ${String(value)}.`,\n );\n }\n\n return toHexQuantity(value);\n }\n\n if (typeof value === 'number') {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter fromBlock must be a non-negative JSON-RPC block tag or quantity, received ${String(value)}.`,\n );\n }\n\n return toHexQuantity(BigInt(value));\n }\n\n if (typeof value !== 'string') {\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter fromBlock must be a non-negative JSON-RPC block tag or quantity, received ${String(value)}.`,\n );\n }\n\n const normalized = value.trim();\n\n if (['earliest', 'latest', 'pending'].includes(normalized)) {\n return normalized;\n }\n\n if (/^0x[0-9a-fA-F]+$/.test(normalized)) {\n return normalized.toLowerCase();\n }\n\n throw new PaymentConfigurationError(\n `BaseUsdcAdapter fromBlock must be a non-negative JSON-RPC block tag or quantity, received ${String(value)}.`,\n );\n}\n\nfunction configuredFromBlockMinBlock(value: string | undefined): bigint {\n if (\n value === undefined ||\n ['earliest', 'latest', 'pending'].includes(value)\n ) {\n return 0n;\n }\n\n return parseHexQuantity(value);\n}\n\nfunction calculateConfirmations(\n currentBlock: bigint,\n blockNumber: bigint,\n): number {\n if (blockNumber <= 0n || currentBlock < blockNumber) {\n return 0;\n }\n\n const confirmations = currentBlock - blockNumber + 1n;\n\n return confirmations > BigInt(Number.MAX_SAFE_INTEGER)\n ? Number.MAX_SAFE_INTEGER\n : Number(confirmations);\n}\n\nfunction resolveExpectedUsdcAmount(\n option: StoredBaseOption | undefined,\n context: PaymentStatusContext,\n): string | undefined {\n if (option) {\n return option.expectedAmountAtomic;\n }\n\n if (context.settlementAmount !== undefined) {\n return String(\n normalizePositiveMinorUnitAmount(\n context.settlementAmount,\n 'Base USDC expected amount',\n ),\n );\n }\n\n if (context.amount === undefined || context.currency === undefined) {\n return undefined;\n }\n\n return amountToUsdcAtomicUnits(\n normalizePositiveMinorUnitAmount(\n context.amount,\n 'Base USDC expected amount',\n ),\n normalizeCurrency(context.currency, 'Base USDC expected amount'),\n 'Base USDC expected amount',\n );\n}\n\nfunction amountToUsdcAtomicUnits(\n amount: number,\n currency: string,\n context: string,\n): string {\n const normalizedCurrency = normalizeCurrency(currency, context);\n\n if (!['USD', 'USDC'].includes(normalizedCurrency)) {\n throw new PaymentConfigurationError(\n `${context} currency must be USD or USDC for Base USDC settlement, received ${currency}.`,\n );\n }\n\n const decimalAmount = minorUnitsToDecimal(\n amount,\n currencyMinorUnitDecimals(normalizedCurrency),\n );\n\n return decimalToAtomicUnits(decimalAmount, USDC_DECIMALS);\n}\n\nfunction pickBestTransferLog(\n logs: RpcLog[],\n expectedAmountAtomic: string,\n payTo?: string,\n comparison: 'atLeast' | 'exact' = 'atLeast',\n minBlockNumber = 0n,\n): RpcLog | undefined {\n const expected = BigInt(expectedAmountAtomic);\n\n return logs.find((log) => {\n const transfer = parseTransferLog(log);\n\n if (!transfer || log.removed) {\n return false;\n }\n\n if (readLogBlockNumber(log) < minBlockNumber) {\n return false;\n }\n\n if (payTo && transfer.to !== normalizeAddress(payTo)) {\n return false;\n }\n\n return comparison === 'exact'\n ? transfer.amountAtomic === expected\n : transfer.amountAtomic >= expected;\n });\n}\n\nfunction pickSingleTransferMatch(\n logs: RpcLog[],\n expectedAmountAtomic: string,\n payTo?: string,\n minBlockNumber = 0n,\n): { amountAtomic: bigint; latestLog: RpcLog } | undefined {\n const log = pickBestTransferLog(\n logs,\n expectedAmountAtomic,\n payTo,\n 'atLeast',\n minBlockNumber,\n );\n const transfer = log ? parseTransferLog(log) : undefined;\n\n return log && transfer\n ? { amountAtomic: transfer.amountAtomic, latestLog: log }\n : undefined;\n}\n\nfunction pickCumulativeTransferMatch(\n logs: RpcLog[],\n expectedAmountAtomic: string,\n payTo?: string,\n minBlockNumber = 0n,\n): { amountAtomic: bigint; latestLog: RpcLog } | undefined {\n const expected = BigInt(expectedAmountAtomic);\n const matched = logs\n .map((log) => ({\n log,\n transfer: parseTransferLog(log),\n }))\n .filter(\n (\n item,\n ): item is {\n log: RpcLog;\n transfer: { from: string; to: string; amountAtomic: bigint };\n } => {\n if (!item.transfer || item.log.removed) {\n return false;\n }\n\n if (readLogBlockNumber(item.log) < minBlockNumber) {\n return false;\n }\n\n return payTo ? item.transfer.to === normalizeAddress(payTo) : true;\n },\n );\n\n const byPayer = new Map<\n string,\n { amountAtomic: bigint; latestLog: RpcLog }\n >();\n\n for (const item of matched) {\n const existing = byPayer.get(item.transfer.from);\n const latestLog =\n existing && compareTransferLogs(existing.latestLog, item.log) >= 0\n ? existing.latestLog\n : item.log;\n\n byPayer.set(item.transfer.from, {\n amountAtomic: (existing?.amountAtomic ?? 0n) + item.transfer.amountAtomic,\n latestLog,\n });\n }\n\n const candidates = [...byPayer.values()].filter(\n (item) => item.amountAtomic >= expected,\n );\n\n if (candidates.length === 0) {\n return undefined;\n }\n\n return candidates.reduce((current, item) =>\n compareTransferLogs(item.latestLog, current.latestLog) > 0 ? item : current,\n );\n}\n\nfunction parseTransferLog(\n log: RpcLog,\n): { from: string; to: string; amountAtomic: bigint } | undefined {\n if (\n !isRecord(log) ||\n !Array.isArray(log.topics) ||\n typeof log.data !== 'string'\n ) {\n return undefined;\n }\n\n if (\n log.topics[0]?.toLowerCase() !== TRANSFER_TOPIC ||\n log.topics.length < 3\n ) {\n return undefined;\n }\n\n try {\n return {\n from: topicToAddress(log.topics[1] ?? ''),\n to: topicToAddress(log.topics[2] ?? ''),\n amountAtomic: parseHexQuantity(log.data),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction readLogBlockNumber(log: RpcLog): bigint {\n try {\n return parseHexQuantity(log.blockNumber ?? '0x0');\n } catch {\n return 0n;\n }\n}\n\nfunction compareTransferLogs(left: RpcLog, right: RpcLog): number {\n const leftBlock = readLogBlockNumber(left);\n const rightBlock = readLogBlockNumber(right);\n\n if (leftBlock > rightBlock) {\n return 1;\n }\n\n if (leftBlock < rightBlock) {\n return -1;\n }\n\n return (left.transactionHash ?? '')\n .toLowerCase()\n .localeCompare((right.transactionHash ?? '').toLowerCase());\n}\n\nfunction trimSeenX402TransactionIds(seenTransactionIds: Set<string>): void {\n while (seenTransactionIds.size > DEFAULT_MAX_SEEN_X402_TRANSACTION_IDS) {\n const oldest = seenTransactionIds.values().next().value;\n\n if (oldest === undefined) {\n break;\n }\n\n seenTransactionIds.delete(oldest);\n }\n}\n\nfunction buildUsdcPaymentUri(input: {\n tokenAddress: string;\n payTo: string;\n amountAtomic: string;\n}): string {\n return `ethereum:${input.tokenAddress}@${BASE_MAINNET_CHAIN_ID}/transfer?address=${input.payTo}&uint256=${input.amountAtomic}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction normalizeAddress(address: string): string {\n if (typeof address !== 'string') {\n throw new PaymentConfigurationError(\n `Invalid EVM address: ${String(address)}`,\n );\n }\n\n const normalized = address.trim();\n\n if (!/^0x[a-fA-F0-9]{40}$/.test(normalized)) {\n throw new PaymentConfigurationError(`Invalid EVM address: ${address}`);\n }\n\n return normalized.toLowerCase();\n}\n\nfunction isEvmTransactionHash(value: string): boolean {\n return /^0x[a-fA-F0-9]{64}$/.test(value);\n}\n\nfunction safeNormalizeAddress(address: unknown): string | undefined {\n try {\n return normalizeAddress(address as string);\n } catch {\n return undefined;\n }\n}\n\nfunction addressToTopic(address: string): string {\n return `0x${normalizeAddress(address).slice(2).padStart(64, '0')}`;\n}\n\nfunction topicToAddress(topic: string): string {\n if (!/^0x[a-fA-F0-9]{64}$/.test(topic)) {\n throw new PaymentProviderError(`Invalid EVM address topic: ${topic}`);\n }\n\n return normalizeAddress(`0x${topic.slice(-40)}`);\n}\n\nfunction parseHexQuantity(value: string | number | bigint): bigint {\n if (typeof value === 'bigint') {\n if (value < 0n) {\n throw new PaymentProviderError(\n `Invalid JSON-RPC hex quantity: ${String(value)}`,\n );\n }\n\n return value;\n }\n\n if (typeof value === 'number') {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new PaymentProviderError(\n `Invalid JSON-RPC hex quantity: ${String(value)}`,\n );\n }\n\n return BigInt(value);\n }\n\n if (typeof value !== 'string') {\n throw new PaymentProviderError(\n `Invalid JSON-RPC hex quantity: ${String(value)}`,\n );\n }\n\n const normalized = value.trim();\n\n if (!/^0x[0-9a-fA-F]+$/.test(normalized)) {\n throw new PaymentProviderError(\n `Invalid JSON-RPC hex quantity: ${String(value)}`,\n );\n }\n\n return BigInt(normalized);\n}\n\nfunction toHexQuantity(value: bigint): string {\n return `0x${value.toString(16)}`;\n}\n\nfunction decodePaymentHeader(value: string): unknown {\n const trimmed = value.trim();\n\n if (trimmed.length > 65_536) {\n throw new PaymentVerificationError('x402 payment header is too large.');\n }\n\n const decoded = trimmed.startsWith('{')\n ? JSON.parse(trimmed)\n : JSON.parse(\n Buffer.from(\n trimmed\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(trimmed.length + ((4 - (trimmed.length % 4)) % 4), '='),\n 'base64',\n ).toString('utf8'),\n );\n\n if (!decoded || typeof decoded !== 'object' || Array.isArray(decoded)) {\n throw new PaymentVerificationError(\n 'x402 payment header must be an object.',\n );\n }\n\n return decoded;\n}\n\nfunction validateX402PayloadRequirements(\n payload: unknown,\n input: VerifyX402ProofInput,\n): string | undefined {\n const expectedScheme = input.scheme ?? 'exact';\n const actualScheme = readX402PayloadString(payload, ['scheme']);\n\n if (!actualScheme) {\n return 'x402 proof did not include the payment scheme.';\n }\n\n if (actualScheme && actualScheme !== expectedScheme) {\n return `x402 proof scheme ${actualScheme} did not match ${expectedScheme}.`;\n }\n\n const expectedNetwork = normalizeX402Network(\n input.network ?? BASE_MAINNET_CAIP2,\n );\n const actualNetwork = normalizeX402Network(\n readX402PayloadString(payload, ['network', 'networkId']),\n );\n\n if (!actualNetwork) {\n return 'x402 proof did not include the payment network.';\n }\n\n if (actualNetwork && actualNetwork !== expectedNetwork) {\n return `x402 proof network ${actualNetwork} did not match ${expectedNetwork}.`;\n }\n\n const expectedResource = input.resource;\n\n if (expectedResource !== undefined) {\n const actualResource = readX402PayloadString(payload, ['resource']);\n\n if (!actualResource) {\n return 'x402 proof did not include the paid resource.';\n }\n\n if (actualResource !== expectedResource) {\n return 'x402 proof resource did not match the requested resource.';\n }\n }\n\n const expectedMethod = input.method;\n\n if (expectedMethod !== undefined) {\n const actualMethod = readX402PayloadString(payload, ['method']);\n\n if (!actualMethod) {\n return 'x402 proof did not include the HTTP method.';\n }\n\n if (actualMethod.toUpperCase() !== expectedMethod.toUpperCase()) {\n return 'x402 proof method did not match the requested method.';\n }\n }\n\n const actualExpiry = readX402PayloadString(payload, [\n 'expiresAt',\n 'expires',\n 'validBefore',\n 'deadline',\n ]);\n const actualExpiryDate =\n actualExpiry === undefined ? undefined : parseX402ExpiryDate(actualExpiry);\n\n if (actualExpiry !== undefined && !actualExpiryDate) {\n return 'x402 proof expiry was invalid.';\n }\n\n if (actualExpiryDate !== undefined && actualExpiryDate < new Date()) {\n return 'x402 proof is expired.';\n }\n\n if (input.expiresAt !== undefined) {\n const expectedExpiry = normalizeDate(input.expiresAt);\n\n if (expectedExpiry < new Date()) {\n return 'x402 proof is expired.';\n }\n\n if (!actualExpiry) {\n return 'x402 proof did not include an expiry.';\n }\n\n if (actualExpiryDate?.getTime() !== expectedExpiry.getTime()) {\n return 'x402 proof expiry did not match the requested expiry.';\n }\n }\n\n return undefined;\n}\n\nfunction parseX402ExpiryDate(value: string): Date | undefined {\n try {\n if (/^\\d+$/.test(value)) {\n const timestamp = Number(value);\n\n if (!Number.isSafeInteger(timestamp)) {\n return undefined;\n }\n\n const date = new Date(\n timestamp < 1_000_000_000_000 ? timestamp * 1_000 : timestamp,\n );\n\n return Number.isNaN(date.getTime()) ? undefined : date;\n }\n\n return normalizeDate(value);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeX402Network(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n\n if (['base', 'base-mainnet', BASE_MAINNET_CAIP2].includes(normalized)) {\n return BASE_MAINNET_CAIP2;\n }\n\n return value;\n}\n\nfunction readX402PayloadString(\n value: unknown,\n keys: string[],\n): string | undefined {\n const root = asRecord(value);\n const nestedPayload = asRecord(root?.payload);\n const authorization = asRecord(nestedPayload?.authorization);\n\n for (const key of keys) {\n const authorized = readLooseString(authorization, key);\n\n if (authorized) {\n return authorized;\n }\n\n const nested = readLooseString(nestedPayload, key);\n\n if (nested) {\n return nested;\n }\n\n const direct = readLooseString(root, key);\n\n if (direct) {\n return direct;\n }\n }\n\n return undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction readLooseString(\n value: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const item = value?.[key];\n\n if (typeof item === 'string') {\n return item;\n }\n\n if (typeof item === 'number') {\n return String(item);\n }\n\n return undefined;\n}\n\nfunction findNestedString(\n value: unknown,\n keys: string[],\n depth = 0,\n): string | undefined {\n if (!value || typeof value !== 'object' || depth > 16) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n\n for (const key of keys) {\n const direct = record[key];\n if (typeof direct === 'string' && direct.length > 0) {\n return direct;\n }\n\n if (typeof direct === 'number' && Number.isFinite(direct)) {\n return String(direct);\n }\n }\n\n for (const child of Object.values(record)) {\n const match = findNestedString(child, keys, depth + 1);\n\n if (match) {\n return match;\n }\n }\n\n return undefined;\n}\n\nfunction bigintToFixedBytes(value: bigint): Uint8Array {\n const hex = value.toString(16).padStart(64, '0');\n return hexToBytes(hex);\n}\n\nfunction concatBytes(...values: Uint8Array[]): Uint8Array {\n const totalLength = values.reduce((sum, value) => sum + value.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const value of values) {\n result.set(value, offset);\n offset += value.length;\n }\n\n return result;\n}\n\nfunction bytesToHex(value: Uint8Array): string {\n return Array.from(value, (byte) => byte.toString(16).padStart(2, '0')).join(\n '',\n );\n}\n\nfunction hexToBytes(value: string): Uint8Array {\n const bytes = value.match(/.{1,2}/g) ?? [];\n return Uint8Array.from(bytes.map((byte) => Number.parseInt(byte, 16)));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { FetchLike } from '../shared.js';
|
|
2
|
+
import { CreatePaymentOptionInput, PaymentBackend, PaymentBackendCapabilities, PaymentEvent, PaymentOption, PaymentStatus, PaymentStatusContext, PaymentStatusResult, PaymentWebhookEvent, PayoutResult, RefundPaymentInput, RefundResult, SendPayoutInput, WatchPaymentInput } from '../types.js';
|
|
3
|
+
export declare const BTC_BACKEND_ID = "btc";
|
|
4
|
+
export type BtcConfirmationPolicy = (input: {
|
|
5
|
+
amount: number;
|
|
6
|
+
currency: string;
|
|
7
|
+
quoteId?: string;
|
|
8
|
+
}) => number;
|
|
9
|
+
export interface BtcAdapterOptions {
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
apiKey: string;
|
|
12
|
+
storeId: string;
|
|
13
|
+
fetch?: FetchLike;
|
|
14
|
+
currency?: string;
|
|
15
|
+
paymentMethod?: string;
|
|
16
|
+
pollIntervalMs?: number;
|
|
17
|
+
confirmationPolicy?: BtcConfirmationPolicy;
|
|
18
|
+
webhookSecret?: string;
|
|
19
|
+
managedProviderName?: string;
|
|
20
|
+
maxStoredPaymentOptions?: number;
|
|
21
|
+
maxStoredWebhookDeliveryIds?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface BtcpayWebhookEvent extends PaymentWebhookEvent {
|
|
24
|
+
deliveryId: string;
|
|
25
|
+
invoiceId?: string;
|
|
26
|
+
quoteId?: string;
|
|
27
|
+
type?: string;
|
|
28
|
+
status: PaymentStatus;
|
|
29
|
+
raw: unknown;
|
|
30
|
+
}
|
|
31
|
+
export declare class BtcAdapter implements PaymentBackend {
|
|
32
|
+
private readonly options;
|
|
33
|
+
readonly capabilities: PaymentBackendCapabilities;
|
|
34
|
+
private readonly fetch;
|
|
35
|
+
private readonly baseUrl;
|
|
36
|
+
private readonly apiKey;
|
|
37
|
+
private readonly storeId;
|
|
38
|
+
private readonly currency;
|
|
39
|
+
private readonly paymentMethod;
|
|
40
|
+
private readonly webhookSecret;
|
|
41
|
+
private readonly maxStoredPaymentOptions;
|
|
42
|
+
private readonly maxStoredWebhookDeliveryIds;
|
|
43
|
+
private readonly optionsByQuote;
|
|
44
|
+
private readonly seenWebhookDeliveryIds;
|
|
45
|
+
constructor(options: BtcAdapterOptions);
|
|
46
|
+
createPaymentOption(input: CreatePaymentOptionInput): Promise<PaymentOption>;
|
|
47
|
+
watchPayment(input: WatchPaymentInput): AsyncIterable<PaymentEvent>;
|
|
48
|
+
getStatus(quoteId: string, payTo: string, context?: PaymentStatusContext): Promise<PaymentStatusResult>;
|
|
49
|
+
sendPayout(input: SendPayoutInput): Promise<PayoutResult>;
|
|
50
|
+
refundPayment(input: RefundPaymentInput): Promise<RefundResult>;
|
|
51
|
+
parseWebhookEvent(payload: string, signature?: string): BtcpayWebhookEvent;
|
|
52
|
+
private getRequiredConfirmations;
|
|
53
|
+
private getInvoice;
|
|
54
|
+
private findInvoice;
|
|
55
|
+
private getPaymentMethods;
|
|
56
|
+
private request;
|
|
57
|
+
}
|
|
58
|
+
export declare function defaultBtcConfirmationPolicy(input: {
|
|
59
|
+
amount: number;
|
|
60
|
+
currency: string;
|
|
61
|
+
}): number;
|
|
62
|
+
export declare function verifyBtcpayWebhookSignature(payload: string, signature: string, secret: string): void;
|
|
63
|
+
//# sourceMappingURL=btc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"btc.d.ts","sourceRoot":"","sources":["../../src/adapters/btc.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,SAAS,EAef,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,wBAAwB,EACxB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,cAAc,QAAQ,CAAC;AAGpC,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KAAK,MAAM,CAAC;AAEb,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAkBD,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,qBAAa,UAAW,YAAW,cAAc;IAenC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAdpC,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAElD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAS;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;IACrE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqB;gBAE/B,OAAO,EAAE,iBAAiB;IAyEjD,mBAAmB,CACvB,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,aAAa,CAAC;IAsHzB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CAAC,YAAY,CAAC;IAW7D,SAAS,CACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC;IA6IzB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAuFzD,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCrE,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB;IA+D1E,OAAO,CAAC,wBAAwB;YAWlB,UAAU;YAUV,WAAW;YAgCX,iBAAiB;YAajB,OAAO;CAatB;AAoBD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAsBT;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,IAAI,CA+BN"}
|