coinley-checkout 0.4.1 → 0.4.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,"file":"coinley-checkout.umd.js","sources":["../src/services/walletService.js","../src/services/api.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/context/ThemeContext.jsx","../src/context/CoinleyContext.jsx","../node_modules/qrcode.react/lib/esm/index.js","../src/components/QRCode.jsx","../src/components/PaymentStatus.jsx","../src/components/PaymentMethods.jsx","../src/components/CoinleyModal.jsx","../src/assets/Logo.png","../src/components/CoinleyCheckout.jsx","../src/index.js"],"sourcesContent":["// // src/services/walletService.js \r\n// /**\r\n// * Enhanced wallet service supporting multiple networks and wallets\r\n// */\r\n\r\n// // Network types - ensure these are properly exported\r\n// export const NETWORK_TYPES = {\r\n// ETHEREUM: 'ethereum',\r\n// BSC: 'bsc',\r\n// TRON: 'tron',\r\n// ALGORAND: 'algorand'\r\n// };\r\n \r\n// // Wallet types\r\n// export const WALLET_TYPES = {\r\n// METAMASK: 'metamask',\r\n// TRONLINK: 'tronlink',\r\n// TRUST_WALLET: 'trust_wallet',\r\n// LUTE: 'lute'\r\n// };\r\n \r\n// // Network configurations\r\n// export const NETWORK_CONFIG = {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// chainId: '0x1',\r\n// chainName: 'Ethereum Mainnet',\r\n// nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\r\n// rpcUrls: ['https://mainnet.infura.io/v3/'],\r\n// blockExplorerUrls: ['https://etherscan.io/'],\r\n// supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// chainId: '0x38',\r\n// chainName: 'BNB Smart Chain',\r\n// nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },\r\n// rpcUrls: ['https://bsc-dataseed.binance.org/'],\r\n// blockExplorerUrls: ['https://bscscan.com/'],\r\n// supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n// },\r\n// [NETWORK_TYPES.TRON]: {\r\n// fullHost: 'https://api.trongrid.io',\r\n// explorerUrl: 'https://tronscan.org',\r\n// supportedWallets: [WALLET_TYPES.TRONLINK]\r\n// },\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// network: 'mainnet',\r\n// explorerUrl: 'https://algoexplorer.io',\r\n// supportedWallets: [WALLET_TYPES.LUTE]\r\n// }\r\n// };\r\n \r\n// // Token configurations\r\n// export const TOKEN_CONFIG = {\r\n// USDT: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0x55d398326f99059fF775485246999027B3197955',\r\n// decimals: 18\r\n// },\r\n// [NETWORK_TYPES.TRON]: {\r\n// address: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// address: '312769', // USDT ASA ID on Algorand\r\n// decimals: 6\r\n// }\r\n// },\r\n// USDC: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n// decimals: 18\r\n// },\r\n// [NETWORK_TYPES.TRON]: {\r\n// address: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// address: '31566704', // USDC ASA ID on Algorand\r\n// decimals: 6\r\n// }\r\n// },\r\n// PYUSD: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8',\r\n// decimals: 6\r\n// }\r\n// },\r\n// FRAX: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x853d955aCEf822Db058eb8505911ED77F175b99e',\r\n// decimals: 18\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40',\r\n// decimals: 18\r\n// }\r\n// },\r\n// USDP: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x8E870D67F660D95d5be530380D0eC0bd388289E1',\r\n// decimals: 18\r\n// }\r\n// },\r\n// DAI: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\r\n// decimals: 18\r\n// }\r\n// },\r\n// BUSD: {\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\r\n// decimals: 18\r\n// }\r\n// },\r\n// USDJ: {\r\n// [NETWORK_TYPES.TRON]: {\r\n// address: 'TMwFHYXLJaRUPeW6421aqXL4ZEzPRFGkGT',\r\n// decimals: 18\r\n// }\r\n// },\r\n// ALGO: {\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// address: 'native',\r\n// decimals: 6\r\n// }\r\n// }\r\n// };\r\n \r\n// /**\r\n// * FIXED: Get Web3 instance - remove caching that might cause issues\r\n// */\r\n// const getWeb3Instance = async () => {\r\n// try {\r\n// // For browser environment, use the ethereum provider directly\r\n// if (typeof window !== 'undefined' && window.ethereum) {\r\n// // Use Web3 constructor with ethereum provider\r\n// const Web3Module = await import('web3');\r\n// const Web3 = Web3Module.default || Web3Module.Web3 || Web3Module;\r\n// return new Web3(window.ethereum);\r\n// }\r\n \r\n// throw new Error('No ethereum provider found');\r\n// } catch (error) {\r\n// console.error('Failed to load Web3:', error);\r\n// throw new Error('Web3 is required for blockchain transactions. Please install MetaMask or another Web3 wallet.');\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Wallet detection utilities with better error handling\r\n// */\r\n// export const detectWallets = () => {\r\n// const wallets = {\r\n// [WALLET_TYPES.METAMASK]: false,\r\n// [WALLET_TYPES.TRUST_WALLET]: false,\r\n// [WALLET_TYPES.TRONLINK]: false,\r\n// [WALLET_TYPES.LUTE]: false\r\n// };\r\n \r\n// if (typeof window === 'undefined') {\r\n// return wallets;\r\n// }\r\n \r\n// try {\r\n// // MetaMask detection\r\n// wallets[WALLET_TYPES.METAMASK] = !!(window.ethereum && window.ethereum.isMetaMask);\r\n \r\n// // TronLink detection\r\n// wallets[WALLET_TYPES.TRONLINK] = !!(window.tronWeb);\r\n \r\n// // Trust Wallet detection\r\n// wallets[WALLET_TYPES.TRUST_WALLET] = !!(window.ethereum && window.ethereum.isTrust);\r\n \r\n// // Lute wallet detection (Algorand)\r\n// wallets[WALLET_TYPES.LUTE] = !!(window.algorand && window.algorand.isLute);\r\n// } catch (error) {\r\n// console.warn('Error detecting wallets:', error);\r\n// }\r\n \r\n// return wallets;\r\n// };\r\n \r\n// /**\r\n// * Get supported wallets for a network\r\n// */\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n// const networkConfig = NETWORK_CONFIG[network];\r\n// if (!networkConfig) return [];\r\n \r\n// const availableWallets = detectWallets();\r\n// return networkConfig.supportedWallets.filter(wallet => availableWallets[wallet]);\r\n// };\r\n \r\n// /**\r\n// * Connect to wallet based on type\r\n// */\r\n// export const connectWallet = async (walletType, network) => {\r\n// console.log('connectWallet called with:', { walletType, network });\r\n \r\n// switch (walletType) {\r\n// case WALLET_TYPES.METAMASK:\r\n// return await connectMetaMask(network);\r\n// case WALLET_TYPES.TRONLINK:\r\n// return await connectTronLink();\r\n// case WALLET_TYPES.TRUST_WALLET:\r\n// return await connectTrustWallet(network);\r\n// case WALLET_TYPES.LUTE:\r\n// return await connectLute();\r\n// default:\r\n// throw new Error(`Unsupported wallet type: ${walletType}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * FIXED: MetaMask connection with better error handling and debugging\r\n// */\r\n// const connectMetaMask = async (network) => {\r\n// console.log('Attempting to connect MetaMask for network:', network);\r\n \r\n// if (typeof window === 'undefined' || !window.ethereum) {\r\n// throw new Error('MetaMask is not installed. Please install MetaMask extension.');\r\n// }\r\n\r\n// // Check if MetaMask is the active provider\r\n// if (!window.ethereum.isMetaMask) {\r\n// console.warn('MetaMask not detected as primary provider');\r\n// }\r\n\r\n// try {\r\n// console.log('Requesting accounts from MetaMask...');\r\n \r\n// // Request account access\r\n// const accounts = await window.ethereum.request({\r\n// method: 'eth_requestAccounts'\r\n// });\r\n\r\n// console.log('Accounts received:', accounts);\r\n\r\n// if (!accounts || accounts.length === 0) {\r\n// throw new Error('No accounts found. Please unlock MetaMask and ensure you have at least one account.');\r\n// }\r\n\r\n// // Switch to correct network if needed\r\n// const networkConfig = NETWORK_CONFIG[network];\r\n// if (networkConfig && networkConfig.chainId) {\r\n// console.log('Switching to network:', networkConfig.chainName);\r\n// await switchEVMNetwork(networkConfig);\r\n// }\r\n\r\n// const connection = {\r\n// address: accounts[0],\r\n// network,\r\n// walletType: WALLET_TYPES.METAMASK\r\n// };\r\n\r\n// console.log('MetaMask connected successfully:', connection);\r\n// return connection;\r\n\r\n// } catch (error) {\r\n// console.error('MetaMask connection error:', error);\r\n \r\n// if (error.code === 4001) {\r\n// throw new Error('Connection rejected by user. Please accept the connection request in MetaMask.');\r\n// }\r\n// if (error.code === -32002) {\r\n// throw new Error('Connection request already pending. Please check MetaMask.');\r\n// }\r\n \r\n// throw new Error(`Failed to connect MetaMask: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * TronLink connection with better error handling\r\n// */\r\n// const connectTronLink = async () => {\r\n// if (typeof window === 'undefined' || !window.tronWeb) {\r\n// throw new Error('TronLink is not installed. Please install TronLink extension.');\r\n// }\r\n \r\n// let attempts = 0;\r\n// const maxAttempts = 10;\r\n \r\n// while (!window.tronWeb.ready && attempts < maxAttempts) {\r\n// await new Promise(resolve => setTimeout(resolve, 1000));\r\n// attempts++;\r\n// }\r\n \r\n// if (!window.tronWeb.ready) {\r\n// throw new Error('TronLink is not ready. Please unlock your TronLink wallet and try again.');\r\n// }\r\n \r\n// const address = window.tronWeb.defaultAddress?.base58;\r\n// if (!address) {\r\n// throw new Error('No account found in TronLink. Please make sure you have an account set up.');\r\n// }\r\n \r\n// return {\r\n// address,\r\n// network: NETWORK_TYPES.TRON,\r\n// walletType: WALLET_TYPES.TRONLINK\r\n// };\r\n// };\r\n \r\n// /**\r\n// * Trust Wallet connection\r\n// */\r\n// const connectTrustWallet = async (network) => {\r\n// if (typeof window === 'undefined' || !window.ethereum || !window.ethereum.isTrust) {\r\n// throw new Error('Trust Wallet is not installed. Please install Trust Wallet extension.');\r\n// }\r\n \r\n// try {\r\n// const accounts = await window.ethereum.request({\r\n// method: 'eth_requestAccounts'\r\n// });\r\n \r\n// if (!accounts || accounts.length === 0) {\r\n// throw new Error('No accounts found. Please unlock Trust Wallet.');\r\n// }\r\n \r\n// // Switch to correct network if needed\r\n// const networkConfig = NETWORK_CONFIG[network];\r\n// if (networkConfig && networkConfig.chainId) {\r\n// await switchEVMNetwork(networkConfig);\r\n// }\r\n \r\n// return {\r\n// address: accounts[0],\r\n// network,\r\n// walletType: WALLET_TYPES.TRUST_WALLET\r\n// };\r\n// } catch (error) {\r\n// if (error.code === 4001) {\r\n// throw new Error('User rejected the connection request');\r\n// }\r\n// throw new Error(`Failed to connect Trust Wallet: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Lute (Algorand) connection\r\n// */\r\n// const connectLute = async () => {\r\n// if (typeof window === 'undefined' || !window.algorand || !window.algorand.isLute) {\r\n// throw new Error('Lute wallet is not installed. Please install Lute wallet extension.');\r\n// }\r\n \r\n// try {\r\n// const accounts = await window.algorand.connect();\r\n \r\n// if (!accounts || accounts.length === 0) {\r\n// throw new Error('No accounts found. Please unlock Lute wallet.');\r\n// }\r\n \r\n// return {\r\n// address: accounts[0],\r\n// network: NETWORK_TYPES.ALGORAND,\r\n// walletType: WALLET_TYPES.LUTE\r\n// };\r\n// } catch (error) {\r\n// throw new Error(`Failed to connect Lute wallet: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * FIXED: Switch EVM network with better error handling and user feedback\r\n// */\r\n// const switchEVMNetwork = async (networkConfig) => {\r\n// if (typeof window === 'undefined' || !window.ethereum) {\r\n// throw new Error('Ethereum provider not found');\r\n// }\r\n\r\n// try {\r\n// console.log('Attempting to switch to:', networkConfig.chainName);\r\n \r\n// await window.ethereum.request({\r\n// method: 'wallet_switchEthereumChain',\r\n// params: [{ chainId: networkConfig.chainId }]\r\n// });\r\n \r\n// console.log('Network switched successfully');\r\n \r\n// } catch (switchError) {\r\n// console.error('Network switch error:', switchError);\r\n \r\n// if (switchError.code === 4902) {\r\n// // Network not added, try to add it\r\n// console.log('Network not found, attempting to add:', networkConfig.chainName);\r\n \r\n// try {\r\n// await window.ethereum.request({\r\n// method: 'wallet_addEthereumChain',\r\n// params: [networkConfig]\r\n// });\r\n// console.log('Network added successfully');\r\n// } catch (addError) {\r\n// console.error('Failed to add network:', addError);\r\n// throw new Error(`Failed to add ${networkConfig.chainName} to wallet. Please add it manually.`);\r\n// }\r\n// } else if (switchError.code === 4001) {\r\n// throw new Error('User rejected network switch request. Please switch network manually in MetaMask.');\r\n// } else {\r\n// throw new Error(`Failed to switch to ${networkConfig.chainName}. Please switch manually in MetaMask.`);\r\n// }\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Send transaction based on wallet and network\r\n// */\r\n// export const sendTransaction = async (walletConnection, transactionData) => {\r\n// const { walletType, network, address } = walletConnection;\r\n// const { to, amount, tokenAddress, tokenDecimals } = transactionData;\r\n \r\n// switch (walletType) {\r\n// case WALLET_TYPES.METAMASK:\r\n// case WALLET_TYPES.TRUST_WALLET:\r\n// return await sendEVMTransaction(address, to, amount, tokenAddress, tokenDecimals);\r\n// case WALLET_TYPES.TRONLINK:\r\n// return await sendTronTransaction(to, amount, tokenAddress, tokenDecimals);\r\n// case WALLET_TYPES.LUTE:\r\n// return await sendAlgorandTransaction(address, to, amount);\r\n// default:\r\n// throw new Error(`Unsupported wallet type: ${walletType}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * EVM transaction with better error handling\r\n// */\r\n// const sendEVMTransaction = async (from, to, amount, tokenAddress, tokenDecimals) => {\r\n// if (typeof window === 'undefined' || !window.ethereum) {\r\n// throw new Error('Ethereum provider not found');\r\n// }\r\n \r\n// try {\r\n// const Web3 = await getWeb3Instance();\r\n// const web3 = new Web3(window.ethereum);\r\n \r\n// const amountInWei = web3.utils.toBN(\r\n// Math.floor(parseFloat(amount) * Math.pow(10, tokenDecimals || 18))\r\n// );\r\n \r\n// if (tokenAddress && tokenAddress !== 'native') {\r\n// // ERC20 token transfer\r\n// const tokenABI = [\r\n// {\r\n// constant: false,\r\n// inputs: [\r\n// { name: '_to', type: 'address' },\r\n// { name: '_value', type: 'uint256' }\r\n// ],\r\n// name: 'transfer',\r\n// outputs: [{ name: '', type: 'bool' }],\r\n// payable: false,\r\n// stateMutability: 'nonpayable',\r\n// type: 'function'\r\n// }\r\n// ];\r\n \r\n// const contract = new web3.eth.Contract(tokenABI, tokenAddress);\r\n// const receipt = await contract.methods\r\n// .transfer(to, amountInWei)\r\n// .send({ from });\r\n \r\n// return receipt.transactionHash;\r\n// } else {\r\n// // Native token transfer\r\n// const receipt = await web3.eth.sendTransaction({\r\n// from,\r\n// to,\r\n// value: amountInWei\r\n// });\r\n \r\n// return receipt.transactionHash;\r\n// }\r\n// } catch (error) {\r\n// if (error.code === 4001) {\r\n// throw new Error('Transaction was rejected by user');\r\n// }\r\n// throw new Error(`Transaction failed: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Tron transaction with better error handling\r\n// */\r\n// const sendTronTransaction = async (to, amount, tokenAddress, tokenDecimals) => {\r\n// if (typeof window === 'undefined' || !window.tronWeb || !window.tronWeb.ready) {\r\n// throw new Error('TronLink is not ready');\r\n// }\r\n \r\n// try {\r\n// const amountInSun = Math.floor(parseFloat(amount) * Math.pow(10, tokenDecimals || 6));\r\n \r\n// if (tokenAddress && tokenAddress !== 'native') {\r\n// // TRC20 token transfer\r\n// const contract = await window.tronWeb.contract().at(tokenAddress);\r\n// const result = await contract.transfer(to, amountInSun).send({\r\n// feeLimit: 100000000,\r\n// callValue: 0\r\n// });\r\n \r\n// return result;\r\n// } else {\r\n// // Native TRX transfer\r\n// const result = await window.tronWeb.trx.sendTransaction(to, amountInSun);\r\n// return result.txid;\r\n// }\r\n// } catch (error) {\r\n// throw new Error(`TRON transaction failed: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Algorand transaction\r\n// */\r\n// const sendAlgorandTransaction = async (from, to, amount) => {\r\n// if (typeof window === 'undefined' || !window.algorand) {\r\n// throw new Error('Algorand wallet is not available');\r\n// }\r\n \r\n// try {\r\n// const microAlgos = Math.floor(parseFloat(amount) * 1000000);\r\n \r\n// const txn = {\r\n// from,\r\n// to,\r\n// amount: microAlgos,\r\n// type: 'pay'\r\n// };\r\n \r\n// const signedTxn = await window.algorand.signTransaction(txn);\r\n// const result = await window.algorand.sendTransaction(signedTxn);\r\n \r\n// return result.txId;\r\n// } catch (error) {\r\n// throw new Error(`Algorand transaction failed: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Get wallet install URLs\r\n// */\r\n// export const getWalletInstallUrl = (walletType) => {\r\n// const urls = {\r\n// [WALLET_TYPES.METAMASK]: 'https://metamask.io/',\r\n// [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/',\r\n// [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/',\r\n// [WALLET_TYPES.LUTE]: 'https://lute.app/'\r\n// };\r\n \r\n// return urls[walletType] || '';\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/services/walletService.js - ALTERNATIVE VERSION WITHOUT WEB3\r\n/**\r\n * Enhanced wallet service using native browser APIs instead of Web3\r\n */\r\n\r\n// Network types - ensure these are properly exported\r\nexport const NETWORK_TYPES = {\r\n ETHEREUM: 'ethereum',\r\n BSC: 'bsc',\r\n TRON: 'tron',\r\n ALGORAND: 'algorand'\r\n };\r\n \r\n // Wallet types\r\n export const WALLET_TYPES = {\r\n METAMASK: 'metamask',\r\n TRONLINK: 'tronlink',\r\n TRUST_WALLET: 'trust_wallet',\r\n LUTE: 'lute'\r\n };\r\n \r\n // Network configurations\r\n export const NETWORK_CONFIG = {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n chainId: '0x1',\r\n chainName: 'Ethereum Mainnet',\r\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\r\n rpcUrls: ['https://mainnet.infura.io/v3/'],\r\n blockExplorerUrls: ['https://etherscan.io/'],\r\n supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n chainId: '0x38',\r\n chainName: 'BNB Smart Chain',\r\n nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },\r\n rpcUrls: ['https://bsc-dataseed.binance.org/'],\r\n blockExplorerUrls: ['https://bscscan.com/'],\r\n supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n },\r\n [NETWORK_TYPES.TRON]: {\r\n fullHost: 'https://api.trongrid.io',\r\n explorerUrl: 'https://tronscan.org',\r\n supportedWallets: [WALLET_TYPES.TRONLINK]\r\n },\r\n [NETWORK_TYPES.ALGORAND]: {\r\n network: 'mainnet',\r\n explorerUrl: 'https://algoexplorer.io',\r\n supportedWallets: [WALLET_TYPES.LUTE]\r\n }\r\n };\r\n \r\n // Token configurations\r\n export const TOKEN_CONFIG = {\r\n USDT: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0x55d398326f99059fF775485246999027B3197955',\r\n decimals: 18\r\n },\r\n [NETWORK_TYPES.TRON]: {\r\n address: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.ALGORAND]: {\r\n address: '312769',\r\n decimals: 6\r\n }\r\n },\r\n USDC: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n decimals: 18\r\n },\r\n [NETWORK_TYPES.TRON]: {\r\n address: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.ALGORAND]: {\r\n address: '31566704',\r\n decimals: 6\r\n }\r\n },\r\n PYUSD: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8',\r\n decimals: 6\r\n }\r\n },\r\n FRAX: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x853d955aCEf822Db058eb8505911ED77F175b99e',\r\n decimals: 18\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40',\r\n decimals: 18\r\n }\r\n },\r\n USDP: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x8E870D67F660D95d5be530380D0eC0bd388289E1',\r\n decimals: 18\r\n }\r\n },\r\n DAI: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\r\n decimals: 18\r\n }\r\n },\r\n BUSD: {\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\r\n decimals: 18\r\n }\r\n },\r\n USDJ: {\r\n [NETWORK_TYPES.TRON]: {\r\n address: 'TMwFHYXLJaRUPeW6421aqXL4ZEzPRFGkGT',\r\n decimals: 18\r\n }\r\n },\r\n ALGO: {\r\n [NETWORK_TYPES.ALGORAND]: {\r\n address: 'native',\r\n decimals: 6\r\n }\r\n }\r\n };\r\n \r\n /**\r\n * Utility function to convert number to hex with proper padding\r\n */\r\n const toHex = (num) => {\r\n return '0x' + Math.floor(parseFloat(num) * Math.pow(10, 18)).toString(16);\r\n };\r\n \r\n /**\r\n * IMPROVED: Utility function to calculate token amount with proper decimal handling\r\n */\r\n const calculateTokenAmount = (amount, decimals) => {\r\n console.log('calculateTokenAmount called with:', { amount, decimals });\r\n \r\n // Ensure we have valid inputs\r\n const tokenDecimals = parseInt(decimals) || 18;\r\n const amountNum = parseFloat(amount);\r\n \r\n if (isNaN(amountNum) || amountNum <= 0) {\r\n throw new Error(`Invalid amount: ${amount}`);\r\n }\r\n \r\n // Calculate the multiplier based on decimals\r\n const multiplier = Math.pow(10, tokenDecimals);\r\n const amountInSmallestUnit = Math.floor(amountNum * multiplier);\r\n \r\n // Convert to hex\r\n const hexAmount = '0x' + amountInSmallestUnit.toString(16);\r\n \r\n console.log('Amount calculation:', {\r\n originalAmount: amount,\r\n decimals: tokenDecimals,\r\n multiplier: multiplier,\r\n calculatedAmount: amountInSmallestUnit,\r\n hexAmount: hexAmount\r\n });\r\n \r\n return hexAmount;\r\n };\r\n \r\n /**\r\n * IMPROVED: Get token configuration with validation\r\n */\r\n const getTokenConfig = (currency, network) => {\r\n console.log('getTokenConfig called with:', { currency, network });\r\n \r\n const tokenConfig = TOKEN_CONFIG[currency];\r\n if (!tokenConfig) {\r\n throw new Error(`Unsupported currency: ${currency}`);\r\n }\r\n \r\n const networkConfig = tokenConfig[network];\r\n if (!networkConfig) {\r\n throw new Error(`Currency ${currency} not supported on network ${network}`);\r\n }\r\n \r\n console.log('Token config found:', networkConfig);\r\n return networkConfig;\r\n };\r\n \r\n /**\r\n * ENHANCED: Wallet detection with multiple detection methods and delays\r\n */\r\n export const detectWallets = () => {\r\n const wallets = {\r\n [WALLET_TYPES.METAMASK]: false,\r\n [WALLET_TYPES.TRUST_WALLET]: false,\r\n [WALLET_TYPES.TRONLINK]: false,\r\n [WALLET_TYPES.LUTE]: false\r\n };\r\n \r\n if (typeof window === 'undefined') {\r\n return wallets;\r\n }\r\n \r\n try {\r\n console.log('=== ENHANCED WALLET DETECTION DEBUG ===');\r\n \r\n // MetaMask detection - enhanced\r\n if (window.ethereum) {\r\n // Check direct MetaMask\r\n if (window.ethereum.isMetaMask) {\r\n wallets[WALLET_TYPES.METAMASK] = true;\r\n console.log('✅ MetaMask detected via direct isMetaMask');\r\n }\r\n \r\n // Check in providers array\r\n if (window.ethereum.providers && Array.isArray(window.ethereum.providers)) {\r\n const metamaskProvider = window.ethereum.providers.find(p => p.isMetaMask);\r\n if (metamaskProvider) {\r\n wallets[WALLET_TYPES.METAMASK] = true;\r\n console.log('✅ MetaMask detected via providers array');\r\n }\r\n }\r\n }\r\n \r\n // Trust Wallet detection - ENHANCED with multiple methods\r\n if (window.ethereum) {\r\n // Method 1: Direct Trust Wallet detection\r\n if (window.ethereum.isTrust || window.ethereum.isTrustWallet) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via direct property');\r\n }\r\n \r\n // Method 2: Check for Trust Wallet in providers\r\n if (window.ethereum.providers && Array.isArray(window.ethereum.providers)) {\r\n const trustProvider = window.ethereum.providers.find(p => \r\n p.isTrust || p.isTrustWallet || \r\n (p.constructor && p.constructor.name === 'TrustWallet')\r\n );\r\n if (trustProvider) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via providers array');\r\n }\r\n }\r\n \r\n // Method 3: Check user agent for Trust Wallet mobile\r\n if (navigator.userAgent && navigator.userAgent.includes('Trust')) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via user agent');\r\n }\r\n \r\n // Method 4: Check for Trust Wallet specific methods\r\n if (window.ethereum.isTrustWallet || window.trustwallet) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via specific methods');\r\n }\r\n }\r\n \r\n // TronLink detection - ENHANCED with multiple methods\r\n // Method 1: Standard tronWeb detection\r\n if (window.tronWeb && window.tronWeb.defaultAddress) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via tronWeb');\r\n }\r\n \r\n // Method 2: Check for tronLink object\r\n if (window.tronLink) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via tronLink object');\r\n }\r\n \r\n // Method 3: Check for tron object\r\n if (window.tron) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via tron object');\r\n }\r\n \r\n // Method 4: Check for TronLink specific properties\r\n if (window.tronWeb && (window.tronWeb.ready || window.tronWeb.installed)) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via ready/installed properties');\r\n }\r\n \r\n // Lute wallet detection (Algorand) - enhanced\r\n if (window.algorand) {\r\n if (window.algorand.isLute) {\r\n wallets[WALLET_TYPES.LUTE] = true;\r\n console.log('✅ Lute Wallet detected via algorand.isLute');\r\n } else {\r\n // Fallback detection for Algorand wallets\r\n wallets[WALLET_TYPES.LUTE] = true;\r\n console.log('✅ Algorand wallet detected (assuming Lute)');\r\n }\r\n }\r\n \r\n // Additional checks for mobile apps\r\n if (window.navigator && window.navigator.userAgent) {\r\n const userAgent = window.navigator.userAgent.toLowerCase();\r\n \r\n if (userAgent.includes('trustwallet')) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via mobile user agent');\r\n }\r\n \r\n if (userAgent.includes('tronlink')) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via mobile user agent');\r\n }\r\n }\r\n \r\n console.log('Final wallet detection results:', wallets);\r\n console.log('=== END ENHANCED WALLET DETECTION DEBUG ===');\r\n \r\n } catch (error) {\r\n console.warn('Error detecting wallets:', error);\r\n }\r\n \r\n return wallets;\r\n };\r\n\r\n /**\r\n * ENHANCED: Detect wallets with retry mechanism (for wallets that load slowly)\r\n */\r\n export const detectWalletsWithRetry = async (maxRetries = 3, delay = 1000) => {\r\n let wallets = detectWallets();\r\n let attempts = 0;\r\n \r\n while (attempts < maxRetries) {\r\n // If we found all expected wallets, return early\r\n if (wallets[WALLET_TYPES.METAMASK] && wallets[WALLET_TYPES.TRUST_WALLET] && wallets[WALLET_TYPES.TRONLINK]) {\r\n break;\r\n }\r\n \r\n // Wait before retrying\r\n if (attempts > 0) {\r\n console.log(`Retrying wallet detection (attempt ${attempts + 1}/${maxRetries})...`);\r\n await new Promise(resolve => setTimeout(resolve, delay));\r\n }\r\n \r\n wallets = detectWallets();\r\n attempts++;\r\n }\r\n \r\n return wallets;\r\n };\r\n \r\n /**\r\n * DEBUG: Function to check what wallet objects are available\r\n * Call this in your browser console: checkWalletObjects()\r\n */\r\n export const checkWalletObjects = () => {\r\n console.log('=== COMPREHENSIVE WALLET OBJECT CHECK ===');\r\n \r\n // Ethereum-based wallets\r\n console.log('🔍 Ethereum Provider Objects:');\r\n console.log('window.ethereum:', window.ethereum);\r\n console.log('window.ethereum?.isMetaMask:', window.ethereum?.isMetaMask);\r\n console.log('window.ethereum?.isTrust:', window.ethereum?.isTrust);\r\n console.log('window.ethereum?.isTrustWallet:', window.ethereum?.isTrustWallet);\r\n console.log('window.ethereum?.providers:', window.ethereum?.providers);\r\n \r\n if (window.ethereum?.providers) {\r\n console.log('Provider details:');\r\n window.ethereum.providers.forEach((provider, index) => {\r\n console.log(`Provider ${index}:`, {\r\n isMetaMask: provider.isMetaMask,\r\n isTrust: provider.isTrust,\r\n isTrustWallet: provider.isTrustWallet,\r\n provider: provider\r\n });\r\n });\r\n }\r\n \r\n // Trust Wallet specific\r\n console.log('🔍 Trust Wallet Objects:');\r\n console.log('window.trustwallet:', window.trustwallet);\r\n console.log('window.trustWallet:', window.trustWallet);\r\n \r\n // Tron-based wallets\r\n console.log('🔍 Tron Objects:');\r\n console.log('window.tronWeb:', window.tronWeb);\r\n console.log('window.tronLink:', window.tronLink);\r\n console.log('window.tron:', window.tron);\r\n \r\n // Algorand wallets\r\n console.log('🔍 Algorand Objects:');\r\n console.log('window.algorand:', window.algorand);\r\n console.log('window.algorand?.isLute:', window.algorand?.isLute);\r\n \r\n // Other common wallet objects\r\n console.log('🔍 Other Wallet Objects:');\r\n console.log('window.web3:', window.web3);\r\n console.log('window.Web3:', window.Web3);\r\n \r\n console.log('=== END COMPREHENSIVE CHECK ===');\r\n \r\n // Return current detection results\r\n return detectWallets();\r\n };\r\n \r\n /**\r\n * Get supported wallets for a network\r\n */\r\n export const getSupportedWalletsForNetwork = (network) => {\r\n const networkConfig = NETWORK_CONFIG[network];\r\n if (!networkConfig) return [];\r\n \r\n const availableWallets = detectWallets();\r\n return networkConfig.supportedWallets.filter(wallet => availableWallets[wallet]);\r\n };\r\n \r\n /**\r\n * Connect to wallet based on type\r\n */\r\n export const connectWallet = async (walletType, network) => {\r\n console.log('connectWallet called with:', { walletType, network });\r\n \r\n switch (walletType) {\r\n case WALLET_TYPES.METAMASK:\r\n return await connectMetaMask(network);\r\n case WALLET_TYPES.TRONLINK:\r\n return await connectTronLink();\r\n case WALLET_TYPES.TRUST_WALLET:\r\n return await connectTrustWallet(network);\r\n case WALLET_TYPES.LUTE:\r\n return await connectLute();\r\n default:\r\n throw new Error(`Unsupported wallet type: ${walletType}`);\r\n }\r\n };\r\n \r\n /**\r\n * MetaMask connection\r\n */\r\n const connectMetaMask = async (network) => {\r\n console.log('Attempting to connect MetaMask for network:', network);\r\n \r\n if (typeof window === 'undefined' || !window.ethereum) {\r\n throw new Error('MetaMask is not installed. Please install MetaMask extension.');\r\n }\r\n\r\n try {\r\n console.log('Requesting accounts from MetaMask...');\r\n \r\n const accounts = await window.ethereum.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n\r\n console.log('Accounts received:', accounts);\r\n\r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found. Please unlock MetaMask.');\r\n }\r\n\r\n // Switch to correct network if needed\r\n const networkConfig = NETWORK_CONFIG[network];\r\n if (networkConfig && networkConfig.chainId) {\r\n console.log('Switching to network:', networkConfig.chainName);\r\n await switchEVMNetwork(networkConfig);\r\n }\r\n\r\n const connection = {\r\n address: accounts[0],\r\n network,\r\n walletType: WALLET_TYPES.METAMASK\r\n };\r\n\r\n console.log('MetaMask connected successfully:', connection);\r\n return connection;\r\n\r\n } catch (error) {\r\n console.error('MetaMask connection error:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Connection rejected by user.');\r\n }\r\n if (error.code === -32002) {\r\n throw new Error('Connection request pending. Please check MetaMask.');\r\n }\r\n \r\n throw new Error(`Failed to connect MetaMask: ${error.message}`);\r\n }\r\n };\r\n \r\n /**\r\n * TronLink connection\r\n */\r\n const connectTronLink = async () => {\r\n if (typeof window === 'undefined' || !window.tronWeb) {\r\n throw new Error('TronLink is not installed.');\r\n }\r\n \r\n let attempts = 0;\r\n const maxAttempts = 10;\r\n \r\n while (!window.tronWeb.ready && attempts < maxAttempts) {\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n attempts++;\r\n }\r\n \r\n if (!window.tronWeb.ready) {\r\n throw new Error('TronLink is not ready. Please unlock your wallet.');\r\n }\r\n \r\n const address = window.tronWeb.defaultAddress?.base58;\r\n if (!address) {\r\n throw new Error('No account found in TronLink.');\r\n }\r\n \r\n return {\r\n address,\r\n network: NETWORK_TYPES.TRON,\r\n walletType: WALLET_TYPES.TRONLINK\r\n };\r\n };\r\n \r\n /**\r\n * Trust Wallet connection\r\n */\r\n const connectTrustWallet = async (network) => {\r\n if (typeof window === 'undefined' || !window.ethereum || !window.ethereum.isTrust) {\r\n throw new Error('Trust Wallet is not installed.');\r\n }\r\n \r\n try {\r\n const accounts = await window.ethereum.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n \r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found. Please unlock Trust Wallet.');\r\n }\r\n \r\n const networkConfig = NETWORK_CONFIG[network];\r\n if (networkConfig && networkConfig.chainId) {\r\n await switchEVMNetwork(networkConfig);\r\n }\r\n \r\n return {\r\n address: accounts[0],\r\n network,\r\n walletType: WALLET_TYPES.TRUST_WALLET\r\n };\r\n } catch (error) {\r\n if (error.code === 4001) {\r\n throw new Error('User rejected the connection request');\r\n }\r\n throw new Error(`Failed to connect Trust Wallet: ${error.message}`);\r\n }\r\n };\r\n \r\n /**\r\n * Lute connection\r\n */\r\n const connectLute = async () => {\r\n if (typeof window === 'undefined' || !window.algorand || !window.algorand.isLute) {\r\n throw new Error('Lute wallet is not installed.');\r\n }\r\n \r\n try {\r\n const accounts = await window.algorand.connect();\r\n \r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found. Please unlock Lute wallet.');\r\n }\r\n \r\n return {\r\n address: accounts[0],\r\n network: NETWORK_TYPES.ALGORAND,\r\n walletType: WALLET_TYPES.LUTE\r\n };\r\n } catch (error) {\r\n throw new Error(`Failed to connect Lute wallet: ${error.message}`);\r\n }\r\n };\r\n \r\n /**\r\n * Switch EVM network\r\n */\r\n const switchEVMNetwork = async (networkConfig) => {\r\n if (typeof window === 'undefined' || !window.ethereum) {\r\n throw new Error('Ethereum provider not found');\r\n }\r\n\r\n try {\r\n console.log('Attempting to switch to:', networkConfig.chainName);\r\n \r\n await window.ethereum.request({\r\n method: 'wallet_switchEthereumChain',\r\n params: [{ chainId: networkConfig.chainId }]\r\n });\r\n \r\n console.log('Network switched successfully');\r\n \r\n } catch (switchError) {\r\n console.error('Network switch error:', switchError);\r\n \r\n if (switchError.code === 4902) {\r\n try {\r\n await window.ethereum.request({\r\n method: 'wallet_addEthereumChain',\r\n params: [networkConfig]\r\n });\r\n console.log('Network added successfully');\r\n } catch (addError) {\r\n throw new Error(`Failed to add ${networkConfig.chainName} to wallet.`);\r\n }\r\n } else if (switchError.code === 4001) {\r\n throw new Error('User rejected network switch request.');\r\n } else {\r\n throw new Error(`Failed to switch to ${networkConfig.chainName}.`);\r\n }\r\n }\r\n };\r\n \r\n /**\r\n * IMPROVED: Send transaction with proper currency and network context\r\n */\r\n export const sendTransaction = async (walletConnection, transactionData) => {\r\n const { walletType, network, address } = walletConnection;\r\n const { to, amount, tokenAddress, tokenDecimals, currency } = transactionData;\r\n \r\n console.log('sendTransaction called with:', { walletConnection, transactionData });\r\n \r\n switch (walletType) {\r\n case WALLET_TYPES.METAMASK:\r\n case WALLET_TYPES.TRUST_WALLET:\r\n return await sendEVMTransactionNative(\r\n address, \r\n to, \r\n amount, \r\n tokenAddress, \r\n tokenDecimals, \r\n currency, \r\n network\r\n );\r\n case WALLET_TYPES.TRONLINK:\r\n return await sendTronTransaction(to, amount, tokenAddress, tokenDecimals);\r\n case WALLET_TYPES.LUTE:\r\n return await sendAlgorandTransaction(address, to, amount);\r\n default:\r\n throw new Error(`Unsupported wallet type: ${walletType}`);\r\n }\r\n };\r\n \r\n /**\r\n * IMPROVED: EVM transaction with proper token configuration lookup\r\n */\r\n const sendEVMTransactionNative = async (from, to, amount, tokenAddress, tokenDecimals, currency, network) => {\r\n console.log('sendEVMTransactionNative called with:', { \r\n from, to, amount, tokenAddress, tokenDecimals, currency, network \r\n });\r\n \r\n if (typeof window === 'undefined' || !window.ethereum) {\r\n throw new Error('Ethereum provider not found');\r\n }\r\n \r\n try {\r\n // Get proper token configuration if currency and network are provided\r\n let actualTokenAddress = tokenAddress;\r\n let actualDecimals = tokenDecimals;\r\n \r\n if (currency && network) {\r\n try {\r\n const tokenConfig = getTokenConfig(currency, network);\r\n actualTokenAddress = tokenConfig.address;\r\n actualDecimals = tokenConfig.decimals;\r\n \r\n console.log('Using token config:', {\r\n currency,\r\n network,\r\n address: actualTokenAddress,\r\n decimals: actualDecimals\r\n });\r\n } catch (configError) {\r\n console.warn('Could not get token config, using provided values:', configError.message);\r\n // Fall back to provided values\r\n }\r\n }\r\n \r\n if (actualTokenAddress && actualTokenAddress !== 'native') {\r\n // ERC20 token transfer using native ethereum.request\r\n console.log('Preparing ERC20 token transfer...');\r\n \r\n const decimals = actualDecimals || 18;\r\n const amountHex = calculateTokenAmount(amount, decimals);\r\n \r\n // ERC20 transfer function signature: transfer(address,uint256)\r\n const transferMethodId = '0xa9059cbb';\r\n \r\n // Pad the recipient address (remove 0x prefix and pad to 64 characters)\r\n const paddedToAddress = to.replace('0x', '').toLowerCase().padStart(64, '0');\r\n \r\n // Pad the amount (remove 0x prefix and pad to 64 characters)\r\n const paddedAmount = amountHex.replace('0x', '').padStart(64, '0');\r\n \r\n // Combine method ID + padded address + padded amount\r\n const data = transferMethodId + paddedToAddress + paddedAmount;\r\n \r\n console.log('ERC20 transaction details:', { \r\n currency,\r\n tokenAddress: actualTokenAddress,\r\n decimals,\r\n amountHex, \r\n transferMethodId,\r\n paddedToAddress,\r\n paddedAmount,\r\n data \r\n });\r\n \r\n const txHash = await window.ethereum.request({\r\n method: 'eth_sendTransaction',\r\n params: [{\r\n from: from,\r\n to: actualTokenAddress, // Send to token contract\r\n data: data,\r\n gas: '0x15F90', // 90000 gas limit for token transfers\r\n }]\r\n });\r\n \r\n console.log('ERC20 transaction successful:', txHash);\r\n return txHash;\r\n } else {\r\n // Native token transfer (ETH/BNB)\r\n console.log('Preparing native token transfer...');\r\n \r\n const amountHex = toHex(amount);\r\n console.log('Native transaction amount:', { amount, amountHex });\r\n \r\n const txHash = await window.ethereum.request({\r\n method: 'eth_sendTransaction',\r\n params: [{\r\n from: from,\r\n to: to,\r\n value: amountHex,\r\n gas: '0x5208', // 21000 gas limit for simple transfer\r\n }]\r\n });\r\n \r\n console.log('Native transaction successful:', txHash);\r\n return txHash;\r\n }\r\n } catch (error) {\r\n console.error('EVM transaction error:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Transaction was rejected by user');\r\n }\r\n if (error.message && error.message.includes('insufficient funds')) {\r\n throw new Error('Insufficient balance to complete the transaction');\r\n }\r\n if (error.message && error.message.includes('gas')) {\r\n throw new Error('Transaction failed due to gas estimation issues. Please try again.');\r\n }\r\n \r\n throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n }\r\n };\r\n \r\n /**\r\n * Tron transaction\r\n */\r\n const sendTronTransaction = async (to, amount, tokenAddress, tokenDecimals) => {\r\n if (typeof window === 'undefined' || !window.tronWeb || !window.tronWeb.ready) {\r\n throw new Error('TronLink is not ready');\r\n }\r\n \r\n try {\r\n const amountInSun = Math.floor(parseFloat(amount) * Math.pow(10, tokenDecimals || 6));\r\n \r\n if (tokenAddress && tokenAddress !== 'native') {\r\n const contract = await window.tronWeb.contract().at(tokenAddress);\r\n const result = await contract.transfer(to, amountInSun).send({\r\n feeLimit: 100000000,\r\n callValue: 0\r\n });\r\n return result;\r\n } else {\r\n const result = await window.tronWeb.trx.sendTransaction(to, amountInSun);\r\n return result.txid;\r\n }\r\n } catch (error) {\r\n throw new Error(`TRON transaction failed: ${error.message}`);\r\n }\r\n };\r\n \r\n /**\r\n * Algorand transaction\r\n */\r\n const sendAlgorandTransaction = async (from, to, amount) => {\r\n if (typeof window === 'undefined' || !window.algorand) {\r\n throw new Error('Algorand wallet is not available');\r\n }\r\n \r\n try {\r\n const microAlgos = Math.floor(parseFloat(amount) * 1000000);\r\n \r\n const txn = {\r\n from,\r\n to,\r\n amount: microAlgos,\r\n type: 'pay'\r\n };\r\n \r\n const signedTxn = await window.algorand.signTransaction(txn);\r\n const result = await window.algorand.sendTransaction(signedTxn);\r\n \r\n return result.txId;\r\n } catch (error) {\r\n throw new Error(`Algorand transaction failed: ${error.message}`);\r\n }\r\n };\r\n \r\n /**\r\n * Get wallet install URLs\r\n */\r\n export const getWalletInstallUrl = (walletType) => {\r\n const urls = {\r\n [WALLET_TYPES.METAMASK]: 'https://metamask.io/',\r\n [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/',\r\n [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/',\r\n [WALLET_TYPES.LUTE]: 'https://lute.app/'\r\n };\r\n \r\n return urls[walletType] || '';\r\n };","// src/services/api.js\r\nlet apiConfig = {\r\n apiKey: null,\r\n apiSecret: null,\r\n apiUrl: 'http://localhost:9000',\r\n merchantWalletAddresses: {} // Changed to object for multi-network support\r\n};\r\n\r\n/**\r\n * Initialize the API with configuration\r\n * @param {Object} config - API configuration\r\n */\r\nexport const initializeApi = (config) => {\r\n apiConfig = { ...apiConfig, ...config };\r\n console.log('API initialized with:', {\r\n apiUrl: apiConfig.apiUrl,\r\n apiKey: apiConfig.apiKey ? `${apiConfig.apiKey.substring(0, 6)}...` : null,\r\n hasWalletAddresses: Object.keys(apiConfig.merchantWalletAddresses || {}).length > 0\r\n });\r\n};\r\n\r\n/**\r\n * Generate headers with authentication\r\n * @returns {Object} - Headers object with authentication\r\n */\r\nconst getHeaders = () => {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': apiConfig.apiKey,\r\n 'x-api-secret': apiConfig.apiSecret\r\n };\r\n};\r\n\r\n/**\r\n * Create a new payment\r\n * @param {Object} paymentData - Payment data\r\n * @returns {Promise} - Promise resolving to payment details\r\n */\r\nexport const createPayment = async (paymentData) => {\r\n try {\r\n console.log('Creating payment with data:', paymentData);\r\n console.log('API URL:', `${apiConfig.apiUrl}/api/payments/create`);\r\n \r\n // Enhance payment data with merchant wallet addresses\r\n const enhancedPaymentData = { \r\n ...paymentData,\r\n merchantWalletAddresses: {\r\n ...apiConfig.merchantWalletAddresses,\r\n ...paymentData.merchantWalletAddresses\r\n }\r\n };\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/create`, {\r\n method: 'POST',\r\n headers: getHeaders(),\r\n body: JSON.stringify(enhancedPaymentData)\r\n });\r\n\r\n console.log('Create payment response status:', response.status);\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n console.error('Error creating payment:', errorData);\r\n throw new Error(errorData.error || `Failed to create payment: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('Create payment response data:', data);\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Create payment error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get payment details by ID\r\n * @param {string} paymentId - Payment ID\r\n * @returns {Promise} - Promise resolving to payment details\r\n */\r\nexport const getPayment = async (paymentId) => {\r\n try {\r\n console.log('Getting payment:', paymentId);\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/${paymentId}`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n console.error('Error getting payment:', errorData);\r\n throw new Error(errorData.error || `Failed to get payment: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('Get payment response:', data);\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Get payment error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Process a payment\r\n * @param {Object} processData - Payment process data\r\n * @returns {Promise} - Promise resolving to processed payment details\r\n */\r\nexport const processPayment = async (processData) => {\r\n try {\r\n console.log('Processing payment with data:', processData);\r\n console.log('API URL:', `${apiConfig.apiUrl}/api/payments/process`);\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/process`, {\r\n method: 'POST',\r\n headers: getHeaders(),\r\n body: JSON.stringify(processData)\r\n });\r\n\r\n console.log('Process payment response status:', response.status);\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n console.error('Error processing payment:', errorData);\r\n throw new Error(errorData.error || `Failed to process payment: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('Process payment response data:', data);\r\n return data;\r\n } catch (error) {\r\n console.error('Process payment error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get supported networks and tokens\r\n * @returns {Promise} - Promise resolving to supported networks and tokens\r\n */\r\nexport const getSupportedNetworks = async () => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/networks`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n throw new Error(errorData.error || `Failed to get networks: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Get supported networks error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get merchant profile including wallet addresses\r\n * @returns {Promise} - Promise resolving to merchant profile\r\n */\r\nexport const getMerchantProfile = async () => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/merchants/profile`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n throw new Error(errorData.error || `Failed to get merchant profile: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n \r\n // Update apiConfig with retrieved addresses\r\n if (data.merchant && data.merchant.walletAddresses) {\r\n apiConfig.merchantWalletAddresses = {\r\n ...apiConfig.merchantWalletAddresses,\r\n ...data.merchant.walletAddresses\r\n };\r\n }\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Get merchant profile error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get merchant payments with filters\r\n * @param {Object} options - Filter options\r\n * @returns {Promise} - Promise resolving to payments list\r\n */\r\nexport const getMerchantPayments = async (options = {}) => {\r\n try {\r\n const queryParams = new URLSearchParams();\r\n \r\n Object.entries(options).forEach(([key, value]) => {\r\n if (value !== null && value !== undefined) {\r\n queryParams.append(key, value);\r\n }\r\n });\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments?${queryParams}`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n throw new Error(errorData.error || `Failed to get payments: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Get merchant payments error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get payment statistics\r\n * @returns {Promise} - Promise resolving to payment statistics\r\n */\r\nexport const getMerchantPaymentStats = async () => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/stats`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n throw new Error(errorData.error || `Failed to get payment stats: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Get payment stats error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Validate wallet address for specific network\r\n * @param {string} address - Wallet address to validate\r\n * @param {string} network - Network type\r\n * @returns {Promise} - Promise resolving to validation result\r\n */\r\nexport const validateWalletAddress = async (address, network) => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/wallets/validate`, {\r\n method: 'POST',\r\n headers: getHeaders(),\r\n body: JSON.stringify({ address, network })\r\n });\r\n \r\n if (!response.ok) {\r\n const errorData = await response.json();\r\n throw new Error(errorData.error || `Failed to validate address: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Validate wallet address error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Generate mock transaction hash for testing\r\n * @param {string} network - Network type\r\n * @returns {string} - Mock transaction hash\r\n */\r\nexport const generateMockTransactionHash = (network = 'ethereum') => {\r\n const prefixes = {\r\n ethereum: '0x',\r\n bsc: '0x',\r\n tron: '',\r\n algorand: ''\r\n };\r\n \r\n const prefix = prefixes[network] || '0x';\r\n const hash = Array.from({length: 64}, () => \r\n Math.floor(Math.random() * 16).toString(16)).join('');\r\n \r\n return `${prefix}${hash}`;\r\n};","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","// src/context/ThemeContext.jsx\r\nimport React, { createContext, useState, useContext, useEffect } from 'react';\r\n\r\nconst ThemeContext = createContext();\r\n\r\nexport const useTheme = () => useContext(ThemeContext);\r\n\r\nexport const ThemeProvider = ({ initialTheme = 'light', children }) => {\r\n const [theme, setTheme] = useState(initialTheme);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n useEffect(() => {\r\n document.documentElement.classList.remove('light', 'dark');\r\n document.documentElement.classList.add(theme);\r\n }, [theme]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, setTheme, toggleTheme }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n","\r\n// // src/context/CoinleyContext.jsx\r\n// import React, { createContext, useContext, useState, useEffect } from 'react';\r\n// import { initializeApi } from '../services/api';\r\n\r\n// const CoinleyContext = createContext();\r\n\r\n// export const useCoinley = () => useContext(CoinleyContext);\r\n\r\n// export const CoinleyProvider = ({ \r\n// apiKey, \r\n// apiSecret, \r\n// apiUrl = 'https://coinleyserver-production.up.railway.app',\r\n// debug = false,\r\n// children \r\n// }) => {\r\n// const [isInitialized, setIsInitialized] = useState(false);\r\n// const [error, setError] = useState(null);\r\n\r\n// useEffect(() => {\r\n// if (!apiKey || !apiSecret) {\r\n// setError('API key and secret are required');\r\n// return;\r\n// }\r\n\r\n// try {\r\n// initializeApi({ apiKey, apiSecret, apiUrl });\r\n// setIsInitialized(true);\r\n// if (debug) {\r\n// console.log('Coinley SDK initialized with:', { apiKey, apiUrl });\r\n// }\r\n// } catch (err) {\r\n// setError(err.message);\r\n// if (debug) {\r\n// console.error('Coinley SDK initialization error:', err);\r\n// }\r\n// }\r\n// }, [apiKey, apiSecret, apiUrl, debug]);\r\n\r\n// const value = {\r\n// apiKey,\r\n// apiSecret,\r\n// apiUrl,\r\n// isInitialized,\r\n// error,\r\n// debug\r\n// };\r\n\r\n// return (\r\n// <CoinleyContext.Provider value={value}>\r\n// {children}\r\n// </CoinleyContext.Provider>\r\n// );\r\n// };\r\n\r\n\r\n\r\n// src/context/CoinleyContext.jsx\r\nimport React, { createContext, useContext, useState, useEffect } from 'react';\r\nimport { initializeApi } from '../services/api';\r\n\r\nconst CoinleyContext = createContext();\r\n\r\nexport const useCoinley = () => useContext(CoinleyContext);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n merchantWalletAddress = null, // New prop for merchant wallet address\r\n merchantSolWalletAddress = null, // New prop for Solana wallet address\r\n debug = false,\r\n children\r\n}) => {\r\n const [isInitialized, setIsInitialized] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [paymentData, setPaymentData] = useState(null);\r\n\r\n useEffect(() => {\r\n if (!apiKey || !apiSecret) {\r\n setError('API key and secret are required');\r\n return;\r\n }\r\n\r\n try {\r\n initializeApi({ \r\n apiKey, \r\n apiSecret, \r\n apiUrl,\r\n merchantWalletAddress, // Pass wallet address to API service\r\n merchantSolWalletAddress\r\n });\r\n \r\n setIsInitialized(true);\r\n \r\n if (debug) {\r\n console.log('Coinley SDK initialized with:', { \r\n apiKey, \r\n apiUrl,\r\n merchantWalletAddress: merchantWalletAddress ? `${merchantWalletAddress.substring(0, 6)}...${merchantWalletAddress.substring(merchantWalletAddress.length - 4)}` : 'Not provided',\r\n merchantSolWalletAddress: merchantSolWalletAddress ? `${merchantSolWalletAddress.substring(0, 6)}...${merchantSolWalletAddress.substring(merchantSolWalletAddress.length - 4)}` : 'Not provided'\r\n });\r\n }\r\n } catch (err) {\r\n setError(err.message);\r\n if (debug) {\r\n console.error('Coinley SDK initialization error:', err);\r\n }\r\n }\r\n }, [apiKey, apiSecret, apiUrl, merchantWalletAddress, merchantSolWalletAddress, debug]);\r\n\r\n // Method to store payment data from responses for easy context access\r\n const storePaymentData = (data) => {\r\n setPaymentData(data);\r\n return data;\r\n };\r\n\r\n const value = {\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n merchantWalletAddress,\r\n merchantSolWalletAddress,\r\n isInitialized,\r\n error,\r\n debug,\r\n paymentData,\r\n storePaymentData\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={value}>\r\n {children}\r\n </CoinleyContext.Provider>\r\n );\r\n};","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n","// src/components/QRCode.jsx\r\nimport React, { useEffect, useState } from 'react';\r\nimport { QRCodeSVG } from 'qrcode.react';\r\n\r\n/**\r\n * Enhanced QR Code component that generates network-specific payment QR codes\r\n */\r\nconst QRCode = ({ \r\n walletAddress, \r\n amount, \r\n currency, \r\n network,\r\n theme = 'light',\r\n size = 200 \r\n}) => {\r\n const [qrData, setQrData] = useState('');\r\n const [qrError, setQrError] = useState(null);\r\n \r\n useEffect(() => {\r\n if (!walletAddress || walletAddress === 'No address configured') {\r\n setQrError('No wallet address configured for this network');\r\n return;\r\n }\r\n \r\n try {\r\n let paymentData;\r\n \r\n // Format QR code data based on network and currency\r\n switch (network) {\r\n case 'tron':\r\n if (currency === 'TRX') {\r\n // Native TRX transfer\r\n paymentData = `tronlink://transfer?to=${walletAddress}&amount=${amount}`;\r\n } else {\r\n // TRC20 token transfer - just the address for manual entry\r\n paymentData = walletAddress;\r\n }\r\n break;\r\n \r\n case 'algorand':\r\n // Algorand payment URI\r\n paymentData = `algorand://${walletAddress}?amount=${Math.floor(parseFloat(amount) * 1000000)}`;\r\n break;\r\n \r\n case 'bsc':\r\n // BSC - similar to Ethereum but different network\r\n if (currency === 'BNB') {\r\n paymentData = `ethereum:${walletAddress}@56?value=${convertToWei(amount)}`;\r\n } else {\r\n // BEP20 tokens\r\n const tokenAddress = getTokenAddressForCurrency(currency, 'bsc');\r\n if (tokenAddress) {\r\n paymentData = `ethereum:${tokenAddress}/transfer?address=${walletAddress}&uint256=${convertToSmallestUnit(amount, currency)}@56`;\r\n } else {\r\n paymentData = walletAddress;\r\n }\r\n }\r\n break;\r\n \r\n case 'ethereum':\r\n default:\r\n if (currency === 'ETH') {\r\n // Native ETH transfer\r\n paymentData = `ethereum:${walletAddress}@1?value=${convertToWei(amount)}`;\r\n } else {\r\n // ERC20 token transfer\r\n const tokenAddress = getTokenAddressForCurrency(currency, 'ethereum');\r\n if (tokenAddress) {\r\n paymentData = `ethereum:${tokenAddress}/transfer?address=${walletAddress}&uint256=${convertToSmallestUnit(amount, currency)}`;\r\n } else {\r\n paymentData = walletAddress;\r\n }\r\n }\r\n break;\r\n }\r\n \r\n setQrData(paymentData);\r\n setQrError(null);\r\n } catch (err) {\r\n console.error('Error generating QR code:', err);\r\n setQrError('Error generating payment QR code');\r\n }\r\n }, [walletAddress, amount, currency, network]);\r\n \r\n // Helper function to get token contract address\r\n const getTokenAddressForCurrency = (currency, network) => {\r\n const tokenAddresses = {\r\n ethereum: {\r\n 'USDT': '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n 'USDC': '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'\r\n },\r\n bsc: {\r\n 'USDT': '0x55d398326f99059fF775485246999027B3197955',\r\n 'USDC': '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d'\r\n },\r\n tron: {\r\n 'USDT': 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n 'USDC': 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8'\r\n }\r\n };\r\n \r\n return tokenAddresses[network]?.[currency] || '';\r\n };\r\n \r\n // Helper to convert amount to smallest unit based on currency\r\n const convertToSmallestUnit = (amount, currency) => {\r\n const decimals = currency === 'USDT' || currency === 'USDC' ? 6 : 18;\r\n return Math.floor(parseFloat(amount) * Math.pow(10, decimals)).toString();\r\n };\r\n \r\n // Helper to convert ETH to wei\r\n const convertToWei = (amount) => {\r\n return Math.floor(parseFloat(amount) * 1e18).toString();\r\n };\r\n\r\n // Get network display name\r\n const getNetworkDisplayName = (network) => {\r\n const names = {\r\n ethereum: 'Ethereum',\r\n bsc: 'BSC',\r\n tron: 'Tron',\r\n algorand: 'Algorand'\r\n };\r\n return names[network] || network;\r\n };\r\n\r\n // Get wallet app suggestions based on network\r\n const getWalletSuggestions = (network) => {\r\n const suggestions = {\r\n ethereum: ['MetaMask', 'Trust Wallet', 'Coinbase Wallet'],\r\n bsc: ['MetaMask', 'Trust Wallet', 'SafePal'],\r\n tron: ['TronLink', 'Trust Wallet'],\r\n algorand: ['Pera Wallet', 'MyAlgo Wallet']\r\n };\r\n return suggestions[network] || ['MetaMask', 'Trust Wallet'];\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center\">\r\n {qrError ? (\r\n <div className=\"p-4 rounded-lg bg-red-100 mb-3 text-red-700 text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n <p className=\"font-medium\">{qrError}</p>\r\n </div>\r\n ) : (\r\n <div className=\"p-4 rounded-lg bg-white mb-3 shadow-sm border\">\r\n {qrData && (\r\n <QRCodeSVG\r\n value={qrData}\r\n size={size}\r\n bgColor={theme === 'dark' ? '#374151' : '#FFFFFF'}\r\n fgColor={theme === 'dark' ? '#FFFFFF' : '#000000'}\r\n level=\"H\"\r\n includeMargin={true}\r\n />\r\n )}\r\n </div>\r\n )}\r\n \r\n <div className=\"text-center text-sm text-gray-700 mb-4\">\r\n <p className='font-semibold text-gray-800 flex items-center justify-center'>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h-4.01M12 12V8.01\" />\r\n </svg>\r\n Scan to Pay with {currency}\r\n </p>\r\n <p className=\"text-xs text-gray-500 mt-1\">\r\n Scan with your {getNetworkDisplayName(network)} wallet app\r\n </p>\r\n </div>\r\n \r\n {/* Payment Amount Display */}\r\n <div className=\"w-full mb-4 p-3 bg-gray-50 rounded-lg\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium text-gray-700\">Amount to Pay:</span>\r\n <span className=\"text-lg font-bold text-[#7042D2]\">{amount} {currency}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center mt-1\">\r\n <span className=\"text-xs text-gray-500\">Network:</span>\r\n <span className=\"text-xs font-medium text-gray-700\">{getNetworkDisplayName(network)}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Wallet Address Display */}\r\n {!qrError && (\r\n <div className=\"w-full mb-4\">\r\n <p className=\"text-xs text-gray-500 mb-1 text-center\">\r\n Or copy wallet address:\r\n </p>\r\n <div className=\"text-xs font-mono p-2 rounded bg-gray-100 text-gray-700 break-all text-center select-all cursor-pointer border\"\r\n onClick={() => navigator.clipboard?.writeText(walletAddress)}\r\n title=\"Click to copy\">\r\n {walletAddress}\r\n </div>\r\n </div>\r\n )}\r\n \r\n {/* Instructions */}\r\n <div className=\"w-full\">\r\n <div className=\"p-3 rounded bg-blue-50 border border-blue-200\">\r\n <h4 className=\"text-sm font-medium mb-2 text-blue-800 flex items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n Payment Instructions\r\n </h4>\r\n <ol className=\"text-xs space-y-1 text-blue-700\">\r\n <li>1. Open your crypto wallet app ({getWalletSuggestions(network).join(', ')})</li>\r\n <li>2. Scan the QR code above or copy the wallet address</li>\r\n <li>3. Send exactly <strong>{amount} {currency}</strong> on {getNetworkDisplayName(network)} network</li>\r\n <li>4. Click \"I have sent the payment\" button below after sending</li>\r\n </ol>\r\n \r\n <div className=\"mt-3 p-2 bg-yellow-50 border border-yellow-200 rounded\">\r\n <p className=\"text-xs text-yellow-800\">\r\n <strong>Important:</strong> Make sure you're sending on the correct network ({getNetworkDisplayName(network)}) \r\n and using the exact amount shown above.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default QRCode;\r\n\r\n","// // src/components/PaymentStatus.jsx - Updated version\r\n// import React from 'react';\r\n\r\n// const PaymentStatus = ({ status, theme = 'light', message }) => {\r\n// console.log('PaymentStatus render:', { status, message });\r\n\r\n// const renderIcon = () => {\r\n// switch (status) {\r\n// case 'processing':\r\n// return (\r\n// <div className=\"animate-spin rounded-full h-12 w-12 border-4 border-t-blue-500 border-blue-500/20\"></div>\r\n// );\r\n// case 'success':\r\n// return (\r\n// <div className=\"rounded-full h-12 w-12 bg-green-100 flex items-center justify-center\">\r\n// <svg\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// className=\"h-8 w-8 text-green-500\"\r\n// fill=\"none\"\r\n// viewBox=\"0 0 24 24\"\r\n// stroke=\"currentColor\"\r\n// strokeWidth={2}\r\n// >\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n// </svg>\r\n// </div>\r\n// );\r\n// case 'error':\r\n// return (\r\n// <div className=\"rounded-full h-12 w-12 bg-red-100 flex items-center justify-center\">\r\n// <svg\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// className=\"h-8 w-8 text-red-500\"\r\n// fill=\"none\"\r\n// viewBox=\"0 0 24 24\"\r\n// stroke=\"currentColor\"\r\n// strokeWidth={2}\r\n// >\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n// </svg>\r\n// </div>\r\n// );\r\n// default:\r\n// return null;\r\n// }\r\n// };\r\n\r\n// const getStatusTitle = () => {\r\n// switch (status) {\r\n// case 'processing':\r\n// return 'Processing Payment';\r\n// case 'success':\r\n// return 'Payment Successful';\r\n// case 'error':\r\n// return 'Payment Failed';\r\n// default:\r\n// return 'Unknown Status';\r\n// }\r\n// };\r\n\r\n// const getMessageClasses = () => {\r\n// switch (status) {\r\n// case 'processing':\r\n// return theme === 'dark' ? 'text-blue-300' : 'text-blue-600';\r\n// case 'success':\r\n// return theme === 'dark' ? 'text-green-300' : 'text-green-600';\r\n// case 'error':\r\n// return theme === 'dark' ? 'text-red-300' : 'text-red-600';\r\n// default:\r\n// return theme === 'dark' ? 'text-gray-300' : 'text-gray-600';\r\n// }\r\n// };\r\n\r\n// return (\r\n// <div className=\"flex flex-col items-center justify-center py-6\">\r\n// <div className=\"mb-4\">{renderIcon()}</div>\r\n// <h3 className={`text-xl font-bold mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n// {getStatusTitle()}\r\n// </h3>\r\n// <p className={`text-center ${getMessageClasses()}`}>{message}</p>\r\n\r\n// {status === 'processing' && (\r\n// <div className={`mt-4 text-xs ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}>\r\n// This may take a few moments. Please do not close this window.\r\n// </div>\r\n// )}\r\n\r\n// {status === 'success' && (\r\n// <div className={`mt-4 p-2 rounded ${theme === 'dark' ? 'bg-gray-700' : 'bg-gray-100'}`}>\r\n// <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-600'}`}>\r\n// Your payment has been successfully processed. You will receive a confirmation shortly.\r\n// </p>\r\n// </div>\r\n// )}\r\n// </div>\r\n// );\r\n// };\r\n\r\n// export default PaymentStatus;\r\n\r\n\r\n\r\n\r\n// src/components/PaymentStatus.jsx\r\nimport React from 'react';\r\n\r\n/**\r\n * Component to display payment status\r\n */\r\nconst PaymentStatus = ({ status, message, theme = 'light' }) => {\r\n // Render different icons based on status\r\n const renderIcon = () => {\r\n switch (status) {\r\n case 'processing':\r\n return (\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-4 border-t-blue-500 border-blue-500/20\"></div>\r\n );\r\n case 'success':\r\n return (\r\n <div className=\"rounded-full h-12 w-12 bg-green-100 flex items-center justify-center\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-8 w-8 text-green-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n );\r\n case 'error':\r\n return (\r\n <div className=\"rounded-full h-12 w-12 bg-red-100 flex items-center justify-center\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-8 w-8 text-red-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </div>\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n // Get status title\r\n const getStatusTitle = () => {\r\n switch (status) {\r\n case 'processing':\r\n return 'Processing Payment';\r\n case 'success':\r\n return 'Payment Successful';\r\n case 'error':\r\n return 'Payment Failed';\r\n default:\r\n return 'Unknown Status';\r\n }\r\n };\r\n\r\n // Get appropriate text color for message\r\n const getMessageClasses = () => {\r\n switch (status) {\r\n case 'processing':\r\n return theme === 'dark' ? 'text-blue-300' : 'text-blue-600';\r\n case 'success':\r\n return theme === 'dark' ? 'text-green-300' : 'text-green-600';\r\n case 'error':\r\n return theme === 'dark' ? 'text-red-300' : 'text-red-600';\r\n default:\r\n return theme === 'dark' ? 'text-gray-300' : 'text-gray-600';\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-6\">\r\n <div className=\"mb-4\">{renderIcon()}</div>\r\n <h3 className={`text-xl font-bold mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n {getStatusTitle()}\r\n </h3>\r\n <p className={`text-center ${getMessageClasses()}`}>{message}</p>\r\n\r\n {status === 'processing' && (\r\n <div className={`mt-4 text-xs ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}>\r\n This may take a few moments. Please do not close this window.\r\n </div>\r\n )}\r\n\r\n {status === 'success' && (\r\n <div className={`mt-4 p-2 rounded ${theme === 'dark' ? 'bg-gray-700' : 'bg-gray-100'}`}>\r\n <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-600'}`}>\r\n Your payment has been successfully processed. You will receive a confirmation shortly.\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PaymentStatus;","// // src/components/PaymentMethods.jsx\r\n// import React, { useState, useEffect } from 'react';\r\n// import { NETWORK_TYPES, TOKEN_CONFIG, detectWallets } from '../services/walletService';\r\n\r\n// /**\r\n// * Payment methods component with network dropdown and currency grid\r\n// */\r\n// const PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n// const [selectedNetwork, setSelectedNetwork] = useState(NETWORK_TYPES.ETHEREUM);\r\n// const [availableWallets, setAvailableWallets] = useState({});\r\n// const [showMore, setShowMore] = useState(false);\r\n\r\n// useEffect(() => {\r\n// setAvailableWallets(detectWallets());\r\n// }, []);\r\n\r\n// // Available networks\r\n// const networks = [\r\n// {\r\n// id: NETWORK_TYPES.ETHEREUM,\r\n// name: 'Ethereum',\r\n// description: 'ERC-20 tokens'\r\n// },\r\n// {\r\n// id: NETWORK_TYPES.BSC,\r\n// name: 'BSC (Binance Smart Chain)',\r\n// description: 'BEP-20 tokens'\r\n// },\r\n// {\r\n// id: NETWORK_TYPES.TRON,\r\n// name: 'Tron',\r\n// description: 'TRC-20 tokens'\r\n// },\r\n// {\r\n// id: NETWORK_TYPES.ALGORAND,\r\n// name: 'Algorand',\r\n// description: 'ASA tokens'\r\n// }\r\n// ];\r\n\r\n// // Payment methods based on selected network\r\n// const getPaymentMethodsForNetwork = (network) => {\r\n// const methods = [];\r\n \r\n// switch (network) {\r\n// case NETWORK_TYPES.ETHEREUM:\r\n// methods.push(\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'ETH',\r\n// name: 'ETH',\r\n// description: 'Ethereum',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTcyJyRKN0dRJWVZqoLzYgkRHdJsxKGq8nHUw&s',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// }\r\n// );\r\n// break;\r\n \r\n// case NETWORK_TYPES.BSC:\r\n// methods.push(\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.BSC\r\n// },\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.BSC\r\n// },\r\n// {\r\n// id: 'BNB',\r\n// name: 'BNB',\r\n// description: 'Binance Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRHSjyW2sSnBhwztCwVW97i1BtV40g7heMMxg&s',\r\n// network: NETWORK_TYPES.BSC\r\n// }\r\n// );\r\n// break;\r\n \r\n// case NETWORK_TYPES.TRON:\r\n// methods.push(\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.TRON\r\n// },\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.TRON\r\n// },\r\n// {\r\n// id: 'TRX',\r\n// name: 'TRX',\r\n// description: 'Tron',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQKLpLNsGRHbZfCUXAjZLPSp_YFZvX5dMnAoA&s',\r\n// network: NETWORK_TYPES.TRON\r\n// }\r\n// );\r\n// break;\r\n \r\n// case NETWORK_TYPES.ALGORAND:\r\n// methods.push(\r\n// {\r\n// id: 'ALGO',\r\n// name: 'ALGO',\r\n// description: 'Algorand',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0Yx1Vp8qPQI5XZoJuKfQS8bj_FNiMZGCHqA&s',\r\n// network: NETWORK_TYPES.ALGORAND\r\n// }\r\n// );\r\n// break;\r\n \r\n// default:\r\n// break;\r\n// }\r\n \r\n// return methods;\r\n// };\r\n\r\n// const handleNetworkChange = (networkId) => {\r\n// setSelectedNetwork(networkId);\r\n// setShowMore(false); // Reset show more when network changes\r\n \r\n// // Reset selection when network changes\r\n// if (selected?.network !== networkId) {\r\n// onSelect(null);\r\n// }\r\n// };\r\n\r\n// const handleSelectPaymentMethod = (method) => {\r\n// onSelect({\r\n// currency: method.id,\r\n// network: selectedNetwork,\r\n// tokenConfig: TOKEN_CONFIG[method.id]?.[selectedNetwork],\r\n// method: method\r\n// });\r\n// };\r\n\r\n// const availableMethods = getPaymentMethodsForNetwork(selectedNetwork);\r\n// const visibleMethods = showMore ? availableMethods : availableMethods.slice(0, 4);\r\n\r\n// return (\r\n// <div>\r\n// <h3 className={`text-lg font-medium mb-4 ${theme === 'dark' ? 'text-white' : 'text-gray-800'}`}>\r\n// Select Payment Method\r\n// </h3>\r\n \r\n// {/* Blockchain Network Dropdown */}\r\n// <div className=\"mb-6\">\r\n// <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n// Blockchain Network\r\n// </label>\r\n// <select\r\n// value={selectedNetwork}\r\n// onChange={(e) => handleNetworkChange(e.target.value)}\r\n// className={`w-full p-3 rounded-lg border transition-colors ${\r\n// theme === 'dark'\r\n// ? 'bg-gray-700 border-gray-600 text-white focus:border-[#7042D2]'\r\n// : 'bg-white border-gray-300 text-gray-900 focus:border-[#7042D2]'\r\n// } focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50`}\r\n// >\r\n// {networks\r\n// .filter(network => supportedNetworks.length === 0 || supportedNetworks.includes(network.id))\r\n// .map((network) => (\r\n// <option key={network.id} value={network.id}>\r\n// {network.name} - {network.description}\r\n// </option>\r\n// ))}\r\n// </select>\r\n// </div>\r\n\r\n// {/* Stablecoins/Tokens Grid */}\r\n// <div className=\"mb-4\">\r\n// <label className={`block text-sm font-medium mb-3 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n// Choose Cryptocurrency\r\n// </label>\r\n \r\n// <div className=\"grid grid-cols-2 gap-3 mb-4\">\r\n// {visibleMethods.map((method) => (\r\n// <button\r\n// key={`${method.id}-${method.network}`}\r\n// onClick={() => handleSelectPaymentMethod(method)}\r\n// className={`p-4 rounded-lg transition-all duration-200 border-2 ${\r\n// selected?.currency === method.id && selected?.network === selectedNetwork\r\n// ? theme === 'dark'\r\n// ? 'bg-blue-900/30 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n// : 'bg-blue-50 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n// : theme === 'dark'\r\n// ? 'bg-gray-700 hover:bg-gray-600 border-gray-600 hover:border-gray-500'\r\n// : 'bg-white hover:bg-gray-50 border-gray-200 hover:border-gray-300'\r\n// }`}\r\n// >\r\n// <div className=\"flex flex-col items-center text-center\">\r\n// <div className=\"flex-shrink-0 h-10 w-10 bg-white rounded-full flex items-center justify-center mb-2 shadow-sm\">\r\n// <img src={method.logo} alt={method.name} className=\"h-6 w-6\" />\r\n// </div>\r\n// <div>\r\n// <h4 className={`font-medium text-sm ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n// {method.name}\r\n// </h4>\r\n// <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-500'}`}>\r\n// {method.description}\r\n// </p>\r\n// </div>\r\n// {selected?.currency === method.id && selected?.network === selectedNetwork && (\r\n// <div className=\"mt-2\">\r\n// <svg\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// className=\"h-4 w-4 text-[#7042D2]\"\r\n// viewBox=\"0 0 20 20\"\r\n// fill=\"currentColor\"\r\n// >\r\n// <path\r\n// fillRule=\"evenodd\"\r\n// d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\r\n// clipRule=\"evenodd\"\r\n// />\r\n// </svg>\r\n// </div>\r\n// )}\r\n// </div>\r\n// </button>\r\n// ))}\r\n// </div>\r\n\r\n// {/* Show More/Less Button */}\r\n// {availableMethods.length > 4 && (\r\n// <button\r\n// onClick={() => setShowMore(!showMore)}\r\n// className={`w-full py-2 px-4 rounded-lg text-sm font-medium transition-colors ${\r\n// theme === 'dark'\r\n// ? 'bg-gray-700 text-gray-300 hover:bg-gray-600'\r\n// : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\r\n// }`}\r\n// >\r\n// {showMore ? 'Show Less' : `Show More (${availableMethods.length - 4} more)`}\r\n// </button>\r\n// )}\r\n// </div>\r\n\r\n// {/* Network Info */}\r\n// <div className={`p-3 rounded-lg text-sm ${\r\n// theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n// }`}>\r\n// <div className=\"flex items-center\">\r\n// <div className={`w-2 h-2 rounded-full mr-2 ${\r\n// availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n// }`}></div>\r\n// <span className=\"text-xs\">\r\n// {getNetworkRequirement(selectedNetwork)}\r\n// </span>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// );\r\n\r\n// // Helper functions\r\n// function getRequiredWallet(network) {\r\n// switch (network) {\r\n// case NETWORK_TYPES.ETHEREUM:\r\n// case NETWORK_TYPES.BSC:\r\n// return 'metamask';\r\n// case NETWORK_TYPES.TRON:\r\n// return 'tronlink';\r\n// case NETWORK_TYPES.ALGORAND:\r\n// return 'lute';\r\n// default:\r\n// return 'metamask';\r\n// }\r\n// }\r\n\r\n// function getNetworkRequirement(network) {\r\n// const wallet = getRequiredWallet(network);\r\n// const isAvailable = availableWallets[wallet];\r\n \r\n// const walletNames = {\r\n// metamask: 'MetaMask',\r\n// tronlink: 'TronLink',\r\n// lute: 'Lute Wallet'\r\n// };\r\n \r\n// return isAvailable \r\n// ? `${walletNames[wallet]} detected - Ready to pay`\r\n// : `${walletNames[wallet]} required - Please install to continue`;\r\n// }\r\n// };\r\n\r\n// export default PaymentMethods;\r\n\r\n\r\n\r\n\r\n\r\n// src/components/PaymentMethods.jsx\r\nimport React, { useState, useEffect } from 'react';\r\nimport { NETWORK_TYPES, TOKEN_CONFIG, detectWallets, WALLET_TYPES } from '../services/walletService';\r\n\r\n/**\r\n * Payment methods component with network dropdown and currency grid\r\n */\r\nconst PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n const [selectedNetwork, setSelectedNetwork] = useState(NETWORK_TYPES.ETHEREUM);\r\n const [availableWallets, setAvailableWallets] = useState({});\r\n const [showMore, setShowMore] = useState(false);\r\n\r\n useEffect(() => {\r\n setAvailableWallets(detectWallets());\r\n }, []);\r\n\r\n // Available networks\r\n const networks = [\r\n {\r\n id: NETWORK_TYPES.ETHEREUM,\r\n name: 'Ethereum',\r\n description: 'ERC-20 tokens'\r\n },\r\n {\r\n id: NETWORK_TYPES.BSC,\r\n name: 'BSC (Binance Smart Chain)',\r\n description: 'BEP-20 tokens'\r\n },\r\n {\r\n id: NETWORK_TYPES.TRON,\r\n name: 'Tron',\r\n description: 'TRC-20 tokens'\r\n },\r\n {\r\n id: NETWORK_TYPES.ALGORAND,\r\n name: 'Algorand',\r\n description: 'ASA tokens'\r\n }\r\n ];\r\n\r\n // Payment methods based on selected network\r\n const getPaymentMethodsForNetwork = (network) => {\r\n const methods = [];\r\n \r\n switch (network) {\r\n case NETWORK_TYPES.ETHEREUM:\r\n methods.push(\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'PYUSD',\r\n name: 'PYUSD',\r\n description: 'PayPal USD',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/28492.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'FRAX',\r\n name: 'FRAX',\r\n description: 'Frax',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'USDP',\r\n name: 'USDP',\r\n description: 'Pax Dollar',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6662.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'DAI',\r\n name: 'DAI',\r\n description: 'Dai Stablecoin',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'ETH',\r\n name: 'ETH',\r\n description: 'Ethereum',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTcyJyRKN0dRJWVZqoLzYgkRHdJsxKGq8nHUw&s',\r\n network: NETWORK_TYPES.ETHEREUM\r\n }\r\n );\r\n break;\r\n \r\n case NETWORK_TYPES.BSC:\r\n methods.push(\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'BUSD',\r\n name: 'BUSD',\r\n description: 'Binance USD',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'FRAX',\r\n name: 'FRAX',\r\n description: 'Frax',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'BNB',\r\n name: 'BNB',\r\n description: 'Binance Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRHSjyW2sSnBhwztCwVW97i1BtV40g7heMMxg&s',\r\n network: NETWORK_TYPES.BSC\r\n }\r\n );\r\n break;\r\n \r\n case NETWORK_TYPES.TRON:\r\n methods.push(\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.TRON\r\n },\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.TRON\r\n },\r\n {\r\n id: 'USDJ',\r\n name: 'USDJ',\r\n description: 'JUST Stablecoin',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/5446.png',\r\n network: NETWORK_TYPES.TRON\r\n },\r\n {\r\n id: 'TRX',\r\n name: 'TRX',\r\n description: 'Tron',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQKLpLNsGRHbZfCUXAjZLPSp_YFZvX5dMnAoA&s',\r\n network: NETWORK_TYPES.TRON\r\n }\r\n );\r\n break;\r\n \r\n case NETWORK_TYPES.ALGORAND:\r\n methods.push(\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.ALGORAND\r\n },\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.ALGORAND\r\n },\r\n {\r\n id: 'ALGO',\r\n name: 'ALGO',\r\n description: 'Algorand',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4030.png',\r\n network: NETWORK_TYPES.ALGORAND\r\n }\r\n );\r\n break;\r\n \r\n default:\r\n break;\r\n }\r\n \r\n return methods;\r\n };\r\n\r\n const handleNetworkChange = (networkId) => {\r\n setSelectedNetwork(networkId);\r\n setShowMore(false); // Reset show more when network changes\r\n \r\n // Reset selection when network changes\r\n if (selected?.network !== networkId) {\r\n onSelect(null);\r\n }\r\n };\r\n\r\n const handleSelectPaymentMethod = (method) => {\r\n onSelect({\r\n currency: method.id,\r\n network: selectedNetwork,\r\n tokenConfig: TOKEN_CONFIG[method.id]?.[selectedNetwork],\r\n method: method\r\n });\r\n };\r\n\r\n const availableMethods = getPaymentMethodsForNetwork(selectedNetwork);\r\n const visibleMethods = showMore ? availableMethods : availableMethods.slice(0, 4);\r\n\r\n // FIXED: Helper functions with correct wallet constants\r\n function getRequiredWallet(network) {\r\n switch (network) {\r\n case NETWORK_TYPES.ETHEREUM:\r\n case NETWORK_TYPES.BSC:\r\n return WALLET_TYPES.METAMASK; // Use the actual constant\r\n case NETWORK_TYPES.TRON:\r\n return WALLET_TYPES.TRONLINK; // Use the actual constant\r\n case NETWORK_TYPES.ALGORAND:\r\n return WALLET_TYPES.LUTE; // Use the actual constant\r\n default:\r\n return WALLET_TYPES.METAMASK;\r\n }\r\n }\r\n\r\n function getNetworkRequirement(network) {\r\n const wallet = getRequiredWallet(network);\r\n const isAvailable = availableWallets[wallet];\r\n \r\n const walletNames = {\r\n [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n };\r\n \r\n return isAvailable \r\n ? `${walletNames[wallet]} detected - Ready to pay`\r\n : `${walletNames[wallet]} required - Please install to continue`;\r\n }\r\n\r\n return (\r\n <div>\r\n <h3 className={`text-lg font-medium mb-4 ${theme === 'dark' ? 'text-white' : 'text-gray-800'}`}>\r\n Select Payment Method\r\n </h3>\r\n \r\n {/* Blockchain Network Dropdown */}\r\n <div className=\"mb-6\">\r\n <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n Blockchain Network\r\n </label>\r\n <select\r\n value={selectedNetwork}\r\n onChange={(e) => handleNetworkChange(e.target.value)}\r\n className={`w-full p-3 rounded-lg border transition-colors ${\r\n theme === 'dark'\r\n ? 'bg-gray-700 border-gray-600 text-white focus:border-[#7042D2]'\r\n : 'bg-white border-gray-300 text-gray-900 focus:border-[#7042D2]'\r\n } focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50`}\r\n >\r\n {networks\r\n .filter(network => supportedNetworks.length === 0 || supportedNetworks.includes(network.id))\r\n .map((network) => (\r\n <option key={network.id} value={network.id}>\r\n {network.name} - {network.description}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Stablecoins/Tokens Grid */}\r\n <div className=\"mb-4\">\r\n <label className={`block text-sm font-medium mb-3 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n Choose Cryptocurrency\r\n </label>\r\n \r\n <div className=\"grid grid-cols-2 gap-3 mb-4\">\r\n {visibleMethods.map((method) => (\r\n <button\r\n key={`${method.id}-${method.network}`}\r\n onClick={() => handleSelectPaymentMethod(method)}\r\n className={`p-4 rounded-lg transition-all duration-200 border-2 ${\r\n selected?.currency === method.id && selected?.network === selectedNetwork\r\n ? theme === 'dark'\r\n ? 'bg-blue-900/30 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n : 'bg-blue-50 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n : theme === 'dark'\r\n ? 'bg-gray-700 hover:bg-gray-600 border-gray-600 hover:border-gray-500'\r\n : 'bg-white hover:bg-gray-50 border-gray-200 hover:border-gray-300'\r\n }`}\r\n >\r\n <div className=\"flex flex-col items-center text-center\">\r\n <div className=\"flex-shrink-0 h-10 w-10 bg-white rounded-full flex items-center justify-center mb-2 shadow-sm\">\r\n <img src={method.logo} alt={method.name} className=\"h-6 w-6\" />\r\n </div>\r\n <div>\r\n <h4 className={`font-medium text-sm ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n {method.name}\r\n </h4>\r\n <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-500'}`}>\r\n {method.description}\r\n </p>\r\n </div>\r\n {selected?.currency === method.id && selected?.network === selectedNetwork && (\r\n <div className=\"mt-2\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-4 w-4 text-[#7042D2]\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"currentColor\"\r\n >\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Show More/Less Button */}\r\n {availableMethods.length > 4 && (\r\n <button\r\n onClick={() => setShowMore(!showMore)}\r\n className={`w-full py-2 px-4 rounded-lg text-sm font-medium transition-colors ${\r\n theme === 'dark'\r\n ? 'bg-gray-700 text-gray-300 hover:bg-gray-600'\r\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\r\n }`}\r\n >\r\n {showMore ? 'Show Less' : `Show More (${availableMethods.length - 4} more)`}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Network Info */}\r\n <div className={`p-3 rounded-lg text-sm ${\r\n theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n }`}>\r\n <div className=\"flex items-center\">\r\n <div className={`w-2 h-2 rounded-full mr-2 ${\r\n availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n }`}></div>\r\n <span className=\"text-xs\">\r\n {getNetworkRequirement(selectedNetwork)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PaymentMethods;","// // src/components/CoinleyModal.jsx\r\n// import React, { useState, useEffect } from 'react';\r\n// import PaymentMethods from './PaymentMethods';\r\n// import PaymentStatus from './PaymentStatus';\r\n// import QRCode from './QRCode';\r\n// import { WALLET_TYPES, getWalletInstallUrl, detectWallets } from '../services/walletService';\r\n// import logo from '../assets/Logo.png';\r\n\r\n// const CoinleyModal = ({\r\n// isOpen,\r\n// onClose,\r\n// payment,\r\n// paymentStatus,\r\n// selectedPaymentMethod,\r\n// onPaymentMethodSelect,\r\n// onPayment,\r\n// onBack,\r\n// error,\r\n// theme = 'light',\r\n// merchantName,\r\n// transactionHash,\r\n// walletConnection,\r\n// onConnectWallet,\r\n// testMode = false,\r\n// supportedNetworks = [],\r\n// availableWallets = {},\r\n// supportedWallets = [],\r\n// step = 'select-currency'\r\n// }) => {\r\n// const [paymentType, setPaymentType] = useState('wallet'); // 'wallet' or 'qrcode'\r\n\r\n// // Utility functions\r\n// const formatAmount = (amount) => {\r\n// return parseFloat(amount).toFixed(2);\r\n// };\r\n\r\n// const formatTransactionHash = (hash) => {\r\n// if (!hash) return '';\r\n// if (hash.length <= 14) return hash;\r\n// return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n// };\r\n\r\n// const getNetworkDisplayName = (network) => {\r\n// const names = {\r\n// ethereum: 'Ethereum',\r\n// bsc: 'BSC',\r\n// tron: 'Tron',\r\n// algorand: 'Algorand'\r\n// };\r\n// return names[network] || network;\r\n// };\r\n\r\n// const getWalletDisplayName = (walletType) => {\r\n// const names = {\r\n// [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n// [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n// [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n// [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n// };\r\n// return names[walletType] || walletType;\r\n// };\r\n\r\n// const getWalletIcon = (walletType) => {\r\n// const icons = {\r\n// [WALLET_TYPES.METAMASK]: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n// [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/images/logo.png',\r\n// [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/assets/images/trust_logotype.svg',\r\n// [WALLET_TYPES.LUTE]: 'https://lute.app/logo.png'\r\n// };\r\n// return icons[walletType] || '';\r\n// };\r\n\r\n// if (!isOpen) return null;\r\n\r\n// return (\r\n// <div className=\"fixed inset-0 z-50 overflow-y-auto bg-black/50\">\r\n// <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n// <div className=\"relative p-6 w-full max-w-md mx-auto rounded-lg shadow-xl bg-white text-gray-800\">\r\n// {/* Header */}\r\n// <div className=\"flex justify-between items-center mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n// <div className=\"flex items-center\">\r\n// <h2 className=\"text-xl font-bold text-gray-900\">\r\n// <img src={logo} className='w-32' alt=\"Coinley Logo\" />\r\n// </h2>\r\n// </div>\r\n// <button \r\n// onClick={onClose}\r\n// className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n// >\r\n// <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n// </svg>\r\n// </button>\r\n// </div>\r\n \r\n// {/* Content */}\r\n// <div className=\"mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n// {payment && (\r\n// <div className=\"mb-6 p-4 rounded-lg\">\r\n// <p className=\"text-lg text-gray-800 font-semibold\">\r\n// PAY: {merchantName}\r\n// </p>\r\n// <div className=\"flex justify-between items-center mt-2 bg-gray-100 px-3 rounded-lg\">\r\n// <span className=\"font-medium text-gray-700\">\r\n// Amount:\r\n// </span>\r\n// <span className=\"font-bold text-xl text-[#7042D2]\">\r\n// ${formatAmount(payment.totalAmount || payment.amount)}\r\n// </span>\r\n// </div>\r\n// <div className=\"text-xs mt-1 text-right\">\r\n// <span className=\"text-gray-500\">\r\n// Payment ID: {payment.id ? payment.id.slice(0, 8) : ''}...\r\n// </span>\r\n// </div>\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Select Currency/Network */}\r\n// {step === 'select-currency' && (\r\n// <div>\r\n// <PaymentMethods \r\n// onSelect={onPaymentMethodSelect} \r\n// selected={selectedPaymentMethod}\r\n// theme={theme}\r\n// supportedNetworks={supportedNetworks}\r\n// />\r\n \r\n// {/* Proceed Button */}\r\n// {selectedPaymentMethod && (\r\n// <div className=\"mt-6\">\r\n// <button\r\n// onClick={() => onPaymentMethodSelect(selectedPaymentMethod)} // This will trigger the next step\r\n// className=\"w-full py-3 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-lg transition-colors\"\r\n// >\r\n// Proceed with {selectedPaymentMethod.currency} on {getNetworkDisplayName(selectedPaymentMethod.network)}\r\n// </button>\r\n// </div>\r\n// )}\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Confirm Payment */}\r\n// {step === 'confirm' && selectedPaymentMethod && payment && (\r\n// <div>\r\n// <div className=\"p-4 rounded-lg mb-4 bg-gray-100\">\r\n// <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n// Payment Details\r\n// </h3>\r\n// <div className=\"space-y-2\">\r\n// <div className=\"flex justify-between\">\r\n// <span className=\"text-[#7042D2] font-semibold\">Currency:</span>\r\n// <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n// </div>\r\n// <div className=\"flex justify-between\">\r\n// <span className=\"text-[#7042D2] font-semibold\">Network:</span>\r\n// <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n// </div>\r\n// <div className=\"flex justify-between\">\r\n// <span className=\"text-[#7042D2] font-semibold\">Fee:</span>\r\n// <span className=\"font-medium\">1.75%</span>\r\n// </div>\r\n// </div>\r\n// </div>\r\n\r\n// {/* Payment Method Tabs */}\r\n// <div className=\"mb-4\">\r\n// <div className=\"flex border-b border-gray-200\">\r\n// <button\r\n// onClick={() => setPaymentType('wallet')}\r\n// className={`py-2 px-4 text-sm font-medium ${\r\n// paymentType === 'wallet'\r\n// ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n// : 'text-gray-500 hover:text-gray-700'\r\n// }`}\r\n// >\r\n// Connect Wallet\r\n// </button>\r\n// <button\r\n// onClick={() => setPaymentType('qrcode')}\r\n// className={`py-2 px-4 text-sm font-medium ${\r\n// paymentType === 'qrcode'\r\n// ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n// : 'text-gray-500 hover:text-gray-700'\r\n// }`}\r\n// >\r\n// QR Code\r\n// </button>\r\n// </div>\r\n// </div>\r\n\r\n// {testMode ? (\r\n// // Test mode payment option\r\n// <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n// <div className=\"flex items-center\">\r\n// <div className=\"bg-[#7042D2] rounded-full p-2 mr-3\">\r\n// <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n// </svg>\r\n// </div>\r\n// <div>\r\n// <h3 className=\"font-medium text-gray-800\">\r\n// Test Mode Payment\r\n// </h3>\r\n// <p className=\"text-sm text-gray-600\">\r\n// Click \"Pay Now\" to simulate a successful payment\r\n// </p>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// ) : paymentType === 'qrcode' ? (\r\n// // QR Code payment option\r\n// <div className=\"mb-4\">\r\n// <QRCode \r\n// walletAddress={payment.recipientWallet || 'No address configured'} \r\n// amount={payment.totalAmount || payment.amount}\r\n// currency={selectedPaymentMethod.currency}\r\n// network={selectedPaymentMethod.network}\r\n// theme={theme}\r\n// />\r\n// </div>\r\n// ) : (\r\n// // Wallet connection option\r\n// <div className=\"space-y-3 mb-4\">\r\n// {supportedWallets.length === 0 ? (\r\n// <div className=\"p-4 rounded-lg bg-yellow-50\">\r\n// <div className=\"flex items-center\">\r\n// <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-yellow-500 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n// </svg>\r\n// <div>\r\n// <h3 className=\"font-medium text-gray-800\">No Compatible Wallets</h3>\r\n// <p className=\"text-sm text-gray-600\">\r\n// No wallets detected for {getNetworkDisplayName(selectedPaymentMethod.network)} network\r\n// </p>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// ) : (\r\n// supportedWallets.map((walletType) => (\r\n// <div key={walletType} className=\"p-4 rounded-lg bg-blue-50\">\r\n// <div className=\"flex items-center justify-between\">\r\n// <div className=\"flex items-center\">\r\n// <img \r\n// src={getWalletIcon(walletType)} \r\n// alt={getWalletDisplayName(walletType)}\r\n// className=\"w-8 h-8 mr-3\"\r\n// onError={(e) => {\r\n// e.target.style.display = 'none';\r\n// }}\r\n// />\r\n// <div>\r\n// <h3 className=\"font-medium text-gray-800\">\r\n// {getWalletDisplayName(walletType)}\r\n// </h3>\r\n// <p className=\"text-sm text-gray-600\">\r\n// Pay with {getWalletDisplayName(walletType)}\r\n// </p>\r\n// </div>\r\n// </div>\r\n \r\n// {walletConnection?.walletType === walletType ? (\r\n// <div className=\"flex items-center space-x-2\">\r\n// <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\r\n// <span className=\"text-sm text-green-600\">Connected</span>\r\n// </div>\r\n// ) : (\r\n// <button\r\n// onClick={() => onConnectWallet(walletType)}\r\n// className=\"py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md text-sm\"\r\n// >\r\n// Connect\r\n// </button>\r\n// )}\r\n// </div>\r\n// </div>\r\n// ))\r\n// )}\r\n\r\n// {/* Install wallet links for missing wallets */}\r\n// <div className=\"space-y-2\">\r\n// {Object.entries(availableWallets)\r\n// .filter(([walletType, isAvailable]) => !isAvailable)\r\n// .map(([walletType]) => (\r\n// <div key={walletType} className=\"p-3 rounded-lg bg-gray-50\">\r\n// <div className=\"flex items-center justify-between\">\r\n// <span className=\"text-sm text-gray-600\">\r\n// {getWalletDisplayName(walletType)} not detected\r\n// </span>\r\n// <a\r\n// href={getWalletInstallUrl(walletType)}\r\n// target=\"_blank\"\r\n// rel=\"noopener noreferrer\"\r\n// className=\"text-sm text-[#7042D2] hover:underline\"\r\n// >\r\n// Install\r\n// </a>\r\n// </div>\r\n// </div>\r\n// ))}\r\n// </div>\r\n// </div>\r\n// )}\r\n\r\n// {/* Navigation buttons */}\r\n// <div className=\"grid grid-cols-2 gap-3\">\r\n// <button\r\n// type=\"button\"\r\n// onClick={onBack}\r\n// className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-[#7042D2] font-medium rounded-md\"\r\n// >\r\n// Back\r\n// </button>\r\n// <button\r\n// type=\"button\"\r\n// onClick={() => onPayment(paymentType === 'qrcode')}\r\n// className=\"w-full py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md\"\r\n// disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n// >\r\n// {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n// </button>\r\n// </div>\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Processing */}\r\n// {step === 'processing' && (\r\n// <PaymentStatus \r\n// status=\"processing\" \r\n// theme={theme}\r\n// message=\"Processing your payment...\"\r\n// />\r\n// )}\r\n\r\n// {/* Step: Success */}\r\n// {step === 'success' && (\r\n// <div>\r\n// <PaymentStatus \r\n// status=\"success\" \r\n// theme={theme}\r\n// message=\"Payment successful!\"\r\n// />\r\n// {transactionHash && (\r\n// <div className=\"mt-4 p-3 rounded-lg bg-gray-100\">\r\n// <p className=\"text-xs text-gray-600 mb-1\">\r\n// Transaction Hash:\r\n// </p>\r\n// <p className=\"text-sm font-mono break-all text-gray-800\">\r\n// {formatTransactionHash(transactionHash)}\r\n// </p>\r\n// {selectedPaymentMethod && (\r\n// <a \r\n// href={`${getExplorerUrl(selectedPaymentMethod.network)}/${getExplorerPath(selectedPaymentMethod.network)}/${transactionHash}`}\r\n// target=\"_blank\"\r\n// rel=\"noopener noreferrer\"\r\n// className=\"text-xs text-[#7042D2] mt-2 inline-block\"\r\n// >\r\n// View on Explorer →\r\n// </a>\r\n// )}\r\n// </div>\r\n// )}\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Error */}\r\n// {step === 'error' && (\r\n// <div>\r\n// <PaymentStatus \r\n// status=\"error\" \r\n// theme={theme}\r\n// message={error || \"An error occurred while processing your payment.\"}\r\n// />\r\n// <button\r\n// type=\"button\"\r\n// onClick={onBack}\r\n// className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n// >\r\n// Try Again\r\n// </button>\r\n// </div>\r\n// )}\r\n// </div>\r\n\r\n// {/* Footer */}\r\n// <div className=\"text-center text-xs text-gray-500\">\r\n// <p>Powered by <span className='text-[#7042D2]'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// );\r\n// };\r\n\r\n// // Helper functions\r\n// const getExplorerUrl = (network) => {\r\n// const explorers = {\r\n// ethereum: 'https://etherscan.io',\r\n// bsc: 'https://bscscan.com',\r\n// tron: 'https://tronscan.org',\r\n// algorand: 'https://algoexplorer.io'\r\n// };\r\n// return explorers[network] || 'https://etherscan.io';\r\n// };\r\n\r\n// const getExplorerPath = (network) => {\r\n// const paths = {\r\n// ethereum: 'tx',\r\n// bsc: 'tx',\r\n// tron: 'transaction',\r\n// algorand: 'tx'\r\n// };\r\n// return paths[network] || 'tx';\r\n// };\r\n\r\n// export default CoinleyModal;\r\n\r\n\r\n\r\n\r\n// src/components/CoinleyModal.jsx\r\nimport React, { useState, useEffect } from 'react';\r\nimport PaymentMethods from './PaymentMethods';\r\nimport PaymentStatus from './PaymentStatus';\r\nimport QRCode from './QRCode';\r\nimport { WALLET_TYPES, getWalletInstallUrl, detectWallets } from '../services/walletService';\r\nimport logo from '../assets/Logo.png';\r\n\r\nconst CoinleyModal = ({\r\n isOpen,\r\n onClose,\r\n payment,\r\n paymentStatus,\r\n selectedPaymentMethod,\r\n onPaymentMethodSelect,\r\n onPayment,\r\n onBack,\r\n error,\r\n theme = 'light',\r\n merchantName,\r\n transactionHash,\r\n walletConnection,\r\n onConnectWallet,\r\n testMode = false,\r\n supportedNetworks = [],\r\n availableWallets = {},\r\n supportedWallets = [],\r\n step = 'select-currency',\r\n merchantWalletAddresses = {}\r\n}) => {\r\n const [paymentType, setPaymentType] = useState('wallet'); // 'wallet' or 'qrcode'\r\n\r\n // Get wallet address for current network\r\n const getWalletAddressForNetwork = () => {\r\n if (!selectedPaymentMethod) return 'No network selected';\r\n \r\n const networkAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n if (networkAddress) {\r\n return networkAddress;\r\n }\r\n \r\n // Fallback to payment recipient wallet if available\r\n if (payment?.recipientWallet) {\r\n return payment.recipientWallet;\r\n }\r\n \r\n return 'No wallet address configured for this network';\r\n };\r\n\r\n // Utility functions\r\n const formatAmount = (amount) => {\r\n return parseFloat(amount).toFixed(2);\r\n };\r\n\r\n const formatTransactionHash = (hash) => {\r\n if (!hash) return '';\r\n if (hash.length <= 14) return hash;\r\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n };\r\n\r\n const getNetworkDisplayName = (network) => {\r\n const names = {\r\n ethereum: 'Ethereum',\r\n bsc: 'BSC',\r\n tron: 'Tron',\r\n algorand: 'Algorand'\r\n };\r\n return names[network] || network;\r\n };\r\n\r\n const getWalletDisplayName = (walletType) => {\r\n const names = {\r\n [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n };\r\n return names[walletType] || walletType;\r\n };\r\n\r\n const getWalletIcon = (walletType) => {\r\n const icons = {\r\n [WALLET_TYPES.METAMASK]: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/images/logo.png',\r\n [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/assets/images/trust_logotype.svg',\r\n [WALLET_TYPES.LUTE]: 'https://lute.app/logo.png'\r\n };\r\n return icons[walletType] || '';\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 overflow-y-auto bg-black/50\">\r\n <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n <div className=\"relative p-6 w-full max-w-md mx-auto rounded-lg shadow-xl bg-white text-gray-800\">\r\n {/* Header */}\r\n <div className=\"flex justify-between items-center mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n <div className=\"flex items-center\">\r\n <h2 className=\"text-xl font-bold text-gray-900\">\r\n <img src={logo} className='w-32' alt=\"Coinley Logo\" />\r\n </h2>\r\n </div>\r\n <button \r\n onClick={onClose}\r\n className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n \r\n {/* Content */}\r\n <div className=\"mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n {payment && (\r\n <div className=\"mb-6 p-4 rounded-lg\">\r\n <p className=\"text-lg text-gray-800 font-semibold\">\r\n PAY: {merchantName}\r\n </p>\r\n <div className=\"flex justify-between items-center mt-2 bg-gray-100 px-3 rounded-lg\">\r\n <span className=\"font-medium text-gray-700\">\r\n Amount:\r\n </span>\r\n <span className=\"font-bold text-xl text-[#7042D2]\">\r\n ${formatAmount(payment.totalAmount || payment.amount)}\r\n </span>\r\n </div>\r\n <div className=\"text-xs mt-1 text-right\">\r\n <span className=\"text-gray-500\">\r\n Payment ID: {payment.id ? payment.id.slice(0, 8) : ''}...\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step: Select Currency/Network */}\r\n {step === 'select-currency' && (\r\n <div>\r\n <PaymentMethods \r\n onSelect={onPaymentMethodSelect} \r\n selected={selectedPaymentMethod}\r\n theme={theme}\r\n supportedNetworks={supportedNetworks}\r\n />\r\n \r\n {/* FIXED: Proceed Button - simplified logic */}\r\n {selectedPaymentMethod && (\r\n <div className=\"mt-6\">\r\n <button\r\n onClick={() => {\r\n console.log('Proceed button clicked, calling onPaymentMethodSelect');\r\n onPaymentMethodSelect(selectedPaymentMethod);\r\n }}\r\n className=\"w-full py-3 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-lg transition-colors\"\r\n disabled={!selectedPaymentMethod}\r\n >\r\n Proceed with {selectedPaymentMethod.currency} on {getNetworkDisplayName(selectedPaymentMethod.network)}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Step: Confirm Payment */}\r\n {step === 'confirm' && selectedPaymentMethod && payment && (\r\n <div>\r\n <div className=\"p-4 rounded-lg mb-4 bg-gray-100\">\r\n <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n Payment Details\r\n </h3>\r\n <div className=\"space-y-2\">\r\n <div className=\"flex justify-between\">\r\n <span className=\"text-[#7042D2] font-semibold\">Currency:</span>\r\n <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span className=\"text-[#7042D2] font-semibold\">Network:</span>\r\n <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span className=\"text-[#7042D2] font-semibold\">Fee:</span>\r\n <span className=\"font-medium\">1.75%</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Payment Method Tabs */}\r\n <div className=\"mb-4\">\r\n <div className=\"flex border-b border-gray-200\">\r\n <button\r\n onClick={() => setPaymentType('wallet')}\r\n className={`py-2 px-4 text-sm font-medium ${\r\n paymentType === 'wallet'\r\n ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n : 'text-gray-500 hover:text-gray-700'\r\n }`}\r\n >\r\n Connect Wallet\r\n </button>\r\n <button\r\n onClick={() => setPaymentType('qrcode')}\r\n className={`py-2 px-4 text-sm font-medium ${\r\n paymentType === 'qrcode'\r\n ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n : 'text-gray-500 hover:text-gray-700'\r\n }`}\r\n >\r\n QR Code\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {testMode ? (\r\n // Test mode payment option\r\n <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n <div className=\"flex items-center\">\r\n <div className=\"bg-[#7042D2] rounded-full p-2 mr-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium text-gray-800\">\r\n Test Mode Payment\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">\r\n Click \"Pay Now\" to simulate a successful payment\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n ) : paymentType === 'qrcode' ? (\r\n // QR Code payment option\r\n <div className=\"mb-4\">\r\n <QRCode \r\n walletAddress={getWalletAddressForNetwork()} \r\n amount={payment.totalAmount || payment.amount}\r\n currency={selectedPaymentMethod.currency}\r\n network={selectedPaymentMethod.network}\r\n theme={theme}\r\n />\r\n </div>\r\n ) : (\r\n // Wallet connection option\r\n <div className=\"space-y-3 mb-4\">\r\n {supportedWallets.length === 0 ? (\r\n <div className=\"p-4 rounded-lg bg-yellow-50\">\r\n <div className=\"flex items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-yellow-500 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n <div>\r\n <h3 className=\"font-medium text-gray-800\">No Compatible Wallets</h3>\r\n <p className=\"text-sm text-gray-600\">\r\n No wallets detected for {getNetworkDisplayName(selectedPaymentMethod.network)} network\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n supportedWallets.map((walletType) => (\r\n <div key={walletType} className=\"p-4 rounded-lg bg-blue-50\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center\">\r\n <img \r\n src={getWalletIcon(walletType)} \r\n alt={getWalletDisplayName(walletType)}\r\n className=\"w-8 h-8 mr-3\"\r\n onError={(e) => {\r\n e.target.style.display = 'none';\r\n }}\r\n />\r\n <div>\r\n <h3 className=\"font-medium text-gray-800\">\r\n {getWalletDisplayName(walletType)}\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">\r\n Pay with {getWalletDisplayName(walletType)}\r\n </p>\r\n </div>\r\n </div>\r\n \r\n {walletConnection?.walletType === walletType ? (\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\r\n <span className=\"text-sm text-green-600\">Connected</span>\r\n </div>\r\n ) : (\r\n <button\r\n onClick={() => {\r\n console.log('Connect wallet button clicked for:', walletType);\r\n onConnectWallet(walletType);\r\n }}\r\n className=\"py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md text-sm\"\r\n >\r\n Connect\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n ))\r\n )}\r\n\r\n {/* Install wallet links for missing wallets */}\r\n <div className=\"space-y-2\">\r\n {Object.entries(availableWallets)\r\n .filter(([walletType, isAvailable]) => !isAvailable)\r\n .map(([walletType]) => (\r\n <div key={walletType} className=\"p-3 rounded-lg bg-gray-50\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm text-gray-600\">\r\n {getWalletDisplayName(walletType)} not detected\r\n </span>\r\n <a\r\n href={getWalletInstallUrl(walletType)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-sm text-[#7042D2] hover:underline\"\r\n >\r\n Install\r\n </a>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={onBack}\r\n className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-[#7042D2] font-medium rounded-md\"\r\n >\r\n Back\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onPayment(paymentType === 'qrcode')}\r\n className=\"w-full py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md\"\r\n disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n >\r\n {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step: Processing */}\r\n {step === 'processing' && (\r\n <PaymentStatus \r\n status=\"processing\" \r\n theme={theme}\r\n message=\"Processing your payment...\"\r\n />\r\n )}\r\n\r\n {/* Step: Success */}\r\n {step === 'success' && (\r\n <div>\r\n <PaymentStatus \r\n status=\"success\" \r\n theme={theme}\r\n message=\"Payment successful!\"\r\n />\r\n {transactionHash && (\r\n <div className=\"mt-4 p-3 rounded-lg bg-gray-100\">\r\n <p className=\"text-xs text-gray-600 mb-1\">\r\n Transaction Hash:\r\n </p>\r\n <p className=\"text-sm font-mono break-all text-gray-800\">\r\n {formatTransactionHash(transactionHash)}\r\n </p>\r\n {selectedPaymentMethod && (\r\n <a \r\n href={`${getExplorerUrl(selectedPaymentMethod.network)}/${getExplorerPath(selectedPaymentMethod.network)}/${transactionHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-xs text-[#7042D2] mt-2 inline-block\"\r\n >\r\n View on Explorer →\r\n </a>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Step: Error */}\r\n {step === 'error' && (\r\n <div>\r\n <PaymentStatus \r\n status=\"error\" \r\n theme={theme}\r\n message={error || \"An error occurred while processing your payment.\"}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={onBack}\r\n className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"text-center text-xs text-gray-500\">\r\n <p>Powered by <span className='text-[#7042D2]'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Helper functions\r\nconst getExplorerUrl = (network) => {\r\n const explorers = {\r\n ethereum: 'https://etherscan.io',\r\n bsc: 'https://bscscan.com',\r\n tron: 'https://tronscan.org',\r\n algorand: 'https://algoexplorer.io'\r\n };\r\n return explorers[network] || 'https://etherscan.io';\r\n};\r\n\r\nconst getExplorerPath = (network) => {\r\n const paths = {\r\n ethereum: 'tx',\r\n bsc: 'tx',\r\n tron: 'transaction',\r\n algorand: 'tx'\r\n };\r\n return paths[network] || 'tx';\r\n};\r\n\r\nexport default CoinleyModal;","export default \"data:image/png;base64,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\"","// // src/components/CoinleyCheckout.jsx\r\n// import React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\n// import { useCoinley } from '../context/CoinleyContext';\r\n// import { useTheme } from '../context/ThemeContext';\r\n// import CoinleyModal from './CoinleyModal';\r\n// import { createPayment, processPayment } from '../services/api';\r\n// import { \r\n// connectWallet, \r\n// sendTransaction, \r\n// detectWallets, \r\n// getSupportedWalletsForNetwork,\r\n// NETWORK_TYPES,\r\n// WALLET_TYPES \r\n// } from '../services/walletService';\r\n\r\n// /**\r\n// * Enhanced Coinley checkout component with multi-network support\r\n// */\r\n// const CoinleyCheckout = forwardRef(({ \r\n// apiKey,\r\n// apiSecret,\r\n// apiUrl,\r\n// customerEmail,\r\n// merchantName = 'Merchant',\r\n// merchantWalletAddresses = {}, // Object with network-specific addresses\r\n// onSuccess,\r\n// onError,\r\n// onClose,\r\n// theme,\r\n// autoOpen = false,\r\n// debug = false,\r\n// testMode = false,\r\n// supportedNetworks = [], // Array of supported networks\r\n// preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n// preferredWallet = WALLET_TYPES.METAMASK\r\n// }, ref) => {\r\n// // Context\r\n// const coinleyContext = useCoinley();\r\n// const { theme: contextTheme } = useTheme();\r\n \r\n// // State\r\n// const [isOpen, setIsOpen] = useState(autoOpen);\r\n// const [payment, setPayment] = useState(null);\r\n// const [paymentStatus, setPaymentStatus] = useState('idle');\r\n// const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n// const [error, setError] = useState(null);\r\n// const [transactionHash, setTransactionHash] = useState(null);\r\n// const [walletConnection, setWalletConnection] = useState(null);\r\n// const [availableWallets, setAvailableWallets] = useState({});\r\n// const [step, setStep] = useState('select-currency');\r\n \r\n// // Use the component props or fallback to context values\r\n// const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n// const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n// const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n// const effectiveTheme = theme || contextTheme;\r\n// const effectiveDebug = debug || coinleyContext?.debug;\r\n// const effectiveSupportedNetworks = supportedNetworks.length > 0 \r\n// ? supportedNetworks \r\n// : [NETWORK_TYPES.ETHEREUM, NETWORK_TYPES.BSC, NETWORK_TYPES.TRON, NETWORK_TYPES.ALGORAND];\r\n\r\n// // Expose methods via ref\r\n// useImperativeHandle(ref, () => ({\r\n// open: (paymentDetails) => {\r\n// handleOpen(paymentDetails);\r\n// },\r\n// close: () => {\r\n// handleClose();\r\n// },\r\n// getPayment: () => payment,\r\n// getWalletConnection: () => walletConnection\r\n// }));\r\n\r\n// // Debug logging helper\r\n// const log = (message, data) => {\r\n// if (effectiveDebug) {\r\n// console.log(`[Coinley SDK] ${message}`, data);\r\n// }\r\n// };\r\n\r\n// // Check available wallets on mount\r\n// useEffect(() => {\r\n// if (typeof window !== 'undefined') {\r\n// const wallets = detectWallets();\r\n// setAvailableWallets(wallets);\r\n \r\n// log('Available wallets detected:', wallets);\r\n// }\r\n// }, [effectiveDebug]);\r\n\r\n// // Handle opening the payment modal\r\n// const handleOpen = async (paymentDetails) => {\r\n// if (!paymentDetails || !paymentDetails.amount) {\r\n// setError('Payment amount is required');\r\n// if (onError) onError(new Error('Payment amount is required'));\r\n// return;\r\n// }\r\n\r\n// setPaymentStatus('loading');\r\n// setIsOpen(true);\r\n// setStep('select-currency');\r\n\r\n// try {\r\n// log('Creating payment with details:', paymentDetails);\r\n \r\n// // Create a payment on the Coinley backend\r\n// const paymentResponse = await createPayment({\r\n// amount: paymentDetails.amount,\r\n// currency: paymentDetails.currency || 'USDT',\r\n// network: paymentDetails.network || preferredNetwork,\r\n// customerEmail: paymentDetails.customerEmail || customerEmail,\r\n// callbackUrl: paymentDetails.callbackUrl,\r\n// metadata: paymentDetails.metadata || {},\r\n// merchantWalletAddresses: {\r\n// ...merchantWalletAddresses,\r\n// ...paymentDetails.merchantWalletAddresses\r\n// }\r\n// });\r\n\r\n// log('Payment created:', paymentResponse);\r\n \r\n// setPayment(paymentResponse.payment);\r\n// setPaymentStatus('idle');\r\n// setError(null);\r\n \r\n// log('Payment created and state updated');\r\n// } catch (err) {\r\n// log('Error creating payment:', err);\r\n// setError(err.message || 'Failed to create payment');\r\n// setPaymentStatus('error');\r\n// if (onError) onError(err);\r\n// }\r\n// };\r\n\r\n// // Handle closing the modal\r\n// const handleClose = () => {\r\n// setIsOpen(false);\r\n// setTransactionHash(null);\r\n// setWalletConnection(null);\r\n// setSelectedPaymentMethod(null);\r\n// setStep('select-currency');\r\n// if (onClose) onClose();\r\n// };\r\n\r\n// // Handle payment method selection\r\n// const handlePaymentMethodSelect = (paymentMethod) => {\r\n// log('Payment method selected:', paymentMethod);\r\n// setSelectedPaymentMethod(paymentMethod);\r\n// setStep('confirm');\r\n// };\r\n\r\n// // Handle back navigation\r\n// const handleBack = () => {\r\n// if (step === 'confirm') {\r\n// setStep('select-currency');\r\n// setWalletConnection(null);\r\n// }\r\n// };\r\n\r\n// // Handle wallet connection\r\n// const handleConnectWallet = async (walletType) => {\r\n// if (!selectedPaymentMethod) {\r\n// setError('Please select a payment method first');\r\n// return;\r\n// }\r\n\r\n// try {\r\n// log('Connecting wallet:', { walletType, network: selectedPaymentMethod.network });\r\n \r\n// const connection = await connectWallet(walletType, selectedPaymentMethod.network);\r\n// setWalletConnection(connection);\r\n// setError(null);\r\n \r\n// log('Wallet connected successfully:', connection);\r\n// } catch (err) {\r\n// log('Wallet connection error:', err);\r\n// setError(err.message || 'Failed to connect wallet');\r\n// }\r\n// };\r\n\r\n// // Handle payment submission\r\n// const handlePayment = async () => {\r\n// if (!payment || !selectedPaymentMethod) {\r\n// setError('Missing payment information');\r\n// return;\r\n// }\r\n\r\n// if (!walletConnection && !testMode) {\r\n// setError('Please connect your wallet first');\r\n// return;\r\n// }\r\n\r\n// log('Starting payment process...');\r\n// setPaymentStatus('loading');\r\n// setTransactionHash(null);\r\n\r\n// try {\r\n// let txHash;\r\n\r\n// if (testMode) {\r\n// // Test mode: Generate mock transaction\r\n// log('Test mode: Generating mock transaction...');\r\n// txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n// } else {\r\n// // Real payment flow\r\n// const merchantAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n// if (!merchantAddress) {\r\n// throw new Error(`No merchant wallet address configured for ${selectedPaymentMethod.network}`);\r\n// }\r\n\r\n// // Send transaction through wallet\r\n// log('Sending transaction through wallet...');\r\n// txHash = await sendTransaction(walletConnection, {\r\n// to: merchantAddress,\r\n// amount: payment.amount,\r\n// tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n// tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals\r\n// });\r\n// }\r\n\r\n// log('Transaction hash:', txHash);\r\n// setTransactionHash(txHash);\r\n\r\n// // Process the payment on the Coinley backend\r\n// log('Processing payment with backend...');\r\n// const processResponse = await processPayment({\r\n// paymentId: payment.id,\r\n// transactionHash: txHash,\r\n// network: selectedPaymentMethod.network,\r\n// currency: selectedPaymentMethod.currency,\r\n// senderAddress: walletConnection?.address\r\n// });\r\n\r\n// log('Payment processed successfully:', processResponse);\r\n\r\n// setPaymentStatus('success');\r\n// setStep('success');\r\n \r\n// // Call the onSuccess callback\r\n// if (onSuccess) {\r\n// log('Calling onSuccess callback...');\r\n// onSuccess(payment.id, txHash, {\r\n// network: selectedPaymentMethod.network,\r\n// currency: selectedPaymentMethod.currency,\r\n// amount: payment.amount\r\n// });\r\n// }\r\n\r\n// } catch (err) {\r\n// log('Payment error:', err);\r\n// setError(err.message || 'Failed to process payment');\r\n// setPaymentStatus('error');\r\n// setStep('error');\r\n// if (onError) onError(err);\r\n// }\r\n// };\r\n\r\n// // Get supported wallets for current network\r\n// const getSupportedWallets = () => {\r\n// if (!selectedPaymentMethod) return [];\r\n// return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n// };\r\n\r\n// return (\r\n// <>\r\n// {isOpen && (\r\n// <CoinleyModal\r\n// isOpen={isOpen}\r\n// onClose={handleClose}\r\n// payment={payment}\r\n// paymentStatus={paymentStatus}\r\n// selectedPaymentMethod={selectedPaymentMethod}\r\n// onPaymentMethodSelect={handlePaymentMethodSelect}\r\n// onPayment={handlePayment}\r\n// onBack={handleBack}\r\n// error={error}\r\n// theme={effectiveTheme}\r\n// merchantName={merchantName}\r\n// transactionHash={transactionHash}\r\n// walletConnection={walletConnection}\r\n// onConnectWallet={handleConnectWallet}\r\n// testMode={testMode}\r\n// supportedNetworks={effectiveSupportedNetworks}\r\n// availableWallets={availableWallets}\r\n// supportedWallets={getSupportedWallets()}\r\n// step={step}\r\n// />\r\n// )}\r\n// </>\r\n// );\r\n// });\r\n\r\n// // Add display name for better debugging\r\n// CoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\n// export default CoinleyCheckout;\r\n\r\n\r\n// src/components/CoinleyCheckout.jsx\r\nimport React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport { useCoinley } from '../context/CoinleyContext';\r\nimport { useTheme } from '../context/ThemeContext';\r\nimport CoinleyModal from './CoinleyModal';\r\nimport { createPayment, processPayment } from '../services/api';\r\nimport { \r\n connectWallet, \r\n sendTransaction, \r\n detectWallets, \r\n getSupportedWalletsForNetwork,\r\n NETWORK_TYPES,\r\n WALLET_TYPES \r\n} from '../services/walletService';\r\n\r\n/**\r\n * Enhanced Coinley checkout component with multi-network support\r\n */\r\nconst CoinleyCheckout = forwardRef(({ \r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n customerEmail,\r\n merchantName = 'Merchant',\r\n merchantWalletAddresses = {}, // Object with network-specific addresses\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme,\r\n autoOpen = false,\r\n debug = false,\r\n testMode = false,\r\n supportedNetworks = [], // Array of supported networks\r\n preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n preferredWallet = WALLET_TYPES.METAMASK\r\n}, ref) => {\r\n // Context\r\n const coinleyContext = useCoinley();\r\n const { theme: contextTheme } = useTheme();\r\n \r\n // State\r\n const [isOpen, setIsOpen] = useState(autoOpen);\r\n const [payment, setPayment] = useState(null);\r\n const [paymentStatus, setPaymentStatus] = useState('idle');\r\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [transactionHash, setTransactionHash] = useState(null);\r\n const [walletConnection, setWalletConnection] = useState(null);\r\n const [availableWallets, setAvailableWallets] = useState({});\r\n const [step, setStep] = useState('select-currency');\r\n \r\n // Use the component props or fallback to context values\r\n const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n const effectiveTheme = theme || contextTheme;\r\n const effectiveDebug = debug || coinleyContext?.debug;\r\n const effectiveSupportedNetworks = supportedNetworks.length > 0 \r\n ? supportedNetworks \r\n : [NETWORK_TYPES.ETHEREUM, NETWORK_TYPES.BSC, NETWORK_TYPES.TRON, NETWORK_TYPES.ALGORAND];\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n open: (paymentDetails) => {\r\n handleOpen(paymentDetails);\r\n },\r\n close: () => {\r\n handleClose();\r\n },\r\n getPayment: () => payment,\r\n getWalletConnection: () => walletConnection\r\n }));\r\n\r\n // Debug logging helper\r\n const log = (message, data) => {\r\n if (effectiveDebug) {\r\n console.log(`[Coinley SDK] ${message}`, data);\r\n }\r\n };\r\n\r\n // Check available wallets on mount\r\n useEffect(() => {\r\n if (typeof window !== 'undefined') {\r\n const wallets = detectWallets();\r\n setAvailableWallets(wallets);\r\n \r\n log('Available wallets detected:', wallets);\r\n }\r\n }, [effectiveDebug]);\r\n\r\n // Handle opening the payment modal\r\n const handleOpen = async (paymentDetails) => {\r\n if (!paymentDetails || !paymentDetails.amount) {\r\n setError('Payment amount is required');\r\n if (onError) onError(new Error('Payment amount is required'));\r\n return;\r\n }\r\n\r\n setPaymentStatus('loading');\r\n setIsOpen(true);\r\n setStep('select-currency');\r\n\r\n try {\r\n log('Creating payment with details:', paymentDetails);\r\n \r\n // Create a payment on the Coinley backend\r\n const paymentResponse = await createPayment({\r\n amount: paymentDetails.amount,\r\n currency: paymentDetails.currency || 'USDT',\r\n network: paymentDetails.network || preferredNetwork,\r\n customerEmail: paymentDetails.customerEmail || customerEmail,\r\n callbackUrl: paymentDetails.callbackUrl,\r\n metadata: paymentDetails.metadata || {},\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...paymentDetails.merchantWalletAddresses\r\n }\r\n });\r\n\r\n log('Payment created:', paymentResponse);\r\n \r\n setPayment(paymentResponse.payment);\r\n setPaymentStatus('idle');\r\n setError(null);\r\n \r\n log('Payment created and state updated');\r\n } catch (err) {\r\n log('Error creating payment:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setPaymentStatus('error');\r\n if (onError) onError(err);\r\n }\r\n };\r\n\r\n // Handle closing the modal\r\n const handleClose = () => {\r\n setIsOpen(false);\r\n setTransactionHash(null);\r\n setWalletConnection(null);\r\n setSelectedPaymentMethod(null);\r\n setStep('select-currency');\r\n if (onClose) onClose();\r\n };\r\n\r\n // FIXED: Handle payment method selection - this should move to confirm step\r\n const handlePaymentMethodSelect = (paymentMethod) => {\r\n console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n console.log('1. Payment method selected:', paymentMethod);\r\n console.log('2. Current step before:', step);\r\n \r\n log('Payment method selected:', paymentMethod);\r\n setSelectedPaymentMethod(paymentMethod);\r\n \r\n // FIXED: Move to confirm step after selection\r\n setStep('confirm');\r\n \r\n console.log('3. Step should now be: confirm');\r\n console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n };\r\n\r\n // Handle back navigation\r\n const handleBack = () => {\r\n if (step === 'confirm') {\r\n setStep('select-currency');\r\n setWalletConnection(null);\r\n }\r\n };\r\n\r\n // FIXED: Handle wallet connection with enhanced debugging\r\n const handleConnectWallet = async (walletType) => {\r\n console.log('=== WALLET CONNECTION DEBUG ===');\r\n console.log('1. Wallet type requested:', walletType);\r\n console.log('2. Selected payment method:', selectedPaymentMethod);\r\n console.log('3. Available wallets:', availableWallets);\r\n console.log('4. Current step:', step);\r\n\r\n if (!selectedPaymentMethod) {\r\n console.error('No payment method selected');\r\n setError('Please select a payment method first');\r\n return;\r\n }\r\n\r\n try {\r\n console.log('5. Attempting to connect wallet...');\r\n setError(null); // Clear any previous errors\r\n \r\n log('Connecting wallet:', { walletType, network: selectedPaymentMethod.network });\r\n \r\n const connection = await connectWallet(walletType, selectedPaymentMethod.network);\r\n setWalletConnection(connection);\r\n setError(null);\r\n \r\n console.log('6. Connection successful:', connection);\r\n log('Wallet connected successfully:', connection);\r\n } catch (err) {\r\n console.error('7. Connection failed:', err);\r\n log('Wallet connection error:', err);\r\n setError(err.message || 'Failed to connect wallet');\r\n }\r\n \r\n console.log('=== END WALLET CONNECTION DEBUG ===');\r\n };\r\n\r\n // Handle payment submission\r\n const handlePayment = async () => {\r\n if (!payment || !selectedPaymentMethod) {\r\n setError('Missing payment information');\r\n return;\r\n }\r\n\r\n if (!walletConnection && !testMode) {\r\n setError('Please connect your wallet first');\r\n return;\r\n }\r\n\r\n log('Starting payment process...');\r\n setPaymentStatus('loading');\r\n setTransactionHash(null);\r\n\r\n try {\r\n let txHash;\r\n\r\n if (testMode) {\r\n // Test mode: Generate mock transaction\r\n log('Test mode: Generating mock transaction...');\r\n txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n } else {\r\n // Real payment flow\r\n const merchantAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n if (!merchantAddress) {\r\n throw new Error(`No merchant wallet address configured for ${selectedPaymentMethod.network}`);\r\n }\r\n\r\n // Send transaction through wallet\r\n log('Sending transaction through wallet...');\r\n txHash = await sendTransaction(walletConnection, {\r\n to: merchantAddress,\r\n amount: payment.amount,\r\n tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals\r\n });\r\n }\r\n\r\n log('Transaction hash:', txHash);\r\n setTransactionHash(txHash);\r\n\r\n // Process the payment on the Coinley backend\r\n log('Processing payment with backend...');\r\n const processResponse = await processPayment({\r\n paymentId: payment.id,\r\n transactionHash: txHash,\r\n network: selectedPaymentMethod.network,\r\n currency: selectedPaymentMethod.currency,\r\n senderAddress: walletConnection?.address\r\n });\r\n\r\n log('Payment processed successfully:', processResponse);\r\n\r\n setPaymentStatus('success');\r\n setStep('success');\r\n \r\n // Call the onSuccess callback\r\n if (onSuccess) {\r\n log('Calling onSuccess callback...');\r\n onSuccess(payment.id, txHash, {\r\n network: selectedPaymentMethod.network,\r\n currency: selectedPaymentMethod.currency,\r\n amount: payment.amount\r\n });\r\n }\r\n\r\n } catch (err) {\r\n log('Payment error:', err);\r\n setError(err.message || 'Failed to process payment');\r\n setPaymentStatus('error');\r\n setStep('error');\r\n if (onError) onError(err);\r\n }\r\n };\r\n\r\n // Get supported wallets for current network\r\n const getSupportedWallets = () => {\r\n if (!selectedPaymentMethod) return [];\r\n return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n };\r\n\r\n return (\r\n <>\r\n {isOpen && (\r\n <CoinleyModal\r\n isOpen={isOpen}\r\n onClose={handleClose}\r\n payment={payment}\r\n paymentStatus={paymentStatus}\r\n selectedPaymentMethod={selectedPaymentMethod}\r\n onPaymentMethodSelect={handlePaymentMethodSelect}\r\n onPayment={handlePayment}\r\n onBack={handleBack}\r\n error={error}\r\n theme={effectiveTheme}\r\n merchantName={merchantName}\r\n transactionHash={transactionHash}\r\n walletConnection={walletConnection}\r\n onConnectWallet={handleConnectWallet}\r\n testMode={testMode}\r\n supportedNetworks={effectiveSupportedNetworks}\r\n availableWallets={availableWallets}\r\n supportedWallets={getSupportedWallets()}\r\n step={step}\r\n merchantWalletAddresses={merchantWalletAddresses}\r\n />\r\n )}\r\n </>\r\n );\r\n});\r\n\r\n// Add display name for better debugging\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport default CoinleyCheckout;","// // src/index.js - Production Version\r\n// import { ThemeProvider } from './context/ThemeContext';\r\n// import { CoinleyProvider } from './context/CoinleyContext';\r\n// import CoinleyCheckout from './components/CoinleyCheckout';\r\n// import CoinleyModal from './components/CoinleyModal';\r\n// import './styles.css';\r\n\r\n// // Export primary components\r\n// export {\r\n// ThemeProvider,\r\n// CoinleyProvider,\r\n// CoinleyCheckout,\r\n// CoinleyModal\r\n// };\r\n\r\n// // Export API utilities\r\n// export {\r\n// createPayment,\r\n// getPayment,\r\n// processPayment,\r\n// getMerchantPayments,\r\n// getMerchantPaymentStats,\r\n// getSupportedCurrencies\r\n// } from './services/api';\r\n\r\n// // Export Web3 utilities\r\n// export {\r\n// isMetaMaskInstalled,\r\n// connectWallet,\r\n// getAccounts,\r\n// getChainId,\r\n// sendTransaction,\r\n// sendToken,\r\n// isWalletConnected,\r\n// getNetworkName,\r\n// getTokenBalance,\r\n// TOKEN_ADDRESSES\r\n// } from './services/web3';\r\n\r\n// // Default configuration\r\n// export const DEFAULT_CONFIG = {\r\n// apiUrl: 'https://coinleyserver-production.up.railway.app\"',\r\n// debug: false,\r\n// testMode: false,\r\n// theme: 'light'\r\n// };\r\n\r\n// // Version info\r\n// export const VERSION = '1.0.0';\r\n\r\n\r\n\r\n// src/index.js - Restructured for build compatibility\r\n// First import styles\r\n// import './styles.css';\r\n\r\n// // Utility imports first (no component dependencies)\r\n// import { createPayment, getPayment, processPayment } from './services/api';\r\n// import { isMetaMaskInstalled, connectWallet } from './services/web3';\r\n\r\n// // Context providers (no component dependencies)\r\n// import { ThemeProvider } from './context/ThemeContext';\r\n// import { CoinleyProvider } from './context/CoinleyContext';\r\n\r\n// // Individual component exports to avoid circular references\r\n// export { ThemeProvider };\r\n// export { CoinleyProvider };\r\n\r\n// // First export API functions (no component dependencies)\r\n// export { createPayment, getPayment, processPayment };\r\n// export { isMetaMaskInstalled, connectWallet };\r\n\r\n// // Then import and export components in dependency order\r\n// import QRCode from './components/QRCode';\r\n// export { QRCode };\r\n\r\n// import PaymentStatus from './components/PaymentStatus';\r\n// export { PaymentStatus };\r\n\r\n// import PaymentMethods from './components/PaymentMethods';\r\n// export { PaymentMethods };\r\n\r\n// // Last import and export the main components that depend on others\r\n// import CoinleyModal from './components/CoinleyModal';\r\n// export { CoinleyModal };\r\n\r\n// import CoinleyCheckout from './components/CoinleyCheckout';\r\n// export { CoinleyCheckout };\r\n\r\n// // Constants\r\n// export const DEFAULT_CONFIG = {\r\n// apiUrl: 'https://coinleyserver-production.up.railway.app',\r\n// debug: false,\r\n// testMode: false,\r\n// theme: 'light'\r\n// };\r\n\r\n// export const VERSION = '0.3.0';\r\n\r\n\r\n// src/index.js - Fixed main export file with proper exports\r\n// Import styles first\r\nimport './styles.css';\r\n\r\n// Export wallet service utilities and constants\r\nexport { \r\n connectWallet,\r\n sendTransaction,\r\n detectWallets,\r\n getSupportedWalletsForNetwork,\r\n getWalletInstallUrl,\r\n NETWORK_TYPES,\r\n WALLET_TYPES,\r\n TOKEN_CONFIG,\r\n NETWORK_CONFIG\r\n} from './services/walletService';\r\n\r\n// Export API functions\r\nexport { \r\n createPayment, \r\n getPayment, \r\n processPayment,\r\n getSupportedNetworks,\r\n getMerchantProfile,\r\n validateWalletAddress,\r\n generateMockTransactionHash\r\n} from './services/api';\r\n\r\n// Export context providers\r\nexport { ThemeProvider } from './context/ThemeContext';\r\nexport { CoinleyProvider, useCoinley } from './context/CoinleyContext';\r\n\r\n// Export components\r\nexport { default as QRCode } from './components/QRCode';\r\nexport { default as PaymentStatus } from './components/PaymentStatus';\r\nexport { default as PaymentMethods } from './components/PaymentMethods';\r\nexport { default as CoinleyModal } from './components/CoinleyModal';\r\nexport { default as CoinleyCheckout } from './components/CoinleyCheckout';\r\n\r\n// Export constants\r\nexport const DEFAULT_CONFIG = {\r\n apiUrl: 'http://localhost:9000',\r\n debug: false,\r\n testMode: false,\r\n theme: 'light',\r\n supportedNetworks: ['ethereum', 'bsc', 'tron', 'algorand']\r\n};\r\n"],"names":["NETWORK_TYPES","ETHEREUM","BSC","TRON","ALGORAND","WALLET_TYPES","METAMASK","TRONLINK","TRUST_WALLET","LUTE","NETWORK_CONFIG","chainId","chainName","nativeCurrency","name","symbol","decimals","rpcUrls","blockExplorerUrls","supportedWallets","fullHost","explorerUrl","network","TOKEN_CONFIG","USDT","address","USDC","PYUSD","FRAX","USDP","DAI","BUSD","USDJ","ALGO","detectWallets","wallets","window","console","log","ethereum","isMetaMask","providers","Array","isArray","find","p","isTrust","isTrustWallet","constructor","navigator","userAgent","includes","trustwallet","tronWeb","defaultAddress","tronLink","tron","ready","installed","algorand","isLute","toLowerCase","error","warn","getSupportedWalletsForNetwork","networkConfig","availableWallets","filter","wallet","connectWallet","walletType","__async","this","connectMetaMask","connectTronLink","connectTrustWallet","connectLute","Error","accounts","request","method","length","switchEVMNetwork","connection","code","message","attempts","Promise","resolve","setTimeout","_a","base58","connect","params","switchError","addError","sendTransaction","walletConnection","transactionData","to","amount","tokenAddress","tokenDecimals","currency","sendEVMTransactionNative","sendTronTransaction","sendAlgorandTransaction","from","actualTokenAddress","actualDecimals","tokenConfig","getTokenConfig","configError","amountHex","parseInt","amountNum","parseFloat","isNaN","multiplier","Math","pow","amountInSmallestUnit","floor","hexAmount","toString","originalAmount","calculatedAmount","calculateTokenAmount","transferMethodId","paddedToAddress","replace","padStart","paddedAmount","data","txHash","gas","num","value","amountInSun","contract","at","transfer","send","feeLimit","callValue","trx","txid","microAlgos","txn","type","signedTxn","signTransaction","txId","getWalletInstallUrl","apiConfig","apiKey","apiSecret","apiUrl","merchantWalletAddresses","getHeaders","createPayment","paymentData","enhancedPaymentData","__spreadValues","response","fetch","headers","body","JSON","stringify","status","ok","errorData","json","processPayment","processData","f","require$$0","k","Symbol","for","l","m","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","key","ref","__self","__source","q","c","a","g","b","d","e","h","call","defaultProps","$$typeof","props","_owner","current","reactJsxRuntime_production_min","jsx","jsxs","jsxRuntimeModule","exports","ThemeContext","createContext","CoinleyContext","useCoinley","useContext","qrcodegen","qrcodegen2","__defProp","defineProperty","__getOwnPropSymbols","getOwnPropertySymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","obj","enumerable","configurable","writable","prop","__objRest","source","exclude","target","indexOf","_QrCode","version","errorCorrectionLevel","dataCodewords","msk","modules","isFunction","MIN_VERSION","MAX_VERSION","RangeError","size","row","i","push","slice","drawFunctionPatterns","allCodewords","addEccAndInterleave","drawCodewords","minPenalty","applyMask","drawFormatBits","penalty","getPenaltyScore","assert","mask","encodeText","text","ecl","segs","QrSegment","makeSegments","encodeSegments","encodeBinary","seg","makeBytes","minVersion","maxVersion","boostEcl","dataUsedBits","dataCapacityBits2","getNumDataCodewords","usedBits","getTotalBits","newEcl","Ecc","MEDIUM","QUARTILE","HIGH","bb","appendBits","mode","modeBits","numChars","numCharCountBits","getData","dataCapacityBits","min","padByte","forEach","getModule","x","y","getModules","setFunctionModule","drawFinderPattern","alignPatPos","getAlignmentPatternPositions","numAlign","j","drawAlignmentPattern","drawVersion","formatBits","rem","bits","getBit","color","dy","dx","dist","max","abs","xx","yy","isDark","ver","numBlocks","NUM_ERROR_CORRECTION_BLOCKS","ordinal","blockEccLen","ECC_CODEWORDS_PER_BLOCK","rawCodewords","getNumRawDataModules","numShortBlocks","shortBlockLen","blocks","rsDiv","reedSolomonComputeDivisor","dat","ecc","reedSolomonComputeRemainder","concat","result","block","right","vert","invert","runColor","runX","runHistory","PENALTY_N1","finderPenaltyAddHistory","finderPenaltyCountPatterns","PENALTY_N3","finderPenaltyTerminateAndCount","runY","PENALTY_N2","dark","reduce","sum","total","ceil","PENALTY_N4","step","pos","splice","degree","root","reedSolomonMultiply","divisor","map","_","factor","shift","coef","z","core","currentRunColor","currentRunLength","pop","unshift","val","len","cond","QrCode","_QrSegment","bitData","Mode","BYTE","makeNumeric","digits","isNumeric","substring","NUMERIC","makeAlphanumeric","isAlphanumeric","temp","ALPHANUMERIC_CHARSET","charAt","ALPHANUMERIC","toUtf8ByteArray","makeEci","assignVal","ECI","NUMERIC_REGEX","test","ALPHANUMERIC_REGEX","ccbits","Infinity","str","encodeURI","charCodeAt","QrCode2","_Ecc","LOW","QrSegment2","_Mode","numBitsCharCount","KANJI","qrcodegen_default","ERROR_LEVEL_MAP","L","M","Q","H","DEFAULT_SIZE","DEFAULT_LEVEL","DEFAULT_BGCOLOR","DEFAULT_FGCOLOR","DEFAULT_INCLUDEMARGIN","DEFAULT_MINVERSION","generatePath","margin","ops","start","cell","join","excavateModules","excavation","w","useQRCode","level","includeMargin","marginSize","imageSettings","boostLevel","qrcode","React","useMemo","segments","accum","v","cells","numCells","calculatedImageSettings","cells2","margin2","getMarginSize","numCells2","calculatedImageSettings2","defaultSize","scale","width","height","opacity","excavate","floorX","floorY","crossOrigin","getImageSettings","SUPPORTS_PATH2D","Path2D","addPath","forwardRef","forwardedRef","bgColor","fgColor","_b","style","otherProps","imgSrc","src","_canvas","useRef","_image","setCanvasRef","useCallback","node","isImgLoaded","setIsImageLoaded","useState","useEffect","canvas","ctx","getContext","cellsToDraw","image","haveImageToRender","complete","naturalHeight","naturalWidth","pixelRatio","devicePixelRatio","fillStyle","fillRect","fill","rdx","cdx","globalAlpha","drawImage","canvasStyle","img","createElement","display","onLoad","Fragment","role","displayName","QRCodeSVG","title","href","preserveAspectRatio","fgPath","viewBox","shapeRendering","QRCode","walletAddress","theme","qrData","setQrData","qrError","setQrError","convertToWei","getTokenAddressForCurrency","convertToSmallestUnit","err","bsc","getNetworkDisplayName","className","children","jsxRuntimeExports","xmlns","stroke","strokeLinecap","strokeLinejoin","strokeWidth","onClick","clipboard","writeText","PaymentStatus","renderIcon","getStatusTitle","getMessageClasses","PaymentMethods","onSelect","selected","supportedNetworks","selectedNetwork","setSelectedNetwork","setAvailableWallets","showMore","setShowMore","networks","id","description","availableMethods","methods","logo","getPaymentMethodsForNetwork","visibleMethods","getRequiredWallet","onChange","handleNetworkChange","networkId","handleSelectPaymentMethod","alt","fillRule","clipRule","isAvailable","walletNames","getNetworkRequirement","CoinleyModal","isOpen","onClose","payment","paymentStatus","selectedPaymentMethod","onPaymentMethodSelect","onPayment","onBack","merchantName","transactionHash","onConnectWallet","testMode","paymentType","setPaymentType","getWalletDisplayName","getWalletIcon","totalAmount","toFixed","disabled","networkAddress","recipientWallet","getWalletAddressForNetwork","onError","entries","rel","hash","getExplorerUrl","getExplorerPath","CoinleyCheckout","customerEmail","onSuccess","autoOpen","debug","preferredNetwork","preferredWallet","coinleyContext","contextTheme","setIsOpen","setPayment","setPaymentStatus","setSelectedPaymentMethod","setError","setTransactionHash","setWalletConnection","setStep","effectiveTheme","effectiveDebug","effectiveSupportedNetworks","useImperativeHandle","open","paymentDetails","handleOpen","close","getPayment","getWalletConnection","paymentResponse","callbackUrl","metadata","handleClose","paymentMethod","Date","now","random","merchantAddress","processResponse","paymentId","senderAddress","merchantWalletAddress","merchantSolWalletAddress","isInitialized","setIsInitialized","setPaymentData","config","hasWalletAddresses","keys","storePaymentData","Provider","initialTheme","setTheme","document","documentElement","classList","remove","add","toggleTheme","prevTheme","merchant","walletAddresses"],"mappings":"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","x_google_ignoreList":[2,3,6]}
1
+ {"version":3,"file":"coinley-checkout.umd.js","sources":["../src/services/walletService.js","../src/services/api.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/context/ThemeContext.jsx","../src/context/CoinleyContext.jsx","../node_modules/qrcode.react/lib/esm/index.js","../src/components/QRCode.jsx","../src/components/PaymentStatus.jsx","../src/components/PaymentMethods.jsx","../src/components/CoinleyModal.jsx","../src/assets/Logo.png","../src/components/CoinleyCheckout.jsx","../src/index.js"],"sourcesContent":["// // src/services/walletService.js - ALTERNATIVE VERSION WITHOUT WEB3\r\n// /**\r\n// * Enhanced wallet service using native browser APIs instead of Web3\r\n// */\r\n\r\n// // Network types - ensure these are properly exported\r\n// export const NETWORK_TYPES = {\r\n// ETHEREUM: 'ethereum',\r\n// BSC: 'bsc',\r\n// TRON: 'tron',\r\n// ALGORAND: 'algorand'\r\n// };\r\n \r\n// // Wallet types\r\n// export const WALLET_TYPES = {\r\n// METAMASK: 'metamask',\r\n// TRONLINK: 'tronlink',\r\n// TRUST_WALLET: 'trust_wallet',\r\n// LUTE: 'lute'\r\n// };\r\n \r\n// // Network configurations\r\n// export const NETWORK_CONFIG = {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// chainId: '0x1',\r\n// chainName: 'Ethereum Mainnet',\r\n// nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\r\n// rpcUrls: ['https://mainnet.infura.io/v3/'],\r\n// blockExplorerUrls: ['https://etherscan.io/'],\r\n// supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// chainId: '0x38',\r\n// chainName: 'BNB Smart Chain',\r\n// nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },\r\n// rpcUrls: ['https://bsc-dataseed.binance.org/'],\r\n// blockExplorerUrls: ['https://bscscan.com/'],\r\n// supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n// },\r\n// [NETWORK_TYPES.TRON]: {\r\n// fullHost: 'https://api.trongrid.io',\r\n// explorerUrl: 'https://tronscan.org',\r\n// supportedWallets: [WALLET_TYPES.TRONLINK]\r\n// },\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// network: 'mainnet',\r\n// explorerUrl: 'https://algoexplorer.io',\r\n// supportedWallets: [WALLET_TYPES.LUTE]\r\n// }\r\n// };\r\n \r\n// // Token configurations\r\n// export const TOKEN_CONFIG = {\r\n// USDT: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0x55d398326f99059fF775485246999027B3197955',\r\n// decimals: 18\r\n// },\r\n// [NETWORK_TYPES.TRON]: {\r\n// address: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// address: '312769',\r\n// decimals: 6\r\n// }\r\n// },\r\n// USDC: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n// decimals: 18\r\n// },\r\n// [NETWORK_TYPES.TRON]: {\r\n// address: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n// decimals: 6\r\n// },\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// address: '31566704',\r\n// decimals: 6\r\n// }\r\n// },\r\n// PYUSD: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8',\r\n// decimals: 6\r\n// }\r\n// },\r\n// FRAX: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x853d955aCEf822Db058eb8505911ED77F175b99e',\r\n// decimals: 18\r\n// },\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40',\r\n// decimals: 18\r\n// }\r\n// },\r\n// USDP: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x8E870D67F660D95d5be530380D0eC0bd388289E1',\r\n// decimals: 18\r\n// }\r\n// },\r\n// DAI: {\r\n// [NETWORK_TYPES.ETHEREUM]: {\r\n// address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\r\n// decimals: 18\r\n// }\r\n// },\r\n// BUSD: {\r\n// [NETWORK_TYPES.BSC]: {\r\n// address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\r\n// decimals: 18\r\n// }\r\n// },\r\n// USDJ: {\r\n// [NETWORK_TYPES.TRON]: {\r\n// address: 'TMwFHYXLJaRUPeW6421aqXL4ZEzPRFGkGT',\r\n// decimals: 18\r\n// }\r\n// },\r\n// ALGO: {\r\n// [NETWORK_TYPES.ALGORAND]: {\r\n// address: 'native',\r\n// decimals: 6\r\n// }\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Utility function to convert number to hex with proper padding\r\n// */\r\n// const toHex = (num) => {\r\n// return '0x' + Math.floor(parseFloat(num) * Math.pow(10, 18)).toString(16);\r\n// };\r\n \r\n// /**\r\n// * IMPROVED: Utility function to calculate token amount with proper decimal handling\r\n// */\r\n// const calculateTokenAmount = (amount, decimals) => {\r\n// console.log('calculateTokenAmount called with:', { amount, decimals });\r\n \r\n// // Ensure we have valid inputs\r\n// const tokenDecimals = parseInt(decimals) || 18;\r\n// const amountNum = parseFloat(amount);\r\n \r\n// if (isNaN(amountNum) || amountNum <= 0) {\r\n// throw new Error(`Invalid amount: ${amount}`);\r\n// }\r\n \r\n// // Calculate the multiplier based on decimals\r\n// const multiplier = Math.pow(10, tokenDecimals);\r\n// const amountInSmallestUnit = Math.floor(amountNum * multiplier);\r\n \r\n// // Convert to hex\r\n// const hexAmount = '0x' + amountInSmallestUnit.toString(16);\r\n \r\n// console.log('Amount calculation:', {\r\n// originalAmount: amount,\r\n// decimals: tokenDecimals,\r\n// multiplier: multiplier,\r\n// calculatedAmount: amountInSmallestUnit,\r\n// hexAmount: hexAmount\r\n// });\r\n \r\n// return hexAmount;\r\n// };\r\n \r\n// /**\r\n// * IMPROVED: Get token configuration with validation\r\n// */\r\n// const getTokenConfig = (currency, network) => {\r\n// console.log('getTokenConfig called with:', { currency, network });\r\n \r\n// const tokenConfig = TOKEN_CONFIG[currency];\r\n// if (!tokenConfig) {\r\n// throw new Error(`Unsupported currency: ${currency}`);\r\n// }\r\n \r\n// const networkConfig = tokenConfig[network];\r\n// if (!networkConfig) {\r\n// throw new Error(`Currency ${currency} not supported on network ${network}`);\r\n// }\r\n \r\n// console.log('Token config found:', networkConfig);\r\n// return networkConfig;\r\n// };\r\n \r\n// /**\r\n// * ENHANCED: Wallet detection with multiple detection methods and delays\r\n// */\r\n// export const detectWallets = () => {\r\n// const wallets = {\r\n// [WALLET_TYPES.METAMASK]: false,\r\n// [WALLET_TYPES.TRUST_WALLET]: false,\r\n// [WALLET_TYPES.TRONLINK]: false,\r\n// [WALLET_TYPES.LUTE]: false\r\n// };\r\n \r\n// if (typeof window === 'undefined') {\r\n// return wallets;\r\n// }\r\n \r\n// try {\r\n// console.log('=== ENHANCED WALLET DETECTION DEBUG ===');\r\n \r\n// // MetaMask detection - enhanced\r\n// if (window.ethereum) {\r\n// // Check direct MetaMask\r\n// if (window.ethereum.isMetaMask) {\r\n// wallets[WALLET_TYPES.METAMASK] = true;\r\n// console.log('✅ MetaMask detected via direct isMetaMask');\r\n// }\r\n \r\n// // Check in providers array\r\n// if (window.ethereum.providers && Array.isArray(window.ethereum.providers)) {\r\n// const metamaskProvider = window.ethereum.providers.find(p => p.isMetaMask);\r\n// if (metamaskProvider) {\r\n// wallets[WALLET_TYPES.METAMASK] = true;\r\n// console.log('✅ MetaMask detected via providers array');\r\n// }\r\n// }\r\n// }\r\n \r\n// // Trust Wallet detection - ENHANCED with multiple methods\r\n// if (window.ethereum) {\r\n// // Method 1: Direct Trust Wallet detection\r\n// if (window.ethereum.isTrust || window.ethereum.isTrustWallet) {\r\n// wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n// console.log('✅ Trust Wallet detected via direct property');\r\n// }\r\n \r\n// // Method 2: Check for Trust Wallet in providers\r\n// if (window.ethereum.providers && Array.isArray(window.ethereum.providers)) {\r\n// const trustProvider = window.ethereum.providers.find(p => \r\n// p.isTrust || p.isTrustWallet || \r\n// (p.constructor && p.constructor.name === 'TrustWallet')\r\n// );\r\n// if (trustProvider) {\r\n// wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n// console.log('✅ Trust Wallet detected via providers array');\r\n// }\r\n// }\r\n \r\n// // Method 3: Check user agent for Trust Wallet mobile\r\n// if (navigator.userAgent && navigator.userAgent.includes('Trust')) {\r\n// wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n// console.log('✅ Trust Wallet detected via user agent');\r\n// }\r\n \r\n// // Method 4: Check for Trust Wallet specific methods\r\n// if (window.ethereum.isTrustWallet || window.trustwallet) {\r\n// wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n// console.log('✅ Trust Wallet detected via specific methods');\r\n// }\r\n// }\r\n \r\n// // TronLink detection - ENHANCED with multiple methods\r\n// // Method 1: Standard tronWeb detection\r\n// if (window.tronWeb && window.tronWeb.defaultAddress) {\r\n// wallets[WALLET_TYPES.TRONLINK] = true;\r\n// console.log('✅ TronLink detected via tronWeb');\r\n// }\r\n \r\n// // Method 2: Check for tronLink object\r\n// if (window.tronLink) {\r\n// wallets[WALLET_TYPES.TRONLINK] = true;\r\n// console.log('✅ TronLink detected via tronLink object');\r\n// }\r\n \r\n// // Method 3: Check for tron object\r\n// if (window.tron) {\r\n// wallets[WALLET_TYPES.TRONLINK] = true;\r\n// console.log('✅ TronLink detected via tron object');\r\n// }\r\n \r\n// // Method 4: Check for TronLink specific properties\r\n// if (window.tronWeb && (window.tronWeb.ready || window.tronWeb.installed)) {\r\n// wallets[WALLET_TYPES.TRONLINK] = true;\r\n// console.log('✅ TronLink detected via ready/installed properties');\r\n// }\r\n \r\n// // Lute wallet detection (Algorand) - enhanced\r\n// if (window.algorand) {\r\n// if (window.algorand.isLute) {\r\n// wallets[WALLET_TYPES.LUTE] = true;\r\n// console.log('✅ Lute Wallet detected via algorand.isLute');\r\n// } else {\r\n// // Fallback detection for Algorand wallets\r\n// wallets[WALLET_TYPES.LUTE] = true;\r\n// console.log('✅ Algorand wallet detected (assuming Lute)');\r\n// }\r\n// }\r\n \r\n// // Additional checks for mobile apps\r\n// if (window.navigator && window.navigator.userAgent) {\r\n// const userAgent = window.navigator.userAgent.toLowerCase();\r\n \r\n// if (userAgent.includes('trustwallet')) {\r\n// wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n// console.log('✅ Trust Wallet detected via mobile user agent');\r\n// }\r\n \r\n// if (userAgent.includes('tronlink')) {\r\n// wallets[WALLET_TYPES.TRONLINK] = true;\r\n// console.log('✅ TronLink detected via mobile user agent');\r\n// }\r\n// }\r\n \r\n// console.log('Final wallet detection results:', wallets);\r\n// console.log('=== END ENHANCED WALLET DETECTION DEBUG ===');\r\n \r\n// } catch (error) {\r\n// console.warn('Error detecting wallets:', error);\r\n// }\r\n \r\n// return wallets;\r\n// };\r\n\r\n// /**\r\n// * ENHANCED: Detect wallets with retry mechanism (for wallets that load slowly)\r\n// */\r\n// export const detectWalletsWithRetry = async (maxRetries = 3, delay = 1000) => {\r\n// let wallets = detectWallets();\r\n// let attempts = 0;\r\n \r\n// while (attempts < maxRetries) {\r\n// // If we found all expected wallets, return early\r\n// if (wallets[WALLET_TYPES.METAMASK] && wallets[WALLET_TYPES.TRUST_WALLET] && wallets[WALLET_TYPES.TRONLINK]) {\r\n// break;\r\n// }\r\n \r\n// // Wait before retrying\r\n// if (attempts > 0) {\r\n// console.log(`Retrying wallet detection (attempt ${attempts + 1}/${maxRetries})...`);\r\n// await new Promise(resolve => setTimeout(resolve, delay));\r\n// }\r\n \r\n// wallets = detectWallets();\r\n// attempts++;\r\n// }\r\n \r\n// return wallets;\r\n// };\r\n \r\n// /**\r\n// * DEBUG: Function to check what wallet objects are available\r\n// * Call this in your browser console: checkWalletObjects()\r\n// */\r\n// export const checkWalletObjects = () => {\r\n// console.log('=== COMPREHENSIVE WALLET OBJECT CHECK ===');\r\n \r\n// // Ethereum-based wallets\r\n// console.log('🔍 Ethereum Provider Objects:');\r\n// console.log('window.ethereum:', window.ethereum);\r\n// console.log('window.ethereum?.isMetaMask:', window.ethereum?.isMetaMask);\r\n// console.log('window.ethereum?.isTrust:', window.ethereum?.isTrust);\r\n// console.log('window.ethereum?.isTrustWallet:', window.ethereum?.isTrustWallet);\r\n// console.log('window.ethereum?.providers:', window.ethereum?.providers);\r\n \r\n// if (window.ethereum?.providers) {\r\n// console.log('Provider details:');\r\n// window.ethereum.providers.forEach((provider, index) => {\r\n// console.log(`Provider ${index}:`, {\r\n// isMetaMask: provider.isMetaMask,\r\n// isTrust: provider.isTrust,\r\n// isTrustWallet: provider.isTrustWallet,\r\n// provider: provider\r\n// });\r\n// });\r\n// }\r\n \r\n// // Trust Wallet specific\r\n// console.log('🔍 Trust Wallet Objects:');\r\n// console.log('window.trustwallet:', window.trustwallet);\r\n// console.log('window.trustWallet:', window.trustWallet);\r\n \r\n// // Tron-based wallets\r\n// console.log('🔍 Tron Objects:');\r\n// console.log('window.tronWeb:', window.tronWeb);\r\n// console.log('window.tronLink:', window.tronLink);\r\n// console.log('window.tron:', window.tron);\r\n \r\n// // Algorand wallets\r\n// console.log('🔍 Algorand Objects:');\r\n// console.log('window.algorand:', window.algorand);\r\n// console.log('window.algorand?.isLute:', window.algorand?.isLute);\r\n \r\n// // Other common wallet objects\r\n// console.log('🔍 Other Wallet Objects:');\r\n// console.log('window.web3:', window.web3);\r\n// console.log('window.Web3:', window.Web3);\r\n \r\n// console.log('=== END COMPREHENSIVE CHECK ===');\r\n \r\n// // Return current detection results\r\n// return detectWallets();\r\n// };\r\n \r\n// /**\r\n// * Get supported wallets for a network\r\n// */\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n// const networkConfig = NETWORK_CONFIG[network];\r\n// if (!networkConfig) return [];\r\n \r\n// const availableWallets = detectWallets();\r\n// return networkConfig.supportedWallets.filter(wallet => availableWallets[wallet]);\r\n// };\r\n \r\n// /**\r\n// * Connect to wallet based on type\r\n// */\r\n// export const connectWallet = async (walletType, network) => {\r\n// console.log('connectWallet called with:', { walletType, network });\r\n \r\n// switch (walletType) {\r\n// case WALLET_TYPES.METAMASK:\r\n// return await connectMetaMask(network);\r\n// case WALLET_TYPES.TRONLINK:\r\n// return await connectTronLink();\r\n// case WALLET_TYPES.TRUST_WALLET:\r\n// return await connectTrustWallet(network);\r\n// case WALLET_TYPES.LUTE:\r\n// return await connectLute();\r\n// default:\r\n// throw new Error(`Unsupported wallet type: ${walletType}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * MetaMask connection\r\n// */\r\n// const connectMetaMask = async (network) => {\r\n// console.log('Attempting to connect MetaMask for network:', network);\r\n \r\n// if (typeof window === 'undefined' || !window.ethereum) {\r\n// throw new Error('MetaMask is not installed. Please install MetaMask extension.');\r\n// }\r\n\r\n// try {\r\n// console.log('Requesting accounts from MetaMask...');\r\n \r\n// const accounts = await window.ethereum.request({\r\n// method: 'eth_requestAccounts'\r\n// });\r\n\r\n// console.log('Accounts received:', accounts);\r\n\r\n// if (!accounts || accounts.length === 0) {\r\n// throw new Error('No accounts found. Please unlock MetaMask.');\r\n// }\r\n\r\n// // Switch to correct network if needed\r\n// const networkConfig = NETWORK_CONFIG[network];\r\n// if (networkConfig && networkConfig.chainId) {\r\n// console.log('Switching to network:', networkConfig.chainName);\r\n// await switchEVMNetwork(networkConfig);\r\n// }\r\n\r\n// const connection = {\r\n// address: accounts[0],\r\n// network,\r\n// walletType: WALLET_TYPES.METAMASK\r\n// };\r\n\r\n// console.log('MetaMask connected successfully:', connection);\r\n// return connection;\r\n\r\n// } catch (error) {\r\n// console.error('MetaMask connection error:', error);\r\n \r\n// if (error.code === 4001) {\r\n// throw new Error('Connection rejected by user.');\r\n// }\r\n// if (error.code === -32002) {\r\n// throw new Error('Connection request pending. Please check MetaMask.');\r\n// }\r\n \r\n// throw new Error(`Failed to connect MetaMask: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * TronLink connection\r\n// */\r\n// const connectTronLink = async () => {\r\n// if (typeof window === 'undefined' || !window.tronWeb) {\r\n// throw new Error('TronLink is not installed.');\r\n// }\r\n \r\n// let attempts = 0;\r\n// const maxAttempts = 10;\r\n \r\n// while (!window.tronWeb.ready && attempts < maxAttempts) {\r\n// await new Promise(resolve => setTimeout(resolve, 1000));\r\n// attempts++;\r\n// }\r\n \r\n// if (!window.tronWeb.ready) {\r\n// throw new Error('TronLink is not ready. Please unlock your wallet.');\r\n// }\r\n \r\n// const address = window.tronWeb.defaultAddress?.base58;\r\n// if (!address) {\r\n// throw new Error('No account found in TronLink.');\r\n// }\r\n \r\n// return {\r\n// address,\r\n// network: NETWORK_TYPES.TRON,\r\n// walletType: WALLET_TYPES.TRONLINK\r\n// };\r\n// };\r\n \r\n// /**\r\n// * Trust Wallet connection\r\n// */\r\n// const connectTrustWallet = async (network) => {\r\n// if (typeof window === 'undefined' || !window.ethereum || !window.ethereum.isTrust) {\r\n// throw new Error('Trust Wallet is not installed.');\r\n// }\r\n \r\n// try {\r\n// const accounts = await window.ethereum.request({\r\n// method: 'eth_requestAccounts'\r\n// });\r\n \r\n// if (!accounts || accounts.length === 0) {\r\n// throw new Error('No accounts found. Please unlock Trust Wallet.');\r\n// }\r\n \r\n// const networkConfig = NETWORK_CONFIG[network];\r\n// if (networkConfig && networkConfig.chainId) {\r\n// await switchEVMNetwork(networkConfig);\r\n// }\r\n \r\n// return {\r\n// address: accounts[0],\r\n// network,\r\n// walletType: WALLET_TYPES.TRUST_WALLET\r\n// };\r\n// } catch (error) {\r\n// if (error.code === 4001) {\r\n// throw new Error('User rejected the connection request');\r\n// }\r\n// throw new Error(`Failed to connect Trust Wallet: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Lute connection\r\n// */\r\n// const connectLute = async () => {\r\n// if (typeof window === 'undefined' || !window.algorand || !window.algorand.isLute) {\r\n// throw new Error('Lute wallet is not installed.');\r\n// }\r\n \r\n// try {\r\n// const accounts = await window.algorand.connect();\r\n \r\n// if (!accounts || accounts.length === 0) {\r\n// throw new Error('No accounts found. Please unlock Lute wallet.');\r\n// }\r\n \r\n// return {\r\n// address: accounts[0],\r\n// network: NETWORK_TYPES.ALGORAND,\r\n// walletType: WALLET_TYPES.LUTE\r\n// };\r\n// } catch (error) {\r\n// throw new Error(`Failed to connect Lute wallet: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Switch EVM network\r\n// */\r\n// const switchEVMNetwork = async (networkConfig) => {\r\n// if (typeof window === 'undefined' || !window.ethereum) {\r\n// throw new Error('Ethereum provider not found');\r\n// }\r\n\r\n// try {\r\n// console.log('Attempting to switch to:', networkConfig.chainName);\r\n \r\n// await window.ethereum.request({\r\n// method: 'wallet_switchEthereumChain',\r\n// params: [{ chainId: networkConfig.chainId }]\r\n// });\r\n \r\n// console.log('Network switched successfully');\r\n \r\n// } catch (switchError) {\r\n// console.error('Network switch error:', switchError);\r\n \r\n// if (switchError.code === 4902) {\r\n// try {\r\n// await window.ethereum.request({\r\n// method: 'wallet_addEthereumChain',\r\n// params: [networkConfig]\r\n// });\r\n// console.log('Network added successfully');\r\n// } catch (addError) {\r\n// throw new Error(`Failed to add ${networkConfig.chainName} to wallet.`);\r\n// }\r\n// } else if (switchError.code === 4001) {\r\n// throw new Error('User rejected network switch request.');\r\n// } else {\r\n// throw new Error(`Failed to switch to ${networkConfig.chainName}.`);\r\n// }\r\n// }\r\n// };\r\n \r\n// /**\r\n// * IMPROVED: Send transaction with proper currency and network context\r\n// */\r\n// export const sendTransaction = async (walletConnection, transactionData) => {\r\n// const { walletType, network, address } = walletConnection;\r\n// const { to, amount, tokenAddress, tokenDecimals, currency } = transactionData;\r\n \r\n// console.log('sendTransaction called with:', { walletConnection, transactionData });\r\n \r\n// switch (walletType) {\r\n// case WALLET_TYPES.METAMASK:\r\n// case WALLET_TYPES.TRUST_WALLET:\r\n// return await sendEVMTransactionNative(\r\n// address, \r\n// to, \r\n// amount, \r\n// tokenAddress, \r\n// tokenDecimals, \r\n// currency, \r\n// network\r\n// );\r\n// case WALLET_TYPES.TRONLINK:\r\n// return await sendTronTransaction(to, amount, tokenAddress, tokenDecimals);\r\n// case WALLET_TYPES.LUTE:\r\n// return await sendAlgorandTransaction(address, to, amount);\r\n// default:\r\n// throw new Error(`Unsupported wallet type: ${walletType}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * IMPROVED: EVM transaction with proper token configuration lookup\r\n// */\r\n// const sendEVMTransactionNative = async (from, to, amount, tokenAddress, tokenDecimals, currency, network) => {\r\n// console.log('sendEVMTransactionNative called with:', { \r\n// from, to, amount, tokenAddress, tokenDecimals, currency, network \r\n// });\r\n \r\n// if (typeof window === 'undefined' || !window.ethereum) {\r\n// throw new Error('Ethereum provider not found');\r\n// }\r\n \r\n// try {\r\n// // Get proper token configuration if currency and network are provided\r\n// let actualTokenAddress = tokenAddress;\r\n// let actualDecimals = tokenDecimals;\r\n \r\n// if (currency && network) {\r\n// try {\r\n// const tokenConfig = getTokenConfig(currency, network);\r\n// actualTokenAddress = tokenConfig.address;\r\n// actualDecimals = tokenConfig.decimals;\r\n \r\n// console.log('Using token config:', {\r\n// currency,\r\n// network,\r\n// address: actualTokenAddress,\r\n// decimals: actualDecimals\r\n// });\r\n// } catch (configError) {\r\n// console.warn('Could not get token config, using provided values:', configError.message);\r\n// // Fall back to provided values\r\n// }\r\n// }\r\n \r\n// if (actualTokenAddress && actualTokenAddress !== 'native') {\r\n// // ERC20 token transfer using native ethereum.request\r\n// console.log('Preparing ERC20 token transfer...');\r\n \r\n// const decimals = actualDecimals || 18;\r\n// const amountHex = calculateTokenAmount(amount, decimals);\r\n \r\n// // ERC20 transfer function signature: transfer(address,uint256)\r\n// const transferMethodId = '0xa9059cbb';\r\n \r\n// // Pad the recipient address (remove 0x prefix and pad to 64 characters)\r\n// const paddedToAddress = to.replace('0x', '').toLowerCase().padStart(64, '0');\r\n \r\n// // Pad the amount (remove 0x prefix and pad to 64 characters)\r\n// const paddedAmount = amountHex.replace('0x', '').padStart(64, '0');\r\n \r\n// // Combine method ID + padded address + padded amount\r\n// const data = transferMethodId + paddedToAddress + paddedAmount;\r\n \r\n// console.log('ERC20 transaction details:', { \r\n// currency,\r\n// tokenAddress: actualTokenAddress,\r\n// decimals,\r\n// amountHex, \r\n// transferMethodId,\r\n// paddedToAddress,\r\n// paddedAmount,\r\n// data \r\n// });\r\n \r\n// const txHash = await window.ethereum.request({\r\n// method: 'eth_sendTransaction',\r\n// params: [{\r\n// from: from,\r\n// to: actualTokenAddress, // Send to token contract\r\n// data: data,\r\n// gas: '0x15F90', // 90000 gas limit for token transfers\r\n// }]\r\n// });\r\n \r\n// console.log('ERC20 transaction successful:', txHash);\r\n// return txHash;\r\n// } else {\r\n// // Native token transfer (ETH/BNB)\r\n// console.log('Preparing native token transfer...');\r\n \r\n// const amountHex = toHex(amount);\r\n// console.log('Native transaction amount:', { amount, amountHex });\r\n \r\n// const txHash = await window.ethereum.request({\r\n// method: 'eth_sendTransaction',\r\n// params: [{\r\n// from: from,\r\n// to: to,\r\n// value: amountHex,\r\n// gas: '0x5208', // 21000 gas limit for simple transfer\r\n// }]\r\n// });\r\n \r\n// console.log('Native transaction successful:', txHash);\r\n// return txHash;\r\n// }\r\n// } catch (error) {\r\n// console.error('EVM transaction error:', error);\r\n \r\n// if (error.code === 4001) {\r\n// throw new Error('Transaction was rejected by user');\r\n// }\r\n// if (error.message && error.message.includes('insufficient funds')) {\r\n// throw new Error('Insufficient balance to complete the transaction');\r\n// }\r\n// if (error.message && error.message.includes('gas')) {\r\n// throw new Error('Transaction failed due to gas estimation issues. Please try again.');\r\n// }\r\n \r\n// throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Tron transaction\r\n// */\r\n// const sendTronTransaction = async (to, amount, tokenAddress, tokenDecimals) => {\r\n// if (typeof window === 'undefined' || !window.tronWeb || !window.tronWeb.ready) {\r\n// throw new Error('TronLink is not ready');\r\n// }\r\n \r\n// try {\r\n// const amountInSun = Math.floor(parseFloat(amount) * Math.pow(10, tokenDecimals || 6));\r\n \r\n// if (tokenAddress && tokenAddress !== 'native') {\r\n// const contract = await window.tronWeb.contract().at(tokenAddress);\r\n// const result = await contract.transfer(to, amountInSun).send({\r\n// feeLimit: 100000000,\r\n// callValue: 0\r\n// });\r\n// return result;\r\n// } else {\r\n// const result = await window.tronWeb.trx.sendTransaction(to, amountInSun);\r\n// return result.txid;\r\n// }\r\n// } catch (error) {\r\n// throw new Error(`TRON transaction failed: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Algorand transaction\r\n// */\r\n// const sendAlgorandTransaction = async (from, to, amount) => {\r\n// if (typeof window === 'undefined' || !window.algorand) {\r\n// throw new Error('Algorand wallet is not available');\r\n// }\r\n \r\n// try {\r\n// const microAlgos = Math.floor(parseFloat(amount) * 1000000);\r\n \r\n// const txn = {\r\n// from,\r\n// to,\r\n// amount: microAlgos,\r\n// type: 'pay'\r\n// };\r\n \r\n// const signedTxn = await window.algorand.signTransaction(txn);\r\n// const result = await window.algorand.sendTransaction(signedTxn);\r\n \r\n// return result.txId;\r\n// } catch (error) {\r\n// throw new Error(`Algorand transaction failed: ${error.message}`);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * Get wallet install URLs\r\n// */\r\n// export const getWalletInstallUrl = (walletType) => {\r\n// const urls = {\r\n// [WALLET_TYPES.METAMASK]: 'https://metamask.io/',\r\n// [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/',\r\n// [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/',\r\n// [WALLET_TYPES.LUTE]: 'https://lute.app/'\r\n// };\r\n \r\n// return urls[walletType] || '';\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Enhanced wallet service with improved wallet detection and token handling\r\n */\r\n\r\n// Network types\r\nexport const NETWORK_TYPES = {\r\n ETHEREUM: 'ethereum',\r\n BSC: 'bsc',\r\n TRON: 'tron',\r\n ALGORAND: 'algorand'\r\n};\r\n\r\n// Wallet types\r\nexport const WALLET_TYPES = {\r\n METAMASK: 'metamask',\r\n TRONLINK: 'tronlink',\r\n TRUST_WALLET: 'trust_wallet',\r\n LUTE: 'lute'\r\n};\r\n\r\n// Network configurations\r\nexport const NETWORK_CONFIG = {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n chainId: '0x1',\r\n chainName: 'Ethereum Mainnet',\r\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\r\n rpcUrls: ['https://mainnet.infura.io/v3/'],\r\n blockExplorerUrls: ['https://etherscan.io/'],\r\n supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n chainId: '0x38',\r\n chainName: 'BNB Smart Chain',\r\n nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },\r\n rpcUrls: ['https://bsc-dataseed.binance.org/'],\r\n blockExplorerUrls: ['https://bscscan.com/'],\r\n supportedWallets: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n },\r\n [NETWORK_TYPES.TRON]: {\r\n fullHost: 'https://api.trongrid.io',\r\n explorerUrl: 'https://tronscan.org',\r\n supportedWallets: [WALLET_TYPES.TRONLINK]\r\n },\r\n [NETWORK_TYPES.ALGORAND]: {\r\n network: 'mainnet',\r\n explorerUrl: 'https://algoexplorer.io',\r\n supportedWallets: [WALLET_TYPES.LUTE]\r\n }\r\n};\r\n\r\n// Token configurations with precise decimal places\r\nexport const TOKEN_CONFIG = {\r\n USDT: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0x55d398326f99059fF775485246999027B3197955',\r\n decimals: 18\r\n },\r\n [NETWORK_TYPES.TRON]: {\r\n address: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.ALGORAND]: {\r\n address: '312769',\r\n decimals: 6\r\n }\r\n },\r\n USDC: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n decimals: 18\r\n },\r\n [NETWORK_TYPES.TRON]: {\r\n address: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n decimals: 6\r\n },\r\n [NETWORK_TYPES.ALGORAND]: {\r\n address: '31566704',\r\n decimals: 6\r\n }\r\n },\r\n PYUSD: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8',\r\n decimals: 6\r\n }\r\n },\r\n FRAX: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x853d955aCEf822Db058eb8505911ED77F175b99e',\r\n decimals: 18\r\n },\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40',\r\n decimals: 18\r\n }\r\n },\r\n USDP: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x8E870D67F660D95d5be530380D0eC0bd388289E1',\r\n decimals: 18\r\n }\r\n },\r\n DAI: {\r\n [NETWORK_TYPES.ETHEREUM]: {\r\n address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\r\n decimals: 18\r\n }\r\n },\r\n BUSD: {\r\n [NETWORK_TYPES.BSC]: {\r\n address: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\r\n decimals: 18\r\n }\r\n },\r\n USDJ: {\r\n [NETWORK_TYPES.TRON]: {\r\n address: 'TMwFHYXLJaRUPeW6421aqXL4ZEzPRFGkGT',\r\n decimals: 18\r\n }\r\n },\r\n ALGO: {\r\n [NETWORK_TYPES.ALGORAND]: {\r\n address: 'native',\r\n decimals: 6\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Enhanced wallet detection with improved provider handling\r\n */\r\nexport const detectWallets = () => {\r\n const wallets = {\r\n [WALLET_TYPES.METAMASK]: false,\r\n [WALLET_TYPES.TRUST_WALLET]: false,\r\n [WALLET_TYPES.TRONLINK]: false,\r\n [WALLET_TYPES.LUTE]: false\r\n };\r\n\r\n if (typeof window === 'undefined') {\r\n return wallets;\r\n }\r\n\r\n try {\r\n console.log('=== ENHANCED WALLET DETECTION DEBUG ===');\r\n \r\n // Get all potential providers\r\n const allProviders = [];\r\n \r\n // Check main ethereum provider\r\n if (window.ethereum) {\r\n allProviders.push(window.ethereum);\r\n console.log('Found window.ethereum provider');\r\n }\r\n \r\n // Check providers array\r\n if (window.ethereum?.providers && Array.isArray(window.ethereum.providers)) {\r\n window.ethereum.providers.forEach(provider => {\r\n allProviders.push(provider);\r\n console.log('Found provider in ethereum.providers array');\r\n });\r\n }\r\n \r\n // MetaMask detection - enhanced\r\n for (const provider of allProviders) {\r\n if (provider.isMetaMask) {\r\n wallets[WALLET_TYPES.METAMASK] = true;\r\n console.log('✅ MetaMask detected via provider', provider);\r\n break;\r\n }\r\n }\r\n \r\n // Trust Wallet detection - enhanced\r\n for (const provider of allProviders) {\r\n if (provider.isTrust || provider.isTrustWallet) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via provider', provider);\r\n break;\r\n }\r\n }\r\n \r\n // Additional check for Trust Wallet\r\n if (!wallets[WALLET_TYPES.TRUST_WALLET]) {\r\n if (window.trustwallet || window.trustWallet) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via trustwallet object');\r\n }\r\n \r\n // Check user agent for Trust Wallet mobile\r\n if (navigator.userAgent && navigator.userAgent.toLowerCase().includes('trust')) {\r\n wallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n console.log('✅ Trust Wallet detected via user agent');\r\n }\r\n }\r\n \r\n // TronLink detection - improved\r\n if (window.tronWeb && window.tronWeb.defaultAddress) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via tronWeb');\r\n } else if (window.tronLink) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via tronLink object');\r\n } else if (window.tron) {\r\n wallets[WALLET_TYPES.TRONLINK] = true;\r\n console.log('✅ TronLink detected via tron object');\r\n }\r\n \r\n // Lute wallet detection (Algorand)\r\n if (window.algorand) {\r\n wallets[WALLET_TYPES.LUTE] = true;\r\n console.log('✅ Algorand wallet detected');\r\n }\r\n \r\n console.log('Final wallet detection results:', wallets);\r\n console.log('=== END ENHANCED WALLET DETECTION DEBUG ===');\r\n \r\n } catch (error) {\r\n console.warn('Error detecting wallets:', error);\r\n }\r\n\r\n return wallets;\r\n};\r\n\r\n/**\r\n * Enhanced wallet detection with retry mechanism\r\n */\r\nexport const detectWalletsWithRetry = async (maxRetries = 3, delay = 1000) => {\r\n let wallets = detectWallets();\r\n let attempts = 0;\r\n \r\n while (attempts < maxRetries) {\r\n // If we found all expected wallets, return early\r\n if (wallets[WALLET_TYPES.METAMASK] && wallets[WALLET_TYPES.TRUST_WALLET] && wallets[WALLET_TYPES.TRONLINK]) {\r\n break;\r\n }\r\n \r\n // Wait before retrying\r\n if (attempts > 0) {\r\n console.log(`Retrying wallet detection (attempt ${attempts + 1}/${maxRetries})...`);\r\n await new Promise(resolve => setTimeout(resolve, delay));\r\n }\r\n \r\n wallets = detectWallets();\r\n attempts++;\r\n }\r\n \r\n return wallets;\r\n};\r\n\r\n/**\r\n * Get supported wallets for a network\r\n */\r\nexport const getSupportedWalletsForNetwork = (network) => {\r\n const networkConfig = NETWORK_CONFIG[network];\r\n if (!networkConfig) return [];\r\n \r\n const availableWallets = detectWallets();\r\n return networkConfig.supportedWallets.filter(wallet => availableWallets[wallet]);\r\n};\r\n\r\n/**\r\n * Find the best provider for MetaMask\r\n */\r\nconst findMetaMaskProvider = () => {\r\n let provider = null;\r\n \r\n // First try providers array\r\n if (window.ethereum?.providers && Array.isArray(window.ethereum.providers)) {\r\n provider = window.ethereum.providers.find(p => p.isMetaMask);\r\n if (provider) {\r\n console.log('Found MetaMask in providers array');\r\n return provider;\r\n }\r\n }\r\n \r\n // Fallback to main ethereum object\r\n if (window.ethereum?.isMetaMask) {\r\n console.log('Using main ethereum object for MetaMask');\r\n return window.ethereum;\r\n }\r\n \r\n // Final fallback to any ethereum object\r\n if (window.ethereum) {\r\n console.warn('No MetaMask-specific provider found, using generic ethereum provider');\r\n return window.ethereum;\r\n }\r\n \r\n return null;\r\n};\r\n\r\n/**\r\n * Find the best provider for Trust Wallet\r\n */\r\nconst findTrustWalletProvider = () => {\r\n let provider = null;\r\n \r\n // First try providers array\r\n if (window.ethereum?.providers && Array.isArray(window.ethereum.providers)) {\r\n provider = window.ethereum.providers.find(p => p.isTrust || p.isTrustWallet);\r\n if (provider) {\r\n console.log('Found Trust Wallet in providers array');\r\n return provider;\r\n }\r\n }\r\n \r\n // Next try main ethereum object\r\n if (window.ethereum?.isTrust || window.ethereum?.isTrustWallet) {\r\n console.log('Using main ethereum object for Trust Wallet');\r\n return window.ethereum;\r\n }\r\n \r\n // Try dedicated Trust Wallet objects\r\n if (window.trustwallet) {\r\n console.log('Using trustwallet object');\r\n return window.trustwallet;\r\n }\r\n \r\n if (window.trustWallet) {\r\n console.log('Using trustWallet object');\r\n return window.trustWallet;\r\n }\r\n \r\n // Mobile fallback - use any ethereum provider\r\n if (navigator.userAgent && navigator.userAgent.toLowerCase().includes('trust')) {\r\n if (window.ethereum) {\r\n console.log('Using generic ethereum provider for Trust mobile');\r\n return window.ethereum;\r\n }\r\n }\r\n \r\n return null;\r\n};\r\n\r\n/**\r\n * Improved token amount calculation with proper decimal handling\r\n * Returns the token amount in its smallest unit (e.g., wei for ETH)\r\n */\r\nconst calculateTokenAmount = (amount, decimals = 18) => {\r\n console.log('calculateTokenAmount input:', { amount, decimals });\r\n \r\n // Ensure inputs are valid\r\n const tokenAmount = parseFloat(amount);\r\n const tokenDecimals = parseInt(decimals);\r\n \r\n if (isNaN(tokenAmount) || tokenAmount <= 0) {\r\n throw new Error(`Invalid amount: ${amount}`);\r\n }\r\n \r\n if (isNaN(tokenDecimals) || tokenDecimals < 0) {\r\n throw new Error(`Invalid decimals: ${decimals}`);\r\n }\r\n \r\n try {\r\n // Calculate using math with proper precision\r\n const multiplier = Math.pow(10, tokenDecimals);\r\n const amountInSmallestUnit = Math.floor(tokenAmount * multiplier);\r\n \r\n console.log('Token amount calculation:', {\r\n tokenAmount,\r\n tokenDecimals,\r\n multiplier,\r\n amountInSmallestUnit\r\n });\r\n \r\n return amountInSmallestUnit;\r\n } catch (error) {\r\n console.error('Error calculating token amount:', error);\r\n throw new Error(`Failed to calculate token amount: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * Get token configuration with validation\r\n */\r\nconst getTokenConfig = (currency, network) => {\r\n console.log('getTokenConfig called with:', { currency, network });\r\n \r\n const tokenConfig = TOKEN_CONFIG[currency];\r\n if (!tokenConfig) {\r\n throw new Error(`Unsupported currency: ${currency}`);\r\n }\r\n \r\n const networkConfig = tokenConfig[network];\r\n if (!networkConfig) {\r\n throw new Error(`Currency ${currency} not supported on network ${network}`);\r\n }\r\n \r\n console.log('Token config found:', networkConfig);\r\n return networkConfig;\r\n};\r\n\r\n/**\r\n * Connect to wallet based on type with retry\r\n */\r\nexport const connectWallet = async (walletType, network, retryCount = 2) => {\r\n console.log('connectWallet called with:', { walletType, network, retryCount });\r\n \r\n const attemptConnection = async (attempts) => {\r\n try {\r\n switch (walletType) {\r\n case WALLET_TYPES.METAMASK:\r\n return await connectMetaMask(network);\r\n case WALLET_TYPES.TRUST_WALLET:\r\n return await connectTrustWallet(network);\r\n case WALLET_TYPES.TRONLINK:\r\n return await connectTronLink();\r\n case WALLET_TYPES.LUTE:\r\n return await connectLute();\r\n default:\r\n throw new Error(`Unsupported wallet type: ${walletType}`);\r\n }\r\n } catch (error) {\r\n // Don't retry if user rejected the request\r\n if (error.code === 4001 || (error.message && error.message.includes('rejected'))) {\r\n throw error;\r\n }\r\n \r\n if (attempts > 0) {\r\n console.log(`Connection attempt failed, retrying... (${attempts} attempts left)`);\r\n // Wait before retrying\r\n await new Promise(resolve => setTimeout(resolve, delay = 1000));\r\n return attemptConnection(attempts - 1);\r\n }\r\n \r\n throw error;\r\n }\r\n };\r\n \r\n return attemptConnection(retryCount);\r\n};\r\n\r\n/**\r\n * Connect to MetaMask with improved reliability\r\n */\r\nconst connectMetaMask = async (network) => {\r\n console.log('Attempting to connect MetaMask for network:', network);\r\n \r\n if (typeof window === 'undefined') {\r\n throw new Error('Browser environment required');\r\n }\r\n\r\n // Find the best provider for MetaMask\r\n const provider = findMetaMaskProvider();\r\n \r\n if (!provider) {\r\n throw new Error('MetaMask is not installed. Please install MetaMask extension.');\r\n }\r\n\r\n try {\r\n console.log('Requesting accounts from MetaMask...');\r\n \r\n const accounts = await provider.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n\r\n console.log('Accounts received:', accounts);\r\n\r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found. Please unlock MetaMask.');\r\n }\r\n\r\n // Switch to correct network if needed\r\n const networkConfig = NETWORK_CONFIG[network];\r\n if (networkConfig && networkConfig.chainId) {\r\n console.log('Switching to network:', networkConfig.chainName);\r\n await switchEVMNetwork(networkConfig, provider);\r\n }\r\n\r\n const connection = {\r\n address: accounts[0],\r\n network,\r\n walletType: WALLET_TYPES.METAMASK,\r\n provider // Save the successful provider for future transactions\r\n };\r\n\r\n console.log('MetaMask connected successfully:', connection);\r\n return connection;\r\n\r\n } catch (error) {\r\n console.error('MetaMask connection error:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Connection rejected by user.');\r\n }\r\n if (error.code === -32002) {\r\n throw new Error('Connection request pending. Please check MetaMask.');\r\n }\r\n \r\n throw new Error(`Failed to connect MetaMask: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * Connect to TrustWallet with improved reliability\r\n */\r\nconst connectTrustWallet = async (network) => {\r\n console.log('Attempting to connect Trust Wallet for network:', network);\r\n \r\n if (typeof window === 'undefined') {\r\n throw new Error('Browser environment required');\r\n }\r\n\r\n // Find the best provider for Trust Wallet\r\n const provider = findTrustWalletProvider();\r\n \r\n if (!provider) {\r\n throw new Error('Trust Wallet is not installed or not detected.');\r\n }\r\n\r\n try {\r\n console.log('Requesting accounts from Trust Wallet provider');\r\n \r\n const accounts = await provider.request({\r\n method: 'eth_requestAccounts'\r\n });\r\n\r\n console.log('Trust Wallet accounts received:', accounts);\r\n\r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found. Please unlock Trust Wallet.');\r\n }\r\n\r\n try {\r\n const networkConfig = NETWORK_CONFIG[network];\r\n if (networkConfig && networkConfig.chainId) {\r\n console.log('Switching network in Trust Wallet to:', networkConfig.chainName);\r\n await switchEVMNetwork(networkConfig, provider);\r\n }\r\n } catch (switchError) {\r\n // Trust Wallet mobile may not support network switching\r\n // Just log the error but don't fail the connection\r\n console.warn('Network switching failed in Trust Wallet (may not be supported):', switchError);\r\n }\r\n\r\n return {\r\n address: accounts[0],\r\n network,\r\n walletType: WALLET_TYPES.TRUST_WALLET,\r\n provider // Save the successful provider\r\n };\r\n } catch (error) {\r\n console.error('Trust Wallet connection error:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('User rejected the connection request');\r\n }\r\n throw new Error(`Failed to connect Trust Wallet: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * TronLink connection with improved reliability\r\n */\r\nconst connectTronLink = async () => {\r\n if (typeof window === 'undefined' || !window.tronWeb) {\r\n throw new Error('TronLink is not installed.');\r\n }\r\n\r\n let attempts = 0;\r\n const maxAttempts = 10;\r\n \r\n while (!window.tronWeb.ready && attempts < maxAttempts) {\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n attempts++;\r\n console.log(`Waiting for TronLink to be ready... Attempt ${attempts}`);\r\n }\r\n\r\n if (!window.tronWeb.ready) {\r\n throw new Error('TronLink is not ready. Please unlock your wallet.');\r\n }\r\n\r\n const address = window.tronWeb.defaultAddress?.base58;\r\n if (!address) {\r\n throw new Error('No account found in TronLink.');\r\n }\r\n\r\n return {\r\n address,\r\n network: NETWORK_TYPES.TRON,\r\n walletType: WALLET_TYPES.TRONLINK,\r\n provider: window.tronWeb\r\n };\r\n};\r\n\r\n/**\r\n * Lute (Algorand) wallet connection\r\n */\r\nconst connectLute = async () => {\r\n if (typeof window === 'undefined' || !window.algorand) {\r\n throw new Error('Lute wallet is not installed.');\r\n }\r\n\r\n try {\r\n const accounts = await window.algorand.connect();\r\n \r\n if (!accounts || accounts.length === 0) {\r\n throw new Error('No accounts found. Please unlock Lute wallet.');\r\n }\r\n \r\n return {\r\n address: accounts[0],\r\n network: NETWORK_TYPES.ALGORAND,\r\n walletType: WALLET_TYPES.LUTE,\r\n provider: window.algorand\r\n };\r\n } catch (error) {\r\n throw new Error(`Failed to connect Lute wallet: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * Switch EVM network with improved error handling\r\n */\r\nconst switchEVMNetwork = async (networkConfig, provider) => {\r\n if (!provider) {\r\n throw new Error('No provider specified for network switching');\r\n }\r\n\r\n try {\r\n console.log('Attempting to switch to:', networkConfig.chainName);\r\n \r\n await provider.request({\r\n method: 'wallet_switchEthereumChain',\r\n params: [{ chainId: networkConfig.chainId }]\r\n });\r\n \r\n console.log('Network switched successfully');\r\n \r\n } catch (switchError) {\r\n console.error('Network switch error:', switchError);\r\n \r\n if (switchError.code === 4902) {\r\n try {\r\n await provider.request({\r\n method: 'wallet_addEthereumChain',\r\n params: [networkConfig]\r\n });\r\n console.log('Network added successfully');\r\n } catch (addError) {\r\n throw new Error(`Failed to add ${networkConfig.chainName} to wallet.`);\r\n }\r\n } else if (switchError.code === 4001) {\r\n throw new Error('User rejected network switch request.');\r\n } else {\r\n throw new Error(`Failed to switch to ${networkConfig.chainName}.`);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Encode ERC20 transfer data correctly\r\n */\r\nconst encodeERC20TransferData = (toAddress, amount, decimals) => {\r\n try {\r\n // Method ID for transfer(address,uint256)\r\n const methodId = '0xa9059cbb';\r\n \r\n // Remove 0x if present and ensure address is lowercase\r\n const cleanAddress = toAddress.toLowerCase().replace('0x', '');\r\n \r\n // Pad the address to 32 bytes (64 hex characters)\r\n const paddedAddress = cleanAddress.padStart(64, '0');\r\n \r\n // Calculate token amount with proper decimals\r\n const tokenAmount = calculateTokenAmount(amount, decimals);\r\n \r\n // Convert to hex and pad to 32 bytes\r\n const hexAmount = tokenAmount.toString(16).padStart(64, '0');\r\n \r\n // Combine method ID with padded parameters\r\n const data = `0x${methodId}${paddedAddress}${hexAmount}`;\r\n \r\n console.log('Encoded ERC20 transfer data:', {\r\n methodId,\r\n toAddress: cleanAddress,\r\n amount,\r\n tokenAmount,\r\n hexAmount,\r\n data\r\n });\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Error encoding ERC20 transfer data:', error);\r\n throw new Error(`Failed to encode transfer data: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * Send transaction with the wallet's specific provider\r\n */\r\nexport const sendTransaction = async (walletConnection, transactionData) => {\r\n const { walletType, network, address, provider } = walletConnection;\r\n const { to, amount, tokenAddress, tokenDecimals, currency } = transactionData;\r\n\r\n console.log('sendTransaction called with:', { \r\n walletConnection: { walletType, network, address, hasProvider: !!provider },\r\n transactionData\r\n });\r\n\r\n switch (walletType) {\r\n case WALLET_TYPES.METAMASK:\r\n case WALLET_TYPES.TRUST_WALLET:\r\n return await sendEVMTransaction(\r\n address, \r\n to, \r\n amount, \r\n tokenAddress, \r\n tokenDecimals, \r\n currency, \r\n network,\r\n provider // Pass the provider that was used for connection\r\n );\r\n case WALLET_TYPES.TRONLINK:\r\n return await sendTronTransaction(to, amount, tokenAddress, tokenDecimals);\r\n case WALLET_TYPES.LUTE:\r\n return await sendAlgorandTransaction(address, to, amount);\r\n default:\r\n throw new Error(`Unsupported wallet type: ${walletType}`);\r\n }\r\n};\r\n\r\n/**\r\n * Enhanced function to send EVM transactions\r\n */\r\nconst sendEVMTransaction = async (from, to, amount, tokenAddress, tokenDecimals, currency, network, provider) => {\r\n console.log('sendEVMTransaction called with:', { \r\n from, to, amount, tokenAddress, tokenDecimals, currency, network\r\n });\r\n \r\n // Use the provider that was saved during connection if available\r\n // Otherwise fall back to window.ethereum\r\n const ethProvider = provider || window.ethereum;\r\n \r\n if (!ethProvider) {\r\n throw new Error('Ethereum provider not found');\r\n }\r\n\r\n try {\r\n // Get proper token configuration if currency and network are provided\r\n let actualTokenAddress = tokenAddress;\r\n let actualDecimals = tokenDecimals;\r\n \r\n if (currency && network) {\r\n try {\r\n const tokenConfig = getTokenConfig(currency, network);\r\n actualTokenAddress = tokenConfig.address;\r\n actualDecimals = tokenConfig.decimals;\r\n \r\n console.log('Using token config:', {\r\n currency,\r\n network,\r\n address: actualTokenAddress,\r\n decimals: actualDecimals\r\n });\r\n } catch (configError) {\r\n console.warn('Could not get token config, using provided values:', configError.message);\r\n // Fall back to provided values\r\n }\r\n }\r\n \r\n if (actualTokenAddress && actualTokenAddress !== 'native') {\r\n // ERC20 token transfer\r\n console.log('Preparing ERC20 token transfer for:', currency);\r\n \r\n // Generate the token transfer data\r\n const data = encodeERC20TransferData(to, amount, actualDecimals);\r\n \r\n console.log('ERC20 transaction details:', {\r\n from,\r\n to: actualTokenAddress,\r\n data,\r\n gas: '0x30D40' // 200,000 gas\r\n });\r\n \r\n const txHash = await ethProvider.request({\r\n method: 'eth_sendTransaction',\r\n params: [{\r\n from: from,\r\n to: actualTokenAddress,\r\n data: data,\r\n gas: '0x30D40', // 200,000 gas\r\n }]\r\n });\r\n\r\n console.log('ERC20 transaction successful:', txHash);\r\n return txHash;\r\n } else {\r\n // Native token transfer (ETH/BNB)\r\n console.log('Preparing native token transfer');\r\n \r\n // Convert amount to wei (1 ETH = 10^18 wei)\r\n const amountInWei = calculateTokenAmount(amount, 18);\r\n const amountHex = '0x' + amountInWei.toString(16);\r\n \r\n console.log('Native transaction amount:', { amount, amountInWei, amountHex });\r\n \r\n const txHash = await ethProvider.request({\r\n method: 'eth_sendTransaction',\r\n params: [{\r\n from: from,\r\n to: to,\r\n value: amountHex,\r\n gas: '0x5208', // 21000 gas for simple transfer\r\n }]\r\n });\r\n\r\n console.log('Native transaction successful:', txHash);\r\n return txHash;\r\n }\r\n } catch (error) {\r\n console.error('EVM transaction error:', error);\r\n \r\n if (error.code === 4001) {\r\n throw new Error('Transaction was rejected by user');\r\n }\r\n if (error.message && error.message.includes('insufficient funds')) {\r\n throw new Error('Insufficient balance to complete the transaction');\r\n }\r\n \r\n throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n }\r\n};\r\n\r\n/**\r\n * Tron transaction\r\n */\r\nconst sendTronTransaction = async (to, amount, tokenAddress, tokenDecimals) => {\r\n if (typeof window === 'undefined' || !window.tronWeb || !window.tronWeb.ready) {\r\n throw new Error('TronLink is not ready');\r\n }\r\n\r\n try {\r\n const amountInSun = calculateTokenAmount(amount, tokenDecimals || 6);\r\n\r\n if (tokenAddress && tokenAddress !== 'native') {\r\n console.log('Sending TRC20 token:', { to, amount, tokenAddress, amountInSun });\r\n \r\n const contract = await window.tronWeb.contract().at(tokenAddress);\r\n const result = await contract.transfer(to, amountInSun).send({\r\n feeLimit: 100000000,\r\n callValue: 0\r\n });\r\n \r\n console.log('TRC20 transfer result:', result);\r\n return result;\r\n } else {\r\n console.log('Sending native TRX:', { to, amount, amountInSun });\r\n \r\n const result = await window.tronWeb.trx.sendTransaction(to, amountInSun);\r\n console.log('TRX transfer result:', result);\r\n \r\n return result.txid;\r\n }\r\n } catch (error) {\r\n console.error('Tron transaction error:', error);\r\n throw new Error(`TRON transaction failed: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * Algorand transaction\r\n */\r\nconst sendAlgorandTransaction = async (from, to, amount) => {\r\n if (typeof window === 'undefined' || !window.algorand) {\r\n throw new Error('Algorand wallet is not available');\r\n }\r\n\r\n try {\r\n const microAlgos = calculateTokenAmount(amount, 6);\r\n \r\n const txn = {\r\n from,\r\n to,\r\n amount: microAlgos,\r\n type: 'pay'\r\n };\r\n\r\n console.log('Sending Algorand transaction:', txn);\r\n \r\n const signedTxn = await window.algorand.signTransaction(txn);\r\n const result = await window.algorand.sendTransaction(signedTxn);\r\n \r\n console.log('Algorand transaction result:', result);\r\n return result.txId;\r\n } catch (error) {\r\n console.error('Algorand transaction error:', error);\r\n throw new Error(`Algorand transaction failed: ${error.message}`);\r\n }\r\n};\r\n\r\n/**\r\n * Get wallet install URLs\r\n */\r\nexport const getWalletInstallUrl = (walletType) => {\r\n const urls = {\r\n [WALLET_TYPES.METAMASK]: 'https://metamask.io/',\r\n [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/',\r\n [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/',\r\n [WALLET_TYPES.LUTE]: 'https://lute.app/'\r\n };\r\n\r\n return urls[walletType] || '';\r\n};\r\n\r\n/**\r\n * Helper function for debugging wallet environment\r\n */\r\nexport const debugWalletEnvironment = () => {\r\n console.group('Wallet Environment Debug');\r\n console.log('User Agent:', navigator.userAgent);\r\n \r\n console.log('Main ethereum object:', window.ethereum);\r\n \r\n if (window.ethereum?.providers) {\r\n console.log('Providers array:');\r\n window.ethereum.providers.forEach((p, i) => {\r\n console.log(`Provider ${i}:`, {\r\n isMetaMask: p.isMetaMask,\r\n isTrust: p.isTrust,\r\n isTrustWallet: p.isTrustWallet,\r\n constructor: p.constructor?.name\r\n });\r\n });\r\n }\r\n \r\n console.log('TronWeb object:', window.tronWeb);\r\n console.log('TronLink object:', window.tronLink);\r\n console.log('Tron object:', window.tron);\r\n console.log('Algorand object:', window.algorand);\r\n console.log('Trust wallet objects:', {\r\n trustwallet: window.trustwallet,\r\n trustWallet: window.trustWallet\r\n });\r\n \r\n console.groupEnd();\r\n \r\n return detectWallets();\r\n};\r\n\r\n/**\r\n * Generate mock transaction hash for testing\r\n */\r\nexport const generateMockTransactionHash = (network = 'ethereum') => {\r\n const prefixes = {\r\n ethereum: '0x',\r\n bsc: '0x',\r\n tron: '',\r\n algorand: ''\r\n };\r\n \r\n const prefix = prefixes[network] || '0x';\r\n const hash = Array.from({length: 64}, () => \r\n Math.floor(Math.random() * 16).toString(16)).join('');\r\n \r\n return `${prefix}${hash}`;\r\n};","// // src/services/api.js\r\n// let apiConfig = {\r\n// apiKey: null,\r\n// apiSecret: null,\r\n// apiUrl: 'http://localhost:9000',\r\n// merchantWalletAddresses: {} // Changed to object for multi-network support\r\n// };\r\n\r\n// /**\r\n// * Initialize the API with configuration\r\n// * @param {Object} config - API configuration\r\n// */\r\n// export const initializeApi = (config) => {\r\n// apiConfig = { ...apiConfig, ...config };\r\n// console.log('API initialized with:', {\r\n// apiUrl: apiConfig.apiUrl,\r\n// apiKey: apiConfig.apiKey ? `${apiConfig.apiKey.substring(0, 6)}...` : null,\r\n// hasWalletAddresses: Object.keys(apiConfig.merchantWalletAddresses || {}).length > 0\r\n// });\r\n// };\r\n\r\n// /**\r\n// * Generate headers with authentication\r\n// * @returns {Object} - Headers object with authentication\r\n// */\r\n// const getHeaders = () => {\r\n// return {\r\n// 'Content-Type': 'application/json',\r\n// 'x-api-key': apiConfig.apiKey,\r\n// 'x-api-secret': apiConfig.apiSecret\r\n// };\r\n// };\r\n\r\n// /**\r\n// * Create a new payment\r\n// * @param {Object} paymentData - Payment data\r\n// * @returns {Promise} - Promise resolving to payment details\r\n// */\r\n// export const createPayment = async (paymentData) => {\r\n// try {\r\n// console.log('Creating payment with data:', paymentData);\r\n// console.log('API URL:', `${apiConfig.apiUrl}/api/payments/create`);\r\n \r\n// // Enhance payment data with merchant wallet addresses\r\n// const enhancedPaymentData = { \r\n// ...paymentData,\r\n// merchantWalletAddresses: {\r\n// ...apiConfig.merchantWalletAddresses,\r\n// ...paymentData.merchantWalletAddresses\r\n// }\r\n// };\r\n \r\n// const response = await fetch(`${apiConfig.apiUrl}/api/payments/create`, {\r\n// method: 'POST',\r\n// headers: getHeaders(),\r\n// body: JSON.stringify(enhancedPaymentData)\r\n// });\r\n\r\n// console.log('Create payment response status:', response.status);\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// console.error('Error creating payment:', errorData);\r\n// throw new Error(errorData.error || `Failed to create payment: ${response.status}`);\r\n// }\r\n\r\n// const data = await response.json();\r\n// console.log('Create payment response data:', data);\r\n \r\n// return data;\r\n// } catch (error) {\r\n// console.error('Create payment error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Get payment details by ID\r\n// * @param {string} paymentId - Payment ID\r\n// * @returns {Promise} - Promise resolving to payment details\r\n// */\r\n// export const getPayment = async (paymentId) => {\r\n// try {\r\n// console.log('Getting payment:', paymentId);\r\n \r\n// const response = await fetch(`${apiConfig.apiUrl}/api/payments/${paymentId}`, {\r\n// method: 'GET',\r\n// headers: getHeaders()\r\n// });\r\n\r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// console.error('Error getting payment:', errorData);\r\n// throw new Error(errorData.error || `Failed to get payment: ${response.status}`);\r\n// }\r\n\r\n// const data = await response.json();\r\n// console.log('Get payment response:', data);\r\n \r\n// return data;\r\n// } catch (error) {\r\n// console.error('Get payment error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Process a payment\r\n// * @param {Object} processData - Payment process data\r\n// * @returns {Promise} - Promise resolving to processed payment details\r\n// */\r\n// export const processPayment = async (processData) => {\r\n// try {\r\n// console.log('Processing payment with data:', processData);\r\n// console.log('API URL:', `${apiConfig.apiUrl}/api/payments/process`);\r\n \r\n// const response = await fetch(`${apiConfig.apiUrl}/api/payments/process`, {\r\n// method: 'POST',\r\n// headers: getHeaders(),\r\n// body: JSON.stringify(processData)\r\n// });\r\n\r\n// console.log('Process payment response status:', response.status);\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// console.error('Error processing payment:', errorData);\r\n// throw new Error(errorData.error || `Failed to process payment: ${response.status}`);\r\n// }\r\n\r\n// const data = await response.json();\r\n// console.log('Process payment response data:', data);\r\n// return data;\r\n// } catch (error) {\r\n// console.error('Process payment error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Get supported networks and tokens\r\n// * @returns {Promise} - Promise resolving to supported networks and tokens\r\n// */\r\n// export const getSupportedNetworks = async () => {\r\n// try {\r\n// const response = await fetch(`${apiConfig.apiUrl}/api/networks`, {\r\n// method: 'GET',\r\n// headers: getHeaders()\r\n// });\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// throw new Error(errorData.error || `Failed to get networks: ${response.status}`);\r\n// }\r\n \r\n// const data = await response.json();\r\n// return data;\r\n// } catch (error) {\r\n// console.error('Get supported networks error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Get merchant profile including wallet addresses\r\n// * @returns {Promise} - Promise resolving to merchant profile\r\n// */\r\n// export const getMerchantProfile = async () => {\r\n// try {\r\n// const response = await fetch(`${apiConfig.apiUrl}/api/merchants/profile`, {\r\n// method: 'GET',\r\n// headers: getHeaders()\r\n// });\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// throw new Error(errorData.error || `Failed to get merchant profile: ${response.status}`);\r\n// }\r\n \r\n// const data = await response.json();\r\n \r\n// // Update apiConfig with retrieved addresses\r\n// if (data.merchant && data.merchant.walletAddresses) {\r\n// apiConfig.merchantWalletAddresses = {\r\n// ...apiConfig.merchantWalletAddresses,\r\n// ...data.merchant.walletAddresses\r\n// };\r\n// }\r\n \r\n// return data;\r\n// } catch (error) {\r\n// console.error('Get merchant profile error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Get merchant payments with filters\r\n// * @param {Object} options - Filter options\r\n// * @returns {Promise} - Promise resolving to payments list\r\n// */\r\n// export const getMerchantPayments = async (options = {}) => {\r\n// try {\r\n// const queryParams = new URLSearchParams();\r\n \r\n// Object.entries(options).forEach(([key, value]) => {\r\n// if (value !== null && value !== undefined) {\r\n// queryParams.append(key, value);\r\n// }\r\n// });\r\n \r\n// const response = await fetch(`${apiConfig.apiUrl}/api/payments?${queryParams}`, {\r\n// method: 'GET',\r\n// headers: getHeaders()\r\n// });\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// throw new Error(errorData.error || `Failed to get payments: ${response.status}`);\r\n// }\r\n \r\n// const data = await response.json();\r\n// return data;\r\n// } catch (error) {\r\n// console.error('Get merchant payments error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Get payment statistics\r\n// * @returns {Promise} - Promise resolving to payment statistics\r\n// */\r\n// export const getMerchantPaymentStats = async () => {\r\n// try {\r\n// const response = await fetch(`${apiConfig.apiUrl}/api/payments/stats`, {\r\n// method: 'GET',\r\n// headers: getHeaders()\r\n// });\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// throw new Error(errorData.error || `Failed to get payment stats: ${response.status}`);\r\n// }\r\n \r\n// const data = await response.json();\r\n// return data;\r\n// } catch (error) {\r\n// console.error('Get payment stats error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Validate wallet address for specific network\r\n// * @param {string} address - Wallet address to validate\r\n// * @param {string} network - Network type\r\n// * @returns {Promise} - Promise resolving to validation result\r\n// */\r\n// export const validateWalletAddress = async (address, network) => {\r\n// try {\r\n// const response = await fetch(`${apiConfig.apiUrl}/api/wallets/validate`, {\r\n// method: 'POST',\r\n// headers: getHeaders(),\r\n// body: JSON.stringify({ address, network })\r\n// });\r\n \r\n// if (!response.ok) {\r\n// const errorData = await response.json();\r\n// throw new Error(errorData.error || `Failed to validate address: ${response.status}`);\r\n// }\r\n \r\n// const data = await response.json();\r\n// return data;\r\n// } catch (error) {\r\n// console.error('Validate wallet address error:', error);\r\n// throw error;\r\n// }\r\n// };\r\n\r\n// /**\r\n// * Generate mock transaction hash for testing\r\n// * @param {string} network - Network type\r\n// * @returns {string} - Mock transaction hash\r\n// */\r\n// export const generateMockTransactionHash = (network = 'ethereum') => {\r\n// const prefixes = {\r\n// ethereum: '0x',\r\n// bsc: '0x',\r\n// tron: '',\r\n// algorand: ''\r\n// };\r\n \r\n// const prefix = prefixes[network] || '0x';\r\n// const hash = Array.from({length: 64}, () => \r\n// Math.floor(Math.random() * 16).toString(16)).join('');\r\n \r\n// return `${prefix}${hash}`;\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n// src/services/api.js\r\nlet apiConfig = {\r\n apiKey: null,\r\n apiSecret: null,\r\n apiUrl: 'http://localhost:9000',\r\n merchantWalletAddresses: {} // Object for multi-network support\r\n};\r\n\r\n/**\r\n * Initialize the API with configuration\r\n * @param {Object} config - API configuration\r\n */\r\nexport const initializeApi = (config) => {\r\n apiConfig = { ...apiConfig, ...config };\r\n console.log('API initialized with:', {\r\n apiUrl: apiConfig.apiUrl,\r\n apiKey: apiConfig.apiKey ? `${apiConfig.apiKey.substring(0, 6)}...` : null,\r\n hasWalletAddresses: Object.keys(apiConfig.merchantWalletAddresses || {}).length > 0\r\n });\r\n};\r\n\r\n/**\r\n * Generate headers with authentication\r\n * @returns {Object} - Headers object with authentication\r\n */\r\nconst getHeaders = () => {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': apiConfig.apiKey,\r\n 'x-api-secret': apiConfig.apiSecret\r\n };\r\n};\r\n\r\n/**\r\n * Create a new payment\r\n * @param {Object} paymentData - Payment data\r\n * @returns {Promise} - Promise resolving to payment details\r\n */\r\nexport const createPayment = async (paymentData) => {\r\n try {\r\n console.log('Creating payment with data:', paymentData);\r\n console.log('API URL:', `${apiConfig.apiUrl}/api/payments/create`);\r\n \r\n if (!paymentData.amount) {\r\n throw new Error('Payment amount is required');\r\n }\r\n \r\n // Enhance payment data with merchant wallet addresses\r\n const enhancedPaymentData = { \r\n ...paymentData,\r\n merchantWalletAddresses: {\r\n ...apiConfig.merchantWalletAddresses,\r\n ...paymentData.merchantWalletAddresses\r\n }\r\n };\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/create`, {\r\n method: 'POST',\r\n headers: getHeaders(),\r\n body: JSON.stringify(enhancedPaymentData)\r\n });\r\n\r\n console.log('Create payment response status:', response.status);\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n // If the response isn't valid JSON\r\n throw new Error(`Failed to create payment: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n console.error('Error creating payment:', errorData);\r\n throw new Error(errorData.error || `Failed to create payment: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('Create payment response data:', data);\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Create payment error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get payment details by ID\r\n * @param {string} paymentId - Payment ID\r\n * @returns {Promise} - Promise resolving to payment details\r\n */\r\nexport const getPayment = async (paymentId) => {\r\n try {\r\n console.log('Getting payment:', paymentId);\r\n \r\n if (!paymentId) {\r\n throw new Error('Payment ID is required');\r\n }\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/${paymentId}`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n\r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to get payment: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n console.error('Error getting payment:', errorData);\r\n throw new Error(errorData.error || `Failed to get payment: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('Get payment response:', data);\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Get payment error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Process a payment\r\n * @param {Object} processData - Payment process data\r\n * @returns {Promise} - Promise resolving to processed payment details\r\n */\r\nexport const processPayment = async (processData) => {\r\n try {\r\n console.log('Processing payment with data:', processData);\r\n \r\n if (!processData.paymentId) {\r\n throw new Error('Payment ID is required');\r\n }\r\n \r\n if (!processData.transactionHash) {\r\n throw new Error('Transaction hash is required');\r\n }\r\n \r\n console.log('API URL:', `${apiConfig.apiUrl}/api/payments/process`);\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/process`, {\r\n method: 'POST',\r\n headers: getHeaders(),\r\n body: JSON.stringify(processData)\r\n });\r\n\r\n console.log('Process payment response status:', response.status);\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to process payment: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n console.error('Error processing payment:', errorData);\r\n throw new Error(errorData.error || `Failed to process payment: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('Process payment response data:', data);\r\n return data;\r\n } catch (error) {\r\n console.error('Process payment error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get supported networks and tokens\r\n * @returns {Promise} - Promise resolving to supported networks and tokens\r\n */\r\nexport const getSupportedNetworks = async () => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/networks`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to get networks: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n throw new Error(errorData.error || `Failed to get networks: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Get supported networks error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get merchant profile including wallet addresses\r\n * @returns {Promise} - Promise resolving to merchant profile\r\n */\r\nexport const getMerchantProfile = async () => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/merchants/profile`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to get merchant profile: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n throw new Error(errorData.error || `Failed to get merchant profile: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n \r\n // Update apiConfig with retrieved addresses\r\n if (data.merchant && data.merchant.walletAddresses) {\r\n apiConfig.merchantWalletAddresses = {\r\n ...apiConfig.merchantWalletAddresses,\r\n ...data.merchant.walletAddresses\r\n };\r\n }\r\n \r\n return data;\r\n } catch (error) {\r\n console.error('Get merchant profile error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get merchant payments with filters\r\n * @param {Object} options - Filter options\r\n * @returns {Promise} - Promise resolving to payments list\r\n */\r\nexport const getMerchantPayments = async (options = {}) => {\r\n try {\r\n const queryParams = new URLSearchParams();\r\n \r\n Object.entries(options).forEach(([key, value]) => {\r\n if (value !== null && value !== undefined) {\r\n queryParams.append(key, value);\r\n }\r\n });\r\n \r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments?${queryParams}`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to get payments: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n throw new Error(errorData.error || `Failed to get payments: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Get merchant payments error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get payment statistics\r\n * @returns {Promise} - Promise resolving to payment statistics\r\n */\r\nexport const getMerchantPaymentStats = async () => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/payments/stats`, {\r\n method: 'GET',\r\n headers: getHeaders()\r\n });\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to get payment stats: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n throw new Error(errorData.error || `Failed to get payment stats: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Get payment stats error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Validate wallet address for specific network\r\n * @param {string} address - Wallet address to validate\r\n * @param {string} network - Network type\r\n * @returns {Promise} - Promise resolving to validation result\r\n */\r\nexport const validateWalletAddress = async (address, network) => {\r\n try {\r\n const response = await fetch(`${apiConfig.apiUrl}/api/wallets/validate`, {\r\n method: 'POST',\r\n headers: getHeaders(),\r\n body: JSON.stringify({ address, network })\r\n });\r\n \r\n if (!response.ok) {\r\n let errorData;\r\n try {\r\n errorData = await response.json();\r\n } catch (e) {\r\n throw new Error(`Failed to validate address: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n throw new Error(errorData.error || `Failed to validate address: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.error('Validate wallet address error:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Generate mock transaction hash for testing\r\n * @param {string} network - Network type\r\n * @returns {string} - Mock transaction hash\r\n */\r\nexport const generateMockTransactionHash = (network = 'ethereum') => {\r\n const prefixes = {\r\n ethereum: '0x',\r\n bsc: '0x',\r\n tron: '',\r\n algorand: ''\r\n };\r\n \r\n const prefix = prefixes[network] || '0x';\r\n const hash = Array.from({length: 64}, () => \r\n Math.floor(Math.random() * 16).toString(16)).join('');\r\n \r\n return `${prefix}${hash}`;\r\n};","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","// src/context/ThemeContext.jsx\r\nimport React, { createContext, useState, useContext, useEffect } from 'react';\r\n\r\nconst ThemeContext = createContext();\r\n\r\nexport const useTheme = () => useContext(ThemeContext);\r\n\r\nexport const ThemeProvider = ({ initialTheme = 'light', children }) => {\r\n const [theme, setTheme] = useState(initialTheme);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n useEffect(() => {\r\n document.documentElement.classList.remove('light', 'dark');\r\n document.documentElement.classList.add(theme);\r\n }, [theme]);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, setTheme, toggleTheme }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n","// src/context/CoinleyContext.jsx\r\nimport React, { createContext, useContext, useState, useEffect } from 'react';\r\nimport { initializeApi } from '../services/api';\r\n\r\nconst CoinleyContext = createContext();\r\n\r\nexport const useCoinley = () => useContext(CoinleyContext);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n merchantWalletAddress = null, // New prop for merchant wallet address\r\n merchantSolWalletAddress = null, // New prop for Solana wallet address\r\n debug = false,\r\n children\r\n}) => {\r\n const [isInitialized, setIsInitialized] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [paymentData, setPaymentData] = useState(null);\r\n\r\n useEffect(() => {\r\n if (!apiKey || !apiSecret) {\r\n setError('API key and secret are required');\r\n return;\r\n }\r\n\r\n try {\r\n initializeApi({ \r\n apiKey, \r\n apiSecret, \r\n apiUrl,\r\n merchantWalletAddress, // Pass wallet address to API service\r\n merchantSolWalletAddress\r\n });\r\n \r\n setIsInitialized(true);\r\n \r\n if (debug) {\r\n console.log('Coinley SDK initialized with:', { \r\n apiKey, \r\n apiUrl,\r\n merchantWalletAddress: merchantWalletAddress ? `${merchantWalletAddress.substring(0, 6)}...${merchantWalletAddress.substring(merchantWalletAddress.length - 4)}` : 'Not provided',\r\n merchantSolWalletAddress: merchantSolWalletAddress ? `${merchantSolWalletAddress.substring(0, 6)}...${merchantSolWalletAddress.substring(merchantSolWalletAddress.length - 4)}` : 'Not provided'\r\n });\r\n }\r\n } catch (err) {\r\n setError(err.message);\r\n if (debug) {\r\n console.error('Coinley SDK initialization error:', err);\r\n }\r\n }\r\n }, [apiKey, apiSecret, apiUrl, merchantWalletAddress, merchantSolWalletAddress, debug]);\r\n\r\n // Method to store payment data from responses for easy context access\r\n const storePaymentData = (data) => {\r\n setPaymentData(data);\r\n return data;\r\n };\r\n\r\n const value = {\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n merchantWalletAddress,\r\n merchantSolWalletAddress,\r\n isInitialized,\r\n error,\r\n debug,\r\n paymentData,\r\n storePaymentData\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={value}>\r\n {children}\r\n </CoinleyContext.Provider>\r\n );\r\n};","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n","// src/components/QRCode.jsx\r\nimport React, { useEffect, useState } from 'react';\r\nimport { QRCodeSVG } from 'qrcode.react';\r\n\r\n/**\r\n * Enhanced QR Code component that generates network-specific payment QR codes\r\n */\r\nconst QRCode = ({ \r\n walletAddress, \r\n amount, \r\n currency, \r\n network,\r\n theme = 'light',\r\n size = 200 \r\n}) => {\r\n const [qrData, setQrData] = useState('');\r\n const [qrError, setQrError] = useState(null);\r\n \r\n useEffect(() => {\r\n if (!walletAddress || walletAddress === 'No address configured') {\r\n setQrError('No wallet address configured for this network');\r\n return;\r\n }\r\n \r\n try {\r\n let paymentData;\r\n \r\n // Format QR code data based on network and currency\r\n switch (network) {\r\n case 'tron':\r\n if (currency === 'TRX') {\r\n // Native TRX transfer\r\n paymentData = `tronlink://transfer?to=${walletAddress}&amount=${amount}`;\r\n } else {\r\n // TRC20 token transfer - just the address for manual entry\r\n paymentData = walletAddress;\r\n }\r\n break;\r\n \r\n case 'algorand':\r\n // Algorand payment URI\r\n paymentData = `algorand://${walletAddress}?amount=${Math.floor(parseFloat(amount) * 1000000)}`;\r\n break;\r\n \r\n case 'bsc':\r\n // BSC - similar to Ethereum but different network\r\n if (currency === 'BNB') {\r\n paymentData = `ethereum:${walletAddress}@56?value=${convertToWei(amount)}`;\r\n } else {\r\n // BEP20 tokens\r\n const tokenAddress = getTokenAddressForCurrency(currency, 'bsc');\r\n if (tokenAddress) {\r\n paymentData = `ethereum:${tokenAddress}/transfer?address=${walletAddress}&uint256=${convertToSmallestUnit(amount, currency)}@56`;\r\n } else {\r\n paymentData = walletAddress;\r\n }\r\n }\r\n break;\r\n \r\n case 'ethereum':\r\n default:\r\n if (currency === 'ETH') {\r\n // Native ETH transfer\r\n paymentData = `ethereum:${walletAddress}@1?value=${convertToWei(amount)}`;\r\n } else {\r\n // ERC20 token transfer\r\n const tokenAddress = getTokenAddressForCurrency(currency, 'ethereum');\r\n if (tokenAddress) {\r\n paymentData = `ethereum:${tokenAddress}/transfer?address=${walletAddress}&uint256=${convertToSmallestUnit(amount, currency)}`;\r\n } else {\r\n paymentData = walletAddress;\r\n }\r\n }\r\n break;\r\n }\r\n \r\n setQrData(paymentData);\r\n setQrError(null);\r\n } catch (err) {\r\n console.error('Error generating QR code:', err);\r\n setQrError('Error generating payment QR code');\r\n }\r\n }, [walletAddress, amount, currency, network]);\r\n \r\n // Helper function to get token contract address\r\n const getTokenAddressForCurrency = (currency, network) => {\r\n const tokenAddresses = {\r\n ethereum: {\r\n 'USDT': '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n 'USDC': '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'\r\n },\r\n bsc: {\r\n 'USDT': '0x55d398326f99059fF775485246999027B3197955',\r\n 'USDC': '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d'\r\n },\r\n tron: {\r\n 'USDT': 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n 'USDC': 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8'\r\n }\r\n };\r\n \r\n return tokenAddresses[network]?.[currency] || '';\r\n };\r\n \r\n // Helper to convert amount to smallest unit based on currency\r\n const convertToSmallestUnit = (amount, currency) => {\r\n const decimals = currency === 'USDT' || currency === 'USDC' ? 6 : 18;\r\n return Math.floor(parseFloat(amount) * Math.pow(10, decimals)).toString();\r\n };\r\n \r\n // Helper to convert ETH to wei\r\n const convertToWei = (amount) => {\r\n return Math.floor(parseFloat(amount) * 1e18).toString();\r\n };\r\n\r\n // Get network display name\r\n const getNetworkDisplayName = (network) => {\r\n const names = {\r\n ethereum: 'Ethereum',\r\n bsc: 'BSC',\r\n tron: 'Tron',\r\n algorand: 'Algorand'\r\n };\r\n return names[network] || network;\r\n };\r\n\r\n // Get wallet app suggestions based on network\r\n const getWalletSuggestions = (network) => {\r\n const suggestions = {\r\n ethereum: ['MetaMask', 'Trust Wallet', 'Coinbase Wallet'],\r\n bsc: ['MetaMask', 'Trust Wallet', 'SafePal'],\r\n tron: ['TronLink', 'Trust Wallet'],\r\n algorand: ['Pera Wallet', 'MyAlgo Wallet']\r\n };\r\n return suggestions[network] || ['MetaMask', 'Trust Wallet'];\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center\">\r\n {qrError ? (\r\n <div className=\"p-4 rounded-lg bg-red-100 mb-3 text-red-700 text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n <p className=\"font-medium\">{qrError}</p>\r\n </div>\r\n ) : (\r\n <div className=\"p-4 rounded-lg bg-white mb-3 shadow-sm border\">\r\n {qrData && (\r\n <QRCodeSVG\r\n value={qrData}\r\n size={size}\r\n bgColor={theme === 'dark' ? '#374151' : '#FFFFFF'}\r\n fgColor={theme === 'dark' ? '#FFFFFF' : '#000000'}\r\n level=\"H\"\r\n includeMargin={true}\r\n />\r\n )}\r\n </div>\r\n )}\r\n \r\n <div className=\"text-center text-sm text-gray-700 mb-4\">\r\n <p className='font-semibold text-gray-800 flex items-center justify-center'>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h-4.01M12 12V8.01\" />\r\n </svg>\r\n Scan to Pay with {currency}\r\n </p>\r\n <p className=\"text-xs text-gray-500 mt-1\">\r\n Scan with your {getNetworkDisplayName(network)} wallet app\r\n </p>\r\n </div>\r\n \r\n {/* Payment Amount Display */}\r\n <div className=\"w-full mb-4 p-3 bg-gray-50 rounded-lg\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium text-gray-700\">Amount to Pay:</span>\r\n <span className=\"text-lg font-bold text-[#7042D2]\">{amount} {currency}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center mt-1\">\r\n <span className=\"text-xs text-gray-500\">Network:</span>\r\n <span className=\"text-xs font-medium text-gray-700\">{getNetworkDisplayName(network)}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Wallet Address Display */}\r\n {!qrError && (\r\n <div className=\"w-full mb-4\">\r\n <p className=\"text-xs text-gray-500 mb-1 text-center\">\r\n Or copy wallet address:\r\n </p>\r\n <div className=\"text-xs font-mono p-2 rounded bg-gray-100 text-gray-700 break-all text-center select-all cursor-pointer border\"\r\n onClick={() => navigator.clipboard?.writeText(walletAddress)}\r\n title=\"Click to copy\">\r\n {walletAddress}\r\n </div>\r\n </div>\r\n )}\r\n \r\n {/* Instructions */}\r\n <div className=\"w-full\">\r\n <div className=\"p-3 rounded bg-blue-50 border border-blue-200\">\r\n <h4 className=\"text-sm font-medium mb-2 text-blue-800 flex items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n Payment Instructions\r\n </h4>\r\n <ol className=\"text-xs space-y-1 text-blue-700\">\r\n <li>1. Open your crypto wallet app ({getWalletSuggestions(network).join(', ')})</li>\r\n <li>2. Scan the QR code above or copy the wallet address</li>\r\n <li>3. Send exactly <strong>{amount} {currency}</strong> on {getNetworkDisplayName(network)} network</li>\r\n <li>4. Click \"I have sent the payment\" button below after sending</li>\r\n </ol>\r\n \r\n <div className=\"mt-3 p-2 bg-yellow-50 border border-yellow-200 rounded\">\r\n <p className=\"text-xs text-yellow-800\">\r\n <strong>Important:</strong> Make sure you're sending on the correct network ({getNetworkDisplayName(network)}) \r\n and using the exact amount shown above.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default QRCode;\r\n\r\n","// src/components/PaymentStatus.jsx\r\nimport React from 'react';\r\n\r\n/**\r\n * Component to display payment status\r\n */\r\nconst PaymentStatus = ({ status, message, theme = 'light' }) => {\r\n // Render different icons based on status\r\n const renderIcon = () => {\r\n switch (status) {\r\n case 'processing':\r\n return (\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-4 border-t-blue-500 border-blue-500/20\"></div>\r\n );\r\n case 'success':\r\n return (\r\n <div className=\"rounded-full h-12 w-12 bg-green-100 flex items-center justify-center\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-8 w-8 text-green-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n );\r\n case 'error':\r\n return (\r\n <div className=\"rounded-full h-12 w-12 bg-red-100 flex items-center justify-center\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-8 w-8 text-red-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </div>\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n // Get status title\r\n const getStatusTitle = () => {\r\n switch (status) {\r\n case 'processing':\r\n return 'Processing Payment';\r\n case 'success':\r\n return 'Payment Successful';\r\n case 'error':\r\n return 'Payment Failed';\r\n default:\r\n return 'Unknown Status';\r\n }\r\n };\r\n\r\n // Get appropriate text color for message\r\n const getMessageClasses = () => {\r\n switch (status) {\r\n case 'processing':\r\n return theme === 'dark' ? 'text-blue-300' : 'text-blue-600';\r\n case 'success':\r\n return theme === 'dark' ? 'text-green-300' : 'text-green-600';\r\n case 'error':\r\n return theme === 'dark' ? 'text-red-300' : 'text-red-600';\r\n default:\r\n return theme === 'dark' ? 'text-gray-300' : 'text-gray-600';\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-6\">\r\n <div className=\"mb-4\">{renderIcon()}</div>\r\n <h3 className={`text-xl font-bold mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n {getStatusTitle()}\r\n </h3>\r\n <p className={`text-center ${getMessageClasses()}`}>{message}</p>\r\n\r\n {status === 'processing' && (\r\n <div className={`mt-4 text-xs ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}>\r\n This may take a few moments. Please do not close this window.\r\n </div>\r\n )}\r\n\r\n {status === 'success' && (\r\n <div className={`mt-4 p-2 rounded ${theme === 'dark' ? 'bg-gray-700' : 'bg-gray-100'}`}>\r\n <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-600'}`}>\r\n Your payment has been successfully processed. You will receive a confirmation shortly.\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PaymentStatus;","// // src/components/PaymentMethods.jsx\r\n// import React, { useState, useEffect } from 'react';\r\n// import { NETWORK_TYPES, TOKEN_CONFIG, detectWallets, WALLET_TYPES } from '../services/walletService';\r\n\r\n// /**\r\n// * Payment methods component with network dropdown and currency grid\r\n// */\r\n// const PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n// const [selectedNetwork, setSelectedNetwork] = useState(NETWORK_TYPES.ETHEREUM);\r\n// const [availableWallets, setAvailableWallets] = useState({});\r\n// const [showMore, setShowMore] = useState(false);\r\n\r\n// useEffect(() => {\r\n// setAvailableWallets(detectWallets());\r\n// }, []);\r\n\r\n// // Available networks\r\n// const networks = [\r\n// {\r\n// id: NETWORK_TYPES.ETHEREUM,\r\n// name: 'Ethereum',\r\n// description: 'ERC-20 tokens'\r\n// },\r\n// {\r\n// id: NETWORK_TYPES.BSC,\r\n// name: 'BSC (Binance Smart Chain)',\r\n// description: 'BEP-20 tokens'\r\n// },\r\n// {\r\n// id: NETWORK_TYPES.TRON,\r\n// name: 'Tron',\r\n// description: 'TRC-20 tokens'\r\n// },\r\n// {\r\n// id: NETWORK_TYPES.ALGORAND,\r\n// name: 'Algorand',\r\n// description: 'ASA tokens'\r\n// }\r\n// ];\r\n\r\n// // Payment methods based on selected network\r\n// const getPaymentMethodsForNetwork = (network) => {\r\n// const methods = [];\r\n \r\n// switch (network) {\r\n// case NETWORK_TYPES.ETHEREUM:\r\n// methods.push(\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'PYUSD',\r\n// name: 'PYUSD',\r\n// description: 'PayPal USD',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/28492.png',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'FRAX',\r\n// name: 'FRAX',\r\n// description: 'Frax',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'USDP',\r\n// name: 'USDP',\r\n// description: 'Pax Dollar',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6662.png',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'DAI',\r\n// name: 'DAI',\r\n// description: 'Dai Stablecoin',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// },\r\n// {\r\n// id: 'ETH',\r\n// name: 'ETH',\r\n// description: 'Ethereum',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTcyJyRKN0dRJWVZqoLzYgkRHdJsxKGq8nHUw&s',\r\n// network: NETWORK_TYPES.ETHEREUM\r\n// }\r\n// );\r\n// break;\r\n \r\n// case NETWORK_TYPES.BSC:\r\n// methods.push(\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.BSC\r\n// },\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.BSC\r\n// },\r\n// {\r\n// id: 'BUSD',\r\n// name: 'BUSD',\r\n// description: 'Binance USD',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n// network: NETWORK_TYPES.BSC\r\n// },\r\n// {\r\n// id: 'FRAX',\r\n// name: 'FRAX',\r\n// description: 'Frax',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n// network: NETWORK_TYPES.BSC\r\n// },\r\n// {\r\n// id: 'BNB',\r\n// name: 'BNB',\r\n// description: 'Binance Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRHSjyW2sSnBhwztCwVW97i1BtV40g7heMMxg&s',\r\n// network: NETWORK_TYPES.BSC\r\n// }\r\n// );\r\n// break;\r\n \r\n// case NETWORK_TYPES.TRON:\r\n// methods.push(\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.TRON\r\n// },\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.TRON\r\n// },\r\n// {\r\n// id: 'USDJ',\r\n// name: 'USDJ',\r\n// description: 'JUST Stablecoin',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/5446.png',\r\n// network: NETWORK_TYPES.TRON\r\n// },\r\n// {\r\n// id: 'TRX',\r\n// name: 'TRX',\r\n// description: 'Tron',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQKLpLNsGRHbZfCUXAjZLPSp_YFZvX5dMnAoA&s',\r\n// network: NETWORK_TYPES.TRON\r\n// }\r\n// );\r\n// break;\r\n \r\n// case NETWORK_TYPES.ALGORAND:\r\n// methods.push(\r\n// {\r\n// id: 'USDC',\r\n// name: 'USDC',\r\n// description: 'USD Coin',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n// network: NETWORK_TYPES.ALGORAND\r\n// },\r\n// {\r\n// id: 'USDT',\r\n// name: 'USDT',\r\n// description: 'Tether USD',\r\n// logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n// network: NETWORK_TYPES.ALGORAND\r\n// },\r\n// {\r\n// id: 'ALGO',\r\n// name: 'ALGO',\r\n// description: 'Algorand',\r\n// logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4030.png',\r\n// network: NETWORK_TYPES.ALGORAND\r\n// }\r\n// );\r\n// break;\r\n \r\n// default:\r\n// break;\r\n// }\r\n \r\n// return methods;\r\n// };\r\n\r\n// const handleNetworkChange = (networkId) => {\r\n// setSelectedNetwork(networkId);\r\n// setShowMore(false); // Reset show more when network changes\r\n \r\n// // Reset selection when network changes\r\n// if (selected?.network !== networkId) {\r\n// onSelect(null);\r\n// }\r\n// };\r\n\r\n// const handleSelectPaymentMethod = (method) => {\r\n// onSelect({\r\n// currency: method.id,\r\n// network: selectedNetwork,\r\n// tokenConfig: TOKEN_CONFIG[method.id]?.[selectedNetwork],\r\n// method: method\r\n// });\r\n// };\r\n\r\n// const availableMethods = getPaymentMethodsForNetwork(selectedNetwork);\r\n// const visibleMethods = showMore ? availableMethods : availableMethods.slice(0, 4);\r\n\r\n// // FIXED: Helper functions with correct wallet constants\r\n// function getRequiredWallet(network) {\r\n// switch (network) {\r\n// case NETWORK_TYPES.ETHEREUM:\r\n// case NETWORK_TYPES.BSC:\r\n// return WALLET_TYPES.METAMASK; // Use the actual constant\r\n// case NETWORK_TYPES.TRON:\r\n// return WALLET_TYPES.TRONLINK; // Use the actual constant\r\n// case NETWORK_TYPES.ALGORAND:\r\n// return WALLET_TYPES.LUTE; // Use the actual constant\r\n// default:\r\n// return WALLET_TYPES.METAMASK;\r\n// }\r\n// }\r\n\r\n// function getNetworkRequirement(network) {\r\n// const wallet = getRequiredWallet(network);\r\n// const isAvailable = availableWallets[wallet];\r\n \r\n// const walletNames = {\r\n// [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n// [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n// [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n// };\r\n \r\n// return isAvailable \r\n// ? `${walletNames[wallet]} detected - Ready to pay`\r\n// : `${walletNames[wallet]} required - Please install to continue`;\r\n// }\r\n\r\n// return (\r\n// <div>\r\n// <h3 className={`text-lg font-medium mb-4 ${theme === 'dark' ? 'text-white' : 'text-gray-800'}`}>\r\n// Select Payment Method\r\n// </h3>\r\n \r\n// {/* Blockchain Network Dropdown */}\r\n// <div className=\"mb-6\">\r\n// <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n// Blockchain Network\r\n// </label>\r\n// <select\r\n// value={selectedNetwork}\r\n// onChange={(e) => handleNetworkChange(e.target.value)}\r\n// className={`w-full p-3 rounded-lg border transition-colors ${\r\n// theme === 'dark'\r\n// ? 'bg-gray-700 border-gray-600 text-white focus:border-[#7042D2]'\r\n// : 'bg-white border-gray-300 text-gray-900 focus:border-[#7042D2]'\r\n// } focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50`}\r\n// >\r\n// {networks\r\n// .filter(network => supportedNetworks.length === 0 || supportedNetworks.includes(network.id))\r\n// .map((network) => (\r\n// <option key={network.id} value={network.id}>\r\n// {network.name} - {network.description}\r\n// </option>\r\n// ))}\r\n// </select>\r\n// </div>\r\n\r\n// {/* Stablecoins/Tokens Grid */}\r\n// <div className=\"mb-4\">\r\n// <label className={`block text-sm font-medium mb-3 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n// Choose Cryptocurrency\r\n// </label>\r\n \r\n// <div className=\"grid grid-cols-2 gap-3 mb-4\">\r\n// {visibleMethods.map((method) => (\r\n// <button\r\n// key={`${method.id}-${method.network}`}\r\n// onClick={() => handleSelectPaymentMethod(method)}\r\n// className={`p-4 rounded-lg transition-all duration-200 border-2 ${\r\n// selected?.currency === method.id && selected?.network === selectedNetwork\r\n// ? theme === 'dark'\r\n// ? 'bg-blue-900/30 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n// : 'bg-blue-50 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n// : theme === 'dark'\r\n// ? 'bg-gray-700 hover:bg-gray-600 border-gray-600 hover:border-gray-500'\r\n// : 'bg-white hover:bg-gray-50 border-gray-200 hover:border-gray-300'\r\n// }`}\r\n// >\r\n// <div className=\"flex flex-col items-center text-center\">\r\n// <div className=\"flex-shrink-0 h-10 w-10 bg-white rounded-full flex items-center justify-center mb-2 shadow-sm\">\r\n// <img src={method.logo} alt={method.name} className=\"h-6 w-6\" />\r\n// </div>\r\n// <div>\r\n// <h4 className={`font-medium text-sm ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n// {method.name}\r\n// </h4>\r\n// <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-500'}`}>\r\n// {method.description}\r\n// </p>\r\n// </div>\r\n// {selected?.currency === method.id && selected?.network === selectedNetwork && (\r\n// <div className=\"mt-2\">\r\n// <svg\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// className=\"h-4 w-4 text-[#7042D2]\"\r\n// viewBox=\"0 0 20 20\"\r\n// fill=\"currentColor\"\r\n// >\r\n// <path\r\n// fillRule=\"evenodd\"\r\n// d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\r\n// clipRule=\"evenodd\"\r\n// />\r\n// </svg>\r\n// </div>\r\n// )}\r\n// </div>\r\n// </button>\r\n// ))}\r\n// </div>\r\n\r\n// {/* Show More/Less Button */}\r\n// {availableMethods.length > 4 && (\r\n// <button\r\n// onClick={() => setShowMore(!showMore)}\r\n// className={`w-full py-2 px-4 rounded-lg text-sm font-medium transition-colors ${\r\n// theme === 'dark'\r\n// ? 'bg-gray-700 text-gray-300 hover:bg-gray-600'\r\n// : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\r\n// }`}\r\n// >\r\n// {showMore ? 'Show Less' : `Show More (${availableMethods.length - 4} more)`}\r\n// </button>\r\n// )}\r\n// </div>\r\n\r\n// {/* Network Info */}\r\n// <div className={`p-3 rounded-lg text-sm ${\r\n// theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n// }`}>\r\n// <div className=\"flex items-center\">\r\n// <div className={`w-2 h-2 rounded-full mr-2 ${\r\n// availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n// }`}></div>\r\n// <span className=\"text-xs\">\r\n// {getNetworkRequirement(selectedNetwork)}\r\n// </span>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// );\r\n// };\r\n\r\n// export default PaymentMethods;\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/components/PaymentMethods.jsx\r\nimport React, { useState, useEffect } from 'react';\r\nimport { NETWORK_TYPES, TOKEN_CONFIG, detectWallets, WALLET_TYPES } from '../services/walletService';\r\n\r\n/**\r\n * Payment methods component with network dropdown and currency grid\r\n */\r\nconst PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n const [selectedNetwork, setSelectedNetwork] = useState(NETWORK_TYPES.ETHEREUM);\r\n const [availableWallets, setAvailableWallets] = useState({});\r\n const [showMore, setShowMore] = useState(false);\r\n\r\n useEffect(() => {\r\n setAvailableWallets(detectWallets());\r\n }, []);\r\n\r\n // Available networks\r\n const networks = [\r\n {\r\n id: NETWORK_TYPES.ETHEREUM,\r\n name: 'Ethereum',\r\n description: 'ERC-20 tokens'\r\n },\r\n {\r\n id: NETWORK_TYPES.BSC,\r\n name: 'BSC (Binance Smart Chain)',\r\n description: 'BEP-20 tokens'\r\n },\r\n {\r\n id: NETWORK_TYPES.TRON,\r\n name: 'Tron',\r\n description: 'TRC-20 tokens'\r\n },\r\n {\r\n id: NETWORK_TYPES.ALGORAND,\r\n name: 'Algorand',\r\n description: 'ASA tokens'\r\n }\r\n ];\r\n\r\n // Payment methods based on selected network\r\n const getPaymentMethodsForNetwork = (network) => {\r\n const methods = [];\r\n \r\n switch (network) {\r\n case NETWORK_TYPES.ETHEREUM:\r\n methods.push(\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'PYUSD',\r\n name: 'PYUSD',\r\n description: 'PayPal USD',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/28492.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'FRAX',\r\n name: 'FRAX',\r\n description: 'Frax',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'USDP',\r\n name: 'USDP',\r\n description: 'Pax Dollar',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6662.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'DAI',\r\n name: 'DAI',\r\n description: 'Dai Stablecoin',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n network: NETWORK_TYPES.ETHEREUM\r\n },\r\n {\r\n id: 'ETH',\r\n name: 'ETH',\r\n description: 'Ethereum',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTcyJyRKN0dRJWVZqoLzYgkRHdJsxKGq8nHUw&s',\r\n network: NETWORK_TYPES.ETHEREUM\r\n }\r\n );\r\n break;\r\n \r\n case NETWORK_TYPES.BSC:\r\n methods.push(\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'BUSD',\r\n name: 'BUSD',\r\n description: 'Binance USD',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'FRAX',\r\n name: 'FRAX',\r\n description: 'Frax',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n network: NETWORK_TYPES.BSC\r\n },\r\n {\r\n id: 'BNB',\r\n name: 'BNB',\r\n description: 'Binance Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRHSjyW2sSnBhwztCwVW97i1BtV40g7heMMxg&s',\r\n network: NETWORK_TYPES.BSC\r\n }\r\n );\r\n break;\r\n \r\n case NETWORK_TYPES.TRON:\r\n methods.push(\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.TRON\r\n },\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.TRON\r\n },\r\n {\r\n id: 'USDJ',\r\n name: 'USDJ',\r\n description: 'JUST Stablecoin',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/5446.png',\r\n network: NETWORK_TYPES.TRON\r\n },\r\n {\r\n id: 'TRX',\r\n name: 'TRX',\r\n description: 'Tron',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQKLpLNsGRHbZfCUXAjZLPSp_YFZvX5dMnAoA&s',\r\n network: NETWORK_TYPES.TRON\r\n }\r\n );\r\n break;\r\n \r\n case NETWORK_TYPES.ALGORAND:\r\n methods.push(\r\n {\r\n id: 'USDC',\r\n name: 'USDC',\r\n description: 'USD Coin',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ43MuDqq54iD1ZCRL_uthAPkfwSSL-J5qI_Q&s',\r\n network: NETWORK_TYPES.ALGORAND\r\n },\r\n {\r\n id: 'USDT',\r\n name: 'USDT',\r\n description: 'Tether USD',\r\n logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj0euZAOXsLTJFQxgiKzlX7z8xbfBk-7kmJA&s',\r\n network: NETWORK_TYPES.ALGORAND\r\n },\r\n {\r\n id: 'ALGO',\r\n name: 'ALGO',\r\n description: 'Algorand',\r\n logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4030.png',\r\n network: NETWORK_TYPES.ALGORAND\r\n }\r\n );\r\n break;\r\n \r\n default:\r\n break;\r\n }\r\n \r\n return methods;\r\n };\r\n\r\n const handleNetworkChange = (networkId) => {\r\n setSelectedNetwork(networkId);\r\n setShowMore(false); // Reset show more when network changes\r\n \r\n // Reset selection when network changes\r\n if (selected?.network !== networkId) {\r\n onSelect(null);\r\n }\r\n };\r\n\r\n const handleSelectPaymentMethod = (method) => {\r\n onSelect({\r\n currency: method.id,\r\n network: selectedNetwork,\r\n tokenConfig: TOKEN_CONFIG[method.id]?.[selectedNetwork],\r\n method: method\r\n });\r\n };\r\n\r\n const availableMethods = getPaymentMethodsForNetwork(selectedNetwork);\r\n const visibleMethods = showMore ? availableMethods : availableMethods.slice(0, 4);\r\n\r\n // Helper functions with correct wallet constants\r\n function getRequiredWallet(network) {\r\n switch (network) {\r\n case NETWORK_TYPES.ETHEREUM:\r\n case NETWORK_TYPES.BSC:\r\n return WALLET_TYPES.METAMASK; // Use the actual constant\r\n case NETWORK_TYPES.TRON:\r\n return WALLET_TYPES.TRONLINK; // Use the actual constant\r\n case NETWORK_TYPES.ALGORAND:\r\n return WALLET_TYPES.LUTE; // Use the actual constant\r\n default:\r\n return WALLET_TYPES.METAMASK;\r\n }\r\n }\r\n\r\n function getNetworkRequirement(network) {\r\n const wallet = getRequiredWallet(network);\r\n const isAvailable = availableWallets[wallet];\r\n \r\n const walletNames = {\r\n [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n };\r\n \r\n return isAvailable \r\n ? `${walletNames[wallet]} detected - Ready to pay`\r\n : `${walletNames[wallet]} required - Please install to continue`;\r\n }\r\n\r\n return (\r\n <div>\r\n <h3 className={`text-lg font-medium mb-4 ${theme === 'dark' ? 'text-white' : 'text-gray-800'}`}>\r\n Select Payment Method\r\n </h3>\r\n \r\n {/* Blockchain Network Dropdown */}\r\n <div className=\"mb-6\">\r\n <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n Blockchain Network\r\n </label>\r\n <select\r\n value={selectedNetwork}\r\n onChange={(e) => handleNetworkChange(e.target.value)}\r\n className={`w-full p-3 rounded-lg border transition-colors ${\r\n theme === 'dark'\r\n ? 'bg-gray-700 border-gray-600 text-white focus:border-[#7042D2]'\r\n : 'bg-white border-gray-300 text-gray-900 focus:border-[#7042D2]'\r\n } focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50`}\r\n >\r\n {networks\r\n .filter(network => supportedNetworks.length === 0 || supportedNetworks.includes(network.id))\r\n .map((network) => (\r\n <option key={network.id} value={network.id}>\r\n {network.name} - {network.description}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Stablecoins/Tokens Grid */}\r\n <div className=\"mb-4\">\r\n <label className={`block text-sm font-medium mb-3 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n Choose Cryptocurrency\r\n </label>\r\n \r\n <div className=\"grid grid-cols-2 gap-3 mb-4\">\r\n {visibleMethods.map((method) => (\r\n <button\r\n key={`${method.id}-${method.network}`}\r\n onClick={() => handleSelectPaymentMethod(method)}\r\n className={`p-4 rounded-lg transition-all duration-200 border-2 ${\r\n selected?.currency === method.id && selected?.network === selectedNetwork\r\n ? theme === 'dark'\r\n ? 'bg-blue-900/30 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n : 'bg-blue-50 border-[#7042D2] ring-2 ring-[#7042D2] ring-opacity-50'\r\n : theme === 'dark'\r\n ? 'bg-gray-700 hover:bg-gray-600 border-gray-600 hover:border-gray-500'\r\n : 'bg-white hover:bg-gray-50 border-gray-200 hover:border-gray-300'\r\n }`}\r\n >\r\n <div className=\"flex flex-col items-center text-center\">\r\n <div className=\"flex-shrink-0 h-10 w-10 bg-white rounded-full flex items-center justify-center mb-2 shadow-sm\">\r\n <img src={method.logo} alt={method.name} className=\"h-6 w-6\" />\r\n </div>\r\n <div>\r\n <h4 className={`font-medium text-sm ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n {method.name}\r\n </h4>\r\n <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-500'}`}>\r\n {method.description}\r\n </p>\r\n </div>\r\n {selected?.currency === method.id && selected?.network === selectedNetwork && (\r\n <div className=\"mt-2\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"h-4 w-4 text-[#7042D2]\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"currentColor\"\r\n >\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Show More/Less Button */}\r\n {availableMethods.length > 4 && (\r\n <button\r\n onClick={() => setShowMore(!showMore)}\r\n className={`w-full py-2 px-4 rounded-lg text-sm font-medium transition-colors ${\r\n theme === 'dark'\r\n ? 'bg-gray-700 text-gray-300 hover:bg-gray-600'\r\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\r\n }`}\r\n >\r\n {showMore ? 'Show Less' : `Show More (${availableMethods.length - 4} more)`}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Network Info */}\r\n <div className={`p-3 rounded-lg text-sm ${\r\n theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n }`}>\r\n <div className=\"flex items-center\">\r\n <div className={`w-2 h-2 rounded-full mr-2 ${\r\n availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n }`}></div>\r\n <span className=\"text-xs\">\r\n {getNetworkRequirement(selectedNetwork)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PaymentMethods;","// // src/components/CoinleyModal.jsx\r\n// import React, { useState, useEffect } from 'react';\r\n// import PaymentMethods from './PaymentMethods';\r\n// import PaymentStatus from './PaymentStatus';\r\n// import QRCode from './QRCode';\r\n// import { WALLET_TYPES, getWalletInstallUrl, detectWallets } from '../services/walletService';\r\n// import logo from '../assets/Logo.png';\r\n\r\n// const CoinleyModal = ({\r\n// isOpen,\r\n// onClose,\r\n// payment,\r\n// paymentStatus,\r\n// selectedPaymentMethod,\r\n// onPaymentMethodSelect,\r\n// onPayment,\r\n// onBack,\r\n// error,\r\n// theme = 'light',\r\n// merchantName,\r\n// transactionHash,\r\n// walletConnection,\r\n// onConnectWallet,\r\n// testMode = false,\r\n// supportedNetworks = [],\r\n// availableWallets = {},\r\n// supportedWallets = [],\r\n// step = 'select-currency',\r\n// merchantWalletAddresses = {}\r\n// }) => {\r\n// const [paymentType, setPaymentType] = useState('wallet'); // 'wallet' or 'qrcode'\r\n\r\n// // Get wallet address for current network\r\n// const getWalletAddressForNetwork = () => {\r\n// if (!selectedPaymentMethod) return 'No network selected';\r\n \r\n// const networkAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n// if (networkAddress) {\r\n// return networkAddress;\r\n// }\r\n \r\n// // Fallback to payment recipient wallet if available\r\n// if (payment?.recipientWallet) {\r\n// return payment.recipientWallet;\r\n// }\r\n \r\n// return 'No wallet address configured for this network';\r\n// };\r\n\r\n// // Utility functions\r\n// const formatAmount = (amount) => {\r\n// return parseFloat(amount).toFixed(2);\r\n// };\r\n\r\n// const formatTransactionHash = (hash) => {\r\n// if (!hash) return '';\r\n// if (hash.length <= 14) return hash;\r\n// return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n// };\r\n\r\n// const getNetworkDisplayName = (network) => {\r\n// const names = {\r\n// ethereum: 'Ethereum',\r\n// bsc: 'BSC',\r\n// tron: 'Tron',\r\n// algorand: 'Algorand'\r\n// };\r\n// return names[network] || network;\r\n// };\r\n\r\n// const getWalletDisplayName = (walletType) => {\r\n// const names = {\r\n// [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n// [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n// [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n// [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n// };\r\n// return names[walletType] || walletType;\r\n// };\r\n\r\n// const getWalletIcon = (walletType) => {\r\n// const icons = {\r\n// [WALLET_TYPES.METAMASK]: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n// [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/images/logo.png',\r\n// [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/assets/images/trust_logotype.svg',\r\n// [WALLET_TYPES.LUTE]: 'https://lute.app/logo.png'\r\n// };\r\n// return icons[walletType] || '';\r\n// };\r\n\r\n// if (!isOpen) return null;\r\n\r\n// return (\r\n// <div className=\"fixed inset-0 z-50 overflow-y-auto bg-black/50\">\r\n// <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n// <div className=\"relative p-6 w-full max-w-md mx-auto rounded-lg shadow-xl bg-white text-gray-800\">\r\n// {/* Header */}\r\n// <div className=\"flex justify-between items-center mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n// <div className=\"flex items-center\">\r\n// <h2 className=\"text-xl font-bold text-gray-900\">\r\n// <img src={logo} className='w-32' alt=\"Coinley Logo\" />\r\n// </h2>\r\n// </div>\r\n// <button \r\n// onClick={onClose}\r\n// className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n// >\r\n// <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n// </svg>\r\n// </button>\r\n// </div>\r\n \r\n// {/* Content */}\r\n// <div className=\"mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n// {payment && (\r\n// <div className=\"mb-6 p-4 rounded-lg\">\r\n// <p className=\"text-lg text-gray-800 font-semibold\">\r\n// PAY: {merchantName}\r\n// </p>\r\n// <div className=\"flex justify-between items-center mt-2 bg-gray-100 px-3 rounded-lg\">\r\n// <span className=\"font-medium text-gray-700\">\r\n// Amount:\r\n// </span>\r\n// <span className=\"font-bold text-xl text-[#7042D2]\">\r\n// ${formatAmount(payment.totalAmount || payment.amount)}\r\n// </span>\r\n// </div>\r\n// <div className=\"text-xs mt-1 text-right\">\r\n// <span className=\"text-gray-500\">\r\n// Payment ID: {payment.id ? payment.id.slice(0, 8) : ''}...\r\n// </span>\r\n// </div>\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Select Currency/Network */}\r\n// {step === 'select-currency' && (\r\n// <div>\r\n// <PaymentMethods \r\n// onSelect={onPaymentMethodSelect} \r\n// selected={selectedPaymentMethod}\r\n// theme={theme}\r\n// supportedNetworks={supportedNetworks}\r\n// />\r\n \r\n// {/* FIXED: Proceed Button - simplified logic */}\r\n// {selectedPaymentMethod && (\r\n// <div className=\"mt-6\">\r\n// <button\r\n// onClick={() => {\r\n// console.log('Proceed button clicked, calling onPaymentMethodSelect');\r\n// onPaymentMethodSelect(selectedPaymentMethod);\r\n// }}\r\n// className=\"w-full py-3 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-lg transition-colors\"\r\n// disabled={!selectedPaymentMethod}\r\n// >\r\n// Proceed with {selectedPaymentMethod.currency} on {getNetworkDisplayName(selectedPaymentMethod.network)}\r\n// </button>\r\n// </div>\r\n// )}\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Confirm Payment */}\r\n// {step === 'confirm' && selectedPaymentMethod && payment && (\r\n// <div>\r\n// <div className=\"p-4 rounded-lg mb-4 bg-gray-100\">\r\n// <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n// Payment Details\r\n// </h3>\r\n// <div className=\"space-y-2\">\r\n// <div className=\"flex justify-between\">\r\n// <span className=\"text-[#7042D2] font-semibold\">Currency:</span>\r\n// <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n// </div>\r\n// <div className=\"flex justify-between\">\r\n// <span className=\"text-[#7042D2] font-semibold\">Network:</span>\r\n// <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n// </div>\r\n// <div className=\"flex justify-between\">\r\n// <span className=\"text-[#7042D2] font-semibold\">Fee:</span>\r\n// <span className=\"font-medium\">1.75%</span>\r\n// </div>\r\n// </div>\r\n// </div>\r\n\r\n// {/* Payment Method Tabs */}\r\n// <div className=\"mb-4\">\r\n// <div className=\"flex border-b border-gray-200\">\r\n// <button\r\n// onClick={() => setPaymentType('wallet')}\r\n// className={`py-2 px-4 text-sm font-medium ${\r\n// paymentType === 'wallet'\r\n// ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n// : 'text-gray-500 hover:text-gray-700'\r\n// }`}\r\n// >\r\n// Connect Wallet\r\n// </button>\r\n// <button\r\n// onClick={() => setPaymentType('qrcode')}\r\n// className={`py-2 px-4 text-sm font-medium ${\r\n// paymentType === 'qrcode'\r\n// ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n// : 'text-gray-500 hover:text-gray-700'\r\n// }`}\r\n// >\r\n// QR Code\r\n// </button>\r\n// </div>\r\n// </div>\r\n\r\n// {testMode ? (\r\n// // Test mode payment option\r\n// <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n// <div className=\"flex items-center\">\r\n// <div className=\"bg-[#7042D2] rounded-full p-2 mr-3\">\r\n// <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n// </svg>\r\n// </div>\r\n// <div>\r\n// <h3 className=\"font-medium text-gray-800\">\r\n// Test Mode Payment\r\n// </h3>\r\n// <p className=\"text-sm text-gray-600\">\r\n// Click \"Pay Now\" to simulate a successful payment\r\n// </p>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// ) : paymentType === 'qrcode' ? (\r\n// // QR Code payment option\r\n// <div className=\"mb-4\">\r\n// <QRCode \r\n// walletAddress={getWalletAddressForNetwork()} \r\n// amount={payment.totalAmount || payment.amount}\r\n// currency={selectedPaymentMethod.currency}\r\n// network={selectedPaymentMethod.network}\r\n// theme={theme}\r\n// />\r\n// </div>\r\n// ) : (\r\n// // Wallet connection option\r\n// <div className=\"space-y-3 mb-4\">\r\n// {supportedWallets.length === 0 ? (\r\n// <div className=\"p-4 rounded-lg bg-yellow-50\">\r\n// <div className=\"flex items-center\">\r\n// <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-yellow-500 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n// <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n// </svg>\r\n// <div>\r\n// <h3 className=\"font-medium text-gray-800\">No Compatible Wallets</h3>\r\n// <p className=\"text-sm text-gray-600\">\r\n// No wallets detected for {getNetworkDisplayName(selectedPaymentMethod.network)} network\r\n// </p>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// ) : (\r\n// supportedWallets.map((walletType) => (\r\n// <div key={walletType} className=\"p-4 rounded-lg bg-blue-50\">\r\n// <div className=\"flex items-center justify-between\">\r\n// <div className=\"flex items-center\">\r\n// <img \r\n// src={getWalletIcon(walletType)} \r\n// alt={getWalletDisplayName(walletType)}\r\n// className=\"w-8 h-8 mr-3\"\r\n// onError={(e) => {\r\n// e.target.style.display = 'none';\r\n// }}\r\n// />\r\n// <div>\r\n// <h3 className=\"font-medium text-gray-800\">\r\n// {getWalletDisplayName(walletType)}\r\n// </h3>\r\n// <p className=\"text-sm text-gray-600\">\r\n// Pay with {getWalletDisplayName(walletType)}\r\n// </p>\r\n// </div>\r\n// </div>\r\n \r\n// {walletConnection?.walletType === walletType ? (\r\n// <div className=\"flex items-center space-x-2\">\r\n// <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\r\n// <span className=\"text-sm text-green-600\">Connected</span>\r\n// </div>\r\n// ) : (\r\n// <button\r\n// onClick={() => {\r\n// console.log('Connect wallet button clicked for:', walletType);\r\n// onConnectWallet(walletType);\r\n// }}\r\n// className=\"py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md text-sm\"\r\n// >\r\n// Connect\r\n// </button>\r\n// )}\r\n// </div>\r\n// </div>\r\n// ))\r\n// )}\r\n\r\n// {/* Install wallet links for missing wallets */}\r\n// <div className=\"space-y-2\">\r\n// {Object.entries(availableWallets)\r\n// .filter(([walletType, isAvailable]) => !isAvailable)\r\n// .map(([walletType]) => (\r\n// <div key={walletType} className=\"p-3 rounded-lg bg-gray-50\">\r\n// <div className=\"flex items-center justify-between\">\r\n// <span className=\"text-sm text-gray-600\">\r\n// {getWalletDisplayName(walletType)} not detected\r\n// </span>\r\n// <a\r\n// href={getWalletInstallUrl(walletType)}\r\n// target=\"_blank\"\r\n// rel=\"noopener noreferrer\"\r\n// className=\"text-sm text-[#7042D2] hover:underline\"\r\n// >\r\n// Install\r\n// </a>\r\n// </div>\r\n// </div>\r\n// ))}\r\n// </div>\r\n// </div>\r\n// )}\r\n\r\n// {/* Navigation buttons */}\r\n// <div className=\"grid grid-cols-2 gap-3\">\r\n// <button\r\n// type=\"button\"\r\n// onClick={onBack}\r\n// className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-[#7042D2] font-medium rounded-md\"\r\n// >\r\n// Back\r\n// </button>\r\n// <button\r\n// type=\"button\"\r\n// onClick={() => onPayment(paymentType === 'qrcode')}\r\n// className=\"w-full py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md\"\r\n// disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n// >\r\n// {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n// </button>\r\n// </div>\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Processing */}\r\n// {step === 'processing' && (\r\n// <PaymentStatus \r\n// status=\"processing\" \r\n// theme={theme}\r\n// message=\"Processing your payment...\"\r\n// />\r\n// )}\r\n\r\n// {/* Step: Success */}\r\n// {step === 'success' && (\r\n// <div>\r\n// <PaymentStatus \r\n// status=\"success\" \r\n// theme={theme}\r\n// message=\"Payment successful!\"\r\n// />\r\n// {transactionHash && (\r\n// <div className=\"mt-4 p-3 rounded-lg bg-gray-100\">\r\n// <p className=\"text-xs text-gray-600 mb-1\">\r\n// Transaction Hash:\r\n// </p>\r\n// <p className=\"text-sm font-mono break-all text-gray-800\">\r\n// {formatTransactionHash(transactionHash)}\r\n// </p>\r\n// {selectedPaymentMethod && (\r\n// <a \r\n// href={`${getExplorerUrl(selectedPaymentMethod.network)}/${getExplorerPath(selectedPaymentMethod.network)}/${transactionHash}`}\r\n// target=\"_blank\"\r\n// rel=\"noopener noreferrer\"\r\n// className=\"text-xs text-[#7042D2] mt-2 inline-block\"\r\n// >\r\n// View on Explorer →\r\n// </a>\r\n// )}\r\n// </div>\r\n// )}\r\n// </div>\r\n// )}\r\n\r\n// {/* Step: Error */}\r\n// {step === 'error' && (\r\n// <div>\r\n// <PaymentStatus \r\n// status=\"error\" \r\n// theme={theme}\r\n// message={error || \"An error occurred while processing your payment.\"}\r\n// />\r\n// <button\r\n// type=\"button\"\r\n// onClick={onBack}\r\n// className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n// >\r\n// Try Again\r\n// </button>\r\n// </div>\r\n// )}\r\n// </div>\r\n\r\n// {/* Footer */}\r\n// <div className=\"text-center text-xs text-gray-500\">\r\n// <p>Powered by <span className='text-[#7042D2]'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// </div>\r\n// );\r\n// };\r\n\r\n// // Helper functions\r\n// const getExplorerUrl = (network) => {\r\n// const explorers = {\r\n// ethereum: 'https://etherscan.io',\r\n// bsc: 'https://bscscan.com',\r\n// tron: 'https://tronscan.org',\r\n// algorand: 'https://algoexplorer.io'\r\n// };\r\n// return explorers[network] || 'https://etherscan.io';\r\n// };\r\n\r\n// const getExplorerPath = (network) => {\r\n// const paths = {\r\n// ethereum: 'tx',\r\n// bsc: 'tx',\r\n// tron: 'transaction',\r\n// algorand: 'tx'\r\n// };\r\n// return paths[network] || 'tx';\r\n// };\r\n\r\n// export default CoinleyModal;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/components/CoinleyModal.jsx\r\nimport React, { useState, useEffect } from 'react';\r\nimport PaymentMethods from './PaymentMethods';\r\nimport PaymentStatus from './PaymentStatus';\r\nimport QRCode from './QRCode';\r\nimport { WALLET_TYPES, getWalletInstallUrl, detectWallets, debugWalletEnvironment } from '../services/walletService';\r\nimport logo from '../assets/Logo.png';\r\n\r\nconst CoinleyModal = ({\r\n isOpen,\r\n onClose,\r\n payment,\r\n paymentStatus,\r\n selectedPaymentMethod,\r\n onPaymentMethodSelect,\r\n onPayment,\r\n onBack,\r\n error,\r\n theme = 'light',\r\n merchantName,\r\n transactionHash,\r\n walletConnection,\r\n onConnectWallet,\r\n testMode = false,\r\n supportedNetworks = [],\r\n availableWallets = {},\r\n supportedWallets = [],\r\n step = 'select-currency',\r\n merchantWalletAddresses = {},\r\n debug = false\r\n}) => {\r\n const [paymentType, setPaymentType] = useState('wallet'); // 'wallet' or 'qrcode'\r\n\r\n // Get wallet address for current network\r\n const getWalletAddressForNetwork = () => {\r\n if (!selectedPaymentMethod) return 'No network selected';\r\n \r\n const networkAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n if (networkAddress) {\r\n return networkAddress;\r\n }\r\n \r\n // Fallback to payment recipient wallet if available\r\n if (payment?.recipientWallet) {\r\n return payment.recipientWallet;\r\n }\r\n \r\n return 'No wallet address configured for this network';\r\n };\r\n\r\n // Utility functions\r\n const formatAmount = (amount) => {\r\n return parseFloat(amount).toFixed(2);\r\n };\r\n\r\n const formatTransactionHash = (hash) => {\r\n if (!hash) return '';\r\n if (hash.length <= 14) return hash;\r\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n };\r\n\r\n const getNetworkDisplayName = (network) => {\r\n const names = {\r\n ethereum: 'Ethereum',\r\n bsc: 'BSC',\r\n tron: 'Tron',\r\n algorand: 'Algorand'\r\n };\r\n return names[network] || network;\r\n };\r\n\r\n const getWalletDisplayName = (walletType) => {\r\n const names = {\r\n [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n };\r\n return names[walletType] || walletType;\r\n };\r\n\r\n const getWalletIcon = (walletType) => {\r\n const icons = {\r\n [WALLET_TYPES.METAMASK]: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/images/logo.png',\r\n [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/assets/images/trust_logotype.svg',\r\n [WALLET_TYPES.LUTE]: 'https://lute.app/logo.png'\r\n };\r\n return icons[walletType] || '';\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 overflow-y-auto bg-black/50\">\r\n <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n <div className=\"relative p-6 w-full max-w-md mx-auto rounded-lg shadow-xl bg-white text-gray-800\">\r\n {/* Header */}\r\n <div className=\"flex justify-between items-center mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n <div className=\"flex items-center\">\r\n <h2 className=\"text-xl font-bold text-gray-900\">\r\n <img src={logo} className='w-32' alt=\"Coinley Logo\" />\r\n </h2>\r\n </div>\r\n <button \r\n onClick={onClose}\r\n className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n \r\n {/* Content */}\r\n <div className=\"mb-6 bg-[#F1ECFB] p-3 rounded-xl\">\r\n {payment && (\r\n <div className=\"mb-6 p-4 rounded-lg\">\r\n <p className=\"text-lg text-gray-800 font-semibold\">\r\n PAY: {merchantName}\r\n </p>\r\n <div className=\"flex justify-between items-center mt-2 bg-gray-100 px-3 rounded-lg\">\r\n <span className=\"font-medium text-gray-700\">\r\n Amount:\r\n </span>\r\n <span className=\"font-bold text-xl text-[#7042D2]\">\r\n ${formatAmount(payment.totalAmount || payment.amount)}\r\n </span>\r\n </div>\r\n <div className=\"text-xs mt-1 text-right\">\r\n <span className=\"text-gray-500\">\r\n Payment ID: {payment.id ? payment.id.slice(0, 8) : ''}...\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Debug Button - Only in debug mode */}\r\n {debug && (\r\n <div className=\"mb-2 text-right\">\r\n <button\r\n onClick={() => {\r\n console.log('=== DEBUG INFO ===');\r\n console.log('Current step:', step);\r\n console.log('Payment method:', selectedPaymentMethod);\r\n console.log('Wallet connection:', walletConnection);\r\n debugWalletEnvironment();\r\n }}\r\n className=\"text-xs bg-gray-200 p-1 rounded\"\r\n >\r\n Debug\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Step: Select Currency/Network */}\r\n {step === 'select-currency' && (\r\n <div>\r\n <PaymentMethods \r\n onSelect={onPaymentMethodSelect} \r\n selected={selectedPaymentMethod}\r\n theme={theme}\r\n supportedNetworks={supportedNetworks}\r\n />\r\n \r\n {/* Proceed Button - Only show if a payment method is selected */}\r\n {selectedPaymentMethod && (\r\n <div className=\"mt-6\">\r\n <button\r\n onClick={() => {\r\n console.log('Proceed button clicked, calling onPaymentMethodSelect');\r\n onPaymentMethodSelect(selectedPaymentMethod);\r\n }}\r\n className=\"w-full py-3 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-lg transition-colors\"\r\n disabled={!selectedPaymentMethod}\r\n >\r\n Proceed with {selectedPaymentMethod.currency} on {getNetworkDisplayName(selectedPaymentMethod.network)}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Step: Confirm Payment */}\r\n {step === 'confirm' && selectedPaymentMethod && payment && (\r\n <div>\r\n <div className=\"p-4 rounded-lg mb-4 bg-gray-100\">\r\n <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n Payment Details\r\n </h3>\r\n <div className=\"space-y-2\">\r\n <div className=\"flex justify-between\">\r\n <span className=\"text-[#7042D2] font-semibold\">Currency:</span>\r\n <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span className=\"text-[#7042D2] font-semibold\">Network:</span>\r\n <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <span className=\"text-[#7042D2] font-semibold\">Fee:</span>\r\n <span className=\"font-medium\">1.75%</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Payment Method Tabs */}\r\n <div className=\"mb-4\">\r\n <div className=\"flex border-b border-gray-200\">\r\n <button\r\n onClick={() => setPaymentType('wallet')}\r\n className={`py-2 px-4 text-sm font-medium ${\r\n paymentType === 'wallet'\r\n ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n : 'text-gray-500 hover:text-gray-700'\r\n }`}\r\n >\r\n Connect Wallet\r\n </button>\r\n <button\r\n onClick={() => setPaymentType('qrcode')}\r\n className={`py-2 px-4 text-sm font-medium ${\r\n paymentType === 'qrcode'\r\n ? 'border-b-2 border-[#7042D2] text-[#7042D2]'\r\n : 'text-gray-500 hover:text-gray-700'\r\n }`}\r\n >\r\n QR Code\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {testMode ? (\r\n // Test mode payment option\r\n <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n <div className=\"flex items-center\">\r\n <div className=\"bg-[#7042D2] rounded-full p-2 mr-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium text-gray-800\">\r\n Test Mode Payment\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">\r\n Click \"Pay Now\" to simulate a successful payment\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n ) : paymentType === 'qrcode' ? (\r\n // QR Code payment option\r\n <div className=\"mb-4\">\r\n <QRCode \r\n walletAddress={getWalletAddressForNetwork()} \r\n amount={payment.totalAmount || payment.amount}\r\n currency={selectedPaymentMethod.currency}\r\n network={selectedPaymentMethod.network}\r\n theme={theme}\r\n />\r\n </div>\r\n ) : (\r\n // Wallet connection option\r\n <div className=\"space-y-3 mb-4\">\r\n {supportedWallets.length === 0 ? (\r\n <div className=\"p-4 rounded-lg bg-yellow-50\">\r\n <div className=\"flex items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-yellow-500 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n <div>\r\n <h3 className=\"font-medium text-gray-800\">No Compatible Wallets</h3>\r\n <p className=\"text-sm text-gray-600\">\r\n No wallets detected for {getNetworkDisplayName(selectedPaymentMethod.network)} network\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n supportedWallets.map((walletType) => (\r\n <div key={walletType} className=\"p-4 rounded-lg bg-blue-50\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center\">\r\n <img \r\n src={getWalletIcon(walletType)} \r\n alt={getWalletDisplayName(walletType)}\r\n className=\"w-8 h-8 mr-3\"\r\n onError={(e) => {\r\n e.target.style.display = 'none';\r\n }}\r\n />\r\n <div>\r\n <h3 className=\"font-medium text-gray-800\">\r\n {getWalletDisplayName(walletType)}\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">\r\n Pay with {getWalletDisplayName(walletType)}\r\n </p>\r\n </div>\r\n </div>\r\n \r\n {walletConnection?.walletType === walletType ? (\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\r\n <span className=\"text-sm text-green-600\">Connected</span>\r\n </div>\r\n ) : (\r\n <button\r\n onClick={() => {\r\n console.log('Connect wallet button clicked for:', walletType);\r\n onConnectWallet(walletType);\r\n }}\r\n className=\"py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md text-sm\"\r\n >\r\n Connect\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n ))\r\n )}\r\n\r\n {/* Install wallet links for missing wallets */}\r\n <div className=\"space-y-2\">\r\n {Object.entries(availableWallets)\r\n .filter(([walletType, isAvailable]) => !isAvailable)\r\n .map(([walletType]) => (\r\n <div key={walletType} className=\"p-3 rounded-lg bg-gray-50\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm text-gray-600\">\r\n {getWalletDisplayName(walletType)} not detected\r\n </span>\r\n \r\n <a href={getWalletInstallUrl(walletType)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-sm text-[#7042D2] hover:underline\"\r\n >\r\n Install\r\n </a>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Display any errors */}\r\n {error && (\r\n <div className=\"p-3 rounded-lg bg-red-50 mb-4 text-red-600 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={onBack}\r\n className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-[#7042D2] font-medium rounded-md\"\r\n >\r\n Back\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onPayment(paymentType === 'qrcode')}\r\n className=\"w-full py-2 px-4 bg-[#7042D2] hover:bg-[#7042D2] text-white font-medium rounded-md\"\r\n disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n >\r\n {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Step: Processing */}\r\n {step === 'processing' && (\r\n <PaymentStatus \r\n status=\"processing\" \r\n theme={theme}\r\n message=\"Processing your payment...\"\r\n />\r\n )}\r\n\r\n {/* Step: Success */}\r\n {step === 'success' && (\r\n <div>\r\n <PaymentStatus \r\n status=\"success\" \r\n theme={theme}\r\n message=\"Payment successful!\"\r\n />\r\n {transactionHash && (\r\n <div className=\"mt-4 p-3 rounded-lg bg-gray-100\">\r\n <p className=\"text-xs text-gray-600 mb-1\">\r\n Transaction Hash:\r\n </p>\r\n <p className=\"text-sm font-mono break-all text-gray-800\">\r\n {formatTransactionHash(transactionHash)}\r\n </p>\r\n {selectedPaymentMethod && (\r\n <a \r\n href={`${getExplorerUrl(selectedPaymentMethod.network)}/${getExplorerPath(selectedPaymentMethod.network)}/${transactionHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-xs text-[#7042D2] mt-2 inline-block\"\r\n >\r\n View on Explorer →\r\n </a>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Step: Error */}\r\n {step === 'error' && (\r\n <div>\r\n <PaymentStatus \r\n status=\"error\" \r\n theme={theme}\r\n message={error || \"An error occurred while processing your payment.\"}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={onBack}\r\n className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"text-center text-xs text-gray-500\">\r\n <p>Powered by <span className='text-[#7042D2]'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Helper functions\r\nconst getExplorerUrl = (network) => {\r\n const explorers = {\r\n ethereum: 'https://etherscan.io',\r\n bsc: 'https://bscscan.com',\r\n tron: 'https://tronscan.org',\r\n algorand: 'https://algoexplorer.io'\r\n };\r\n return explorers[network] || 'https://etherscan.io';\r\n};\r\n\r\nconst getExplorerPath = (network) => {\r\n const paths = {\r\n ethereum: 'tx',\r\n bsc: 'tx',\r\n tron: 'transaction',\r\n algorand: 'tx'\r\n };\r\n return paths[network] || 'tx';\r\n};\r\n\r\nexport default CoinleyModal;","export default \"data:image/png;base64,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\"","// // src/components/CoinleyCheckout.jsx\r\n// import React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\n// import { useCoinley } from '../context/CoinleyContext';\r\n// import { useTheme } from '../context/ThemeContext';\r\n// import CoinleyModal from './CoinleyModal';\r\n// import { createPayment, processPayment } from '../services/api';\r\n// import { \r\n// connectWallet, \r\n// sendTransaction, \r\n// detectWallets, \r\n// getSupportedWalletsForNetwork,\r\n// NETWORK_TYPES,\r\n// WALLET_TYPES \r\n// } from '../services/walletService';\r\n\r\n// /**\r\n// * Enhanced Coinley checkout component with multi-network support\r\n// */\r\n// const CoinleyCheckout = forwardRef(({ \r\n// apiKey,\r\n// apiSecret,\r\n// apiUrl,\r\n// customerEmail,\r\n// merchantName = 'Merchant',\r\n// merchantWalletAddresses = {}, // Object with network-specific addresses\r\n// onSuccess,\r\n// onError,\r\n// onClose,\r\n// theme,\r\n// autoOpen = false,\r\n// debug = false,\r\n// testMode = false,\r\n// supportedNetworks = [], // Array of supported networks\r\n// preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n// preferredWallet = WALLET_TYPES.METAMASK\r\n// }, ref) => {\r\n// // Context\r\n// const coinleyContext = useCoinley();\r\n// const { theme: contextTheme } = useTheme();\r\n \r\n// // State\r\n// const [isOpen, setIsOpen] = useState(autoOpen);\r\n// const [payment, setPayment] = useState(null);\r\n// const [paymentStatus, setPaymentStatus] = useState('idle');\r\n// const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n// const [error, setError] = useState(null);\r\n// const [transactionHash, setTransactionHash] = useState(null);\r\n// const [walletConnection, setWalletConnection] = useState(null);\r\n// const [availableWallets, setAvailableWallets] = useState({});\r\n// const [step, setStep] = useState('select-currency');\r\n \r\n// // Use the component props or fallback to context values\r\n// const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n// const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n// const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n// const effectiveTheme = theme || contextTheme;\r\n// const effectiveDebug = debug || coinleyContext?.debug;\r\n// const effectiveSupportedNetworks = supportedNetworks.length > 0 \r\n// ? supportedNetworks \r\n// : [NETWORK_TYPES.ETHEREUM, NETWORK_TYPES.BSC, NETWORK_TYPES.TRON, NETWORK_TYPES.ALGORAND];\r\n\r\n// // Expose methods via ref\r\n// useImperativeHandle(ref, () => ({\r\n// open: (paymentDetails) => {\r\n// handleOpen(paymentDetails);\r\n// },\r\n// close: () => {\r\n// handleClose();\r\n// },\r\n// getPayment: () => payment,\r\n// getWalletConnection: () => walletConnection\r\n// }));\r\n\r\n// // Debug logging helper\r\n// const log = (message, data) => {\r\n// if (effectiveDebug) {\r\n// console.log(`[Coinley SDK] ${message}`, data);\r\n// }\r\n// };\r\n\r\n// // Check available wallets on mount\r\n// useEffect(() => {\r\n// if (typeof window !== 'undefined') {\r\n// const wallets = detectWallets();\r\n// setAvailableWallets(wallets);\r\n \r\n// log('Available wallets detected:', wallets);\r\n// }\r\n// }, [effectiveDebug]);\r\n\r\n// // Handle opening the payment modal\r\n// const handleOpen = async (paymentDetails) => {\r\n// if (!paymentDetails || !paymentDetails.amount) {\r\n// setError('Payment amount is required');\r\n// if (onError) onError(new Error('Payment amount is required'));\r\n// return;\r\n// }\r\n\r\n// setPaymentStatus('loading');\r\n// setIsOpen(true);\r\n// setStep('select-currency');\r\n\r\n// try {\r\n// log('Creating payment with details:', paymentDetails);\r\n \r\n// // Create a payment on the Coinley backend\r\n// const paymentResponse = await createPayment({\r\n// amount: paymentDetails.amount,\r\n// currency: paymentDetails.currency || 'USDT',\r\n// network: paymentDetails.network || preferredNetwork,\r\n// customerEmail: paymentDetails.customerEmail || customerEmail,\r\n// callbackUrl: paymentDetails.callbackUrl,\r\n// metadata: paymentDetails.metadata || {},\r\n// merchantWalletAddresses: {\r\n// ...merchantWalletAddresses,\r\n// ...paymentDetails.merchantWalletAddresses\r\n// }\r\n// });\r\n\r\n// log('Payment created:', paymentResponse);\r\n \r\n// setPayment(paymentResponse.payment);\r\n// setPaymentStatus('idle');\r\n// setError(null);\r\n \r\n// log('Payment created and state updated');\r\n// } catch (err) {\r\n// log('Error creating payment:', err);\r\n// setError(err.message || 'Failed to create payment');\r\n// setPaymentStatus('error');\r\n// if (onError) onError(err);\r\n// }\r\n// };\r\n\r\n// // Handle closing the modal\r\n// const handleClose = () => {\r\n// setIsOpen(false);\r\n// setTransactionHash(null);\r\n// setWalletConnection(null);\r\n// setSelectedPaymentMethod(null);\r\n// setStep('select-currency');\r\n// if (onClose) onClose();\r\n// };\r\n\r\n// // FIXED: Handle payment method selection - this should move to confirm step\r\n// const handlePaymentMethodSelect = (paymentMethod) => {\r\n// console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n// console.log('1. Payment method selected:', paymentMethod);\r\n// console.log('2. Current step before:', step);\r\n \r\n// log('Payment method selected:', paymentMethod);\r\n// setSelectedPaymentMethod(paymentMethod);\r\n \r\n// // FIXED: Move to confirm step after selection\r\n// setStep('confirm');\r\n \r\n// console.log('3. Step should now be: confirm');\r\n// console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n// };\r\n\r\n// // Handle back navigation\r\n// const handleBack = () => {\r\n// if (step === 'confirm') {\r\n// setStep('select-currency');\r\n// setWalletConnection(null);\r\n// }\r\n// };\r\n\r\n// // FIXED: Handle wallet connection with enhanced debugging\r\n// const handleConnectWallet = async (walletType) => {\r\n// console.log('=== WALLET CONNECTION DEBUG ===');\r\n// console.log('1. Wallet type requested:', walletType);\r\n// console.log('2. Selected payment method:', selectedPaymentMethod);\r\n// console.log('3. Available wallets:', availableWallets);\r\n// console.log('4. Current step:', step);\r\n\r\n// if (!selectedPaymentMethod) {\r\n// console.error('No payment method selected');\r\n// setError('Please select a payment method first');\r\n// return;\r\n// }\r\n\r\n// try {\r\n// console.log('5. Attempting to connect wallet...');\r\n// setError(null); // Clear any previous errors\r\n \r\n// log('Connecting wallet:', { walletType, network: selectedPaymentMethod.network });\r\n \r\n// const connection = await connectWallet(walletType, selectedPaymentMethod.network);\r\n// setWalletConnection(connection);\r\n// setError(null);\r\n \r\n// console.log('6. Connection successful:', connection);\r\n// log('Wallet connected successfully:', connection);\r\n// } catch (err) {\r\n// console.error('7. Connection failed:', err);\r\n// log('Wallet connection error:', err);\r\n// setError(err.message || 'Failed to connect wallet');\r\n// }\r\n \r\n// console.log('=== END WALLET CONNECTION DEBUG ===');\r\n// };\r\n\r\n// // Handle payment submission\r\n// const handlePayment = async () => {\r\n// if (!payment || !selectedPaymentMethod) {\r\n// setError('Missing payment information');\r\n// return;\r\n// }\r\n\r\n// if (!walletConnection && !testMode) {\r\n// setError('Please connect your wallet first');\r\n// return;\r\n// }\r\n\r\n// log('Starting payment process...');\r\n// setPaymentStatus('loading');\r\n// setTransactionHash(null);\r\n\r\n// try {\r\n// let txHash;\r\n\r\n// if (testMode) {\r\n// // Test mode: Generate mock transaction\r\n// log('Test mode: Generating mock transaction...');\r\n// txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n// } else {\r\n// // Real payment flow\r\n// const merchantAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n// if (!merchantAddress) {\r\n// throw new Error(`No merchant wallet address configured for ${selectedPaymentMethod.network}`);\r\n// }\r\n\r\n// // Send transaction through wallet\r\n// log('Sending transaction through wallet...');\r\n// txHash = await sendTransaction(walletConnection, {\r\n// to: merchantAddress,\r\n// amount: payment.amount,\r\n// tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n// tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals\r\n// });\r\n// }\r\n\r\n// log('Transaction hash:', txHash);\r\n// setTransactionHash(txHash);\r\n\r\n// // Process the payment on the Coinley backend\r\n// log('Processing payment with backend...');\r\n// const processResponse = await processPayment({\r\n// paymentId: payment.id,\r\n// transactionHash: txHash,\r\n// network: selectedPaymentMethod.network,\r\n// currency: selectedPaymentMethod.currency,\r\n// senderAddress: walletConnection?.address\r\n// });\r\n\r\n// log('Payment processed successfully:', processResponse);\r\n\r\n// setPaymentStatus('success');\r\n// setStep('success');\r\n \r\n// // Call the onSuccess callback\r\n// if (onSuccess) {\r\n// log('Calling onSuccess callback...');\r\n// onSuccess(payment.id, txHash, {\r\n// network: selectedPaymentMethod.network,\r\n// currency: selectedPaymentMethod.currency,\r\n// amount: payment.amount\r\n// });\r\n// }\r\n\r\n// } catch (err) {\r\n// log('Payment error:', err);\r\n// setError(err.message || 'Failed to process payment');\r\n// setPaymentStatus('error');\r\n// setStep('error');\r\n// if (onError) onError(err);\r\n// }\r\n// };\r\n\r\n// // Get supported wallets for current network\r\n// const getSupportedWallets = () => {\r\n// if (!selectedPaymentMethod) return [];\r\n// return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n// };\r\n\r\n// return (\r\n// <>\r\n// {isOpen && (\r\n// <CoinleyModal\r\n// isOpen={isOpen}\r\n// onClose={handleClose}\r\n// payment={payment}\r\n// paymentStatus={paymentStatus}\r\n// selectedPaymentMethod={selectedPaymentMethod}\r\n// onPaymentMethodSelect={handlePaymentMethodSelect}\r\n// onPayment={handlePayment}\r\n// onBack={handleBack}\r\n// error={error}\r\n// theme={effectiveTheme}\r\n// merchantName={merchantName}\r\n// transactionHash={transactionHash}\r\n// walletConnection={walletConnection}\r\n// onConnectWallet={handleConnectWallet}\r\n// testMode={testMode}\r\n// supportedNetworks={effectiveSupportedNetworks}\r\n// availableWallets={availableWallets}\r\n// supportedWallets={getSupportedWallets()}\r\n// step={step}\r\n// merchantWalletAddresses={merchantWalletAddresses}\r\n// />\r\n// )}\r\n// </>\r\n// );\r\n// });\r\n\r\n// // Add display name for better debugging\r\n// CoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\n// export default CoinleyCheckout;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/components/CoinleyCheckout.jsx\r\nimport React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport { useCoinley } from '../context/CoinleyContext';\r\nimport { useTheme } from '../context/ThemeContext';\r\nimport CoinleyModal from './CoinleyModal';\r\nimport { createPayment, processPayment } from '../services/api';\r\nimport { \r\n connectWallet, \r\n sendTransaction, \r\n detectWallets, \r\n detectWalletsWithRetry,\r\n getSupportedWalletsForNetwork,\r\n debugWalletEnvironment,\r\n NETWORK_TYPES,\r\n WALLET_TYPES \r\n} from '../services/walletService';\r\n\r\n/**\r\n * Enhanced Coinley checkout component with multi-network support\r\n */\r\nconst CoinleyCheckout = forwardRef(({ \r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n customerEmail,\r\n merchantName = 'Merchant',\r\n merchantWalletAddresses = {}, // Object with network-specific addresses\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme,\r\n autoOpen = false,\r\n debug = false,\r\n testMode = false,\r\n supportedNetworks = [], // Array of supported networks\r\n preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n preferredWallet = WALLET_TYPES.METAMASK\r\n}, ref) => {\r\n // Context\r\n const coinleyContext = useCoinley();\r\n const { theme: contextTheme } = useTheme();\r\n \r\n // State\r\n const [isOpen, setIsOpen] = useState(autoOpen);\r\n const [payment, setPayment] = useState(null);\r\n const [paymentStatus, setPaymentStatus] = useState('idle');\r\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n const [error, setError] = useState(null);\r\n const [transactionHash, setTransactionHash] = useState(null);\r\n const [walletConnection, setWalletConnection] = useState(null);\r\n const [availableWallets, setAvailableWallets] = useState({});\r\n const [step, setStep] = useState('select-currency');\r\n \r\n // Use the component props or fallback to context values\r\n const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n const effectiveTheme = theme || contextTheme;\r\n const effectiveDebug = debug || coinleyContext?.debug;\r\n const effectiveSupportedNetworks = supportedNetworks.length > 0 \r\n ? supportedNetworks \r\n : [NETWORK_TYPES.ETHEREUM, NETWORK_TYPES.BSC, NETWORK_TYPES.TRON, NETWORK_TYPES.ALGORAND];\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n open: (paymentDetails) => {\r\n handleOpen(paymentDetails);\r\n },\r\n close: () => {\r\n handleClose();\r\n },\r\n getPayment: () => payment,\r\n getWalletConnection: () => walletConnection,\r\n debugWallets: () => debugWalletEnvironment()\r\n }));\r\n\r\n // Debug logging helper\r\n const log = (message, data) => {\r\n if (effectiveDebug) {\r\n console.log(`[Coinley SDK] ${message}`, data);\r\n }\r\n };\r\n\r\n // Check available wallets on mount with retry\r\n useEffect(() => {\r\n if (typeof window !== 'undefined') {\r\n const detectWalletsAsync = async () => {\r\n // Use the retry version for more reliable detection\r\n const wallets = await detectWalletsWithRetry(3, 1000);\r\n setAvailableWallets(wallets);\r\n \r\n log('Available wallets detected:', wallets);\r\n };\r\n \r\n detectWalletsAsync();\r\n }\r\n }, [effectiveDebug]);\r\n\r\n // Handle opening the payment modal\r\n const handleOpen = async (paymentDetails) => {\r\n if (!paymentDetails || !paymentDetails.amount) {\r\n setError('Payment amount is required');\r\n if (onError) onError(new Error('Payment amount is required'));\r\n return;\r\n }\r\n\r\n setPaymentStatus('loading');\r\n setIsOpen(true);\r\n setStep('select-currency');\r\n\r\n try {\r\n log('Creating payment with details:', paymentDetails);\r\n \r\n // Create a payment on the Coinley backend\r\n const paymentResponse = await createPayment({\r\n amount: paymentDetails.amount,\r\n currency: paymentDetails.currency || 'USDT',\r\n network: paymentDetails.network || preferredNetwork,\r\n customerEmail: paymentDetails.customerEmail || customerEmail,\r\n callbackUrl: paymentDetails.callbackUrl,\r\n metadata: paymentDetails.metadata || {},\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...paymentDetails.merchantWalletAddresses\r\n }\r\n });\r\n\r\n log('Payment created:', paymentResponse);\r\n \r\n setPayment(paymentResponse.payment);\r\n setPaymentStatus('idle');\r\n setError(null);\r\n \r\n log('Payment created and state updated');\r\n } catch (err) {\r\n log('Error creating payment:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setPaymentStatus('error');\r\n if (onError) onError(err);\r\n }\r\n };\r\n\r\n // Handle closing the modal\r\n const handleClose = () => {\r\n setIsOpen(false);\r\n setTransactionHash(null);\r\n setWalletConnection(null);\r\n setSelectedPaymentMethod(null);\r\n setStep('select-currency');\r\n if (onClose) onClose();\r\n };\r\n\r\n // Handle payment method selection\r\n const handlePaymentMethodSelect = (paymentMethod) => {\r\n console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n console.log('1. Payment method selected:', paymentMethod);\r\n console.log('2. Current step before:', step);\r\n \r\n log('Payment method selected:', paymentMethod);\r\n setSelectedPaymentMethod(paymentMethod);\r\n \r\n // Move to confirm step after selection\r\n setStep('confirm');\r\n \r\n console.log('3. Step should now be: confirm');\r\n console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n };\r\n\r\n // Handle back navigation\r\n const handleBack = () => {\r\n if (step === 'confirm') {\r\n setStep('select-currency');\r\n setWalletConnection(null);\r\n } else if (step === 'error') {\r\n setStep('confirm');\r\n }\r\n };\r\n\r\n // Enhanced wallet connection with retry and better debugging\r\n const handleConnectWallet = async (walletType) => {\r\n console.log('=== WALLET CONNECTION DEBUG ===');\r\n console.log('1. Wallet type requested:', walletType);\r\n console.log('2. Selected payment method:', selectedPaymentMethod);\r\n console.log('3. Available wallets:', availableWallets);\r\n console.log('4. Current step:', step);\r\n\r\n if (!selectedPaymentMethod) {\r\n console.error('No payment method selected');\r\n setError('Please select a payment method first');\r\n return;\r\n }\r\n\r\n try {\r\n console.log('5. Attempting to connect wallet...');\r\n setError(null); // Clear any previous errors\r\n \r\n log('Connecting wallet:', { walletType, network: selectedPaymentMethod.network });\r\n \r\n // Use the improved connectWallet function with retry (2 attempts)\r\n const connection = await connectWallet(walletType, selectedPaymentMethod.network, 2);\r\n setWalletConnection(connection);\r\n setError(null);\r\n \r\n console.log('6. Connection successful:', connection);\r\n log('Wallet connected successfully:', connection);\r\n } catch (err) {\r\n console.error('7. Connection failed:', err);\r\n log('Wallet connection error:', err);\r\n setError(err.message || 'Failed to connect wallet');\r\n }\r\n \r\n console.log('=== END WALLET CONNECTION DEBUG ===');\r\n };\r\n\r\n // Handle payment submission\r\n const handlePayment = async () => {\r\n if (!payment || !selectedPaymentMethod) {\r\n setError('Missing payment information');\r\n return;\r\n }\r\n\r\n if (!walletConnection && !testMode) {\r\n setError('Please connect your wallet first');\r\n return;\r\n }\r\n\r\n log('Starting payment process...');\r\n setPaymentStatus('loading');\r\n setTransactionHash(null);\r\n setStep('processing');\r\n\r\n try {\r\n let txHash;\r\n\r\n if (testMode) {\r\n // Test mode: Generate mock transaction\r\n log('Test mode: Generating mock transaction...');\r\n txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n } else {\r\n // Real payment flow\r\n const merchantAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n if (!merchantAddress) {\r\n throw new Error(`No merchant wallet address configured for ${selectedPaymentMethod.network}`);\r\n }\r\n\r\n // Send transaction through wallet\r\n log('Sending transaction through wallet...');\r\n \r\n txHash = await sendTransaction(walletConnection, {\r\n to: merchantAddress,\r\n amount: payment.amount,\r\n tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n currency: selectedPaymentMethod.currency,\r\n network: selectedPaymentMethod.network\r\n });\r\n }\r\n\r\n log('Transaction hash:', txHash);\r\n setTransactionHash(txHash);\r\n\r\n // Process the payment on the Coinley backend\r\n log('Processing payment with backend...');\r\n const processResponse = await processPayment({\r\n paymentId: payment.id,\r\n transactionHash: txHash,\r\n network: selectedPaymentMethod.network,\r\n currency: selectedPaymentMethod.currency,\r\n senderAddress: walletConnection?.address\r\n });\r\n\r\n log('Payment processed successfully:', processResponse);\r\n\r\n setPaymentStatus('success');\r\n setStep('success');\r\n \r\n // Call the onSuccess callback\r\n if (onSuccess) {\r\n log('Calling onSuccess callback...');\r\n onSuccess(payment.id, txHash, {\r\n network: selectedPaymentMethod.network,\r\n currency: selectedPaymentMethod.currency,\r\n amount: payment.amount\r\n });\r\n }\r\n\r\n } catch (err) {\r\n log('Payment error:', err);\r\n setError(err.message || 'Failed to process payment');\r\n setPaymentStatus('error');\r\n setStep('error');\r\n if (onError) onError(err);\r\n }\r\n };\r\n\r\n // Get supported wallets for current network\r\n const getSupportedWallets = () => {\r\n if (!selectedPaymentMethod) return [];\r\n return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n };\r\n\r\n return (\r\n <>\r\n {isOpen && (\r\n <CoinleyModal\r\n isOpen={isOpen}\r\n onClose={handleClose}\r\n payment={payment}\r\n paymentStatus={paymentStatus}\r\n selectedPaymentMethod={selectedPaymentMethod}\r\n onPaymentMethodSelect={handlePaymentMethodSelect}\r\n onPayment={handlePayment}\r\n onBack={handleBack}\r\n error={error}\r\n theme={effectiveTheme}\r\n merchantName={merchantName}\r\n transactionHash={transactionHash}\r\n walletConnection={walletConnection}\r\n onConnectWallet={handleConnectWallet}\r\n testMode={testMode}\r\n supportedNetworks={effectiveSupportedNetworks}\r\n availableWallets={availableWallets}\r\n supportedWallets={getSupportedWallets()}\r\n step={step}\r\n merchantWalletAddresses={merchantWalletAddresses}\r\n debug={effectiveDebug}\r\n />\r\n )}\r\n </>\r\n );\r\n});\r\n\r\n// Add display name for better debugging\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport default CoinleyCheckout;","// src/index.js\r\n// Import styles first\r\nimport './styles.css';\r\n\r\n// Export wallet service utilities and constants\r\nexport { \r\n connectWallet,\r\n sendTransaction,\r\n detectWallets,\r\n getSupportedWalletsForNetwork,\r\n getWalletInstallUrl,\r\n NETWORK_TYPES,\r\n WALLET_TYPES,\r\n TOKEN_CONFIG,\r\n NETWORK_CONFIG\r\n} from './services/walletService';\r\n\r\n// Export API functions\r\nexport { \r\n createPayment, \r\n getPayment, \r\n processPayment,\r\n getSupportedNetworks,\r\n getMerchantProfile,\r\n validateWalletAddress,\r\n generateMockTransactionHash\r\n} from './services/api';\r\n\r\n// Export context providers\r\nexport { ThemeProvider } from './context/ThemeContext';\r\nexport { CoinleyProvider, useCoinley } from './context/CoinleyContext';\r\n\r\n// Export components\r\nexport { default as QRCode } from './components/QRCode';\r\nexport { default as PaymentStatus } from './components/PaymentStatus';\r\nexport { default as PaymentMethods } from './components/PaymentMethods';\r\nexport { default as CoinleyModal } from './components/CoinleyModal';\r\nexport { default as CoinleyCheckout } from './components/CoinleyCheckout';\r\n\r\n// Export constants\r\nexport const DEFAULT_CONFIG = {\r\n apiUrl: 'http://localhost:9000',\r\n debug: false,\r\n testMode: false,\r\n theme: 'light',\r\n supportedNetworks: ['ethereum', 'bsc', 'tron', 'algorand']\r\n};\r\n"],"names":["NETWORK_TYPES","ETHEREUM","BSC","TRON","ALGORAND","WALLET_TYPES","METAMASK","TRONLINK","TRUST_WALLET","LUTE","NETWORK_CONFIG","chainId","chainName","nativeCurrency","name","symbol","decimals","rpcUrls","blockExplorerUrls","supportedWallets","fullHost","explorerUrl","network","TOKEN_CONFIG","USDT","address","USDC","PYUSD","FRAX","USDP","DAI","BUSD","USDJ","ALGO","detectWallets","wallets","window","console","log","allProviders","ethereum","push","_a","providers","Array","isArray","forEach","provider","isMetaMask","isTrust","isTrustWallet","trustwallet","trustWallet","navigator","userAgent","toLowerCase","includes","tronWeb","defaultAddress","tronLink","tron","algorand","error","warn","detectWalletsWithRetry","maxRetries","delay","__async","this","attempts","Promise","resolve","setTimeout","getSupportedWalletsForNetwork","networkConfig","availableWallets","filter","wallet","calculateTokenAmount","amount","tokenAmount","parseFloat","tokenDecimals","parseInt","isNaN","Error","multiplier","Math","pow","amountInSmallestUnit","floor","message","connectWallet","walletType","retryCount","attemptConnection","connectMetaMask","connectTrustWallet","connectTronLink","connectLute","code","find","p","_b","findMetaMaskProvider","accounts","request","method","length","switchEVMNetwork","connection","_c","findTrustWalletProvider","switchError","ready","base58","connect","params","addError","sendTransaction","walletConnection","transactionData","to","tokenAddress","currency","hasProvider","sendEVMTransaction","sendTronTransaction","sendAlgorandTransaction","from","ethProvider","actualTokenAddress","actualDecimals","tokenConfig","getTokenConfig","configError","data","toAddress","methodId","cleanAddress","replace","paddedAddress","padStart","hexAmount","toString","encodeERC20TransferData","gas","txHash","amountInWei","amountHex","value","amountInSun","contract","at","result","transfer","send","feeLimit","callValue","trx","txid","microAlgos","txn","type","signedTxn","signTransaction","txId","getWalletInstallUrl","debugWalletEnvironment","group","i","constructor","groupEnd","apiConfig","apiKey","apiSecret","apiUrl","merchantWalletAddresses","getHeaders","createPayment","paymentData","enhancedPaymentData","__spreadValues","response","fetch","headers","body","JSON","stringify","status","ok","errorData","json","e","statusText","processPayment","processData","paymentId","transactionHash","f","require$$0","k","Symbol","for","l","m","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","key","ref","__self","__source","q","c","a","g","b","d","h","call","defaultProps","$$typeof","props","_owner","current","reactJsxRuntime_production_min","jsx","jsxs","jsxRuntimeModule","exports","ThemeContext","createContext","CoinleyContext","useCoinley","useContext","qrcodegen","qrcodegen2","__defProp","defineProperty","__getOwnPropSymbols","getOwnPropertySymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","obj","enumerable","configurable","writable","prop","__objRest","source","exclude","target","indexOf","_QrCode","version","errorCorrectionLevel","dataCodewords","msk","modules","isFunction","MIN_VERSION","MAX_VERSION","RangeError","size","row","slice","drawFunctionPatterns","allCodewords","addEccAndInterleave","drawCodewords","minPenalty","applyMask","drawFormatBits","penalty","getPenaltyScore","assert","mask","encodeText","text","ecl","segs","QrSegment","makeSegments","encodeSegments","encodeBinary","seg","makeBytes","minVersion","maxVersion","boostEcl","dataUsedBits","dataCapacityBits2","getNumDataCodewords","usedBits","getTotalBits","newEcl","Ecc","MEDIUM","QUARTILE","HIGH","bb","appendBits","mode","modeBits","numChars","numCharCountBits","getData","dataCapacityBits","min","padByte","getModule","x","y","getModules","setFunctionModule","drawFinderPattern","alignPatPos","getAlignmentPatternPositions","numAlign","j","drawAlignmentPattern","drawVersion","formatBits","rem","bits","getBit","color","dy","dx","dist","max","abs","xx","yy","isDark","ver","numBlocks","NUM_ERROR_CORRECTION_BLOCKS","ordinal","blockEccLen","ECC_CODEWORDS_PER_BLOCK","rawCodewords","getNumRawDataModules","numShortBlocks","shortBlockLen","blocks","rsDiv","reedSolomonComputeDivisor","dat","ecc","reedSolomonComputeRemainder","concat","block","right","vert","invert","runColor","runX","runHistory","PENALTY_N1","finderPenaltyAddHistory","finderPenaltyCountPatterns","PENALTY_N3","finderPenaltyTerminateAndCount","runY","PENALTY_N2","dark","reduce","sum","total","ceil","PENALTY_N4","step","pos","splice","degree","root","reedSolomonMultiply","divisor","map","_","factor","shift","coef","z","core","currentRunColor","currentRunLength","pop","unshift","val","len","cond","QrCode","_QrSegment","bitData","Mode","BYTE","makeNumeric","digits","isNumeric","substring","NUMERIC","makeAlphanumeric","isAlphanumeric","temp","ALPHANUMERIC_CHARSET","charAt","ALPHANUMERIC","toUtf8ByteArray","makeEci","assignVal","ECI","NUMERIC_REGEX","test","ALPHANUMERIC_REGEX","ccbits","Infinity","str","encodeURI","charCodeAt","QrCode2","_Ecc","LOW","QrSegment2","_Mode","numBitsCharCount","KANJI","qrcodegen_default","ERROR_LEVEL_MAP","L","M","Q","H","DEFAULT_SIZE","DEFAULT_LEVEL","DEFAULT_BGCOLOR","DEFAULT_FGCOLOR","DEFAULT_INCLUDEMARGIN","DEFAULT_MINVERSION","generatePath","margin","ops","start","cell","join","excavateModules","excavation","w","useQRCode","level","includeMargin","marginSize","imageSettings","boostLevel","qrcode","React","useMemo","segments","accum","v","cells","numCells","calculatedImageSettings","cells2","margin2","getMarginSize","numCells2","calculatedImageSettings2","defaultSize","scale","width","height","opacity","excavate","floorX","floorY","crossOrigin","getImageSettings","SUPPORTS_PATH2D","Path2D","addPath","forwardRef","forwardedRef","bgColor","fgColor","style","otherProps","imgSrc","src","_canvas","useRef","_image","setCanvasRef","useCallback","node","isImgLoaded","setIsImageLoaded","useState","useEffect","canvas","ctx","getContext","cellsToDraw","image","haveImageToRender","complete","naturalHeight","naturalWidth","pixelRatio","devicePixelRatio","fillStyle","fillRect","fill","rdx","cdx","globalAlpha","drawImage","canvasStyle","img","createElement","display","onLoad","Fragment","role","displayName","QRCodeSVG","title","href","preserveAspectRatio","fgPath","viewBox","shapeRendering","QRCode","walletAddress","theme","qrData","setQrData","qrError","setQrError","convertToWei","getTokenAddressForCurrency","convertToSmallestUnit","err","bsc","getNetworkDisplayName","className","children","jsxRuntimeExports","xmlns","stroke","strokeLinecap","strokeLinejoin","strokeWidth","onClick","clipboard","writeText","PaymentStatus","renderIcon","getStatusTitle","getMessageClasses","PaymentMethods","onSelect","selected","supportedNetworks","selectedNetwork","setSelectedNetwork","setAvailableWallets","showMore","setShowMore","networks","id","description","availableMethods","methods","logo","getPaymentMethodsForNetwork","visibleMethods","getRequiredWallet","onChange","handleNetworkChange","networkId","handleSelectPaymentMethod","alt","fillRule","clipRule","isAvailable","walletNames","getNetworkRequirement","CoinleyModal","isOpen","onClose","payment","paymentStatus","selectedPaymentMethod","onPaymentMethodSelect","onPayment","onBack","merchantName","onConnectWallet","testMode","debug","paymentType","setPaymentType","getWalletDisplayName","getWalletIcon","totalAmount","toFixed","disabled","networkAddress","recipientWallet","getWalletAddressForNetwork","onError","entries","rel","hash","getExplorerUrl","getExplorerPath","CoinleyCheckout","customerEmail","onSuccess","autoOpen","preferredNetwork","preferredWallet","coinleyContext","contextTheme","setIsOpen","setPayment","setPaymentStatus","setSelectedPaymentMethod","setError","setTransactionHash","setWalletConnection","setStep","effectiveTheme","effectiveDebug","effectiveSupportedNetworks","useImperativeHandle","open","paymentDetails","handleOpen","close","getPayment","getWalletConnection","debugWallets","paymentResponse","callbackUrl","metadata","handleClose","paymentMethod","Date","now","random","merchantAddress","processResponse","senderAddress","merchantWalletAddress","merchantSolWalletAddress","isInitialized","setIsInitialized","setPaymentData","config","hasWalletAddresses","keys","storePaymentData","Provider","initialTheme","setTheme","document","documentElement","classList","remove","add","toggleTheme","prevTheme","merchant","walletAddresses"],"mappings":"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","x_google_ignoreList":[2,3,6]}