x402-mantle-sdk 0.1.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/react.ts","../../src/client/modal-react.tsx","../../src/client/constants.ts","../../src/client/wallet.ts","../../src/client/payment.ts"],"sourcesContent":["/**\n * React components for x402 client\n *\n * @example\n * ```tsx\n * import { PaymentModal } from '@x402-devkit/sdk/client/react'\n *\n * <PaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={handleComplete}\n * onCancel={handleCancel}\n * />\n * ```\n */\n\nexport { PaymentModal } from './modal-react'\n\n// Re-export types that React components need\nexport type { PaymentRequest, PaymentResponse } from './types'\n","/**\n * React Payment Modal Component\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport type { PaymentRequest, PaymentResponse } from './types'\nimport { connectWallet, detectWalletProvider } from './wallet'\nimport { processPayment } from './payment'\n\ninterface PaymentModalProps {\n request: PaymentRequest\n onComplete: (payment: PaymentResponse) => void\n onCancel: () => void\n isOpen: boolean\n}\n\ntype Step = 'connect' | 'confirm' | 'processing'\n\n/**\n * Format address for display\n */\nfunction formatAddress(address: string): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Payment Modal Component\n *\n * @example\n * ```tsx\n * <PaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={(payment) => console.log('Paid:', payment.transactionHash)}\n * onCancel={() => setIsOpen(false)}\n * />\n * ```\n */\nexport function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps) {\n const [walletAddress, setWalletAddress] = useState<string | null>(null)\n const [isConnecting, setIsConnecting] = useState(false)\n const [isProcessing, setIsProcessing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [step, setStep] = useState<Step>('connect')\n\n const checkWalletConnection = useCallback(async () => {\n const wallet = detectWalletProvider()\n if (wallet) {\n try {\n const account = await wallet.getAccount()\n if (account) {\n setWalletAddress(account)\n setStep('confirm')\n }\n } catch {\n // Not connected\n }\n }\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n checkWalletConnection()\n } else {\n // Reset state when modal closes\n setStep('connect')\n setError(null)\n setWalletAddress(null)\n }\n }, [isOpen, checkWalletConnection])\n\n const handleConnect = async () => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('No wallet found. Please install MetaMask.')\n }\n\n const address = await connectWallet(wallet)\n setWalletAddress(address)\n setStep('confirm')\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to connect wallet')\n } finally {\n setIsConnecting(false)\n }\n }\n\n const handlePay = async () => {\n setIsProcessing(true)\n setError(null)\n setStep('processing')\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('Wallet not connected')\n }\n\n const payment = await processPayment(request, wallet)\n onComplete(payment)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Payment failed')\n setStep('confirm')\n } finally {\n setIsProcessing(false)\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n }}\n onClick={(e) => e.target === e.currentTarget && onCancel()}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '28rem',\n borderRadius: '0.75rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(24, 24, 27, 0.95)',\n padding: '1.5rem',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.3)',\n backdropFilter: 'blur(16px)',\n color: '#fafafa',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '1.5rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <div\n style={{\n width: '2rem',\n height: '2rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '0.5rem',\n background: 'rgba(255, 255, 255, 0.1)',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n fontWeight: 'bold',\n }}\n >\n x402\n </div>\n <h2 style={{ margin: 0, fontSize: '1.25rem', fontWeight: 300 }}>Payment Required</h2>\n </div>\n <button\n onClick={onCancel}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.6)',\n lineHeight: 1,\n }}\n >\n &times;\n </button>\n </div>\n\n {/* Payment Details */}\n <div\n style={{\n marginBottom: '1.5rem',\n padding: '1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '0.75rem',\n }}\n >\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Amount\n </span>\n <span style={{ fontSize: '1.125rem', fontWeight: 500 }}>\n {request.amount} {request.token}\n </span>\n </div>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '0.75rem',\n }}\n >\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Network\n </span>\n <span style={{ fontSize: '0.875rem' }}>{request.network}</span>\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Recipient\n </span>\n <span style={{ fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {formatAddress(request.recipient)}\n </span>\n </div>\n </div>\n\n {/* Error Message */}\n {error && (\n <div\n style={{\n marginBottom: '1rem',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(239, 68, 68, 0.5)',\n background: 'rgba(239, 68, 68, 0.1)',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(239, 68, 68, 0.9)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Connect Step */}\n {step === 'connect' && (\n <button\n onClick={handleConnect}\n disabled={isConnecting}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.05)',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: isConnecting ? 'not-allowed' : 'pointer',\n opacity: isConnecting ? 0.7 : 1,\n color: '#fafafa',\n }}\n >\n {isConnecting ? 'Connecting...' : 'Connect Wallet'}\n </button>\n )}\n\n {/* Confirm Step */}\n {step === 'confirm' && walletAddress && (\n <>\n <div\n style={{\n marginBottom: '1rem',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n <p\n style={{\n margin: '0 0 0.25rem 0',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Connected Wallet\n </p>\n <p style={{ margin: 0, fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {formatAddress(walletAddress)}\n </p>\n </div>\n <div style={{ display: 'flex', gap: '0.75rem' }}>\n <button\n onClick={onCancel}\n style={{\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n fontSize: '0.875rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.8)',\n }}\n >\n Cancel\n </button>\n <button\n onClick={handlePay}\n disabled={isProcessing}\n style={{\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.1)',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n opacity: isProcessing ? 0.7 : 1,\n color: '#fafafa',\n }}\n >\n Pay {request.amount} {request.token}\n </button>\n </div>\n </>\n )}\n\n {/* Processing Step */}\n {step === 'processing' && (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem 0',\n }}\n >\n <div\n style={{\n width: '2rem',\n height: '2rem',\n marginBottom: '1rem',\n border: '2px solid rgba(255, 255, 255, 0.2)',\n borderTopColor: '#fafafa',\n borderRadius: '50%',\n animation: 'x402-spin 1s linear infinite',\n }}\n />\n <p style={{ margin: 0, fontSize: '0.875rem', color: 'rgba(250, 250, 250, 0.6)' }}>\n Processing payment...\n </p>\n <p\n style={{\n margin: '0.5rem 0 0 0',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.4)',\n }}\n >\n Please confirm the transaction in your wallet\n </p>\n <style>{`\n @keyframes x402-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Constants and Configuration\n *\n * Centralized configuration for networks and tokens\n * Supports both preset networks (mainnet/testnet) and custom configurations\n */\n\n/** Supported network identifiers */\nexport type NetworkId = 'mantle' | 'mantle-sepolia' | 'mantle-testnet'\n\n/** Network environment */\nexport type NetworkEnvironment = 'mainnet' | 'testnet'\n\n/** Network configuration */\nexport interface NetworkConfig {\n chainId: number\n rpcUrl: string\n name: string\n environment: NetworkEnvironment\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n blockExplorer: string\n}\n\n/** Token configuration */\nexport interface TokenConfig {\n address: string\n decimals: number\n symbol: string\n}\n\n/** Custom network configuration (user-provided) */\nexport interface CustomNetworkConfig {\n chainId: number\n rpcUrl: string\n name?: string\n environment?: NetworkEnvironment\n blockExplorer?: string\n}\n\n/** Custom token configuration (user-provided) */\nexport interface CustomTokenConfig {\n [symbol: string]: {\n address: string\n decimals: number\n }\n}\n\n/** Network configurations */\nexport const NETWORKS: Record<NetworkId, NetworkConfig> = {\n mantle: {\n chainId: 5000,\n rpcUrl: 'https://rpc.mantle.xyz',\n name: 'Mantle',\n environment: 'mainnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.mantle.xyz',\n },\n 'mantle-sepolia': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Sepolia',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n 'mantle-testnet': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Testnet',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n} as const\n\n/** Token addresses by network */\nexport const TOKENS: Record<NetworkId, Record<string, TokenConfig>> = {\n mantle: {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE',\n decimals: 6,\n symbol: 'USDT',\n },\n mETH: {\n address: '0xcDA86A272531e8640cD7F1a92c01839911B90bb0',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-sepolia': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-testnet': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n} as const\n\n/** Treasury contract address (collects 0.5% platform fee) */\nexport const TREASURY_ADDRESS = '0xB27705342ACE73736AE490540Ea031cc06C3eF49'\n\n/** Platform fee in basis points (50 = 0.5%) */\nexport const PLATFORM_FEE_BPS = 50n\nexport const BPS_DENOMINATOR = 10000n\n\n/** Treasury admin address */\nexport const TREASURY_ADMIN = '0xDacCF30F8BB2aEb8D76E68E03033629809ed08E1'\n\n/** Custom network registry (populated at runtime) */\nconst customNetworks: Map<string, NetworkConfig> = new Map()\n\n/** Custom token registry (populated at runtime) */\nconst customTokens: Map<string, Map<string, TokenConfig>> = new Map()\n\n/**\n * Register a custom network configuration\n *\n * @example\n * ```typescript\n * registerCustomNetwork('my-network', {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com',\n * name: 'My Custom Network',\n * environment: 'testnet'\n * })\n * ```\n */\nexport function registerCustomNetwork(networkId: string, config: CustomNetworkConfig): void {\n customNetworks.set(networkId.toLowerCase(), {\n chainId: config.chainId,\n rpcUrl: config.rpcUrl,\n name: config.name || networkId,\n environment: config.environment || 'testnet',\n nativeCurrency: { name: 'Native', symbol: 'ETH', decimals: 18 },\n blockExplorer: config.blockExplorer || '',\n })\n}\n\n/**\n * Register custom tokens for a network\n *\n * @example\n * ```typescript\n * registerCustomTokens('mantle', {\n * 'MYTOKEN': { address: '0x...', decimals: 18 }\n * })\n * ```\n */\nexport function registerCustomTokens(networkId: string, tokens: CustomTokenConfig): void {\n const networkKey = networkId.toLowerCase()\n if (!customTokens.has(networkKey)) {\n customTokens.set(networkKey, new Map())\n }\n const tokenMap = customTokens.get(networkKey)!\n for (const [symbol, config] of Object.entries(tokens)) {\n tokenMap.set(symbol.toUpperCase(), {\n address: config.address,\n decimals: config.decimals,\n symbol: symbol.toUpperCase(),\n })\n }\n}\n\n/**\n * Check if network is testnet\n */\nexport function isTestnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'testnet'\n}\n\n/**\n * Check if network is mainnet\n */\nexport function isMainnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'mainnet'\n}\n\n/**\n * Get network configuration (supports preset and custom networks)\n */\nexport function getNetworkConfig(network: string): NetworkConfig {\n const networkKey = network.toLowerCase()\n\n // Check custom networks first\n const custom = customNetworks.get(networkKey)\n if (custom) {\n return custom\n }\n\n // Check preset networks\n const preset = NETWORKS[networkKey as NetworkId]\n if (preset) {\n return preset\n }\n\n // Default to mainnet\n return NETWORKS.mantle\n}\n\n/**\n * Get token configuration (supports preset and custom tokens)\n */\nexport function getTokenConfig(token: string, network: string): TokenConfig | null {\n const networkKey = network.toLowerCase()\n const tokenKey = token.toUpperCase()\n\n // Native MNT doesn't have a token config\n if (tokenKey === 'MNT') {\n return null\n }\n\n // Check custom tokens first\n const customMap = customTokens.get(networkKey)\n if (customMap?.has(tokenKey)) {\n return customMap.get(tokenKey)!\n }\n\n // Check preset tokens\n return TOKENS[networkKey as NetworkId]?.[tokenKey] || null\n}\n\n/**\n * Get chain ID for network\n */\nexport function getChainId(network: string): number {\n return getNetworkConfig(network).chainId\n}\n\n/**\n * Get all available networks (preset + custom)\n */\nexport function getAvailableNetworks(): string[] {\n const preset = Object.keys(NETWORKS)\n const custom = Array.from(customNetworks.keys())\n return [...new Set([...preset, ...custom])]\n}\n\n/**\n * Get networks by environment\n */\nexport function getNetworksByEnvironment(env: NetworkEnvironment): string[] {\n return getAvailableNetworks().filter((network) => {\n const config = getNetworkConfig(network)\n return config.environment === env\n })\n}\n","/**\n * Wallet Connection & Management\n *\n * Handles web3 wallet connections (MetaMask, WalletConnect, etc.)\n * Supports network switching and custom network addition\n */\n\nimport type {\n TransactionRequest,\n WalletProvider,\n EIP1193Provider,\n WindowWithEthereum,\n AddEthereumChainParameter,\n} from './types'\nimport { getNetworkConfig, getChainId as getChainIdForNetwork } from './constants'\n\n/**\n * Get ethereum provider from window\n */\nfunction getEthereumProvider(): EIP1193Provider | null {\n if (typeof window === 'undefined') {\n return null\n }\n return (window as WindowWithEthereum).ethereum || null\n}\n\n/**\n * MetaMask/EIP-1193 wallet provider\n */\nexport class MetaMaskProvider implements WalletProvider {\n private ethereum: EIP1193Provider | null\n\n constructor() {\n this.ethereum = getEthereumProvider()\n }\n\n isAvailable(): boolean {\n return this.ethereum !== null && this.ethereum.isMetaMask === true\n }\n\n async connect(): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const accounts = (await this.ethereum.request({\n method: 'eth_requestAccounts',\n })) as string[]\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts found')\n }\n\n return accounts[0]\n }\n\n async getAccount(): Promise<string | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const accounts = (await this.ethereum.request({\n method: 'eth_accounts',\n })) as string[]\n\n return accounts && accounts.length > 0 ? accounts[0] : null\n } catch {\n return null\n }\n }\n\n async getChainId(): Promise<number | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const chainIdHex = (await this.ethereum.request({\n method: 'eth_chainId',\n })) as string\n\n return parseInt(chainIdHex, 16)\n } catch {\n return null\n }\n }\n\n async switchNetwork(chainId: number): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const chainIdHex = `0x${chainId.toString(16)}`\n\n try {\n await this.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainIdHex }],\n })\n } catch (error) {\n const switchError = error as { code?: number }\n if (switchError.code === 4902) {\n // Chain not added, throw specific error\n throw new Error(`Network with chainId ${chainId} not found. Use addNetwork() first.`)\n }\n throw error\n }\n }\n\n async addNetwork(params: AddEthereumChainParameter): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n await this.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [params],\n })\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const txHash = (await this.ethereum.request({\n method: 'eth_sendTransaction',\n params: [tx],\n })) as string\n\n return txHash\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const account = await this.getAccount()\n if (!account) {\n throw new Error('No account connected')\n }\n\n const signature = (await this.ethereum.request({\n method: 'personal_sign',\n params: [message, account],\n })) as string\n\n return signature\n }\n}\n\n/**\n * Auto-detect wallet provider\n */\nexport function detectWalletProvider(): WalletProvider | null {\n const metaMask = new MetaMaskProvider()\n if (metaMask.isAvailable()) {\n return metaMask\n }\n\n // Add more providers here (WalletConnect, Coinbase Wallet, etc.)\n return null\n}\n\n/**\n * Connect wallet (auto-detect or use provided)\n */\nexport async function connectWallet(provider?: WalletProvider): Promise<string> {\n const wallet = provider || detectWalletProvider()\n\n if (!wallet) {\n throw new Error(\n 'No wallet provider found. Please install MetaMask or another compatible wallet.'\n )\n }\n\n return wallet.connect()\n}\n\n/**\n * Ensure wallet is on the correct network\n *\n * @param wallet - Wallet provider\n * @param network - Network identifier (e.g., 'mantle', 'mantle-sepolia')\n * @param autoAdd - Auto-add network if not found (default: true)\n */\nexport async function ensureNetwork(\n wallet: WalletProvider,\n network: string,\n autoAdd = true\n): Promise<void> {\n const config = getNetworkConfig(network)\n const targetChainId = config.chainId\n const currentChainId = await wallet.getChainId()\n\n if (currentChainId === targetChainId) {\n return // Already on correct network\n }\n\n try {\n await wallet.switchNetwork(targetChainId)\n } catch (error) {\n const switchError = error as { message?: string }\n\n // If network not found and autoAdd is enabled, add it\n if (autoAdd && switchError.message?.includes('not found')) {\n await wallet.addNetwork({\n chainId: `0x${targetChainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n })\n } else {\n throw error\n }\n }\n}\n\n/**\n * Get network config for adding to wallet\n */\nexport function getAddNetworkParams(network: string): AddEthereumChainParameter {\n const config = getNetworkConfig(network)\n return {\n chainId: `0x${config.chainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n }\n}\n","/**\n * Payment Processing\n *\n * Handles direct blockchain payments with automatic fee splitting\n * Automatically splits 0.5% platform fee to Treasury\n */\n\nimport type { PaymentRequest, PaymentResponse, WalletProvider, TransactionRequest } from './types'\nimport {\n getTokenConfig,\n TREASURY_ADDRESS,\n PLATFORM_FEE_BPS,\n BPS_DENOMINATOR,\n} from './constants'\n\n/** ERC20 transfer function signature */\nconst ERC20_TRANSFER_SIG = '0xa9059cbb'\n\n/**\n * Convert amount to Wei\n */\nfunction amountToWei(amount: string, decimals: number = 18): bigint {\n const parts = amount.split('.')\n const whole = parts[0] || '0'\n const fraction = (parts[1] || '').padEnd(decimals, '0').slice(0, decimals)\n\n return BigInt(whole) * 10n ** BigInt(decimals) + BigInt(fraction)\n}\n\n/**\n * Calculate fee split\n */\nfunction calculateSplit(amount: bigint): { merchantAmount: bigint; feeAmount: bigint } {\n const feeAmount = (amount * PLATFORM_FEE_BPS) / BPS_DENOMINATOR\n const merchantAmount = amount - feeAmount\n return { merchantAmount, feeAmount }\n}\n\n/**\n * Encode ERC20 transfer call data\n */\nfunction encodeERC20Transfer(to: string, amount: bigint): string {\n const toHex = to.slice(2).toLowerCase().padStart(64, '0')\n const amountHex = amount.toString(16).padStart(64, '0')\n return ERC20_TRANSFER_SIG + toHex + amountHex\n}\n\n/**\n * Process payment for an x402 request\n *\n * Automatically splits payment:\n * - 99.5% to merchant\n * - 0.5% to Treasury\n *\n * @param request - Payment request from HTTP 402 response\n * @param wallet - Wallet provider to use for transaction\n * @returns Payment response with transaction hash\n */\nexport async function processPayment(\n request: PaymentRequest,\n wallet: WalletProvider\n): Promise<PaymentResponse> {\n // Get token configuration\n const tokenConfig = getTokenConfig(request.token, request.network)\n const decimals = tokenConfig?.decimals ?? 18\n\n // Calculate amounts\n const totalAmount = amountToWei(request.amount, decimals)\n const { merchantAmount, feeAmount } = calculateSplit(totalAmount)\n\n let txHash: string\n\n if (tokenConfig) {\n // ERC20 token transfer - send full amount to merchant\n // (Treasury fee handled separately for ERC20)\n const transferData = encodeERC20Transfer(request.recipient, totalAmount)\n\n const tx: TransactionRequest = {\n to: tokenConfig.address,\n data: transferData,\n }\n\n txHash = await wallet.sendTransaction(tx)\n } else {\n // Native MNT transfer - split between merchant and treasury\n\n // 1. Send to merchant (99.5%)\n const merchantTx: TransactionRequest = {\n to: request.recipient,\n value: `0x${merchantAmount.toString(16)}`,\n }\n txHash = await wallet.sendTransaction(merchantTx)\n\n // 2. Send fee to Treasury (0.5%)\n if (feeAmount > 0n) {\n const feeTx: TransactionRequest = {\n to: TREASURY_ADDRESS,\n value: `0x${feeAmount.toString(16)}`,\n }\n await wallet.sendTransaction(feeTx)\n }\n }\n\n return {\n transactionHash: txHash,\n timestamp: new Date().toISOString(),\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/client/react.ts","../../src/client/modal-react.tsx","../../src/client/constants.ts","../../src/client/wallet.ts","../../src/client/payment.ts","../../src/client/payment-modal-enhanced.tsx"],"sourcesContent":["/**\n * React components for x402 client\n *\n * @example\n * ```tsx\n * import { PaymentModal, EnhancedPaymentModal } from '@x402-devkit/sdk/client/react'\n *\n * // Basic modal\n * <PaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={handleComplete}\n * onCancel={handleCancel}\n * />\n *\n * // Enhanced modal with success states and explorer links\n * <EnhancedPaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={handleComplete}\n * onCancel={handleCancel}\n * description=\"Premium API access\"\n * endpoint=\"/api/premium-data\"\n * simulation={false}\n * />\n * ```\n */\n\nexport { PaymentModal } from './modal-react'\nexport { EnhancedPaymentModal } from './payment-modal-enhanced'\n\n// Re-export types that React components need\nexport type { PaymentRequest, PaymentResponse } from './types'\n","/**\n * React Payment Modal Component\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport type { PaymentRequest, PaymentResponse } from './types'\nimport { connectWallet, detectWalletProvider, ensureNetwork } from './wallet'\nimport { processPayment } from './payment'\n\ninterface PaymentModalProps {\n request: PaymentRequest\n onComplete: (payment: PaymentResponse) => void\n onCancel: () => void\n isOpen: boolean\n}\n\ntype Step = 'connect' | 'confirm' | 'processing'\n\n/**\n * Format address for display\n */\nfunction formatAddress(address: string | null | undefined): string {\n if (!address || typeof address !== 'string') {\n return 'N/A'\n }\n if (address.length < 10) {\n return address\n }\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Payment Modal Component\n *\n * @example\n * ```tsx\n * <PaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={(payment) => console.log('Paid:', payment.transactionHash)}\n * onCancel={() => setIsOpen(false)}\n * />\n * ```\n */\nexport function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps) {\n const [walletAddress, setWalletAddress] = useState<string | null>(null)\n const [isConnecting, setIsConnecting] = useState(false)\n const [isProcessing, setIsProcessing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [step, setStep] = useState<Step>('connect')\n\n // Validate request early\n if (!request || !request.amount || !request.recipient || !request.network) {\n console.error('Invalid payment request:', request)\n if (isOpen) {\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n }}\n onClick={(e) => e.target === e.currentTarget && onCancel()}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '28rem',\n borderRadius: '0.75rem',\n border: '1px solid rgba(239, 68, 68, 0.5)',\n background: 'rgba(24, 24, 27, 0.95)',\n padding: '1.5rem',\n color: '#fafafa',\n }}\n >\n <h2 style={{ margin: '0 0 1rem 0', color: 'rgba(239, 68, 68, 0.9)' }}>Invalid Payment Request</h2>\n <p style={{ margin: '0 0 1rem 0', color: 'rgba(250, 250, 250, 0.8)' }}>\n The payment request is missing required information. Please try again.\n </p>\n <button\n onClick={onCancel}\n style={{\n width: '100%',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n background: 'rgba(255, 255, 255, 0.1)',\n color: '#fafafa',\n cursor: 'pointer',\n }}\n >\n Close\n </button>\n </div>\n </div>\n )\n }\n return null\n }\n\n const checkWalletConnection = useCallback(async () => {\n const wallet = detectWalletProvider()\n if (wallet) {\n try {\n const account = await wallet.getAccount()\n if (account) {\n setWalletAddress(account)\n setStep('confirm')\n }\n } catch {\n // Not connected\n }\n }\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n checkWalletConnection()\n } else {\n // Reset state when modal closes\n setStep('connect')\n setError(null)\n setWalletAddress(null)\n }\n }, [isOpen, checkWalletConnection])\n\n const handleConnect = async () => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('No wallet found. Please install MetaMask.')\n }\n\n const address = await connectWallet(wallet)\n setWalletAddress(address)\n setStep('confirm')\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to connect wallet')\n } finally {\n setIsConnecting(false)\n }\n }\n\n const handlePay = async () => {\n setIsProcessing(true)\n setError(null)\n setStep('processing')\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('Wallet not connected')\n }\n\n // Ensure wallet is on the correct network before processing payment\n try {\n await ensureNetwork(wallet, request.network, true)\n } catch (networkError) {\n const errorMessage = networkError instanceof Error ? networkError.message : 'Network switch failed'\n throw new Error(`Failed to switch network: ${errorMessage}. Please ensure you're on ${request.network}`)\n }\n\n // Process the payment\n const payment = await processPayment(request, wallet)\n onComplete(payment)\n } catch (err) {\n // Provide more specific error messages\n let errorMessage = 'Payment failed'\n if (err instanceof Error) {\n errorMessage = err.message\n // Check for common error patterns\n if (err.message.includes('user rejected') || err.message.includes('User denied')) {\n errorMessage = 'Transaction was rejected. Please try again.'\n } else if (err.message.includes('insufficient funds') || err.message.includes('insufficient balance')) {\n errorMessage = 'Insufficient funds. Please ensure you have enough MNT in your wallet.'\n } else if (err.message.includes('network')) {\n errorMessage = err.message\n }\n }\n setError(errorMessage)\n setStep('confirm')\n } finally {\n setIsProcessing(false)\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n }}\n onClick={(e) => e.target === e.currentTarget && onCancel()}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '28rem',\n borderRadius: '0.75rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(24, 24, 27, 0.95)',\n padding: '1.5rem',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.3)',\n backdropFilter: 'blur(16px)',\n color: '#fafafa',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '1.5rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <div\n style={{\n width: '2rem',\n height: '2rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '0.5rem',\n background: 'rgba(255, 255, 255, 0.1)',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n fontWeight: 'bold',\n }}\n >\n x402\n </div>\n <h2 style={{ margin: 0, fontSize: '1.25rem', fontWeight: 300 }}>Payment Required</h2>\n </div>\n <button\n onClick={onCancel}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.6)',\n lineHeight: 1,\n }}\n >\n &times;\n </button>\n </div>\n\n {/* Payment Details */}\n <div\n style={{\n marginBottom: '1.5rem',\n padding: '1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '0.75rem',\n }}\n >\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Amount\n </span>\n <span style={{ fontSize: '1.125rem', fontWeight: 500 }}>\n {request.amount} {request.token}\n </span>\n </div>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '0.75rem',\n }}\n >\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Network\n </span>\n <span style={{ fontSize: '0.875rem' }}>{request.network}</span>\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span\n style={{ fontFamily: 'monospace', fontSize: '0.75rem', color: 'rgba(250,250,250,0.6)' }}\n >\n Recipient\n </span>\n <span style={{ fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {formatAddress(request.recipient)}\n </span>\n </div>\n </div>\n\n {/* Error Message */}\n {error && (\n <div\n style={{\n marginBottom: '1rem',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(239, 68, 68, 0.5)',\n background: 'rgba(239, 68, 68, 0.1)',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(239, 68, 68, 0.9)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Connect Step */}\n {step === 'connect' && (\n <button\n onClick={handleConnect}\n disabled={isConnecting}\n style={{\n width: '100%',\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.05)',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: isConnecting ? 'not-allowed' : 'pointer',\n opacity: isConnecting ? 0.7 : 1,\n color: '#fafafa',\n }}\n >\n {isConnecting ? 'Connecting...' : 'Connect Wallet'}\n </button>\n )}\n\n {/* Confirm Step */}\n {step === 'confirm' && walletAddress && (\n <>\n <div\n style={{\n marginBottom: '1rem',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n <p\n style={{\n margin: '0 0 0.25rem 0',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Connected Wallet\n </p>\n <p style={{ margin: 0, fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {formatAddress(walletAddress)}\n </p>\n </div>\n <div style={{ display: 'flex', gap: '0.75rem' }}>\n <button\n onClick={onCancel}\n style={{\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n fontSize: '0.875rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.8)',\n }}\n >\n Cancel\n </button>\n <button\n onClick={handlePay}\n disabled={isProcessing}\n style={{\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.1)',\n fontSize: '0.875rem',\n fontWeight: 500,\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n opacity: isProcessing ? 0.7 : 1,\n color: '#fafafa',\n }}\n >\n Pay {request.amount} {request.token}\n </button>\n </div>\n </>\n )}\n\n {/* Processing Step */}\n {step === 'processing' && (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem 0',\n }}\n >\n <div\n style={{\n width: '2rem',\n height: '2rem',\n marginBottom: '1rem',\n border: '2px solid rgba(255, 255, 255, 0.2)',\n borderTopColor: '#fafafa',\n borderRadius: '50%',\n animation: 'x402-spin 1s linear infinite',\n }}\n />\n <p style={{ margin: 0, fontSize: '0.875rem', color: 'rgba(250, 250, 250, 0.6)' }}>\n Processing payment...\n </p>\n <p\n style={{\n margin: '0.5rem 0 0 0',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.4)',\n }}\n >\n Please confirm the transaction in your wallet\n </p>\n <style>{`\n @keyframes x402-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Constants and Configuration\n *\n * Centralized configuration for networks and tokens\n * Supports both preset networks (mainnet/testnet) and custom configurations\n */\n\n/** Supported network identifiers */\nexport type NetworkId = 'mantle' | 'mantle-sepolia' | 'mantle-testnet'\n\n/** Network environment */\nexport type NetworkEnvironment = 'mainnet' | 'testnet'\n\n/** Network configuration */\nexport interface NetworkConfig {\n chainId: number\n rpcUrl: string\n name: string\n environment: NetworkEnvironment\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n blockExplorer: string\n}\n\n/** Token configuration */\nexport interface TokenConfig {\n address: string\n decimals: number\n symbol: string\n}\n\n/** Custom network configuration (user-provided) */\nexport interface CustomNetworkConfig {\n chainId: number\n rpcUrl: string\n name?: string\n environment?: NetworkEnvironment\n blockExplorer?: string\n}\n\n/** Custom token configuration (user-provided) */\nexport interface CustomTokenConfig {\n [symbol: string]: {\n address: string\n decimals: number\n }\n}\n\n/** Network configurations */\nexport const NETWORKS: Record<NetworkId, NetworkConfig> = {\n mantle: {\n chainId: 5000,\n rpcUrl: 'https://rpc.mantle.xyz',\n name: 'Mantle',\n environment: 'mainnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.mantle.xyz',\n },\n 'mantle-sepolia': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Sepolia',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n 'mantle-testnet': {\n chainId: 5003,\n rpcUrl: 'https://rpc.sepolia.mantle.xyz',\n name: 'Mantle Testnet',\n environment: 'testnet',\n nativeCurrency: { name: 'Mantle', symbol: 'MNT', decimals: 18 },\n blockExplorer: 'https://explorer.sepolia.mantle.xyz',\n },\n} as const\n\n/** Token addresses by network */\nexport const TOKENS: Record<NetworkId, Record<string, TokenConfig>> = {\n mantle: {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n USDT: {\n address: '0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE',\n decimals: 6,\n symbol: 'USDT',\n },\n mETH: {\n address: '0xcDA86A272531e8640cD7F1a92c01839911B90bb0',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-sepolia': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n 'mantle-testnet': {\n USDC: {\n address: '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9',\n decimals: 6,\n symbol: 'USDC',\n },\n mETH: {\n address: '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111',\n decimals: 18,\n symbol: 'mETH',\n },\n WMNT: {\n address: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8',\n decimals: 18,\n symbol: 'WMNT',\n },\n },\n} as const\n\n/** Treasury contract address (collects 0.5% platform fee) */\nexport const TREASURY_ADDRESS = '0xB27705342ACE73736AE490540Ea031cc06C3eF49'\n\n/** Platform fee in basis points (50 = 0.5%) */\nexport const PLATFORM_FEE_BPS = 50n\nexport const BPS_DENOMINATOR = 10000n\n\n/** Treasury admin address */\nexport const TREASURY_ADMIN = '0xDacCF30F8BB2aEb8D76E68E03033629809ed08E1'\n\n/** Custom network registry (populated at runtime) */\nconst customNetworks: Map<string, NetworkConfig> = new Map()\n\n/** Custom token registry (populated at runtime) */\nconst customTokens: Map<string, Map<string, TokenConfig>> = new Map()\n\n/**\n * Register a custom network configuration\n *\n * @example\n * ```typescript\n * registerCustomNetwork('my-network', {\n * chainId: 12345,\n * rpcUrl: 'https://my-rpc.example.com',\n * name: 'My Custom Network',\n * environment: 'testnet'\n * })\n * ```\n */\nexport function registerCustomNetwork(networkId: string, config: CustomNetworkConfig): void {\n customNetworks.set(networkId.toLowerCase(), {\n chainId: config.chainId,\n rpcUrl: config.rpcUrl,\n name: config.name || networkId,\n environment: config.environment || 'testnet',\n nativeCurrency: { name: 'Native', symbol: 'ETH', decimals: 18 },\n blockExplorer: config.blockExplorer || '',\n })\n}\n\n/**\n * Register custom tokens for a network\n *\n * @example\n * ```typescript\n * registerCustomTokens('mantle', {\n * 'MYTOKEN': { address: '0x...', decimals: 18 }\n * })\n * ```\n */\nexport function registerCustomTokens(networkId: string, tokens: CustomTokenConfig): void {\n const networkKey = networkId.toLowerCase()\n if (!customTokens.has(networkKey)) {\n customTokens.set(networkKey, new Map())\n }\n const tokenMap = customTokens.get(networkKey)!\n for (const [symbol, config] of Object.entries(tokens)) {\n tokenMap.set(symbol.toUpperCase(), {\n address: config.address,\n decimals: config.decimals,\n symbol: symbol.toUpperCase(),\n })\n }\n}\n\n/**\n * Check if network is testnet\n */\nexport function isTestnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'testnet'\n}\n\n/**\n * Check if network is mainnet\n */\nexport function isMainnet(network: string): boolean {\n const config = getNetworkConfig(network)\n return config.environment === 'mainnet'\n}\n\n/**\n * Get network configuration (supports preset and custom networks)\n */\nexport function getNetworkConfig(network: string): NetworkConfig {\n const networkKey = network.toLowerCase()\n\n // Check custom networks first\n const custom = customNetworks.get(networkKey)\n if (custom) {\n return custom\n }\n\n // Check preset networks\n const preset = NETWORKS[networkKey as NetworkId]\n if (preset) {\n return preset\n }\n\n // Default to mainnet\n return NETWORKS.mantle\n}\n\n/**\n * Get token configuration (supports preset and custom tokens)\n */\nexport function getTokenConfig(token: string, network: string): TokenConfig | null {\n const networkKey = network.toLowerCase()\n const tokenKey = token.toUpperCase()\n\n // Native MNT doesn't have a token config\n if (tokenKey === 'MNT') {\n return null\n }\n\n // Check custom tokens first\n const customMap = customTokens.get(networkKey)\n if (customMap?.has(tokenKey)) {\n return customMap.get(tokenKey)!\n }\n\n // Check preset tokens\n return TOKENS[networkKey as NetworkId]?.[tokenKey] || null\n}\n\n/**\n * Get chain ID for network\n */\nexport function getChainId(network: string): number {\n return getNetworkConfig(network).chainId\n}\n\n/**\n * Get all available networks (preset + custom)\n */\nexport function getAvailableNetworks(): string[] {\n const preset = Object.keys(NETWORKS)\n const custom = Array.from(customNetworks.keys())\n return [...new Set([...preset, ...custom])]\n}\n\n/**\n * Get networks by environment\n */\nexport function getNetworksByEnvironment(env: NetworkEnvironment): string[] {\n return getAvailableNetworks().filter((network) => {\n const config = getNetworkConfig(network)\n return config.environment === env\n })\n}\n","/**\n * Wallet Connection & Management\n *\n * Handles web3 wallet connections (MetaMask, WalletConnect, etc.)\n * Supports network switching and custom network addition\n */\n\nimport type {\n TransactionRequest,\n WalletProvider,\n EIP1193Provider,\n WindowWithEthereum,\n AddEthereumChainParameter,\n} from './types'\nimport { getNetworkConfig, getChainId as getChainIdForNetwork } from './constants'\n\n/**\n * Get ethereum provider from window\n */\nfunction getEthereumProvider(): EIP1193Provider | null {\n if (typeof window === 'undefined') {\n return null\n }\n return (window as WindowWithEthereum).ethereum || null\n}\n\n/**\n * MetaMask/EIP-1193 wallet provider\n */\nexport class MetaMaskProvider implements WalletProvider {\n private ethereum: EIP1193Provider | null\n\n constructor() {\n this.ethereum = getEthereumProvider()\n }\n\n isAvailable(): boolean {\n return this.ethereum !== null && this.ethereum.isMetaMask === true\n }\n\n async connect(): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const accounts = (await this.ethereum.request({\n method: 'eth_requestAccounts',\n })) as string[]\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts found')\n }\n\n return accounts[0]\n }\n\n async getAccount(): Promise<string | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const accounts = (await this.ethereum.request({\n method: 'eth_accounts',\n })) as string[]\n\n return accounts && accounts.length > 0 ? accounts[0] : null\n } catch {\n return null\n }\n }\n\n async getChainId(): Promise<number | null> {\n if (!this.ethereum) {\n return null\n }\n\n try {\n const chainIdHex = (await this.ethereum.request({\n method: 'eth_chainId',\n })) as string\n\n return parseInt(chainIdHex, 16)\n } catch {\n return null\n }\n }\n\n async switchNetwork(chainId: number): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const chainIdHex = `0x${chainId.toString(16)}`\n\n try {\n await this.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainIdHex }],\n })\n } catch (error) {\n const switchError = error as { code?: number }\n if (switchError.code === 4902) {\n // Chain not added, throw specific error\n throw new Error(`Network with chainId ${chainId} not found. Use addNetwork() first.`)\n }\n throw error\n }\n }\n\n async addNetwork(params: AddEthereumChainParameter): Promise<void> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n await this.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [params],\n })\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n // Get the current account to set as 'from'\n const account = await this.getAccount()\n if (!account) {\n throw new Error('No account connected. Please connect your wallet first.')\n }\n\n // Ensure 'from' field is set\n const txWithFrom = {\n ...tx,\n from: account,\n }\n\n try {\n const txHash = (await this.ethereum.request({\n method: 'eth_sendTransaction',\n params: [txWithFrom],\n })) as string\n\n return txHash\n } catch (error: any) {\n // Provide more specific error messages\n if (error.code === 4001) {\n throw new Error('Transaction rejected by user')\n } else if (error.code === -32602) {\n throw new Error('Invalid transaction parameters')\n } else if (error.message?.includes('insufficient funds') || error.message?.includes('insufficient balance')) {\n throw new Error('Insufficient funds for this transaction')\n } else if (error.message) {\n throw new Error(error.message)\n } else {\n throw new Error(`Transaction failed: ${error.code || 'Unknown error'}`)\n }\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.ethereum) {\n throw new Error('MetaMask is not available')\n }\n\n const account = await this.getAccount()\n if (!account) {\n throw new Error('No account connected')\n }\n\n const signature = (await this.ethereum.request({\n method: 'personal_sign',\n params: [message, account],\n })) as string\n\n return signature\n }\n}\n\n/**\n * Auto-detect wallet provider\n */\nexport function detectWalletProvider(): WalletProvider | null {\n const metaMask = new MetaMaskProvider()\n if (metaMask.isAvailable()) {\n return metaMask\n }\n\n // Add more providers here (WalletConnect, Coinbase Wallet, etc.)\n return null\n}\n\n/**\n * Connect wallet (auto-detect or use provided)\n */\nexport async function connectWallet(provider?: WalletProvider): Promise<string> {\n const wallet = provider || detectWalletProvider()\n\n if (!wallet) {\n throw new Error(\n 'No wallet provider found. Please install MetaMask or another compatible wallet.'\n )\n }\n\n return wallet.connect()\n}\n\n/**\n * Ensure wallet is on the correct network\n *\n * @param wallet - Wallet provider\n * @param network - Network identifier (e.g., 'mantle', 'mantle-sepolia')\n * @param autoAdd - Auto-add network if not found (default: true)\n */\nexport async function ensureNetwork(\n wallet: WalletProvider,\n network: string,\n autoAdd = true\n): Promise<void> {\n const config = getNetworkConfig(network)\n const targetChainId = config.chainId\n const currentChainId = await wallet.getChainId()\n\n if (currentChainId === targetChainId) {\n return // Already on correct network\n }\n\n try {\n await wallet.switchNetwork(targetChainId)\n } catch (error) {\n const switchError = error as { message?: string }\n\n // If network not found and autoAdd is enabled, add it\n if (autoAdd && switchError.message?.includes('not found')) {\n await wallet.addNetwork({\n chainId: `0x${targetChainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n })\n } else {\n throw error\n }\n }\n}\n\n/**\n * Get network config for adding to wallet\n */\nexport function getAddNetworkParams(network: string): AddEthereumChainParameter {\n const config = getNetworkConfig(network)\n return {\n chainId: `0x${config.chainId.toString(16)}`,\n chainName: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: [config.rpcUrl],\n blockExplorerUrls: config.blockExplorer ? [config.blockExplorer] : undefined,\n }\n}\n","/**\n * Payment Processing\n *\n * Handles direct blockchain payments with automatic fee splitting\n * Automatically splits 0.5% platform fee to Treasury\n */\n\nimport type { PaymentRequest, PaymentResponse, WalletProvider, TransactionRequest } from './types'\nimport {\n getTokenConfig,\n TREASURY_ADDRESS,\n PLATFORM_FEE_BPS,\n BPS_DENOMINATOR,\n} from './constants'\n\n/** ERC20 transfer function signature */\nconst ERC20_TRANSFER_SIG = '0xa9059cbb'\n\n/**\n * Convert amount to Wei\n */\nfunction amountToWei(amount: string, decimals: number = 18): bigint {\n const parts = amount.split('.')\n const whole = parts[0] || '0'\n const fraction = (parts[1] || '').padEnd(decimals, '0').slice(0, decimals)\n\n return BigInt(whole) * 10n ** BigInt(decimals) + BigInt(fraction)\n}\n\n/**\n * Calculate fee split\n */\nfunction calculateSplit(amount: bigint): { merchantAmount: bigint; feeAmount: bigint } {\n const feeAmount = (amount * PLATFORM_FEE_BPS) / BPS_DENOMINATOR\n const merchantAmount = amount - feeAmount\n return { merchantAmount, feeAmount }\n}\n\n/**\n * Encode ERC20 transfer call data\n */\nfunction encodeERC20Transfer(to: string, amount: bigint): string {\n const toHex = to.slice(2).toLowerCase().padStart(64, '0')\n const amountHex = amount.toString(16).padStart(64, '0')\n return ERC20_TRANSFER_SIG + toHex + amountHex\n}\n\n/**\n * Process payment for an x402 request\n *\n * Automatically splits payment:\n * - 99.5% to merchant\n * - 0.5% to Treasury\n *\n * @param request - Payment request from HTTP 402 response\n * @param wallet - Wallet provider to use for transaction\n * @returns Payment response with transaction hash\n */\nexport async function processPayment(\n request: PaymentRequest,\n wallet: WalletProvider\n): Promise<PaymentResponse> {\n // Validate request\n if (!request.amount || !request.recipient || !request.network) {\n throw new Error('Invalid payment request: missing required fields')\n }\n\n // Get token configuration\n const tokenConfig = getTokenConfig(request.token, request.network)\n const decimals = tokenConfig?.decimals ?? 18\n\n // Calculate amounts\n const totalAmount = amountToWei(request.amount, decimals)\n \n if (totalAmount === 0n) {\n throw new Error('Invalid payment amount: amount must be greater than 0')\n }\n\n const { merchantAmount, feeAmount } = calculateSplit(totalAmount)\n\n let txHash: string\n\n if (tokenConfig) {\n // ERC20 token transfer - send full amount to merchant\n // (Treasury fee handled separately for ERC20)\n const transferData = encodeERC20Transfer(request.recipient, totalAmount)\n\n const tx: TransactionRequest = {\n to: tokenConfig.address,\n data: transferData,\n }\n\n txHash = await wallet.sendTransaction(tx)\n } else {\n // Native MNT transfer - split between merchant and treasury\n\n // 1. Send to merchant (99.5%)\n const merchantValue = merchantAmount.toString(16)\n const merchantTx: TransactionRequest = {\n to: request.recipient,\n value: `0x${merchantValue}`,\n }\n \n txHash = await wallet.sendTransaction(merchantTx)\n\n // 2. Send fee to Treasury (0.5%)\n if (feeAmount > 0n) {\n const feeValue = feeAmount.toString(16)\n const feeTx: TransactionRequest = {\n to: TREASURY_ADDRESS,\n value: `0x${feeValue}`,\n }\n // Note: We send the fee transaction but don't wait for it\n // The main transaction hash is what we return\n wallet.sendTransaction(feeTx).catch((err) => {\n console.warn('Fee transaction failed (non-critical):', err)\n })\n }\n }\n\n return {\n transactionHash: txHash,\n timestamp: new Date().toISOString(),\n }\n}\n","/**\n * Enhanced Payment Modal Component\n * \n * A beautiful, feature-rich payment modal with success states,\n * transaction tracking, and explorer links.\n * \n * Based on the dashboard preview component UI.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport type { PaymentRequest, PaymentResponse } from './types'\nimport { connectWallet, detectWalletProvider, ensureNetwork } from './wallet'\nimport { processPayment } from './payment'\nimport { getNetworkConfig } from './constants'\n\ninterface EnhancedPaymentModalProps {\n request: PaymentRequest\n onComplete: (payment: PaymentResponse) => void\n onCancel: () => void\n isOpen: boolean\n simulation?: boolean // When true, simulates payment without executing real transactions\n description?: string // Optional: Description of what's being paid for\n endpoint?: string // Optional: API endpoint being paid for\n}\n\n/**\n * Format address for display\n */\nfunction formatAddress(address: string | null | undefined): string {\n if (!address || typeof address !== 'string') {\n return 'N/A'\n }\n if (address.length < 10) {\n return address\n }\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Get block explorer URL for transaction\n */\nfunction getExplorerUrl(txHash: string, network: string): string {\n const config = getNetworkConfig(network)\n if (config.blockExplorer) {\n return `${config.blockExplorer}/tx/${txHash}`\n }\n // Fallback to Mantle explorer\n if (network.includes('sepolia') || network.includes('testnet')) {\n return `https://explorer.sepolia.mantle.xyz/tx/${txHash}`\n }\n return `https://explorer.mantle.xyz/tx/${txHash}`\n}\n\n/**\n * Enhanced Payment Modal Component\n *\n * @example\n * ```tsx\n * <EnhancedPaymentModal\n * request={paymentRequest}\n * isOpen={isOpen}\n * onComplete={(payment) => console.log('Paid:', payment.transactionHash)}\n * onCancel={() => setIsOpen(false)}\n * description=\"Premium API access\"\n * endpoint=\"/api/premium-data\"\n * />\n * ```\n */\nexport function EnhancedPaymentModal({\n request,\n onComplete,\n onCancel,\n isOpen,\n simulation = false,\n description,\n endpoint,\n}: EnhancedPaymentModalProps) {\n const [walletAddress, setWalletAddress] = useState<string | null>(null)\n const [isConnecting, setIsConnecting] = useState(false)\n const [isProcessing, setIsProcessing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [txHash, setTxHash] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n\n // Reset state when modal opens/closes\n useEffect(() => {\n if (!isOpen) {\n setIsProcessing(false)\n setError(null)\n setTxHash(null)\n setCopied(false)\n setWalletAddress(null)\n }\n }, [isOpen])\n\n const handleCopy = useCallback((text: string) => {\n navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }, [])\n\n const checkWalletConnection = useCallback(async () => {\n const wallet = detectWalletProvider()\n if (wallet) {\n try {\n const account = await wallet.getAccount()\n if (account) {\n setWalletAddress(account)\n }\n } catch {\n // Not connected\n }\n }\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n checkWalletConnection()\n }\n }, [isOpen, checkWalletConnection])\n\n const handleConnect = async () => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('No wallet found. Please install MetaMask.')\n }\n\n const address = await connectWallet(wallet)\n setWalletAddress(address)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to connect wallet')\n } finally {\n setIsConnecting(false)\n }\n }\n\n const handlePayment = async () => {\n // Simulation mode - just simulate the payment flow\n if (simulation) {\n setIsProcessing(true)\n setError(null)\n\n // Simulate processing delay\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Generate a mock transaction hash\n const mockTxHash = `0x${Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('')}`\n setTxHash(mockTxHash)\n\n // Simulate success after another delay\n setTimeout(() => {\n const paymentResponse: PaymentResponse = {\n transactionHash: mockTxHash,\n timestamp: new Date().toISOString(),\n }\n setIsProcessing(false)\n onComplete(paymentResponse)\n }, 1500)\n return\n }\n\n // Real payment execution\n if (!walletAddress) {\n setError('Please connect your wallet first')\n return\n }\n\n try {\n setIsProcessing(true)\n setError(null)\n\n const wallet = detectWalletProvider()\n if (!wallet) {\n throw new Error('Wallet not connected')\n }\n\n // Ensure wallet is on the correct network before processing payment\n try {\n await ensureNetwork(wallet, request.network, true)\n } catch (networkError) {\n const errorMessage =\n networkError instanceof Error ? networkError.message : 'Network switch failed'\n throw new Error(\n `Failed to switch network: ${errorMessage}. Please ensure you're on ${request.network}`\n )\n }\n\n // Process the payment\n const payment = await processPayment(request, wallet)\n setTxHash(payment.transactionHash)\n\n // Wait a moment to show the success state\n setTimeout(() => {\n onComplete(payment)\n }, 2000)\n } catch (err) {\n // Provide more specific error messages\n let errorMessage = 'Payment failed'\n if (err instanceof Error) {\n errorMessage = err.message\n // Check for common error patterns\n if (err.message.includes('user rejected') || err.message.includes('User denied')) {\n errorMessage = 'Transaction was rejected. Please try again.'\n } else if (\n err.message.includes('insufficient funds') ||\n err.message.includes('insufficient balance')\n ) {\n errorMessage = 'Insufficient funds. Please ensure you have enough MNT in your wallet.'\n } else if (err.message.includes('network')) {\n errorMessage = err.message\n }\n }\n setError(errorMessage)\n setIsProcessing(false)\n }\n }\n\n // Validate request early\n if (!request || !request.amount || !request.recipient || !request.network) {\n console.error('Invalid payment request:', request)\n if (isOpen) {\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n padding: '1rem',\n }}\n onClick={(e) => e.target === e.currentTarget && onCancel()}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '28rem',\n borderRadius: '0.75rem',\n border: '1px solid rgba(239, 68, 68, 0.5)',\n background: 'rgba(24, 24, 27, 0.95)',\n padding: '1.5rem',\n color: '#fafafa',\n }}\n >\n <h2 style={{ margin: '0 0 1rem 0', color: 'rgba(239, 68, 68, 0.9)' }}>\n Invalid Payment Request\n </h2>\n <p style={{ margin: '0 0 1rem 0', color: 'rgba(250, 250, 250, 0.8)' }}>\n The payment request is missing required information. Please try again.\n </p>\n <button\n onClick={onCancel}\n style={{\n width: '100%',\n padding: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n background: 'rgba(255, 255, 255, 0.1)',\n color: '#fafafa',\n cursor: 'pointer',\n }}\n >\n Close\n </button>\n </div>\n </div>\n )\n }\n return null\n }\n\n if (!isOpen) return null\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n padding: '1rem',\n }}\n onClick={(e) => e.target === e.currentTarget && onCancel()}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '28rem',\n borderRadius: '0.75rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(24, 24, 27, 0.95)',\n padding: '1.5rem',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.3)',\n backdropFilter: 'blur(16px)',\n color: '#fafafa',\n maxHeight: '90vh',\n overflowY: 'auto',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '1rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <h2\n style={{\n margin: 0,\n fontSize: '1.25rem',\n fontWeight: 300,\n color: '#fafafa',\n }}\n >\n {txHash ? 'Payment Complete' : 'Payment Required'}\n </h2>\n {simulation && (\n <span\n style={{\n borderRadius: '9999px',\n border: '1px solid rgba(234, 179, 8, 0.4)',\n background: 'rgba(234, 179, 8, 0.2)',\n padding: '0.125rem 0.5rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(234, 179, 8, 1)',\n }}\n >\n SIMULATION\n </span>\n )}\n </div>\n {!isProcessing && (\n <button\n onClick={onCancel}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: 'rgba(250, 250, 250, 0.6)',\n lineHeight: 1,\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n aria-label=\"Close\"\n >\n &times;\n </button>\n )}\n </div>\n\n {/* Success State */}\n {txHash ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0.5rem 0',\n }}\n >\n <div\n style={{\n borderRadius: '50%',\n background: 'rgba(34, 197, 94, 0.2)',\n padding: '0.75rem',\n }}\n >\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"rgba(34, 197, 94, 1)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n </div>\n </div>\n <div style={{ marginBottom: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div>\n <p\n style={{\n marginBottom: '0.5rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Transaction Hash\n </p>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(0, 0, 0, 0.3)',\n padding: '0.5rem 0.75rem',\n overflow: 'hidden',\n }}\n >\n <code\n style={{\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontFamily: 'monospace',\n fontSize: '0.875rem',\n color: '#fafafa',\n }}\n >\n {txHash}\n </code>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.375rem',\n flexShrink: 0,\n }}\n >\n <button\n onClick={() => handleCopy(txHash)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.375rem',\n borderRadius: '0.375rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.1)',\n padding: '0.25rem 0.625rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: '#fafafa',\n cursor: 'pointer',\n transition: 'background 0.2s',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)')}\n title=\"Copy transaction hash\"\n >\n {copied ? (\n <>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n Copied\n </>\n ) : (\n <>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n Copy\n </>\n )}\n </button>\n <a\n href={getExplorerUrl(txHash, request.network)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '0.375rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.1)',\n padding: '0.375rem',\n color: 'rgba(250, 250, 250, 0.6)',\n cursor: 'pointer',\n transition: 'all 0.2s',\n textDecoration: 'none',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)'\n e.currentTarget.style.color = '#fafafa'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)'\n e.currentTarget.style.color = 'rgba(250, 250, 250, 0.6)'\n }}\n title=\"View on explorer\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\" />\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14L21 3\" />\n </svg>\n </a>\n </div>\n </div>\n </div>\n <div>\n <p\n style={{\n marginBottom: '0.5rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Amount Paid\n </p>\n <p\n style={{\n fontFamily: 'sans-serif',\n fontSize: '1rem',\n color: '#fafafa',\n margin: 0,\n }}\n >\n {request.amount} {request.token}\n </p>\n </div>\n </div>\n <button\n onClick={onCancel}\n style={{\n width: '100%',\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.15)',\n padding: '0.625rem 1rem',\n fontFamily: 'sans-serif',\n fontSize: '0.875rem',\n color: '#fafafa',\n cursor: 'pointer',\n transition: 'background 0.2s',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'rgba(255, 255, 255, 0.15)')}\n >\n Done\n </button>\n </div>\n ) : (\n <>\n {/* Payment Details */}\n <div style={{ marginBottom: '1.5rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {description && (\n <div>\n <p\n style={{\n marginBottom: '0.5rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Description\n </p>\n <p\n style={{\n fontFamily: 'sans-serif',\n fontSize: '0.875rem',\n color: '#fafafa',\n margin: 0,\n }}\n >\n {description}\n </p>\n </div>\n )}\n\n {endpoint && (\n <div>\n <p\n style={{\n marginBottom: '0.5rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n }}\n >\n Endpoint\n </p>\n <code\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.8)',\n wordBreak: 'break-all',\n }}\n >\n {endpoint}\n </code>\n </div>\n )}\n\n <div\n style={{\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.05)',\n padding: '1rem',\n }}\n >\n <div\n style={{\n marginBottom: '0.75rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <p\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n margin: 0,\n }}\n >\n Amount\n </p>\n <p\n style={{\n fontFamily: 'sans-serif',\n fontSize: '1.5rem',\n fontWeight: 300,\n color: '#fafafa',\n margin: 0,\n }}\n >\n {request.amount} {request.token}\n </p>\n </div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n paddingTop: '0.75rem',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <p\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n margin: 0,\n }}\n >\n Network\n </p>\n <p\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: '#fafafa',\n margin: 0,\n }}\n >\n {request.network}\n </p>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '0.5rem',\n }}\n >\n <p\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n margin: 0,\n }}\n >\n Recipient\n </p>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <code\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: '#fafafa',\n }}\n >\n {formatAddress(request.recipient)}\n </code>\n <button\n onClick={() => handleCopy(request.recipient)}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(250, 250, 250, 0.6)',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'color 0.2s',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = '#fafafa')}\n onMouseLeave={(e) => (e.currentTarget.style.color = 'rgba(250, 250, 250, 0.6)')}\n title=\"Copy address\"\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"rgba(34, 197, 94, 1)\"\n strokeWidth=\"2\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n {walletAddress && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '0.5rem',\n }}\n >\n <p\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(250, 250, 250, 0.6)',\n margin: 0,\n }}\n >\n From\n </p>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"rgba(250, 250, 250, 0.6)\"\n strokeWidth=\"2\"\n >\n <path d=\"M21 12V7H5a2 2 0 01 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 002 2h16v-5\" />\n <path d=\"M5 21a2 2 0 110-4h14\" />\n </svg>\n <code\n style={{\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: '#fafafa',\n }}\n >\n {formatAddress(walletAddress)}\n </code>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {error && (\n <div\n style={{\n marginBottom: '1rem',\n display: 'flex',\n alignItems: 'start',\n gap: '0.75rem',\n borderRadius: '0.5rem',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n background: 'rgba(239, 68, 68, 0.1)',\n padding: '0.75rem',\n }}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"rgba(239, 68, 68, 1)\"\n strokeWidth=\"2\"\n style={{ flexShrink: 0, marginTop: '0.125rem' }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </svg>\n <p\n style={{\n flex: 1,\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: 'rgba(239, 68, 68, 1)',\n wordBreak: 'break-word',\n margin: 0,\n }}\n >\n {error}\n </p>\n </div>\n )}\n\n {/* Actions */}\n <div style={{ display: 'flex', gap: '0.75rem' }}>\n <button\n onClick={onCancel}\n disabled={isProcessing}\n style={{\n flex: 1,\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.05)',\n padding: '0.625rem 1rem',\n fontFamily: 'sans-serif',\n fontSize: '0.875rem',\n color: 'rgba(250, 250, 250, 0.8)',\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n opacity: isProcessing ? 0.5 : 1,\n transition: 'background 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isProcessing) e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)'\n }}\n onMouseLeave={(e) => {\n if (!isProcessing) e.currentTarget.style.background = 'rgba(255, 255, 255, 0.05)'\n }}\n >\n Cancel\n </button>\n <button\n onClick={walletAddress ? handlePayment : handleConnect}\n disabled={isProcessing || isConnecting}\n style={{\n flex: 1,\n borderRadius: '0.5rem',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.15)',\n padding: '0.625rem 1rem',\n fontFamily: 'sans-serif',\n fontSize: '0.875rem',\n color: '#fafafa',\n cursor: isProcessing || isConnecting ? 'not-allowed' : 'pointer',\n opacity: isProcessing || isConnecting ? 0.5 : 1,\n transition: 'background 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isProcessing && !isConnecting)\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)'\n }}\n onMouseLeave={(e) => {\n if (!isProcessing && !isConnecting)\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.15)'\n }}\n >\n {isProcessing ? (\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\n </svg>\n {simulation ? 'Simulating...' : 'Processing...'}\n </span>\n ) : isConnecting ? (\n 'Connecting...'\n ) : !walletAddress ? (\n 'Connect Wallet'\n ) : simulation ? (\n `Simulate ${request.amount} ${request.token}`\n ) : (\n `Pay ${request.amount} ${request.token}`\n )}\n </button>\n </div>\n </>\n )}\n </div>\n <style>{`\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n )\n}\n\n"],"mappings":"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","names":["import_react","import_jsx_runtime","formatAddress"]}
@@ -11,6 +11,8 @@ interface PaymentRequest {
11
11
  network: string;
12
12
  chainId?: number;
13
13
  recipient: string;
14
+ description?: string;
15
+ endpoint?: string;
14
16
  }
