@voyage_ai/v402-web-ts 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/index.ts","../src/types/index.ts","../src/types/common.ts","../src/types/svm.ts","../src/types/evm.ts","../src/services/svm/payment-header.ts","../src/services/svm/payment-handler.ts","../src/services/evm/payment-header.ts","../src/services/evm/payment-handler.ts","../src/utils/wallet.ts","../src/utils/payment-helpers.ts","../src/utils/network.ts","../src/utils/helpers.ts"],"sourcesContent":["/**\n * @x402/sdk\n * \n * x402 Payment SDK for SVM (Solana) and EVM chains\n * \n * @example\n * ```typescript\n * import { handleSvmPayment, handleEvmPayment } from '@x402/sdk';\n * \n * // SVM payment\n * const response = await handleSvmPayment(endpoint, {\n * wallet: window.solana,\n * network: 'solana-devnet'\n * });\n * \n * // EVM payment\n * const response = await handleEvmPayment(endpoint, {\n * wallet: { address, signTypedData },\n * network: 'base-sepolia'\n * });\n * ```\n */\n\n// ============================================\n// Type exports\n// ============================================\nexport type {\n // Common types\n WalletAdapter,\n EvmWalletAdapter,\n NetworkType,\n \n // SVM types\n SolanaNetwork,\n SolanaPaymentPayload,\n SvmClientConfig,\n CreateSvmPaymentHeaderParams,\n \n // EVM types\n EvmNetwork,\n EvmPaymentPayload,\n EvmClientConfig,\n CreateEvmPaymentHeaderParams,\n EvmNetworkConfig,\n \n // x402 protocol types (re-exported from x402/types)\n PaymentRequirements,\n x402Response,\n VerifyResponse,\n SettleResponse,\n ExactSvmPayload,\n ExactEvmPayload,\n SPLTokenAmount,\n} from \"./types\";\n\nexport {\n // Enums and constants\n SolanaNetworkSchema,\n SolanaPaymentPayloadSchema,\n EvmNetworkSchema,\n EvmPaymentPayloadSchema,\n EVM_NETWORK_CONFIGS,\n getChainId,\n} from \"./types\";\n\n// ============================================\n// Service exports\n// ============================================\n\n// SVM (Solana) services\nexport {\n // High-level API\n handleSvmPayment,\n createSvmPaymentFetch,\n \n // Low-level API\n createSvmPaymentHeader,\n getDefaultSolanaRpcUrl,\n} from \"./services/svm\";\n\n// EVM services\nexport {\n // High-level API\n handleEvmPayment,\n createEvmPaymentFetch,\n \n // Low-level API\n createEvmPaymentHeader,\n getChainIdFromNetwork,\n} from \"./services/evm\";\n\n// ============================================\n// Utility exports\n// ============================================\nexport {\n // Wallet utilities\n isWalletInstalled,\n getWalletProvider,\n formatAddress,\n getWalletInstallUrl,\n getWalletDisplayName,\n \n // Network utilities\n getNetworkType,\n isEvmNetwork,\n isSolanaNetwork,\n isSolanaAddress,\n isEvmAddress,\n getNetworkDisplayName,\n \n // General helpers\n toAtomicUnits,\n fromAtomicUnits,\n is402Response,\n \n // Payment helpers\n makePayment,\n} from \"./utils\";\n\n","/**\n * x402 Payment SDK - Type Definitions\n *\n * This package provides TypeScript types for the x402 payment protocol,\n * supporting both SVM (Solana) and EVM (Ethereum) chains.\n *\n * Architecture:\n * - Maximizes use of official x402/types\n * - Minimal custom types for SDK-specific needs\n * - Framework-agnostic wallet adapters\n */\n\n// ============================================\n// Re-export x402 official types\n// ============================================\nexport type {\n // Protocol types\n PaymentRequirements,\n x402Response,\n VerifyResponse,\n SettleResponse,\n SupportedPaymentKind,\n SupportedPaymentKindsResponse,\n ErrorReasons,\n\n // Chain-specific payloads\n ExactSvmPayload,\n ExactEvmPayload,\n\n // Token types\n SPLTokenAmount,\n\n // Middleware & server config\n PaymentMiddlewareConfig,\n RouteConfig,\n} from \"x402/types\";\n\nexport {\n // Schemas\n PaymentRequirementsSchema,\n x402ResponseSchema,\n VerifyResponseSchema,\n SettleResponseSchema,\n SupportedPaymentKindSchema,\n SupportedPaymentKindsResponseSchema,\n ExactSvmPayloadSchema,\n ExactEvmPayloadSchema,\n\n // Constants\n SupportedSVMNetworks,\n SvmNetworkToChainId,\n} from \"x402/types\";\n\n// ============================================\n// Common types\n// ============================================\nexport type {\n WalletAdapter,\n EvmWalletAdapter,\n} from \"./common\";\n\nexport {\n NetworkType,\n} from \"./common\";\n\n// ============================================\n// SVM (Solana) specific types\n// ============================================\nexport type {\n SolanaNetwork,\n SolanaPaymentPayload,\n SvmClientConfig,\n CreateSvmPaymentHeaderParams,\n} from \"./svm\";\n\nexport {\n SolanaNetworkSchema,\n SolanaPaymentPayloadSchema,\n} from \"./svm\";\n\n// ============================================\n// EVM specific types\n// ============================================\nexport type {\n EvmNetwork,\n EvmPaymentPayload,\n EvmClientConfig,\n CreateEvmPaymentHeaderParams,\n EvmNetworkConfig,\n} from \"./evm\";\n\nexport {\n EvmNetworkSchema,\n EvmPaymentPayloadSchema,\n EVM_NETWORK_CONFIGS,\n getChainId,\n} from \"./evm\";\n","/**\n * Common types for x402 SDK\n * Framework-agnostic types that work across different wallet implementations\n */\n\nimport {VersionedTransaction} from \"@solana/web3.js\";\n\n/**\n * Generic wallet adapter interface - works with any wallet provider\n * Compatible with Anza wallet-adapter, Privy, and custom implementations\n */\nexport interface WalletAdapter {\n // Anza wallet-adapter standard\n publicKey?: { toString(): string };\n\n // Alternative property (e.g., Privy or custom wallets)\n address?: string;\n\n // Transaction signing - required for payment authorization\n signTransaction: (tx: VersionedTransaction) => Promise<VersionedTransaction>;\n}\n\n/**\n * EVM wallet adapter interface\n */\nexport interface EvmWalletAdapter {\n address: string;\n signTypedData: (\n domain: any,\n types: any,\n message: any\n ) => Promise<string>;\n switchChain?: (chainId: string) => Promise<void>;\n}\n\n/**\n * Network type enum - for wallet detection\n */\nexport enum NetworkType {\n EVM = 'evm',\n SOLANA = 'solana',\n SVM = 'svm', // Alias for Solana\n UNKNOWN = 'unknown'\n}\n\nexport const PROD_BACK_URL = \"https://v402.onvoyage.ai/api\";\nexport const DEV_BACK_URL = \"http://localhost:3000/api\";\n\n","/**\n * SVM (Solana) specific types\n * Uses x402 official types as base\n */\n\nimport {z} from \"zod\";\nimport {type ExactSvmPayload, ExactSvmPayloadSchema, type PaymentRequirements,} from \"x402/types\";\nimport type {WalletAdapter} from \"./common\";\n\n// Re-export x402 SVM types\nexport type {ExactSvmPayload, PaymentRequirements};\nexport {ExactSvmPayloadSchema};\n\n/**\n * Solana network enum\n */\nexport const SolanaNetworkSchema = z.enum([\n \"solana-devnet\",\n \"solana\",\n \"solana-mainnet\", // Alias for mainnet\n]);\n\nexport type SolanaNetwork = z.infer<typeof SolanaNetworkSchema>;\n\n/**\n * Solana payment payload schema (conforms to x402 spec)\n */\nexport const SolanaPaymentPayloadSchema = z.object({\n x402Version: z.literal(1),\n scheme: z.literal(\"exact\"),\n network: SolanaNetworkSchema,\n payload: ExactSvmPayloadSchema,\n});\n\nexport type SolanaPaymentPayload = z.infer<typeof SolanaPaymentPayloadSchema>;\n\n/**\n * Configuration for Solana payment client\n */\nexport interface SvmClientConfig {\n wallet: WalletAdapter;\n network: SolanaNetwork;\n rpcUrl?: string;\n maxPaymentAmount?: bigint; // Maximum amount willing to pay (in atomic units)\n}\n\n/**\n * Configuration for creating Solana payment header\n */\nexport interface CreateSvmPaymentHeaderParams {\n wallet: WalletAdapter;\n paymentRequirements: PaymentRequirements;\n x402Version: number;\n rpcUrl: string;\n}\n\n","/**\n * EVM specific types\n * Uses x402 official types as base\n */\n\nimport {z} from \"zod\";\nimport {type ExactEvmPayload, ExactEvmPayloadSchema, type PaymentRequirements,} from \"x402/types\";\nimport type {EvmWalletAdapter} from \"./common\";\n\n// Re-export x402 EVM types\nexport type {ExactEvmPayload, PaymentRequirements};\nexport {ExactEvmPayloadSchema};\n\n/**\n * EVM network enum (common networks)\n */\nexport const EvmNetworkSchema = z.enum([\n \"ethereum\",\n \"sepolia\",\n \"base\",\n \"base-sepolia\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\",\n]);\n\nexport type EvmNetwork = z.infer<typeof EvmNetworkSchema>;\n\n/**\n * EVM payment payload schema (conforms to x402 spec)\n */\nexport const EvmPaymentPayloadSchema = z.object({\n x402Version: z.literal(1),\n scheme: z.literal(\"exact\"),\n network: EvmNetworkSchema,\n payload: ExactEvmPayloadSchema,\n});\n\nexport type EvmPaymentPayload = z.infer<typeof EvmPaymentPayloadSchema>;\n\n/**\n * Configuration for EVM payment client\n */\nexport interface EvmClientConfig {\n wallet: EvmWalletAdapter;\n network: EvmNetwork;\n maxPaymentAmount?: bigint; // Maximum amount willing to pay (in atomic units)\n}\n\n/**\n * Configuration for creating EVM payment header\n */\nexport interface CreateEvmPaymentHeaderParams {\n wallet: EvmWalletAdapter;\n paymentRequirements: PaymentRequirements;\n x402Version: number;\n chainId: number;\n}\n\n/**\n * Network configuration for EVM chains\n */\nexport interface EvmNetworkConfig {\n chainId: string;\n chainName: string;\n rpcUrls: string[];\n nativeCurrency: {\n name: string;\n symbol: string;\n decimals: number;\n };\n}\n\n/**\n * Common EVM network configurations\n */\nexport const EVM_NETWORK_CONFIGS: Record<string, EvmNetworkConfig> = {\n \"ethereum\": {\n chainId: \"0x1\",\n chainName: \"Ethereum Mainnet\",\n rpcUrls: [\"https://eth.llamarpc.com\"],\n nativeCurrency: {name: \"Ether\", symbol: \"ETH\", decimals: 18},\n },\n \"sepolia\": {\n chainId: \"0xaa36a7\",\n chainName: \"Sepolia\",\n rpcUrls: [\"https://sepolia.infura.io/v3/\"],\n nativeCurrency: {name: \"Ether\", symbol: \"ETH\", decimals: 18},\n },\n \"base\": {\n chainId: \"0x2105\",\n chainName: \"Base\",\n rpcUrls: [\"https://mainnet.base.org\"],\n nativeCurrency: {name: \"Ether\", symbol: \"ETH\", decimals: 18},\n },\n \"base-sepolia\": {\n chainId: \"0x14a34\",\n chainName: \"Base Sepolia\",\n rpcUrls: [\"https://sepolia.base.org\"],\n nativeCurrency: {name: \"Ether\", symbol: \"ETH\", decimals: 18},\n },\n};\n\n/**\n * Get chain ID from network name\n */\nexport function getChainId(network: string): number {\n const chainIdMap: Record<string, number> = {\n 'ethereum': 1,\n 'sepolia': 11155111,\n 'base': 8453,\n 'base-sepolia': 84532,\n 'polygon': 137,\n 'arbitrum': 42161,\n 'optimism': 10,\n };\n return chainIdMap[network.toLowerCase()] || 1;\n}\n\n","/**\n * SVM (Solana) Payment Header Builder\n *\n * Low-level API: Creates X-PAYMENT header for Solana transactions\n * Use this when you want to build the payment header yourself and handle fetch separately\n */\n\nimport {\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n createTransferCheckedInstruction,\n getAssociatedTokenAddress,\n getMint,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport type {CreateSvmPaymentHeaderParams} from \"../../types\";\n\n/**\n * Create X-PAYMENT header for Solana payment\n *\n * @param params - Payment header parameters\n * @returns Base64-encoded X-PAYMENT header string\n *\n * @example\n * ```typescript\n * const paymentHeader = await createSvmPaymentHeader({\n * wallet: phantomWallet,\n * paymentRequirements: requirements,\n * x402Version: 1,\n * rpcUrl: \"https://api.devnet.solana.com\"\n * });\n *\n * // Use the header in your own fetch\n * const response = await fetch(endpoint, {\n * headers: {\n * \"X-PAYMENT\": paymentHeader\n * }\n * });\n * ```\n */\nexport async function createSvmPaymentHeader(\n params: CreateSvmPaymentHeaderParams\n): Promise<string> {\n const {wallet, paymentRequirements, x402Version, rpcUrl} = params;\n\n const connection = new Connection(rpcUrl, \"confirmed\");\n\n // Extract fee payer from payment requirements\n const feePayer = (paymentRequirements as { extra?: { feePayer?: string } })?.extra?.feePayer;\n if (typeof feePayer !== \"string\" || !feePayer) {\n throw new Error(\"Missing facilitator feePayer in payment requirements (extra.feePayer).\");\n }\n const feePayerPubkey = new PublicKey(feePayer);\n\n // Support both Anza wallet-adapter (publicKey) and custom implementations (address)\n const walletAddress = wallet?.publicKey?.toString() || wallet?.address;\n if (!walletAddress) {\n throw new Error(\"Missing connected Solana wallet address or publicKey\");\n }\n const userPubkey = new PublicKey(walletAddress);\n\n if (!paymentRequirements?.payTo) {\n throw new Error(\"Missing payTo in payment requirements\");\n }\n const destination = new PublicKey(paymentRequirements.payTo);\n\n const instructions: TransactionInstruction[] = [];\n\n // The facilitator REQUIRES ComputeBudget instructions in positions 0 and 1\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: 7_000, // Sufficient for SPL token transfer\n })\n );\n\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1, // Minimal price\n })\n );\n\n // SPL token or Token-2022\n if (!paymentRequirements.asset) {\n throw new Error(\"Missing token mint for SPL transfer\");\n }\n const mintPubkey = new PublicKey(paymentRequirements.asset as string);\n\n // Determine program (token vs token-2022) by reading mint owner\n const mintInfo = await connection.getAccountInfo(mintPubkey, \"confirmed\");\n const programId =\n mintInfo?.owner?.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to get decimals\n const mint = await getMint(connection, mintPubkey, undefined, programId);\n\n // Derive source and destination ATAs\n const sourceAta = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n const destinationAta = await getAssociatedTokenAddress(\n mintPubkey,\n destination,\n false,\n programId\n );\n\n // Check if source ATA exists (user must already have token account)\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta, \"confirmed\");\n if (!sourceAtaInfo) {\n throw new Error(\n `User does not have an Associated Token Account for ${paymentRequirements.asset}. Please create one first or ensure you have the required token.`\n );\n }\n\n // Check if destination ATA exists (receiver must already have token account)\n const destAtaInfo = await connection.getAccountInfo(destinationAta, \"confirmed\");\n if (!destAtaInfo) {\n throw new Error(\n `Destination does not have an Associated Token Account for ${paymentRequirements.asset}. The receiver must create their token account before receiving payments.`\n );\n }\n\n // TransferChecked instruction\n const amount = BigInt(paymentRequirements.maxAmountRequired);\n\n instructions.push(\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n amount,\n mint.decimals,\n [],\n programId\n )\n );\n\n // Get recent blockhash\n const {blockhash} = await connection.getLatestBlockhash(\"confirmed\");\n\n const message = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create transaction\n const transaction = new VersionedTransaction(message);\n\n // Sign with user's wallet\n if (typeof wallet?.signTransaction !== \"function\") {\n throw new Error(\"Connected wallet does not support signTransaction\");\n }\n\n const userSignedTx = await wallet.signTransaction(transaction);\n\n // Serialize the signed transaction\n const serializedTransaction = Buffer.from(userSignedTx.serialize()).toString(\"base64\");\n\n // Create payment payload matching x402 spec\n const paymentPayload = {\n x402Version: x402Version,\n scheme: paymentRequirements.scheme,\n network: paymentRequirements.network,\n payload: {\n transaction: serializedTransaction,\n },\n };\n\n // Encode payment payload as base64 for X-PAYMENT header\n const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString(\"base64\");\n\n return paymentHeader;\n}\n\n/**\n * Helper: Get default RPC URL for Solana network\n */\nexport function getDefaultSolanaRpcUrl(network: string): string {\n const normalized = network.toLowerCase();\n\n if (normalized === \"solana\" || normalized === \"solana-mainnet\") {\n return \"https://api.mainnet-beta.solana.com\";\n } else if (normalized === \"solana-devnet\") {\n return \"https://api.devnet.solana.com\";\n }\n\n throw new Error(`Unsupported Solana network: ${network}`);\n}\n\n","/**\n * SVM (Solana) Payment Handler\n *\n * High-level API: Automatically handles the full payment flow\n * Use this for the simplest integration - just provide wallet and endpoint\n */\n\nimport type {SvmClientConfig} from \"../../types\";\nimport {SolanaNetworkSchema} from \"../../types\";\nimport type {PaymentRequirements, x402Response} from \"x402/types\";\nimport {createSvmPaymentHeader, getDefaultSolanaRpcUrl} from \"./payment-header\";\n\n/**\n * Handle SVM payment with automatic x402 flow\n *\n * @param endpoint - API endpoint that requires x402 payment\n * @param config - SVM client configuration\n * @param requestInit - Optional fetch RequestInit options\n * @returns Response from the endpoint after successful payment\n *\n * @example\n * ```typescript\n * // Simple usage with Phantom wallet\n * const response = await handleSvmPayment(\n * \"https://api.example.com/protected\",\n * {\n * wallet: window.solana,\n * network: \"solana-devnet\"\n * }\n * );\n * const data = await response.json();\n * ```\n */\nexport async function handleSvmPayment(\n endpoint: string,\n config: SvmClientConfig,\n requestInit?: RequestInit\n): Promise<Response> {\n const {wallet, network, rpcUrl, maxPaymentAmount} = config;\n\n // 1. Make initial request\n const initialResponse = await fetch(endpoint, {\n ...requestInit,\n method: requestInit?.method || \"POST\",\n });\n\n // If not 402, return as-is\n if (initialResponse.status !== 402) {\n return initialResponse;\n }\n\n // 2. Parse payment requirements from 402 response\n const rawResponse = await initialResponse.json() as x402Response;\n\n const x402Version: number = rawResponse.x402Version;\n const parsedPaymentRequirements: PaymentRequirements[] = rawResponse.accepts || [];\n\n // 3. Select suitable payment requirement for Solana\n const selectedRequirements = parsedPaymentRequirements.find(\n (req: PaymentRequirements) =>\n req.scheme === \"exact\" &&\n SolanaNetworkSchema.safeParse(req.network.toLowerCase()).success\n );\n\n if (!selectedRequirements) {\n console.error(\n \"❌ No suitable Solana payment requirements found. Available networks:\",\n parsedPaymentRequirements.map((req) => req.network)\n );\n throw new Error(\"No suitable Solana payment requirements found\");\n }\n\n // 4. Check amount against max value if specified\n if (maxPaymentAmount && maxPaymentAmount > BigInt(0)) {\n if (BigInt(selectedRequirements.maxAmountRequired) > maxPaymentAmount) {\n throw new Error(\n `Payment amount ${selectedRequirements.maxAmountRequired} exceeds maximum allowed ${maxPaymentAmount}`\n );\n }\n }\n\n // 5. Get RPC URL (use provided or default)\n const effectiveRpcUrl = rpcUrl || getDefaultSolanaRpcUrl(network);\n\n // 6. Create payment header\n const paymentHeader = await createSvmPaymentHeader({\n wallet,\n paymentRequirements: selectedRequirements,\n x402Version,\n rpcUrl: effectiveRpcUrl,\n });\n\n // 7. Retry with payment header\n const newInit = {\n ...requestInit,\n method: requestInit?.method || \"POST\",\n headers: {\n ...(requestInit?.headers || {}),\n \"X-PAYMENT\": paymentHeader,\n \"Access-Control-Expose-Headers\": \"X-PAYMENT-RESPONSE\",\n },\n };\n\n return await fetch(endpoint, newInit);\n}\n\n/**\n * Create a custom fetch function that automatically handles x402 payments for SVM\n *\n * @example\n * ```typescript\n * const paymentFetch = createSvmPaymentFetch({\n * wallet: window.solana,\n * network: \"solana-devnet\",\n * maxPaymentAmount: BigInt(1_000_000) // 1 USDC max\n * });\n *\n * // Use like regular fetch\n * const response = await paymentFetch(\"https://api.example.com/protected\");\n * ```\n */\nexport function createSvmPaymentFetch(\n config: SvmClientConfig\n): typeof fetch {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const endpoint = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n return handleSvmPayment(endpoint, config, init);\n };\n}\n\n","/**\n * EVM Payment Header Builder\n *\n * Low-level API: Creates X-PAYMENT header for EVM transactions\n * Use this when you want to build the payment header yourself and handle fetch separately\n */\n\nimport {ethers} from \"ethers\";\nimport type {CreateEvmPaymentHeaderParams} from \"../../types\";\n\n/**\n * Create X-PAYMENT header for EVM payment (EIP-3009 format)\n *\n * @param params - Payment header parameters\n * @returns Base64-encoded X-PAYMENT header string\n *\n * @example\n * ```typescript\n * const paymentHeader = await createEvmPaymentHeader({\n * wallet: metamaskWallet,\n * paymentRequirements: requirements,\n * x402Version: 1,\n * chainId: 84532\n * });\n *\n * // Use the header in your own fetch\n * const response = await fetch(endpoint, {\n * headers: {\n * \"X-PAYMENT\": paymentHeader\n * }\n * });\n * ```\n */\nexport async function createEvmPaymentHeader(\n params: CreateEvmPaymentHeaderParams\n): Promise<string> {\n const {wallet, paymentRequirements, x402Version, chainId} = params;\n\n if (!paymentRequirements?.payTo) {\n throw new Error(\"Missing payTo in payment requirements\");\n }\n\n if (!paymentRequirements?.asset) {\n throw new Error(\"Missing asset (token contract) in payment requirements\");\n }\n\n // Get current timestamp (seconds)\n const now = Math.floor(Date.now() / 1000);\n\n // Generate nonce (random 32 bytes, EIP-3009 standard)\n const nonceBytes = ethers.randomBytes(32);\n const nonceBytes32 = ethers.hexlify(nonceBytes);\n\n // Build EIP-712 domain (using token contract address as verifyingContract)\n const domain = {\n name: (paymentRequirements as any).extra?.name || \"USDC\",\n version: (paymentRequirements as any).extra?.version || \"2\",\n chainId: chainId,\n verifyingContract: paymentRequirements.asset as `0x${string}`,\n };\n\n // Build EIP-712 types (EIP-3009 TransferWithAuthorization format)\n const types = {\n TransferWithAuthorization: [\n {name: \"from\", type: \"address\"},\n {name: \"to\", type: \"address\"},\n {name: \"value\", type: \"uint256\"},\n {name: \"validAfter\", type: \"uint256\"},\n {name: \"validBefore\", type: \"uint256\"},\n {name: \"nonce\", type: \"bytes32\"},\n ],\n };\n\n // Build authorization object (for signing)\n const authorization = {\n from: wallet.address as `0x${string}`,\n to: paymentRequirements.payTo as `0x${string}`,\n value: paymentRequirements.maxAmountRequired,\n validAfter: \"0\", // Effective immediately\n validBefore: String(now + (paymentRequirements.maxTimeoutSeconds || 3600)),\n nonce: nonceBytes32,\n };\n\n // Sign typed data\n const signature = await wallet.signTypedData(domain, types, authorization);\n\n // Build X-PAYMENT header\n const headerPayload = {\n x402_version: x402Version,\n x402Version: x402Version,\n scheme: paymentRequirements.scheme,\n network: paymentRequirements.network,\n payload: {\n signature,\n authorization: {\n from: authorization.from,\n to: authorization.to,\n value: String(authorization.value),\n valid_after: authorization.validAfter,\n validAfter: authorization.validAfter,\n valid_before: authorization.validBefore,\n validBefore: authorization.validBefore,\n nonce: authorization.nonce,\n },\n },\n };\n\n // Encode as base64\n const paymentHeader = btoa(JSON.stringify(headerPayload));\n\n return paymentHeader;\n}\n\n/**\n * Get chain ID from network name\n */\nexport function getChainIdFromNetwork(network: string): number {\n const chainIdMap: Record<string, number> = {\n 'ethereum': 1,\n 'sepolia': 11155111,\n 'base': 8453,\n 'base-sepolia': 84532,\n 'polygon': 137,\n 'arbitrum': 42161,\n 'optimism': 10,\n };\n\n const chainId = chainIdMap[network.toLowerCase()];\n if (!chainId) {\n throw new Error(`Unknown network: ${network}`);\n }\n\n return chainId;\n}\n\n","/**\n * EVM Payment Handler\n *\n * High-level API: Automatically handles the full payment flow\n * Use this for the simplest integration - just provide wallet and endpoint\n */\n\nimport type {EvmClientConfig} from \"../../types\";\nimport {EvmNetworkSchema} from \"../../types\";\nimport type {PaymentRequirements, x402Response} from \"x402/types\";\nimport {createEvmPaymentHeader, getChainIdFromNetwork} from \"./payment-header\";\n\n/**\n * Handle EVM payment with automatic x402 flow\n *\n * @param endpoint - API endpoint that requires x402 payment\n * @param config - EVM client configuration\n * @param requestInit - Optional fetch RequestInit options\n * @returns Response from the endpoint after successful payment\n *\n * @example\n * ```typescript\n * // Simple usage with MetaMask\n * const provider = new ethers.BrowserProvider(window.ethereum);\n * const signer = await provider.getSigner();\n *\n * const response = await handleEvmPayment(\n * \"https://api.example.com/protected\",\n * {\n * wallet: {\n * address: await signer.getAddress(),\n * signTypedData: (domain, types, message) =>\n * signer.signTypedData(domain, types, message)\n * },\n * network: \"base-sepolia\"\n * }\n * );\n * ```\n */\nexport async function handleEvmPayment(\n endpoint: string,\n config: EvmClientConfig,\n requestInit?: RequestInit\n): Promise<Response> {\n const {wallet, network, maxPaymentAmount} = config;\n\n // 1. Make initial request\n const initialResponse = await fetch(endpoint, {\n ...requestInit,\n method: requestInit?.method || \"POST\",\n });\n\n // If not 402, return as-is\n if (initialResponse.status !== 402) {\n return initialResponse;\n }\n\n // 2. Parse payment requirements from 402 response\n const rawResponse = await initialResponse.json() as x402Response;\n\n const x402Version: number = rawResponse.x402Version;\n const parsedPaymentRequirements: PaymentRequirements[] = rawResponse.accepts || [];\n\n // 3. Select suitable payment requirement for EVM\n const selectedRequirements = parsedPaymentRequirements.find(\n (req: PaymentRequirements) =>\n req.scheme === \"exact\" &&\n EvmNetworkSchema.safeParse(req.network.toLowerCase()).success\n );\n\n\n if (!selectedRequirements) {\n console.error(\n \"❌ No suitable EVM payment requirements found. Available networks:\",\n parsedPaymentRequirements.map((req) => req.network)\n );\n throw new Error(\"No suitable EVM payment requirements found\");\n }\n\n // 4. Check amount against max value if specified\n if (maxPaymentAmount && maxPaymentAmount > BigInt(0)) {\n if (BigInt(selectedRequirements.maxAmountRequired) > maxPaymentAmount) {\n throw new Error(\n `Payment amount ${selectedRequirements.maxAmountRequired} exceeds maximum allowed ${maxPaymentAmount}`\n );\n }\n }\n\n // 5. Switch chain if needed (if wallet supports it)\n const targetChainId = getChainIdFromNetwork(selectedRequirements.network);\n if (wallet.switchChain) {\n try {\n await wallet.switchChain(`0x${targetChainId.toString(16)}`);\n } catch (error) {\n console.warn(\"Failed to switch chain:\", error);\n // Continue anyway - wallet might already be on correct chain\n }\n }\n\n // 6. Create payment header\n const paymentHeader = await createEvmPaymentHeader({\n wallet,\n paymentRequirements: selectedRequirements,\n x402Version,\n chainId: targetChainId,\n });\n\n // 7. Retry with payment header\n const newInit = {\n ...requestInit,\n method: requestInit?.method || \"POST\",\n headers: {\n ...(requestInit?.headers || {}),\n \"X-PAYMENT\": paymentHeader,\n \"Access-Control-Expose-Headers\": \"X-PAYMENT-RESPONSE\",\n },\n };\n\n return await fetch(endpoint, newInit);\n}\n\n/**\n * Create a custom fetch function that automatically handles x402 payments for EVM\n *\n * @example\n * ```typescript\n * const paymentFetch = createEvmPaymentFetch({\n * wallet: myWallet,\n * network: \"base-sepolia\",\n * maxPaymentAmount: BigInt(1_000_000) // 1 USDC max\n * });\n *\n * // Use like regular fetch\n * const response = await paymentFetch(\"https://api.example.com/protected\");\n * ```\n */\nexport function createEvmPaymentFetch(\n config: EvmClientConfig\n): typeof fetch {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const endpoint = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n return handleEvmPayment(endpoint, config, init);\n };\n}\n\n","/**\n * Wallet utilities\n *\n * Generic wallet connection and management utilities\n * Framework-agnostic and chain-agnostic\n */\n\nimport {NetworkType} from \"../types\";\n\nconst WALLET_DISCONNECTED_KEY = 'wallet_manually_disconnected';\nconst CONNECTED_NETWORK_TYPE_KEY = 'connected_network_type';\n\n/**\n * Check if a wallet is installed for a specific network type\n */\nexport function isWalletInstalled(networkType: NetworkType): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n switch (networkType) {\n case NetworkType.EVM:\n return !!(window as any).ethereum;\n\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n return !!(window as any).solana || !!(window as any).phantom;\n\n default:\n return false;\n }\n}\n\n/**\n * Get wallet provider for a network type\n */\nexport function getWalletProvider(networkType: NetworkType): any {\n if (typeof window === 'undefined') {\n return null;\n }\n\n switch (networkType) {\n case NetworkType.EVM:\n return (window as any).ethereum;\n\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n return (window as any).solana || (window as any).phantom;\n\n default:\n return null;\n }\n}\n\n/**\n * Format wallet address for display (show first 6 and last 4 characters)\n */\nexport function formatAddress(address: string): string {\n if (!address || address.length < 10) {\n return address;\n }\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Mark wallet as manually disconnected\n */\nexport function markWalletDisconnected(): void {\n if (typeof window !== 'undefined') {\n localStorage.setItem(WALLET_DISCONNECTED_KEY, 'true');\n localStorage.removeItem(CONNECTED_NETWORK_TYPE_KEY);\n }\n}\n\n/**\n * Clear wallet disconnection flag\n */\nexport function clearWalletDisconnection(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(WALLET_DISCONNECTED_KEY);\n }\n}\n\n/**\n * Check if user manually disconnected wallet\n */\nexport function isWalletManuallyDisconnected(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n return localStorage.getItem(WALLET_DISCONNECTED_KEY) === 'true';\n}\n\n/**\n * Save connected network type\n */\nexport function saveConnectedNetworkType(networkType: NetworkType): void {\n if (typeof window !== 'undefined') {\n localStorage.setItem(CONNECTED_NETWORK_TYPE_KEY, networkType);\n }\n}\n\n/**\n * Get saved network type\n */\nexport function getConnectedNetworkType(): NetworkType | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const type = localStorage.getItem(CONNECTED_NETWORK_TYPE_KEY);\n return type as NetworkType || null;\n}\n\n/**\n * Get wallet install URL\n */\nexport function getWalletInstallUrl(networkType: NetworkType): string {\n switch (networkType) {\n case NetworkType.EVM:\n return 'https://metamask.io/download/';\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n return 'https://phantom.app/download';\n default:\n return '#';\n }\n}\n\n/**\n * Get wallet display name\n */\nexport function getWalletDisplayName(networkType: NetworkType): string {\n switch (networkType) {\n case NetworkType.EVM:\n return 'MetaMask';\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n return 'Phantom';\n default:\n return 'Unknown Wallet';\n }\n}\n","/**\n * Payment helper utilities for demo/UI\n * Simplified payment handling with callbacks\n */\n\nimport {NetworkType} from \"../types\";\nimport type {PaymentRequirements} from \"x402/types\";\nimport {handleEvmPayment, handleSvmPayment} from \"../services\";\nimport {ethers} from \"ethers\";\nimport {PROD_BACK_URL} from \"../types/common\";\n\nexport interface PaymentCallbacks {\n onStart?: () => void;\n onSuccess?: (result: any) => void;\n onError?: (error: string) => void;\n onFinish?: () => void;\n}\n\n/**\n * Parse payment requirements from 402 response\n */\nexport function parsePaymentRequired(response: any): PaymentRequirements[] | null {\n if (response && typeof response === 'object') {\n // Direct x402Response format\n if ('x402Version' in response && 'accepts' in response) {\n return response.accepts;\n }\n }\n return null;\n}\n\n/**\n * Get supported network types from payment requirements\n */\nexport function getSupportedNetworkTypes(paymentRequirements: PaymentRequirements[]): NetworkType[] {\n if (!paymentRequirements || paymentRequirements.length === 0) {\n return [];\n }\n\n const networkTypes = new Set<NetworkType>();\n\n paymentRequirements.forEach(req => {\n const network = req.network.toLowerCase();\n\n if (network.includes('solana') || network.includes('svm')) {\n networkTypes.add(NetworkType.SOLANA);\n } else if (\n network.includes('ethereum') ||\n network.includes('base') ||\n network.includes('polygon') ||\n network.includes('arbitrum') ||\n network.includes('optimism') ||\n network.includes('sepolia')\n ) {\n networkTypes.add(NetworkType.EVM);\n }\n });\n\n return Array.from(networkTypes);\n}\n\n/**\n * Make payment with automatic chain handling\n *\n * This function handles all the chain-specific logic internally.\n * Business logic should be handled via callbacks.\n *\n * @param endpoint - API endpoint\n * @param networkType - Network type (from useWallet)\n * @param merchantId - @see our website to apply\n * @returns Response from the payment\n *\n * @example\n * ```tsx\n * const response = await makePayment('/api/endpoint', networkType);\n * const data = await response.json();\n * ```\n */\nexport async function makePayment(\n networkType: NetworkType,\n merchantId: string,\n endpoint: string = PROD_BACK_URL,\n): Promise<Response> {\n endpoint = `${endpoint}/${merchantId}`;\n let response: Response;\n\n if (networkType === NetworkType.SOLANA || networkType === NetworkType.SVM) {\n // Solana payment\n const solana = (window as any).solana;\n if (!solana) {\n throw new Error('请安装 Phantom 钱包');\n }\n\n if (!solana.isConnected) {\n await solana.connect();\n }\n\n response = await handleSvmPayment(endpoint, {\n wallet: solana,\n network: 'solana-devnet',\n });\n } else if (networkType === NetworkType.EVM) {\n // EVM payment\n if (!(window as any).ethereum) {\n throw new Error('请安装 MetaMask 钱包');\n }\n\n const provider = new ethers.BrowserProvider((window as any).ethereum);\n const signer = await provider.getSigner();\n\n const wallet = {\n address: await signer.getAddress(),\n signTypedData: async (domain: any, types: any, message: any) => {\n return await signer.signTypedData(domain, types, message);\n },\n };\n\n // Detect network from endpoint or use default\n const network = endpoint.includes('sepolia') ? 'base-sepolia' : 'base';\n\n response = await handleEvmPayment(endpoint, {\n wallet,\n network: network as any,\n });\n } else {\n throw new Error(`不支持的网络类型: ${networkType}`);\n }\n\n return response;\n}\n\n/**\n * Unified payment handler with callbacks (deprecated - use makePayment directly)\n * @deprecated Use makePayment() directly and handle callbacks in your component\n */\nexport async function handlePayment(\n endpoint: string,\n networkType: NetworkType,\n callbacks?: PaymentCallbacks\n): Promise<any> {\n try {\n callbacks?.onStart?.();\n\n const response = await makePayment(networkType, '', endpoint);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`请求失败 (${response.status}): ${errorText}`);\n }\n\n const result = await response.json();\n callbacks?.onSuccess?.(result);\n return result;\n\n } catch (err: any) {\n const errorMessage = err.message || '支付失败';\n callbacks?.onError?.(errorMessage);\n throw err;\n } finally {\n callbacks?.onFinish?.();\n }\n}\n\n","/**\n * Network utilities\n *\n * Helper functions for network detection and validation\n */\n\nimport {NetworkType} from \"../types\";\n\n/**\n * Network type mapping\n */\nconst NETWORK_TYPE_MAP: Record<string, NetworkType> = {\n // EVM chains\n 'ethereum': NetworkType.EVM,\n 'eth': NetworkType.EVM,\n 'base': NetworkType.EVM,\n 'base-sepolia': NetworkType.EVM,\n 'polygon': NetworkType.EVM,\n 'arbitrum': NetworkType.EVM,\n 'optimism': NetworkType.EVM,\n 'bsc': NetworkType.EVM,\n 'sepolia': NetworkType.EVM,\n 'goerli': NetworkType.EVM,\n\n // Solana/SVM\n 'solana': NetworkType.SOLANA,\n 'solana-devnet': NetworkType.SOLANA,\n 'solana-testnet': NetworkType.SOLANA,\n 'solana-mainnet': NetworkType.SOLANA,\n 'svm': NetworkType.SVM,\n};\n\n/**\n * Get network type from network name\n */\nexport function getNetworkType(network: string): NetworkType {\n const normalizedNetwork = network.toLowerCase().trim();\n return NETWORK_TYPE_MAP[normalizedNetwork] || NetworkType.UNKNOWN;\n}\n\n/**\n * Check if network is EVM-based\n */\nexport function isEvmNetwork(network: string): boolean {\n return getNetworkType(network) === NetworkType.EVM;\n}\n\n/**\n * Check if network is Solana-based\n */\nexport function isSolanaNetwork(network: string): boolean {\n const type = getNetworkType(network);\n return type === NetworkType.SOLANA || type === NetworkType.SVM;\n}\n\n/**\n * Validate Solana address format (base58)\n */\nexport function isSolanaAddress(address: string): boolean {\n // Solana addresses are base58 encoded, typically 32-44 characters\n // Should not start with 0x\n if (address.startsWith('0x')) {\n return false;\n }\n\n // Basic base58 character set check\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]+$/;\n return base58Regex.test(address) && address.length >= 32 && address.length <= 44;\n}\n\n/**\n * Validate EVM address format (0x-prefixed hex)\n */\nexport function isEvmAddress(address: string): boolean {\n // EVM addresses are 0x-prefixed, 42 characters total\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Get network display name\n */\nexport function getNetworkDisplayName(network: string): string {\n const displayNames: Record<string, string> = {\n 'ethereum': 'Ethereum',\n 'sepolia': 'Sepolia Testnet',\n 'base': 'Base',\n 'base-sepolia': 'Base Sepolia',\n 'polygon': 'Polygon',\n 'arbitrum': 'Arbitrum',\n 'optimism': 'Optimism',\n 'solana': 'Solana',\n 'solana-devnet': 'Solana Devnet',\n 'solana-mainnet': 'Solana Mainnet',\n };\n\n return displayNames[network.toLowerCase()] || network;\n}\n","/**\n * General helper utilities\n *\n * Miscellaneous helper functions for the SDK\n */\n\n/**\n * Convert human-readable amount to atomic units (smallest unit)\n *\n * @param amount - Human-readable amount (e.g., 2.5 for 2.5 USDC)\n * @param decimals - Token decimals (e.g., 6 for USDC, 18 for ETH)\n * @returns Amount in atomic units as bigint\n *\n * @example\n * ```typescript\n * // 2.5 USDC (6 decimals) = 2,500,000 micro-USDC\n * const atomicUnits = toAtomicUnits(2.5, 6); // 2500000n\n * ```\n */\nexport function toAtomicUnits(amount: number, decimals: number): bigint {\n return BigInt(Math.floor(amount * Math.pow(10, decimals)));\n}\n\n/**\n * Convert atomic units to human-readable amount\n *\n * @param atomicUnits - Token amount in smallest units\n * @param decimals - Token decimals (e.g., 6 for USDC, 18 for ETH)\n * @returns Human-readable amount as number\n *\n * @example\n * ```typescript\n * // 2,500,000 micro-USDC = 2.5 USDC\n * const amount = fromAtomicUnits(2500000n, 6); // 2.5\n * ```\n */\nexport function fromAtomicUnits(atomicUnits: bigint | number, decimals: number): number {\n return Number(atomicUnits) / Math.pow(10, decimals);\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: Error;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (i < maxRetries - 1) {\n const delay = baseDelay * Math.pow(2, i);\n await sleep(delay);\n }\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Parse x402Response to check if it's a 402 payment required\n */\nexport function is402Response(response: any): boolean {\n return (\n response &&\n typeof response === 'object' &&\n 'x402Version' in response &&\n 'accepts' in response &&\n Array.isArray(response.accepts)\n );\n}\n"],"mappings":"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","names":["import_types","import_zod","import_types","import_ethers"]}