@voyage_ai/v402-web-ts 0.2.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/common.ts","../../src/types/svm.ts","../../src/types/evm.ts","../../src/types/index.ts","../../src/utils/wallet.ts","../../src/react/index.ts","../../src/react/hooks/useWalletStore.ts","../../src/utils/index.ts","../../src/utils/wallet-connect.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/payment-helpers.ts","../../src/utils/network.ts","../../src/utils/payment-error-handler.ts","../../src/react/store/walletStore.ts","../../src/react/hooks/usePageNetwork.ts","../../src/react/hooks/usePayment.ts","../../src/react/hooks/usePaymentInfo.ts","../../src/react/components/WalletConnect.tsx","../../src/react/styles/inline-styles.ts","../../src/react/components/V402Checkout.tsx","../../src/react/utils/CryptoIcons.tsx"],"sourcesContent":["/**\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 getChainId?: () => Promise<string>; // Returns hex format like \"0x14a34\"\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://v402pay.onvoyage.ai/api/pay\";\n\n","/**\n * SVM (Solana) specific types\n * Uses x402 official types as base\n */\n\nimport {z} from \"zod\";\nimport {ExactSvmPayloadSchema, type PaymentRequirements} from \"x402/types\";\nimport type {WalletAdapter} from \"./common\";\n\n// Re-export x402 SVM types\nexport type {PaymentRequirements};\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 {ExactEvmPayloadSchema, type PaymentRequirements} from \"x402/types\";\nimport type {EvmWalletAdapter} from \"./common\";\n\n// Re-export x402 EVM types\nexport type {PaymentRequirements};\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 * 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 // 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\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 * 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 WALLET_DISCONNECTED_NETWORKS_KEY = 'wallet_disconnected_networks'; // 记录每个网络的断开状态\nconst CONNECTED_NETWORK_TYPE_KEY = 'connected_network_type';\nconst WALLET_ADDRESSES_KEY = 'wallet_addresses_cache'; // 多网络钱包地址缓存\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 * Get all disconnected networks\n */\nfunction getDisconnectedNetworks(): Partial<Record<NetworkType, boolean>> {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const cached = localStorage.getItem(WALLET_DISCONNECTED_NETWORKS_KEY);\n return cached ? JSON.parse(cached) : {};\n } catch (error) {\n return {};\n }\n}\n\n/**\n * Mark wallet as manually disconnected (for specific network)\n */\nexport function markWalletDisconnected(networkType?: NetworkType): void {\n if (typeof window !== 'undefined') {\n if (networkType) {\n // 标记特定网络为断开\n const disconnected = getDisconnectedNetworks();\n disconnected[networkType] = true;\n localStorage.setItem(WALLET_DISCONNECTED_NETWORKS_KEY, JSON.stringify(disconnected));\n } else {\n // 兼容旧版:全局断开\n localStorage.setItem(WALLET_DISCONNECTED_KEY, 'true');\n localStorage.removeItem(CONNECTED_NETWORK_TYPE_KEY);\n }\n }\n}\n\n/**\n * Clear wallet disconnection flag (for specific network or all)\n */\nexport function clearWalletDisconnection(networkType?: NetworkType): void {\n if (typeof window !== 'undefined') {\n if (networkType) {\n // 清除特定网络的断开标记\n const disconnected = getDisconnectedNetworks();\n delete disconnected[networkType];\n localStorage.setItem(WALLET_DISCONNECTED_NETWORKS_KEY, JSON.stringify(disconnected));\n } else {\n // 兼容旧版:清除全局断开标记\n localStorage.removeItem(WALLET_DISCONNECTED_KEY);\n }\n }\n}\n\n/**\n * Check if user manually disconnected wallet (for specific network)\n */\nexport function isWalletManuallyDisconnected(networkType?: NetworkType): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n \n if (networkType) {\n // 检查特定网络是否断开\n const disconnected = getDisconnectedNetworks();\n return disconnected[networkType] === true;\n } else {\n // 兼容旧版:检查全局断开标记\n return localStorage.getItem(WALLET_DISCONNECTED_KEY) === 'true';\n }\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/**\n * Get all cached wallet addresses\n */\nexport function getAllWalletAddresses(): Partial<Record<NetworkType, string>> {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const cached = localStorage.getItem(WALLET_ADDRESSES_KEY);\n return cached ? JSON.parse(cached) : {};\n } catch (error) {\n console.error('Failed to parse wallet addresses cache:', error);\n return {};\n }\n}\n\n/**\n * Save wallet address for a specific network\n */\nexport function saveWalletAddress(networkType: NetworkType, address: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n const addresses = getAllWalletAddresses();\n addresses[networkType] = address;\n localStorage.setItem(WALLET_ADDRESSES_KEY, JSON.stringify(addresses));\n}\n\n/**\n * Get cached wallet address for a specific network\n */\nexport function getCachedWalletAddress(networkType: NetworkType): string | null {\n const addresses = getAllWalletAddresses();\n return addresses[networkType] || null;\n}\n\n/**\n * Remove wallet address for a specific network\n */\nexport function removeWalletAddress(networkType: NetworkType): void {\n if (typeof window === 'undefined') {\n return;\n }\n const addresses = getAllWalletAddresses();\n delete addresses[networkType];\n localStorage.setItem(WALLET_ADDRESSES_KEY, JSON.stringify(addresses));\n}\n\n/**\n * Clear all cached wallet addresses\n */\nexport function clearAllWalletAddresses(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(WALLET_ADDRESSES_KEY);\n }\n}\n","/**\n * x402 Payment SDK - React Package\n *\n * Pre-built React hooks and components for easy integration\n *\n * ## Quick Start\n *\n * ```tsx\n * import { WalletConnect, PaymentButton, useWallet, usePayment } from '@x402/sdk/react';\n *\n * // No Provider needed! Just use the hooks directly\n * function App() {\n * const { address } = useWallet();\n *\n * return (\n * <div>\n * <WalletConnect />\n * {address && <PaymentButton endpoint=\"/api/protected\" />}\n * </div>\n * );\n * }\n * ```\n */\n\n// Import styles - will be auto-loaded by modern bundlers (Next.js, Vite, etc.)\nimport './styles.css';\n\n// Hooks (No Provider needed!)\nexport { useWallet } from './hooks/useWalletStore';\nexport type { UseWalletReturn } from './hooks/useWalletStore';\n\nexport { usePageNetwork } from './hooks/usePageNetwork';\nexport type { UsePageNetworkOptions } from './hooks/usePageNetwork';\n\n// Hooks\nexport { usePayment } from './hooks/usePayment';\nexport type { UsePaymentReturn } from './hooks/usePayment';\n\nexport { usePaymentInfo } from './hooks/usePaymentInfo';\nexport type { UsePaymentInfoReturn } from './hooks/usePaymentInfo';\n\n// Components\nexport { WalletConnect } from './components/WalletConnect';\nexport type { WalletConnectProps } from './components/WalletConnect';\n\nexport { default as V402Checkout } from './components/V402Checkout';\nexport type { V402CheckoutProps } from './components/V402Checkout';\n","/**\n * useWallet Hook (External Store)\n *\n * Uses useSyncExternalStore for optimal performance\n * No Provider needed!\n */\n\nimport {useSyncExternalStore} from 'react';\nimport {walletStore} from '../store/walletStore';\nimport {NetworkType} from '../../types';\n\nexport interface UseWalletReturn {\n // State\n address: string | null;\n networkType: NetworkType | null;\n isConnecting: boolean;\n error: string | null;\n\n // Actions\n connect: (networkType: NetworkType) => Promise<void>;\n switchNetwork: (networkType: NetworkType) => Promise<void>;\n ensureNetwork: (networkType: NetworkType) => Promise<void>;\n disconnect: () => void;\n clearError: () => void;\n}\n\n/**\n * Hook for wallet connection\n * No Provider needed - uses external store\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { address, connect, disconnect } = useWallet();\n *\n * return (\n * <div>\n * {address ? (\n * <button onClick={disconnect}>Disconnect</button>\n * ) : (\n * <button onClick={() => connect(NetworkType.SOLANA)}>Connect</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWallet(): UseWalletReturn {\n // Use React 18's useSyncExternalStore for optimal performance\n const state = useSyncExternalStore(\n (listener) => walletStore.subscribe(listener),\n () => walletStore.getState(),\n () => walletStore.getState() // Server snapshot\n );\n\n return {\n ...state,\n connect: (type: NetworkType) => walletStore.connect(type),\n switchNetwork: (type: NetworkType) => walletStore.switchNetwork(type),\n ensureNetwork: (type: NetworkType) => walletStore.ensureNetwork(type),\n disconnect: () => walletStore.disconnect(),\n clearError: () => walletStore.clearError(),\n };\n}\n\n","/**\n * x402 Payment SDK - Utilities\n *\n * General-purpose utilities for wallet management, network detection, and helpers\n */\n\n// Wallet utilities\nexport {\n isWalletInstalled,\n getWalletProvider,\n formatAddress,\n markWalletDisconnected,\n clearWalletDisconnection,\n isWalletManuallyDisconnected,\n saveConnectedNetworkType,\n getConnectedNetworkType,\n getWalletInstallUrl,\n getWalletDisplayName,\n // 多网络钱包缓存\n getAllWalletAddresses,\n saveWalletAddress,\n getCachedWalletAddress,\n removeWalletAddress,\n clearAllWalletAddresses,\n} from \"./wallet\";\n\n// Wallet connection utilities (for demo/UI)\nexport {\n connectWallet,\n disconnectWallet,\n getCurrentWallet,\n switchNetwork, // 新增:切换网络\n onAccountsChanged,\n onChainChanged,\n onWalletDisconnect,\n} from \"./wallet-connect\";\n\n// Payment helpers (for demo/UI)\nexport {\n makePayment,\n parsePaymentRequired,\n getSupportedNetworkTypes,\n type PaymentCallbacks,\n} from \"./payment-helpers\";\n\n// Network utilities\nexport {\n getNetworkType,\n isEvmNetwork,\n isSolanaNetwork,\n isSolanaAddress,\n isEvmAddress,\n getNetworkDisplayName,\n} from \"./network\";\n\n// General helpers\nexport {\n toAtomicUnits,\n fromAtomicUnits,\n sleep,\n retryWithBackoff,\n is402Response,\n} from \"./helpers\";\n\n// Payment error handling\nexport {\n parsePaymentError,\n wrapPaymentError,\n PaymentOperationError,\n PaymentErrorCode,\n type PaymentError,\n} from \"./payment-error-handler\";\n","/**\n * Wallet connection utilities for demo/UI\n * Higher-level helpers built on top of base wallet utilities\n */\n\nimport {NetworkType} from \"../types\";\nimport {\n clearWalletDisconnection,\n getCachedWalletAddress,\n getConnectedNetworkType as getStoredNetworkType,\n isWalletManuallyDisconnected as checkManualDisconnect,\n markWalletDisconnected,\n removeWalletAddress,\n saveConnectedNetworkType,\n saveWalletAddress\n} from \"./wallet\";\n\n/**\n * Connect wallet and return address\n */\nexport async function connectWallet(networkType: NetworkType): Promise<string> {\n if (typeof window === 'undefined') {\n throw new Error('请在浏览器环境中使用');\n }\n\n let address: string;\n\n switch (networkType) {\n case NetworkType.EVM: {\n if (!(window as any).ethereum) {\n throw new Error('请安装 MetaMask 或其他以太坊钱包');\n }\n const ethereum = (window as any).ethereum;\n const accounts = await ethereum.request({\n method: 'eth_requestAccounts',\n params: [],\n });\n if (!accounts || accounts.length === 0) {\n throw new Error('未能获取到钱包地址');\n }\n address = accounts[0];\n break;\n }\n\n case NetworkType.SOLANA:\n case NetworkType.SVM: {\n const solana = (window as any).solana;\n if (!solana) {\n throw new Error('请安装 Phantom 或其他 Solana 钱包');\n }\n const response = await solana.connect();\n address = response.publicKey.toString();\n break;\n }\n\n default:\n throw new Error('不支持的网络类型');\n }\n\n // Save connection state\n clearWalletDisconnection(networkType); // 清除该网络的断开标记\n saveConnectedNetworkType(networkType);\n // 缓存钱包地址,支持多网络切换\n saveWalletAddress(networkType, address);\n\n return address;\n}\n\n/**\n * Disconnect wallet\n * @param networkType - 可选,指定要断开的网络类型。如果不指定,则断开当前网络\n * @param clearAll - 是否清除所有网络的缓存,默认为 false\n */\nexport function disconnectWallet(networkType?: NetworkType, clearAll: boolean = false): void {\n if (clearAll) {\n // 清除所有网络的钱包缓存\n const { clearAllWalletAddresses } = require('./wallet');\n clearAllWalletAddresses();\n markWalletDisconnected();\n } else if (networkType) {\n // 只清除指定网络的缓存\n removeWalletAddress(networkType);\n // 不调用 markWalletDisconnected(),避免影响其他网络\n } else {\n // 清除当前连接的网络缓存\n const currentNetwork = getStoredNetworkType();\n if (currentNetwork) {\n removeWalletAddress(currentNetwork);\n }\n // 不调用 markWalletDisconnected(),避免影响其他网络\n }\n}\n\n/**\n * Get current wallet address\n * 优先从缓存读取,如果缓存存在则验证其有效性\n */\nexport async function getCurrentWallet(networkType?: NetworkType): Promise<string | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const type = networkType || getStoredNetworkType();\n if (!type) {\n return null;\n }\n\n // 先尝试从缓存读取\n const cachedAddress = getCachedWalletAddress(type);\n \n try {\n let currentAddress: string | null = null;\n \n switch (type) {\n case NetworkType.EVM: {\n if (!(window as any).ethereum) return cachedAddress;\n const accounts = await (window as any).ethereum.request({\n method: 'eth_accounts',\n params: [],\n });\n currentAddress = accounts && accounts.length > 0 ? accounts[0] : null;\n break;\n }\n\n case NetworkType.SOLANA:\n case NetworkType.SVM: {\n const solana = (window as any).solana;\n if (!solana || !solana.isConnected) return cachedAddress;\n currentAddress = solana.publicKey?.toString() || null;\n break;\n }\n\n default:\n return cachedAddress;\n }\n\n // 如果钱包返回的地址与缓存不一致,更新缓存\n if (currentAddress && currentAddress !== cachedAddress) {\n saveWalletAddress(type, currentAddress);\n }\n \n // 如果钱包没有返回地址但有缓存,返回缓存(钱包可能暂时未连接但用户没有断开)\n return currentAddress || cachedAddress;\n } catch (error) {\n console.error('Failed to get current wallet:', error);\n // 如果出错,返回缓存的地址\n return cachedAddress;\n }\n}\n\n/**\n * Listen for account changes (EVM only)\n */\nexport function onAccountsChanged(\n callback: (accounts: string[]) => void\n): () => void {\n if (typeof window === 'undefined' || !(window as any).ethereum) {\n return () => {\n };\n }\n\n const ethereum = (window as any).ethereum;\n const handler = (accounts: string[]) => {\n callback(accounts);\n };\n\n ethereum.on('accountsChanged', handler);\n\n return () => {\n ethereum.removeListener?.('accountsChanged', handler);\n };\n}\n\n/**\n * Listen for chain/network changes (EVM only)\n */\nexport function onChainChanged(\n callback: (chainId: string) => void\n): () => void {\n if (typeof window === 'undefined' || !(window as any).ethereum) {\n return () => {\n };\n }\n\n const ethereum = (window as any).ethereum;\n const handler = (chainId: string) => {\n console.log('🔄 Chain changed to:', chainId);\n callback(chainId);\n };\n\n ethereum.on('chainChanged', handler);\n\n return () => {\n ethereum.removeListener?.('chainChanged', handler);\n };\n}\n\n/**\n * Listen for wallet disconnect (Solana only)\n */\nexport function onWalletDisconnect(\n callback: () => void\n): () => void {\n if (typeof window === 'undefined') {\n return () => {\n };\n }\n\n const solana = (window as any).solana;\n if (!solana) {\n return () => {\n };\n }\n\n const handler = () => {\n console.log('🔌 Solana wallet disconnected');\n callback();\n };\n\n solana.on('disconnect', handler);\n\n return () => {\n solana.removeListener?.('disconnect', handler);\n };\n}\n\n/**\n * 切换到指定网络\n * 如果该网络已有缓存的钱包地址,则直接切换\n * 如果没有缓存,则需要连接钱包\n */\nexport async function switchNetwork(networkType: NetworkType): Promise<string | null> {\n const cachedAddress = getCachedWalletAddress(networkType);\n \n if (cachedAddress) {\n // 如果有缓存地址,直接切换网络类型\n saveConnectedNetworkType(networkType);\n clearWalletDisconnection(networkType); // 清除该网络的断开标记\n \n // 验证钱包是否仍然连接\n const currentAddress = await getCurrentWallet(networkType);\n if (currentAddress) {\n return currentAddress;\n }\n }\n \n // 如果没有缓存或验证失败,返回 null 表示需要重新连接\n return null;\n}\n\n/**\n * Re-export for convenience\n */\nexport {getStoredNetworkType as getConnectedNetworkType};\nexport {checkManualDisconnect as isWalletManuallyDisconnected};\nexport {getCachedWalletAddress, saveWalletAddress, removeWalletAddress};\nexport {getAllWalletAddresses} from './wallet';\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\";\nimport {wrapPaymentError} from \"../../utils\";\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 let userSignedTx: VersionedTransaction;\n try {\n userSignedTx = await wallet.signTransaction(transaction);\n console.log('✅ Transaction signed successfully');\n } catch (error: any) {\n console.error('❌ Failed to sign transaction:', error);\n throw wrapPaymentError(error);\n }\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://cathee-fu8ezd-fast-mainnet.helius-rpc.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\";\nimport {PaymentOperationError, wrapPaymentError} from \"../../utils\";\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 // 3. Check if backend returned an error (e.g., insufficient_funds, verification_failed)\n // Skip errors that are part of normal 402 flow (initial request without X-PAYMENT)\n const IGNORED_ERRORS = [\n 'X-PAYMENT header is required',\n 'missing X-PAYMENT header',\n 'payment_required',\n ];\n \n if (rawResponse.error && !IGNORED_ERRORS.includes(rawResponse.error)) {\n console.error(`❌ Payment verification failed: ${rawResponse.error}`);\n \n // Map backend error codes to user-friendly messages\n const ERROR_MESSAGES: Record<string, string> = {\n 'insufficient_funds': 'Insufficient balance to complete this payment',\n 'invalid_signature': 'Invalid payment signature',\n 'expired': 'Payment authorization has expired',\n 'already_used': 'This payment has already been used',\n 'network_mismatch': 'Payment network does not match',\n 'invalid_payment': 'Invalid payment data',\n 'verification_failed': 'Payment verification failed',\n 'invalid_exact_svm_payload_transaction_simulation_failed': 'Transaction simulation failed due to insufficient balance. Please check your wallet balance carefully and ensure you have enough funds to cover the payment and transaction fees.',\n };\n \n const errorMessage = ERROR_MESSAGES[rawResponse.error] || \n `Payment failed: ${rawResponse.error}`;\n \n const error = new Error(errorMessage);\n throw wrapPaymentError(error);\n }\n\n const x402Version: number = rawResponse.x402Version;\n const parsedPaymentRequirements: PaymentRequirements[] = rawResponse.accepts || [];\n\n // 4. 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 // 5. 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 // 6. Get RPC URL (use provided or default from backend requirements)\n const effectiveRpcUrl = rpcUrl || getDefaultSolanaRpcUrl(selectedRequirements.network);\n console.log(`📍 Using Solana RPC: ${effectiveRpcUrl.substring(0, 40)}...`);\n console.log(`📍 Network from backend: ${selectedRequirements.network}`);\n\n // 7. Create payment header with error handling\n let paymentHeader: string;\n try {\n paymentHeader = await createSvmPaymentHeader({\n wallet,\n paymentRequirements: selectedRequirements,\n x402Version,\n rpcUrl: effectiveRpcUrl,\n });\n console.log('✅ Payment header created successfully');\n } catch (error: any) {\n console.error('❌ Failed to create payment header:', error);\n throw wrapPaymentError(error);\n }\n\n // 8. 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 const retryResponse = await fetch(endpoint, newInit);\n \n // 9. Check if retry still returned 402 with error (e.g., verification failed)\n if (retryResponse.status === 402) {\n try {\n const retryData = await retryResponse.json();\n \n // Skip normal 402 errors (shouldn't happen at this point, but be safe)\n const IGNORED_ERRORS = [\n 'X-PAYMENT header is required',\n 'missing X-PAYMENT header',\n 'payment_required',\n ];\n \n if (retryData.error && !IGNORED_ERRORS.includes(retryData.error)) {\n console.error(`❌ Payment verification failed: ${retryData.error}`);\n \n // Map backend error codes to user-friendly messages\n const ERROR_MESSAGES: Record<string, string> = {\n 'insufficient_funds': 'Insufficient balance to complete this payment',\n 'invalid_signature': 'Invalid payment signature',\n 'expired': 'Payment authorization has expired',\n 'already_used': 'This payment has already been used',\n 'network_mismatch': 'Payment network does not match',\n 'invalid_payment': 'Invalid payment data',\n 'verification_failed': 'Payment verification failed',\n 'invalid_exact_svm_payload_transaction_simulation_failed': 'Transaction simulation failed due to insufficient balance. Please check your wallet balance carefully and ensure you have enough funds to cover the payment and transaction fees.',\n };\n \n const errorMessage = ERROR_MESSAGES[retryData.error] || \n `Payment failed: ${retryData.error}`;\n \n const error = new Error(errorMessage);\n throw wrapPaymentError(error);\n }\n } catch (error: any) {\n // If error is already wrapped, re-throw it\n if (error instanceof PaymentOperationError) {\n throw error;\n }\n // Otherwise it's a JSON parse error, just return the response\n console.warn('⚠️ Could not parse retry 402 response:', error);\n }\n }\n \n return retryResponse;\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\";\nimport {wrapPaymentError} from \"../../utils\";\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 // Verify current chain matches target chain (if wallet provides getChainId)\n if (wallet.getChainId) {\n try {\n const currentChainIdHex = await wallet.getChainId();\n const currentChainId = parseInt(currentChainIdHex, 16);\n\n if (currentChainId !== chainId) {\n const networkNames: Record<number, string> = {\n 1: 'Ethereum Mainnet',\n 11155111: 'Sepolia Testnet',\n 8453: 'Base Mainnet',\n 84532: 'Base Sepolia Testnet',\n 137: 'Polygon Mainnet',\n 42161: 'Arbitrum One',\n 10: 'Optimism Mainnet',\n };\n\n const currentNetworkName = networkNames[currentChainId] || `Chain ${currentChainId}`;\n const targetNetworkName = networkNames[chainId] || `Chain ${chainId}`;\n\n throw new Error(\n `Network mismatch: Your wallet is connected to ${currentNetworkName}, ` +\n `but payment requires ${targetNetworkName}. Please switch your wallet to the correct network.`\n );\n }\n\n console.log(`✅ Chain ID verified: ${chainId}`);\n } catch (error: any) {\n // If it's our own error, re-throw with better handling\n if (error.message.includes('Network mismatch')) {\n throw wrapPaymentError(error);\n }\n // Otherwise just log and continue\n console.warn(\"Could not verify chainId:\", error);\n }\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 with error handling\n let signature: string;\n try {\n signature = await wallet.signTypedData(domain, types, authorization);\n console.log('✅ Signature created successfully');\n } catch (error: any) {\n console.error('❌ Failed to create signature:', error);\n throw wrapPaymentError(error);\n }\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\";\nimport {PaymentErrorCode, PaymentOperationError, wrapPaymentError} from \"../../utils\";\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 // 3. Check if backend returned an error (e.g., insufficient_funds after signature)\n // Skip errors that are part of normal 402 flow (initial request without X-PAYMENT)\n const IGNORED_ERRORS = [\n 'X-PAYMENT header is required',\n 'missing X-PAYMENT header',\n 'payment_required',\n ];\n \n if (rawResponse.error && !IGNORED_ERRORS.includes(rawResponse.error)) {\n console.error(`❌ Payment verification failed: ${rawResponse.error}`);\n \n // Map backend error codes to user-friendly messages\n const ERROR_MESSAGES: Record<string, string> = {\n 'insufficient_funds': 'Insufficient balance to complete this payment',\n 'invalid_signature': 'Invalid payment signature',\n 'expired': 'Payment authorization has expired',\n 'already_used': 'This payment has already been used',\n 'network_mismatch': 'Payment network does not match',\n 'invalid_payment': 'Invalid payment data',\n 'verification_failed': 'Payment verification failed',\n };\n \n const errorMessage = ERROR_MESSAGES[rawResponse.error] || \n `Payment failed: ${rawResponse.error}`;\n \n const error = new Error(errorMessage);\n throw wrapPaymentError(error);\n }\n\n const x402Version: number = rawResponse.x402Version;\n const parsedPaymentRequirements: PaymentRequirements[] = rawResponse.accepts || [];\n\n // 4. 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 // 5. 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 // 6. Get target chain ID\n const targetChainId = getChainIdFromNetwork(selectedRequirements.network);\n\n // 7. Get current wallet chainId (if wallet provides it)\n let currentChainId: number | undefined;\n if (wallet.getChainId) {\n try {\n const chainIdHex = await wallet.getChainId();\n currentChainId = parseInt(chainIdHex, 16);\n console.log(`📍 Current wallet chain: ${currentChainId}`);\n } catch (error) {\n console.warn(\"⚠️ Failed to get current chainId:\", error);\n }\n }\n\n // 8. Switch chain if needed\n const networkNames: Record<number, string> = {\n 1: 'Ethereum Mainnet',\n 11155111: 'Sepolia Testnet',\n 8453: 'Base Mainnet',\n 84532: 'Base Sepolia Testnet',\n 137: 'Polygon Mainnet',\n 42161: 'Arbitrum One',\n 10: 'Optimism Mainnet',\n };\n\n // If we know current chainId and it doesn't match, we MUST switch\n if (currentChainId && currentChainId !== targetChainId) {\n if (!wallet.switchChain) {\n const currentNetworkName = networkNames[currentChainId] || `Chain ${currentChainId}`;\n const targetNetworkName = networkNames[targetChainId] || selectedRequirements.network;\n\n const error = new Error(\n `Network mismatch: Your wallet is connected to ${currentNetworkName}, ` +\n `but payment requires ${targetNetworkName}. Please switch to ${targetNetworkName} manually in your wallet.`\n );\n throw wrapPaymentError(error);\n }\n\n try {\n console.log(`🔄 Switching to chain ${targetChainId}...`);\n await wallet.switchChain(`0x${targetChainId.toString(16)}`);\n console.log(`✅ Successfully switched to chain ${targetChainId}`);\n } catch (error: any) {\n console.error('❌ Failed to switch chain:', error);\n\n const targetNetworkName = networkNames[targetChainId] || selectedRequirements.network;\n const wrappedError = wrapPaymentError(error);\n\n // Create new error with better message for network switch failure\n let finalError: PaymentOperationError;\n if (wrappedError.code === PaymentErrorCode.USER_REJECTED) {\n finalError = new PaymentOperationError({\n code: wrappedError.code,\n message: wrappedError.message,\n userMessage: `You rejected the network switch request. Please switch to ${targetNetworkName} manually.`,\n originalError: wrappedError.originalError,\n });\n } else {\n finalError = new PaymentOperationError({\n code: PaymentErrorCode.NETWORK_SWITCH_FAILED,\n message: wrappedError.message,\n userMessage: `Failed to switch to ${targetNetworkName}. Please switch manually in your wallet.`,\n originalError: wrappedError.originalError,\n });\n }\n\n throw finalError;\n }\n } else if (wallet.switchChain && !currentChainId) {\n // Try to switch even if we don't know current chain (best effort)\n try {\n console.log(`🔄 Attempting to switch to chain ${targetChainId}...`);\n await wallet.switchChain(`0x${targetChainId.toString(16)}`);\n console.log(`✅ Switch attempted successfully`);\n } catch (error) {\n console.warn(\"⚠️ Failed to switch chain (best effort):\", error);\n // Continue anyway - wallet might already be on correct chain\n }\n }\n\n // 9. Create payment header with error handling\n let paymentHeader: string;\n try {\n paymentHeader = await createEvmPaymentHeader({\n wallet,\n paymentRequirements: selectedRequirements,\n x402Version,\n chainId: targetChainId,\n });\n } catch (error: any) {\n console.error('❌ Failed to create payment header:', error);\n throw wrapPaymentError(error);\n }\n\n // 10. 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 const retryResponse = await fetch(endpoint, newInit);\n \n // 11. Check if retry still returned 402 with error (e.g., verification failed)\n if (retryResponse.status === 402) {\n try {\n const retryData = await retryResponse.json();\n \n // Skip normal 402 errors (shouldn't happen at this point, but be safe)\n const IGNORED_ERRORS = [\n 'X-PAYMENT header is required',\n 'missing X-PAYMENT header',\n 'payment_required',\n ];\n \n if (retryData.error && !IGNORED_ERRORS.includes(retryData.error)) {\n console.error(`❌ Payment verification failed: ${retryData.error}`);\n \n // Map backend error codes to user-friendly messages\n const ERROR_MESSAGES: Record<string, string> = {\n 'insufficient_funds': 'Insufficient balance to complete this payment',\n 'invalid_signature': 'Invalid payment signature',\n 'expired': 'Payment authorization has expired',\n 'already_used': 'This payment has already been used',\n 'network_mismatch': 'Payment network does not match',\n 'invalid_payment': 'Invalid payment data',\n 'verification_failed': 'Payment verification failed',\n };\n \n const errorMessage = ERROR_MESSAGES[retryData.error] || \n `Payment failed: ${retryData.error}`;\n \n const error = new Error(errorMessage);\n throw wrapPaymentError(error);\n }\n } catch (error: any) {\n // If error is already wrapped, re-throw it\n if (error instanceof PaymentOperationError) {\n throw error;\n }\n // Otherwise it's a JSON parse error, just return the response\n console.warn('⚠️ Could not parse retry 402 response:', error);\n }\n }\n \n return retryResponse;\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 * 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 * @param additionalParams - Optional additional parameters to send with the request (default: {})\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 *\n * @example\n * ```tsx\n * // With additional parameters\n * const response = await makePayment(\n * '/api/endpoint',\n * networkType,\n * merchantId,\n * { userId: '123', customField: 'value' }\n * );\n * ```\n */\nexport async function makePayment(\n networkType: NetworkType,\n merchantId: string,\n endpoint: string = PROD_BACK_URL,\n additionalParams?: Record<string, any>,\n): Promise<Response> {\n // 使用新变量而不是修改参数\n const fullEndpoint = `${endpoint}/${merchantId}`;\n let response: Response;\n\n // 准备请求配置,如果有额外参数则添加到 body 中\n const requestInit: RequestInit = additionalParams && Object.keys(additionalParams).length > 0\n ? {\n body: JSON.stringify(additionalParams),\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n : {};\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(fullEndpoint, {\n wallet: solana,\n network: 'solana', // Will use backend's network configuration\n }, requestInit);\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 // Get current chain ID from wallet\n getChainId: async () => {\n const network = await provider.getNetwork();\n return `0x${network.chainId.toString(16)}`;\n },\n // Switch to a different chain\n switchChain: async (chainId: string) => {\n await (window as any).ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId }],\n });\n },\n };\n\n // Use a placeholder network - handler will use backend's network configuration\n response = await handleEvmPayment(fullEndpoint, {\n wallet,\n network: 'base', // Will use backend's network configuration\n }, requestInit);\n } else {\n throw new Error(`不支持的网络类型: ${networkType}`);\n }\n\n return response;\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 'evm': 'EVM',\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 * Payment Error Handler\n *\n * Centralized error handling for wallet and payment operations\n * Provides user-friendly error messages for common issues\n */\n\nexport interface PaymentError {\n code: string;\n message: string;\n userMessage: string;\n originalError?: any;\n}\n\n/**\n * Error codes for payment operations\n */\nexport enum PaymentErrorCode {\n // User action errors\n USER_REJECTED = 'USER_REJECTED',\n USER_CANCELLED = 'USER_CANCELLED',\n\n // Network errors\n NETWORK_MISMATCH = 'NETWORK_MISMATCH',\n NETWORK_SWITCH_FAILED = 'NETWORK_SWITCH_FAILED',\n UNSUPPORTED_NETWORK = 'UNSUPPORTED_NETWORK',\n\n // Chain ID errors\n CHAIN_ID_MISMATCH = 'CHAIN_ID_MISMATCH',\n CHAIN_ID_UNAVAILABLE = 'CHAIN_ID_UNAVAILABLE',\n\n // Wallet errors\n WALLET_NOT_CONNECTED = 'WALLET_NOT_CONNECTED',\n WALLET_LOCKED = 'WALLET_LOCKED',\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\n\n // Payment requirement errors\n INVALID_PAYMENT_REQUIREMENTS = 'INVALID_PAYMENT_REQUIREMENTS',\n AMOUNT_EXCEEDED = 'AMOUNT_EXCEEDED',\n\n // Generic errors\n SIGNATURE_FAILED = 'SIGNATURE_FAILED',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * Parse and classify error from wallet operations\n */\nexport function parsePaymentError(error: any): PaymentError {\n // Handle null/undefined\n if (!error) {\n return {\n code: PaymentErrorCode.UNKNOWN_ERROR,\n message: 'Unknown error occurred',\n userMessage: 'An unknown error occurred. Please try again.',\n originalError: error,\n };\n }\n\n const errorMessage = error.message || error.toString();\n const errorCode = error.code;\n\n // 1. User rejected/cancelled actions\n if (\n errorCode === 4001 ||\n errorCode === 'ACTION_REJECTED' ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('user rejected') ||\n errorMessage.includes('User denied') ||\n errorMessage.includes('user denied') ||\n errorMessage.includes('ethers-user-denied')\n ) {\n return {\n code: PaymentErrorCode.USER_REJECTED,\n message: 'User rejected the transaction',\n userMessage: 'You rejected the signature request. Please try again if you want to proceed.',\n originalError: error,\n };\n }\n\n // 2. Chain ID mismatch\n if (\n errorMessage.includes('chainId') &&\n (errorMessage.includes('must match') || errorMessage.includes('does not match'))\n ) {\n // Extract chain IDs from error message if possible\n const match = errorMessage.match(/chainId.*?\"(\\d+)\".*?active.*?\"(\\d+)\"/i) ||\n errorMessage.match(/chain (\\d+).*?chain (\\d+)/i);\n \n if (match) {\n const [, requestedChain, activeChain] = match;\n return {\n code: PaymentErrorCode.CHAIN_ID_MISMATCH,\n message: `Network mismatch (wallet is on different chain): Requested ${requestedChain}, but wallet is on ${activeChain}`,\n userMessage: `Your wallet is on the wrong network. Please switch to the correct network and try again.`,\n originalError: error,\n };\n }\n\n return {\n code: PaymentErrorCode.CHAIN_ID_MISMATCH,\n message: 'Network mismatch (wallet selected network does not match)',\n userMessage: 'Your wallet is on the wrong network. Please switch to the correct network.',\n originalError: error,\n };\n }\n\n // 3. Network mismatch (general)\n if (\n errorMessage.includes('Network mismatch') ||\n errorMessage.includes('Wrong network') ||\n errorMessage.includes('Incorrect network')\n ) {\n return {\n code: PaymentErrorCode.NETWORK_MISMATCH,\n message: errorMessage,\n userMessage: 'Please switch your wallet to the correct network.',\n originalError: error,\n };\n }\n\n // 4. Wallet locked\n if (\n errorMessage.includes('locked') ||\n errorMessage.includes('Wallet is locked')\n ) {\n return {\n code: PaymentErrorCode.WALLET_LOCKED,\n message: 'Wallet is locked',\n userMessage: 'Please unlock your wallet and try again.',\n originalError: error,\n };\n }\n\n // 5. Insufficient balance/funds\n if (\n errorMessage.includes('insufficient') &&\n (errorMessage.includes('balance') || errorMessage.includes('funds'))\n ) {\n return {\n code: PaymentErrorCode.INSUFFICIENT_BALANCE,\n message: 'Insufficient balance',\n userMessage: 'You don\\'t have enough balance to complete this payment.',\n originalError: error,\n };\n }\n\n // 6. Network switch failed\n if (\n errorMessage.includes('Failed to switch') ||\n errorMessage.includes('switch chain')\n ) {\n return {\n code: PaymentErrorCode.NETWORK_SWITCH_FAILED,\n message: errorMessage,\n userMessage: 'Failed to switch network. Please switch manually in your wallet.',\n originalError: error,\n };\n }\n\n // 7. Wallet not connected\n if (\n errorMessage.includes('not connected') ||\n errorMessage.includes('No wallet') ||\n errorMessage.includes('Connect wallet')\n ) {\n return {\n code: PaymentErrorCode.WALLET_NOT_CONNECTED,\n message: 'Wallet not connected',\n userMessage: 'Please connect your wallet first.',\n originalError: error,\n };\n }\n\n // 8. Invalid payment requirements\n if (\n errorMessage.includes('No suitable') ||\n errorMessage.includes('payment requirements') ||\n errorMessage.includes('Missing payTo') ||\n errorMessage.includes('Missing asset')\n ) {\n return {\n code: PaymentErrorCode.INVALID_PAYMENT_REQUIREMENTS,\n message: errorMessage,\n userMessage: 'Invalid payment configuration. Please contact support.',\n originalError: error,\n };\n }\n\n // 9. Amount exceeded\n if (errorMessage.includes('exceeds maximum')) {\n return {\n code: PaymentErrorCode.AMOUNT_EXCEEDED,\n message: errorMessage,\n userMessage: 'Payment amount exceeds the maximum allowed.',\n originalError: error,\n };\n }\n\n // 10. Generic signature failure\n if (\n errorMessage.includes('signature') ||\n errorMessage.includes('sign') ||\n errorCode === 'UNKNOWN_ERROR'\n ) {\n return {\n code: PaymentErrorCode.SIGNATURE_FAILED,\n message: errorMessage,\n userMessage: 'Failed to sign the transaction. Please try again.',\n originalError: error,\n };\n }\n\n // Default: Unknown error\n return {\n code: PaymentErrorCode.UNKNOWN_ERROR,\n message: errorMessage,\n userMessage: 'An unexpected error occurred. Please try again or contact support.',\n originalError: error,\n };\n}\n\n/**\n * Create a user-friendly error with detailed information\n */\nexport class PaymentOperationError extends Error {\n public readonly code: string;\n public readonly userMessage: string;\n public readonly originalError?: any;\n\n constructor(paymentError: PaymentError) {\n super(paymentError.message);\n this.name = 'PaymentOperationError';\n this.code = paymentError.code;\n this.userMessage = paymentError.userMessage;\n this.originalError = paymentError.originalError;\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PaymentOperationError);\n }\n }\n\n /**\n * Get a formatted error message for logging\n */\n toLogString(): string {\n return `[${this.code}] ${this.message} | User Message: ${this.userMessage}`;\n }\n}\n\n/**\n * Wrap an error with payment error handling\n */\nexport function wrapPaymentError(error: any): PaymentOperationError {\n const parsedError = parsePaymentError(error);\n return new PaymentOperationError(parsedError);\n}\n\n","/**\n * Wallet Store (External Store)\n *\n * Lightweight state management without Context Provider\n * Uses singleton pattern + event emitter for reactivity\n */\n\nimport {NetworkType} from '../../types';\nimport {\n connectWallet as connectWalletUtil,\n isWalletManuallyDisconnected,\n markWalletDisconnected,\n onAccountsChanged,\n onChainChanged,\n onWalletDisconnect,\n removeWalletAddress,\n saveWalletAddress,\n switchNetwork as switchNetworkUtil,\n} from '../../utils';\n\ntype Listener = () => void;\n\ninterface WalletState {\n address: string | null;\n networkType: NetworkType | null;\n isConnecting: boolean;\n error: string | null;\n}\n\nclass WalletStore {\n private state: WalletState = {\n address: null,\n networkType: null,\n isConnecting: false,\n error: null,\n };\n\n private listeners = new Set<Listener>();\n private initialized = false;\n\n // Initialize store (call once)\n init() {\n if (this.initialized) return;\n this.initialized = true;\n\n // 不自动重连,让 usePageNetwork 来决定需要哪个网络\n // 这样可以确保每个页面都使用正确的网络类型\n\n // Listen for account changes (EVM only)\n onAccountsChanged((accounts) => {\n // 只有当前激活的网络是EVM时才处理账户变化\n if (this.state.networkType === NetworkType.EVM) {\n if (accounts.length === 0) {\n this.setState({address: null});\n } else if (!isWalletManuallyDisconnected(NetworkType.EVM)) {\n this.setState({address: accounts[0]});\n saveWalletAddress(NetworkType.EVM, accounts[0]);\n }\n }\n });\n\n // Listen for network/chain changes (EVM only)\n onChainChanged(() => {\n // 只有当前激活的网络是EVM时才处理链变化\n if (this.state.networkType === NetworkType.EVM) {\n // 用户在钱包中切换了链,清除当前连接\n this.handleDisconnect(NetworkType.EVM, 'Chain changed. Please reconnect your wallet.');\n }\n });\n\n // Listen for wallet disconnect (SVM only)\n onWalletDisconnect(() => {\n // 只有当前激活的网络是SVM时才处理断开\n const svmTypes = [NetworkType.SOLANA, NetworkType.SVM];\n if (this.state.networkType && svmTypes.includes(this.state.networkType)) {\n this.handleDisconnect(this.state.networkType);\n }\n });\n }\n\n\n // Get current state\n getState(): WalletState {\n return this.state;\n }\n\n // Update state and notify listeners\n private setState(partial: Partial<WalletState>) {\n this.state = {...this.state, ...partial};\n this.notifyListeners();\n }\n\n // Subscribe to state changes\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // Notify all listeners\n private notifyListeners() {\n this.listeners.forEach(listener => listener());\n }\n\n // Handle wallet disconnect (internal helper)\n private handleDisconnect(networkType: NetworkType, error?: string) {\n removeWalletAddress(networkType);\n markWalletDisconnected(networkType);\n\n // 清除当前网络类型缓存\n if (typeof window !== 'undefined') {\n localStorage.removeItem('connected_network_type');\n }\n\n this.setState({\n address: null,\n networkType: null,\n error: error || null,\n });\n }\n\n // Connect wallet\n async connect(type: NetworkType): Promise<void> {\n // 保存当前网络的地址到缓存(如果正在切换网络)\n if (this.state.address && this.state.networkType && this.state.networkType !== type) {\n saveWalletAddress(this.state.networkType, this.state.address);\n }\n\n this.setState({isConnecting: true, error: null});\n\n try {\n const walletAddress = await connectWalletUtil(type);\n\n this.setState({\n address: walletAddress,\n networkType: type,\n isConnecting: false,\n });\n } catch (err: any) {\n this.setState({\n error: err.message || 'Failed to connect wallet',\n isConnecting: false,\n });\n throw err;\n }\n }\n\n // Switch network (use cached wallet if available)\n async switchNetwork(type: NetworkType): Promise<void> {\n // 保存当前网络的地址到缓存\n if (this.state.address && this.state.networkType) {\n saveWalletAddress(this.state.networkType, this.state.address);\n }\n\n this.setState({isConnecting: true, error: null});\n\n try {\n // 尝试使用缓存的钱包地址切换\n const address = await switchNetworkUtil(type);\n\n if (address) {\n // 成功使用缓存的钱包切换\n this.setState({\n address,\n networkType: type,\n isConnecting: false,\n });\n } else {\n // 没有缓存的钱包,需要连接\n this.setState({\n address: null,\n networkType: type,\n isConnecting: true,\n });\n await this.connect(type);\n }\n } catch (err: any) {\n this.setState({\n error: err.message || 'Failed to switch network',\n isConnecting: false,\n });\n throw err;\n }\n }\n\n // Disconnect wallet\n disconnect(): void {\n const currentNetwork = this.state.networkType;\n\n if (currentNetwork) {\n // 清除当前网络的缓存并标记为手动断开\n this.handleDisconnect(currentNetwork);\n } else {\n // 即使没有当前网络,也要清理状态\n this.setState({\n address: null,\n networkType: null,\n error: null,\n });\n }\n }\n\n // Clear error\n clearError(): void {\n this.setState({error: null});\n }\n\n // Ensure network matches expected type (for page-specific network requirements)\n async ensureNetwork(expectedNetwork: NetworkType): Promise<void> {\n // 如果用户手动断开了该网络,不自动重连\n if (isWalletManuallyDisconnected(expectedNetwork)) {\n return;\n }\n\n // 如果当前网络已经匹配,直接返回\n if (this.state.networkType === expectedNetwork && this.state.address) {\n return;\n }\n\n // 如果当前网络不匹配,尝试切换\n if (this.state.networkType !== expectedNetwork) {\n await this.switchNetwork(expectedNetwork);\n } else if (!this.state.address) {\n // 网络匹配但没有地址,需要连接\n await this.connect(expectedNetwork);\n }\n }\n}\n\n// Singleton instance\nexport const walletStore = new WalletStore();\n\n// Initialize on import (browser only)\nif (typeof window !== 'undefined') {\n walletStore.init();\n}\n\n","/**\n * usePageNetwork Hook\n *\n * 页面级网络管理 Hook\n * 自动确保当前页面连接到正确的网络\n */\n\nimport {useEffect} from 'react';\nimport {NetworkType} from '../../types';\nimport {useWallet} from './useWalletStore';\n\nexport interface UsePageNetworkOptions {\n /** 是否自动切换网络(默认 true) */\n autoSwitch?: boolean;\n /** 是否在组件挂载时立即切换(默认 true) */\n switchOnMount?: boolean;\n}\n\n/**\n * 页面级网络管理 Hook\n * \n * 用于确保页面始终连接到期望的网络\n * 自动处理网络切换,保持其他网络的缓存不受影响\n * \n * @param expectedNetwork - 页面期望的网络类型(NetworkType,如 EVM、SVM)\n * @param options - 配置选项\n * \n * @example\n * ```tsx\n * // EVM 页面\n * function EvmPage() {\n * const { address, isConnecting } = usePageNetwork(NetworkType.EVM);\n * return <div>{isConnecting ? 'Connecting...' : address}</div>;\n * }\n * \n * // SVM 页面\n * function SvmPage() {\n * const { address, isConnecting } = usePageNetwork(NetworkType.SVM);\n * return <div>{isConnecting ? 'Connecting...' : address}</div>;\n * }\n * ```\n */\nexport function usePageNetwork(\n expectedNetwork: NetworkType,\n options: UsePageNetworkOptions = {}\n) {\n const {\n autoSwitch = true,\n switchOnMount = true,\n } = options;\n\n const wallet = useWallet();\n\n useEffect(() => {\n if (!autoSwitch || !switchOnMount) return;\n \n // ensureNetwork 内部会检查是否手动断开,如果是则不会重连\n wallet.ensureNetwork(expectedNetwork).catch(err => {\n console.error('Failed to ensure network:', err);\n });\n // 只在 expectedNetwork 改变时执行,避免无限循环\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [expectedNetwork]);\n\n return wallet;\n}\n\n","/**\n * usePayment Hook\n *\n * React hook for payment state management\n * Provides state only - you control the payment flow\n */\n\nimport {useCallback, useState} from 'react';\n\nexport interface UsePaymentReturn {\n // State\n isProcessing: boolean;\n result: any;\n error: string | null;\n\n // State setters\n setIsProcessing: (value: boolean) => void;\n setResult: (value: any) => void;\n setError: (value: string | null) => void;\n\n // Helpers\n clearResult: () => void;\n clearError: () => void;\n reset: () => void;\n}\n\n/**\n * Hook for managing payment state\n *\n * This hook only manages state - you control the payment logic.\n * Use SDK's handleSvmPayment/handleEvmPayment directly for full control.\n *\n * @example\n * ```tsx\n * import { usePayment, useWallet } from '../react';\n * import { handleSvmPayment } from '@/app/sdk';\n *\n * function PaymentButton() {\n * const { networkType } = useWallet();\n * const { isProcessing, setIsProcessing, result, setResult, error, setError } = usePayment();\n *\n * const handlePay = async () => {\n * if (!networkType) return;\n *\n * setIsProcessing(true);\n * setError(null);\n *\n * try {\n * const response = await handleSvmPayment('/api/endpoint', {\n * wallet: window.solana,\n * network: 'solana-devnet',\n * });\n *\n * const data = await response.json();\n * setResult(data);\n *\n * // Your custom logic here\n * console.log('Payment success!');\n * } catch (err: any) {\n * setError(err.message);\n * } finally {\n * setIsProcessing(false);\n * }\n * };\n *\n * return (\n * <div>\n * <button onClick={handlePay} disabled={isProcessing}>\n * {isProcessing ? 'Processing...' : 'Pay'}\n * </button>\n * {error && <p>Error: {error}</p>}\n * {result && <pre>{JSON.stringify(result, null, 2)}</pre>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePayment(): UsePaymentReturn {\n const [isProcessing, setIsProcessing] = useState(false);\n const [result, setResult] = useState<any>(null);\n const [error, setError] = useState<string | null>(null);\n\n const clearResult = useCallback(() => {\n setResult(null);\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const reset = useCallback(() => {\n setIsProcessing(false);\n setResult(null);\n setError(null);\n }, []);\n\n return {\n isProcessing,\n result,\n error,\n setIsProcessing,\n setResult,\n setError,\n clearResult,\n clearError,\n reset,\n };\n}\n\n","/**\n * usePaymentInfo Hook\n *\n * React hook for fetching payment information from endpoint\n */\n\nimport {useEffect, useState} from 'react';\nimport type {PaymentRequirements} from 'x402/types';\nimport {NetworkType} from '../../types';\nimport {getSupportedNetworkTypes, parsePaymentRequired} from '../../utils';\nimport {PROD_BACK_URL} from \"../../types/common\";\n\nexport interface UsePaymentInfoReturn {\n // State\n paymentInfo: PaymentRequirements[] | null;\n supportedNetworks: NetworkType[];\n isLoading: boolean;\n error: string | null;\n\n // Actions\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for fetching payment information\n *\n * @param endpoint - API endpoint to fetch payment info from\n * @param merchantId - @see our website to apply\n * @param additionalParams - Optional additional parameters to send with the request (default: {})\n *\n * @example\n * ```tsx\n * function PaymentInfo() {\n * const { paymentInfo, supportedNetworks, isLoading } = usePaymentInfo('/api/protected');\n *\n * if (isLoading) return <p>Loading...</p>;\n *\n * return (\n * <div>\n * <p>Supported networks:</p>\n * {supportedNetworks.map(net => <span key={net}>{net}</span>)}\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With additional parameters\n * function PaymentInfo() {\n * const { paymentInfo } = usePaymentInfo(\n * 'merchant-id',\n * '/api/protected',\n * { userId: '123', customField: 'value' }\n * );\n * }\n * ```\n */\nexport function usePaymentInfo(\n merchantId: string,\n endpoint: string = PROD_BACK_URL,\n additionalParams?: Record<string, any>\n): UsePaymentInfoReturn {\n const [paymentInfo, setPaymentInfo] = useState<PaymentRequirements[] | null>(null);\n const [supportedNetworks, setSupportedNetworks] = useState<NetworkType[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPaymentInfo = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n // 使用新变量而不是修改参数\n const fullEndpoint = `${endpoint}/${merchantId}`;\n\n // 准备请求配置\n const requestInit: RequestInit = {\n method: 'POST',\n ...(additionalParams && Object.keys(additionalParams).length > 0\n ? {\n body: JSON.stringify(additionalParams),\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n : {}),\n };\n\n const response = await fetch(fullEndpoint, requestInit);\n\n if (response.status === 402) {\n const body = await response.json();\n const payment = parsePaymentRequired(body);\n\n if (payment) {\n setPaymentInfo(payment);\n\n const networks = getSupportedNetworkTypes(payment);\n setSupportedNetworks(networks);\n }\n } else {\n // No payment required\n setPaymentInfo(null);\n setSupportedNetworks([]);\n }\n } catch (err: any) {\n setError(err.message || 'Failed to fetch payment info');\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n fetchPaymentInfo();\n // Note: additionalParams is not in dependencies to avoid unnecessary re-fetches\n // If you need dynamic additionalParams, wrap it with useMemo or use refetch() manually\n }, [endpoint, merchantId]);\n\n return {\n paymentInfo,\n supportedNetworks,\n isLoading,\n error,\n refetch: fetchPaymentInfo,\n };\n}\n\n","/**\n * WalletConnect Component\n *\n * Pre-built wallet connection UI component with inline styles\n */\n\n'use client';\n\nimport React, {useState} from 'react';\nimport {NetworkType} from '../../types';\nimport {formatAddress, getNetworkDisplayName, getWalletInstallUrl, isWalletInstalled,} from '../../utils';\nimport {useWallet} from '../hooks/useWalletStore';\nimport {\n buttonsContainerStyle,\n containerStyle,\n getAddressStyle,\n getConnectButtonStyle,\n getDisconnectButtonStyle,\n getErrorStyle,\n getHintStyle,\n getInstallLinkStyle,\n getLabelStyle,\n getSectionStyle,\n getTitleStyle,\n walletActionsStyle,\n walletAddressStyle,\n walletOptionStyle,\n} from '../styles/inline-styles';\n\nexport interface WalletConnectProps {\n supportedNetworks?: NetworkType[];\n className?: string;\n onConnect?: (address: string, networkType: NetworkType) => void;\n onDisconnect?: () => void;\n}\n\n/**\n * Pre-built wallet connection component\n *\n * @example\n * ```tsx\n * import { WalletConnect } from '../react';\n *\n * function App() {\n * return (\n * <WalletConnect\n * supportedNetworks={[NetworkType.SOLANA, NetworkType.EVM]}\n * onConnect={(address, network) => console.log('Connected:', address)}\n * />\n * );\n * }\n * ```\n */\nexport function WalletConnect({\n supportedNetworks = [NetworkType.SOLANA, NetworkType.EVM],\n className = '',\n onConnect,\n onDisconnect,\n }: WalletConnectProps) {\n const {address, networkType, isConnecting, error, connect, disconnect} = useWallet();\n const [hoveredButton, setHoveredButton] = useState<string | null>(null);\n const [hoveredLink, setHoveredLink] = useState<string | null>(null);\n\n const handleConnect = async (network: NetworkType) => {\n try {\n await connect(network);\n // Note: address state won't be updated yet due to async setState\n // The parent component will re-render when address updates\n } catch (err) {\n // Error is already set in hook\n }\n };\n\n const handleDisconnect = () => {\n disconnect();\n onDisconnect?.();\n };\n\n return (\n <div style={{ ...containerStyle, ...(className ? {} : {}) }} className={className}>\n {!address ? (\n <div style={getSectionStyle()}>\n <h3 style={getTitleStyle()}>Connect Wallet</h3>\n\n {supportedNetworks.length === 0 ? (\n <p style={getHintStyle()}>Please install a supported wallet extension</p>\n ) : (\n <div style={buttonsContainerStyle}>\n {supportedNetworks.map((network) => {\n const installed = isWalletInstalled(network);\n return (\n <div key={network} style={walletOptionStyle}>\n <button\n style={getConnectButtonStyle(isConnecting || !installed, hoveredButton === network)}\n onClick={() => handleConnect(network)}\n disabled={isConnecting || !installed}\n onMouseEnter={() => setHoveredButton(network)}\n onMouseLeave={() => setHoveredButton(null)}\n >\n {isConnecting ? 'Connecting...' : getNetworkDisplayName(network)}\n </button>\n {!installed && (\n <a\n href={getWalletInstallUrl(network)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={getInstallLinkStyle(hoveredLink === network)}\n onMouseEnter={() => setHoveredLink(network)}\n onMouseLeave={() => setHoveredLink(null)}\n >\n Install Wallet\n </a>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {error && <p style={getErrorStyle()}>{error}</p>}\n\n <p style={getHintStyle()}>\n To switch accounts, please change it in your wallet extension\n </p>\n </div>\n ) : (\n <div style={getSectionStyle()}>\n <div style={walletAddressStyle}>\n <span style={getLabelStyle()}>\n Connected {networkType && `(${getNetworkDisplayName(networkType)})`}\n </span>\n <span style={getAddressStyle()}>{formatAddress(address)}</span>\n </div>\n <div style={walletActionsStyle}>\n <button\n style={getDisconnectButtonStyle(hoveredButton === 'disconnect')}\n onClick={handleDisconnect}\n onMouseEnter={() => setHoveredButton('disconnect')}\n onMouseLeave={() => setHoveredButton(null)}\n >\n Disconnect\n </button>\n </div>\n <p style={getHintStyle()}>\n Switch account in your wallet to change address\n </p>\n </div>\n )}\n </div>\n );\n}\n\n","/**\n * Inline styles for x402 React Components\n *\n * Modern, minimal, and flat design without gradients or fancy borders.\n * All styles are defined as JavaScript objects to ensure they're always bundled\n * with the components. This eliminates the need for users to import CSS files.\n */\n\nimport {CSSProperties} from 'react';\n\n// 检测是否支持暗色模式\nexport const isDarkMode = (): boolean => {\n if (typeof window === 'undefined') return false;\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n};\n\n// 现代简约配色 - 扁平化设计\nconst colors = {\n // Light mode\n light: {\n background: '#fafafa',\n cardBg: '#ffffff',\n text: '#0a0a0a',\n textSecondary: '#737373',\n primary: '#000000',\n primaryHover: '#262626',\n danger: '#ef4444',\n dangerHover: '#dc2626',\n success: '#10b981',\n successHover: '#059669',\n disabled: '#e5e5e5',\n disabledText: '#a3a3a3',\n errorBg: '#fef2f2',\n errorText: '#dc2626',\n },\n // Dark mode\n dark: {\n background: '#0a0a0a',\n cardBg: '#171717',\n text: '#fafafa',\n textSecondary: '#a3a3a3',\n primary: '#ffffff',\n primaryHover: '#e5e5e5',\n danger: '#f87171',\n dangerHover: '#ef4444',\n success: '#34d399',\n successHover: '#10b981',\n disabled: '#262626',\n disabledText: '#525252',\n errorBg: '#1c1917',\n errorText: '#f87171',\n },\n};\n\n// 获取当前主题颜色\nexport const getColors = () => {\n return isDarkMode() ? colors.dark : colors.light;\n};\n\n// 容器样式\nexport const containerStyle: CSSProperties = {\n width: '100%',\n maxWidth: '420px',\n margin: '0 auto',\n};\n\n// 钱包区块样式 - 极简无边框\nexport const getSectionStyle = (): CSSProperties => {\n const c = getColors();\n return {\n padding: '1.5rem',\n background: c.cardBg,\n borderRadius: '12px',\n };\n};\n\n// 标题样式 - 简洁\nexport const getTitleStyle = (): CSSProperties => {\n const c = getColors();\n return {\n margin: '0 0 1.25rem 0',\n fontSize: '1.125rem',\n fontWeight: 600,\n color: c.text,\n letterSpacing: '-0.01em',\n };\n};\n\n// 按钮容器样式\nexport const buttonsContainerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n};\n\n// 钱包选项样式\nexport const walletOptionStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n};\n\n// 基础按钮样式 - 扁平化\nconst baseButtonStyle: CSSProperties = {\n padding: '0.875rem 1.25rem',\n fontSize: '0.9375rem',\n fontWeight: 500,\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, opacity 0.15s ease',\n outline: 'none',\n letterSpacing: '-0.01em',\n};\n\n// 连接按钮样式 - 纯黑/纯白\nexport const getConnectButtonStyle = (isDisabled: boolean, isHovered: boolean): CSSProperties => {\n const c = getColors();\n const darkMode = isDarkMode();\n \n if (isDisabled) {\n return {\n ...baseButtonStyle,\n background: c.disabled,\n color: c.disabledText,\n cursor: 'not-allowed',\n border: darkMode ? '1px solid #404040' : '1px solid #d4d4d4',\n };\n }\n \n return {\n ...baseButtonStyle,\n background: isHovered ? c.primaryHover : c.primary,\n color: darkMode ? '#000000' : '#ffffff',\n cursor: 'pointer',\n };\n};\n\n// 断开连接按钮样式\nexport const getDisconnectButtonStyle = (isHovered: boolean): CSSProperties => {\n const c = getColors();\n return {\n ...baseButtonStyle,\n background: isHovered ? c.dangerHover : c.danger,\n color: '#ffffff',\n };\n};\n\n// 支付按钮样式\nexport const getPayButtonStyle = (isDisabled: boolean, isHovered: boolean): CSSProperties => {\n const c = getColors();\n return {\n ...baseButtonStyle,\n background: isDisabled ? c.disabled : (isHovered ? c.successHover : c.success),\n color: '#ffffff',\n width: '100%',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n opacity: isDisabled ? 0.5 : 1,\n };\n};\n\n// 安装链接样式 - 简洁\nexport const getInstallLinkStyle = (isHovered: boolean): CSSProperties => {\n const c = getColors();\n return {\n display: 'inline-block',\n padding: '0.5rem',\n fontSize: '0.8125rem',\n color: c.textSecondary,\n textDecoration: isHovered ? 'underline' : 'none',\n textAlign: 'center',\n fontWeight: 500,\n };\n};\n\n// 钱包地址容器样式\nexport const walletAddressStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n marginBottom: '1rem',\n};\n\n// 钱包标签样式\nexport const getLabelStyle = (): CSSProperties => {\n const c = getColors();\n return {\n fontSize: '0.8125rem',\n color: c.textSecondary,\n fontWeight: 500,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n };\n};\n\n// 地址样式\nexport const getAddressStyle = (): CSSProperties => {\n const c = getColors();\n return {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: c.text,\n letterSpacing: '-0.01em',\n };\n};\n\n// 钱包操作区域样式\nexport const walletActionsStyle: CSSProperties = {\n margin: '1rem 0',\n};\n\n// 提示文字样式\nexport const getHintStyle = (): CSSProperties => {\n const c = getColors();\n return {\n marginTop: '1rem',\n fontSize: '0.8125rem',\n color: c.textSecondary,\n textAlign: 'center',\n lineHeight: '1.5',\n };\n};\n\n// 错误信息样式 - 扁平化\nexport const getErrorStyle = (): CSSProperties => {\n const c = getColors();\n return {\n marginTop: '1rem',\n padding: '0.75rem 1rem',\n background: c.errorBg,\n color: c.errorText,\n borderRadius: '8px',\n fontSize: '0.8125rem',\n fontWeight: 500,\n };\n};\n\n","'use client';\n\nimport React, {useEffect, useState} from 'react';\nimport {Button, Card, Divider, message, Spin, Tooltip, Typography} from 'antd';\nimport {\n DisconnectOutlined,\n InfoCircleOutlined,\n LinkOutlined,\n LoadingOutlined,\n LockOutlined,\n SafetyOutlined\n} from '@ant-design/icons';\nimport {usePaymentInfo} from \"../hooks/usePaymentInfo\";\nimport {usePageNetwork} from \"../hooks/usePageNetwork\";\nimport {usePayment} from \"../hooks/usePayment\";\nimport {PROD_BACK_URL} from \"../../types/common\";\nimport {formatAddress, makePayment} from \"../../utils\";\nimport {WalletConnect} from './WalletConnect';\nimport {NetworkType} from \"../../types\";\nimport {getNetworkIcon} from \"../utils/CryptoIcons\";\n\nconst {Title, Text} = Typography;\n\ninterface HeaderInfo {\n title?: string; // 标题\n subtitle?: string; // 副标题/网站名\n tooltipText?: string; // 备注/提示文本\n}\n\nexport interface V402CheckoutProps {\n checkoutId: string;\n headerInfo?: HeaderInfo; // header 配置信息\n isModal?: boolean; // 是否在模态框中显示\n onPaymentComplete?: (response: any) => void; // 支付完成后的回调函数\n additionalParams?: Record<string, any>; // 额外的入参,会透传给checkout配置的回调\n expectedNetwork?: NetworkType; // 期望的网络类型\n}\n\n// 使用 antd 的 message 组件\nconst notify = {\n success: (title: string, msg: string) => {\n message.success(`${title}: ${msg}`);\n },\n error: (title: string, msg: string) => {\n message.error(`${title}: ${msg}`);\n },\n info: (title: string, msg: string) => {\n message.info(`${title}: ${msg}`);\n }\n};\n\nexport default function V402Checkout({\n checkoutId,\n headerInfo = {},\n isModal = false,\n onPaymentComplete,\n additionalParams = {},\n expectedNetwork,\n }: V402CheckoutProps) {\n // 解构 headerInfo,并设置默认值\n const {\n title = 'V402Pay - Make x402Pay Easier',\n subtitle = 'onvoyage.ai',\n tooltipText = 'V402Pay - Accept Crypto Payments Easier'\n } = headerInfo;\n // 默认prod\n const endpoint = PROD_BACK_URL;\n\n // 获取支付信息以确定期望的网络\n const {\n supportedNetworks,\n isLoading: fetchingPaymentInfo,\n paymentInfo\n } = usePaymentInfo(checkoutId, endpoint, additionalParams);\n\n // 确定实际期望的网络(优先使用 prop,否则使用第一个支持的网络)\n const targetNetwork = expectedNetwork || supportedNetworks[0];\n\n // 使用 usePageNetwork 自动管理网络切换\n const {address, networkType, disconnect, ensureNetwork} = usePageNetwork(\n targetNetwork,\n {autoSwitch: !!targetNetwork, switchOnMount: true}\n );\n\n const {isProcessing, setIsProcessing, result, setResult, error, setError} = usePayment();\n\n // Payment details state\n const [paymentDetails, setPaymentDetails] = useState<{\n amount: string;\n currency: string;\n network: string;\n } | null>(null);\n\n // Handle disconnect\n const handleDisconnect = () => {\n disconnect();\n setResult(null);\n setError(null);\n notify.info('Wallet Disconnected', 'Your wallet has been disconnected successfully.');\n };\n\n\n // Extract payment details from paymentInfo\n useEffect(() => {\n if (paymentInfo && paymentInfo.length > 0) {\n const firstPayment = paymentInfo[0];\n\n // 从后端获取金额\n const rawAmount = firstPayment.maxAmountRequired?.toString() || '0';\n // USDC 使用 6 位小数\n const decimals = 6;\n const humanReadableAmount = (Number(rawAmount) / Math.pow(10, decimals)).toFixed(2);\n\n // 从后端获取网络\n const network = firstPayment.network || 'Unknown';\n\n // 币种:后端没有提供币种名称字段,asset 是代币合约地址\n // 使用默认值 USDC,后续可由后端添加 currency 字段\n const currency = 'USDC';\n\n setPaymentDetails({\n amount: humanReadableAmount,\n currency: currency,\n network: network,\n });\n }\n }, [paymentInfo]);\n\n // 当支持的网络改变时,确保切换到正确的网络\n useEffect(() => {\n if (targetNetwork && !fetchingPaymentInfo && ensureNetwork) {\n ensureNetwork(targetNetwork).catch(err => {\n console.error('Failed to ensure network:', err);\n });\n }\n }, [targetNetwork, fetchingPaymentInfo]);\n\n // Handle payment\n const handlePayment = async () => {\n if (!networkType) {\n notify.error('Wallet Not Connected', 'Please connect your wallet first.');\n return;\n }\n\n // 清除之前的结果,开始新的支付流程\n setResult(null);\n setError(null);\n setIsProcessing(true);\n\n try {\n const response = await makePayment(networkType, checkoutId, endpoint, additionalParams);\n const data = await response.json();\n setResult(data);\n notify.success('Payment Successful!', 'Your payment has been processed successfully.');\n\n // 透传 response 数据给父组件\n if (onPaymentComplete) {\n onPaymentComplete(data);\n }\n } catch (err: any) {\n const errorMessage = err.message || 'Payment failed';\n setError(errorMessage);\n notify.error('Payment Failed', errorMessage);\n } finally {\n setIsProcessing(false);\n }\n };\n\n // Get network icon and color based on network name\n const getNetworkColor = (network: string) => {\n if (network.toLowerCase().includes('solana')) return '#14F195';\n if (network.toLowerCase().includes('evm') || network.toLowerCase().includes('base')) return '#0052FF';\n return '#8c8c8c';\n };\n\n const NetworkIcon = paymentDetails ? getNetworkIcon(paymentDetails.network) : null;\n const networkColor = paymentDetails ? getNetworkColor(paymentDetails.network) : '#8c8c8c';\n const loadingColor = '#8c8c8c'; // 灰色用于加载状态\n // Check if checkout ID is invalid (no payment info after loading)\n const hasInvalidCheckoutId = !fetchingPaymentInfo && (!paymentInfo || paymentInfo.length === 0);\n\n return (\n <div\n className={isModal ? \"bg-white\" : \"h-screen bg-white flex items-center justify-center p-4 overflow-hidden\"}>\n <div\n className=\"flex gap-4 items-center justify-center\"\n style={{\n maxWidth: (isProcessing || result || error) ? '1200px' : '480px',\n transition: 'max-width 0.4s ease-in-out',\n width: '100%',\n }}\n >\n {/* Payment Card */}\n <Card\n className=\"flex-shrink-0\"\n style={{\n border: isModal ? 'none' : '1px solid #e8e8e8',\n borderRadius: isModal ? '0' : '16px',\n boxShadow: isModal ? 'none' : '0 4px 24px rgba(0, 0, 0, 0.06)',\n maxHeight: isModal ? 'calc(100vh - 100px)' : 'calc(100vh - 32px)',\n overflow: 'auto',\n width: isModal ? '100%' : '480px',\n transition: 'all 0.4s ease-in-out',\n transform: (result || error) ? 'translateX(0)' : 'translateX(0)',\n }}\n styles={{body: {padding: isModal ? '0px' : '32px 24px'}}}\n >\n {/* Header */}\n <div className=\"flex items-center gap-3 mb-4\">\n <div\n className=\"w-12 h-12 rounded-xl flex items-center justify-center\"\n style={{\n background: hasInvalidCheckoutId ? '#ff4d4f' : (paymentDetails ? networkColor : loadingColor),\n transition: 'background 0.3s ease'\n }}\n >\n {hasInvalidCheckoutId ? (\n <span style={{fontSize: '20px', color: 'white', fontWeight: 'bold'}}>✗</span>\n ) : paymentDetails && NetworkIcon ? (\n <NetworkIcon width={24} height={24}/>\n ) : (\n <LoadingOutlined style={{fontSize: '20px', color: 'white'}} spin/>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Title level={4} style={{margin: 0, fontSize: '18px', fontWeight: 600}}>\n {title || 'Echo Payment OnVoyage'}\n </Title>\n {!hasInvalidCheckoutId && (\n <Tooltip\n title={tooltipText}\n placement=\"top\"\n >\n <InfoCircleOutlined\n style={{fontSize: '14px', color: '#8c8c8c', cursor: 'help'}}/>\n </Tooltip>\n )}\n </div>\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>{subtitle}</Text>\n </div>\n </div>\n\n {/* Payment Info */}\n <div className=\"text-center mb-5\">\n <div className=\"inline-flex items-center justify-center w-12 h-12 rounded-full bg-gray-50 mb-3\">\n <LockOutlined style={{fontSize: '20px', color: '#595959'}}/>\n </div>\n <Title level={3} style={{margin: '0 0 6px 0', fontSize: '20px', fontWeight: 600}}>\n Payment Required\n </Title>\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>\n Pay {paymentDetails ? `$${paymentDetails.amount} ${paymentDetails.currency}` : 'the required amount'} to\n access\n </Text>\n </div>\n\n {/* Error state - Invalid checkout ID */}\n {hasInvalidCheckoutId && (\n <div className=\"text-center py-6\">\n <div\n className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\"\n style={{\n background: 'linear-gradient(135deg, #ef4444 0%, #f87171 100%)',\n boxShadow: '0 4px 20px rgba(239, 68, 68, 0.3)'\n }}\n >\n <span style={{fontSize: '32px', color: 'white'}}>!</span>\n </div>\n <Title level={4}\n style={{margin: '0 0 12px 0', fontSize: '18px', fontWeight: 600, color: '#262626'}}>\n Invalid Checkout ID\n </Title>\n <Text style={{fontSize: '14px', color: '#8c8c8c', display: 'block', marginBottom: '16px'}}>\n The checkout ID you provided is invalid or has expired.\n </Text>\n <div\n style={{\n background: '#fef2f2',\n padding: '16px',\n borderRadius: '12px',\n border: '1px solid #fee2e2',\n marginTop: '16px'\n }}\n >\n <Text style={{\n fontSize: '13px',\n color: '#dc2626',\n lineHeight: '1.6',\n fontWeight: 500\n }}>\n Failed to load payment information. Please check your checkout ID.\n </Text>\n </div>\n </div>\n )}\n\n {/* Loading state */}\n {!hasInvalidCheckoutId && fetchingPaymentInfo && (\n <div className=\"text-center py-6\">\n <Text style={{color: '#8c8c8c'}}>Loading payment information...</Text>\n </div>\n )}\n\n {/* Wallet connection */}\n {!hasInvalidCheckoutId && !fetchingPaymentInfo && !address && (\n <div>\n <WalletConnect supportedNetworks={supportedNetworks}/>\n </div>\n )}\n\n {/* Connected wallet */}\n {!hasInvalidCheckoutId && address && (\n <>\n {/* Wallet Card */}\n <div\n className=\"bg-gray-50 rounded-lg p-3 mb-4\"\n style={{border: '1px solid #f0f0f0'}}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3 flex-1\">\n <div\n className=\"w-10 h-10 rounded-full bg-black flex items-center justify-center text-white text-sm font-semibold\">\n {address.slice(0, 2).toUpperCase()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Text style={{\n display: 'block',\n fontSize: '12px',\n color: '#8c8c8c',\n marginBottom: '2px'\n }}>\n Connected Wallet\n </Text>\n <Text\n style={{\n fontSize: '13px',\n fontWeight: 600,\n fontFamily: 'Monaco, monospace',\n }}\n >\n {formatAddress(address)}\n </Text>\n </div>\n </div>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<DisconnectOutlined/>}\n onClick={handleDisconnect}\n style={{color: '#ff4d4f'}}\n />\n </div>\n </div>\n\n {/* Payment Details */}\n {paymentDetails && (\n <div className=\"bg-gray-50 rounded-lg p-3 mb-4\" style={{border: '1px solid #f0f0f0'}}>\n <div className=\"flex justify-between items-center mb-2\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Payment Amount</Text>\n <Text style={{fontSize: '18px', fontWeight: 600}}>\n ${paymentDetails.amount}\n </Text>\n </div>\n <Divider style={{margin: '6px 0'}}/>\n <div className=\"flex justify-between items-center mb-2\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Currency</Text>\n <Text style={{fontSize: '14px', fontWeight: 500}}>\n {paymentDetails.currency}\n </Text>\n </div>\n <Divider style={{margin: '6px 0'}}/>\n <div className=\"flex justify-between items-center mb-2\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Network</Text>\n <Text style={{fontSize: '14px', fontWeight: 500}}>\n {paymentDetails.network}\n </Text>\n </div>\n <Divider style={{margin: '6px 0'}}/>\n <div className=\"flex justify-between items-start\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Wallet Address</Text>\n <Text style={{\n fontSize: '11px',\n fontWeight: 500,\n fontFamily: 'Monaco, monospace',\n wordBreak: 'break-all',\n textAlign: 'right',\n maxWidth: '60%',\n lineHeight: 1.4\n }}>\n {address}\n </Text>\n </div>\n </div>\n )}\n\n {/* Security Notice */}\n <div\n className=\"flex items-center justify-center gap-2 mb-3 p-2 rounded-lg\"\n style={{background: '#f6ffed', border: '1px solid #d9f7be'}}\n >\n <SafetyOutlined style={{color: '#52c41a', fontSize: '13px'}}/>\n <Text style={{fontSize: '12px', color: '#52c41a', fontWeight: 500}}>\n Secure payment powered by v402pay\n </Text>\n </div>\n\n {/* Payment Button */}\n <Button\n type=\"primary\"\n size=\"large\"\n onClick={handlePayment}\n disabled={isProcessing || !paymentDetails}\n loading={isProcessing}\n block\n style={{\n height: '44px',\n fontSize: '14px',\n fontWeight: 600,\n borderRadius: '8px',\n ...(!isProcessing && paymentDetails && {\n background: '#1a1a1a',\n borderColor: '#1a1a1a',\n }),\n marginBottom: '10px',\n }}\n >\n {isProcessing\n ? 'Processing...'\n : !paymentDetails\n ? 'Loading...'\n : `Pay $${paymentDetails.amount} ${paymentDetails.currency}`}\n </Button>\n\n {/* Footer Link */}\n <div className=\"text-center\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>\n Don't have USDC?{' '}\n </Text>\n <a\n href=\"https://faucet.circle.com/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:text-blue-700 text-sm font-medium inline-flex items-center gap-1\"\n >\n Get it here <LinkOutlined style={{fontSize: '12px'}}/>\n </a>\n </div>\n\n {/* 模态框模式下的成功/失败反馈 */}\n {isModal && result && (\n <div className=\"mt-4 p-4 rounded-lg\"\n style={{background: '#f6ffed', border: '1px solid #b7eb8f'}}>\n <div className=\"text-center\">\n <span style={{fontSize: '20px'}}>✓</span>\n <Text style={{\n fontSize: '14px',\n color: '#52c41a',\n fontWeight: 600,\n marginLeft: '8px'\n }}>\n Payment Successful!\n </Text>\n </div>\n </div>\n )}\n\n {isModal && error && (\n <div className=\"mt-4 p-4 rounded-lg\"\n style={{background: '#fff2f0', border: '1px solid #ffccc7'}}>\n <div className=\"text-center mb-3\">\n <span style={{fontSize: '20px'}}>✗</span>\n <Text style={{\n fontSize: '14px',\n color: '#ff4d4f',\n fontWeight: 600,\n marginLeft: '8px',\n display: 'block',\n marginTop: '4px'\n }}>\n Payment Failed\n </Text>\n </div>\n <Text style={{\n fontSize: '13px',\n color: '#ff4d4f',\n display: 'block',\n textAlign: 'center'\n }}>\n {error}\n </Text>\n </div>\n )}\n </>\n )}\n\n </Card>\n\n {/* Result Card - 在模态框模式下隐藏 */}\n {!isModal && (isProcessing || result || error) && (\n <Card\n title={\n <div className=\"flex items-center gap-2\">\n {isProcessing && !result && !error ? (\n <>\n <LoadingOutlined style={{color: '#14b8a6', fontSize: '16px'}}/>\n <Text strong style={{fontSize: '16px', color: '#262626'}}>Processing\n Payment</Text>\n </>\n ) : result ? (\n <>\n <span style={{color: '#52c41a', fontSize: '18px'}}>✓</span>\n <Text strong style={{fontSize: '16px', color: '#262626'}}>Payment\n Successful</Text>\n </>\n ) : (\n <>\n <span style={{color: '#ff4d4f', fontSize: '18px'}}>✗</span>\n <Text strong style={{fontSize: '16px', color: '#262626'}}>Payment Failed</Text>\n </>\n )}\n </div>\n }\n extra={\n !isProcessing && (\n <Button\n type=\"text\"\n size=\"small\"\n onClick={() => {\n setResult(null);\n setError(null);\n }}\n >\n Close\n </Button>\n )\n }\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '16px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',\n maxHeight: 'calc(100vh - 32px)',\n width: '480px',\n animation: 'slideInRight 0.4s ease-out',\n }}\n styles={{\n body: {\n padding: '24px',\n maxHeight: 'calc(100vh - 120px)',\n overflow: 'auto',\n }\n }}\n >\n {/* Loading State */}\n {isProcessing && !result && !error && (\n <div className=\"text-center py-10\">\n <div className=\"relative inline-block\">\n <div\n className=\"absolute inset-0 rounded-full blur-xl opacity-40\"\n style={{\n background: 'linear-gradient(135deg, #14b8a6 0%, #06b6d4 100%)',\n animation: 'pulse 2s ease-in-out infinite'\n }}\n />\n <Spin\n indicator={<LoadingOutlined style={{fontSize: 56, color: '#14b8a6'}}/>}\n />\n </div>\n <div className=\"mt-6\">\n <Text strong style={{fontSize: '18px', color: '#262626', letterSpacing: '-0.02em'}}>\n Verifying Payment\n </Text>\n </div>\n <div className=\"mt-2 mb-6\">\n <Text style={{fontSize: '14px', color: '#8c8c8c', lineHeight: '1.6'}}>\n Please wait while we confirm your transaction\n </Text>\n </div>\n <div\n className=\"mt-4 p-4 rounded-xl\"\n style={{\n background: 'linear-gradient(135deg, #f0fdfa 0%, #ecfeff 100%)',\n border: '1px solid #ccfbf1'\n }}\n >\n <div className=\"flex items-center justify-center gap-2\">\n <span style={{fontSize: '16px'}}>⏱️</span>\n <Text style={{fontSize: '13px', color: '#0f766e', fontWeight: 500}}>\n This may take a few moments\n </Text>\n </div>\n </div>\n </div>\n )}\n\n {/* Success State */}\n {result && (\n <div>\n <div className=\"text-center mb-6\">\n <div\n className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\"\n style={{\n background: 'linear-gradient(135deg, #10b981 0%, #34d399 100%)',\n boxShadow: '0 4px 20px rgba(16, 185, 129, 0.3)'\n }}\n >\n <span style={{fontSize: '32px', color: 'white'}}>✓</span>\n </div>\n <div>\n <Text strong style={{\n fontSize: '20px',\n color: '#262626',\n display: 'block',\n marginBottom: '8px'\n }}>\n Payment Successful!\n </Text>\n <Text style={{fontSize: '14px', color: '#8c8c8c'}}>\n Your transaction has been confirmed\n </Text>\n </div>\n </div>\n <Divider style={{margin: '20px 0', borderColor: '#f0f0f0'}}>\n <Text style={{fontSize: '12px', color: '#8c8c8c', fontWeight: 500}}>RESPONSE\n DATA</Text>\n </Divider>\n <pre\n style={{\n background: '#fafafa',\n padding: '20px',\n borderRadius: '12px',\n fontSize: '12px',\n lineHeight: '1.8',\n overflow: 'auto',\n margin: 0,\n fontFamily: 'Monaco, Courier New, monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n border: '1px solid #e8e8e8',\n color: '#262626'\n }}\n >\n {JSON.stringify(result, null, 2)}\n </pre>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div>\n <div className=\"text-center mb-6\">\n <div\n className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\"\n style={{\n background: 'linear-gradient(135deg, #ef4444 0%, #f87171 100%)',\n boxShadow: '0 4px 20px rgba(239, 68, 68, 0.3)'\n }}\n >\n <span style={{fontSize: '32px', color: 'white'}}>✗</span>\n </div>\n <div>\n <Text strong style={{\n fontSize: '20px',\n color: '#262626',\n display: 'block',\n marginBottom: '8px'\n }}>\n Payment Failed\n </Text>\n <Text style={{fontSize: '14px', color: '#8c8c8c'}}>\n Something went wrong with your transaction\n </Text>\n </div>\n </div>\n <Divider style={{margin: '20px 0', borderColor: '#f0f0f0'}}>\n <Text style={{fontSize: '12px', color: '#8c8c8c', fontWeight: 500}}>ERROR\n DETAILS</Text>\n </Divider>\n <div\n style={{\n background: '#fef2f2',\n padding: '20px',\n borderRadius: '12px',\n border: '1px solid #fee2e2',\n }}\n >\n <Text style={{\n fontSize: '14px',\n color: '#dc2626',\n lineHeight: '1.6',\n fontWeight: 500\n }}>\n {error}\n </Text>\n </div>\n <div className=\"mt-4 text-center\">\n <Button\n size=\"large\"\n onClick={handlePayment}\n style={{\n height: '44px',\n fontSize: '14px',\n fontWeight: 600,\n borderRadius: '8px',\n background: '#1a1a1a',\n borderColor: '#1a1a1a',\n color: 'white',\n paddingLeft: '32px',\n paddingRight: '32px',\n }}\n >\n Try Again\n </Button>\n </div>\n </div>\n )}\n </Card>\n )}\n </div>\n\n <style dangerouslySetInnerHTML={{\n __html: `\n @keyframes slideInRight {\n from {\n opacity: 0;\n transform: translateX(100px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n \n @keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n opacity: 0.4;\n }\n 50% {\n transform: scale(1.1);\n opacity: 0.6;\n }\n }\n `\n }}/>\n </div>\n );\n}\n\n","/**\n * Crypto Icons Component\n * 加密货币图标集合\n */\n\nimport React from 'react';\n\ninterface IconProps {\n width?: number;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * USDC 图标\n * 来源: Streamline Cryptocurrency\n */\nexport const USDCIcon: React.FC<IconProps> = ({width = 16, height = 16, className, style}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 16 16\"\n width={width}\n height={height}\n className={className}\n style={style}\n >\n <desc>USDC Streamline Icon: https://streamlinehq.com</desc>\n <path\n fill=\"#3e73c4\"\n d=\"M8 16c4.4183 0 8 -3.5817 8 -8 0 -4.41828 -3.5817 -8 -8 -8C3.58172 0 0 3.58172 0 8c0 4.4183 3.58172 8 8 8Z\"\n strokeWidth=\"0.5\"\n />\n <path\n fill=\"#ffffff\"\n d=\"M10.01105 9.062c0 -1.062 -0.64 -1.426 -1.92 -1.578 -0.914 -0.1215 -1.0965 -0.364 -1.0965 -0.789 0 -0.425 0.305 -0.698 0.914 -0.698 0.5485 0 0.8535 0.182 1.0055 0.6375 0.0158 0.04405 0.04475 0.0822 0.08295 0.10925 0.03815 0.0271 0.0837 0.04185 0.13055 0.04225h0.4875c0.02815 0.00075 0.05615 -0.0042 0.08235 -0.0146 0.02615 -0.0104 0.04995 -0.02605 0.0699 -0.0459 0.01995 -0.01985 0.0357 -0.0436 0.0462 -0.0697 0.01055 -0.02615 0.01565 -0.05415 0.01505 -0.0823v-0.03c-0.0596 -0.32955 -0.22635 -0.6302 -0.47435 -0.85525 -0.248 -0.22505 -0.5634 -0.36185 -0.89715 -0.38925V4.571005c0 -0.1215 -0.0915 -0.2125 -0.2435 -0.243h-0.4575c-0.1215 0 -0.213 0.091 -0.2435 0.243V5.269c-0.9145 0.121 -1.493 0.728 -1.493 1.487 0 1.001 0.609 1.3955 1.889 1.5475 0.8535 0.1515 1.1275 0.334 1.1275 0.8195 0 0.485 -0.4265 0.819 -1.0055 0.819 -0.7925 0 -1.0665 -0.3335 -1.158 -0.789 -0.03 -0.121 -0.122 -0.182 -0.2135 -0.182h-0.518c-0.02815 -0.0007 -0.0561 0.00435 -0.0822 0.0148 -0.02615 0.0104 -0.04985 0.02605 -0.0698 0.0459 -0.0199 0.01985 -0.03555 0.04355 -0.04605 0.06965 -0.0105 0.0261 -0.0156 0.05405 -0.01495 0.08215v0.03c0.1215 0.759 0.6095 1.305 1.615 1.457v0.7285c0 0.121 0.0915 0.2125 0.2435 0.2425h0.4575c0.1215 0 0.213 -0.091 0.2435 -0.2425V10.67c0.9145 -0.1515 1.5235 -0.789 1.5235 -1.6085v0.0005Z\"\n strokeWidth=\"0.5\"\n />\n <path\n fill=\"#ffffff\"\n d=\"M6.446 12.2485c-2.37698 -0.85 -3.59598 -3.49 -2.71198 -5.8265 0.457 -1.275 1.46248 -2.2455 2.71198 -2.701 0.122 -0.0605 0.1825 -0.1515 0.1825 -0.3035v-0.425c0 -0.121 -0.0605 -0.212 -0.1825 -0.2425 -0.0305 0 -0.0915 0 -0.122 0.03 -0.68575 0.21416 -1.3224 0.561865 -1.87327 1.023085 -0.550855 0.461225 -1.00503 1.026855 -1.336385 1.664315 -0.331355 0.6375 -0.53334 1.3342 -0.59432 2.05005 -0.06098 0.71585 0.020245 1.4367 0.238995 2.12105 0.548 1.7 1.8585 3.005 3.56498 3.551 0.122 0.0605 0.244 0 0.274 -0.1215 0.0305 -0.03 0.0305 -0.061 0.0305 -0.1215v-0.425c0 -0.091 -0.091 -0.212 -0.1825 -0.273Zm3.23 -9.468c-0.122 -0.061 -0.244 0 -0.274 0.121 -0.0305 0.0305 -0.0305 0.061 -0.0305 0.1215v0.425c0 0.1215 0.091 0.2425 0.1825 0.3035 2.377 0.85 3.596 3.49 2.712 5.8265 -0.457 1.275 -1.4625 2.2455 -2.712 2.701 -0.122 0.0605 -0.1825 0.1515 -0.1825 0.3035v0.425c0 0.121 0.0605 0.212 0.1825 0.2425 0.0305 0 0.0915 0 0.122 -0.03 0.6858 -0.21415 1.32245 -0.56185 1.8733 -1.0231 0.55085 -0.4612 1.00505 -1.02685 1.3364 -1.6643 0.33135 -0.6375 0.53335 -1.3342 0.5943 -2.05005 0.061 -0.71585 -0.02025 -1.4367 -0.239 -2.12105 -0.548 -1.73 -1.889 -3.035 -3.565 -3.581Z\"\n strokeWidth=\"0.5\"\n />\n </svg>\n );\n};\n\n/**\n * Solana (SOL) 图标\n * 来源: Streamline Mingcute Fill\n */\nexport const SolanaIcon: React.FC<IconProps> = ({width = 16, height = 16, className, style}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n width={width}\n height={height}\n className={className}\n style={style}\n >\n <desc>Solana SOL Fill Streamline Icon: https://streamlinehq.com</desc>\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n d=\"M16 0v16H0V0h16ZM8.395333333333333 15.505333333333333l-0.007333333333333332 0.0013333333333333333 -0.047333333333333324 0.023333333333333334 -0.013333333333333332 0.0026666666666666666 -0.009333333333333332 -0.0026666666666666666 -0.047333333333333324 -0.023333333333333334c-0.006666666666666666 -0.0026666666666666666 -0.012666666666666666 -0.0006666666666666666 -0.016 0.003333333333333333l-0.0026666666666666666 0.006666666666666666 -0.011333333333333334 0.2853333333333333 0.003333333333333333 0.013333333333333332 0.006666666666666666 0.008666666666666666 0.06933333333333333 0.049333333333333326 0.009999999999999998 0.0026666666666666666 0.008 -0.0026666666666666666 0.06933333333333333 -0.049333333333333326 0.008 -0.010666666666666666 0.0026666666666666666 -0.011333333333333334 -0.011333333333333334 -0.2846666666666666c-0.0013333333333333333 -0.006666666666666666 -0.005999999999999999 -0.011333333333333334 -0.011333333333333334 -0.011999999999999999Zm0.17666666666666667 -0.07533333333333334 -0.008666666666666666 0.0013333333333333333 -0.12333333333333332 0.062 -0.006666666666666666 0.006666666666666666 -0.002 0.007333333333333332 0.011999999999999999 0.2866666666666666 0.003333333333333333 0.008 0.005333333333333333 0.004666666666666666 0.134 0.062c0.008 0.0026666666666666666 0.015333333333333332 0 0.019333333333333334 -0.005333333333333333l0.0026666666666666666 -0.009333333333333332 -0.02266666666666667 -0.4093333333333333c-0.002 -0.008 -0.006666666666666666 -0.013333333333333332 -0.013333333333333332 -0.014666666666666665Zm-0.4766666666666666 0.0013333333333333333a0.015333333333333332 0.015333333333333332 0 0 0 -0.018 0.004l-0.004 0.009333333333333332 -0.02266666666666667 0.4093333333333333c0 0.008 0.004666666666666666 0.013333333333333332 0.011333333333333334 0.016l0.009999999999999998 -0.0013333333333333333 0.134 -0.062 0.006666666666666666 -0.005333333333333333 0.0026666666666666666 -0.007333333333333332 0.011333333333333334 -0.2866666666666666 -0.002 -0.008 -0.006666666666666666 -0.006666666666666666 -0.12266666666666666 -0.06133333333333333Z\"\n strokeWidth=\"0.6667\"\n />\n <path\n fill=\"#000000\"\n d=\"M4.862 2.862A0.6666666666666666 0.6666666666666666 0 0 1 5.333333333333333 2.6666666666666665h8.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 0.47133333333333327 1.138l-2 2A0.6666666666666666 0.6666666666666666 0 0 1 12 6H3.333333333333333a0.6666666666666666 0.6666666666666666 0 0 1 -0.47133333333333327 -1.138l2 -2Zm-2.1166666666666663 4.156666666666666A0.6666666666666666 0.6666666666666666 0 0 1 3.333333333333333 6.666666666666666h8.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 0.5546666666666666 0.29666666666666663l1.3333333333333333 2A0.6666666666666666 0.6666666666666666 0 0 1 13.333333333333332 10H4.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 -0.5546666666666666 -0.29666666666666663l-1.3333333333333333 -2a0.6666666666666666 0.6666666666666666 0 0 1 -0.03333333333333333 -0.6846666666666665Zm1.4499999999999997 3.843333333333333A0.6666666666666666 0.6666666666666666 0 0 1 4.666666666666666 10.666666666666666h8.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 0.47133333333333327 1.138l-2 2A0.6666666666666666 0.6666666666666666 0 0 1 11.333333333333332 14H2.6666666666666665a0.6666666666666666 0.6666666666666666 0 0 1 -0.47133333333333327 -1.138l2 -2Z\"\n strokeWidth=\"0.6667\"\n />\n </g>\n </svg>\n );\n};\n\n/**\n * Base (Coinbase L2) 图标\n * 来源: Streamline Tabler\n */\nexport const BaseIcon: React.FC<IconProps> = ({width = 24, height = 24, className, style}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#000000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n width={width}\n height={height}\n className={className}\n style={style}\n >\n <desc>Brand Coinbase Streamline Icon: https://streamlinehq.com</desc>\n <path\n d=\"M12.95 22c-4.503 0 -8.445 -3.04 -9.61 -7.413 -1.165 -4.373 0.737 -8.988 4.638 -11.25a9.906 9.906 0 0 1 12.008 1.598l-3.335 3.367a5.185 5.185 0 0 0 -7.354 0.013 5.252 5.252 0 0 0 0 7.393 5.185 5.185 0 0 0 7.354 0.013L20 19.088A9.887 9.887 0 0 1 12.95 22z\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\n/**\n * 获取网络对应的图标组件\n */\nexport const getNetworkIcon = (network: string): React.FC<IconProps> => {\n const networkLower = network.toLowerCase();\n\n if (networkLower.includes('solana')) {\n return SolanaIcon;\n }\n\n if (networkLower.includes('base')) {\n return BaseIcon;\n }\n\n // 默认返回 Base 图标(作为通用 EVM 图标)\n return BaseIcon;\n};\n\n/**\n * 获取货币对应的图标组件\n */\nexport const getCurrencyIcon = (currency: string): React.FC<IconProps> => {\n switch (currency.toUpperCase()) {\n case 'USDC':\n return USDCIcon;\n case 'SOL':\n return SolanaIcon;\n default:\n return USDCIcon;\n }\n};\n\n"],"mappings":"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","names":["z","message","IGNORED_ERRORS","IGNORED_ERRORS","ethers","message","useEffect","useState","useState","useEffect","useState","useState","React","useEffect","useState","React","React","useState","useEffect","React"]}
1
+ {"version":3,"sources":["../../src/types/common.ts","../../src/types/svm.ts","../../src/types/evm.ts","../../src/types/index.ts","../../src/utils/wallet.ts","../../src/react/index.ts","../../src/react/hooks/useWalletStore.ts","../../src/utils/index.ts","../../src/utils/wallet-connect.ts","../../src/utils/wallet-discovery.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/payment-helpers.ts","../../src/utils/network.ts","../../src/utils/payment-error-handler.ts","../../src/react/store/walletStore.ts","../../src/react/hooks/usePageNetwork.ts","../../src/react/hooks/usePayment.ts","../../src/react/hooks/usePaymentInfo.ts","../../src/react/components/WalletConnect.tsx","../../src/react/components/WalletSelectModal.tsx","../../src/react/styles/inline-styles.ts","../../src/react/components/V402Checkout.tsx","../../src/react/utils/CryptoIcons.tsx"],"sourcesContent":["/**\n * Common types for x402 SDK\n * Framework-agnostic types that work across different wallet implementations\n */\n\n/**\n * Generic wallet adapter interface - works with any wallet provider\n * Compatible with Anza wallet-adapter, Privy, @solana/kit, 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 // Accepts compiled transaction from @solana/kit and returns signed transaction\n signTransaction: <T>(tx: T) => Promise<T>;\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 getChainId?: () => Promise<string>; // Returns hex format like \"0x14a34\"\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\n// 在构建时会被 tsup 的 define 替换\ndeclare const __PROD_BACK_URL__: string;\nexport const PROD_BACK_URL = typeof __PROD_BACK_URL__ !== 'undefined' \n ? __PROD_BACK_URL__ \n : \"https://v402pay.onvoyage.ai/api/pay\";\n\n","/**\n * SVM (Solana) specific types\n * Uses x402 official types as base\n */\n\nimport {z} from \"zod\";\nimport {ExactSvmPayloadSchema, type PaymentRequirements} from \"x402/types\";\nimport type {WalletAdapter} from \"./common\";\n\n// Re-export x402 SVM types\nexport type {PaymentRequirements};\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 {ExactEvmPayloadSchema, type PaymentRequirements} from \"x402/types\";\nimport type {EvmWalletAdapter} from \"./common\";\n\n// Re-export x402 EVM types\nexport type {PaymentRequirements};\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 * 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 // 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\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 * 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 WALLET_DISCONNECTED_NETWORKS_KEY = 'wallet_disconnected_networks'; // 记录每个网络的断开状态\nconst CONNECTED_NETWORK_TYPE_KEY = 'connected_network_type';\nconst WALLET_ADDRESSES_KEY = 'wallet_addresses_cache'; // 多网络钱包地址缓存\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 * Get all disconnected networks\n */\nfunction getDisconnectedNetworks(): Partial<Record<NetworkType, boolean>> {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const cached = localStorage.getItem(WALLET_DISCONNECTED_NETWORKS_KEY);\n return cached ? JSON.parse(cached) : {};\n } catch (error) {\n return {};\n }\n}\n\n/**\n * Mark wallet as manually disconnected (for specific network)\n */\nexport function markWalletDisconnected(networkType?: NetworkType): void {\n if (typeof window !== 'undefined') {\n if (networkType) {\n // 标记特定网络为断开\n const disconnected = getDisconnectedNetworks();\n disconnected[networkType] = true;\n localStorage.setItem(WALLET_DISCONNECTED_NETWORKS_KEY, JSON.stringify(disconnected));\n } else {\n // 兼容旧版:全局断开\n localStorage.setItem(WALLET_DISCONNECTED_KEY, 'true');\n localStorage.removeItem(CONNECTED_NETWORK_TYPE_KEY);\n }\n }\n}\n\n/**\n * Clear wallet disconnection flag (for specific network or all)\n */\nexport function clearWalletDisconnection(networkType?: NetworkType): void {\n if (typeof window !== 'undefined') {\n if (networkType) {\n // 清除特定网络的断开标记\n const disconnected = getDisconnectedNetworks();\n delete disconnected[networkType];\n localStorage.setItem(WALLET_DISCONNECTED_NETWORKS_KEY, JSON.stringify(disconnected));\n } else {\n // 兼容旧版:清除全局断开标记\n localStorage.removeItem(WALLET_DISCONNECTED_KEY);\n }\n }\n}\n\n/**\n * Check if user manually disconnected wallet (for specific network)\n */\nexport function isWalletManuallyDisconnected(networkType?: NetworkType): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n \n if (networkType) {\n // 检查特定网络是否断开\n const disconnected = getDisconnectedNetworks();\n return disconnected[networkType] === true;\n } else {\n // 兼容旧版:检查全局断开标记\n return localStorage.getItem(WALLET_DISCONNECTED_KEY) === 'true';\n }\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/**\n * Get all cached wallet addresses\n */\nexport function getAllWalletAddresses(): Partial<Record<NetworkType, string>> {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const cached = localStorage.getItem(WALLET_ADDRESSES_KEY);\n return cached ? JSON.parse(cached) : {};\n } catch (error) {\n console.error('Failed to parse wallet addresses cache:', error);\n return {};\n }\n}\n\n/**\n * Save wallet address for a specific network\n */\nexport function saveWalletAddress(networkType: NetworkType, address: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n const addresses = getAllWalletAddresses();\n addresses[networkType] = address;\n localStorage.setItem(WALLET_ADDRESSES_KEY, JSON.stringify(addresses));\n}\n\n/**\n * Get cached wallet address for a specific network\n */\nexport function getCachedWalletAddress(networkType: NetworkType): string | null {\n const addresses = getAllWalletAddresses();\n return addresses[networkType] || null;\n}\n\n/**\n * Remove wallet address for a specific network\n */\nexport function removeWalletAddress(networkType: NetworkType): void {\n if (typeof window === 'undefined') {\n return;\n }\n const addresses = getAllWalletAddresses();\n delete addresses[networkType];\n localStorage.setItem(WALLET_ADDRESSES_KEY, JSON.stringify(addresses));\n}\n\n/**\n * Clear all cached wallet addresses\n */\nexport function clearAllWalletAddresses(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(WALLET_ADDRESSES_KEY);\n }\n}\n","/**\n * x402 Payment SDK - React Package\n *\n * Pre-built React hooks and components for easy integration\n *\n * ## Quick Start\n *\n * ```tsx\n * import { WalletConnect, PaymentButton, useWallet, usePayment } from '@x402/sdk/react';\n *\n * // No Provider needed! Just use the hooks directly\n * function App() {\n * const { address } = useWallet();\n *\n * return (\n * <div>\n * <WalletConnect />\n * {address && <PaymentButton endpoint=\"/api/protected\" />}\n * </div>\n * );\n * }\n * ```\n */\n\n// Import styles - will be auto-loaded by modern bundlers (Next.js, Vite, etc.)\nimport './styles.css';\n\n// Hooks (No Provider needed!)\nexport { useWallet } from './hooks/useWalletStore';\nexport type { UseWalletReturn } from './hooks/useWalletStore';\n\nexport { usePageNetwork } from './hooks/usePageNetwork';\nexport type { UsePageNetworkOptions } from './hooks/usePageNetwork';\n\n// Hooks\nexport { usePayment } from './hooks/usePayment';\nexport type { UsePaymentReturn } from './hooks/usePayment';\n\nexport { usePaymentInfo } from './hooks/usePaymentInfo';\nexport type { UsePaymentInfoReturn } from './hooks/usePaymentInfo';\n\n// Components\nexport { WalletConnect } from './components/WalletConnect';\nexport type { WalletConnectProps } from './components/WalletConnect';\n\nexport { WalletSelectModal } from './components/WalletSelectModal';\nexport type { WalletSelectModalProps } from './components/WalletSelectModal';\n\nexport { default as V402Checkout } from './components/V402Checkout';\nexport type { V402CheckoutProps } from './components/V402Checkout';\n","/**\n * useWallet Hook (External Store)\n *\n * Uses useSyncExternalStore for optimal performance\n * No Provider needed!\n */\n\nimport {useSyncExternalStore} from 'react';\nimport {walletStore} from '../store/walletStore';\nimport {NetworkType} from '../../types';\nimport {WalletInfo} from '../../utils';\n\nexport interface UseWalletReturn {\n // State\n address: string | null;\n networkType: NetworkType | null;\n isConnecting: boolean;\n error: string | null;\n\n // Actions\n connect: (networkType: NetworkType, forceSelect?: boolean) => Promise<void>;\n connectWithWallet: (wallet: WalletInfo) => Promise<void>;\n switchNetwork: (networkType: NetworkType) => Promise<void>;\n ensureNetwork: (networkType: NetworkType) => Promise<void>;\n disconnect: () => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Hook for wallet connection\n * No Provider needed - uses external store\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { address, connect, disconnect } = useWallet();\n *\n * return (\n * <div>\n * {address ? (\n * <button onClick={disconnect}>Disconnect</button>\n * ) : (\n * <button onClick={() => connect(NetworkType.SOLANA)}>Connect</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWallet(): UseWalletReturn {\n // Use React 18's useSyncExternalStore for optimal performance\n const state = useSyncExternalStore(\n (listener) => walletStore.subscribe(listener),\n () => walletStore.getState(),\n () => walletStore.getState() // Server snapshot\n );\n\n return {\n ...state,\n connect: (type: NetworkType, forceSelect?: boolean) => walletStore.connect(type, forceSelect),\n connectWithWallet: (wallet: WalletInfo) => walletStore.connectWithWallet(wallet),\n switchNetwork: (type: NetworkType) => walletStore.switchNetwork(type),\n ensureNetwork: (type: NetworkType) => walletStore.ensureNetwork(type),\n disconnect: () => walletStore.disconnect(),\n clearError: () => walletStore.clearError(),\n };\n}\n\n","/**\n * x402 Payment SDK - Utilities\n *\n * General-purpose utilities for wallet management, network detection, and helpers\n */\n\n// Wallet utilities\nexport {\n isWalletInstalled,\n getWalletProvider,\n formatAddress,\n markWalletDisconnected,\n clearWalletDisconnection,\n isWalletManuallyDisconnected,\n saveConnectedNetworkType,\n getConnectedNetworkType,\n getWalletInstallUrl,\n getWalletDisplayName,\n // 多网络钱包缓存\n getAllWalletAddresses,\n saveWalletAddress,\n getCachedWalletAddress,\n removeWalletAddress,\n clearAllWalletAddresses,\n} from \"./wallet\";\n\n// Wallet connection utilities (for demo/UI)\nexport {\n connectWallet,\n disconnectWallet,\n getCurrentWallet,\n switchNetwork, // 新增:切换网络\n onAccountsChanged,\n onChainChanged,\n onWalletDisconnect,\n} from \"./wallet-connect\";\n\n// Wallet discovery (multi-wallet support)\nexport {\n initEVMWalletDiscovery,\n getEVMWallets,\n getSolanaWallets,\n getWalletsForNetwork,\n getWalletById,\n connectToWallet,\n onEVMWalletsChanged,\n // Provider management for payments\n getCurrentConnectedWallet,\n setCurrentConnectedWallet,\n clearConnectedWallet,\n getWalletProviderForPayment,\n type WalletInfo,\n type EIP6963ProviderInfo,\n type EIP6963ProviderDetail,\n} from \"./wallet-discovery\";\n\n// Payment helpers (for demo/UI)\nexport {\n makePayment,\n parsePaymentRequired,\n getSupportedNetworkTypes,\n type PaymentCallbacks,\n} from \"./payment-helpers\";\n\n// Network utilities\nexport {\n getNetworkType,\n isEvmNetwork,\n isSolanaNetwork,\n isSolanaAddress,\n isEvmAddress,\n getNetworkDisplayName,\n} from \"./network\";\n\n// General helpers\nexport {\n toAtomicUnits,\n fromAtomicUnits,\n sleep,\n retryWithBackoff,\n is402Response,\n} from \"./helpers\";\n\n// Payment error handling\nexport {\n parsePaymentError,\n wrapPaymentError,\n PaymentOperationError,\n PaymentErrorCode,\n IGNORED_402_ERRORS,\n PAYMENT_ERROR_MESSAGES,\n type PaymentError,\n} from \"./payment-error-handler\";\n","/**\n * Wallet connection utilities for demo/UI\n * Higher-level helpers built on top of base wallet utilities\n */\n\nimport {NetworkType} from \"../types\";\nimport {\n clearWalletDisconnection,\n getCachedWalletAddress,\n getConnectedNetworkType as getStoredNetworkType,\n markWalletDisconnected,\n removeWalletAddress,\n saveConnectedNetworkType,\n saveWalletAddress\n} from \"./wallet\";\n\n/**\n * Connect wallet and return address\n * @param forceSelect - 是否强制弹出钱包选择界面(用于切换账户)\n */\nexport async function connectWallet(networkType: NetworkType, forceSelect: boolean = false): Promise<string> {\n if (typeof window === 'undefined') {\n throw new Error('请在浏览器环境中使用');\n }\n\n let address: string;\n\n switch (networkType) {\n case NetworkType.EVM: {\n if (!(window as any).ethereum) {\n throw new Error('请安装 MetaMask 或其他以太坊钱包');\n }\n const ethereum = (window as any).ethereum;\n \n if (forceSelect) {\n // 强制弹出账户选择界面\n try {\n const permissions = await ethereum.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n // 从权限结果中获取账户\n const accountsPermission = permissions?.find(\n (p: any) => p.parentCapability === 'eth_accounts'\n );\n if (accountsPermission?.caveats?.[0]?.value?.length > 0) {\n address = accountsPermission.caveats[0].value[0];\n break;\n }\n } catch (err: any) {\n // 用户取消了权限请求\n if (err.code === 4001) {\n throw new Error('用户取消了钱包连接');\n }\n // 如果钱包不支持 wallet_requestPermissions,继续使用普通方式\n console.warn('wallet_requestPermissions failed, falling back to eth_requestAccounts');\n }\n }\n \n const accounts = await ethereum.request({\n method: 'eth_requestAccounts',\n params: [],\n });\n if (!accounts || accounts.length === 0) {\n throw new Error('未能获取到钱包地址');\n }\n address = accounts[0];\n break;\n }\n\n case NetworkType.SOLANA:\n case NetworkType.SVM: {\n // 检测可用的 Solana 钱包\n const phantom = (window as any).phantom?.solana || (window as any).solana;\n const solflare = (window as any).solflare;\n \n // 优先使用 Phantom\n let solana = phantom;\n \n // 如果 forceSelect 且有多个钱包,可以考虑切换\n // 目前简单处理:如果 Phantom 不可用,尝试 Solflare\n if (!solana && solflare?.isSolflare) {\n solana = solflare;\n }\n \n if (!solana) {\n throw new Error('请安装 Phantom 或其他 Solana 钱包');\n }\n \n // 如果需要强制选择,先彻底断开连接\n if (forceSelect) {\n try {\n // 断开所有可能的钱包连接\n if (phantom?.isConnected) {\n await phantom.disconnect();\n }\n if (solflare?.isConnected) {\n await solflare.disconnect();\n }\n // 等待一小段时间让钱包完成断开\n await new Promise(resolve => setTimeout(resolve, 100));\n } catch (err) {\n console.warn('Failed to disconnect Solana wallet:', err);\n }\n } else if (solana.isConnected) {\n // 非强制模式下,如果已连接则先断开\n try {\n await solana.disconnect();\n } catch (err) {\n console.warn('Failed to disconnect Solana wallet:', err);\n }\n }\n \n // 连接钱包 - Phantom 会弹出确认框\n const response = await solana.connect();\n address = response.publicKey.toString();\n break;\n }\n\n default:\n throw new Error('不支持的网络类型');\n }\n\n // Save connection state\n clearWalletDisconnection(networkType); // 清除该网络的断开标记\n saveConnectedNetworkType(networkType);\n // 缓存钱包地址,支持多网络切换\n saveWalletAddress(networkType, address);\n\n return address;\n}\n\n/**\n * 断开所有 Solana 钱包连接\n */\nasync function disconnectAllSolanaWallets(): Promise<void> {\n if (typeof window === 'undefined') return;\n \n const phantom = (window as any).phantom?.solana || (window as any).solana;\n const solflare = (window as any).solflare;\n \n const disconnectPromises: Promise<void>[] = [];\n \n if (phantom?.isConnected) {\n disconnectPromises.push(\n phantom.disconnect().catch((err: any) => \n console.warn('Failed to disconnect Phantom:', err)\n )\n );\n }\n \n if (solflare?.isConnected) {\n disconnectPromises.push(\n solflare.disconnect().catch((err: any) => \n console.warn('Failed to disconnect Solflare:', err)\n )\n );\n }\n \n await Promise.all(disconnectPromises);\n}\n\n/**\n * Disconnect wallet\n * @param networkType - 可选,指定要断开的网络类型。如果不指定,则断开当前网络\n * @param clearAll - 是否清除所有网络的缓存,默认为 false\n */\nexport async function disconnectWallet(networkType?: NetworkType, clearAll: boolean = false): Promise<void> {\n const targetNetwork = networkType || getStoredNetworkType();\n \n // 真正断开钱包连接\n if (targetNetwork && typeof window !== 'undefined') {\n try {\n switch (targetNetwork) {\n case NetworkType.SOLANA:\n case NetworkType.SVM: {\n await disconnectAllSolanaWallets();\n break;\n }\n // EVM 钱包(如 MetaMask)没有真正的 disconnect API\n // 只清除本地状态,下次连接时会重新请求权限\n case NetworkType.EVM:\n default:\n break;\n }\n } catch (err) {\n console.warn('Failed to disconnect wallet:', err);\n }\n }\n \n if (clearAll) {\n // 清除所有网络的钱包缓存\n const { clearAllWalletAddresses } = require('./wallet');\n clearAllWalletAddresses();\n markWalletDisconnected();\n \n // 断开所有类型钱包\n await disconnectAllSolanaWallets();\n } else if (networkType) {\n // 只清除指定网络的缓存\n removeWalletAddress(networkType);\n // 不调用 markWalletDisconnected(),避免影响其他网络\n } else {\n // 清除当前连接的网络缓存\n if (targetNetwork) {\n removeWalletAddress(targetNetwork);\n }\n // 不调用 markWalletDisconnected(),避免影响其他网络\n }\n}\n\n/**\n * Get current wallet address\n * 优先从缓存读取,如果缓存存在则验证其有效性\n */\nexport async function getCurrentWallet(networkType?: NetworkType): Promise<string | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const type = networkType || getStoredNetworkType();\n if (!type) {\n return null;\n }\n\n // 先尝试从缓存读取\n const cachedAddress = getCachedWalletAddress(type);\n \n try {\n let currentAddress: string | null = null;\n \n switch (type) {\n case NetworkType.EVM: {\n if (!(window as any).ethereum) return cachedAddress;\n const accounts = await (window as any).ethereum.request({\n method: 'eth_accounts',\n params: [],\n });\n currentAddress = accounts && accounts.length > 0 ? accounts[0] : null;\n break;\n }\n\n case NetworkType.SOLANA:\n case NetworkType.SVM: {\n const solana = (window as any).solana;\n if (!solana || !solana.isConnected) return cachedAddress;\n currentAddress = solana.publicKey?.toString() || null;\n break;\n }\n\n default:\n return cachedAddress;\n }\n\n // 如果钱包返回的地址与缓存不一致,更新缓存\n if (currentAddress && currentAddress !== cachedAddress) {\n saveWalletAddress(type, currentAddress);\n }\n \n // 如果钱包没有返回地址但有缓存,返回缓存(钱包可能暂时未连接但用户没有断开)\n return currentAddress || cachedAddress;\n } catch (error) {\n console.error('Failed to get current wallet:', error);\n // 如果出错,返回缓存的地址\n return cachedAddress;\n }\n}\n\n/**\n * Listen for account changes (EVM only)\n */\nexport function onAccountsChanged(\n callback: (accounts: string[]) => void\n): () => void {\n if (typeof window === 'undefined' || !(window as any).ethereum) {\n return () => {\n };\n }\n\n const ethereum = (window as any).ethereum;\n const handler = (accounts: string[]) => {\n callback(accounts);\n };\n\n ethereum.on('accountsChanged', handler);\n\n return () => {\n ethereum.removeListener?.('accountsChanged', handler);\n };\n}\n\n/**\n * Listen for chain/network changes (EVM only)\n */\nexport function onChainChanged(\n callback: (chainId: string) => void\n): () => void {\n if (typeof window === 'undefined' || !(window as any).ethereum) {\n return () => {\n };\n }\n\n const ethereum = (window as any).ethereum;\n const handler = (chainId: string) => {\n console.log('🔄 Chain changed to:', chainId);\n callback(chainId);\n };\n\n ethereum.on('chainChanged', handler);\n\n return () => {\n ethereum.removeListener?.('chainChanged', handler);\n };\n}\n\n/**\n * Listen for wallet disconnect (Solana only)\n */\nexport function onWalletDisconnect(\n callback: () => void\n): () => void {\n if (typeof window === 'undefined') {\n return () => {\n };\n }\n\n const solana = (window as any).solana;\n if (!solana) {\n return () => {\n };\n }\n\n const handler = () => {\n console.log('🔌 Solana wallet disconnected');\n callback();\n };\n\n solana.on('disconnect', handler);\n\n return () => {\n solana.removeListener?.('disconnect', handler);\n };\n}\n\n/**\n * 切换到指定网络\n * 如果该网络已有缓存的钱包地址,则直接切换\n * 如果没有缓存,则需要连接钱包\n */\nexport async function switchNetwork(networkType: NetworkType): Promise<string | null> {\n const cachedAddress = getCachedWalletAddress(networkType);\n \n if (cachedAddress) {\n // 如果有缓存地址,直接切换网络类型\n saveConnectedNetworkType(networkType);\n clearWalletDisconnection(networkType); // 清除该网络的断开标记\n \n // 验证钱包是否仍然连接\n const currentAddress = await getCurrentWallet(networkType);\n if (currentAddress) {\n return currentAddress;\n }\n }\n \n // 如果没有缓存或验证失败,返回 null 表示需要重新连接\n return null;\n}\n\n","/**\n * Wallet Discovery\n * \n * Discovers installed wallets using:\n * - EIP-6963 for EVM wallets\n * - Direct detection for Solana wallets\n */\n\nimport { NetworkType } from '../types';\n\n// EIP-6963 types\nexport interface EIP6963ProviderInfo {\n uuid: string;\n name: string;\n icon: string; // Data URL\n rdns: string; // Reverse DNS identifier\n}\n\nexport interface EIP6963ProviderDetail {\n info: EIP6963ProviderInfo;\n provider: any; // EIP-1193 provider\n}\n\nexport interface EIP6963AnnounceProviderEvent extends Event {\n detail: EIP6963ProviderDetail;\n}\n\n// Unified wallet info\nexport interface WalletInfo {\n id: string;\n name: string;\n icon: string;\n networkType: NetworkType;\n provider: any;\n installed: boolean;\n}\n\n// Known Solana wallets with their detection and icons\n// Icons are base64 encoded or from reliable CDN sources\nconst SOLANA_WALLETS: Array<{\n id: string;\n name: string;\n icon: string;\n detect: () => any;\n}> = [\n {\n id: 'phantom',\n name: 'Phantom',\n // Phantom official icon\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZD0iTTExMC41IDY0QzExMC41IDg5Ljk1NjggODkuMjAxIDExMSA2My41IDExMUg0MS41QzM2LjI1MzMgMTExIDMyIDEwNi43NDcgMzIgMTAxLjVWNTQuNUMzMiAzMS4wMjggNTEuMDI4IDEyIDc0LjUgMTJDOTcuOTcyIDEyIDExNyAzMS4wMjggMTE3IDU0LjVWNTUuNUMxMTcgNTguNTM3NiAxMTQuNTM4IDYxIDExMS41IDYxSDEwOS41QzEwNi40NjIgNjEgMTA0IDYzLjQ2MjQgMTA0IDY2LjVWNjhDMTA0IDcxLjg2NiAxMDcuMTM0IDc1IDExMSA3NUgxMTEuNUMxMTQuNTM4IDc1IDExNyA3Mi41Mzc2IDExNyA2OS41VjY0SDExMC41WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEyOF8xMjgpIi8+CjxwYXRoIGQ9Ik00OC41IDY3QzUxLjUzNzYgNjcgNTQgNjQuNTM3NiA1NCA2MS41QzU0IDU4LjQ2MjQgNTEuNTM3NiA1NiA0OC41IDU2QzQ1LjQ2MjQgNTYgNDMgNTguNDYyNCA0MyA2MS41QzQzIDY0LjUzNzYgNDUuNDYyNCA2NyA0OC41IDY3WiIgZmlsbD0iIzFCMUIxQiIvPgo8cGF0aCBkPSJNNzMuNSA2N0M3Ni41Mzc2IDY3IDc5IDY0LjUzNzYgNzkgNjEuNUM3OSA1OC40NjI0IDc2LjUzNzYgNTYgNzMuNSA1NkM3MC40NjI0IDU2IDY4IDU4LjQ2MjQgNjggNjEuNUM2OCA2NC41Mzc2IDcwLjQ2MjQgNjcgNzMuNSA2N1oiIGZpbGw9IiMxQjFCMUIiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xMjhfMTI4IiB4MT0iMTE3IiB5MT0iMTIiIHgyPSIxMTciIHkyPSIxMTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC44MiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPg==',\n detect: () => (window as any).phantom?.solana,\n },\n {\n id: 'solflare',\n name: 'Solflare',\n // Solflare icon\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiNGQzZEMDEiLz4KPHBhdGggZD0iTTk2IDY0TDY0IDMyTDMyIDY0TDY0IDk2TDk2IDY0WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+',\n detect: () => (window as any).solflare,\n },\n {\n id: 'backpack',\n name: 'Backpack',\n // Backpack icon (red coral color)\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiNFMzM0MzAiLz4KPHBhdGggZD0iTTQwIDQ4SDg4VjgwQzg4IDg4LjgzNjYgODAuODM2NiA5NiA3MiA5Nkg1NkM0Ny4xNjM0IDk2IDQwIDg4LjgzNjYgNDAgODBWNDhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTIgMzJINzZWNDhINTJWMzJaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4=',\n detect: () => (window as any).backpack,\n },\n {\n id: 'okx-solana',\n name: 'OKX Wallet',\n // OKX icon\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9ImJsYWNrIi8+CjxyZWN0IHg9IjI0IiB5PSIyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iNTIiIHk9IjI0IiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI0IiBmaWxsPSJ3aGl0ZSIvPgo8cmVjdCB4PSI4MCIgeT0iMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgcng9IjQiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI0IiB5PSI1MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iODAiIHk9IjUyIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI0IiBmaWxsPSJ3aGl0ZSIvPgo8cmVjdCB4PSIyNCIgeT0iODAiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgcng9IjQiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjUyIiB5PSI4MCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iODAiIHk9IjgwIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI0IiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4=',\n detect: () => (window as any).okxwallet?.solana,\n },\n {\n id: 'coinbase-solana',\n name: 'Coinbase Wallet',\n // Coinbase icon (blue)\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiMwMDUyRkYiLz4KPGNpcmNsZSBjeD0iNjQiIGN5PSI2NCIgcj0iMzYiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjQ4IiB5PSI1NiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjE2IiByeD0iNCIgZmlsbD0iIzAwNTJGRiIvPgo8L3N2Zz4=',\n detect: () => (window as any).coinbaseSolana,\n },\n {\n id: 'trust-solana',\n name: 'Trust Wallet',\n // Trust Wallet icon\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYiIGZpbGw9IiMwNTAwRkYiLz4KPHBhdGggZD0iTTY0IDI0QzY0IDI0IDk2IDQwIDk2IDY0Qzk2IDg4IDY0IDEwNCA2NCAxMDRDNjQgMTA0IDMyIDg4IDMyIDY0QzMyIDQwIDY0IDI0IDY0IDI0WiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI2IiBmaWxsPSJub25lIi8+Cjwvc3ZnPg==',\n detect: () => (window as any).trustwallet?.solana,\n },\n];\n\n// Store for discovered EVM wallets\nlet evmWallets: Map<string, EIP6963ProviderDetail> = new Map();\nlet evmDiscoveryListeners: Set<() => void> = new Set();\nlet evmDiscoveryInitialized = false;\n\n// Store for currently connected wallet (for payment signing)\nlet currentConnectedWallet: WalletInfo | null = null;\n\n/**\n * Initialize EIP-6963 wallet discovery\n */\nexport function initEVMWalletDiscovery(): void {\n if (typeof window === 'undefined' || evmDiscoveryInitialized) return;\n evmDiscoveryInitialized = true;\n\n // Listen for wallet announcements\n window.addEventListener('eip6963:announceProvider', ((event: EIP6963AnnounceProviderEvent) => {\n const { info, provider } = event.detail;\n evmWallets.set(info.uuid, { info, provider });\n // Notify listeners\n evmDiscoveryListeners.forEach(listener => listener());\n }) as EventListener);\n\n // Request wallets to announce themselves\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n}\n\n/**\n * Get all discovered EVM wallets\n */\nexport function getEVMWallets(): WalletInfo[] {\n const wallets: WalletInfo[] = [];\n const detectedNames = new Set<string>();\n \n evmWallets.forEach((detail, uuid) => {\n // Skip if wallet name already exists (avoid duplicates)\n if (!detectedNames.has(detail.info.name)) {\n wallets.push({\n id: uuid,\n name: detail.info.name,\n icon: detail.info.icon,\n networkType: NetworkType.EVM,\n provider: detail.provider,\n installed: true,\n });\n detectedNames.add(detail.info.name);\n }\n });\n\n // Fallback: if no EIP-6963 wallets found, check for window.ethereum\n if (wallets.length === 0 && typeof window !== 'undefined' && (window as any).ethereum) {\n const ethereum = (window as any).ethereum;\n const walletName = ethereum.isMetaMask ? 'MetaMask' : \n ethereum.isCoinbaseWallet ? 'Coinbase Wallet' : \n ethereum.isOkxWallet ? 'OKX Wallet' : 'Browser Wallet';\n \n if (!detectedNames.has(walletName)) {\n wallets.push({\n id: 'injected',\n name: walletName,\n icon: '', // Will use first letter as avatar\n networkType: NetworkType.EVM,\n provider: ethereum,\n installed: true,\n });\n }\n }\n\n return wallets;\n}\n\n/**\n * Subscribe to EVM wallet discovery changes\n */\nexport function onEVMWalletsChanged(callback: () => void): () => void {\n evmDiscoveryListeners.add(callback);\n return () => {\n evmDiscoveryListeners.delete(callback);\n };\n}\n\n/**\n * Get all detected Solana wallets\n */\nexport function getSolanaWallets(): WalletInfo[] {\n if (typeof window === 'undefined') return [];\n\n const wallets: WalletInfo[] = [];\n const detectedProviders = new Set<any>();\n const detectedNames = new Set<string>();\n\n // First, detect known wallets from our list\n for (const wallet of SOLANA_WALLETS) {\n const provider = wallet.detect();\n if (provider && !detectedNames.has(wallet.name)) {\n wallets.push({\n id: wallet.id,\n name: wallet.name,\n icon: wallet.icon,\n networkType: NetworkType.SOLANA,\n provider,\n installed: true,\n });\n detectedProviders.add(provider);\n detectedNames.add(wallet.name);\n }\n }\n\n // Fallback: detect any other Solana wallet not in our known list\n // Check window.solana if it exists and wasn't already detected\n const windowSolana = (window as any).solana;\n if (windowSolana && !detectedProviders.has(windowSolana)) {\n // Try to get wallet name from provider\n const walletName = windowSolana.isPhantom ? 'Phantom' :\n windowSolana.isSolflare ? 'Solflare' :\n windowSolana.isBackpack ? 'Backpack' :\n windowSolana.walletName || 'Solana Wallet';\n \n // Only add if name not already detected\n if (!detectedNames.has(walletName)) {\n wallets.push({\n id: 'solana-unknown',\n name: walletName,\n icon: '', // Will use first letter as avatar\n networkType: NetworkType.SOLANA,\n provider: windowSolana,\n installed: true,\n });\n }\n }\n\n return wallets;\n}\n\n/**\n * Get all wallets for a specific network type\n */\nexport function getWalletsForNetwork(networkType: NetworkType): WalletInfo[] {\n switch (networkType) {\n case NetworkType.EVM:\n return getEVMWallets();\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n return getSolanaWallets();\n default:\n return [];\n }\n}\n\n/**\n * Get a specific wallet by ID\n */\nexport function getWalletById(id: string, networkType: NetworkType): WalletInfo | null {\n const wallets = getWalletsForNetwork(networkType);\n return wallets.find(w => w.id === id) || null;\n}\n\n/**\n * Connect to a specific EVM wallet\n */\nexport async function connectEVMWallet(wallet: WalletInfo): Promise<string> {\n if (!wallet.provider) {\n throw new Error(`钱包 ${wallet.name} 不可用`);\n }\n\n const accounts = await wallet.provider.request({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0) {\n throw new Error('未能获取到钱包地址');\n }\n\n return accounts[0];\n}\n\n/**\n * Connect to a specific Solana wallet\n */\nexport async function connectSolanaWallet(wallet: WalletInfo): Promise<string> {\n if (!wallet.provider) {\n throw new Error(`钱包 ${wallet.name} 不可用`);\n }\n\n // Disconnect first if connected\n if (wallet.provider.isConnected) {\n try {\n await wallet.provider.disconnect();\n } catch (err) {\n console.warn('Failed to disconnect before connecting:', err);\n }\n }\n\n const response = await wallet.provider.connect();\n return response.publicKey.toString();\n}\n\n/**\n * Connect to a specific wallet\n */\nexport async function connectToWallet(wallet: WalletInfo): Promise<string> {\n let address: string;\n \n switch (wallet.networkType) {\n case NetworkType.EVM:\n address = await connectEVMWallet(wallet);\n break;\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n address = await connectSolanaWallet(wallet);\n break;\n default:\n throw new Error('不支持的网络类型');\n }\n \n // Save the connected wallet for payment signing\n currentConnectedWallet = wallet;\n \n return address;\n}\n\n/**\n * Get the currently connected wallet\n * Used by payment functions to get the correct provider\n */\nexport function getCurrentConnectedWallet(): WalletInfo | null {\n return currentConnectedWallet;\n}\n\n/**\n * Set the currently connected wallet\n * Called when connecting through other methods (e.g., direct connect)\n */\nexport function setCurrentConnectedWallet(wallet: WalletInfo | null): void {\n currentConnectedWallet = wallet;\n}\n\n/**\n * Clear the connected wallet\n * Called on disconnect\n */\nexport function clearConnectedWallet(): void {\n currentConnectedWallet = null;\n}\n\n/**\n * Get the wallet provider for payment\n * Returns the provider from the currently connected wallet,\n * or falls back to default providers if not set\n */\nexport function getWalletProviderForPayment(networkType: NetworkType): any {\n // If we have a connected wallet of the matching type, use its provider\n if (currentConnectedWallet && currentConnectedWallet.networkType === networkType) {\n return currentConnectedWallet.provider;\n }\n \n // Fallback to default providers\n if (typeof window === 'undefined') return null;\n \n switch (networkType) {\n case NetworkType.EVM:\n return (window as any).ethereum;\n case NetworkType.SOLANA:\n case NetworkType.SVM:\n return (window as any).phantom?.solana || (window as any).solana;\n default:\n return null;\n }\n}\n\n// Initialize on import (browser only)\nif (typeof window !== 'undefined') {\n initEVMWalletDiscovery();\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 * Uses @solana/web3.js and @solana/spl-token packages\n */\n\nimport {ComputeBudgetProgram, Connection, PublicKey, TransactionMessage, VersionedTransaction,} from \"@solana/web3.js\";\nimport {\n createTransferCheckedInstruction,\n getAssociatedTokenAddressSync,\n getMint,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport type {CreateSvmPaymentHeaderParams} from \"../../types\";\nimport {wrapPaymentError} from \"../../utils\";\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 // Create RPC connection\n const connection = new Connection(rpcUrl);\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 destinationPubkey = new PublicKey(paymentRequirements.payTo);\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 mintAccountInfo = await connection.getAccountInfo(mintPubkey);\n if (!mintAccountInfo) {\n throw new Error(`Mint account ${mintPubkey.toBase58()} not found`);\n }\n\n const tokenProgramId = mintAccountInfo.owner.equals(TOKEN_2022_PROGRAM_ID)\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to get decimals\n const mint = await getMint(connection, mintPubkey, undefined, tokenProgramId);\n\n // Derive source and destination ATAs\n const sourceAta = getAssociatedTokenAddressSync(\n mintPubkey,\n userPubkey,\n false,\n tokenProgramId\n );\n\n const destinationAta = getAssociatedTokenAddressSync(\n mintPubkey,\n destinationPubkey,\n false,\n tokenProgramId\n );\n\n // Check if source ATA exists (user must already have token account)\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta);\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);\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 // Build instructions array\n // The facilitator REQUIRES ComputeBudget instructions in positions 0 and 1\n const instructions = [\n ComputeBudgetProgram.setComputeUnitLimit({\n units: 7_000, // Sufficient for SPL token transfer\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1, // Minimal price\n }),\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n BigInt(paymentRequirements.maxAmountRequired),\n mint.decimals,\n [],\n tokenProgramId\n ),\n ];\n\n // Get recent blockhash\n const { blockhash } = await connection.getLatestBlockhash();\n\n // Build transaction message\n const messageV0 = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create versioned transaction\n const transaction = new VersionedTransaction(messageV0);\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 let signedTransaction: VersionedTransaction;\n try {\n // The wallet.signTransaction expects @solana/web3.js transaction format\n signedTransaction = await wallet.signTransaction(transaction);\n console.log('✅ Transaction signed successfully');\n } catch (error: any) {\n console.error('❌ Failed to sign transaction:', error);\n throw wrapPaymentError(error);\n }\n\n // Serialize the signed transaction to base64\n const serializedBytes = signedTransaction.serialize();\n // Convert Uint8Array to base64 string (browser-compatible)\n let binary = '';\n for (let i = 0; i < serializedBytes.length; i++) {\n binary += String.fromCharCode(serializedBytes[i]);\n }\n const serializedTransaction = btoa(binary);\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 = btoa(JSON.stringify(paymentPayload));\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://cathee-fu8ezd-fast-mainnet.helius-rpc.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 * 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\";\nimport {IGNORED_402_ERRORS, PAYMENT_ERROR_MESSAGES, PaymentOperationError, wrapPaymentError,} from \"../../utils\";\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, 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 // 3. Check if backend returned an error (e.g., insufficient_funds, verification_failed)\n // Skip errors that are part of normal 402 flow (initial request without X-PAYMENT)\n if (rawResponse.error && !IGNORED_402_ERRORS.includes(rawResponse.error as typeof IGNORED_402_ERRORS[number])) {\n console.error(`❌ Payment verification failed: ${rawResponse.error}`);\n const errorMessage = PAYMENT_ERROR_MESSAGES[rawResponse.error] ||\n `Payment failed: ${rawResponse.error}`;\n throw wrapPaymentError(new Error(errorMessage));\n }\n\n const x402Version: number = rawResponse.x402Version;\n const parsedPaymentRequirements: PaymentRequirements[] = rawResponse.accepts || [];\n\n // 4. 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 // 5. 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 // 6. Get RPC URL (use provided or default from backend requirements)\n const effectiveRpcUrl = rpcUrl || getDefaultSolanaRpcUrl(selectedRequirements.network);\n console.log(`📍 Using Solana RPC: ${effectiveRpcUrl.substring(0, 40)}...`);\n console.log(`📍 Network from backend: ${selectedRequirements.network}`);\n\n // 7. Create payment header with error handling\n let paymentHeader: string;\n try {\n paymentHeader = await createSvmPaymentHeader({\n wallet,\n paymentRequirements: selectedRequirements,\n x402Version,\n rpcUrl: effectiveRpcUrl,\n });\n console.log('✅ Payment header created successfully');\n } catch (error: any) {\n console.error('❌ Failed to create payment header:', error);\n throw wrapPaymentError(error);\n }\n\n // 8. 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 const retryResponse = await fetch(endpoint, newInit);\n\n // 9. Check if retry still returned 402 with error (e.g., verification failed)\n if (retryResponse.status === 402) {\n try {\n const retryData = await retryResponse.json();\n\n if (retryData.error && !IGNORED_402_ERRORS.includes(retryData.error as typeof IGNORED_402_ERRORS[number])) {\n console.error(`❌ Payment verification failed: ${retryData.error}`);\n const errorMessage = PAYMENT_ERROR_MESSAGES[retryData.error] ||\n `Payment failed: ${retryData.error}`;\n throw wrapPaymentError(new Error(errorMessage));\n }\n } catch (error: any) {\n // If error is already wrapped, re-throw it\n if (error instanceof PaymentOperationError) {\n throw error;\n }\n // Otherwise it's a JSON parse error, just return the response\n console.warn('⚠️ Could not parse retry 402 response:', error);\n }\n }\n\n return retryResponse;\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 * 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\";\nimport {wrapPaymentError} from \"../../utils\";\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 // Verify current chain matches target chain (if wallet provides getChainId)\n if (wallet.getChainId) {\n try {\n const currentChainIdHex = await wallet.getChainId();\n const currentChainId = parseInt(currentChainIdHex, 16);\n\n if (currentChainId !== chainId) {\n const networkNames: Record<number, string> = {\n 1: 'Ethereum Mainnet',\n 11155111: 'Sepolia Testnet',\n 8453: 'Base Mainnet',\n 84532: 'Base Sepolia Testnet',\n 137: 'Polygon Mainnet',\n 42161: 'Arbitrum One',\n 10: 'Optimism Mainnet',\n };\n\n const currentNetworkName = networkNames[currentChainId] || `Chain ${currentChainId}`;\n const targetNetworkName = networkNames[chainId] || `Chain ${chainId}`;\n\n throw new Error(\n `Network mismatch: Your wallet is connected to ${currentNetworkName}, ` +\n `but payment requires ${targetNetworkName}. Please switch your wallet to the correct network.`\n );\n }\n\n console.log(`✅ Chain ID verified: ${chainId}`);\n } catch (error: any) {\n // If it's our own error, re-throw with better handling\n if (error.message.includes('Network mismatch')) {\n throw wrapPaymentError(error);\n }\n // Otherwise just log and continue\n console.warn(\"Could not verify chainId:\", error);\n }\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 with error handling\n let signature: string;\n try {\n signature = await wallet.signTypedData(domain, types, authorization);\n console.log('✅ Signature created successfully');\n } catch (error: any) {\n console.error('❌ Failed to create signature:', error);\n throw wrapPaymentError(error);\n }\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\";\nimport {\n IGNORED_402_ERRORS,\n PAYMENT_ERROR_MESSAGES,\n PaymentErrorCode,\n PaymentOperationError,\n wrapPaymentError,\n} from \"../../utils\";\n\n/**\n * Network ID to name mapping\n */\nconst NETWORK_NAMES: Record<number, string> = {\n 1: 'Ethereum Mainnet',\n 11155111: 'Sepolia Testnet',\n 8453: 'Base Mainnet',\n 84532: 'Base Sepolia Testnet',\n 137: 'Polygon Mainnet',\n 42161: 'Arbitrum One',\n 10: 'Optimism Mainnet',\n};\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 // 3. Check if backend returned an error (e.g., insufficient_funds after signature)\n // Skip errors that are part of normal 402 flow (initial request without X-PAYMENT)\n if (rawResponse.error && !IGNORED_402_ERRORS.includes(rawResponse.error as typeof IGNORED_402_ERRORS[number])) {\n console.error(`❌ Payment verification failed: ${rawResponse.error}`);\n const errorMessage = PAYMENT_ERROR_MESSAGES[rawResponse.error] ||\n `Payment failed: ${rawResponse.error}`;\n throw wrapPaymentError(new Error(errorMessage));\n }\n\n const x402Version: number = rawResponse.x402Version;\n const parsedPaymentRequirements: PaymentRequirements[] = rawResponse.accepts || [];\n\n // 4. 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 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 // 5. 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 // 6. Get target chain ID\n const targetChainId = getChainIdFromNetwork(selectedRequirements.network);\n\n // 7. Get current wallet chainId (if wallet provides it)\n let currentChainId: number | undefined;\n if (wallet.getChainId) {\n try {\n const chainIdHex = await wallet.getChainId();\n currentChainId = parseInt(chainIdHex, 16);\n console.log(`📍 Current wallet chain: ${currentChainId}`);\n } catch (error) {\n console.warn(\"⚠️ Failed to get current chainId:\", error);\n }\n }\n\n // 8. Switch chain if needed\n // If we know current chainId and it doesn't match, we MUST switch\n if (currentChainId && currentChainId !== targetChainId) {\n if (!wallet.switchChain) {\n const currentNetworkName = NETWORK_NAMES[currentChainId] || `Chain ${currentChainId}`;\n const targetNetworkName = NETWORK_NAMES[targetChainId] || selectedRequirements.network;\n\n const error = new Error(\n `Network mismatch: Your wallet is connected to ${currentNetworkName}, ` +\n `but payment requires ${targetNetworkName}. Please switch to ${targetNetworkName} manually in your wallet.`\n );\n throw wrapPaymentError(error);\n }\n\n try {\n console.log(`🔄 Switching to chain ${targetChainId}...`);\n await wallet.switchChain(`0x${targetChainId.toString(16)}`);\n console.log(`✅ Successfully switched to chain ${targetChainId}`);\n } catch (error: any) {\n console.error('❌ Failed to switch chain:', error);\n\n const targetNetworkName = NETWORK_NAMES[targetChainId] || selectedRequirements.network;\n const wrappedError = wrapPaymentError(error);\n\n // Create new error with better message for network switch failure\n let finalError: PaymentOperationError;\n if (wrappedError.code === PaymentErrorCode.USER_REJECTED) {\n finalError = new PaymentOperationError({\n code: wrappedError.code,\n message: wrappedError.message,\n userMessage: `You rejected the network switch request. Please switch to ${targetNetworkName} manually.`,\n originalError: wrappedError.originalError,\n });\n } else {\n finalError = new PaymentOperationError({\n code: PaymentErrorCode.NETWORK_SWITCH_FAILED,\n message: wrappedError.message,\n userMessage: `Failed to switch to ${targetNetworkName}. Please switch manually in your wallet.`,\n originalError: wrappedError.originalError,\n });\n }\n\n throw finalError;\n }\n } else if (wallet.switchChain && !currentChainId) {\n // Try to switch even if we don't know current chain (best effort)\n try {\n console.log(`🔄 Attempting to switch to chain ${targetChainId}...`);\n await wallet.switchChain(`0x${targetChainId.toString(16)}`);\n console.log(`✅ Switch attempted successfully`);\n } catch (error) {\n console.warn(\"⚠️ Failed to switch chain (best effort):\", error);\n // Continue anyway - wallet might already be on correct chain\n }\n }\n\n // 9. Create payment header with error handling\n let paymentHeader: string;\n try {\n paymentHeader = await createEvmPaymentHeader({\n wallet,\n paymentRequirements: selectedRequirements,\n x402Version,\n chainId: targetChainId,\n });\n } catch (error: any) {\n console.error('❌ Failed to create payment header:', error);\n throw wrapPaymentError(error);\n }\n\n // 10. 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 const retryResponse = await fetch(endpoint, newInit);\n\n // 11. Check if retry still returned 402 with error (e.g., verification failed)\n if (retryResponse.status === 402) {\n try {\n const retryData = await retryResponse.json();\n\n if (retryData.error && !IGNORED_402_ERRORS.includes(retryData.error as typeof IGNORED_402_ERRORS[number])) {\n console.error(`❌ Payment verification failed: ${retryData.error}`);\n const errorMessage = PAYMENT_ERROR_MESSAGES[retryData.error] ||\n `Payment failed: ${retryData.error}`;\n throw wrapPaymentError(new Error(errorMessage));\n }\n } catch (error: any) {\n // If error is already wrapped, re-throw it\n if (error instanceof PaymentOperationError) {\n throw error;\n }\n // Otherwise it's a JSON parse error, just return the response\n console.warn('⚠️ Could not parse retry 402 response:', error);\n }\n }\n\n return retryResponse;\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 * 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\";\nimport {getWalletProviderForPayment} from \"./wallet-discovery\";\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 * @param additionalParams - Optional additional parameters to send with the request (default: {})\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 *\n * @example\n * ```tsx\n * // With additional parameters\n * const response = await makePayment(\n * '/api/endpoint',\n * networkType,\n * merchantId,\n * { userId: '123', customField: 'value' }\n * );\n * ```\n */\nexport async function makePayment(\n networkType: NetworkType,\n merchantId: string,\n endpoint: string = PROD_BACK_URL,\n additionalParams?: Record<string, any>,\n): Promise<Response> {\n // 使用新变量而不是修改参数\n const fullEndpoint = `${endpoint}/${merchantId}`;\n let response: Response;\n\n // 准备请求配置,如果有额外参数则添加到 body 中\n const requestInit: RequestInit = additionalParams && Object.keys(additionalParams).length > 0\n ? {\n body: JSON.stringify(additionalParams),\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n : {};\n\n if (networkType === NetworkType.SOLANA || networkType === NetworkType.SVM) {\n // Solana payment - use the selected wallet provider\n const solana = getWalletProviderForPayment(networkType);\n if (!solana) {\n throw new Error('请先连接 Solana 钱包');\n }\n\n if (!solana.isConnected) {\n await solana.connect();\n }\n\n response = await handleSvmPayment(fullEndpoint, {\n wallet: solana,\n network: 'solana', // Will use backend's network configuration\n }, requestInit);\n } else if (networkType === NetworkType.EVM) {\n // EVM payment - use the selected wallet provider\n const ethereum = getWalletProviderForPayment(networkType);\n if (!ethereum) {\n throw new Error('请先连接 EVM 钱包');\n }\n\n const provider = new ethers.BrowserProvider(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 // Get current chain ID from wallet\n getChainId: async () => {\n const network = await provider.getNetwork();\n return `0x${network.chainId.toString(16)}`;\n },\n // Switch to a different chain\n switchChain: async (chainId: string) => {\n await ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId }],\n });\n },\n };\n\n // Use a placeholder network - handler will use backend's network configuration\n response = await handleEvmPayment(fullEndpoint, {\n wallet,\n network: 'base', // Will use backend's network configuration\n }, requestInit);\n } else {\n throw new Error(`不支持的网络类型: ${networkType}`);\n }\n\n return response;\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 'evm': 'EVM',\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 * Payment Error Handler\n *\n * Centralized error handling for wallet and payment operations\n * Provides user-friendly error messages for common issues\n */\n\n/**\n * Error messages that should be ignored during 402 flow\n * These are part of normal payment flow (initial request without X-PAYMENT)\n */\nexport const IGNORED_402_ERRORS = [\n 'X-PAYMENT header is required',\n 'missing X-PAYMENT header',\n 'payment_required',\n] as const;\n\n/**\n * Map backend error codes to user-friendly messages\n */\nexport const PAYMENT_ERROR_MESSAGES: Record<string, string> = {\n 'insufficient_funds': 'Insufficient balance to complete this payment',\n 'invalid_signature': 'Invalid payment signature',\n 'expired': 'Payment authorization has expired',\n 'already_used': 'This payment has already been used',\n 'network_mismatch': 'Payment network does not match',\n 'invalid_payment': 'Invalid payment data',\n 'verification_failed': 'Payment verification failed',\n 'invalid_exact_svm_payload_transaction_simulation_failed': 'Transaction simulation failed due to insufficient balance. Please check your wallet balance carefully and ensure you have enough funds to cover the payment and transaction fees.',\n};\n\nexport interface PaymentError {\n code: string;\n message: string;\n userMessage: string;\n originalError?: any;\n}\n\n/**\n * Error codes for payment operations\n */\nexport enum PaymentErrorCode {\n // User action errors\n USER_REJECTED = 'USER_REJECTED',\n USER_CANCELLED = 'USER_CANCELLED',\n\n // Network errors\n NETWORK_MISMATCH = 'NETWORK_MISMATCH',\n NETWORK_SWITCH_FAILED = 'NETWORK_SWITCH_FAILED',\n UNSUPPORTED_NETWORK = 'UNSUPPORTED_NETWORK',\n\n // Chain ID errors\n CHAIN_ID_MISMATCH = 'CHAIN_ID_MISMATCH',\n CHAIN_ID_UNAVAILABLE = 'CHAIN_ID_UNAVAILABLE',\n\n // Wallet errors\n WALLET_NOT_CONNECTED = 'WALLET_NOT_CONNECTED',\n WALLET_LOCKED = 'WALLET_LOCKED',\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\n\n // Payment requirement errors\n INVALID_PAYMENT_REQUIREMENTS = 'INVALID_PAYMENT_REQUIREMENTS',\n AMOUNT_EXCEEDED = 'AMOUNT_EXCEEDED',\n\n // Generic errors\n SIGNATURE_FAILED = 'SIGNATURE_FAILED',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * Parse and classify error from wallet operations\n */\nexport function parsePaymentError(error: any): PaymentError {\n // Handle null/undefined\n if (!error) {\n return {\n code: PaymentErrorCode.UNKNOWN_ERROR,\n message: 'Unknown error occurred',\n userMessage: 'An unknown error occurred. Please try again.',\n originalError: error,\n };\n }\n\n const errorMessage = error.message || error.toString();\n const errorCode = error.code;\n\n // 1. User rejected/cancelled actions\n if (\n errorCode === 4001 ||\n errorCode === 'ACTION_REJECTED' ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('user rejected') ||\n errorMessage.includes('User denied') ||\n errorMessage.includes('user denied') ||\n errorMessage.includes('ethers-user-denied')\n ) {\n return {\n code: PaymentErrorCode.USER_REJECTED,\n message: 'User rejected the transaction',\n userMessage: 'You rejected the signature request. Please try again if you want to proceed.',\n originalError: error,\n };\n }\n\n // 2. Chain ID mismatch\n if (\n errorMessage.includes('chainId') &&\n (errorMessage.includes('must match') || errorMessage.includes('does not match'))\n ) {\n // Extract chain IDs from error message if possible\n const match = errorMessage.match(/chainId.*?\"(\\d+)\".*?active.*?\"(\\d+)\"/i) ||\n errorMessage.match(/chain (\\d+).*?chain (\\d+)/i);\n \n if (match) {\n const [, requestedChain, activeChain] = match;\n return {\n code: PaymentErrorCode.CHAIN_ID_MISMATCH,\n message: `Network mismatch (wallet is on different chain): Requested ${requestedChain}, but wallet is on ${activeChain}`,\n userMessage: `Your wallet is on the wrong network. Please switch to the correct network and try again.`,\n originalError: error,\n };\n }\n\n return {\n code: PaymentErrorCode.CHAIN_ID_MISMATCH,\n message: 'Network mismatch (wallet selected network does not match)',\n userMessage: 'Your wallet is on the wrong network. Please switch to the correct network.',\n originalError: error,\n };\n }\n\n // 3. Network mismatch (general)\n if (\n errorMessage.includes('Network mismatch') ||\n errorMessage.includes('Wrong network') ||\n errorMessage.includes('Incorrect network')\n ) {\n return {\n code: PaymentErrorCode.NETWORK_MISMATCH,\n message: errorMessage,\n userMessage: 'Please switch your wallet to the correct network.',\n originalError: error,\n };\n }\n\n // 4. Wallet locked\n if (\n errorMessage.includes('locked') ||\n errorMessage.includes('Wallet is locked')\n ) {\n return {\n code: PaymentErrorCode.WALLET_LOCKED,\n message: 'Wallet is locked',\n userMessage: 'Please unlock your wallet and try again.',\n originalError: error,\n };\n }\n\n // 5. Insufficient balance/funds\n if (\n errorMessage.includes('insufficient') &&\n (errorMessage.includes('balance') || errorMessage.includes('funds'))\n ) {\n return {\n code: PaymentErrorCode.INSUFFICIENT_BALANCE,\n message: 'Insufficient balance',\n userMessage: 'You don\\'t have enough balance to complete this payment.',\n originalError: error,\n };\n }\n\n // 6. Network switch failed\n if (\n errorMessage.includes('Failed to switch') ||\n errorMessage.includes('switch chain')\n ) {\n return {\n code: PaymentErrorCode.NETWORK_SWITCH_FAILED,\n message: errorMessage,\n userMessage: 'Failed to switch network. Please switch manually in your wallet.',\n originalError: error,\n };\n }\n\n // 7. Wallet not connected\n if (\n errorMessage.includes('not connected') ||\n errorMessage.includes('No wallet') ||\n errorMessage.includes('Connect wallet')\n ) {\n return {\n code: PaymentErrorCode.WALLET_NOT_CONNECTED,\n message: 'Wallet not connected',\n userMessage: 'Please connect your wallet first.',\n originalError: error,\n };\n }\n\n // 8. Invalid payment requirements\n if (\n errorMessage.includes('No suitable') ||\n errorMessage.includes('payment requirements') ||\n errorMessage.includes('Missing payTo') ||\n errorMessage.includes('Missing asset')\n ) {\n return {\n code: PaymentErrorCode.INVALID_PAYMENT_REQUIREMENTS,\n message: errorMessage,\n userMessage: 'Invalid payment configuration. Please contact support.',\n originalError: error,\n };\n }\n\n // 9. Amount exceeded\n if (errorMessage.includes('exceeds maximum')) {\n return {\n code: PaymentErrorCode.AMOUNT_EXCEEDED,\n message: errorMessage,\n userMessage: 'Payment amount exceeds the maximum allowed.',\n originalError: error,\n };\n }\n\n // 10. Generic signature failure\n if (\n errorMessage.includes('signature') ||\n errorMessage.includes('sign') ||\n errorCode === 'UNKNOWN_ERROR'\n ) {\n return {\n code: PaymentErrorCode.SIGNATURE_FAILED,\n message: errorMessage,\n userMessage: 'Failed to sign the transaction. Please try again.',\n originalError: error,\n };\n }\n\n // Default: Unknown error\n return {\n code: PaymentErrorCode.UNKNOWN_ERROR,\n message: errorMessage,\n userMessage: 'An unexpected error occurred. Please try again or contact support.',\n originalError: error,\n };\n}\n\n/**\n * Create a user-friendly error with detailed information\n */\nexport class PaymentOperationError extends Error {\n public readonly code: string;\n public readonly userMessage: string;\n public readonly originalError?: any;\n\n constructor(paymentError: PaymentError) {\n super(paymentError.message);\n this.name = 'PaymentOperationError';\n this.code = paymentError.code;\n this.userMessage = paymentError.userMessage;\n this.originalError = paymentError.originalError;\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PaymentOperationError);\n }\n }\n\n /**\n * Get a formatted error message for logging\n */\n toLogString(): string {\n return `[${this.code}] ${this.message} | User Message: ${this.userMessage}`;\n }\n}\n\n/**\n * Wrap an error with payment error handling\n */\nexport function wrapPaymentError(error: any): PaymentOperationError {\n const parsedError = parsePaymentError(error);\n return new PaymentOperationError(parsedError);\n}\n\n","/**\n * Wallet Store (External Store)\n *\n * Lightweight state management without Context Provider\n * Uses singleton pattern + event emitter for reactivity\n */\n\nimport {NetworkType} from '../../types';\nimport {\n connectWallet as connectWalletUtil,\n disconnectWallet as disconnectWalletUtil,\n isWalletManuallyDisconnected,\n markWalletDisconnected,\n onAccountsChanged,\n onChainChanged,\n onWalletDisconnect,\n removeWalletAddress,\n saveWalletAddress,\n switchNetwork as switchNetworkUtil,\n connectToWallet,\n WalletInfo,\n clearWalletDisconnection,\n saveConnectedNetworkType,\n clearConnectedWallet,\n setCurrentConnectedWallet,\n getWalletsForNetwork,\n} from '../../utils';\n\ntype Listener = () => void;\n\ninterface WalletState {\n address: string | null;\n networkType: NetworkType | null;\n isConnecting: boolean;\n error: string | null;\n}\n\nclass WalletStore {\n private state: WalletState = {\n address: null,\n networkType: null,\n isConnecting: false,\n error: null,\n };\n\n private listeners = new Set<Listener>();\n private initialized = false;\n\n // Initialize store (call once)\n init() {\n if (this.initialized) return;\n this.initialized = true;\n\n // 不自动重连,让 usePageNetwork 来决定需要哪个网络\n // 这样可以确保每个页面都使用正确的网络类型\n\n // Listen for account changes (EVM only)\n onAccountsChanged((accounts) => {\n // 只有当前激活的网络是EVM时才处理账户变化\n if (this.state.networkType === NetworkType.EVM) {\n if (accounts.length === 0) {\n this.setState({address: null});\n } else if (!isWalletManuallyDisconnected(NetworkType.EVM)) {\n this.setState({address: accounts[0]});\n saveWalletAddress(NetworkType.EVM, accounts[0]);\n }\n }\n });\n\n // Listen for network/chain changes (EVM only)\n onChainChanged(() => {\n // 只有当前激活的网络是EVM时才处理链变化\n if (this.state.networkType === NetworkType.EVM) {\n // 用户在钱包中切换了链,清除当前连接\n this.handleDisconnect(NetworkType.EVM, 'Chain changed. Please reconnect your wallet.');\n }\n });\n\n // Listen for wallet disconnect (SVM only)\n onWalletDisconnect(() => {\n // 只有当前激活的网络是SVM时才处理断开\n const svmTypes = [NetworkType.SOLANA, NetworkType.SVM];\n if (this.state.networkType && svmTypes.includes(this.state.networkType)) {\n this.handleDisconnect(this.state.networkType);\n }\n });\n }\n\n\n // Get current state\n getState(): WalletState {\n return this.state;\n }\n\n // Update state and notify listeners\n private setState(partial: Partial<WalletState>) {\n this.state = {...this.state, ...partial};\n this.notifyListeners();\n }\n\n // Subscribe to state changes\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // Notify all listeners\n private notifyListeners() {\n this.listeners.forEach(listener => listener());\n }\n\n // Handle wallet disconnect (internal helper)\n private handleDisconnect(networkType: NetworkType, error?: string) {\n removeWalletAddress(networkType);\n markWalletDisconnected(networkType);\n\n // 清除当前网络类型缓存\n if (typeof window !== 'undefined') {\n localStorage.removeItem('connected_network_type');\n }\n\n this.setState({\n address: null,\n networkType: null,\n error: error || null,\n });\n }\n\n // Connect wallet\n // @param forceSelect - 强制弹出钱包选择界面,用于切换账户\n async connect(type: NetworkType, forceSelect: boolean = false): Promise<void> {\n // 保存当前网络的地址到缓存(如果正在切换网络)\n if (this.state.address && this.state.networkType && this.state.networkType !== type) {\n saveWalletAddress(this.state.networkType, this.state.address);\n }\n\n this.setState({isConnecting: true, error: null});\n\n try {\n const walletAddress = await connectWalletUtil(type, forceSelect);\n\n // Try to set the default wallet provider for this network type\n // This ensures payment functions use the correct provider\n const wallets = getWalletsForNetwork(type);\n if (wallets.length > 0) {\n // Use the first available wallet as default\n setCurrentConnectedWallet(wallets[0]);\n }\n\n this.setState({\n address: walletAddress,\n networkType: type,\n isConnecting: false,\n });\n } catch (err: any) {\n this.setState({\n error: err.message || 'Failed to connect wallet',\n isConnecting: false,\n });\n throw err;\n }\n }\n\n // Connect to a specific wallet (from wallet discovery)\n async connectWithWallet(wallet: WalletInfo): Promise<void> {\n // 保存当前网络的地址到缓存(如果正在切换网络)\n if (this.state.address && this.state.networkType && this.state.networkType !== wallet.networkType) {\n saveWalletAddress(this.state.networkType, this.state.address);\n }\n\n this.setState({isConnecting: true, error: null});\n\n try {\n const walletAddress = await connectToWallet(wallet);\n\n // Save connection state\n clearWalletDisconnection(wallet.networkType);\n saveConnectedNetworkType(wallet.networkType);\n saveWalletAddress(wallet.networkType, walletAddress);\n\n this.setState({\n address: walletAddress,\n networkType: wallet.networkType,\n isConnecting: false,\n });\n } catch (err: any) {\n this.setState({\n error: err.message || 'Failed to connect wallet',\n isConnecting: false,\n });\n throw err;\n }\n }\n\n // Switch network (use cached wallet if available)\n async switchNetwork(type: NetworkType): Promise<void> {\n // 保存当前网络的地址到缓存\n if (this.state.address && this.state.networkType) {\n saveWalletAddress(this.state.networkType, this.state.address);\n }\n\n this.setState({isConnecting: true, error: null});\n\n try {\n // 尝试使用缓存的钱包地址切换\n const address = await switchNetworkUtil(type);\n\n if (address) {\n // 成功使用缓存的钱包切换\n this.setState({\n address,\n networkType: type,\n isConnecting: false,\n });\n } else {\n // 没有缓存的钱包,需要连接\n this.setState({\n address: null,\n networkType: type,\n isConnecting: true,\n });\n await this.connect(type);\n }\n } catch (err: any) {\n this.setState({\n error: err.message || 'Failed to switch network',\n isConnecting: false,\n });\n throw err;\n }\n }\n\n // Disconnect wallet\n async disconnect(): Promise<void> {\n const currentNetwork = this.state.networkType;\n\n // Clear the connected wallet provider\n clearConnectedWallet();\n\n if (currentNetwork) {\n // 先调用真正的钱包断开方法\n try {\n await disconnectWalletUtil(currentNetwork);\n } catch (err) {\n console.warn('Failed to disconnect wallet provider:', err);\n }\n // 清除当前网络的缓存并标记为手动断开\n this.handleDisconnect(currentNetwork);\n } else {\n // 即使没有当前网络,也要清理状态\n this.setState({\n address: null,\n networkType: null,\n error: null,\n });\n }\n }\n\n // Clear error\n clearError(): void {\n this.setState({error: null});\n }\n\n // Ensure network matches expected type (for page-specific network requirements)\n async ensureNetwork(expectedNetwork: NetworkType): Promise<void> {\n // 如果用户手动断开了该网络,不自动重连\n if (isWalletManuallyDisconnected(expectedNetwork)) {\n return;\n }\n\n // 如果当前网络已经匹配,直接返回\n if (this.state.networkType === expectedNetwork && this.state.address) {\n return;\n }\n\n // 如果当前网络不匹配,尝试切换\n if (this.state.networkType !== expectedNetwork) {\n await this.switchNetwork(expectedNetwork);\n } else if (!this.state.address) {\n // 网络匹配但没有地址,需要连接\n await this.connect(expectedNetwork);\n }\n }\n}\n\n// Singleton instance\nexport const walletStore = new WalletStore();\n\n// Initialize on import (browser only)\nif (typeof window !== 'undefined') {\n walletStore.init();\n}\n\n","/**\n * usePageNetwork Hook\n *\n * 页面级网络管理 Hook\n * 自动确保当前页面连接到正确的网络\n */\n\nimport {useEffect} from 'react';\nimport {NetworkType} from '../../types';\nimport {useWallet} from './useWalletStore';\n\nexport interface UsePageNetworkOptions {\n /** 是否自动切换网络(默认 true) */\n autoSwitch?: boolean;\n /** 是否在组件挂载时立即切换(默认 true) */\n switchOnMount?: boolean;\n}\n\n/**\n * 页面级网络管理 Hook\n * \n * 用于确保页面始终连接到期望的网络\n * 自动处理网络切换,保持其他网络的缓存不受影响\n * \n * @param expectedNetwork - 页面期望的网络类型(NetworkType,如 EVM、SVM)\n * @param options - 配置选项\n * \n * @example\n * ```tsx\n * // EVM 页面\n * function EvmPage() {\n * const { address, isConnecting } = usePageNetwork(NetworkType.EVM);\n * return <div>{isConnecting ? 'Connecting...' : address}</div>;\n * }\n * \n * // SVM 页面\n * function SvmPage() {\n * const { address, isConnecting } = usePageNetwork(NetworkType.SVM);\n * return <div>{isConnecting ? 'Connecting...' : address}</div>;\n * }\n * ```\n */\nexport function usePageNetwork(\n expectedNetwork: NetworkType,\n options: UsePageNetworkOptions = {}\n) {\n const {\n autoSwitch = true,\n switchOnMount = true,\n } = options;\n\n const wallet = useWallet();\n\n useEffect(() => {\n if (!autoSwitch || !switchOnMount) return;\n \n // ensureNetwork 内部会检查是否手动断开,如果是则不会重连\n wallet.ensureNetwork(expectedNetwork).catch(err => {\n console.error('Failed to ensure network:', err);\n });\n // 只在 expectedNetwork 改变时执行,避免无限循环\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [expectedNetwork]);\n\n return wallet;\n}\n\n","/**\n * usePayment Hook\n *\n * React hook for payment state management\n * Provides state only - you control the payment flow\n */\n\nimport {useCallback, useState} from 'react';\n\nexport interface UsePaymentReturn {\n // State\n isProcessing: boolean;\n result: any;\n error: string | null;\n\n // State setters\n setIsProcessing: (value: boolean) => void;\n setResult: (value: any) => void;\n setError: (value: string | null) => void;\n\n // Helpers\n clearResult: () => void;\n clearError: () => void;\n reset: () => void;\n}\n\n/**\n * Hook for managing payment state\n *\n * This hook only manages state - you control the payment logic.\n * Use SDK's handleSvmPayment/handleEvmPayment directly for full control.\n *\n * @example\n * ```tsx\n * import { usePayment, useWallet } from '../react';\n * import { handleSvmPayment } from '@/app/sdk';\n *\n * function PaymentButton() {\n * const { networkType } = useWallet();\n * const { isProcessing, setIsProcessing, result, setResult, error, setError } = usePayment();\n *\n * const handlePay = async () => {\n * if (!networkType) return;\n *\n * setIsProcessing(true);\n * setError(null);\n *\n * try {\n * const response = await handleSvmPayment('/api/endpoint', {\n * wallet: window.solana,\n * network: 'solana-devnet',\n * });\n *\n * const data = await response.json();\n * setResult(data);\n *\n * // Your custom logic here\n * console.log('Payment success!');\n * } catch (err: any) {\n * setError(err.message);\n * } finally {\n * setIsProcessing(false);\n * }\n * };\n *\n * return (\n * <div>\n * <button onClick={handlePay} disabled={isProcessing}>\n * {isProcessing ? 'Processing...' : 'Pay'}\n * </button>\n * {error && <p>Error: {error}</p>}\n * {result && <pre>{JSON.stringify(result, null, 2)}</pre>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePayment(): UsePaymentReturn {\n const [isProcessing, setIsProcessing] = useState(false);\n const [result, setResult] = useState<any>(null);\n const [error, setError] = useState<string | null>(null);\n\n const clearResult = useCallback(() => {\n setResult(null);\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const reset = useCallback(() => {\n setIsProcessing(false);\n setResult(null);\n setError(null);\n }, []);\n\n return {\n isProcessing,\n result,\n error,\n setIsProcessing,\n setResult,\n setError,\n clearResult,\n clearError,\n reset,\n };\n}\n\n","/**\n * usePaymentInfo Hook\n *\n * React hook for fetching payment information from endpoint\n */\n\nimport {useEffect, useState} from 'react';\nimport type {PaymentRequirements} from 'x402/types';\nimport {NetworkType} from '../../types';\nimport {getSupportedNetworkTypes, parsePaymentRequired} from '../../utils';\nimport {PROD_BACK_URL} from \"../../types/common\";\n\nexport interface UsePaymentInfoReturn {\n // State\n paymentInfo: PaymentRequirements[] | null;\n supportedNetworks: NetworkType[];\n isLoading: boolean;\n error: string | null;\n\n // Actions\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook for fetching payment information\n *\n * @param endpoint - API endpoint to fetch payment info from\n * @param merchantId - @see our website to apply\n * @param additionalParams - Optional additional parameters to send with the request (default: {})\n *\n * @example\n * ```tsx\n * function PaymentInfo() {\n * const { paymentInfo, supportedNetworks, isLoading } = usePaymentInfo('/api/protected');\n *\n * if (isLoading) return <p>Loading...</p>;\n *\n * return (\n * <div>\n * <p>Supported networks:</p>\n * {supportedNetworks.map(net => <span key={net}>{net}</span>)}\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With additional parameters\n * function PaymentInfo() {\n * const { paymentInfo } = usePaymentInfo(\n * 'merchant-id',\n * '/api/protected',\n * { userId: '123', customField: 'value' }\n * );\n * }\n * ```\n */\nexport function usePaymentInfo(\n merchantId: string,\n endpoint: string = PROD_BACK_URL,\n additionalParams?: Record<string, any>\n): UsePaymentInfoReturn {\n const [paymentInfo, setPaymentInfo] = useState<PaymentRequirements[] | null>(null);\n const [supportedNetworks, setSupportedNetworks] = useState<NetworkType[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPaymentInfo = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n // 使用新变量而不是修改参数\n const fullEndpoint = `${endpoint}/${merchantId}`;\n\n // 准备请求配置\n const requestInit: RequestInit = {\n method: 'POST',\n ...(additionalParams && Object.keys(additionalParams).length > 0\n ? {\n body: JSON.stringify(additionalParams),\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n : {}),\n };\n\n const response = await fetch(fullEndpoint, requestInit);\n\n if (response.status === 402) {\n const body = await response.json();\n const payment = parsePaymentRequired(body);\n\n if (payment) {\n setPaymentInfo(payment);\n\n const networks = getSupportedNetworkTypes(payment);\n setSupportedNetworks(networks);\n }\n } else {\n // No payment required\n setPaymentInfo(null);\n setSupportedNetworks([]);\n }\n } catch (err: any) {\n setError(err.message || 'Failed to fetch payment info');\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n fetchPaymentInfo();\n // Note: additionalParams is not in dependencies to avoid unnecessary re-fetches\n // If you need dynamic additionalParams, wrap it with useMemo or use refetch() manually\n }, [endpoint, merchantId]);\n\n return {\n paymentInfo,\n supportedNetworks,\n isLoading,\n error,\n refetch: fetchPaymentInfo,\n };\n}\n\n","/**\n * WalletConnect Component\n *\n * Pre-built wallet connection UI component with inline styles\n */\n\n'use client';\n\nimport React, {useState} from 'react';\nimport {NetworkType} from '../../types';\nimport {formatAddress, getNetworkDisplayName, WalletInfo} from '../../utils';\nimport {useWallet} from '../hooks/useWalletStore';\nimport {WalletSelectModal} from './WalletSelectModal';\nimport {\n buttonsContainerStyle,\n containerStyle,\n getAddressStyle,\n getConnectButtonStyle,\n getDisconnectButtonStyle,\n getErrorStyle,\n getHintStyle,\n getLabelStyle,\n getSectionStyle,\n getTitleStyle,\n walletActionsStyle,\n walletAddressStyle,\n walletOptionStyle,\n} from '../styles/inline-styles';\n\nexport interface WalletConnectProps {\n supportedNetworks?: NetworkType[];\n className?: string;\n onConnect?: (address: string, networkType: NetworkType) => void;\n onDisconnect?: () => void;\n /** 是否显示切换钱包按钮,默认为 true */\n showSwitchWallet?: boolean;\n}\n\n/**\n * Pre-built wallet connection component\n *\n * @example\n * ```tsx\n * import { WalletConnect } from '../react';\n *\n * function App() {\n * return (\n * <WalletConnect\n * supportedNetworks={[NetworkType.SOLANA, NetworkType.EVM]}\n * onConnect={(address, network) => console.log('Connected:', address)}\n * />\n * );\n * }\n * ```\n */\nexport function WalletConnect({\n supportedNetworks = [NetworkType.SOLANA, NetworkType.EVM],\n className = '',\n onConnect,\n onDisconnect,\n showSwitchWallet = true,\n }: WalletConnectProps) {\n const {address, networkType, isConnecting, error, connectWithWallet, disconnect} = useWallet();\n const [hoveredButton, setHoveredButton] = useState<string | null>(null);\n const [walletSelectOpen, setWalletSelectOpen] = useState(false);\n const [selectedNetworkType, setSelectedNetworkType] = useState<NetworkType | null>(null);\n\n const handleOpenWalletSelect = (network: NetworkType) => {\n setSelectedNetworkType(network);\n setWalletSelectOpen(true);\n };\n\n const handleWalletSelect = async (wallet: WalletInfo) => {\n setWalletSelectOpen(false);\n try {\n await connectWithWallet(wallet);\n } catch (err) {\n // Error is already set in hook\n }\n };\n\n const handleDisconnect = async () => {\n await disconnect();\n onDisconnect?.();\n };\n\n const handleSwitchWallet = () => {\n if (networkType) {\n // 打开钱包选择弹窗\n setSelectedNetworkType(networkType);\n setWalletSelectOpen(true);\n }\n };\n\n return (\n <>\n <div style={{ ...containerStyle, ...(className ? {} : {}) }} className={className}>\n {!address ? (\n <div style={getSectionStyle()}>\n <h3 style={getTitleStyle()}>Connect Wallet</h3>\n\n {supportedNetworks.length === 0 ? (\n <p style={getHintStyle()}>Please install a supported wallet extension</p>\n ) : (\n <div style={buttonsContainerStyle}>\n {supportedNetworks.map((network) => (\n <div key={network} style={walletOptionStyle}>\n <button\n style={getConnectButtonStyle(isConnecting, hoveredButton === network)}\n onClick={() => handleOpenWalletSelect(network)}\n disabled={isConnecting}\n onMouseEnter={() => setHoveredButton(network)}\n onMouseLeave={() => setHoveredButton(null)}\n >\n {isConnecting ? 'Connecting...' : getNetworkDisplayName(network)}\n </button>\n </div>\n ))}\n </div>\n )}\n\n {error && <p style={getErrorStyle()}>{error}</p>}\n\n <p style={getHintStyle()}>\n Select a network to see available wallets\n </p>\n </div>\n ) : (\n <div style={getSectionStyle()}>\n <div style={walletAddressStyle}>\n <span style={getLabelStyle()}>\n Connected {networkType && `(${getNetworkDisplayName(networkType)})`}\n </span>\n <span style={getAddressStyle()}>{formatAddress(address)}</span>\n </div>\n <div style={walletActionsStyle}>\n {showSwitchWallet && (\n <button\n style={getConnectButtonStyle(isConnecting, hoveredButton === 'switch')}\n onClick={handleSwitchWallet}\n disabled={isConnecting}\n onMouseEnter={() => setHoveredButton('switch')}\n onMouseLeave={() => setHoveredButton(null)}\n >\n {isConnecting ? 'Switching...' : 'Switch Wallet'}\n </button>\n )}\n <button\n style={getDisconnectButtonStyle(hoveredButton === 'disconnect')}\n onClick={handleDisconnect}\n onMouseEnter={() => setHoveredButton('disconnect')}\n onMouseLeave={() => setHoveredButton(null)}\n >\n Disconnect\n </button>\n </div>\n <p style={getHintStyle()}>\n Click \"Switch Wallet\" to change wallet or account\n </p>\n </div>\n )}\n </div>\n\n {/* Wallet Selection Modal */}\n {selectedNetworkType && (\n <WalletSelectModal\n isOpen={walletSelectOpen}\n networkType={selectedNetworkType}\n onSelect={handleWalletSelect}\n onClose={() => setWalletSelectOpen(false)}\n />\n )}\n </>\n );\n}\n\n","/**\n * WalletSelectModal Component\n *\n * Modal for selecting a wallet to connect\n * Uses Portal to render outside parent container (avoids clipping)\n */\n\n'use client';\n\nimport React, {useEffect, useState} from 'react';\nimport {createPortal} from 'react-dom';\nimport {NetworkType} from '../../types';\nimport {\n getWalletsForNetwork,\n initEVMWalletDiscovery,\n onEVMWalletsChanged,\n WalletInfo,\n} from '../../utils/wallet-discovery';\nimport {getNetworkDisplayName} from '../../utils';\n\nexport interface WalletSelectModalProps {\n isOpen: boolean;\n networkType: NetworkType;\n onSelect: (wallet: WalletInfo) => void;\n onClose: () => void;\n}\n\n// Inline styles - compact version\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 99999,\n};\n\nconst modalStyle: React.CSSProperties = {\n backgroundColor: '#ffffff',\n borderRadius: '12px',\n padding: '16px',\n maxWidth: '320px',\n width: '90%',\n maxHeight: '70vh',\n overflow: 'auto',\n boxShadow: '0 10px 25px rgba(0, 0, 0, 0.15)',\n};\n\nconst headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '12px',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '15px',\n fontWeight: 600,\n color: '#1a1a1a',\n margin: 0,\n};\n\nconst closeButtonStyle: React.CSSProperties = {\n background: 'none',\n border: 'none',\n fontSize: '20px',\n cursor: 'pointer',\n color: '#666',\n padding: '2px 6px',\n lineHeight: 1,\n borderRadius: '4px',\n};\n\nconst subtitleStyle: React.CSSProperties = {\n fontSize: '12px',\n color: '#666',\n marginBottom: '12px',\n};\n\nconst walletListStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n};\n\nconst getWalletItemStyle = (isHovered: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '10px 12px',\n border: '1px solid #e5e5e5',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n backgroundColor: isHovered ? '#f5f5f5' : '#ffffff',\n borderColor: isHovered ? '#d0d0d0' : '#e5e5e5',\n});\n\nconst walletIconStyle: React.CSSProperties = {\n width: '32px',\n height: '32px',\n borderRadius: '8px',\n objectFit: 'contain',\n backgroundColor: '#f5f5f5',\n};\n\n// Generate a consistent color based on wallet name\nconst getAvatarColor = (name: string): string => {\n const colors = [\n '#6366f1', // indigo\n '#8b5cf6', // violet\n '#ec4899', // pink\n '#f43f5e', // rose\n '#f97316', // orange\n '#eab308', // yellow\n '#22c55e', // green\n '#14b8a6', // teal\n '#06b6d4', // cyan\n '#3b82f6', // blue\n ];\n // Use first char code to pick a consistent color\n const index = name.charCodeAt(0) % colors.length;\n return colors[index];\n};\n\nconst getWalletIconPlaceholderStyle = (walletName: string): React.CSSProperties => ({\n width: '32px',\n height: '32px',\n borderRadius: '8px',\n backgroundColor: getAvatarColor(walletName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '14px',\n fontWeight: 600,\n color: '#ffffff',\n});\n\nconst walletNameStyle: React.CSSProperties = {\n fontSize: '14px',\n fontWeight: 500,\n color: '#1a1a1a',\n};\n\nconst emptyStateStyle: React.CSSProperties = {\n textAlign: 'center',\n padding: '24px 12px',\n color: '#666',\n};\n\nconst emptyTitleStyle: React.CSSProperties = {\n fontSize: '14px',\n fontWeight: 500,\n marginBottom: '6px',\n color: '#1a1a1a',\n};\n\nconst emptyDescStyle: React.CSSProperties = {\n fontSize: '12px',\n color: '#888',\n};\n\n// Wallet item component with icon fallback\nfunction WalletItem({\n wallet,\n isHovered,\n onSelect,\n onHover\n }: {\n wallet: WalletInfo;\n isHovered: boolean;\n onSelect: () => void;\n onHover: (hovered: boolean) => void;\n}) {\n const [iconError, setIconError] = useState(false);\n\n return (\n <div\n style={getWalletItemStyle(isHovered)}\n onClick={onSelect}\n onMouseEnter={() => onHover(true)}\n onMouseLeave={() => onHover(false)}\n >\n {wallet.icon && !iconError ? (\n <img\n src={wallet.icon}\n alt={wallet.name}\n style={walletIconStyle}\n onError={() => setIconError(true)}\n />\n ) : (\n <div style={getWalletIconPlaceholderStyle(wallet.name)}>\n {wallet.name.charAt(0).toUpperCase()}\n </div>\n )}\n <span style={walletNameStyle}>{wallet.name}</span>\n </div>\n );\n}\n\nexport function WalletSelectModal({\n isOpen,\n networkType,\n onSelect,\n onClose,\n }: WalletSelectModalProps) {\n const [wallets, setWallets] = useState<WalletInfo[]>([]);\n const [hoveredWallet, setHoveredWallet] = useState<string | null>(null);\n const [mounted, setMounted] = useState(false);\n\n // Handle client-side mounting for Portal\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n\n // Initialize EVM discovery\n initEVMWalletDiscovery();\n\n // Get initial wallets\n const updateWallets = () => {\n setWallets(getWalletsForNetwork(networkType));\n };\n\n updateWallets();\n\n // Listen for EVM wallet changes\n const unsubscribe = onEVMWalletsChanged(updateWallets);\n\n // Re-fetch after a short delay to catch late announcements\n const timer = setTimeout(updateWallets, 500);\n\n return () => {\n unsubscribe();\n clearTimeout(timer);\n };\n }, [isOpen, networkType]);\n\n if (!isOpen || !mounted) return null;\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const networkName = getNetworkDisplayName(networkType);\n\n const modalContent = (\n <div style={overlayStyle} onClick={handleOverlayClick}>\n <div style={modalStyle}>\n <div style={headerStyle}>\n <h3 style={titleStyle}>Select Wallet</h3>\n <button style={closeButtonStyle} onClick={onClose}>\n ×\n </button>\n </div>\n\n <p style={subtitleStyle}>\n Connect a {networkName} wallet\n </p>\n\n {wallets.length > 0 ? (\n <div style={walletListStyle}>\n {wallets.map((wallet) => (\n <WalletItem\n key={wallet.id}\n wallet={wallet}\n isHovered={hoveredWallet === wallet.id}\n onSelect={() => onSelect(wallet)}\n onHover={(hovered) => setHoveredWallet(hovered ? wallet.id : null)}\n />\n ))}\n </div>\n ) : (\n <div style={emptyStateStyle}>\n <p style={emptyTitleStyle}>No wallets found</p>\n <p style={emptyDescStyle}>\n Please install a {networkName} wallet extension.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n\n // Use Portal to render outside parent container\n if (typeof document !== 'undefined') {\n return createPortal(modalContent, document.body);\n }\n\n return modalContent;\n}\n","/**\n * Inline styles for x402 React Components\n *\n * Modern, minimal, and flat design without gradients or fancy borders.\n * All styles are defined as JavaScript objects to ensure they're always bundled\n * with the components. This eliminates the need for users to import CSS files.\n */\n\nimport {CSSProperties} from 'react';\n\n// 检测是否支持暗色模式\nexport const isDarkMode = (): boolean => {\n if (typeof window === 'undefined') return false;\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n};\n\n// 现代简约配色 - 扁平化设计\nconst colors = {\n // Light mode\n light: {\n background: '#fafafa',\n cardBg: '#ffffff',\n text: '#0a0a0a',\n textSecondary: '#737373',\n primary: '#000000',\n primaryHover: '#262626',\n danger: '#ef4444',\n dangerHover: '#dc2626',\n success: '#10b981',\n successHover: '#059669',\n disabled: '#e5e5e5',\n disabledText: '#a3a3a3',\n errorBg: '#fef2f2',\n errorText: '#dc2626',\n },\n // Dark mode\n dark: {\n background: '#0a0a0a',\n cardBg: '#171717',\n text: '#fafafa',\n textSecondary: '#a3a3a3',\n primary: '#ffffff',\n primaryHover: '#e5e5e5',\n danger: '#f87171',\n dangerHover: '#ef4444',\n success: '#34d399',\n successHover: '#10b981',\n disabled: '#262626',\n disabledText: '#525252',\n errorBg: '#1c1917',\n errorText: '#f87171',\n },\n};\n\n// 获取当前主题颜色\nexport const getColors = () => {\n return isDarkMode() ? colors.dark : colors.light;\n};\n\n// 容器样式\nexport const containerStyle: CSSProperties = {\n width: '100%',\n maxWidth: '420px',\n margin: '0 auto',\n};\n\n// 钱包区块样式 - 极简无边框\nexport const getSectionStyle = (): CSSProperties => {\n const c = getColors();\n return {\n padding: '1.5rem',\n background: c.cardBg,\n borderRadius: '12px',\n };\n};\n\n// 标题样式 - 简洁\nexport const getTitleStyle = (): CSSProperties => {\n const c = getColors();\n return {\n margin: '0 0 1.25rem 0',\n fontSize: '1.125rem',\n fontWeight: 600,\n color: c.text,\n letterSpacing: '-0.01em',\n };\n};\n\n// 按钮容器样式\nexport const buttonsContainerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n};\n\n// 钱包选项样式\nexport const walletOptionStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n};\n\n// 基础按钮样式 - 扁平化\nconst baseButtonStyle: CSSProperties = {\n padding: '0.875rem 1.25rem',\n fontSize: '0.9375rem',\n fontWeight: 500,\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, opacity 0.15s ease',\n outline: 'none',\n letterSpacing: '-0.01em',\n};\n\n// 连接按钮样式 - 纯黑/纯白\nexport const getConnectButtonStyle = (isDisabled: boolean, isHovered: boolean): CSSProperties => {\n const c = getColors();\n const darkMode = isDarkMode();\n \n if (isDisabled) {\n return {\n ...baseButtonStyle,\n background: c.disabled,\n color: c.disabledText,\n cursor: 'not-allowed',\n border: darkMode ? '1px solid #404040' : '1px solid #d4d4d4',\n };\n }\n \n return {\n ...baseButtonStyle,\n background: isHovered ? c.primaryHover : c.primary,\n color: darkMode ? '#000000' : '#ffffff',\n cursor: 'pointer',\n };\n};\n\n// 断开连接按钮样式\nexport const getDisconnectButtonStyle = (isHovered: boolean): CSSProperties => {\n const c = getColors();\n return {\n ...baseButtonStyle,\n background: isHovered ? c.dangerHover : c.danger,\n color: '#ffffff',\n };\n};\n\n// 支付按钮样式\nexport const getPayButtonStyle = (isDisabled: boolean, isHovered: boolean): CSSProperties => {\n const c = getColors();\n return {\n ...baseButtonStyle,\n background: isDisabled ? c.disabled : (isHovered ? c.successHover : c.success),\n color: '#ffffff',\n width: '100%',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n opacity: isDisabled ? 0.5 : 1,\n };\n};\n\n// 安装链接样式 - 简洁\nexport const getInstallLinkStyle = (isHovered: boolean): CSSProperties => {\n const c = getColors();\n return {\n display: 'inline-block',\n padding: '0.5rem',\n fontSize: '0.8125rem',\n color: c.textSecondary,\n textDecoration: isHovered ? 'underline' : 'none',\n textAlign: 'center',\n fontWeight: 500,\n };\n};\n\n// 钱包地址容器样式\nexport const walletAddressStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n marginBottom: '1rem',\n};\n\n// 钱包标签样式\nexport const getLabelStyle = (): CSSProperties => {\n const c = getColors();\n return {\n fontSize: '0.8125rem',\n color: c.textSecondary,\n fontWeight: 500,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n };\n};\n\n// 地址样式\nexport const getAddressStyle = (): CSSProperties => {\n const c = getColors();\n return {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: c.text,\n letterSpacing: '-0.01em',\n };\n};\n\n// 钱包操作区域样式\nexport const walletActionsStyle: CSSProperties = {\n margin: '1rem 0',\n};\n\n// 提示文字样式\nexport const getHintStyle = (): CSSProperties => {\n const c = getColors();\n return {\n marginTop: '1rem',\n fontSize: '0.8125rem',\n color: c.textSecondary,\n textAlign: 'center',\n lineHeight: '1.5',\n };\n};\n\n// 错误信息样式 - 扁平化\nexport const getErrorStyle = (): CSSProperties => {\n const c = getColors();\n return {\n marginTop: '1rem',\n padding: '0.75rem 1rem',\n background: c.errorBg,\n color: c.errorText,\n borderRadius: '8px',\n fontSize: '0.8125rem',\n fontWeight: 500,\n };\n};\n\n","'use client';\n\nimport React, {useEffect, useState} from 'react';\nimport {Button, Card, Divider, message, Spin, Tooltip, Typography} from 'antd';\nimport {\n DisconnectOutlined,\n InfoCircleOutlined,\n LinkOutlined,\n LoadingOutlined,\n LockOutlined,\n SafetyOutlined\n} from '@ant-design/icons';\nimport {usePaymentInfo} from \"../hooks/usePaymentInfo\";\nimport {usePageNetwork} from \"../hooks/usePageNetwork\";\nimport {usePayment} from \"../hooks/usePayment\";\nimport {PROD_BACK_URL} from \"../../types/common\";\nimport {formatAddress, makePayment} from \"../../utils\";\nimport {WalletConnect} from './WalletConnect';\nimport {NetworkType} from \"../../types\";\nimport {getNetworkIcon} from \"../utils/CryptoIcons\";\n\nconst {Title, Text} = Typography;\n\ninterface HeaderInfo {\n title?: string; // 标题\n subtitle?: string; // 副标题/网站名\n tooltipText?: string; // 备注/提示文本\n}\n\nexport interface V402CheckoutProps {\n checkoutId: string;\n headerInfo?: HeaderInfo; // header 配置信息\n isModal?: boolean; // 是否在模态框中显示\n onPaymentComplete?: (response: any) => void; // 支付完成后的回调函数\n additionalParams?: Record<string, any>; // 额外的入参,会透传给checkout配置的回调\n expectedNetwork?: NetworkType; // 期望的网络类型\n}\n\n// 使用 antd 的 message 组件\nconst notify = {\n success: (title: string, msg: string) => {\n message.success(`${title}: ${msg}`);\n },\n error: (title: string, msg: string) => {\n message.error(`${title}: ${msg}`);\n },\n info: (title: string, msg: string) => {\n message.info(`${title}: ${msg}`);\n }\n};\n\nexport default function V402Checkout({\n checkoutId,\n headerInfo = {},\n isModal = false,\n onPaymentComplete,\n additionalParams = {},\n expectedNetwork,\n }: V402CheckoutProps) {\n // 解构 headerInfo,并设置默认值\n const {\n title = 'V402Pay - Make x402Pay Easier',\n subtitle = 'onvoyage.ai',\n tooltipText = 'V402Pay - Accept Crypto Payments Easier'\n } = headerInfo;\n // 默认prod\n const endpoint = PROD_BACK_URL;\n\n // 获取支付信息以确定期望的网络\n const {\n supportedNetworks,\n isLoading: fetchingPaymentInfo,\n paymentInfo\n } = usePaymentInfo(checkoutId, endpoint, additionalParams);\n\n // 确定实际期望的网络(优先使用 prop,否则使用第一个支持的网络)\n const targetNetwork = expectedNetwork || supportedNetworks[0];\n\n // 使用 usePageNetwork 自动管理网络切换\n const {address, networkType, disconnect, ensureNetwork} = usePageNetwork(\n targetNetwork,\n {autoSwitch: !!targetNetwork, switchOnMount: true}\n );\n\n const {isProcessing, setIsProcessing, result, setResult, error, setError} = usePayment();\n\n // Payment details state\n const [paymentDetails, setPaymentDetails] = useState<{\n amount: string;\n currency: string;\n network: string;\n } | null>(null);\n\n // Handle disconnect\n const handleDisconnect = () => {\n disconnect();\n setResult(null);\n setError(null);\n notify.info('Wallet Disconnected', 'Your wallet has been disconnected successfully.');\n };\n\n\n // Extract payment details from paymentInfo\n useEffect(() => {\n if (paymentInfo && paymentInfo.length > 0) {\n const firstPayment = paymentInfo[0];\n\n // 从后端获取金额\n const rawAmount = firstPayment.maxAmountRequired?.toString() || '0';\n // USDC 使用 6 位小数\n const decimals = 6;\n const humanReadableAmount = (Number(rawAmount) / Math.pow(10, decimals)).toFixed(2);\n\n // 从后端获取网络\n const network = firstPayment.network || 'Unknown';\n\n // 币种:后端没有提供币种名称字段,asset 是代币合约地址\n // 使用默认值 USDC,后续可由后端添加 currency 字段\n const currency = 'USDC';\n\n setPaymentDetails({\n amount: humanReadableAmount,\n currency: currency,\n network: network,\n });\n }\n }, [paymentInfo]);\n\n // 当支持的网络改变时,确保切换到正确的网络\n useEffect(() => {\n if (targetNetwork && !fetchingPaymentInfo && ensureNetwork) {\n ensureNetwork(targetNetwork).catch(err => {\n console.error('Failed to ensure network:', err);\n });\n }\n }, [targetNetwork, fetchingPaymentInfo]);\n\n // Handle payment\n const handlePayment = async () => {\n if (!networkType) {\n notify.error('Wallet Not Connected', 'Please connect your wallet first.');\n return;\n }\n\n // 清除之前的结果,开始新的支付流程\n setResult(null);\n setError(null);\n setIsProcessing(true);\n\n try {\n const response = await makePayment(networkType, checkoutId, endpoint, additionalParams);\n const data = await response.json();\n setResult(data);\n notify.success('Payment Successful!', 'Your payment has been processed successfully.');\n\n // 透传 response 数据给父组件\n if (onPaymentComplete) {\n onPaymentComplete(data);\n }\n } catch (err: any) {\n const errorMessage = err.message || 'Payment failed';\n setError(errorMessage);\n notify.error('Payment Failed', errorMessage);\n } finally {\n setIsProcessing(false);\n }\n };\n\n // Get network icon and color based on network name\n const getNetworkColor = (network: string) => {\n if (network.toLowerCase().includes('solana')) return '#14F195';\n if (network.toLowerCase().includes('evm') || network.toLowerCase().includes('base')) return '#0052FF';\n return '#8c8c8c';\n };\n\n const NetworkIcon = paymentDetails ? getNetworkIcon(paymentDetails.network) : null;\n const networkColor = paymentDetails ? getNetworkColor(paymentDetails.network) : '#8c8c8c';\n const loadingColor = '#8c8c8c'; // 灰色用于加载状态\n // Check if checkout ID is invalid (no payment info after loading)\n const hasInvalidCheckoutId = !fetchingPaymentInfo && (!paymentInfo || paymentInfo.length === 0);\n\n return (\n <div\n className={isModal ? \"bg-white\" : \"h-screen bg-white flex items-center justify-center p-4 overflow-hidden\"}>\n <div\n className=\"flex gap-4 items-center justify-center\"\n style={{\n maxWidth: (isProcessing || result || error) ? '1200px' : '480px',\n transition: 'max-width 0.4s ease-in-out',\n width: '100%',\n }}\n >\n {/* Payment Card */}\n <Card\n className=\"flex-shrink-0\"\n style={{\n border: isModal ? 'none' : '1px solid #e8e8e8',\n borderRadius: isModal ? '0' : '16px',\n boxShadow: isModal ? 'none' : '0 4px 24px rgba(0, 0, 0, 0.06)',\n maxHeight: isModal ? 'calc(100vh - 100px)' : 'calc(100vh - 32px)',\n overflow: 'auto',\n width: isModal ? '100%' : '480px',\n transition: 'all 0.4s ease-in-out',\n transform: (result || error) ? 'translateX(0)' : 'translateX(0)',\n }}\n styles={{body: {padding: isModal ? '0px' : '32px 24px'}}}\n >\n {/* Header */}\n <div className=\"flex items-center gap-3 mb-4\">\n <div\n className=\"w-12 h-12 rounded-xl flex items-center justify-center\"\n style={{\n background: hasInvalidCheckoutId ? '#ff4d4f' : (paymentDetails ? networkColor : loadingColor),\n transition: 'background 0.3s ease'\n }}\n >\n {hasInvalidCheckoutId ? (\n <span style={{fontSize: '20px', color: 'white', fontWeight: 'bold'}}>✗</span>\n ) : paymentDetails && NetworkIcon ? (\n <NetworkIcon width={24} height={24}/>\n ) : (\n <LoadingOutlined style={{fontSize: '20px', color: 'white'}} spin/>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Title level={4} style={{margin: 0, fontSize: '18px', fontWeight: 600}}>\n {title || 'Echo Payment OnVoyage'}\n </Title>\n {!hasInvalidCheckoutId && (\n <Tooltip\n title={tooltipText}\n placement=\"top\"\n >\n <InfoCircleOutlined\n style={{fontSize: '14px', color: '#8c8c8c', cursor: 'help'}}/>\n </Tooltip>\n )}\n </div>\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>{subtitle}</Text>\n </div>\n </div>\n\n {/* Payment Info */}\n <div className=\"text-center mb-5\">\n <div className=\"inline-flex items-center justify-center w-12 h-12 rounded-full bg-gray-50 mb-3\">\n <LockOutlined style={{fontSize: '20px', color: '#595959'}}/>\n </div>\n <Title level={3} style={{margin: '0 0 6px 0', fontSize: '20px', fontWeight: 600}}>\n Payment Required\n </Title>\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>\n Pay {paymentDetails ? `$${paymentDetails.amount} ${paymentDetails.currency}` : 'the required amount'} to\n access\n </Text>\n </div>\n\n {/* Error state - Invalid checkout ID */}\n {hasInvalidCheckoutId && (\n <div className=\"text-center py-6\">\n <div\n className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\"\n style={{\n background: 'linear-gradient(135deg, #ef4444 0%, #f87171 100%)',\n boxShadow: '0 4px 20px rgba(239, 68, 68, 0.3)'\n }}\n >\n <span style={{fontSize: '32px', color: 'white'}}>!</span>\n </div>\n <Title level={4}\n style={{margin: '0 0 12px 0', fontSize: '18px', fontWeight: 600, color: '#262626'}}>\n Invalid Checkout ID\n </Title>\n <Text style={{fontSize: '14px', color: '#8c8c8c', display: 'block', marginBottom: '16px'}}>\n The checkout ID you provided is invalid or has expired.\n </Text>\n <div\n style={{\n background: '#fef2f2',\n padding: '16px',\n borderRadius: '12px',\n border: '1px solid #fee2e2',\n marginTop: '16px'\n }}\n >\n <Text style={{\n fontSize: '13px',\n color: '#dc2626',\n lineHeight: '1.6',\n fontWeight: 500\n }}>\n Failed to load payment information. Please check your checkout ID.\n </Text>\n </div>\n </div>\n )}\n\n {/* Loading state */}\n {!hasInvalidCheckoutId && fetchingPaymentInfo && (\n <div className=\"text-center py-6\">\n <Text style={{color: '#8c8c8c'}}>Loading payment information...</Text>\n </div>\n )}\n\n {/* Wallet connection */}\n {!hasInvalidCheckoutId && !fetchingPaymentInfo && !address && (\n <div>\n <WalletConnect supportedNetworks={supportedNetworks}/>\n </div>\n )}\n\n {/* Connected wallet */}\n {!hasInvalidCheckoutId && address && (\n <>\n {/* Wallet Card */}\n <div\n className=\"bg-gray-50 rounded-lg p-3 mb-4\"\n style={{border: '1px solid #f0f0f0'}}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3 flex-1\">\n <div\n className=\"w-10 h-10 rounded-full bg-black flex items-center justify-center text-white text-sm font-semibold\">\n {address.slice(0, 2).toUpperCase()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Text style={{\n display: 'block',\n fontSize: '12px',\n color: '#8c8c8c',\n marginBottom: '2px'\n }}>\n Connected Wallet\n </Text>\n <Text\n style={{\n fontSize: '13px',\n fontWeight: 600,\n fontFamily: 'Monaco, monospace',\n }}\n >\n {formatAddress(address)}\n </Text>\n </div>\n </div>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<DisconnectOutlined/>}\n onClick={handleDisconnect}\n style={{color: '#ff4d4f'}}\n />\n </div>\n </div>\n\n {/* Payment Details */}\n {paymentDetails && (\n <div className=\"bg-gray-50 rounded-lg p-3 mb-4\" style={{border: '1px solid #f0f0f0'}}>\n <div className=\"flex justify-between items-center mb-2\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Payment Amount</Text>\n <Text style={{fontSize: '18px', fontWeight: 600}}>\n ${paymentDetails.amount}\n </Text>\n </div>\n <Divider style={{margin: '6px 0'}}/>\n <div className=\"flex justify-between items-center mb-2\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Currency</Text>\n <Text style={{fontSize: '14px', fontWeight: 500}}>\n {paymentDetails.currency}\n </Text>\n </div>\n <Divider style={{margin: '6px 0'}}/>\n <div className=\"flex justify-between items-center mb-2\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Network</Text>\n <Text style={{fontSize: '14px', fontWeight: 500}}>\n {paymentDetails.network}\n </Text>\n </div>\n <Divider style={{margin: '6px 0'}}/>\n <div className=\"flex justify-between items-start\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>Wallet Address</Text>\n <Text style={{\n fontSize: '11px',\n fontWeight: 500,\n fontFamily: 'Monaco, monospace',\n wordBreak: 'break-all',\n textAlign: 'right',\n maxWidth: '60%',\n lineHeight: 1.4\n }}>\n {address}\n </Text>\n </div>\n </div>\n )}\n\n {/* Security Notice */}\n <div\n className=\"flex items-center justify-center gap-2 mb-3 p-2 rounded-lg\"\n style={{background: '#f6ffed', border: '1px solid #d9f7be'}}\n >\n <SafetyOutlined style={{color: '#52c41a', fontSize: '13px'}}/>\n <Text style={{fontSize: '12px', color: '#52c41a', fontWeight: 500}}>\n Secure payment powered by v402pay\n </Text>\n </div>\n\n {/* Payment Button */}\n <Button\n type=\"primary\"\n size=\"large\"\n onClick={handlePayment}\n disabled={isProcessing || !paymentDetails}\n loading={isProcessing}\n block\n style={{\n height: '44px',\n fontSize: '14px',\n fontWeight: 600,\n borderRadius: '8px',\n ...(!isProcessing && paymentDetails && {\n background: '#1a1a1a',\n borderColor: '#1a1a1a',\n }),\n marginBottom: '10px',\n }}\n >\n {isProcessing\n ? 'Processing...'\n : !paymentDetails\n ? 'Loading...'\n : `Pay $${paymentDetails.amount} ${paymentDetails.currency}`}\n </Button>\n\n {/* Footer Link */}\n <div className=\"text-center\">\n <Text style={{fontSize: '13px', color: '#8c8c8c'}}>\n Don't have USDC?{' '}\n </Text>\n <a\n href=\"https://faucet.circle.com/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:text-blue-700 text-sm font-medium inline-flex items-center gap-1\"\n >\n Get it here <LinkOutlined style={{fontSize: '12px'}}/>\n </a>\n </div>\n\n {/* 模态框模式下的成功/失败反馈 */}\n {isModal && result && (\n <div className=\"mt-4 p-4 rounded-lg\"\n style={{background: '#f6ffed', border: '1px solid #b7eb8f'}}>\n <div className=\"text-center\">\n <span style={{fontSize: '20px'}}>✓</span>\n <Text style={{\n fontSize: '14px',\n color: '#52c41a',\n fontWeight: 600,\n marginLeft: '8px'\n }}>\n Payment Successful!\n </Text>\n </div>\n </div>\n )}\n\n {isModal && error && (\n <div className=\"mt-4 p-4 rounded-lg\"\n style={{background: '#fff2f0', border: '1px solid #ffccc7'}}>\n <div className=\"text-center mb-3\">\n <span style={{fontSize: '20px'}}>✗</span>\n <Text style={{\n fontSize: '14px',\n color: '#ff4d4f',\n fontWeight: 600,\n marginLeft: '8px',\n display: 'block',\n marginTop: '4px'\n }}>\n Payment Failed\n </Text>\n </div>\n <Text style={{\n fontSize: '13px',\n color: '#ff4d4f',\n display: 'block',\n textAlign: 'center'\n }}>\n {error}\n </Text>\n </div>\n )}\n </>\n )}\n\n </Card>\n\n {/* Result Card - 在模态框模式下隐藏 */}\n {!isModal && (isProcessing || result || error) && (\n <Card\n title={\n <div className=\"flex items-center gap-2\">\n {isProcessing && !result && !error ? (\n <>\n <LoadingOutlined style={{color: '#14b8a6', fontSize: '16px'}}/>\n <Text strong style={{fontSize: '16px', color: '#262626'}}>Processing\n Payment</Text>\n </>\n ) : result ? (\n <>\n <span style={{color: '#52c41a', fontSize: '18px'}}>✓</span>\n <Text strong style={{fontSize: '16px', color: '#262626'}}>Payment\n Successful</Text>\n </>\n ) : (\n <>\n <span style={{color: '#ff4d4f', fontSize: '18px'}}>✗</span>\n <Text strong style={{fontSize: '16px', color: '#262626'}}>Payment Failed</Text>\n </>\n )}\n </div>\n }\n extra={\n !isProcessing && (\n <Button\n type=\"text\"\n size=\"small\"\n onClick={() => {\n setResult(null);\n setError(null);\n }}\n >\n Close\n </Button>\n )\n }\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '16px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',\n maxHeight: 'calc(100vh - 32px)',\n width: '480px',\n animation: 'slideInRight 0.4s ease-out',\n }}\n styles={{\n body: {\n padding: '24px',\n maxHeight: 'calc(100vh - 120px)',\n overflow: 'auto',\n }\n }}\n >\n {/* Loading State */}\n {isProcessing && !result && !error && (\n <div className=\"text-center py-10\">\n <div className=\"relative inline-block\">\n <div\n className=\"absolute inset-0 rounded-full blur-xl opacity-40\"\n style={{\n background: 'linear-gradient(135deg, #14b8a6 0%, #06b6d4 100%)',\n animation: 'pulse 2s ease-in-out infinite'\n }}\n />\n <Spin\n indicator={<LoadingOutlined style={{fontSize: 56, color: '#14b8a6'}}/>}\n />\n </div>\n <div className=\"mt-6\">\n <Text strong style={{fontSize: '18px', color: '#262626', letterSpacing: '-0.02em'}}>\n Verifying Payment\n </Text>\n </div>\n <div className=\"mt-2 mb-6\">\n <Text style={{fontSize: '14px', color: '#8c8c8c', lineHeight: '1.6'}}>\n Please wait while we confirm your transaction\n </Text>\n </div>\n <div\n className=\"mt-4 p-4 rounded-xl\"\n style={{\n background: 'linear-gradient(135deg, #f0fdfa 0%, #ecfeff 100%)',\n border: '1px solid #ccfbf1'\n }}\n >\n <div className=\"flex items-center justify-center gap-2\">\n <span style={{fontSize: '16px'}}>⏱️</span>\n <Text style={{fontSize: '13px', color: '#0f766e', fontWeight: 500}}>\n This may take a few moments\n </Text>\n </div>\n </div>\n </div>\n )}\n\n {/* Success State */}\n {result && (\n <div>\n <div className=\"text-center mb-6\">\n <div\n className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\"\n style={{\n background: 'linear-gradient(135deg, #10b981 0%, #34d399 100%)',\n boxShadow: '0 4px 20px rgba(16, 185, 129, 0.3)'\n }}\n >\n <span style={{fontSize: '32px', color: 'white'}}>✓</span>\n </div>\n <div>\n <Text strong style={{\n fontSize: '20px',\n color: '#262626',\n display: 'block',\n marginBottom: '8px'\n }}>\n Payment Successful!\n </Text>\n <Text style={{fontSize: '14px', color: '#8c8c8c'}}>\n Your transaction has been confirmed\n </Text>\n </div>\n </div>\n <Divider style={{margin: '20px 0', borderColor: '#f0f0f0'}}>\n <Text style={{fontSize: '12px', color: '#8c8c8c', fontWeight: 500}}>RESPONSE\n DATA</Text>\n </Divider>\n <pre\n style={{\n background: '#fafafa',\n padding: '20px',\n borderRadius: '12px',\n fontSize: '12px',\n lineHeight: '1.8',\n overflow: 'auto',\n margin: 0,\n fontFamily: 'Monaco, Courier New, monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n border: '1px solid #e8e8e8',\n color: '#262626'\n }}\n >\n {JSON.stringify(result, null, 2)}\n </pre>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div>\n <div className=\"text-center mb-6\">\n <div\n className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\"\n style={{\n background: 'linear-gradient(135deg, #ef4444 0%, #f87171 100%)',\n boxShadow: '0 4px 20px rgba(239, 68, 68, 0.3)'\n }}\n >\n <span style={{fontSize: '32px', color: 'white'}}>✗</span>\n </div>\n <div>\n <Text strong style={{\n fontSize: '20px',\n color: '#262626',\n display: 'block',\n marginBottom: '8px'\n }}>\n Payment Failed\n </Text>\n <Text style={{fontSize: '14px', color: '#8c8c8c'}}>\n Something went wrong with your transaction\n </Text>\n </div>\n </div>\n <Divider style={{margin: '20px 0', borderColor: '#f0f0f0'}}>\n <Text style={{fontSize: '12px', color: '#8c8c8c', fontWeight: 500}}>ERROR\n DETAILS</Text>\n </Divider>\n <div\n style={{\n background: '#fef2f2',\n padding: '20px',\n borderRadius: '12px',\n border: '1px solid #fee2e2',\n }}\n >\n <Text style={{\n fontSize: '14px',\n color: '#dc2626',\n lineHeight: '1.6',\n fontWeight: 500\n }}>\n {error}\n </Text>\n </div>\n <div className=\"mt-4 text-center\">\n <Button\n size=\"large\"\n onClick={handlePayment}\n style={{\n height: '44px',\n fontSize: '14px',\n fontWeight: 600,\n borderRadius: '8px',\n background: '#1a1a1a',\n borderColor: '#1a1a1a',\n color: 'white',\n paddingLeft: '32px',\n paddingRight: '32px',\n }}\n >\n Try Again\n </Button>\n </div>\n </div>\n )}\n </Card>\n )}\n </div>\n\n <style dangerouslySetInnerHTML={{\n __html: `\n @keyframes slideInRight {\n from {\n opacity: 0;\n transform: translateX(100px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n \n @keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n opacity: 0.4;\n }\n 50% {\n transform: scale(1.1);\n opacity: 0.6;\n }\n }\n `\n }}/>\n </div>\n );\n}\n\n","/**\n * Crypto Icons Component\n * 加密货币图标集合\n */\n\nimport React from 'react';\n\ninterface IconProps {\n width?: number;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * USDC 图标\n * 来源: Streamline Cryptocurrency\n */\nexport const USDCIcon: React.FC<IconProps> = ({width = 16, height = 16, className, style}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 16 16\"\n width={width}\n height={height}\n className={className}\n style={style}\n >\n <desc>USDC Streamline Icon: https://streamlinehq.com</desc>\n <path\n fill=\"#3e73c4\"\n d=\"M8 16c4.4183 0 8 -3.5817 8 -8 0 -4.41828 -3.5817 -8 -8 -8C3.58172 0 0 3.58172 0 8c0 4.4183 3.58172 8 8 8Z\"\n strokeWidth=\"0.5\"\n />\n <path\n fill=\"#ffffff\"\n d=\"M10.01105 9.062c0 -1.062 -0.64 -1.426 -1.92 -1.578 -0.914 -0.1215 -1.0965 -0.364 -1.0965 -0.789 0 -0.425 0.305 -0.698 0.914 -0.698 0.5485 0 0.8535 0.182 1.0055 0.6375 0.0158 0.04405 0.04475 0.0822 0.08295 0.10925 0.03815 0.0271 0.0837 0.04185 0.13055 0.04225h0.4875c0.02815 0.00075 0.05615 -0.0042 0.08235 -0.0146 0.02615 -0.0104 0.04995 -0.02605 0.0699 -0.0459 0.01995 -0.01985 0.0357 -0.0436 0.0462 -0.0697 0.01055 -0.02615 0.01565 -0.05415 0.01505 -0.0823v-0.03c-0.0596 -0.32955 -0.22635 -0.6302 -0.47435 -0.85525 -0.248 -0.22505 -0.5634 -0.36185 -0.89715 -0.38925V4.571005c0 -0.1215 -0.0915 -0.2125 -0.2435 -0.243h-0.4575c-0.1215 0 -0.213 0.091 -0.2435 0.243V5.269c-0.9145 0.121 -1.493 0.728 -1.493 1.487 0 1.001 0.609 1.3955 1.889 1.5475 0.8535 0.1515 1.1275 0.334 1.1275 0.8195 0 0.485 -0.4265 0.819 -1.0055 0.819 -0.7925 0 -1.0665 -0.3335 -1.158 -0.789 -0.03 -0.121 -0.122 -0.182 -0.2135 -0.182h-0.518c-0.02815 -0.0007 -0.0561 0.00435 -0.0822 0.0148 -0.02615 0.0104 -0.04985 0.02605 -0.0698 0.0459 -0.0199 0.01985 -0.03555 0.04355 -0.04605 0.06965 -0.0105 0.0261 -0.0156 0.05405 -0.01495 0.08215v0.03c0.1215 0.759 0.6095 1.305 1.615 1.457v0.7285c0 0.121 0.0915 0.2125 0.2435 0.2425h0.4575c0.1215 0 0.213 -0.091 0.2435 -0.2425V10.67c0.9145 -0.1515 1.5235 -0.789 1.5235 -1.6085v0.0005Z\"\n strokeWidth=\"0.5\"\n />\n <path\n fill=\"#ffffff\"\n d=\"M6.446 12.2485c-2.37698 -0.85 -3.59598 -3.49 -2.71198 -5.8265 0.457 -1.275 1.46248 -2.2455 2.71198 -2.701 0.122 -0.0605 0.1825 -0.1515 0.1825 -0.3035v-0.425c0 -0.121 -0.0605 -0.212 -0.1825 -0.2425 -0.0305 0 -0.0915 0 -0.122 0.03 -0.68575 0.21416 -1.3224 0.561865 -1.87327 1.023085 -0.550855 0.461225 -1.00503 1.026855 -1.336385 1.664315 -0.331355 0.6375 -0.53334 1.3342 -0.59432 2.05005 -0.06098 0.71585 0.020245 1.4367 0.238995 2.12105 0.548 1.7 1.8585 3.005 3.56498 3.551 0.122 0.0605 0.244 0 0.274 -0.1215 0.0305 -0.03 0.0305 -0.061 0.0305 -0.1215v-0.425c0 -0.091 -0.091 -0.212 -0.1825 -0.273Zm3.23 -9.468c-0.122 -0.061 -0.244 0 -0.274 0.121 -0.0305 0.0305 -0.0305 0.061 -0.0305 0.1215v0.425c0 0.1215 0.091 0.2425 0.1825 0.3035 2.377 0.85 3.596 3.49 2.712 5.8265 -0.457 1.275 -1.4625 2.2455 -2.712 2.701 -0.122 0.0605 -0.1825 0.1515 -0.1825 0.3035v0.425c0 0.121 0.0605 0.212 0.1825 0.2425 0.0305 0 0.0915 0 0.122 -0.03 0.6858 -0.21415 1.32245 -0.56185 1.8733 -1.0231 0.55085 -0.4612 1.00505 -1.02685 1.3364 -1.6643 0.33135 -0.6375 0.53335 -1.3342 0.5943 -2.05005 0.061 -0.71585 -0.02025 -1.4367 -0.239 -2.12105 -0.548 -1.73 -1.889 -3.035 -3.565 -3.581Z\"\n strokeWidth=\"0.5\"\n />\n </svg>\n );\n};\n\n/**\n * Solana (SOL) 图标\n * 来源: Streamline Mingcute Fill\n */\nexport const SolanaIcon: React.FC<IconProps> = ({width = 16, height = 16, className, style}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n width={width}\n height={height}\n className={className}\n style={style}\n >\n <desc>Solana SOL Fill Streamline Icon: https://streamlinehq.com</desc>\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n d=\"M16 0v16H0V0h16ZM8.395333333333333 15.505333333333333l-0.007333333333333332 0.0013333333333333333 -0.047333333333333324 0.023333333333333334 -0.013333333333333332 0.0026666666666666666 -0.009333333333333332 -0.0026666666666666666 -0.047333333333333324 -0.023333333333333334c-0.006666666666666666 -0.0026666666666666666 -0.012666666666666666 -0.0006666666666666666 -0.016 0.003333333333333333l-0.0026666666666666666 0.006666666666666666 -0.011333333333333334 0.2853333333333333 0.003333333333333333 0.013333333333333332 0.006666666666666666 0.008666666666666666 0.06933333333333333 0.049333333333333326 0.009999999999999998 0.0026666666666666666 0.008 -0.0026666666666666666 0.06933333333333333 -0.049333333333333326 0.008 -0.010666666666666666 0.0026666666666666666 -0.011333333333333334 -0.011333333333333334 -0.2846666666666666c-0.0013333333333333333 -0.006666666666666666 -0.005999999999999999 -0.011333333333333334 -0.011333333333333334 -0.011999999999999999Zm0.17666666666666667 -0.07533333333333334 -0.008666666666666666 0.0013333333333333333 -0.12333333333333332 0.062 -0.006666666666666666 0.006666666666666666 -0.002 0.007333333333333332 0.011999999999999999 0.2866666666666666 0.003333333333333333 0.008 0.005333333333333333 0.004666666666666666 0.134 0.062c0.008 0.0026666666666666666 0.015333333333333332 0 0.019333333333333334 -0.005333333333333333l0.0026666666666666666 -0.009333333333333332 -0.02266666666666667 -0.4093333333333333c-0.002 -0.008 -0.006666666666666666 -0.013333333333333332 -0.013333333333333332 -0.014666666666666665Zm-0.4766666666666666 0.0013333333333333333a0.015333333333333332 0.015333333333333332 0 0 0 -0.018 0.004l-0.004 0.009333333333333332 -0.02266666666666667 0.4093333333333333c0 0.008 0.004666666666666666 0.013333333333333332 0.011333333333333334 0.016l0.009999999999999998 -0.0013333333333333333 0.134 -0.062 0.006666666666666666 -0.005333333333333333 0.0026666666666666666 -0.007333333333333332 0.011333333333333334 -0.2866666666666666 -0.002 -0.008 -0.006666666666666666 -0.006666666666666666 -0.12266666666666666 -0.06133333333333333Z\"\n strokeWidth=\"0.6667\"\n />\n <path\n fill=\"#000000\"\n d=\"M4.862 2.862A0.6666666666666666 0.6666666666666666 0 0 1 5.333333333333333 2.6666666666666665h8.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 0.47133333333333327 1.138l-2 2A0.6666666666666666 0.6666666666666666 0 0 1 12 6H3.333333333333333a0.6666666666666666 0.6666666666666666 0 0 1 -0.47133333333333327 -1.138l2 -2Zm-2.1166666666666663 4.156666666666666A0.6666666666666666 0.6666666666666666 0 0 1 3.333333333333333 6.666666666666666h8.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 0.5546666666666666 0.29666666666666663l1.3333333333333333 2A0.6666666666666666 0.6666666666666666 0 0 1 13.333333333333332 10H4.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 -0.5546666666666666 -0.29666666666666663l-1.3333333333333333 -2a0.6666666666666666 0.6666666666666666 0 0 1 -0.03333333333333333 -0.6846666666666665Zm1.4499999999999997 3.843333333333333A0.6666666666666666 0.6666666666666666 0 0 1 4.666666666666666 10.666666666666666h8.666666666666666a0.6666666666666666 0.6666666666666666 0 0 1 0.47133333333333327 1.138l-2 2A0.6666666666666666 0.6666666666666666 0 0 1 11.333333333333332 14H2.6666666666666665a0.6666666666666666 0.6666666666666666 0 0 1 -0.47133333333333327 -1.138l2 -2Z\"\n strokeWidth=\"0.6667\"\n />\n </g>\n </svg>\n );\n};\n\n/**\n * Base (Coinbase L2) 图标\n * 来源: Streamline Tabler\n */\nexport const BaseIcon: React.FC<IconProps> = ({width = 24, height = 24, className, style}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#000000\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n width={width}\n height={height}\n className={className}\n style={style}\n >\n <desc>Brand Coinbase Streamline Icon: https://streamlinehq.com</desc>\n <path\n d=\"M12.95 22c-4.503 0 -8.445 -3.04 -9.61 -7.413 -1.165 -4.373 0.737 -8.988 4.638 -11.25a9.906 9.906 0 0 1 12.008 1.598l-3.335 3.367a5.185 5.185 0 0 0 -7.354 0.013 5.252 5.252 0 0 0 0 7.393 5.185 5.185 0 0 0 7.354 0.013L20 19.088A9.887 9.887 0 0 1 12.95 22z\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\n/**\n * 获取网络对应的图标组件\n */\nexport const getNetworkIcon = (network: string): React.FC<IconProps> => {\n const networkLower = network.toLowerCase();\n\n if (networkLower.includes('solana')) {\n return SolanaIcon;\n }\n\n if (networkLower.includes('base')) {\n return BaseIcon;\n }\n\n // 默认返回 Base 图标(作为通用 EVM 图标)\n return BaseIcon;\n};\n\n/**\n * 获取货币对应的图标组件\n */\nexport const getCurrencyIcon = (currency: string): React.FC<IconProps> => {\n switch (currency.toUpperCase()) {\n case 'USDC':\n return USDCIcon;\n case 'SOL':\n return SolanaIcon;\n default:\n return USDCIcon;\n }\n};\n\n"],"mappings":"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","names":["z","clearAllWalletAddresses","ethers","ethers","message","useEffect","useState","useState","useEffect","React","useState","useEffect","useState","colors","useState","useEffect","useState","React","React","useEffect","useState","React","React","useState","useEffect","React"]}