@wazabiai/x402 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/index.ts","../../src/chains/bnb.ts","../../src/server/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * x402 Protocol Version\n */\nexport const X402_VERSION = '2.0.0' as const;\n\n/**\n * EIP-712 Domain name for x402 protocol\n */\nexport const X402_DOMAIN_NAME = 'x402' as const;\n\n/**\n * HTTP Header names used in x402 protocol\n */\nexport const X402_HEADERS = {\n PAYMENT_REQUIRED: 'x-payment-required',\n PAYMENT_SIGNATURE: 'x-payment-signature',\n PAYMENT_PAYLOAD: 'x-payment-payload',\n} as const;\n\n// ============================================================================\n// Network Configuration Types\n// ============================================================================\n\n/**\n * Supported token symbol types\n */\nexport type TokenSymbol = 'USDT' | 'USDC' | 'BNB' | 'BUSD';\n\n/**\n * Token configuration for a specific blockchain\n */\nexport interface TokenConfig {\n /** Token contract address (0x...) */\n address: `0x${string}`;\n /** Token symbol */\n symbol: TokenSymbol;\n /** Token decimals (typically 18 for most tokens) */\n decimals: number;\n /** Human-readable token name */\n name: string;\n}\n\n/**\n * Network configuration for a specific blockchain\n */\nexport interface NetworkConfig {\n /** CAIP-2 chain identifier (e.g., 'eip155:56' for BSC) */\n caipId: string;\n /** Numeric chain ID */\n chainId: number;\n /** Human-readable network name */\n name: string;\n /** Default RPC URL */\n rpcUrl: string;\n /** Native currency symbol */\n nativeCurrency: {\n name: string;\n symbol: string;\n decimals: number;\n };\n /** Block explorer URL */\n blockExplorer: string;\n /** Supported tokens on this network */\n tokens: Record<string, TokenConfig>;\n}\n\n// ============================================================================\n// Payment Requirement Types\n// ============================================================================\n\n/**\n * Zod schema for PaymentRequirement validation\n */\nexport const PaymentRequirementSchema = z.object({\n /** Payment amount in smallest token unit (wei/satoshi) as string */\n amount: z.string().regex(/^\\d+$/, 'Amount must be a numeric string'),\n /** Token contract address */\n token: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid token address'),\n /** CAIP-2 network identifier */\n network_id: z.string().regex(/^eip155:\\d+$/, 'Invalid CAIP-2 network ID'),\n /** Recipient address for payment */\n pay_to: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid recipient address'),\n /** Optional: Payment description */\n description: z.string().optional(),\n /** Optional: Resource identifier being accessed */\n resource: z.string().optional(),\n /** Optional: Expiration timestamp (Unix epoch seconds) */\n expires_at: z.number().int().positive().optional(),\n /** Optional: Unique nonce to prevent replay attacks */\n nonce: z.string().optional(),\n /** Protocol version */\n version: z.string().optional(),\n});\n\n/**\n * Payment requirement structure returned in 402 response header\n */\nexport type PaymentRequirement = z.infer<typeof PaymentRequirementSchema>;\n\n// ============================================================================\n// EIP-712 Payment Payload Types\n// ============================================================================\n\n/**\n * EIP-712 Domain structure for x402 protocol\n */\nexport interface X402Domain {\n name: typeof X402_DOMAIN_NAME;\n version: string;\n chainId: number;\n verifyingContract?: `0x${string}`;\n}\n\n/**\n * Zod schema for PaymentPayload validation\n */\nexport const PaymentPayloadSchema = z.object({\n /** Payment amount in smallest token unit */\n amount: z.string().regex(/^\\d+$/, 'Amount must be a numeric string'),\n /** Token contract address */\n token: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid token address'),\n /** Chain ID (numeric) */\n chainId: z.number().int().positive(),\n /** Recipient address */\n payTo: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid recipient address'),\n /** Payer address (signer) */\n payer: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid payer address'),\n /** Unix timestamp when payment expires */\n deadline: z.number().int().positive(),\n /** Unique nonce to prevent replay attacks */\n nonce: z.string(),\n /** Optional: Resource being accessed */\n resource: z.string().optional(),\n});\n\n/**\n * EIP-712 typed data payload for signing\n */\nexport type PaymentPayload = z.infer<typeof PaymentPayloadSchema>;\n\n/**\n * EIP-712 type definitions for Payment message\n */\nexport const PAYMENT_TYPES = {\n Payment: [\n { name: 'amount', type: 'uint256' },\n { name: 'token', type: 'address' },\n { name: 'chainId', type: 'uint256' },\n { name: 'payTo', type: 'address' },\n { name: 'payer', type: 'address' },\n { name: 'deadline', type: 'uint256' },\n { name: 'nonce', type: 'string' },\n { name: 'resource', type: 'string' },\n ],\n} as const;\n\n// ============================================================================\n// Signed Payment Types\n// ============================================================================\n\n/**\n * Complete signed payment ready to be sent as header\n */\nexport interface SignedPayment {\n /** The payment payload that was signed */\n payload: PaymentPayload;\n /** EIP-712 signature (0x prefixed) */\n signature: `0x${string}`;\n /** Address of the signer */\n signer: `0x${string}`;\n}\n\n/**\n * Zod schema for SignedPayment validation\n */\nexport const SignedPaymentSchema = z.object({\n payload: PaymentPayloadSchema,\n signature: z.string().regex(/^0x[a-fA-F0-9]+$/, 'Invalid signature format'),\n signer: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid signer address'),\n});\n\n// ============================================================================\n// Client Configuration Types\n// ============================================================================\n\n/**\n * Configuration options for X402Client\n */\nexport interface X402ClientConfig {\n /** Private key for signing (hex string with or without 0x prefix) */\n privateKey?: string;\n /** Custom RPC URL to use instead of default */\n rpcUrl?: string;\n /** Supported network IDs (defaults to ['eip155:56']) */\n supportedNetworks?: string[];\n /** Default deadline duration in seconds (default: 300 = 5 minutes) */\n defaultDeadline?: number;\n /** Auto-retry on 402 response (default: true) */\n autoRetry?: boolean;\n /** Maximum retries for payment (default: 1) */\n maxRetries?: number;\n /** Custom axios instance configuration */\n axiosConfig?: Record<string, unknown>;\n /** Callback when payment is required */\n onPaymentRequired?: (requirement: PaymentRequirement) => void | Promise<void>;\n /** Callback when payment is signed */\n onPaymentSigned?: (payment: SignedPayment) => void | Promise<void>;\n}\n\n// ============================================================================\n// Server/Middleware Configuration Types\n// ============================================================================\n\n/**\n * Payment verification result\n */\nexport interface PaymentVerificationResult {\n /** Whether the payment signature is valid */\n valid: boolean;\n /** Recovered signer address if valid */\n signer?: `0x${string}`;\n /** Error message if invalid */\n error?: string;\n /** The verified payment payload */\n payload?: PaymentPayload;\n}\n\n/**\n * Facilitator verification request\n */\nexport interface FacilitatorVerifyRequest {\n signature: string;\n payload: PaymentPayload;\n networkId: string;\n}\n\n/**\n * Facilitator verification response\n */\nexport interface FacilitatorVerifyResponse {\n valid: boolean;\n signer?: string;\n error?: string;\n balanceSufficient?: boolean;\n allowanceSufficient?: boolean;\n}\n\n/**\n * Configuration options for x402 server middleware\n */\nexport interface X402MiddlewareConfig {\n /** Recipient address for payments */\n recipientAddress: `0x${string}`;\n /** Payment amount in smallest token unit */\n amount: string;\n /** Token contract address (defaults to BSC-USDT) */\n tokenAddress?: `0x${string}`;\n /** Optional facilitator URL for offloading verification */\n facilitatorUrl?: string;\n /** Custom payment description */\n description?: string;\n /** Network ID (defaults to 'eip155:56') */\n networkId?: string;\n /** Deadline duration in seconds (default: 300) */\n deadlineDuration?: number;\n /** Custom nonce generator */\n nonceGenerator?: () => string;\n /** Callback to verify payment against custom logic (e.g., database) */\n verifyPayment?: (payment: SignedPayment, req: unknown) => Promise<boolean>;\n /** Routes to exclude from payment requirement */\n excludeRoutes?: string[];\n /** Custom error handler */\n onError?: (error: Error, req: unknown, res: unknown) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error class for x402 protocol errors\n */\nexport class X402Error extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'X402Error';\n Object.setPrototypeOf(this, X402Error.prototype);\n }\n}\n\n/**\n * Error thrown when payment is required but not provided\n */\nexport class PaymentRequiredError extends X402Error {\n constructor(\n public requirement: PaymentRequirement,\n message = 'Payment required'\n ) {\n super(message, 'PAYMENT_REQUIRED', { requirement });\n this.name = 'PaymentRequiredError';\n Object.setPrototypeOf(this, PaymentRequiredError.prototype);\n }\n}\n\n/**\n * Error thrown when payment signature verification fails\n */\nexport class PaymentVerificationError extends X402Error {\n constructor(\n message: string,\n public details?: Record<string, unknown>\n ) {\n super(message, 'PAYMENT_VERIFICATION_FAILED', details);\n this.name = 'PaymentVerificationError';\n Object.setPrototypeOf(this, PaymentVerificationError.prototype);\n }\n}\n\n/**\n * Error thrown when network is not supported\n */\nexport class UnsupportedNetworkError extends X402Error {\n constructor(\n networkId: string,\n supportedNetworks: string[]\n ) {\n super(\n `Network ${networkId} is not supported. Supported networks: ${supportedNetworks.join(', ')}`,\n 'UNSUPPORTED_NETWORK',\n { networkId, supportedNetworks }\n );\n this.name = 'UnsupportedNetworkError';\n Object.setPrototypeOf(this, UnsupportedNetworkError.prototype);\n }\n}\n\n/**\n * Error thrown when payment has expired\n */\nexport class PaymentExpiredError extends X402Error {\n constructor(deadline: number) {\n super(\n `Payment has expired. Deadline: ${new Date(deadline * 1000).toISOString()}`,\n 'PAYMENT_EXPIRED',\n { deadline }\n );\n this.name = 'PaymentExpiredError';\n Object.setPrototypeOf(this, PaymentExpiredError.prototype);\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Hex string type (0x prefixed)\n */\nexport type HexString = `0x${string}`;\n\n/**\n * Address type (0x prefixed, 40 hex chars)\n */\nexport type Address = `0x${string}`;\n\n/**\n * Extract chain ID from CAIP-2 identifier\n */\nexport function extractChainId(caipId: string): number {\n const match = caipId.match(/^eip155:(\\d+)$/);\n if (!match?.[1]) {\n throw new X402Error(`Invalid CAIP-2 identifier: ${caipId}`, 'INVALID_CAIP_ID');\n }\n return parseInt(match[1], 10);\n}\n\n/**\n * Create CAIP-2 identifier from chain ID\n */\nexport function createCaipId(chainId: number): string {\n return `eip155:${chainId}`;\n}\n\n/**\n * Generate a random nonce\n */\nexport function generateNonce(): string {\n const bytes = new Uint8Array(16);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n // Fallback for Node.js without Web Crypto\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Calculate deadline from duration\n */\nexport function calculateDeadline(durationSeconds: number = 300): number {\n return Math.floor(Date.now() / 1000) + durationSeconds;\n}\n","import type { NetworkConfig, TokenConfig } from '../types/index.js';\n\n// ============================================================================\n// BNB Smart Chain Configuration\n// ============================================================================\n\n/**\n * BNB Smart Chain (BSC) Mainnet Chain ID\n */\nexport const BSC_CHAIN_ID = 56 as const;\n\n/**\n * BNB Smart Chain CAIP-2 Identifier\n */\nexport const BSC_CAIP_ID = 'eip155:56' as const;\n\n/**\n * BNB Smart Chain public RPC endpoints\n * Using multiple for fallback support\n */\nexport const BSC_RPC_URLS = [\n 'https://bsc-dataseed.binance.org',\n 'https://bsc-dataseed1.binance.org',\n 'https://bsc-dataseed2.binance.org',\n 'https://bsc-dataseed3.binance.org',\n 'https://bsc-dataseed4.binance.org',\n 'https://bsc-dataseed1.defibit.io',\n 'https://bsc-dataseed1.ninicoin.io',\n] as const;\n\n/**\n * Default BSC RPC URL\n */\nexport const BSC_DEFAULT_RPC = BSC_RPC_URLS[0];\n\n/**\n * BscScan block explorer URL\n */\nexport const BSC_BLOCK_EXPLORER = 'https://bscscan.com' as const;\n\n// ============================================================================\n// Token Configurations\n// ============================================================================\n\n/**\n * BSC-USDT (Tether USD) Token Configuration\n * @see https://bscscan.com/token/0x55d398326f99059fF775485246999027B3197955\n */\nexport const BSC_USDT: TokenConfig = {\n address: '0x55d398326f99059fF775485246999027B3197955',\n symbol: 'USDT',\n decimals: 18,\n name: 'Tether USD',\n} as const;\n\n/**\n * BSC-USDC (USD Coin) Token Configuration\n * @see https://bscscan.com/token/0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\n */\nexport const BSC_USDC: TokenConfig = {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n symbol: 'USDC',\n decimals: 18,\n name: 'USD Coin',\n} as const;\n\n/**\n * BSC-BUSD (Binance USD) Token Configuration\n * @see https://bscscan.com/token/0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56\n */\nexport const BSC_BUSD: TokenConfig = {\n address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\n symbol: 'BUSD',\n decimals: 18,\n name: 'Binance USD',\n} as const;\n\n/**\n * Wrapped BNB (WBNB) Token Configuration\n * @see https://bscscan.com/token/0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\n */\nexport const BSC_WBNB: TokenConfig = {\n address: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n symbol: 'BNB',\n decimals: 18,\n name: 'Wrapped BNB',\n} as const;\n\n/**\n * Default token for payments (BSC-USDT)\n */\nexport const BSC_DEFAULT_TOKEN = BSC_USDT;\n\n/**\n * All supported tokens on BSC\n */\nexport const BSC_TOKENS = {\n USDT: BSC_USDT,\n USDC: BSC_USDC,\n BUSD: BSC_BUSD,\n WBNB: BSC_WBNB,\n} as const;\n\n/**\n * Token address to config mapping for quick lookup\n */\nexport const BSC_TOKEN_BY_ADDRESS: Record<string, TokenConfig> = {\n [BSC_USDT.address.toLowerCase()]: BSC_USDT,\n [BSC_USDC.address.toLowerCase()]: BSC_USDC,\n [BSC_BUSD.address.toLowerCase()]: BSC_BUSD,\n [BSC_WBNB.address.toLowerCase()]: BSC_WBNB,\n};\n\n// ============================================================================\n// Network Configuration\n// ============================================================================\n\n/**\n * Complete BNB Smart Chain network configuration\n */\nexport const BSC_NETWORK_CONFIG: NetworkConfig = {\n caipId: BSC_CAIP_ID,\n chainId: BSC_CHAIN_ID,\n name: 'BNB Smart Chain',\n rpcUrl: BSC_DEFAULT_RPC,\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n blockExplorer: BSC_BLOCK_EXPLORER,\n tokens: BSC_TOKENS,\n} as const;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get token configuration by address\n */\nexport function getTokenByAddress(address: string): TokenConfig | undefined {\n return BSC_TOKEN_BY_ADDRESS[address.toLowerCase()];\n}\n\n/**\n * Get token configuration by symbol\n */\nexport function getTokenBySymbol(symbol: string): TokenConfig | undefined {\n const upperSymbol = symbol.toUpperCase();\n return BSC_TOKENS[upperSymbol as keyof typeof BSC_TOKENS];\n}\n\n/**\n * Check if a token address is supported on BSC\n */\nexport function isTokenSupported(address: string): boolean {\n return address.toLowerCase() in BSC_TOKEN_BY_ADDRESS;\n}\n\n/**\n * Format token amount from wei to human-readable string\n */\nexport function formatTokenAmount(\n amount: bigint | string,\n tokenAddress: string\n): string {\n const token = getTokenByAddress(tokenAddress);\n const decimals = token?.decimals ?? 18;\n const amountBigInt = typeof amount === 'string' ? BigInt(amount) : amount;\n \n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n \n const fractionalStr = fractionalPart.toString().padStart(decimals, '0');\n // Trim trailing zeros but keep at least 2 decimal places\n const trimmedFractional = fractionalStr.replace(/0+$/, '').padEnd(2, '0');\n \n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse human-readable amount to wei\n */\nexport function parseTokenAmount(\n amount: string,\n tokenAddress: string\n): bigint {\n const token = getTokenByAddress(tokenAddress);\n const decimals = token?.decimals ?? 18;\n \n const [whole, fractional = ''] = amount.split('.');\n const paddedFractional = fractional.padEnd(decimals, '0').slice(0, decimals);\n \n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Get BscScan URL for a transaction\n */\nexport function getTxUrl(txHash: string): string {\n return `${BSC_BLOCK_EXPLORER}/tx/${txHash}`;\n}\n\n/**\n * Get BscScan URL for an address\n */\nexport function getAddressUrl(address: string): string {\n return `${BSC_BLOCK_EXPLORER}/address/${address}`;\n}\n\n/**\n * Get BscScan URL for a token\n */\nexport function getTokenUrl(tokenAddress: string): string {\n return `${BSC_BLOCK_EXPLORER}/token/${tokenAddress}`;\n}\n","import type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport axios from 'axios';\nimport {\n verifyTypedData,\n type Address,\n} from 'viem';\n\nimport {\n type PaymentRequirement,\n type PaymentPayload,\n type SignedPayment,\n type X402MiddlewareConfig,\n type PaymentVerificationResult,\n type FacilitatorVerifyRequest,\n type FacilitatorVerifyResponse,\n SignedPaymentSchema,\n PaymentPayloadSchema,\n X402_HEADERS,\n X402_DOMAIN_NAME,\n X402_VERSION,\n PAYMENT_TYPES,\n generateNonce,\n calculateDeadline,\n extractChainId,\n} from '../types/index.js';\nimport {\n BSC_CAIP_ID,\n BSC_USDT,\n} from '../chains/bnb.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended Express Request with payment information\n */\nexport interface X402Request extends Request {\n x402?: {\n payment: SignedPayment;\n verified: boolean;\n signer: Address;\n };\n}\n\n// ============================================================================\n// Payment Verification\n// ============================================================================\n\n/**\n * Verify an EIP-712 payment signature locally using viem\n */\nasync function verifyPaymentSignatureLocal(\n payment: SignedPayment,\n expectedRecipient: Address,\n chainId: number\n): Promise<PaymentVerificationResult> {\n try {\n const { payload, signature, signer } = payment;\n\n // Check deadline\n const now = Math.floor(Date.now() / 1000);\n if (payload.deadline < now) {\n return {\n valid: false,\n error: `Payment expired at ${new Date(payload.deadline * 1000).toISOString()}`,\n };\n }\n\n // Check chain ID matches\n if (payload.chainId !== chainId) {\n return {\n valid: false,\n error: `Chain ID mismatch: expected ${chainId}, got ${payload.chainId}`,\n };\n }\n\n // Check recipient matches\n if (payload.payTo.toLowerCase() !== expectedRecipient.toLowerCase()) {\n return {\n valid: false,\n error: `Recipient mismatch: expected ${expectedRecipient}, got ${payload.payTo}`,\n };\n }\n\n // Create domain for verification\n const domain = {\n name: X402_DOMAIN_NAME,\n version: X402_VERSION,\n chainId,\n };\n\n // Verify the typed data signature\n const isValid = await verifyTypedData({\n address: signer as Address,\n domain,\n types: PAYMENT_TYPES,\n primaryType: 'Payment',\n message: {\n amount: BigInt(payload.amount),\n token: payload.token as Address,\n chainId: BigInt(payload.chainId),\n payTo: payload.payTo as Address,\n payer: payload.payer as Address,\n deadline: BigInt(payload.deadline),\n nonce: payload.nonce,\n resource: payload.resource ?? '',\n },\n signature: signature as `0x${string}`,\n });\n\n if (!isValid) {\n return {\n valid: false,\n error: 'Signature verification failed',\n };\n }\n\n return {\n valid: true,\n signer: signer as Address,\n payload,\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown verification error',\n };\n }\n}\n\n/**\n * Verify payment through external facilitator service\n */\nasync function verifyPaymentWithFacilitator(\n payment: SignedPayment,\n facilitatorUrl: string,\n networkId: string\n): Promise<PaymentVerificationResult> {\n try {\n const request: FacilitatorVerifyRequest = {\n signature: payment.signature,\n payload: payment.payload,\n networkId,\n };\n\n const response = await axios.post<FacilitatorVerifyResponse>(\n `${facilitatorUrl}/verify`,\n request,\n {\n timeout: 10000,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n if (response.data.valid) {\n return {\n valid: true,\n signer: response.data.signer as Address,\n payload: payment.payload,\n };\n }\n\n return {\n valid: false,\n error: response.data.error ?? 'Facilitator rejected payment',\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error \n ? `Facilitator error: ${error.message}` \n : 'Facilitator verification failed',\n };\n }\n}\n\n// ============================================================================\n// Middleware Factory\n// ============================================================================\n\n/**\n * Create x402 payment middleware for Express\n * \n * @example\n * ```typescript\n * import express from 'express';\n * import { x402Middleware } from '@wazabiai/x402/server';\n * \n * const app = express();\n * \n * // Protect routes with payment requirement\n * app.use('/api/paid', x402Middleware({\n * recipientAddress: '0x...',\n * amount: '1000000000000000000', // 1 token\n * }));\n * \n * app.get('/api/paid/resource', (req, res) => {\n * // Payment verified, serve resource\n * res.json({ data: 'premium content' });\n * });\n * ```\n */\nexport function x402Middleware(config: X402MiddlewareConfig): RequestHandler {\n const {\n recipientAddress,\n amount,\n tokenAddress = BSC_USDT.address,\n facilitatorUrl,\n description,\n networkId = BSC_CAIP_ID,\n deadlineDuration = 300,\n nonceGenerator = generateNonce,\n verifyPayment: customVerify,\n excludeRoutes = [],\n onError,\n } = config;\n\n const chainId = extractChainId(networkId);\n\n return async (req: X402Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n // Check if route is excluded\n const path = req.path;\n if (excludeRoutes.some(route => path.startsWith(route))) {\n next();\n return;\n }\n\n // Get payment signature header\n const signatureHeader = req.headers[X402_HEADERS.PAYMENT_SIGNATURE] ||\n req.headers[X402_HEADERS.PAYMENT_SIGNATURE.toLowerCase()];\n const payloadHeader = req.headers[X402_HEADERS.PAYMENT_PAYLOAD] ||\n req.headers[X402_HEADERS.PAYMENT_PAYLOAD.toLowerCase()];\n\n // If no payment signature, return 402\n if (!signatureHeader) {\n const requirement: PaymentRequirement = {\n amount,\n token: tokenAddress,\n network_id: networkId,\n pay_to: recipientAddress,\n description,\n resource: req.originalUrl,\n expires_at: calculateDeadline(deadlineDuration),\n nonce: nonceGenerator(),\n version: X402_VERSION,\n };\n\n res.status(402);\n res.setHeader(X402_HEADERS.PAYMENT_REQUIRED, JSON.stringify(requirement));\n res.json({\n error: 'Payment Required',\n requirement,\n });\n return;\n }\n\n // Parse the payment payload\n let payload: PaymentPayload;\n try {\n if (!payloadHeader) {\n throw new Error('Missing payment payload header');\n }\n const parsedPayload = JSON.parse(\n typeof payloadHeader === 'string' ? payloadHeader : String(payloadHeader)\n );\n const result = PaymentPayloadSchema.safeParse(parsedPayload);\n if (!result.success) {\n throw new Error(`Invalid payload: ${result.error.message}`);\n }\n payload = result.data;\n } catch (error) {\n res.status(400).json({\n error: 'Invalid Payment',\n message: error instanceof Error ? error.message : 'Failed to parse payment payload',\n });\n return;\n }\n\n // Construct signed payment\n const signedPayment: SignedPayment = {\n payload,\n signature: (typeof signatureHeader === 'string' \n ? signatureHeader \n : String(signatureHeader)) as `0x${string}`,\n signer: payload.payer as `0x${string}`,\n };\n\n // Verify the payment\n let verificationResult: PaymentVerificationResult;\n\n if (facilitatorUrl) {\n // Use external facilitator\n verificationResult = await verifyPaymentWithFacilitator(\n signedPayment,\n facilitatorUrl,\n networkId\n );\n } else {\n // Local verification\n verificationResult = await verifyPaymentSignatureLocal(\n signedPayment,\n recipientAddress,\n chainId\n );\n }\n\n if (!verificationResult.valid) {\n res.status(402).json({\n error: 'Payment Verification Failed',\n message: verificationResult.error,\n });\n return;\n }\n\n // Run custom verification if provided\n if (customVerify) {\n const customValid = await customVerify(signedPayment, req);\n if (!customValid) {\n res.status(402).json({\n error: 'Payment Rejected',\n message: 'Custom verification failed',\n });\n return;\n }\n }\n\n // Check amount matches\n if (BigInt(payload.amount) < BigInt(amount)) {\n res.status(402).json({\n error: 'Insufficient Payment',\n message: `Expected ${amount}, received ${payload.amount}`,\n });\n return;\n }\n\n // Attach payment info to request\n req.x402 = {\n payment: signedPayment,\n verified: true,\n signer: verificationResult.signer!,\n };\n\n next();\n } catch (error) {\n if (onError && error instanceof Error) {\n onError(error, req, res);\n return;\n }\n\n console.error('[x402] Middleware error:', error);\n res.status(500).json({\n error: 'Internal Server Error',\n message: 'Payment processing failed',\n });\n }\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Create a payment requirement object for manual 402 responses\n */\nexport function createPaymentRequirement(\n config: Pick<X402MiddlewareConfig, \n 'recipientAddress' | 'amount' | 'tokenAddress' | 'description' | 'networkId'\n > & {\n resource?: string;\n deadline?: number;\n nonce?: string;\n }\n): PaymentRequirement {\n const {\n recipientAddress,\n amount,\n tokenAddress = BSC_USDT.address,\n description,\n networkId = BSC_CAIP_ID,\n resource,\n deadline,\n nonce,\n } = config;\n\n return {\n amount,\n token: tokenAddress,\n network_id: networkId,\n pay_to: recipientAddress,\n description,\n resource,\n expires_at: deadline ?? calculateDeadline(300),\n nonce: nonce ?? generateNonce(),\n version: X402_VERSION,\n };\n}\n\n/**\n * Verify a signed payment independently (not as middleware)\n */\nexport async function verifyPayment(\n payment: SignedPayment,\n recipientAddress: Address,\n networkId: string = BSC_CAIP_ID,\n facilitatorUrl?: string\n): Promise<PaymentVerificationResult> {\n const chainId = extractChainId(networkId);\n\n if (facilitatorUrl) {\n return verifyPaymentWithFacilitator(payment, facilitatorUrl, networkId);\n }\n\n return verifyPaymentSignatureLocal(payment, recipientAddress, chainId);\n}\n\n/**\n * Parse payment from request headers\n */\nexport function parsePaymentFromRequest(req: Request): SignedPayment | null {\n try {\n const signatureHeader = req.headers[X402_HEADERS.PAYMENT_SIGNATURE] ||\n req.headers[X402_HEADERS.PAYMENT_SIGNATURE.toLowerCase()];\n const payloadHeader = req.headers[X402_HEADERS.PAYMENT_PAYLOAD] ||\n req.headers[X402_HEADERS.PAYMENT_PAYLOAD.toLowerCase()];\n\n if (!signatureHeader || !payloadHeader) {\n return null;\n }\n\n const payload = JSON.parse(\n typeof payloadHeader === 'string' ? payloadHeader : String(payloadHeader)\n );\n\n const result = SignedPaymentSchema.safeParse({\n payload,\n signature: typeof signatureHeader === 'string' \n ? signatureHeader \n : String(signatureHeader),\n signer: payload.payer,\n });\n\n return result.success ? result.data as SignedPayment : null;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\nexport {\n type X402MiddlewareConfig,\n type PaymentRequirement,\n type PaymentPayload,\n type SignedPayment,\n type PaymentVerificationResult,\n X402_HEADERS,\n} from '../types/index.js';\n\n// Re-export error classes\nexport { PaymentVerificationError, PaymentExpiredError } from '../types/index.js';\n\nexport {\n BSC_CAIP_ID,\n BSC_CHAIN_ID,\n BSC_USDT,\n BSC_USDC,\n BSC_TOKENS,\n formatTokenAmount,\n parseTokenAmount,\n} from '../chains/bnb.js';\n"]}
@@ -0,0 +1,158 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ /* @wazabiai/x402 - x402 v2 Payment Protocol SDK */
6
+
7
+ var X402_VERSION = "2.0.0";
8
+ var X402_DOMAIN_NAME = "x402";
9
+ var X402_HEADERS = {
10
+ PAYMENT_REQUIRED: "x-payment-required",
11
+ PAYMENT_SIGNATURE: "x-payment-signature",
12
+ PAYMENT_PAYLOAD: "x-payment-payload"
13
+ };
14
+ var PaymentRequirementSchema = zod.z.object({
15
+ /** Payment amount in smallest token unit (wei/satoshi) as string */
16
+ amount: zod.z.string().regex(/^\d+$/, "Amount must be a numeric string"),
17
+ /** Token contract address */
18
+ token: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid token address"),
19
+ /** CAIP-2 network identifier */
20
+ network_id: zod.z.string().regex(/^eip155:\d+$/, "Invalid CAIP-2 network ID"),
21
+ /** Recipient address for payment */
22
+ pay_to: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid recipient address"),
23
+ /** Optional: Payment description */
24
+ description: zod.z.string().optional(),
25
+ /** Optional: Resource identifier being accessed */
26
+ resource: zod.z.string().optional(),
27
+ /** Optional: Expiration timestamp (Unix epoch seconds) */
28
+ expires_at: zod.z.number().int().positive().optional(),
29
+ /** Optional: Unique nonce to prevent replay attacks */
30
+ nonce: zod.z.string().optional(),
31
+ /** Protocol version */
32
+ version: zod.z.string().optional()
33
+ });
34
+ var PaymentPayloadSchema = zod.z.object({
35
+ /** Payment amount in smallest token unit */
36
+ amount: zod.z.string().regex(/^\d+$/, "Amount must be a numeric string"),
37
+ /** Token contract address */
38
+ token: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid token address"),
39
+ /** Chain ID (numeric) */
40
+ chainId: zod.z.number().int().positive(),
41
+ /** Recipient address */
42
+ payTo: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid recipient address"),
43
+ /** Payer address (signer) */
44
+ payer: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid payer address"),
45
+ /** Unix timestamp when payment expires */
46
+ deadline: zod.z.number().int().positive(),
47
+ /** Unique nonce to prevent replay attacks */
48
+ nonce: zod.z.string(),
49
+ /** Optional: Resource being accessed */
50
+ resource: zod.z.string().optional()
51
+ });
52
+ var PAYMENT_TYPES = {
53
+ Payment: [
54
+ { name: "amount", type: "uint256" },
55
+ { name: "token", type: "address" },
56
+ { name: "chainId", type: "uint256" },
57
+ { name: "payTo", type: "address" },
58
+ { name: "payer", type: "address" },
59
+ { name: "deadline", type: "uint256" },
60
+ { name: "nonce", type: "string" },
61
+ { name: "resource", type: "string" }
62
+ ]
63
+ };
64
+ var SignedPaymentSchema = zod.z.object({
65
+ payload: PaymentPayloadSchema,
66
+ signature: zod.z.string().regex(/^0x[a-fA-F0-9]+$/, "Invalid signature format"),
67
+ signer: zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid signer address")
68
+ });
69
+ var X402Error = class _X402Error extends Error {
70
+ constructor(message, code, details) {
71
+ super(message);
72
+ this.code = code;
73
+ this.details = details;
74
+ this.name = "X402Error";
75
+ Object.setPrototypeOf(this, _X402Error.prototype);
76
+ }
77
+ };
78
+ var PaymentRequiredError = class _PaymentRequiredError extends X402Error {
79
+ constructor(requirement, message = "Payment required") {
80
+ super(message, "PAYMENT_REQUIRED", { requirement });
81
+ this.requirement = requirement;
82
+ this.name = "PaymentRequiredError";
83
+ Object.setPrototypeOf(this, _PaymentRequiredError.prototype);
84
+ }
85
+ };
86
+ var PaymentVerificationError = class _PaymentVerificationError extends X402Error {
87
+ constructor(message, details) {
88
+ super(message, "PAYMENT_VERIFICATION_FAILED", details);
89
+ this.details = details;
90
+ this.name = "PaymentVerificationError";
91
+ Object.setPrototypeOf(this, _PaymentVerificationError.prototype);
92
+ }
93
+ };
94
+ var UnsupportedNetworkError = class _UnsupportedNetworkError extends X402Error {
95
+ constructor(networkId, supportedNetworks) {
96
+ super(
97
+ `Network ${networkId} is not supported. Supported networks: ${supportedNetworks.join(", ")}`,
98
+ "UNSUPPORTED_NETWORK",
99
+ { networkId, supportedNetworks }
100
+ );
101
+ this.name = "UnsupportedNetworkError";
102
+ Object.setPrototypeOf(this, _UnsupportedNetworkError.prototype);
103
+ }
104
+ };
105
+ var PaymentExpiredError = class _PaymentExpiredError extends X402Error {
106
+ constructor(deadline) {
107
+ super(
108
+ `Payment has expired. Deadline: ${new Date(deadline * 1e3).toISOString()}`,
109
+ "PAYMENT_EXPIRED",
110
+ { deadline }
111
+ );
112
+ this.name = "PaymentExpiredError";
113
+ Object.setPrototypeOf(this, _PaymentExpiredError.prototype);
114
+ }
115
+ };
116
+ function extractChainId(caipId) {
117
+ const match = caipId.match(/^eip155:(\d+)$/);
118
+ if (!match?.[1]) {
119
+ throw new X402Error(`Invalid CAIP-2 identifier: ${caipId}`, "INVALID_CAIP_ID");
120
+ }
121
+ return parseInt(match[1], 10);
122
+ }
123
+ function createCaipId(chainId) {
124
+ return `eip155:${chainId}`;
125
+ }
126
+ function generateNonce() {
127
+ const bytes = new Uint8Array(16);
128
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
129
+ crypto.getRandomValues(bytes);
130
+ } else {
131
+ for (let i = 0; i < bytes.length; i++) {
132
+ bytes[i] = Math.floor(Math.random() * 256);
133
+ }
134
+ }
135
+ return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
136
+ }
137
+ function calculateDeadline(durationSeconds = 300) {
138
+ return Math.floor(Date.now() / 1e3) + durationSeconds;
139
+ }
140
+
141
+ exports.PAYMENT_TYPES = PAYMENT_TYPES;
142
+ exports.PaymentExpiredError = PaymentExpiredError;
143
+ exports.PaymentPayloadSchema = PaymentPayloadSchema;
144
+ exports.PaymentRequiredError = PaymentRequiredError;
145
+ exports.PaymentRequirementSchema = PaymentRequirementSchema;
146
+ exports.PaymentVerificationError = PaymentVerificationError;
147
+ exports.SignedPaymentSchema = SignedPaymentSchema;
148
+ exports.UnsupportedNetworkError = UnsupportedNetworkError;
149
+ exports.X402Error = X402Error;
150
+ exports.X402_DOMAIN_NAME = X402_DOMAIN_NAME;
151
+ exports.X402_HEADERS = X402_HEADERS;
152
+ exports.X402_VERSION = X402_VERSION;
153
+ exports.calculateDeadline = calculateDeadline;
154
+ exports.createCaipId = createCaipId;
155
+ exports.extractChainId = extractChainId;
156
+ exports.generateNonce = generateNonce;
157
+ //# sourceMappingURL=index.cjs.map
158
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * x402 Protocol Version\n */\nexport const X402_VERSION = '2.0.0' as const;\n\n/**\n * EIP-712 Domain name for x402 protocol\n */\nexport const X402_DOMAIN_NAME = 'x402' as const;\n\n/**\n * HTTP Header names used in x402 protocol\n */\nexport const X402_HEADERS = {\n PAYMENT_REQUIRED: 'x-payment-required',\n PAYMENT_SIGNATURE: 'x-payment-signature',\n PAYMENT_PAYLOAD: 'x-payment-payload',\n} as const;\n\n// ============================================================================\n// Network Configuration Types\n// ============================================================================\n\n/**\n * Supported token symbol types\n */\nexport type TokenSymbol = 'USDT' | 'USDC' | 'BNB' | 'BUSD';\n\n/**\n * Token configuration for a specific blockchain\n */\nexport interface TokenConfig {\n /** Token contract address (0x...) */\n address: `0x${string}`;\n /** Token symbol */\n symbol: TokenSymbol;\n /** Token decimals (typically 18 for most tokens) */\n decimals: number;\n /** Human-readable token name */\n name: string;\n}\n\n/**\n * Network configuration for a specific blockchain\n */\nexport interface NetworkConfig {\n /** CAIP-2 chain identifier (e.g., 'eip155:56' for BSC) */\n caipId: string;\n /** Numeric chain ID */\n chainId: number;\n /** Human-readable network name */\n name: string;\n /** Default RPC URL */\n rpcUrl: string;\n /** Native currency symbol */\n nativeCurrency: {\n name: string;\n symbol: string;\n decimals: number;\n };\n /** Block explorer URL */\n blockExplorer: string;\n /** Supported tokens on this network */\n tokens: Record<string, TokenConfig>;\n}\n\n// ============================================================================\n// Payment Requirement Types\n// ============================================================================\n\n/**\n * Zod schema for PaymentRequirement validation\n */\nexport const PaymentRequirementSchema = z.object({\n /** Payment amount in smallest token unit (wei/satoshi) as string */\n amount: z.string().regex(/^\\d+$/, 'Amount must be a numeric string'),\n /** Token contract address */\n token: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid token address'),\n /** CAIP-2 network identifier */\n network_id: z.string().regex(/^eip155:\\d+$/, 'Invalid CAIP-2 network ID'),\n /** Recipient address for payment */\n pay_to: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid recipient address'),\n /** Optional: Payment description */\n description: z.string().optional(),\n /** Optional: Resource identifier being accessed */\n resource: z.string().optional(),\n /** Optional: Expiration timestamp (Unix epoch seconds) */\n expires_at: z.number().int().positive().optional(),\n /** Optional: Unique nonce to prevent replay attacks */\n nonce: z.string().optional(),\n /** Protocol version */\n version: z.string().optional(),\n});\n\n/**\n * Payment requirement structure returned in 402 response header\n */\nexport type PaymentRequirement = z.infer<typeof PaymentRequirementSchema>;\n\n// ============================================================================\n// EIP-712 Payment Payload Types\n// ============================================================================\n\n/**\n * EIP-712 Domain structure for x402 protocol\n */\nexport interface X402Domain {\n name: typeof X402_DOMAIN_NAME;\n version: string;\n chainId: number;\n verifyingContract?: `0x${string}`;\n}\n\n/**\n * Zod schema for PaymentPayload validation\n */\nexport const PaymentPayloadSchema = z.object({\n /** Payment amount in smallest token unit */\n amount: z.string().regex(/^\\d+$/, 'Amount must be a numeric string'),\n /** Token contract address */\n token: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid token address'),\n /** Chain ID (numeric) */\n chainId: z.number().int().positive(),\n /** Recipient address */\n payTo: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid recipient address'),\n /** Payer address (signer) */\n payer: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid payer address'),\n /** Unix timestamp when payment expires */\n deadline: z.number().int().positive(),\n /** Unique nonce to prevent replay attacks */\n nonce: z.string(),\n /** Optional: Resource being accessed */\n resource: z.string().optional(),\n});\n\n/**\n * EIP-712 typed data payload for signing\n */\nexport type PaymentPayload = z.infer<typeof PaymentPayloadSchema>;\n\n/**\n * EIP-712 type definitions for Payment message\n */\nexport const PAYMENT_TYPES = {\n Payment: [\n { name: 'amount', type: 'uint256' },\n { name: 'token', type: 'address' },\n { name: 'chainId', type: 'uint256' },\n { name: 'payTo', type: 'address' },\n { name: 'payer', type: 'address' },\n { name: 'deadline', type: 'uint256' },\n { name: 'nonce', type: 'string' },\n { name: 'resource', type: 'string' },\n ],\n} as const;\n\n// ============================================================================\n// Signed Payment Types\n// ============================================================================\n\n/**\n * Complete signed payment ready to be sent as header\n */\nexport interface SignedPayment {\n /** The payment payload that was signed */\n payload: PaymentPayload;\n /** EIP-712 signature (0x prefixed) */\n signature: `0x${string}`;\n /** Address of the signer */\n signer: `0x${string}`;\n}\n\n/**\n * Zod schema for SignedPayment validation\n */\nexport const SignedPaymentSchema = z.object({\n payload: PaymentPayloadSchema,\n signature: z.string().regex(/^0x[a-fA-F0-9]+$/, 'Invalid signature format'),\n signer: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid signer address'),\n});\n\n// ============================================================================\n// Client Configuration Types\n// ============================================================================\n\n/**\n * Configuration options for X402Client\n */\nexport interface X402ClientConfig {\n /** Private key for signing (hex string with or without 0x prefix) */\n privateKey?: string;\n /** Custom RPC URL to use instead of default */\n rpcUrl?: string;\n /** Supported network IDs (defaults to ['eip155:56']) */\n supportedNetworks?: string[];\n /** Default deadline duration in seconds (default: 300 = 5 minutes) */\n defaultDeadline?: number;\n /** Auto-retry on 402 response (default: true) */\n autoRetry?: boolean;\n /** Maximum retries for payment (default: 1) */\n maxRetries?: number;\n /** Custom axios instance configuration */\n axiosConfig?: Record<string, unknown>;\n /** Callback when payment is required */\n onPaymentRequired?: (requirement: PaymentRequirement) => void | Promise<void>;\n /** Callback when payment is signed */\n onPaymentSigned?: (payment: SignedPayment) => void | Promise<void>;\n}\n\n// ============================================================================\n// Server/Middleware Configuration Types\n// ============================================================================\n\n/**\n * Payment verification result\n */\nexport interface PaymentVerificationResult {\n /** Whether the payment signature is valid */\n valid: boolean;\n /** Recovered signer address if valid */\n signer?: `0x${string}`;\n /** Error message if invalid */\n error?: string;\n /** The verified payment payload */\n payload?: PaymentPayload;\n}\n\n/**\n * Facilitator verification request\n */\nexport interface FacilitatorVerifyRequest {\n signature: string;\n payload: PaymentPayload;\n networkId: string;\n}\n\n/**\n * Facilitator verification response\n */\nexport interface FacilitatorVerifyResponse {\n valid: boolean;\n signer?: string;\n error?: string;\n balanceSufficient?: boolean;\n allowanceSufficient?: boolean;\n}\n\n/**\n * Configuration options for x402 server middleware\n */\nexport interface X402MiddlewareConfig {\n /** Recipient address for payments */\n recipientAddress: `0x${string}`;\n /** Payment amount in smallest token unit */\n amount: string;\n /** Token contract address (defaults to BSC-USDT) */\n tokenAddress?: `0x${string}`;\n /** Optional facilitator URL for offloading verification */\n facilitatorUrl?: string;\n /** Custom payment description */\n description?: string;\n /** Network ID (defaults to 'eip155:56') */\n networkId?: string;\n /** Deadline duration in seconds (default: 300) */\n deadlineDuration?: number;\n /** Custom nonce generator */\n nonceGenerator?: () => string;\n /** Callback to verify payment against custom logic (e.g., database) */\n verifyPayment?: (payment: SignedPayment, req: unknown) => Promise<boolean>;\n /** Routes to exclude from payment requirement */\n excludeRoutes?: string[];\n /** Custom error handler */\n onError?: (error: Error, req: unknown, res: unknown) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error class for x402 protocol errors\n */\nexport class X402Error extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'X402Error';\n Object.setPrototypeOf(this, X402Error.prototype);\n }\n}\n\n/**\n * Error thrown when payment is required but not provided\n */\nexport class PaymentRequiredError extends X402Error {\n constructor(\n public requirement: PaymentRequirement,\n message = 'Payment required'\n ) {\n super(message, 'PAYMENT_REQUIRED', { requirement });\n this.name = 'PaymentRequiredError';\n Object.setPrototypeOf(this, PaymentRequiredError.prototype);\n }\n}\n\n/**\n * Error thrown when payment signature verification fails\n */\nexport class PaymentVerificationError extends X402Error {\n constructor(\n message: string,\n public details?: Record<string, unknown>\n ) {\n super(message, 'PAYMENT_VERIFICATION_FAILED', details);\n this.name = 'PaymentVerificationError';\n Object.setPrototypeOf(this, PaymentVerificationError.prototype);\n }\n}\n\n/**\n * Error thrown when network is not supported\n */\nexport class UnsupportedNetworkError extends X402Error {\n constructor(\n networkId: string,\n supportedNetworks: string[]\n ) {\n super(\n `Network ${networkId} is not supported. Supported networks: ${supportedNetworks.join(', ')}`,\n 'UNSUPPORTED_NETWORK',\n { networkId, supportedNetworks }\n );\n this.name = 'UnsupportedNetworkError';\n Object.setPrototypeOf(this, UnsupportedNetworkError.prototype);\n }\n}\n\n/**\n * Error thrown when payment has expired\n */\nexport class PaymentExpiredError extends X402Error {\n constructor(deadline: number) {\n super(\n `Payment has expired. Deadline: ${new Date(deadline * 1000).toISOString()}`,\n 'PAYMENT_EXPIRED',\n { deadline }\n );\n this.name = 'PaymentExpiredError';\n Object.setPrototypeOf(this, PaymentExpiredError.prototype);\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Hex string type (0x prefixed)\n */\nexport type HexString = `0x${string}`;\n\n/**\n * Address type (0x prefixed, 40 hex chars)\n */\nexport type Address = `0x${string}`;\n\n/**\n * Extract chain ID from CAIP-2 identifier\n */\nexport function extractChainId(caipId: string): number {\n const match = caipId.match(/^eip155:(\\d+)$/);\n if (!match?.[1]) {\n throw new X402Error(`Invalid CAIP-2 identifier: ${caipId}`, 'INVALID_CAIP_ID');\n }\n return parseInt(match[1], 10);\n}\n\n/**\n * Create CAIP-2 identifier from chain ID\n */\nexport function createCaipId(chainId: number): string {\n return `eip155:${chainId}`;\n}\n\n/**\n * Generate a random nonce\n */\nexport function generateNonce(): string {\n const bytes = new Uint8Array(16);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n // Fallback for Node.js without Web Crypto\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Calculate deadline from duration\n */\nexport function calculateDeadline(durationSeconds: number = 300): number {\n return Math.floor(Date.now() / 1000) + durationSeconds;\n}\n"]}