@voyage_ai/v402-web-ts 0.3.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +215 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +215 -5
- package/dist/index.mjs.map +1 -1
- package/dist/react/chunk-WDPIFLXY.mjs +633 -0
- package/dist/react/chunk-WDPIFLXY.mjs.map +1 -0
- package/dist/react/index.d.mts +76 -4
- package/dist/react/index.d.ts +76 -4
- package/dist/react/index.js +1145 -708
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +816 -990
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/styles.css +1 -1
- package/dist/react/wallet-discovery-RN3DPV6V.mjs +35 -0
- package/dist/react/wallet-discovery-RN3DPV6V.mjs.map +1 -0
- package/package.json +4 -12
|
@@ -0,0 +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/utils/wallet-discovery.ts"],"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'; // 多网络钱包地址缓存\nconst CONNECTED_WALLET_IDS_KEY = 'connected_wallet_ids'; // 每个网络连接的钱包 ID\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/**\n * Get all connected wallet IDs\n */\nexport function getAllConnectedWalletIds(): Partial<Record<NetworkType, string>> {\n if (typeof window === 'undefined') {\n return {};\n }\n try {\n const cached = localStorage.getItem(CONNECTED_WALLET_IDS_KEY);\n return cached ? JSON.parse(cached) : {};\n } catch (error) {\n console.error('Failed to parse connected wallet IDs:', error);\n return {};\n }\n}\n\n/**\n * Save connected wallet ID for a specific network\n */\nexport function saveConnectedWalletId(networkType: NetworkType, walletId: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n const walletIds = getAllConnectedWalletIds();\n walletIds[networkType] = walletId;\n localStorage.setItem(CONNECTED_WALLET_IDS_KEY, JSON.stringify(walletIds));\n}\n\n/**\n * Get connected wallet ID for a specific network\n */\nexport function getConnectedWalletId(networkType: NetworkType): string | null {\n const walletIds = getAllConnectedWalletIds();\n return walletIds[networkType] || null;\n}\n\n/**\n * Remove connected wallet ID for a specific network\n */\nexport function removeConnectedWalletId(networkType: NetworkType): void {\n if (typeof window === 'undefined') {\n return;\n }\n const walletIds = getAllConnectedWalletIds();\n delete walletIds[networkType];\n localStorage.setItem(CONNECTED_WALLET_IDS_KEY, JSON.stringify(walletIds));\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';\nimport { getConnectedWalletId, saveConnectedWalletId, removeConnectedWalletId, getCachedWalletAddress, saveWalletAddress } from './wallet';\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 * Get a specific wallet by name\n * More reliable than getWalletById for EVM wallets since EIP-6963 UUIDs may change\n */\nexport function getWalletByName(name: string, networkType: NetworkType): WalletInfo | null {\n const wallets = getWalletsForNetwork(networkType);\n return wallets.find(w => w.name === name) || 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 ${wallet.name} is not available`);\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('Failed to get wallet address');\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 ${wallet.name} is not available`);\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('Unsupported network type');\n }\n \n // Save the connected wallet for payment signing\n currentConnectedWallet = wallet;\n \n // Save wallet name to localStorage for persistence across page refreshes\n // Using name instead of ID because EIP-6963 UUIDs may change across page loads\n saveConnectedWalletId(wallet.networkType, wallet.name);\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(networkType?: NetworkType): void {\n if (networkType) {\n // Clear wallet ID from localStorage\n removeConnectedWalletId(networkType);\n }\n currentConnectedWallet = null;\n}\n\n/**\n * Restore connected wallet from localStorage\n * Called when currentConnectedWallet is null but we have a saved wallet name\n */\nfunction restoreConnectedWallet(networkType: NetworkType): WalletInfo | null {\n const savedWalletName = getConnectedWalletId(networkType);\n if (!savedWalletName) {\n return null;\n }\n \n // Find the wallet by name (more reliable than ID for EIP-6963 wallets)\n const wallet = getWalletByName(savedWalletName, networkType);\n if (wallet) {\n // Restore to memory\n currentConnectedWallet = wallet;\n \n // For Solana wallets, check if provider's publicKey matches cached address\n if ((networkType === NetworkType.SOLANA || networkType === NetworkType.SVM) && wallet.provider) {\n const providerPublicKey = wallet.provider.publicKey?.toString();\n const cachedAddress = getCachedWalletAddress(networkType);\n \n if (providerPublicKey && cachedAddress && providerPublicKey !== cachedAddress) {\n // Update the cache with the correct address from provider\n saveWalletAddress(networkType, providerPublicKey);\n }\n }\n \n // For EVM wallets, address validation will happen in payment-helpers.ts before payment\n return wallet;\n }\n \n return 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 // Try to restore from localStorage (e.g., after page refresh)\n const restoredWallet = restoreConnectedWallet(networkType);\n if (restoredWallet) {\n return restoredWallet.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/**\n * Get the wallet provider for payment with address validation\n * Ensures the provider's current account matches the expected address\n * \n * @param networkType - Network type\n * @param expectedAddress - The address we expect to use for payment\n * @returns The provider if valid, null if mismatch\n */\nexport async function getValidatedWalletProvider(\n networkType: NetworkType, \n expectedAddress: string\n): Promise<{ provider: any; isValid: boolean; currentAddress?: string }> {\n const provider = getWalletProviderForPayment(networkType);\n if (!provider) {\n return { provider: null, isValid: false };\n }\n \n // For EVM, check if the current account matches\n if (networkType === NetworkType.EVM) {\n try {\n const accounts = await provider.request({ method: 'eth_accounts', params: [] });\n const currentAddress = accounts?.[0];\n const isValid = currentAddress?.toLowerCase() === expectedAddress?.toLowerCase();\n \n if (!isValid) {\n console.warn(`⚠️ Account mismatch: expected ${expectedAddress}, got ${currentAddress}`);\n }\n \n return { provider, isValid, currentAddress };\n } catch (error) {\n console.error('Failed to get current account:', error);\n return { provider, isValid: false };\n }\n }\n \n // For Solana, check if connected and address matches\n if (networkType === NetworkType.SOLANA || networkType === NetworkType.SVM) {\n if (provider.isConnected && provider.publicKey) {\n const currentAddress = provider.publicKey.toString();\n const isValid = currentAddress === expectedAddress;\n \n if (!isValid) {\n console.warn(`⚠️ Account mismatch: expected ${expectedAddress}, got ${currentAddress}`);\n }\n \n return { provider, isValid, currentAddress };\n }\n return { provider, isValid: false };\n }\n \n return { provider, isValid: true };\n}\n\n// Initialize on import (browser only)\nif (typeof window !== 'undefined') {\n initEVMWalletDiscovery();\n}\n\n"],"mappings":"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","names":["z"]}
|
package/dist/react/index.d.mts
CHANGED
|
@@ -222,6 +222,43 @@ interface UsePaymentInfoReturn {
|
|
|
222
222
|
*/
|
|
223
223
|
declare function usePaymentInfo(merchantId: string, endpoint?: string, additionalParams?: Record<string, any>): UsePaymentInfoReturn;
|
|
224
224
|
|
|
225
|
+
type ToastType = 'success' | 'error' | 'info';
|
|
226
|
+
interface ToastProps {
|
|
227
|
+
message: string;
|
|
228
|
+
type: ToastType;
|
|
229
|
+
onClose: () => void;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Toast 通知组件
|
|
233
|
+
* 使用 Portal 渲染到 document.body
|
|
234
|
+
*/
|
|
235
|
+
declare const Toast: React.FC<ToastProps>;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Toast 管理 Hook
|
|
239
|
+
* 提供显示 toast 通知的能力
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```tsx
|
|
243
|
+
* function MyComponent() {
|
|
244
|
+
* const { showToast, ToastContainer } = useToast();
|
|
245
|
+
*
|
|
246
|
+
* return (
|
|
247
|
+
* <div>
|
|
248
|
+
* <button onClick={() => showToast('Success!', 'success')}>
|
|
249
|
+
* Show Toast
|
|
250
|
+
* </button>
|
|
251
|
+
* <ToastContainer />
|
|
252
|
+
* </div>
|
|
253
|
+
* );
|
|
254
|
+
* }
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
declare const useToast: () => {
|
|
258
|
+
showToast: (message: string, type: ToastType) => void;
|
|
259
|
+
ToastContainer: () => React.JSX.Element;
|
|
260
|
+
};
|
|
261
|
+
|
|
225
262
|
/**
|
|
226
263
|
* WalletConnect Component
|
|
227
264
|
*
|
|
@@ -270,19 +307,54 @@ interface WalletSelectModalProps {
|
|
|
270
307
|
}
|
|
271
308
|
declare function WalletSelectModal({ isOpen, networkType, onSelect, onClose, }: WalletSelectModalProps): React.JSX.Element | null;
|
|
272
309
|
|
|
310
|
+
/**
|
|
311
|
+
* Checkout 组件通用类型定义
|
|
312
|
+
*/
|
|
273
313
|
interface HeaderInfo {
|
|
314
|
+
/** 商品/服务标题,显示在屏幕顶部 */
|
|
274
315
|
title?: string;
|
|
275
|
-
|
|
316
|
+
/** 品牌名称,传空字符串则不显示品牌区域 */
|
|
317
|
+
brandName?: string;
|
|
318
|
+
/** 发票标题,默认为 "V402 PAYMENT" */
|
|
319
|
+
receiptTitle?: string;
|
|
320
|
+
/** 悬浮在三个小点上显示的提示文本 */
|
|
276
321
|
tooltipText?: string;
|
|
277
322
|
}
|
|
278
|
-
|
|
323
|
+
/**
|
|
324
|
+
* V402CheckoutV2 组件 Props
|
|
325
|
+
*/
|
|
326
|
+
interface V402CheckoutV2Props {
|
|
327
|
+
/** Checkout ID */
|
|
279
328
|
checkoutId: string;
|
|
329
|
+
/** 头部信息配置 */
|
|
280
330
|
headerInfo?: HeaderInfo;
|
|
331
|
+
/** 主题颜色,默认为绿色 #84cc16 */
|
|
332
|
+
primaryColor?: string;
|
|
333
|
+
/** 是否作为 Modal 使用 */
|
|
281
334
|
isModal?: boolean;
|
|
335
|
+
/** 支付完成回调 */
|
|
282
336
|
onPaymentComplete?: (response: any) => void;
|
|
337
|
+
/** 额外参数,会透传给 checkout 配置的回调 */
|
|
283
338
|
additionalParams?: Record<string, any>;
|
|
339
|
+
/** 期望的网络类型 */
|
|
284
340
|
expectedNetwork?: NetworkType;
|
|
285
341
|
}
|
|
286
|
-
declare function V402Checkout({ checkoutId, headerInfo, isModal, onPaymentComplete, additionalParams, expectedNetwork, }: V402CheckoutProps): React.JSX.Element;
|
|
287
342
|
|
|
288
|
-
|
|
343
|
+
/**
|
|
344
|
+
* V402 Checkout V2 组件
|
|
345
|
+
* 全新设计的支付终端风格界面
|
|
346
|
+
*/
|
|
347
|
+
declare function V402CheckoutV2({ checkoutId, headerInfo, primaryColor, isModal, onPaymentComplete, additionalParams, expectedNetwork, }: V402CheckoutV2Props): React.JSX.Element;
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* CSS 动画定义
|
|
351
|
+
* 用于 checkout 组件的各种动画效果
|
|
352
|
+
*/
|
|
353
|
+
declare const checkoutAnimations = "\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n \n @keyframes receiptShake {\n 0%, 100% { transform: rotate(-0.3deg); }\n 50% { transform: rotate(0.3deg); }\n }\n \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% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n";
|
|
354
|
+
/**
|
|
355
|
+
* 动画样式组件
|
|
356
|
+
* 用于注入 CSS 动画到页面
|
|
357
|
+
*/
|
|
358
|
+
declare const AnimationStyles: () => React.JSX.Element;
|
|
359
|
+
|
|
360
|
+
export { AnimationStyles, Toast, type ToastProps, type ToastType, type UsePageNetworkOptions, type UsePaymentInfoReturn, type UsePaymentReturn, type UseWalletReturn, V402CheckoutV2, type V402CheckoutV2Props, WalletConnect, type WalletConnectProps, WalletSelectModal, type WalletSelectModalProps, checkoutAnimations, usePageNetwork, usePayment, usePaymentInfo, useToast, useWallet };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -222,6 +222,43 @@ interface UsePaymentInfoReturn {
|
|
|
222
222
|
*/
|
|
223
223
|
declare function usePaymentInfo(merchantId: string, endpoint?: string, additionalParams?: Record<string, any>): UsePaymentInfoReturn;
|
|
224
224
|
|
|
225
|
+
type ToastType = 'success' | 'error' | 'info';
|
|
226
|
+
interface ToastProps {
|
|
227
|
+
message: string;
|
|
228
|
+
type: ToastType;
|
|
229
|
+
onClose: () => void;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Toast 通知组件
|
|
233
|
+
* 使用 Portal 渲染到 document.body
|
|
234
|
+
*/
|
|
235
|
+
declare const Toast: React.FC<ToastProps>;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Toast 管理 Hook
|
|
239
|
+
* 提供显示 toast 通知的能力
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```tsx
|
|
243
|
+
* function MyComponent() {
|
|
244
|
+
* const { showToast, ToastContainer } = useToast();
|
|
245
|
+
*
|
|
246
|
+
* return (
|
|
247
|
+
* <div>
|
|
248
|
+
* <button onClick={() => showToast('Success!', 'success')}>
|
|
249
|
+
* Show Toast
|
|
250
|
+
* </button>
|
|
251
|
+
* <ToastContainer />
|
|
252
|
+
* </div>
|
|
253
|
+
* );
|
|
254
|
+
* }
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
declare const useToast: () => {
|
|
258
|
+
showToast: (message: string, type: ToastType) => void;
|
|
259
|
+
ToastContainer: () => React.JSX.Element;
|
|
260
|
+
};
|
|
261
|
+
|
|
225
262
|
/**
|
|
226
263
|
* WalletConnect Component
|
|
227
264
|
*
|
|
@@ -270,19 +307,54 @@ interface WalletSelectModalProps {
|
|
|
270
307
|
}
|
|
271
308
|
declare function WalletSelectModal({ isOpen, networkType, onSelect, onClose, }: WalletSelectModalProps): React.JSX.Element | null;
|
|
272
309
|
|
|
310
|
+
/**
|
|
311
|
+
* Checkout 组件通用类型定义
|
|
312
|
+
*/
|
|
273
313
|
interface HeaderInfo {
|
|
314
|
+
/** 商品/服务标题,显示在屏幕顶部 */
|
|
274
315
|
title?: string;
|
|
275
|
-
|
|
316
|
+
/** 品牌名称,传空字符串则不显示品牌区域 */
|
|
317
|
+
brandName?: string;
|
|
318
|
+
/** 发票标题,默认为 "V402 PAYMENT" */
|
|
319
|
+
receiptTitle?: string;
|
|
320
|
+
/** 悬浮在三个小点上显示的提示文本 */
|
|
276
321
|
tooltipText?: string;
|
|
277
322
|
}
|
|
278
|
-
|
|
323
|
+
/**
|
|
324
|
+
* V402CheckoutV2 组件 Props
|
|
325
|
+
*/
|
|
326
|
+
interface V402CheckoutV2Props {
|
|
327
|
+
/** Checkout ID */
|
|
279
328
|
checkoutId: string;
|
|
329
|
+
/** 头部信息配置 */
|
|
280
330
|
headerInfo?: HeaderInfo;
|
|
331
|
+
/** 主题颜色,默认为绿色 #84cc16 */
|
|
332
|
+
primaryColor?: string;
|
|
333
|
+
/** 是否作为 Modal 使用 */
|
|
281
334
|
isModal?: boolean;
|
|
335
|
+
/** 支付完成回调 */
|
|
282
336
|
onPaymentComplete?: (response: any) => void;
|
|
337
|
+
/** 额外参数,会透传给 checkout 配置的回调 */
|
|
283
338
|
additionalParams?: Record<string, any>;
|
|
339
|
+
/** 期望的网络类型 */
|
|
284
340
|
expectedNetwork?: NetworkType;
|
|
285
341
|
}
|
|
286
|
-
declare function V402Checkout({ checkoutId, headerInfo, isModal, onPaymentComplete, additionalParams, expectedNetwork, }: V402CheckoutProps): React.JSX.Element;
|
|
287
342
|
|
|
288
|
-
|
|
343
|
+
/**
|
|
344
|
+
* V402 Checkout V2 组件
|
|
345
|
+
* 全新设计的支付终端风格界面
|
|
346
|
+
*/
|
|
347
|
+
declare function V402CheckoutV2({ checkoutId, headerInfo, primaryColor, isModal, onPaymentComplete, additionalParams, expectedNetwork, }: V402CheckoutV2Props): React.JSX.Element;
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* CSS 动画定义
|
|
351
|
+
* 用于 checkout 组件的各种动画效果
|
|
352
|
+
*/
|
|
353
|
+
declare const checkoutAnimations = "\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n \n @keyframes receiptShake {\n 0%, 100% { transform: rotate(-0.3deg); }\n 50% { transform: rotate(0.3deg); }\n }\n \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% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n";
|
|
354
|
+
/**
|
|
355
|
+
* 动画样式组件
|
|
356
|
+
* 用于注入 CSS 动画到页面
|
|
357
|
+
*/
|
|
358
|
+
declare const AnimationStyles: () => React.JSX.Element;
|
|
359
|
+
|
|
360
|
+
export { AnimationStyles, Toast, type ToastProps, type ToastType, type UsePageNetworkOptions, type UsePaymentInfoReturn, type UsePaymentReturn, type UseWalletReturn, V402CheckoutV2, type V402CheckoutV2Props, WalletConnect, type WalletConnectProps, WalletSelectModal, type WalletSelectModalProps, checkoutAnimations, usePageNetwork, usePayment, usePaymentInfo, useToast, useWallet };
|