15
17
  /** Payment response after successful payment */
16
18
  interface PaymentResponse {
@@ -39,4 +41,30 @@ interface PaymentModalProps {
39
41
  */
40
42
  declare function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps): react_jsx_runtime.JSX.Element | null;
41
43
 
42
- export { PaymentModal, type PaymentRequest, type PaymentResponse };
44
+ interface EnhancedPaymentModalProps {
45
+ request: PaymentRequest;
46
+ onComplete: (payment: PaymentResponse) => void;
47
+ onCancel: () => void;
48
+ isOpen: boolean;
49
+ simulation?: boolean;
50
+ description?: string;
51
+ endpoint?: string;
52
+ }
53
+ /**
54
+ * Enhanced Payment Modal Component
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * <EnhancedPaymentModal
59
+ * request={paymentRequest}
60
+ * isOpen={isOpen}
61
+ * onComplete={(payment) => console.log('Paid:', payment.transactionHash)}
62
+ * onCancel={() => setIsOpen(false)}
63
+ * description="Premium API access"
64
+ * endpoint="/api/premium-data"
65
+ * />
66
+ * ```
67
+ */
68
+ declare function EnhancedPaymentModal({ request, onComplete, onCancel, isOpen, simulation, description, endpoint, }: EnhancedPaymentModalProps): react_jsx_runtime.JSX.Element | null;
69
+
70
+ export { EnhancedPaymentModal, PaymentModal, type PaymentRequest, type PaymentResponse };
@@ -11,6 +11,8 @@ interface PaymentRequest {
11
11
  network: string;
12
12
  chainId?: number;
13
13
  recipient: string;
14
+ description?: string;
15
+ endpoint?: string;
14
16
  }
15
17
  /** Payment response after successful payment */
16
18
  interface PaymentResponse {
@@ -39,4 +41,30 @@ interface PaymentModalProps {
39
41
  */
40
42
  declare function PaymentModal({ request, onComplete, onCancel, isOpen }: PaymentModalProps): react_jsx_runtime.JSX.Element | null;
41
43
 
42
- export { PaymentModal, type PaymentRequest, type PaymentResponse };
44
+ interface EnhancedPaymentModalProps {
45
+ request: PaymentRequest;
46
+ onComplete: (payment: PaymentResponse) => void;
47
+ onCancel: () => void;
48
+ isOpen: boolean;
49
+ simulation?: boolean;
50
+ description?: string;
51
+ endpoint?: string;
52
+ }
53
+ /**
54
+ * Enhanced Payment Modal Component
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * <EnhancedPaymentModal
59
+ * request={paymentRequest}
60
+ * isOpen={isOpen}
61
+ * onComplete={(payment) => console.log('Paid:', payment.transactionHash)}
62
+ * onCancel={() => setIsOpen(false)}
63
+ * description="Premium API access"
64
+ * endpoint="/api/premium-data"
65
+ * />
66
+ * ```
67
+ */
68
+ declare function EnhancedPaymentModal({ request, onComplete, onCancel, isOpen, simulation, description, endpoint, }: EnhancedPaymentModalProps): react_jsx_runtime.JSX.Element | null;
69
+
70
+ export { EnhancedPaymentModal, PaymentModal, type PaymentRequest, type PaymentResponse };