coinley-test 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -43,20 +43,20 @@ class PaymentAPI {
43
43
  }
44
44
  });
45
45
  this.api.interceptors.request.use(
46
- (config) => {
46
+ (config2) => {
47
47
  var _a;
48
- config.headers["X-API-Key"] = this.apiKey;
49
- config.headers["X-API-Secret"] = this.apiSecret;
48
+ config2.headers["X-API-Key"] = this.apiKey;
49
+ config2.headers["X-API-Secret"] = this.apiSecret;
50
50
  const token = this.generateMerchantToken();
51
51
  if (token) {
52
- config.headers["Authorization"] = `Bearer ${token}`;
52
+ config2.headers["Authorization"] = `Bearer ${token}`;
53
53
  }
54
54
  console.log("API Request:", {
55
- method: (_a = config.method) == null ? void 0 : _a.toUpperCase(),
56
- url: config.url,
57
- data: config.data
55
+ method: (_a = config2.method) == null ? void 0 : _a.toUpperCase(),
56
+ url: config2.url,
57
+ data: config2.data
58
58
  });
59
- return config;
59
+ return config2;
60
60
  },
61
61
  (error) => {
62
62
  console.error("Request interceptor error:", error);
@@ -264,11 +264,11 @@ const WalletIntegration = ({
264
264
  }
265
265
  }, [isConnected, paymentData]);
266
266
  const handleSendTransaction = async () => {
267
- var _a;
267
+ var _a, _b;
268
268
  if (!isConnected || !paymentData || !selectedToken) return;
269
269
  try {
270
270
  setIsConnecting(true);
271
- const recipientAddress = (_a = paymentData.metadata) == null ? void 0 : _a.recipientWallet;
271
+ const recipientAddress = ((_a = paymentData.metadata) == null ? void 0 : _a.recipientWallet) || ((_b = config.merchantWalletAddresses) == null ? void 0 : _b[selectedNetwork == null ? void 0 : selectedNetwork.shortName]);
272
272
  if (!recipientAddress) {
273
273
  throw new Error("Recipient wallet address not found");
274
274
  }
@@ -352,7 +352,7 @@ const CoinleyPayment = ({
352
352
  onError,
353
353
  onClose,
354
354
  isOpen,
355
- config,
355
+ config: config2,
356
356
  theme = "light",
357
357
  merchantName,
358
358
  debug = false
@@ -424,13 +424,13 @@ const CoinleyPayment = ({
424
424
  try {
425
425
  setLoading(true);
426
426
  const paymentPayload = {
427
- amount: config.amount,
427
+ amount: config2.amount,
428
428
  currency: token.symbol,
429
429
  network: network.shortName,
430
- customerEmail: config.customerEmail,
431
- callbackUrl: config.callbackUrl,
430
+ customerEmail: config2.customerEmail,
431
+ callbackUrl: config2.callbackUrl,
432
432
  metadata: {
433
- ...config.metadata,
433
+ ...config2.metadata,
434
434
  paymentMethod,
435
435
  selectedNetwork: network.shortName,
436
436
  selectedToken: token.symbol
@@ -455,7 +455,7 @@ const CoinleyPayment = ({
455
455
  const generateQRCode = async (payment) => {
456
456
  var _a, _b;
457
457
  try {
458
- const recipientAddress = ((_a = payment.metadata) == null ? void 0 : _a.recipientWallet) || ((_b = config.merchantWalletAddresses) == null ? void 0 : _b[(selectedNetwork == null ? void 0 : selectedNetwork.shortName) || ""]);
458
+ const recipientAddress = ((_a = payment.metadata) == null ? void 0 : _a.recipientWallet) || ((_b = config2.merchantWalletAddresses) == null ? void 0 : _b[(selectedNetwork == null ? void 0 : selectedNetwork.shortName) || ""]);
459
459
  if (!recipientAddress) {
460
460
  throw new Error("Recipient wallet address not found");
461
461
  }
@@ -609,7 +609,7 @@ const CoinleyPayment = ({
609
609
  merchantName && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mt-1", children: merchantName }),
610
610
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-2xl font-bold text-[#7042D2]", children: [
611
611
  "$",
612
- config.amount.toFixed(2)
612
+ config2.amount.toFixed(2)
613
613
  ] }) })
614
614
  ] })
615
615
  ] }),
@@ -885,8 +885,8 @@ const CoinleyProvider = ({
885
885
  const [paymentConfig, setPaymentConfig] = React.useState(null);
886
886
  const [callbacks, setCallbacks] = React.useState({});
887
887
  const [merchantName, setMerchantName] = React.useState("");
888
- const openPayment = (config, checkoutCallbacks) => {
889
- setPaymentConfig(config);
888
+ const openPayment = (config2, checkoutCallbacks) => {
889
+ setPaymentConfig(config2);
890
890
  if (checkoutCallbacks) {
891
891
  setCallbacks(checkoutCallbacks);
892
892
  }
@@ -940,23 +940,23 @@ const CoinleyCheckout = forwardRef(({
940
940
  throw new Error("CoinleyCheckout must be used within a CoinleyProvider");
941
941
  }
942
942
  const { openPayment, closePayment } = context;
943
- const open = (config) => {
943
+ const open = (config2) => {
944
944
  try {
945
945
  if (debug) {
946
- console.log("Opening Coinley checkout with config:", config);
946
+ console.log("Opening Coinley checkout with config:", config2);
947
947
  }
948
- if (!config.amount || config.amount <= 0) {
948
+ if (!config2.amount || config2.amount <= 0) {
949
949
  throw new Error("Amount must be greater than 0");
950
950
  }
951
951
  const finalConfig = {
952
- ...config,
953
- customerEmail: config.customerEmail || customerEmail,
952
+ ...config2,
953
+ customerEmail: config2.customerEmail || customerEmail,
954
954
  merchantWalletAddresses: {
955
955
  ...merchantWalletAddresses,
956
- ...config.merchantWalletAddresses
956
+ ...config2.merchantWalletAddresses
957
957
  },
958
958
  metadata: {
959
- ...config.metadata,
959
+ ...config2.metadata,
960
960
  testMode,
961
961
  checkoutVersion: "1.0.0"
962
962
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/PaymentAPI.js","../src/CoinleyPayment.jsx","../src/CoinleyProvider.jsx","../src/index.js"],"sourcesContent":["/**\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/PaymentAPI.js\r\nimport axios from 'axios';\r\n\r\nexport class PaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n\r\n this.api = axios.create({\r\n baseURL: baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add request interceptor\r\n this.api.interceptors.request.use(\r\n (config) => {\r\n config.headers['X-API-Key'] = this.apiKey;\r\n config.headers['X-API-Secret'] = this.apiSecret;\r\n \r\n const token = this.generateMerchantToken();\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n console.log('API Request:', {\r\n method: config.method?.toUpperCase(),\r\n url: config.url,\r\n data: config.data\r\n });\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('Request interceptor error:', error);\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Add response interceptor\r\n this.api.interceptors.response.use(\r\n (response) => {\r\n console.log('API Response:', {\r\n status: response.status,\r\n url: response.config.url,\r\n data: response.data\r\n });\r\n return response;\r\n },\r\n (error) => {\r\n console.error('API Error:', {\r\n status: error.response?.status,\r\n data: error.response?.data,\r\n message: error.message\r\n });\r\n\r\n if (error.response?.status === 401) {\r\n throw new Error('Authentication failed. Please check your API credentials.');\r\n } else if (error.response?.status === 404) {\r\n throw new Error('API endpoint not found. Please check your API URL.');\r\n } else if (error.response?.status >= 500) {\r\n throw new Error('Server error. Please try again later.');\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n generateMerchantToken() {\r\n try {\r\n const credentials = `${this.apiKey}:${this.apiSecret}`;\r\n return btoa(credentials);\r\n } catch (error) {\r\n console.error('Failed to generate token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async createPayment(params) {\r\n try {\r\n const response = await this.api.post('/api/payments/create', params);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to create payment');\r\n }\r\n }\r\n\r\n async getPayment(paymentId) {\r\n try {\r\n const response = await this.api.get(`/api/payments/${paymentId}`);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to get payment details');\r\n }\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n const response = await this.api.get('/api/networks');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get networks failed:', error);\r\n \r\n // Return fallback networks\r\n return {\r\n networks: [\r\n {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n chainId: '1',\r\n type: 'ethereum',\r\n explorerUrl: 'https://etherscan.io',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'bsc',\r\n name: 'Binance Smart Chain',\r\n shortName: 'bsc',\r\n chainId: '56',\r\n type: 'bsc',\r\n explorerUrl: 'https://bscscan.com',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'polygon',\r\n name: 'Polygon',\r\n shortName: 'polygon',\r\n chainId: '137',\r\n type: 'ethereum',\r\n explorerUrl: 'https://polygonscan.com',\r\n isTestnet: false,\r\n },\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getStablecoins() {\r\n try {\r\n const response = await this.api.get('/api/networks/stablecoins');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get stablecoins failed:', error);\r\n \r\n // Return fallback stablecoins\r\n return {\r\n stablecoins: [\r\n {\r\n id: 'usdt-eth',\r\n name: 'Tether USD',\r\n symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n },\r\n {\r\n id: 'usdc-eth',\r\n name: 'USD Coin',\r\n symbol: 'USDC',\r\n contractAddress: '0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n try {\r\n const response = await this.api.post('/api/payments/verify-qr', {\r\n paymentId\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to verify payment');\r\n }\r\n }\r\n\r\n async processPayment(paymentId, transactionHash, network, senderAddress) {\r\n try {\r\n const response = await this.api.post('/api/payments/process', {\r\n paymentId,\r\n transactionHash,\r\n network,\r\n senderAddress\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to process payment');\r\n }\r\n }\r\n\r\n async healthCheck() {\r\n try {\r\n const response = await this.api.get('/api/health');\r\n return response.status === 200;\r\n } catch (error) {\r\n console.error('Health check failed:', error);\r\n return false;\r\n }\r\n }\r\n}","//src/CoinleyPayment.jsx\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { \r\n Wallet, \r\n QrCode, \r\n ChevronDown, \r\n Copy, \r\n Check, \r\n X, \r\n ArrowLeft,\r\n Loader2,\r\n ExternalLink,\r\n AlertCircle,\r\n CheckCircle2,\r\n Zap,\r\n Sparkles\r\n} from 'lucide-react';\r\n// import QRCodeLib from 'qrcode';\r\nimport { \r\n createCoinleyWalletConfig,\r\n CoinleyWalletProvider,\r\n ConnectButton,\r\n WalletModal,\r\n useWallet,\r\n useWalletConnect,\r\n useWalletTransaction,\r\n useWalletModal,\r\n useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\nimport { PaymentAPI } from './PaymentAPI';\r\n\r\n// Wallet Integration Component\r\nconst WalletIntegration = ({ \r\n selectedNetwork, \r\n selectedToken, \r\n paymentData, \r\n onTransactionSent, \r\n onError,\r\n isConnecting,\r\n setIsConnecting\r\n}) => {\r\n const { isConnected, address } = useWallet();\r\n const { connectWallet, isPending } = useWalletConnect();\r\n const { detectedWallets, hasWallets, walletCount } = useWalletDetection(); // ADD THIS\r\n const { sendTransaction } = useWalletTransaction();\r\n\r\n useEffect(() => {\r\n if (isConnected && paymentData && selectedNetwork && selectedToken) {\r\n handleSendTransaction();\r\n }\r\n }, [isConnected, paymentData]);\r\n\r\n const handleConnectWallet = async () => {\r\n try {\r\n setIsConnecting(true);\r\n openModal();\r\n } catch (error) {\r\n console.error('Wallet connection failed:', error);\r\n onError(error.message || 'Failed to connect wallet');\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n const handleSendTransaction = async () => {\r\n if (!isConnected || !paymentData || !selectedToken) return;\r\n\r\n try {\r\n setIsConnecting(true);\r\n \r\n const recipientAddress = paymentData.metadata?.recipientWallet;\r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let txHash;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 Token Transaction\r\n const amount = (paymentData.totalAmount * Math.pow(10, selectedToken.decimals)).toString();\r\n const transferData = `0xa9059cbb${recipientAddress.slice(2).padStart(64, '0')}${parseInt(amount).toString(16).padStart(64, '0')}`;\r\n \r\n txHash = await sendTransaction({\r\n to: selectedToken.contractAddress,\r\n data: transferData,\r\n value: '0x0'\r\n });\r\n } else {\r\n // Native Token Transaction\r\n const value = (paymentData.totalAmount * Math.pow(10, 18)).toString(16);\r\n \r\n txHash = await sendTransaction({\r\n to: recipientAddress,\r\n value: `0x${value}`\r\n });\r\n }\r\n\r\n if (txHash) {\r\n onTransactionSent(txHash);\r\n }\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n onError(error.message || 'Transaction failed');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"text-center space-y-6\">\r\n <div className=\"space-y-4\">\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Wallet className=\"w-8 h-8 text-[#7042D2]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold\">\r\n {isConnected ? 'Send Payment' : `Connect Wallet (${walletCount} detected)`}\r\n </h3>\r\n {!isConnected ? (\r\n <div className=\"space-y-3\">\r\n {hasWallets ? (\r\n detectedWallets.map((wallet, index) => (\r\n <button\r\n key={index}\r\n onClick={() => connectWallet('injected')}\r\n disabled={isPending}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors\"\r\n >\r\n <span className=\"text-xl\">{wallet.icon}</span>\r\n <div className=\"text-left\">\r\n <div className=\"font-medium\">{wallet.name}</div>\r\n <div className=\"text-xs text-gray-500\">{wallet.provider}</div>\r\n </div>\r\n </button>\r\n ))\r\n ) : (\r\n <p className=\"text-gray-600\">No wallets detected. Please install MetaMask.</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-green-600 dark:text-green-400\">\r\n ✅ Wallet Connected: {address?.slice(0, 6)}...{address?.slice(-4)}\r\n </p>\r\n \r\n {paymentData && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isConnecting && (\r\n <div className=\"flex items-center justify-center space-x-2\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[#7042D2]\" />\r\n <span>Processing transaction...</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst CoinleyPayment = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n isOpen,\r\n config,\r\n theme = 'light',\r\n merchantName,\r\n debug = false\r\n}) => {\r\n // State management\r\n const [currentStep, setCurrentStep] = useState('select-method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [qrCode, setQrCode] = useState('');\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [copied, setCopied] = useState(false);\r\n const [txHash, setTxHash] = useState('');\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n // Services\r\n const paymentAPI = useRef(new PaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Wallet configuration\r\n const walletConfig = createCoinleyWalletConfig({\r\n appName: merchantName || 'Coinley Payment',\r\n appDescription: 'Crypto payment processing',\r\n chains: ['ethereum', 'polygon', 'bsc', 'arbitrum']\r\n });\r\n\r\n // Initialize\r\n useEffect(() => {\r\n if (isOpen) {\r\n initializePayment();\r\n }\r\n }, [isOpen]);\r\n\r\n const initializePayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const [networksRes, tokensRes] = await Promise.all([\r\n paymentAPI.current.getNetworks(),\r\n paymentAPI.current.getStablecoins()\r\n ]);\r\n\r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n\r\n if (debug) {\r\n console.log('Initialized networks:', networksRes.networks);\r\n console.log('Initialized tokens:', tokensRes.stablecoins);\r\n }\r\n } catch (err) {\r\n console.error('Failed to initialize payment:', err);\r\n setError('Failed to load payment options. Please try again.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMethodSelect = (method) => {\r\n setPaymentMethod(method);\r\n setCurrentStep('select-network');\r\n };\r\n\r\n const handleNetworkSelect = async (network) => {\r\n setSelectedNetwork(network);\r\n \r\n const networkTokens = tokens.filter(token => \r\n token.Network?.shortName === network.shortName || token.networkId === network.id\r\n );\r\n \r\n if (networkTokens.length > 0) {\r\n const preferredToken = networkTokens.find(t => t.symbol === 'USDT') || networkTokens[0];\r\n setSelectedToken(preferredToken);\r\n await initiatePayment(network, preferredToken);\r\n }\r\n };\r\n\r\n const initiatePayment = async (network, token) => {\r\n try {\r\n setLoading(true);\r\n \r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: token.symbol,\r\n network: network.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n paymentMethod,\r\n selectedNetwork: network.shortName,\r\n selectedToken: token.symbol\r\n }\r\n };\r\n\r\n const payment = await paymentAPI.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n\r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet-connect');\r\n } else {\r\n await generateQRCode(payment.payment);\r\n setCurrentStep('qr-code');\r\n }\r\n } catch (err) {\r\n console.error('Payment initiation failed:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setCurrentStep('error');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const generateQRCode = async (payment) => {\r\n try {\r\n const recipientAddress = payment.metadata?.recipientWallet || \r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName || ''];\r\n \r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let qrData = '';\r\n \r\n if (selectedNetwork?.type === 'ethereum' || selectedNetwork?.type === 'bsc') {\r\n qrData = selectedToken?.contractAddress \r\n ? `ethereum:${selectedToken.contractAddress}/transfer?address=${recipientAddress}&uint256=${payment.totalAmount * Math.pow(10, selectedToken.decimals)}`\r\n : `ethereum:${recipientAddress}?value=${payment.totalAmount}e18`;\r\n } else if (selectedNetwork?.type === 'tron') {\r\n qrData = `tron:${recipientAddress}?amount=${payment.totalAmount}`;\r\n } else {\r\n qrData = `${selectedToken?.symbol}:${recipientAddress}?amount=${payment.totalAmount}`;\r\n }\r\n\r\n const qrCodeDataURL = await QRCodeLib.toDataURL(qrData, {\r\n width: 256,\r\n margin: 2,\r\n color: {\r\n dark: theme === 'dark' ? '#FFFFFF' : '#000000',\r\n light: theme === 'dark' ? '#000000' : '#FFFFFF'\r\n }\r\n });\r\n\r\n // setQrCode(qrCodeDataURL);\r\n setQrCode(recipientAddress);\r\n startPaymentVerification(payment.id);\r\n \r\n } catch (err) {\r\n console.error('QR code generation failed:', err);\r\n setError('Failed to generate QR code');\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const startPaymentVerification = async (paymentId) => {\r\n const maxAttempts = 60;\r\n let attempts = 0;\r\n\r\n const checkPayment = async () => {\r\n try {\r\n const result = await paymentAPI.current.verifyQRPayment(paymentId);\r\n \r\n if (result.verified && result.payment?.transactionHash) {\r\n setTxHash(result.payment.transactionHash);\r\n await handlePaymentSuccess(paymentId, result.payment.transactionHash);\r\n return true;\r\n }\r\n \r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification timeout. Please check your transaction.');\r\n setCurrentStep('error');\r\n }\r\n \r\n return false;\r\n } catch (err) {\r\n console.error('Payment verification error:', err);\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification failed');\r\n setCurrentStep('error');\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n setTimeout(checkPayment, 2000);\r\n };\r\n\r\n const handleTransactionSent = async (transactionHash) => {\r\n setTxHash(transactionHash);\r\n setCurrentStep('processing');\r\n \r\n try {\r\n await paymentAPI.current.processPayment(\r\n paymentData.id,\r\n transactionHash,\r\n selectedNetwork?.shortName || '',\r\n ''\r\n );\r\n \r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n } catch (error) {\r\n console.error('Payment processing failed:', error);\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n }\r\n };\r\n\r\n const handlePaymentSuccess = async (paymentId, transactionHash) => {\r\n setCurrentStep('success');\r\n \r\n if (onSuccess) {\r\n onSuccess(paymentId, transactionHash, {\r\n network: selectedNetwork?.name,\r\n token: selectedToken?.symbol,\r\n amount: paymentData?.totalAmount,\r\n method: paymentMethod\r\n });\r\n }\r\n };\r\n\r\n const copyToClipboard = async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setCurrentStep('select-method');\r\n setPaymentMethod(null);\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setQrCode('');\r\n setPaymentData(null);\r\n setError('');\r\n setTxHash('');\r\n \r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const goBack = () => {\r\n if (currentStep === 'select-network') {\r\n setCurrentStep('select-method');\r\n } else if (currentStep === 'wallet-connect' || currentStep === 'qr-code') {\r\n setCurrentStep('select-network');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <CoinleyWalletProvider config={walletConfig} walletConfig={{ appName: merchantName || 'Coinley Payment' }}>\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm\">\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n className={`relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden ${\r\n theme === 'dark' ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'\r\n }`}\r\n >\r\n {/* Header */}\r\n <div className=\"relative p-6 border-b border-gray-200 dark:border-gray-700\">\r\n {(currentStep !== 'select-method' && currentStep !== 'success' && currentStep !== 'error') && (\r\n <button\r\n onClick={goBack}\r\n className=\"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n )}\r\n \r\n <button\r\n onClick={handleClose}\r\n className=\"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n \r\n <div className=\"text-center\">\r\n <div className=\"flex items-center justify-center space-x-2 mb-2\">\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n <h2 className=\"text-xl font-bold\">Pay with Crypto</h2>\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n </div>\r\n {merchantName && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\r\n {merchantName}\r\n </p>\r\n )}\r\n <div className=\"mt-2\">\r\n <span className=\"text-2xl font-bold text-[#7042D2]\">\r\n ${config.amount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 min-h-[400px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {/* Step 1: Select Payment Method */}\r\n {currentStep === 'select-method' && (\r\n <motion.div\r\n key=\"select-method\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Choose Payment Method\r\n </h3>\r\n \r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('wallet')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <Wallet className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">Connect Wallet</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n MetaMask, WalletConnect & more\r\n </div>\r\n </div>\r\n <Zap className=\"w-5 h-5 text-[#7042D2] ml-auto\" />\r\n </div>\r\n </motion.button>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('qr')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <QrCode className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">QR Code</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n Scan with mobile wallet\r\n </div>\r\n </div>\r\n </div>\r\n </motion.button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'select-network' && (\r\n <motion.div\r\n key=\"select-network\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Network\r\n </h3>\r\n \r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {networks.map((network) => (\r\n <motion.button\r\n key={network.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleNetworkSelect(network)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {network.logo ? (\r\n <img \r\n src={network.logo} \r\n alt={network.name}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {network.shortName.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{network.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {network.shortName.toUpperCase()}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))}\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Wallet Connect */}\r\n {currentStep === 'wallet-connect' && (\r\n <motion.div\r\n key=\"wallet-connect\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n >\r\n <WalletIntegration\r\n selectedNetwork={selectedNetwork}\r\n selectedToken={selectedToken}\r\n paymentData={paymentData}\r\n onTransactionSent={handleTransactionSent}\r\n onError={setError}\r\n isConnecting={isConnecting}\r\n setIsConnecting={setIsConnecting}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {/* QR Code */}\r\n {currentStep === 'qr-code' && (\r\n <motion.div\r\n key=\"qr-code\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Use your mobile wallet to scan and pay\r\n </p>\r\n </div>\r\n\r\n {qrCode && (\r\n <div className=\"bg-white p-4 rounded-xl mx-auto inline-block\">\r\n <img src={qrCode} alt=\"Payment QR Code\" className=\"w-48 h-48\" />\r\n </div>\r\n )}\r\n\r\n {paymentData && (\r\n <div className=\"space-y-3\">\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n </div>\r\n \r\n <div className=\"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Waiting for payment...</span>\r\n </div>\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Processing */}\r\n {currentStep === 'processing' && (\r\n <motion.div\r\n key=\"processing\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[#7042D2]\">Processing Payment...</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your transaction is being processed\r\n </p>\r\n </div>\r\n </motion.div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <motion.div\r\n key=\"success\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <CheckCircle2 className=\"w-8 h-8 text-green-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-green-600\">Payment Successful!</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your payment has been processed successfully\r\n </p>\r\n </div>\r\n\r\n {txHash && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Transaction:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {txHash.slice(0, 6)}...{txHash.slice(-4)}\r\n </span>\r\n <button\r\n onClick={() => copyToClipboard(txHash)}\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {selectedNetwork?.explorerUrl && (\r\n <a\r\n href={`${selectedNetwork.explorerUrl}/tx/${txHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Error */}\r\n {currentStep === 'error' && (\r\n <motion.div\r\n key=\"error\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto\">\r\n <AlertCircle className=\"w-8 h-8 text-red-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-red-600\">Payment Failed</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {error || 'Something went wrong. Please try again.'}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => {\r\n setCurrentStep('select-method');\r\n setError('');\r\n }}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center\">\r\n <p className=\"text-xs text-gray-500\">\r\n Powered by <span className=\"font-semibold text-[#7042D2]\">Coinley</span>\r\n </p>\r\n </div>\r\n </motion.div>\r\n </div>\r\n\r\n <WalletModal />\r\n </CoinleyWalletProvider>\r\n );\r\n};\r\n\r\nexport default CoinleyPayment;","//src/CoinleyProvider.jsx\r\nimport React, { createContext, useContext, useRef, forwardRef, useImperativeHandle } from 'react';\r\nimport CoinleyPayment from './CoinleyPayment';\r\n\r\nconst CoinleyContext = createContext(null);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n theme = 'light',\r\n debug = false,\r\n children\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [paymentConfig, setPaymentConfig] = React.useState(null);\r\n const [callbacks, setCallbacks] = React.useState({});\r\n const [merchantName, setMerchantName] = React.useState('');\r\n\r\n const openPayment = (config, checkoutCallbacks) => {\r\n setPaymentConfig(config);\r\n if (checkoutCallbacks) {\r\n setCallbacks(checkoutCallbacks);\r\n }\r\n setIsOpen(true);\r\n };\r\n\r\n const closePayment = () => {\r\n setIsOpen(false);\r\n setPaymentConfig(null);\r\n if (callbacks.onClose) {\r\n callbacks.onClose();\r\n }\r\n };\r\n\r\n const contextValue = {\r\n openPayment,\r\n closePayment\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={contextValue}>\r\n {children}\r\n {isOpen && paymentConfig && (\r\n <CoinleyPayment\r\n apiKey={apiKey}\r\n apiSecret={apiSecret}\r\n apiUrl={apiUrl}\r\n isOpen={isOpen}\r\n config={paymentConfig}\r\n theme={theme}\r\n debug={debug}\r\n merchantName={merchantName}\r\n onSuccess={callbacks.onSuccess}\r\n onError={callbacks.onError}\r\n onClose={closePayment}\r\n />\r\n )}\r\n </CoinleyContext.Provider>\r\n );\r\n};\r\n\r\nexport const CoinleyCheckout = forwardRef((\r\n {\r\n customerEmail = '',\r\n merchantName = '',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme = 'light',\r\n autoOpen = false,\r\n testMode = false,\r\n debug = false,\r\n merchantWalletAddresses = {}\r\n },\r\n ref\r\n) => {\r\n const context = useContext(CoinleyContext);\r\n\r\n if (!context) {\r\n throw new Error('CoinleyCheckout must be used within a CoinleyProvider');\r\n }\r\n\r\n const { openPayment, closePayment } = context;\r\n\r\n const open = (config) => {\r\n try {\r\n if (debug) {\r\n console.log('Opening Coinley checkout with config:', config);\r\n }\r\n\r\n if (!config.amount || config.amount <= 0) {\r\n throw new Error('Amount must be greater than 0');\r\n }\r\n\r\n const finalConfig = {\r\n ...config,\r\n customerEmail: config.customerEmail || customerEmail,\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...config.merchantWalletAddresses\r\n },\r\n metadata: {\r\n ...config.metadata,\r\n testMode,\r\n checkoutVersion: '1.0.0'\r\n }\r\n };\r\n\r\n const checkoutCallbacks = {\r\n onSuccess,\r\n onError,\r\n onClose\r\n };\r\n\r\n openPayment(finalConfig, checkoutCallbacks);\r\n } catch (error) {\r\n console.error('Failed to open Coinley checkout:', error);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n closePayment();\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n open,\r\n close\r\n }));\r\n\r\n return null;\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport const useCoinley = () => {\r\n const context = useContext(CoinleyContext);\r\n if (!context) {\r\n throw new Error('useCoinley must be used within a CoinleyProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ThemeProvider = ({\r\n initialTheme = 'light',\r\n children\r\n}) => {\r\n const [theme, setTheme] = React.useState(initialTheme);\r\n\r\n React.useEffect(() => {\r\n document.documentElement.setAttribute('data-coinley-theme', theme);\r\n }, [theme]);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n return (\r\n <div className={`coinley-theme-${theme}`}>\r\n {children}\r\n </div>\r\n );\r\n};","// Main SDK exports\r\nexport {\r\n CoinleyProvider,\r\n CoinleyCheckout,\r\n ThemeProvider,\r\n useCoinley\r\n} from './CoinleyProvider';\r\n\r\nexport { PaymentAPI } from './PaymentAPI';\r\nexport { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.0';\r\n\r\n// Utils\r\nexport const utils = {\r\n formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n if (!address) return '';\r\n if (address.length <= startChars + endChars) return address;\r\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n },\r\n\r\n isValidAddress: (address, network) => {\r\n if (!address) return false;\r\n \r\n switch (network.toLowerCase()) {\r\n case 'ethereum':\r\n case 'bsc':\r\n case 'polygon':\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n case 'tron':\r\n return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n case 'solana':\r\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n default:\r\n return address.length > 0;\r\n }\r\n },\r\n\r\n copyToClipboard: async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n};\r\n\r\n// Error classes\r\nexport class CoinleyError extends Error {\r\n constructor(message, code) {\r\n super(message);\r\n this.name = 'CoinleyError';\r\n this.code = code;\r\n }\r\n}\r\n\r\n// Default config\r\nexport const DEFAULT_CONFIG = {\r\n theme: 'light',\r\n debug: false,\r\n testMode: false,\r\n autoOpen: false\r\n};"],"names":["require$$0","jsxRuntimeModule","jsxs","jsx","error"],"mappings":";;;;;;;;;;;;;;;;AASa,IAAI,IAAEA,OAAiB,IAAE,OAAO,IAAI,eAAe,GAAE,IAAE,OAAO,IAAI,gBAAgB,GAAE,IAAE,OAAO,UAAU,gBAAe,IAAE,EAAE,mDAAmD,mBAAkB,IAAE,EAAC,KAAI,MAAG,KAAI,MAAG,QAAO,MAAG,UAAS,KAAE;AAClP,SAAS,EAAE,GAAE,GAAE,GAAE;AAAC,MAAI,GAAE,IAAE,IAAG,IAAE,MAAK,IAAE;AAAK,aAAS,MAAI,IAAE,KAAG;AAAG,aAAS,EAAE,QAAM,IAAE,KAAG,EAAE;AAAK,aAAS,EAAE,QAAM,IAAE,EAAE;AAAK,OAAI,KAAK,EAAE,GAAE,KAAK,GAAE,CAAC,KAAG,CAAC,EAAE,eAAe,CAAC,MAAI,EAAE,CAAC,IAAE,EAAE,CAAC;AAAG,MAAG,KAAG,EAAE,aAAa,MAAI,KAAK,IAAE,EAAE,cAAa,EAAE,YAAS,EAAE,CAAC,MAAI,EAAE,CAAC,IAAE,EAAE,CAAC;AAAG,SAAM,EAAC,UAAS,GAAE,MAAK,GAAE,KAAI,GAAE,KAAI,GAAE,OAAM,GAAE,QAAO,EAAE,QAAO;AAAC;0CAAkB;AAAa,+BAAA,MAAC;AAAE,+BAAA,OAAa;ACR/T;AAClCC,aAAA,UAAUD;AACnB;;ACDO,MAAM,WAAW;AAAA,EACtB,YAAY,SAAS,QAAQ,WAAW;AACtC,SAAK,SAAS;AACd,SAAK,YAAY;AAEjB,SAAK,MAAM,MAAM,OAAO;AAAA,MACtB,SAAS,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAAA,MACxD,SAAS;AAAA,MACT,SAAS;AAAA,QACP,gBAAgB;AAAA,MACjB;AAAA,IACP,CAAK;AAGD,SAAK,IAAI,aAAa,QAAQ;AAAA,MAC5B,CAAC,WAAW;;AACV,eAAO,QAAQ,WAAW,IAAI,KAAK;AACnC,eAAO,QAAQ,cAAc,IAAI,KAAK;AAEtC,cAAM,QAAQ,KAAK;AACnB,YAAI,OAAO;AACT,iBAAO,QAAQ,eAAe,IAAI,UAAU,KAAK;AAAA,QAClD;AAED,gBAAQ,IAAI,gBAAgB;AAAA,UAC1B,SAAQ,YAAO,WAAP,mBAAe;AAAA,UACvB,KAAK,OAAO;AAAA,UACZ,MAAM,OAAO;AAAA,QACvB,CAAS;AAED,eAAO;AAAA,MACR;AAAA,MACD,CAAC,UAAU;AACT,gBAAQ,MAAM,8BAA8B,KAAK;AACjD,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC5B;AAAA,IACP;AAGI,SAAK,IAAI,aAAa,SAAS;AAAA,MAC7B,CAAC,aAAa;AACZ,gBAAQ,IAAI,iBAAiB;AAAA,UAC3B,QAAQ,SAAS;AAAA,UACjB,KAAK,SAAS,OAAO;AAAA,UACrB,MAAM,SAAS;AAAA,QACzB,CAAS;AACD,eAAO;AAAA,MACR;AAAA,MACD,CAAC,UAAU;;AACT,gBAAQ,MAAM,cAAc;AAAA,UAC1B,SAAQ,WAAM,aAAN,mBAAgB;AAAA,UACxB,OAAM,WAAM,aAAN,mBAAgB;AAAA,UACtB,SAAS,MAAM;AAAA,QACzB,CAAS;AAED,cAAI,WAAM,aAAN,mBAAgB,YAAW,KAAK;AAClC,gBAAM,IAAI,MAAM,2DAA2D;AAAA,QAC5E,aAAU,WAAM,aAAN,mBAAgB,YAAW,KAAK;AACzC,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACrE,aAAU,WAAM,aAAN,mBAAgB,WAAU,KAAK;AACxC,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACxD;AAED,cAAM;AAAA,MACP;AAAA,IACP;AAAA,EACG;AAAA,EAED,wBAAwB;AACtB,QAAI;AACF,YAAM,cAAc,GAAG,KAAK,MAAM,IAAI,KAAK,SAAS;AACpD,aAAO,KAAK,WAAW;AAAA,IACxB,SAAQ,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,aAAO;AAAA,IACR;AAAA,EACF;AAAA,EAED,MAAM,cAAc,QAAQ;;AAC1B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,KAAK,wBAAwB,MAAM;AACnE,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,0BAA0B;AAAA,IAC5D;AAAA,EACF;AAAA,EAED,MAAM,WAAW,WAAW;;AAC1B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,iBAAiB,SAAS,EAAE;AAChE,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,+BAA+B;AAAA,IACjE;AAAA,EACF;AAAA,EAED,MAAM,cAAc;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,eAAe;AACnD,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAG3C,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,UACZ;AAAA,UACD;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,UACZ;AAAA,UACD;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,UACZ;AAAA,QACF;AAAA,MACT;AAAA,IACK;AAAA,EACF;AAAA,EAED,MAAM,iBAAiB;AACrB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,2BAA2B;AAC/D,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAG9C,aAAO;AAAA,QACL,aAAa;AAAA,UACX;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,cAAc;AAAA,YACd,WAAW;AAAA,YACX,SAAS;AAAA,cACP,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,WAAW;AAAA,cACX,MAAM;AAAA,YACP;AAAA,UACF;AAAA,UACD;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,cAAc;AAAA,YACd,WAAW;AAAA,YACX,SAAS;AAAA,cACP,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,WAAW;AAAA,cACX,MAAM;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACT;AAAA,IACK;AAAA,EACF;AAAA,EAED,MAAM,gBAAgB,WAAW;;AAC/B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,KAAK,2BAA2B;AAAA,QAC9D;AAAA,MACR,CAAO;AACD,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,0BAA0B;AAAA,IAC5D;AAAA,EACF;AAAA,EAED,MAAM,eAAe,WAAW,iBAAiB,SAAS,eAAe;;AACvE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,KAAK,yBAAyB;AAAA,QAC5D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACR,CAAO;AACD,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,2BAA2B;AAAA,IAC7D;AAAA,EACF;AAAA,EAED,MAAM,cAAc;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,aAAa;AACjD,aAAO,SAAS,WAAW;AAAA,IAC5B,SAAQ,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAC3C,aAAO;AAAA,IACR;AAAA,EACF;AACH;ACvMA,MAAM,oBAAoB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,aAAa,QAAQ,IAAI,UAAU;AAC3C,QAAM,EAAE,eAAe,UAAU,IAAI,iBAAiB;AACtD,QAAM,EAAE,iBAAiB,YAAY,gBAAgB,mBAAmB;AAClE,QAAA,EAAE,oBAAoB;AAE5B,YAAU,MAAM;AACV,QAAA,eAAe,eAAe,mBAAmB,eAAe;AAC5C;IACxB;AAAA,EAAA,GACC,CAAC,aAAa,WAAW,CAAC;AAa7B,QAAM,wBAAwB,YAAY;;AACxC,QAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAe;AAEhD,QAAA;AACF,sBAAgB,IAAI;AAEd,YAAA,oBAAmB,iBAAY,aAAZ,mBAAsB;AAC/C,UAAI,CAAC,kBAAkB;AACf,cAAA,IAAI,MAAM,oCAAoC;AAAA,MACtD;AAEI,UAAA;AAEJ,UAAI,cAAc,iBAAiB;AAE3B,cAAA,UAAU,YAAY,cAAc,KAAK,IAAI,IAAI,cAAc,QAAQ,GAAG,SAAS;AACnF,cAAA,eAAe,aAAa,iBAAiB,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,SAAS,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AAE/H,iBAAS,MAAM,gBAAgB;AAAA,UAC7B,IAAI,cAAc;AAAA,UAClB,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAEC,cAAA,SAAS,YAAY,cAAc,KAAK,IAAI,IAAI,EAAE,GAAG,SAAS,EAAE;AAEtE,iBAAS,MAAM,gBAAgB;AAAA,UAC7B,IAAI;AAAA,UACJ,OAAO,KAAK,KAAK;AAAA,QAAA,CAClB;AAAA,MACH;AAEA,UAAI,QAAQ;AACV,0BAAkB,MAAM;AAAA,MAC1B;AAAA,aACO,OAAO;AACN,cAAA,MAAM,uBAAuB,KAAK;AAClC,cAAA,MAAM,WAAW,oBAAoB;AAAA,IAAA,UAC7C;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EAAA;AAGF,+CACG,OAAI,EAAA,WAAU,yBACb,UAACE,kCAAA,KAAA,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAAC,kCAAAA,IAAC,SAAI,WAAU,8FACb,gDAAC,QAAO,EAAA,WAAU,0BAAyB,EAC7C,CAAA;AAAA,IACAA,kCAAAA,IAAC,QAAG,WAAU,yBACX,wBAAc,iBAAiB,mBAAmB,WAAW,aAChE,CAAA;AAAA,IACA,CAAC,cACCA,kCAAA,IAAC,OAAI,EAAA,WAAU,aACZ,UAAA,aACC,gBAAgB,IAAI,CAAC,QAAQ,UAC3BD,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAM,cAAc,UAAU;AAAA,QACvC,UAAU;AAAA,QACV,WAAU;AAAA,QAEV,UAAA;AAAA,UAAAC,kCAAA,IAAC,QAAK,EAAA,WAAU,WAAW,UAAA,OAAO,MAAK;AAAA,UACvCD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACb,UAAA;AAAA,YAAAC,kCAAA,IAAC,OAAI,EAAA,WAAU,eAAe,UAAA,OAAO,MAAK;AAAA,YACzCA,kCAAA,IAAA,OAAA,EAAI,WAAU,yBAAyB,iBAAO,UAAS;AAAA,UAAA,GAC1D;AAAA,QAAA;AAAA,MAAA;AAAA,MATK;AAAA,IAAA,CAWR,IAEAA,kCAAA,IAAA,KAAA,EAAE,WAAU,iBAAgB,UAA6C,gDAAA,CAAA,EAE9E,CAAA,IAEAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACb,UAAA;AAAA,MAACA,kCAAAA,KAAA,KAAA,EAAE,WAAU,sCAAqC,UAAA;AAAA,QAAA;AAAA,QAC3B,mCAAS,MAAM,GAAG;AAAA,QAAG;AAAA,QAAI,mCAAS,MAAM;AAAA,MAAE,GACjE;AAAA,MAEC,eACCA,kCAAA,KAAC,OAAI,EAAA,WAAU,wDACb,UAAA;AAAA,QAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAO,WAAA;AAAA,UAClED,kCAAAA,KAAC,QAAK,EAAA,WAAU,eAAe,UAAA;AAAA,YAAY,YAAA;AAAA,YAAY;AAAA,YAAE,+CAAe;AAAA,UAAA,GAAO;AAAA,QAAA,GACjF;AAAA,QACAA,kCAAAA,KAAC,OAAI,EAAA,WAAU,qCACb,UAAA;AAAA,UAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAQ,YAAA;AAAA,UAClEA,kCAAA,IAAA,QAAA,EAAK,WAAU,eAAe,6DAAiB,MAAK;AAAA,QAAA,GACvD;AAAA,MAAA,GACF;AAAA,MAGD,gBACCD,kCAAA,KAAC,OAAI,EAAA,WAAU,8CACb,UAAA;AAAA,QAACC,kCAAAA,IAAA,SAAA,EAAQ,WAAU,sCAAsC,CAAA;AAAA,QACzDA,kCAAAA,IAAC,UAAK,UAAyB,4BAAA,CAAA;AAAA,MAAA,GACjC;AAAA,IAAA,GAEJ;AAAA,EAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAEA,MAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,QAAQ;AACV,MAAM;AAEJ,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,eAAe;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAE,CAAA;AAC3C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAE,CAAA;AACvC,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,IAAI;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AACvD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AACvD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,IAAI;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAGtD,QAAM,aAAa,OAAO,IAAI,WAAW,QAAQ,QAAQ,SAAS,CAAC;AAGnE,QAAM,eAAe,0BAA0B;AAAA,IAC7C,SAAS,gBAAgB;AAAA,IACzB,gBAAgB;AAAA,IAChB,QAAQ,CAAC,YAAY,WAAW,OAAO,UAAU;AAAA,EAAA,CAClD;AAGD,YAAU,MAAM;AACd,QAAI,QAAQ;AACQ;IACpB;AAAA,EAAA,GACC,CAAC,MAAM,CAAC;AAEX,QAAM,oBAAoB,YAAY;AAChC,QAAA;AACF,iBAAW,IAAI;AACf,eAAS,EAAE;AAEX,YAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,WAAW,QAAQ,YAAY;AAAA,QAC/B,WAAW,QAAQ,eAAe;AAAA,MAAA,CACnC;AAEW,kBAAA,YAAY,YAAY,CAAA,CAAE;AAC5B,gBAAA,UAAU,eAAe,CAAA,CAAE;AAErC,UAAI,OAAO;AACD,gBAAA,IAAI,yBAAyB,YAAY,QAAQ;AACjD,gBAAA,IAAI,uBAAuB,UAAU,WAAW;AAAA,MAC1D;AAAA,aACO,KAAK;AACJ,cAAA,MAAM,iCAAiC,GAAG;AAClD,eAAS,mDAAmD;AAAA,IAAA,UAC5D;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EAAA;AAGI,QAAA,qBAAqB,CAAC,WAAW;AACrC,qBAAiB,MAAM;AACvB,mBAAe,gBAAgB;AAAA,EAAA;AAG3B,QAAA,sBAAsB,OAAO,YAAY;AAC7C,uBAAmB,OAAO;AAE1B,UAAM,gBAAgB,OAAO;AAAA,MAAO,CAAA,UAAA;;AAClC,4BAAM,YAAN,mBAAe,eAAc,QAAQ,aAAa,MAAM,cAAc,QAAQ;AAAA;AAAA,IAAA;AAG5E,QAAA,cAAc,SAAS,GAAG;AACtB,YAAA,iBAAiB,cAAc,KAAK,CAAA,MAAK,EAAE,WAAW,MAAM,KAAK,cAAc,CAAC;AACtF,uBAAiB,cAAc;AACzB,YAAA,gBAAgB,SAAS,cAAc;AAAA,IAC/C;AAAA,EAAA;AAGI,QAAA,kBAAkB,OAAO,SAAS,UAAU;AAC5C,QAAA;AACF,iBAAW,IAAI;AAEf,YAAM,iBAAiB;AAAA,QACrB,QAAQ,OAAO;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,eAAe,OAAO;AAAA,QACtB,aAAa,OAAO;AAAA,QACpB,UAAU;AAAA,UACR,GAAG,OAAO;AAAA,UACV;AAAA,UACA,iBAAiB,QAAQ;AAAA,UACzB,eAAe,MAAM;AAAA,QACvB;AAAA,MAAA;AAGF,YAAM,UAAU,MAAM,WAAW,QAAQ,cAAc,cAAc;AACrE,qBAAe,QAAQ,OAAO;AAE9B,UAAI,kBAAkB,UAAU;AAC9B,uBAAe,gBAAgB;AAAA,MAAA,OAC1B;AACC,cAAA,eAAe,QAAQ,OAAO;AACpC,uBAAe,SAAS;AAAA,MAC1B;AAAA,aACO,KAAK;AACJ,cAAA,MAAM,8BAA8B,GAAG;AACtC,eAAA,IAAI,WAAW,0BAA0B;AAClD,qBAAe,OAAO;AAAA,IAAA,UACtB;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EAAA;AAGI,QAAA,iBAAiB,OAAO,YAAY;;AACpC,QAAA;AACI,YAAA,qBAAmB,aAAQ,aAAR,mBAAkB,sBACpB,YAAO,4BAAP,oBAAiC,mDAAiB,cAAa;AAEtF,UAAI,CAAC,kBAAkB;AACf,cAAA,IAAI,MAAM,oCAAoC;AAAA,MACtD;AAEA,UAAI,SAAS;AAEb,WAAI,mDAAiB,UAAS,eAAc,mDAAiB,UAAS,OAAO;AAClE,kBAAA,+CAAe,mBACpB,YAAY,cAAc,eAAe,qBAAqB,gBAAgB,YAAY,QAAQ,cAAc,KAAK,IAAI,IAAI,cAAc,QAAQ,CAAC,KACpJ,YAAY,gBAAgB,UAAU,QAAQ,WAAW;AAAA,MAAA,YACpD,mDAAiB,UAAS,QAAQ;AAC3C,iBAAS,QAAQ,gBAAgB,WAAW,QAAQ,WAAW;AAAA,MAAA,OAC1D;AACL,iBAAS,GAAG,+CAAe,MAAM,IAAI,gBAAgB,WAAW,QAAQ,WAAW;AAAA,MACrF;AAEA,YAAM,gBAAgB,MAAM,UAAU,UAAU,QAAQ;AAAA,QACtD,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,MAAM,UAAU,SAAS,YAAY;AAAA,UACrC,OAAO,UAAU,SAAS,YAAY;AAAA,QACxC;AAAA,MAAA,CACD;AAGH,gBAAU,gBAAgB;AACxB,+BAAyB,QAAQ,EAAE;AAAA,aAE5B,KAAK;AACJ,cAAA,MAAM,8BAA8B,GAAG;AAC/C,eAAS,4BAA4B;AACrC,qBAAe,OAAO;AAAA,IACxB;AAAA,EAAA;AAGI,QAAA,2BAA2B,OAAO,cAAc;AACpD,UAAM,cAAc;AACpB,QAAI,WAAW;AAEf,UAAM,eAAe,YAAY;;AAC3B,UAAA;AACF,cAAM,SAAS,MAAM,WAAW,QAAQ,gBAAgB,SAAS;AAEjE,YAAI,OAAO,cAAY,YAAO,YAAP,mBAAgB,kBAAiB;AAC5C,oBAAA,OAAO,QAAQ,eAAe;AACxC,gBAAM,qBAAqB,WAAW,OAAO,QAAQ,eAAe;AAC7D,iBAAA;AAAA,QACT;AAEA;AACA,YAAI,WAAW,aAAa;AAC1B,qBAAW,cAAc,GAAI;AAAA,QAAA,OACxB;AACL,mBAAS,8DAA8D;AACvE,yBAAe,OAAO;AAAA,QACxB;AAEO,eAAA;AAAA,eACA,KAAK;AACJ,gBAAA,MAAM,+BAA+B,GAAG;AAChD;AACA,YAAI,WAAW,aAAa;AAC1B,qBAAW,cAAc,GAAI;AAAA,QAAA,OACxB;AACL,mBAAS,6BAA6B;AACtC,yBAAe,OAAO;AAAA,QACxB;AACO,eAAA;AAAA,MACT;AAAA,IAAA;AAGF,eAAW,cAAc,GAAI;AAAA,EAAA;AAGzB,QAAA,wBAAwB,OAAO,oBAAoB;AACvD,cAAU,eAAe;AACzB,mBAAe,YAAY;AAEvB,QAAA;AACF,YAAM,WAAW,QAAQ;AAAA,QACvB,YAAY;AAAA,QACZ;AAAA,SACA,mDAAiB,cAAa;AAAA,QAC9B;AAAA,MAAA;AAGI,YAAA,qBAAqB,YAAY,IAAI,eAAe;AAAA,aACnDC,QAAO;AACN,cAAA,MAAM,8BAA8BA,MAAK;AAC3C,YAAA,qBAAqB,YAAY,IAAI,eAAe;AAAA,IAC5D;AAAA,EAAA;AAGI,QAAA,uBAAuB,OAAO,WAAW,oBAAoB;AACjE,mBAAe,SAAS;AAExB,QAAI,WAAW;AACb,gBAAU,WAAW,iBAAiB;AAAA,QACpC,SAAS,mDAAiB;AAAA,QAC1B,OAAO,+CAAe;AAAA,QACtB,QAAQ,2CAAa;AAAA,QACrB,QAAQ;AAAA,MAAA,CACT;AAAA,IACH;AAAA,EAAA;AAGI,QAAA,kBAAkB,OAAO,SAAS;AAClC,QAAA;AACI,YAAA,UAAU,UAAU,UAAU,IAAI;AACxC,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,aAChC,KAAK;AACJ,cAAA,MAAM,mBAAmB,GAAG;AAAA,IACtC;AAAA,EAAA;AAGF,QAAM,cAAc,MAAM;AACxB,mBAAe,eAAe;AAC9B,qBAAiB,IAAI;AACrB,uBAAmB,IAAI;AACvB,qBAAiB,IAAI;AACrB,cAAU,EAAE;AACZ,mBAAe,IAAI;AACnB,aAAS,EAAE;AACX,cAAU,EAAE;AAEZ,QAAI,SAAS;AACH;IACV;AAAA,EAAA;AAGF,QAAM,SAAS,MAAM;AACnB,QAAI,gBAAgB,kBAAkB;AACpC,qBAAe,eAAe;AAAA,IACrB,WAAA,gBAAgB,oBAAoB,gBAAgB,WAAW;AACxE,qBAAe,gBAAgB;AAAA,IACjC;AAAA,EAAA;AAGE,MAAA,CAAC,OAAe,QAAA;AAGlB,SAAAF,uCAAC,yBAAsB,QAAQ,cAAc,cAAc,EAAE,SAAS,gBAAgB,kBAAA,GACpF,UAAA;AAAA,IAACC,kCAAAA,IAAA,OAAA,EAAI,WAAU,+FACb,UAAAD,kCAAA;AAAA,MAAC,OAAO;AAAA,MAAP;AAAA,QACC,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,QAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,QAChC,MAAM,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,QAC/B,WAAW,wEACT,UAAU,SAAS,2BAA2B,wBAChD;AAAA,QAGA,UAAA;AAAA,UAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,8DACX,UAAA;AAAA,YAAA,gBAAgB,mBAAmB,gBAAgB,aAAa,gBAAgB,WAChFC,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,UAAAA,kCAAAA,IAAC,WAAU,EAAA,WAAU,UAAU,CAAA;AAAA,cAAA;AAAA,YACjC;AAAA,YAGFA,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,UAAAA,kCAAAA,IAAC,GAAE,EAAA,WAAU,UAAU,CAAA;AAAA,cAAA;AAAA,YACzB;AAAA,YAEAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,eACb,UAAA;AAAA,cAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,gBAACC,kCAAAA,IAAA,UAAA,EAAS,WAAU,yBAAyB,CAAA;AAAA,gBAC5CA,kCAAA,IAAA,MAAA,EAAG,WAAU,qBAAoB,UAAe,mBAAA;AAAA,gBACjDA,kCAAAA,IAAC,UAAS,EAAA,WAAU,yBAAyB,CAAA;AAAA,cAAA,GAC/C;AAAA,cACC,gBACCA,kCAAA,IAAC,KAAE,EAAA,WAAU,iDACV,UACH,cAAA;AAAA,oDAED,OAAI,EAAA,WAAU,QACb,UAACD,kCAAA,KAAA,QAAA,EAAK,WAAU,qCAAoC,UAAA;AAAA,gBAAA;AAAA,gBAChD,OAAO,OAAO,QAAQ,CAAC;AAAA,cAAA,EAAA,CAC3B,EACF,CAAA;AAAA,YAAA,GACF;AAAA,UAAA,GACF;AAAA,gDAGC,OAAI,EAAA,WAAU,qBACb,UAACA,kCAAA,KAAA,iBAAA,EAAgB,MAAK,QAEnB,UAAA;AAAA,YAAA,gBAAgB,mBACfA,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAC3B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAACC,kCAAA,IAAA,MAAA,EAAG,WAAU,0CAAyC,UAEvD,yBAAA;AAAA,kBAEAA,kCAAA;AAAA,oBAAC,OAAO;AAAA,oBAAP;AAAA,sBACC,YAAY,EAAE,OAAO,KAAK;AAAA,sBAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,sBACxB,SAAS,MAAM,mBAAmB,QAAQ;AAAA,sBAC1C,WAAU;AAAA,sBAEV,UAAAD,kCAAA,KAAC,OAAI,EAAA,WAAU,+BACb,UAAA;AAAA,wBAAAC,kCAAAA,IAAC,SAAI,WAAU,yFACb,gDAAC,QAAO,EAAA,WAAU,0BAAyB,EAC7C,CAAA;AAAA,wBACAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACb,UAAA;AAAA,0BAACC,kCAAA,IAAA,OAAA,EAAI,WAAU,iBAAgB,UAAc,kBAAA;AAAA,0BAC5CA,kCAAA,IAAA,OAAA,EAAI,WAAU,4CAA2C,UAE1D,kCAAA;AAAA,wBAAA,GACF;AAAA,wBACAA,kCAAAA,IAAC,KAAI,EAAA,WAAU,iCAAiC,CAAA;AAAA,sBAAA,GAClD;AAAA,oBAAA;AAAA,kBACF;AAAA,kBAEAA,kCAAA;AAAA,oBAAC,OAAO;AAAA,oBAAP;AAAA,sBACC,YAAY,EAAE,OAAO,KAAK;AAAA,sBAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,sBACxB,SAAS,MAAM,mBAAmB,IAAI;AAAA,sBACtC,WAAU;AAAA,sBAEV,UAAAD,kCAAA,KAAC,OAAI,EAAA,WAAU,+BACb,UAAA;AAAA,wBAAAC,kCAAAA,IAAC,SAAI,WAAU,yFACb,gDAAC,QAAO,EAAA,WAAU,0BAAyB,EAC7C,CAAA;AAAA,wBACAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACb,UAAA;AAAA,0BAACC,kCAAA,IAAA,OAAA,EAAI,WAAU,iBAAgB,UAAO,WAAA;AAAA,0BACrCA,kCAAA,IAAA,OAAA,EAAI,WAAU,4CAA2C,UAE1D,2BAAA;AAAA,wBAAA,GACF;AAAA,sBAAA,GACF;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cA/CI;AAAA,YAgDN;AAAA,YAID,gBAAgB,oBACfD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAC3B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAACC,kCAAA,IAAA,MAAA,EAAG,WAAU,0CAAyC,UAEvD,kBAAA;AAAA,kBAEC,UACEA,kCAAA,IAAA,OAAA,EAAI,WAAU,4BACb,UAAAA,sCAAC,WAAQ,WAAU,sCAAA,CAAsC,EAC3D,CAAA,0CAEC,OAAI,EAAA,WAAU,aACZ,UAAS,SAAA,IAAI,CAAC,YACbA,kCAAA;AAAA,oBAAC,OAAO;AAAA,oBAAP;AAAA,sBAEC,YAAY,EAAE,OAAO,KAAK;AAAA,sBAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,sBACxB,SAAS,MAAM,oBAAoB,OAAO;AAAA,sBAC1C,WAAU;AAAA,sBAEV,UAAAD,kCAAA,KAAC,OAAI,EAAA,WAAU,+BACZ,UAAA;AAAA,wBAAA,QAAQ,OACPC,kCAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,KAAK,QAAQ;AAAA,4BACb,KAAK,QAAQ;AAAA,4BACb,WAAU;AAAA,0BAAA;AAAA,wBAAA,IAGXA,kCAAA,IAAA,OAAA,EAAI,WAAU,oFACb,gDAAC,QAAK,EAAA,WAAU,oCACb,UAAA,QAAQ,UAAU,OAAO,CAAC,EAAE,cAC/B,CAAA,GACF;AAAA,wBAEFD,kCAAAA,KAAC,OAAI,EAAA,WAAU,oBACb,UAAA;AAAA,0BAAAC,kCAAA,IAAC,OAAI,EAAA,WAAU,iBAAiB,UAAA,QAAQ,MAAK;AAAA,gEAC5C,OAAI,EAAA,WAAU,4CACZ,UAAQ,QAAA,UAAU,eACrB;AAAA,wBAAA,GACF;AAAA,wBACAA,kCAAAA,IAAC,aAAY,EAAA,WAAU,6CAA6C,CAAA;AAAA,sBAAA,GACtE;AAAA,oBAAA;AAAA,oBA3BK,QAAQ;AAAA,kBA6BhB,CAAA,GACH;AAAA,gBAAA;AAAA,cAAA;AAAA,cAhDE;AAAA,YAkDN;AAAA,YAID,gBAAgB,oBACfA,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAE3B,UAAAA,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,mBAAmB;AAAA,oBACnB,SAAS;AAAA,oBACT;AAAA,oBACA;AAAA,kBAAA;AAAA,gBACF;AAAA,cAAA;AAAA,cAbI;AAAA,YAcN;AAAA,YAID,gBAAgB,aACfD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAC3B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,oBAACC,kCAAA,IAAA,MAAA,EAAG,WAAU,yBAAwB,UAAY,gBAAA;AAAA,oBACjDA,kCAAA,IAAA,KAAA,EAAE,WAAU,oCAAmC,UAEhD,0CAAA;AAAA,kBAAA,GACF;AAAA,kBAEC,UACCA,kCAAA,IAAC,OAAI,EAAA,WAAU,gDACb,UAAAA,sCAAC,OAAI,EAAA,KAAK,QAAQ,KAAI,mBAAkB,WAAU,YAAY,CAAA,GAChE;AAAA,kBAGD,eACCD,kCAAA,KAAC,OAAI,EAAA,WAAU,aACb,UAAA;AAAA,oBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,wDACb,UAAA;AAAA,sBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,wBAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAQ,YAAA;AAAA,wBAClEA,kCAAA,IAAA,QAAA,EAAK,WAAU,eAAe,6DAAiB,MAAK;AAAA,sBAAA,GACvD;AAAA,sBACAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,qCACb,UAAA;AAAA,wBAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAO,WAAA;AAAA,wBAClED,kCAAAA,KAAC,QAAK,EAAA,WAAU,eAAe,UAAA;AAAA,0BAAY,YAAA;AAAA,0BAAY;AAAA,0BAAE,+CAAe;AAAA,wBAAA,GAAO;AAAA,sBAAA,GACjF;AAAA,oBAAA,GACF;AAAA,oBAEAA,kCAAAA,KAAC,OAAI,EAAA,WAAU,uFACb,UAAA;AAAA,sBAACC,kCAAAA,IAAA,SAAA,EAAQ,WAAU,uBAAuB,CAAA;AAAA,sBAC1CA,kCAAAA,IAAC,UAAK,UAAsB,yBAAA,CAAA;AAAA,oBAAA,GAC9B;AAAA,kBAAA,GACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cApCE;AAAA,YAsCN;AAAA,YAID,gBAAgB,gBACfD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,gBAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,gBAChC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,SAAI,WAAU,8FACb,gDAAC,SAAQ,EAAA,WAAU,uCAAsC,EAC3D,CAAA;AAAA,yDACC,OACC,EAAA,UAAA;AAAA,oBAACA,kCAAA,IAAA,MAAA,EAAG,WAAU,wCAAuC,UAAqB,yBAAA;AAAA,oBACzEA,kCAAA,IAAA,KAAA,EAAE,WAAU,yCAAwC,UAErD,uCAAA;AAAA,kBAAA,GACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cAbI;AAAA,YAcN;AAAA,YAID,gBAAgB,aACfD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,gBAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,gBAChC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,SAAI,WAAU,gFACb,gDAAC,cAAa,EAAA,WAAU,0BAAyB,EACnD,CAAA;AAAA,yDACC,OACC,EAAA,UAAA;AAAA,oBAACA,kCAAA,IAAA,MAAA,EAAG,WAAU,wCAAuC,UAAmB,uBAAA;AAAA,oBACvEA,kCAAA,IAAA,KAAA,EAAE,WAAU,yCAAwC,UAErD,gDAAA;AAAA,kBAAA,GACF;AAAA,kBAEC,gDACE,OAAI,EAAA,WAAU,8CACb,UAACD,kCAAAA,KAAA,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,oBAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAY,gBAAA;AAAA,oBACvED,kCAAAA,KAAC,OAAI,EAAA,WAAU,+BACb,UAAA;AAAA,sBAACA,kCAAAA,KAAA,QAAA,EAAK,WAAU,qBACb,UAAA;AAAA,wBAAO,OAAA,MAAM,GAAG,CAAC;AAAA,wBAAE;AAAA,wBAAI,OAAO,MAAM,EAAE;AAAA,sBAAA,GACzC;AAAA,sBACAC,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,SAAS,MAAM,gBAAgB,MAAM;AAAA,0BACrC,WAAU;AAAA,0BAEV,UAAAA,kCAAAA,IAAC,MAAK,EAAA,WAAU,UAAU,CAAA;AAAA,wBAAA;AAAA,sBAC5B;AAAA,uBACC,mDAAiB,gBAChBA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAM,GAAG,gBAAgB,WAAW,OAAO,MAAM;AAAA,0BACjD,QAAO;AAAA,0BACP,KAAI;AAAA,0BACJ,WAAU;AAAA,0BAEV,UAAAA,kCAAAA,IAAC,cAAa,EAAA,WAAU,UAAU,CAAA;AAAA,wBAAA;AAAA,sBACpC;AAAA,oBAAA,GAEJ;AAAA,kBAAA,EAAA,CACF,EACF,CAAA;AAAA,kBAGFA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAAS;AAAA,sBACT,WAAU;AAAA,sBACX,UAAA;AAAA,oBAAA;AAAA,kBAED;AAAA,gBAAA;AAAA,cAAA;AAAA,cAjDI;AAAA,YAkDN;AAAA,YAID,gBAAgB,WACfD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEC,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,gBAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,gBAChC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,SAAI,WAAU,8EACb,gDAAC,aAAY,EAAA,WAAU,wBAAuB,EAChD,CAAA;AAAA,yDACC,OACC,EAAA,UAAA;AAAA,oBAACA,kCAAA,IAAA,MAAA,EAAG,WAAU,sCAAqC,UAAc,kBAAA;AAAA,oBAChEA,kCAAA,IAAA,KAAA,EAAE,WAAU,yCACV,mBAAS,2CACZ;AAAA,kBAAA,GACF;AAAA,kBAEAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACb,UAAA;AAAA,oBAAAC,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,SAAS,MAAM;AACb,yCAAe,eAAe;AAC9B,mCAAS,EAAE;AAAA,wBACb;AAAA,wBACA,WAAU;AAAA,wBACX,UAAA;AAAA,sBAAA;AAAA,oBAED;AAAA,oBACAA,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,SAAS;AAAA,wBACT,WAAU;AAAA,wBACX,UAAA;AAAA,sBAAA;AAAA,oBAED;AAAA,kBAAA,GACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cA/BI;AAAA,YAgCN;AAAA,UAAA,EAAA,CAEJ,EACF,CAAA;AAAA,gDAGC,OAAI,EAAA,WAAU,uEACb,UAACD,kCAAA,KAAA,KAAA,EAAE,WAAU,yBAAwB,UAAA;AAAA,YAAA;AAAA,YACvBC,kCAAA,IAAA,QAAA,EAAK,WAAU,gCAA+B,UAAO,WAAA;AAAA,UAAA,EAAA,CACnE,EACF,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,0CAEC,aAAY,EAAA;AAAA,EACf,EAAA,CAAA;AAEJ;ACvxBA,MAAM,iBAAiB,cAAc,IAAI;AAElC,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,IAAI;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,CAAA,CAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,EAAE;AAEnD,QAAA,cAAc,CAAC,QAAQ,sBAAsB;AACjD,qBAAiB,MAAM;AACvB,QAAI,mBAAmB;AACrB,mBAAa,iBAAiB;AAAA,IAChC;AACA,cAAU,IAAI;AAAA,EAAA;AAGhB,QAAM,eAAe,MAAM;AACzB,cAAU,KAAK;AACf,qBAAiB,IAAI;AACrB,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ;AAAA,IACpB;AAAA,EAAA;AAGF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,EAAA;AAGF,SACGD,kCAAAA,KAAA,eAAe,UAAf,EAAwB,OAAO,cAC7B,UAAA;AAAA,IAAA;AAAA,IACA,UAAU,iBACTC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,UAAU;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EAEJ,EAAA,CAAA;AAEJ;AAEa,MAAA,kBAAkB,WAAW,CACxC;AAAA,EACE,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,0BAA0B,CAAC;AAC7B,GACA,QACG;AACG,QAAA,UAAU,WAAW,cAAc;AAEzC,MAAI,CAAC,SAAS;AACN,UAAA,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEM,QAAA,EAAE,aAAa,aAAiB,IAAA;AAEhC,QAAA,OAAO,CAAC,WAAW;AACnB,QAAA;AACF,UAAI,OAAO;AACD,gBAAA,IAAI,yCAAyC,MAAM;AAAA,MAC7D;AAEA,UAAI,CAAC,OAAO,UAAU,OAAO,UAAU,GAAG;AAClC,cAAA,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAEA,YAAM,cAAc;AAAA,QAClB,GAAG;AAAA,QACH,eAAe,OAAO,iBAAiB;AAAA,QACvC,yBAAyB;AAAA,UACvB,GAAG;AAAA,UACH,GAAG,OAAO;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,UACR,GAAG,OAAO;AAAA,UACV;AAAA,UACA,iBAAiB;AAAA,QACnB;AAAA,MAAA;AAGF,YAAM,oBAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,kBAAY,aAAa,iBAAiB;AAAA,aACnC,OAAO;AACN,cAAA,MAAM,oCAAoC,KAAK;AACvD,UAAI,SAAS;AACX,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EAAA;AAGF,QAAM,QAAQ,MAAM;AACL;EAAA;AAGf,sBAAoB,KAAK,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,EACA,EAAA;AAEK,SAAA;AACT,CAAC;AAED,gBAAgB,cAAc;AAEvB,MAAM,aAAa,MAAM;AACxB,QAAA,UAAU,WAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACN,UAAA,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACO,SAAA;AACT;AAEO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,eAAe;AAAA,EACf;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,YAAY;AAErD,QAAM,UAAU,MAAM;AACX,aAAA,gBAAgB,aAAa,sBAAsB,KAAK;AAAA,EAAA,GAChE,CAAC,KAAK,CAAC;AAMV,+CACG,OAAI,EAAA,WAAW,iBAAiB,KAAK,IACnC,SACH,CAAA;AAEJ;ACtJY,MAAC,UAAU;AAGX,MAAC,QAAQ;AAAA,EACnB,cAAc,CAAC,QAAQ,WAAW,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAE/D,iBAAiB,CAAC,SAAS,aAAa,GAAG,WAAW,MAAM;AAC1D,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,QAAQ,UAAU,aAAa,SAAU,QAAO;AACpD,WAAO,GAAG,QAAQ,MAAM,GAAG,UAAU,CAAC,MAAM,QAAQ,MAAM,CAAC,QAAQ,CAAC;AAAA,EACrE;AAAA,EAED,gBAAgB,CAAC,SAAS,YAAY;AACpC,QAAI,CAAC,QAAS,QAAO;AAErB,YAAQ,QAAQ,YAAa,GAAA;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,sBAAsB,KAAK,OAAO;AAAA,MAC3C,KAAK;AACH,eAAO,qBAAqB,KAAK,OAAO;AAAA,MAC1C,KAAK;AACH,eAAO,gCAAgC,KAAK,OAAO;AAAA,MACrD;AACE,eAAO,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAED,iBAAiB,OAAO,SAAS;AAC/B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,aAAO;AAAA,IACb,QAAY;AACN,aAAO;AAAA,IACR;AAAA,EACF;AACH;AAGO,MAAM,qBAAqB,MAAM;AAAA,EACtC,YAAY,SAAS,MAAM;AACzB,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACb;AACH;AAGY,MAAC,iBAAiB;AAAA,EAC5B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AACZ;","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/PaymentAPI.js","../src/CoinleyPayment.jsx","../src/CoinleyProvider.jsx","../src/index.js"],"sourcesContent":["/**\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/PaymentAPI.js\r\nimport axios from 'axios';\r\n\r\nexport class PaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n\r\n this.api = axios.create({\r\n baseURL: baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add request interceptor\r\n this.api.interceptors.request.use(\r\n (config) => {\r\n config.headers['X-API-Key'] = this.apiKey;\r\n config.headers['X-API-Secret'] = this.apiSecret;\r\n \r\n const token = this.generateMerchantToken();\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n console.log('API Request:', {\r\n method: config.method?.toUpperCase(),\r\n url: config.url,\r\n data: config.data\r\n });\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('Request interceptor error:', error);\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Add response interceptor\r\n this.api.interceptors.response.use(\r\n (response) => {\r\n console.log('API Response:', {\r\n status: response.status,\r\n url: response.config.url,\r\n data: response.data\r\n });\r\n return response;\r\n },\r\n (error) => {\r\n console.error('API Error:', {\r\n status: error.response?.status,\r\n data: error.response?.data,\r\n message: error.message\r\n });\r\n\r\n if (error.response?.status === 401) {\r\n throw new Error('Authentication failed. Please check your API credentials.');\r\n } else if (error.response?.status === 404) {\r\n throw new Error('API endpoint not found. Please check your API URL.');\r\n } else if (error.response?.status >= 500) {\r\n throw new Error('Server error. Please try again later.');\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n generateMerchantToken() {\r\n try {\r\n const credentials = `${this.apiKey}:${this.apiSecret}`;\r\n return btoa(credentials);\r\n } catch (error) {\r\n console.error('Failed to generate token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async createPayment(params) {\r\n try {\r\n const response = await this.api.post('/api/payments/create', params);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to create payment');\r\n }\r\n }\r\n\r\n async getPayment(paymentId) {\r\n try {\r\n const response = await this.api.get(`/api/payments/${paymentId}`);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to get payment details');\r\n }\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n const response = await this.api.get('/api/networks');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get networks failed:', error);\r\n \r\n // Return fallback networks\r\n return {\r\n networks: [\r\n {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n chainId: '1',\r\n type: 'ethereum',\r\n explorerUrl: 'https://etherscan.io',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'bsc',\r\n name: 'Binance Smart Chain',\r\n shortName: 'bsc',\r\n chainId: '56',\r\n type: 'bsc',\r\n explorerUrl: 'https://bscscan.com',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'polygon',\r\n name: 'Polygon',\r\n shortName: 'polygon',\r\n chainId: '137',\r\n type: 'ethereum',\r\n explorerUrl: 'https://polygonscan.com',\r\n isTestnet: false,\r\n },\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getStablecoins() {\r\n try {\r\n const response = await this.api.get('/api/networks/stablecoins');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get stablecoins failed:', error);\r\n \r\n // Return fallback stablecoins\r\n return {\r\n stablecoins: [\r\n {\r\n id: 'usdt-eth',\r\n name: 'Tether USD',\r\n symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n },\r\n {\r\n id: 'usdc-eth',\r\n name: 'USD Coin',\r\n symbol: 'USDC',\r\n contractAddress: '0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n try {\r\n const response = await this.api.post('/api/payments/verify-qr', {\r\n paymentId\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to verify payment');\r\n }\r\n }\r\n\r\n async processPayment(paymentId, transactionHash, network, senderAddress) {\r\n try {\r\n const response = await this.api.post('/api/payments/process', {\r\n paymentId,\r\n transactionHash,\r\n network,\r\n senderAddress\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to process payment');\r\n }\r\n }\r\n\r\n async healthCheck() {\r\n try {\r\n const response = await this.api.get('/api/health');\r\n return response.status === 200;\r\n } catch (error) {\r\n console.error('Health check failed:', error);\r\n return false;\r\n }\r\n }\r\n}","//src/CoinleyPayment.jsx\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n Wallet,\r\n QrCode,\r\n ChevronDown,\r\n Copy,\r\n Check,\r\n X,\r\n ArrowLeft,\r\n Loader2,\r\n ExternalLink,\r\n AlertCircle,\r\n CheckCircle2,\r\n Zap,\r\n Sparkles\r\n} from 'lucide-react';\r\n// import QRCodeLib from 'qrcode';\r\nimport {\r\n createCoinleyWalletConfig,\r\n CoinleyWalletProvider,\r\n ConnectButton,\r\n WalletModal,\r\n useWallet,\r\n useWalletConnect,\r\n useWalletTransaction,\r\n useWalletModal,\r\n useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\nimport { PaymentAPI } from './PaymentAPI';\r\n\r\n// Wallet Integration Component\r\nconst WalletIntegration = ({\r\n selectedNetwork,\r\n selectedToken,\r\n paymentData,\r\n onTransactionSent,\r\n onError,\r\n isConnecting,\r\n setIsConnecting\r\n}) => {\r\n const { isConnected, address } = useWallet();\r\n const { connectWallet, isPending } = useWalletConnect();\r\n const { detectedWallets, hasWallets, walletCount } = useWalletDetection(); // ADD THIS\r\n const { sendTransaction } = useWalletTransaction();\r\n\r\n useEffect(() => {\r\n if (isConnected && paymentData && selectedNetwork && selectedToken) {\r\n handleSendTransaction();\r\n }\r\n }, [isConnected, paymentData]);\r\n\r\n const handleConnectWallet = async () => {\r\n try {\r\n setIsConnecting(true);\r\n openModal();\r\n } catch (error) {\r\n console.error('Wallet connection failed:', error);\r\n onError(error.message || 'Failed to connect wallet');\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n const handleSendTransaction = async () => {\r\n if (!isConnected || !paymentData || !selectedToken) return;\r\n\r\n try {\r\n setIsConnecting(true);\r\n\r\n const recipientAddress = paymentData.metadata?.recipientWallet ||\r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName];\r\n \r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let txHash;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 Token Transaction\r\n const amount = (paymentData.totalAmount * Math.pow(10, selectedToken.decimals)).toString();\r\n const transferData = `0xa9059cbb${recipientAddress.slice(2).padStart(64, '0')}${parseInt(amount).toString(16).padStart(64, '0')}`;\r\n\r\n txHash = await sendTransaction({\r\n to: selectedToken.contractAddress,\r\n data: transferData,\r\n value: '0x0'\r\n });\r\n } else {\r\n // Native Token Transaction\r\n const value = (paymentData.totalAmount * Math.pow(10, 18)).toString(16);\r\n\r\n txHash = await sendTransaction({\r\n to: recipientAddress,\r\n value: `0x${value}`\r\n });\r\n }\r\n\r\n if (txHash) {\r\n onTransactionSent(txHash);\r\n }\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n onError(error.message || 'Transaction failed');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"text-center space-y-6\">\r\n <div className=\"space-y-4\">\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Wallet className=\"w-8 h-8 text-[#7042D2]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold\">\r\n {isConnected ? 'Send Payment' : `Connect Wallet (${walletCount} detected)`}\r\n </h3>\r\n {!isConnected ? (\r\n <div className=\"space-y-3\">\r\n {hasWallets ? (\r\n detectedWallets.map((wallet, index) => (\r\n <button\r\n key={index}\r\n onClick={() => connectWallet('injected')}\r\n disabled={isPending}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors\"\r\n >\r\n <span className=\"text-xl\">{wallet.icon}</span>\r\n <div className=\"text-left\">\r\n <div className=\"font-medium\">{wallet.name}</div>\r\n <div className=\"text-xs text-gray-500\">{wallet.provider}</div>\r\n </div>\r\n </button>\r\n ))\r\n ) : (\r\n <p className=\"text-gray-600\">No wallets detected. Please install MetaMask.</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-green-600 dark:text-green-400\">\r\n ✅ Wallet Connected: {address?.slice(0, 6)}...{address?.slice(-4)}\r\n </p>\r\n\r\n {paymentData && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isConnecting && (\r\n <div className=\"flex items-center justify-center space-x-2\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[#7042D2]\" />\r\n <span>Processing transaction...</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst CoinleyPayment = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n isOpen,\r\n config,\r\n theme = 'light',\r\n merchantName,\r\n debug = false\r\n}) => {\r\n // State management\r\n const [currentStep, setCurrentStep] = useState('select-method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [qrCode, setQrCode] = useState('');\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [copied, setCopied] = useState(false);\r\n const [txHash, setTxHash] = useState('');\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n // Services\r\n const paymentAPI = useRef(new PaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Wallet configuration\r\n const walletConfig = createCoinleyWalletConfig({\r\n appName: merchantName || 'Coinley Payment',\r\n appDescription: 'Crypto payment processing',\r\n chains: ['ethereum', 'polygon', 'bsc', 'arbitrum']\r\n });\r\n\r\n // Initialize\r\n useEffect(() => {\r\n if (isOpen) {\r\n initializePayment();\r\n }\r\n }, [isOpen]);\r\n\r\n const initializePayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n\r\n const [networksRes, tokensRes] = await Promise.all([\r\n paymentAPI.current.getNetworks(),\r\n paymentAPI.current.getStablecoins()\r\n ]);\r\n\r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n\r\n if (debug) {\r\n console.log('Initialized networks:', networksRes.networks);\r\n console.log('Initialized tokens:', tokensRes.stablecoins);\r\n }\r\n } catch (err) {\r\n console.error('Failed to initialize payment:', err);\r\n setError('Failed to load payment options. Please try again.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMethodSelect = (method) => {\r\n setPaymentMethod(method);\r\n setCurrentStep('select-network');\r\n };\r\n\r\n const handleNetworkSelect = async (network) => {\r\n setSelectedNetwork(network);\r\n\r\n const networkTokens = tokens.filter(token =>\r\n token.Network?.shortName === network.shortName || token.networkId === network.id\r\n );\r\n\r\n if (networkTokens.length > 0) {\r\n const preferredToken = networkTokens.find(t => t.symbol === 'USDT') || networkTokens[0];\r\n setSelectedToken(preferredToken);\r\n await initiatePayment(network, preferredToken);\r\n }\r\n };\r\n\r\n const initiatePayment = async (network, token) => {\r\n try {\r\n setLoading(true);\r\n\r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: token.symbol,\r\n network: network.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n paymentMethod,\r\n selectedNetwork: network.shortName,\r\n selectedToken: token.symbol\r\n }\r\n };\r\n\r\n const payment = await paymentAPI.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n\r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet-connect');\r\n } else {\r\n await generateQRCode(payment.payment);\r\n setCurrentStep('qr-code');\r\n }\r\n } catch (err) {\r\n console.error('Payment initiation failed:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setCurrentStep('error');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const generateQRCode = async (payment) => {\r\n try {\r\n const recipientAddress = payment.metadata?.recipientWallet ||\r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName || ''];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let qrData = '';\r\n\r\n if (selectedNetwork?.type === 'ethereum' || selectedNetwork?.type === 'bsc') {\r\n qrData = selectedToken?.contractAddress\r\n ? `ethereum:${selectedToken.contractAddress}/transfer?address=${recipientAddress}&uint256=${payment.totalAmount * Math.pow(10, selectedToken.decimals)}`\r\n : `ethereum:${recipientAddress}?value=${payment.totalAmount}e18`;\r\n } else if (selectedNetwork?.type === 'tron') {\r\n qrData = `tron:${recipientAddress}?amount=${payment.totalAmount}`;\r\n } else {\r\n qrData = `${selectedToken?.symbol}:${recipientAddress}?amount=${payment.totalAmount}`;\r\n }\r\n\r\n const qrCodeDataURL = await QRCodeLib.toDataURL(qrData, {\r\n width: 256,\r\n margin: 2,\r\n color: {\r\n dark: theme === 'dark' ? '#FFFFFF' : '#000000',\r\n light: theme === 'dark' ? '#000000' : '#FFFFFF'\r\n }\r\n });\r\n\r\n // setQrCode(qrCodeDataURL);\r\n setQrCode(recipientAddress);\r\n startPaymentVerification(payment.id);\r\n\r\n } catch (err) {\r\n console.error('QR code generation failed:', err);\r\n setError('Failed to generate QR code');\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const startPaymentVerification = async (paymentId) => {\r\n const maxAttempts = 60;\r\n let attempts = 0;\r\n\r\n const checkPayment = async () => {\r\n try {\r\n const result = await paymentAPI.current.verifyQRPayment(paymentId);\r\n\r\n if (result.verified && result.payment?.transactionHash) {\r\n setTxHash(result.payment.transactionHash);\r\n await handlePaymentSuccess(paymentId, result.payment.transactionHash);\r\n return true;\r\n }\r\n\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification timeout. Please check your transaction.');\r\n setCurrentStep('error');\r\n }\r\n\r\n return false;\r\n } catch (err) {\r\n console.error('Payment verification error:', err);\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification failed');\r\n setCurrentStep('error');\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n setTimeout(checkPayment, 2000);\r\n };\r\n\r\n const handleTransactionSent = async (transactionHash) => {\r\n setTxHash(transactionHash);\r\n setCurrentStep('processing');\r\n\r\n try {\r\n await paymentAPI.current.processPayment(\r\n paymentData.id,\r\n transactionHash,\r\n selectedNetwork?.shortName || '',\r\n ''\r\n );\r\n\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n } catch (error) {\r\n console.error('Payment processing failed:', error);\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n }\r\n };\r\n\r\n const handlePaymentSuccess = async (paymentId, transactionHash) => {\r\n setCurrentStep('success');\r\n\r\n if (onSuccess) {\r\n onSuccess(paymentId, transactionHash, {\r\n network: selectedNetwork?.name,\r\n token: selectedToken?.symbol,\r\n amount: paymentData?.totalAmount,\r\n method: paymentMethod\r\n });\r\n }\r\n };\r\n\r\n const copyToClipboard = async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setCurrentStep('select-method');\r\n setPaymentMethod(null);\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setQrCode('');\r\n setPaymentData(null);\r\n setError('');\r\n setTxHash('');\r\n\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const goBack = () => {\r\n if (currentStep === 'select-network') {\r\n setCurrentStep('select-method');\r\n } else if (currentStep === 'wallet-connect' || currentStep === 'qr-code') {\r\n setCurrentStep('select-network');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <CoinleyWalletProvider config={walletConfig} walletConfig={{ appName: merchantName || 'Coinley Payment' }}>\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm\">\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n className={`relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden ${theme === 'dark' ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'\r\n }`}\r\n >\r\n {/* Header */}\r\n <div className=\"relative p-6 border-b border-gray-200 dark:border-gray-700\">\r\n {(currentStep !== 'select-method' && currentStep !== 'success' && currentStep !== 'error') && (\r\n <button\r\n onClick={goBack}\r\n className=\"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n\r\n <div className=\"text-center\">\r\n <div className=\"flex items-center justify-center space-x-2 mb-2\">\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n <h2 className=\"text-xl font-bold\">Pay with Crypto</h2>\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n </div>\r\n {merchantName && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\r\n {merchantName}\r\n </p>\r\n )}\r\n <div className=\"mt-2\">\r\n <span className=\"text-2xl font-bold text-[#7042D2]\">\r\n ${config.amount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 min-h-[400px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {/* Step 1: Select Payment Method */}\r\n {currentStep === 'select-method' && (\r\n <motion.div\r\n key=\"select-method\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Choose Payment Method\r\n </h3>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('wallet')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <Wallet className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">Connect Wallet</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n MetaMask, WalletConnect & more\r\n </div>\r\n </div>\r\n <Zap className=\"w-5 h-5 text-[#7042D2] ml-auto\" />\r\n </div>\r\n </motion.button>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('qr')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <QrCode className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">QR Code</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n Scan with mobile wallet\r\n </div>\r\n </div>\r\n </div>\r\n </motion.button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'select-network' && (\r\n <motion.div\r\n key=\"select-network\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Network\r\n </h3>\r\n\r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {networks.map((network) => (\r\n <motion.button\r\n key={network.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleNetworkSelect(network)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {network.logo ? (\r\n <img\r\n src={network.logo}\r\n alt={network.name}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {network.shortName.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{network.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {network.shortName.toUpperCase()}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))}\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Wallet Connect */}\r\n {currentStep === 'wallet-connect' && (\r\n <motion.div\r\n key=\"wallet-connect\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n >\r\n <WalletIntegration\r\n selectedNetwork={selectedNetwork}\r\n selectedToken={selectedToken}\r\n paymentData={paymentData}\r\n onTransactionSent={handleTransactionSent}\r\n onError={setError}\r\n isConnecting={isConnecting}\r\n setIsConnecting={setIsConnecting}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {/* QR Code */}\r\n {currentStep === 'qr-code' && (\r\n <motion.div\r\n key=\"qr-code\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Use your mobile wallet to scan and pay\r\n </p>\r\n </div>\r\n\r\n {qrCode && (\r\n <div className=\"bg-white p-4 rounded-xl mx-auto inline-block\">\r\n <img src={qrCode} alt=\"Payment QR Code\" className=\"w-48 h-48\" />\r\n </div>\r\n )}\r\n\r\n {paymentData && (\r\n <div className=\"space-y-3\">\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Waiting for payment...</span>\r\n </div>\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Processing */}\r\n {currentStep === 'processing' && (\r\n <motion.div\r\n key=\"processing\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[#7042D2]\">Processing Payment...</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your transaction is being processed\r\n </p>\r\n </div>\r\n </motion.div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <motion.div\r\n key=\"success\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <CheckCircle2 className=\"w-8 h-8 text-green-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-green-600\">Payment Successful!</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your payment has been processed successfully\r\n </p>\r\n </div>\r\n\r\n {txHash && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Transaction:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {txHash.slice(0, 6)}...{txHash.slice(-4)}\r\n </span>\r\n <button\r\n onClick={() => copyToClipboard(txHash)}\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {selectedNetwork?.explorerUrl && (\r\n <a\r\n href={`${selectedNetwork.explorerUrl}/tx/${txHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Error */}\r\n {currentStep === 'error' && (\r\n <motion.div\r\n key=\"error\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto\">\r\n <AlertCircle className=\"w-8 h-8 text-red-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-red-600\">Payment Failed</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {error || 'Something went wrong. Please try again.'}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => {\r\n setCurrentStep('select-method');\r\n setError('');\r\n }}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center\">\r\n <p className=\"text-xs text-gray-500\">\r\n Powered by <span className=\"font-semibold text-[#7042D2]\">Coinley</span>\r\n </p>\r\n </div>\r\n </motion.div>\r\n </div>\r\n\r\n <WalletModal />\r\n </CoinleyWalletProvider>\r\n );\r\n};\r\n\r\nexport default CoinleyPayment;","//src/CoinleyProvider.jsx\r\nimport React, { createContext, useContext, useRef, forwardRef, useImperativeHandle } from 'react';\r\nimport CoinleyPayment from './CoinleyPayment';\r\n\r\nconst CoinleyContext = createContext(null);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n theme = 'light',\r\n debug = false,\r\n children\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [paymentConfig, setPaymentConfig] = React.useState(null);\r\n const [callbacks, setCallbacks] = React.useState({});\r\n const [merchantName, setMerchantName] = React.useState('');\r\n\r\n const openPayment = (config, checkoutCallbacks) => {\r\n setPaymentConfig(config);\r\n if (checkoutCallbacks) {\r\n setCallbacks(checkoutCallbacks);\r\n }\r\n setIsOpen(true);\r\n };\r\n\r\n const closePayment = () => {\r\n setIsOpen(false);\r\n setPaymentConfig(null);\r\n if (callbacks.onClose) {\r\n callbacks.onClose();\r\n }\r\n };\r\n\r\n const contextValue = {\r\n openPayment,\r\n closePayment\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={contextValue}>\r\n {children}\r\n {isOpen && paymentConfig && (\r\n <CoinleyPayment\r\n apiKey={apiKey}\r\n apiSecret={apiSecret}\r\n apiUrl={apiUrl}\r\n isOpen={isOpen}\r\n config={paymentConfig}\r\n theme={theme}\r\n debug={debug}\r\n merchantName={merchantName}\r\n onSuccess={callbacks.onSuccess}\r\n onError={callbacks.onError}\r\n onClose={closePayment}\r\n />\r\n )}\r\n </CoinleyContext.Provider>\r\n );\r\n};\r\n\r\nexport const CoinleyCheckout = forwardRef((\r\n {\r\n customerEmail = '',\r\n merchantName = '',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme = 'light',\r\n autoOpen = false,\r\n testMode = false,\r\n debug = false,\r\n merchantWalletAddresses = {}\r\n },\r\n ref\r\n) => {\r\n const context = useContext(CoinleyContext);\r\n\r\n if (!context) {\r\n throw new Error('CoinleyCheckout must be used within a CoinleyProvider');\r\n }\r\n\r\n const { openPayment, closePayment } = context;\r\n\r\n const open = (config) => {\r\n try {\r\n if (debug) {\r\n console.log('Opening Coinley checkout with config:', config);\r\n }\r\n\r\n if (!config.amount || config.amount <= 0) {\r\n throw new Error('Amount must be greater than 0');\r\n }\r\n\r\n const finalConfig = {\r\n ...config,\r\n customerEmail: config.customerEmail || customerEmail,\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...config.merchantWalletAddresses\r\n },\r\n metadata: {\r\n ...config.metadata,\r\n testMode,\r\n checkoutVersion: '1.0.0'\r\n }\r\n };\r\n\r\n const checkoutCallbacks = {\r\n onSuccess,\r\n onError,\r\n onClose\r\n };\r\n\r\n openPayment(finalConfig, checkoutCallbacks);\r\n } catch (error) {\r\n console.error('Failed to open Coinley checkout:', error);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n closePayment();\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n open,\r\n close\r\n }));\r\n\r\n return null;\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport const useCoinley = () => {\r\n const context = useContext(CoinleyContext);\r\n if (!context) {\r\n throw new Error('useCoinley must be used within a CoinleyProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ThemeProvider = ({\r\n initialTheme = 'light',\r\n children\r\n}) => {\r\n const [theme, setTheme] = React.useState(initialTheme);\r\n\r\n React.useEffect(() => {\r\n document.documentElement.setAttribute('data-coinley-theme', theme);\r\n }, [theme]);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n return (\r\n <div className={`coinley-theme-${theme}`}>\r\n {children}\r\n </div>\r\n );\r\n};","// Main SDK exports\r\nexport {\r\n CoinleyProvider,\r\n CoinleyCheckout,\r\n ThemeProvider,\r\n useCoinley\r\n} from './CoinleyProvider';\r\n\r\nexport { PaymentAPI } from './PaymentAPI';\r\nexport { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.0';\r\n\r\n// Utils\r\nexport const utils = {\r\n formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n if (!address) return '';\r\n if (address.length <= startChars + endChars) return address;\r\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n },\r\n\r\n isValidAddress: (address, network) => {\r\n if (!address) return false;\r\n \r\n switch (network.toLowerCase()) {\r\n case 'ethereum':\r\n case 'bsc':\r\n case 'polygon':\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n case 'tron':\r\n return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n case 'solana':\r\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n default:\r\n return address.length > 0;\r\n }\r\n },\r\n\r\n copyToClipboard: async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n};\r\n\r\n// Error classes\r\nexport class CoinleyError extends Error {\r\n constructor(message, code) {\r\n super(message);\r\n this.name = 'CoinleyError';\r\n this.code = code;\r\n }\r\n}\r\n\r\n// Default config\r\nexport const DEFAULT_CONFIG = {\r\n theme: 'light',\r\n debug: false,\r\n testMode: false,\r\n autoOpen: false\r\n};"],"names":["require$$0","jsxRuntimeModule","config","jsxs","jsx","error"],"mappings":";;;;;;;;;;;;;;;;AASa,IAAI,IAAEA,OAAiB,IAAE,OAAO,IAAI,eAAe,GAAE,IAAE,OAAO,IAAI,gBAAgB,GAAE,IAAE,OAAO,UAAU,gBAAe,IAAE,EAAE,mDAAmD,mBAAkB,IAAE,EAAC,KAAI,MAAG,KAAI,MAAG,QAAO,MAAG,UAAS,KAAE;AAClP,SAAS,EAAE,GAAE,GAAE,GAAE;AAAC,MAAI,GAAE,IAAE,IAAG,IAAE,MAAK,IAAE;AAAK,aAAS,MAAI,IAAE,KAAG;AAAG,aAAS,EAAE,QAAM,IAAE,KAAG,EAAE;AAAK,aAAS,EAAE,QAAM,IAAE,EAAE;AAAK,OAAI,KAAK,EAAE,GAAE,KAAK,GAAE,CAAC,KAAG,CAAC,EAAE,eAAe,CAAC,MAAI,EAAE,CAAC,IAAE,EAAE,CAAC;AAAG,MAAG,KAAG,EAAE,aAAa,MAAI,KAAK,IAAE,EAAE,cAAa,EAAE,YAAS,EAAE,CAAC,MAAI,EAAE,CAAC,IAAE,EAAE,CAAC;AAAG,SAAM,EAAC,UAAS,GAAE,MAAK,GAAE,KAAI,GAAE,KAAI,GAAE,OAAM,GAAE,QAAO,EAAE,QAAO;AAAC;0CAAkB;AAAa,+BAAA,MAAC;AAAE,+BAAA,OAAa;ACR/T;AAClCC,aAAA,UAAUD;AACnB;;ACDO,MAAM,WAAW;AAAA,EACtB,YAAY,SAAS,QAAQ,WAAW;AACtC,SAAK,SAAS;AACd,SAAK,YAAY;AAEjB,SAAK,MAAM,MAAM,OAAO;AAAA,MACtB,SAAS,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAAA,MACxD,SAAS;AAAA,MACT,SAAS;AAAA,QACP,gBAAgB;AAAA,MACjB;AAAA,IACP,CAAK;AAGD,SAAK,IAAI,aAAa,QAAQ;AAAA,MAC5B,CAACE,YAAW;;AACV,QAAAA,QAAO,QAAQ,WAAW,IAAI,KAAK;AACnC,QAAAA,QAAO,QAAQ,cAAc,IAAI,KAAK;AAEtC,cAAM,QAAQ,KAAK;AACnB,YAAI,OAAO;AACT,UAAAA,QAAO,QAAQ,eAAe,IAAI,UAAU,KAAK;AAAA,QAClD;AAED,gBAAQ,IAAI,gBAAgB;AAAA,UAC1B,SAAQ,KAAAA,QAAO,WAAP,mBAAe;AAAA,UACvB,KAAKA,QAAO;AAAA,UACZ,MAAMA,QAAO;AAAA,QACvB,CAAS;AAED,eAAOA;AAAA,MACR;AAAA,MACD,CAAC,UAAU;AACT,gBAAQ,MAAM,8BAA8B,KAAK;AACjD,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC5B;AAAA,IACP;AAGI,SAAK,IAAI,aAAa,SAAS;AAAA,MAC7B,CAAC,aAAa;AACZ,gBAAQ,IAAI,iBAAiB;AAAA,UAC3B,QAAQ,SAAS;AAAA,UACjB,KAAK,SAAS,OAAO;AAAA,UACrB,MAAM,SAAS;AAAA,QACzB,CAAS;AACD,eAAO;AAAA,MACR;AAAA,MACD,CAAC,UAAU;;AACT,gBAAQ,MAAM,cAAc;AAAA,UAC1B,SAAQ,WAAM,aAAN,mBAAgB;AAAA,UACxB,OAAM,WAAM,aAAN,mBAAgB;AAAA,UACtB,SAAS,MAAM;AAAA,QACzB,CAAS;AAED,cAAI,WAAM,aAAN,mBAAgB,YAAW,KAAK;AAClC,gBAAM,IAAI,MAAM,2DAA2D;AAAA,QAC5E,aAAU,WAAM,aAAN,mBAAgB,YAAW,KAAK;AACzC,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACrE,aAAU,WAAM,aAAN,mBAAgB,WAAU,KAAK;AACxC,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACxD;AAED,cAAM;AAAA,MACP;AAAA,IACP;AAAA,EACG;AAAA,EAED,wBAAwB;AACtB,QAAI;AACF,YAAM,cAAc,GAAG,KAAK,MAAM,IAAI,KAAK,SAAS;AACpD,aAAO,KAAK,WAAW;AAAA,IACxB,SAAQ,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,aAAO;AAAA,IACR;AAAA,EACF;AAAA,EAED,MAAM,cAAc,QAAQ;;AAC1B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,KAAK,wBAAwB,MAAM;AACnE,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,0BAA0B;AAAA,IAC5D;AAAA,EACF;AAAA,EAED,MAAM,WAAW,WAAW;;AAC1B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,iBAAiB,SAAS,EAAE;AAChE,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,+BAA+B;AAAA,IACjE;AAAA,EACF;AAAA,EAED,MAAM,cAAc;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,eAAe;AACnD,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAG3C,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,UACZ;AAAA,UACD;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,UACZ;AAAA,UACD;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,UACZ;AAAA,QACF;AAAA,MACT;AAAA,IACK;AAAA,EACF;AAAA,EAED,MAAM,iBAAiB;AACrB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,2BAA2B;AAC/D,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAG9C,aAAO;AAAA,QACL,aAAa;AAAA,UACX;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,cAAc;AAAA,YACd,WAAW;AAAA,YACX,SAAS;AAAA,cACP,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,WAAW;AAAA,cACX,MAAM;AAAA,YACP;AAAA,UACF;AAAA,UACD;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,cAAc;AAAA,YACd,WAAW;AAAA,YACX,SAAS;AAAA,cACP,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,WAAW;AAAA,cACX,MAAM;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACT;AAAA,IACK;AAAA,EACF;AAAA,EAED,MAAM,gBAAgB,WAAW;;AAC/B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,KAAK,2BAA2B;AAAA,QAC9D;AAAA,MACR,CAAO;AACD,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,0BAA0B;AAAA,IAC5D;AAAA,EACF;AAAA,EAED,MAAM,eAAe,WAAW,iBAAiB,SAAS,eAAe;;AACvE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,KAAK,yBAAyB;AAAA,QAC5D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACR,CAAO;AACD,aAAO,SAAS;AAAA,IACjB,SAAQ,OAAO;AACd,WAAI,iBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,OAAO;AAC/B,cAAM,IAAI,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,MAC1C;AACD,YAAM,IAAI,MAAM,MAAM,WAAW,2BAA2B;AAAA,IAC7D;AAAA,EACF;AAAA,EAED,MAAM,cAAc;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,aAAa;AACjD,aAAO,SAAS,WAAW;AAAA,IAC5B,SAAQ,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAC3C,aAAO;AAAA,IACR;AAAA,EACF;AACH;ACvMA,MAAM,oBAAoB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,EAAE,aAAa,QAAQ,IAAI,UAAU;AAC3C,QAAM,EAAE,eAAe,UAAU,IAAI,iBAAiB;AACtD,QAAM,EAAE,iBAAiB,YAAY,gBAAgB,mBAAmB;AAClE,QAAA,EAAE,oBAAoB;AAE5B,YAAU,MAAM;AACR,QAAA,eAAe,eAAe,mBAAmB,eAAe;AAC1C;IAC1B;AAAA,EAAA,GACD,CAAC,aAAa,WAAW,CAAC;AAa7B,QAAM,wBAAwB,YAAY;;AACtC,QAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAe;AAEhD,QAAA;AACA,sBAAgB,IAAI;AAEpB,YAAM,qBAAmB,iBAAY,aAAZ,mBAAsB,sBAC3C,YAAO,4BAAP,mBAAiC,mDAAiB;AAEtD,UAAI,CAAC,kBAAkB;AACb,cAAA,IAAI,MAAM,oCAAoC;AAAA,MACxD;AAEI,UAAA;AAEJ,UAAI,cAAc,iBAAiB;AAEzB,cAAA,UAAU,YAAY,cAAc,KAAK,IAAI,IAAI,cAAc,QAAQ,GAAG,SAAS;AACnF,cAAA,eAAe,aAAa,iBAAiB,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,SAAS,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AAE/H,iBAAS,MAAM,gBAAgB;AAAA,UAC3B,IAAI,cAAc;AAAA,UAClB,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACV;AAAA,MAAA,OACE;AAEG,cAAA,SAAS,YAAY,cAAc,KAAK,IAAI,IAAI,EAAE,GAAG,SAAS,EAAE;AAEtE,iBAAS,MAAM,gBAAgB;AAAA,UAC3B,IAAI;AAAA,UACJ,OAAO,KAAK,KAAK;AAAA,QAAA,CACpB;AAAA,MACL;AAEA,UAAI,QAAQ;AACR,0BAAkB,MAAM;AAAA,MAC5B;AAAA,aACK,OAAO;AACJ,cAAA,MAAM,uBAAuB,KAAK;AAClC,cAAA,MAAM,WAAW,oBAAoB;AAAA,IAAA,UAC/C;AACE,sBAAgB,KAAK;AAAA,IACzB;AAAA,EAAA;AAGJ,+CACK,OAAI,EAAA,WAAU,yBACX,UAACC,kCAAA,KAAA,OAAA,EAAI,WAAU,aACX,UAAA;AAAA,IAAAC,kCAAAA,IAAC,SAAI,WAAU,8FACX,gDAAC,QAAO,EAAA,WAAU,0BAAyB,EAC/C,CAAA;AAAA,IACAA,kCAAAA,IAAC,QAAG,WAAU,yBACT,wBAAc,iBAAiB,mBAAmB,WAAW,aAClE,CAAA;AAAA,IACC,CAAC,cACEA,kCAAA,IAAC,OAAI,EAAA,WAAU,aACV,UAAA,aACG,gBAAgB,IAAI,CAAC,QAAQ,UACzBD,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,SAAS,MAAM,cAAc,UAAU;AAAA,QACvC,UAAU;AAAA,QACV,WAAU;AAAA,QAEV,UAAA;AAAA,UAAAC,kCAAA,IAAC,QAAK,EAAA,WAAU,WAAW,UAAA,OAAO,MAAK;AAAA,UACvCD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACX,UAAA;AAAA,YAAAC,kCAAA,IAAC,OAAI,EAAA,WAAU,eAAe,UAAA,OAAO,MAAK;AAAA,YACzCA,kCAAA,IAAA,OAAA,EAAI,WAAU,yBAAyB,iBAAO,UAAS;AAAA,UAAA,GAC5D;AAAA,QAAA;AAAA,MAAA;AAAA,MATK;AAAA,IAAA,CAWZ,IAEAA,kCAAA,IAAA,KAAA,EAAE,WAAU,iBAAgB,UAA6C,gDAAA,CAAA,EAElF,CAAA,IAEAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACX,UAAA;AAAA,MAACA,kCAAAA,KAAA,KAAA,EAAE,WAAU,sCAAqC,UAAA;AAAA,QAAA;AAAA,QACzB,mCAAS,MAAM,GAAG;AAAA,QAAG;AAAA,QAAI,mCAAS,MAAM;AAAA,MAAE,GACnE;AAAA,MAEC,eACGA,kCAAA,KAAC,OAAI,EAAA,WAAU,wDACX,UAAA;AAAA,QAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,qCACX,UAAA;AAAA,UAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAO,WAAA;AAAA,UAClED,kCAAAA,KAAC,QAAK,EAAA,WAAU,eAAe,UAAA;AAAA,YAAY,YAAA;AAAA,YAAY;AAAA,YAAE,+CAAe;AAAA,UAAA,GAAO;AAAA,QAAA,GACnF;AAAA,QACAA,kCAAAA,KAAC,OAAI,EAAA,WAAU,qCACX,UAAA;AAAA,UAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAQ,YAAA;AAAA,UAClEA,kCAAA,IAAA,QAAA,EAAK,WAAU,eAAe,6DAAiB,MAAK;AAAA,QAAA,GACzD;AAAA,MAAA,GACJ;AAAA,MAGH,gBACGD,kCAAA,KAAC,OAAI,EAAA,WAAU,8CACX,UAAA;AAAA,QAACC,kCAAAA,IAAA,SAAA,EAAQ,WAAU,sCAAsC,CAAA;AAAA,QACzDA,kCAAAA,IAAC,UAAK,UAAyB,4BAAA,CAAA;AAAA,MAAA,GACnC;AAAA,IAAA,GAER;AAAA,EAAA,EAER,CAAA,EACJ,CAAA;AAER;AAEA,MAAM,iBAAiB,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAF;AAAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,QAAQ;AACZ,MAAM;AAEF,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,eAAe;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAE,CAAA;AAC3C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAE,CAAA;AACvC,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,IAAI;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AACvD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AACvD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,IAAI;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAGtD,QAAM,aAAa,OAAO,IAAI,WAAW,QAAQ,QAAQ,SAAS,CAAC;AAGnE,QAAM,eAAe,0BAA0B;AAAA,IAC3C,SAAS,gBAAgB;AAAA,IACzB,gBAAgB;AAAA,IAChB,QAAQ,CAAC,YAAY,WAAW,OAAO,UAAU;AAAA,EAAA,CACpD;AAGD,YAAU,MAAM;AACZ,QAAI,QAAQ;AACU;IACtB;AAAA,EAAA,GACD,CAAC,MAAM,CAAC;AAEX,QAAM,oBAAoB,YAAY;AAC9B,QAAA;AACA,iBAAW,IAAI;AACf,eAAS,EAAE;AAEX,YAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/C,WAAW,QAAQ,YAAY;AAAA,QAC/B,WAAW,QAAQ,eAAe;AAAA,MAAA,CACrC;AAEW,kBAAA,YAAY,YAAY,CAAA,CAAE;AAC5B,gBAAA,UAAU,eAAe,CAAA,CAAE;AAErC,UAAI,OAAO;AACC,gBAAA,IAAI,yBAAyB,YAAY,QAAQ;AACjD,gBAAA,IAAI,uBAAuB,UAAU,WAAW;AAAA,MAC5D;AAAA,aACK,KAAK;AACF,cAAA,MAAM,iCAAiC,GAAG;AAClD,eAAS,mDAAmD;AAAA,IAAA,UAC9D;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EAAA;AAGE,QAAA,qBAAqB,CAAC,WAAW;AACnC,qBAAiB,MAAM;AACvB,mBAAe,gBAAgB;AAAA,EAAA;AAG7B,QAAA,sBAAsB,OAAO,YAAY;AAC3C,uBAAmB,OAAO;AAE1B,UAAM,gBAAgB,OAAO;AAAA,MAAO,CAAA,UAAA;;AAChC,4BAAM,YAAN,mBAAe,eAAc,QAAQ,aAAa,MAAM,cAAc,QAAQ;AAAA;AAAA,IAAA;AAG9E,QAAA,cAAc,SAAS,GAAG;AACpB,YAAA,iBAAiB,cAAc,KAAK,CAAA,MAAK,EAAE,WAAW,MAAM,KAAK,cAAc,CAAC;AACtF,uBAAiB,cAAc;AACzB,YAAA,gBAAgB,SAAS,cAAc;AAAA,IACjD;AAAA,EAAA;AAGE,QAAA,kBAAkB,OAAO,SAAS,UAAU;AAC1C,QAAA;AACA,iBAAW,IAAI;AAEf,YAAM,iBAAiB;AAAA,QACnB,QAAQA,QAAO;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,eAAeA,QAAO;AAAA,QACtB,aAAaA,QAAO;AAAA,QACpB,UAAU;AAAA,UACN,GAAGA,QAAO;AAAA,UACV;AAAA,UACA,iBAAiB,QAAQ;AAAA,UACzB,eAAe,MAAM;AAAA,QACzB;AAAA,MAAA;AAGJ,YAAM,UAAU,MAAM,WAAW,QAAQ,cAAc,cAAc;AACrE,qBAAe,QAAQ,OAAO;AAE9B,UAAI,kBAAkB,UAAU;AAC5B,uBAAe,gBAAgB;AAAA,MAAA,OAC5B;AACG,cAAA,eAAe,QAAQ,OAAO;AACpC,uBAAe,SAAS;AAAA,MAC5B;AAAA,aACK,KAAK;AACF,cAAA,MAAM,8BAA8B,GAAG;AACtC,eAAA,IAAI,WAAW,0BAA0B;AAClD,qBAAe,OAAO;AAAA,IAAA,UACxB;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EAAA;AAGE,QAAA,iBAAiB,OAAO,YAAY;;AAClC,QAAA;AACM,YAAA,qBAAmB,aAAQ,aAAR,mBAAkB,sBACvCA,aAAO,4BAAPA,oBAAiC,mDAAiB,cAAa;AAEnE,UAAI,CAAC,kBAAkB;AACb,cAAA,IAAI,MAAM,oCAAoC;AAAA,MACxD;AAEA,UAAI,SAAS;AAEb,WAAI,mDAAiB,UAAS,eAAc,mDAAiB,UAAS,OAAO;AAChE,kBAAA,+CAAe,mBAClB,YAAY,cAAc,eAAe,qBAAqB,gBAAgB,YAAY,QAAQ,cAAc,KAAK,IAAI,IAAI,cAAc,QAAQ,CAAC,KACpJ,YAAY,gBAAgB,UAAU,QAAQ,WAAW;AAAA,MAAA,YACxD,mDAAiB,UAAS,QAAQ;AACzC,iBAAS,QAAQ,gBAAgB,WAAW,QAAQ,WAAW;AAAA,MAAA,OAC5D;AACH,iBAAS,GAAG,+CAAe,MAAM,IAAI,gBAAgB,WAAW,QAAQ,WAAW;AAAA,MACvF;AAEA,YAAM,gBAAgB,MAAM,UAAU,UAAU,QAAQ;AAAA,QACpD,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,UACH,MAAM,UAAU,SAAS,YAAY;AAAA,UACrC,OAAO,UAAU,SAAS,YAAY;AAAA,QAC1C;AAAA,MAAA,CACH;AAGD,gBAAU,gBAAgB;AAC1B,+BAAyB,QAAQ,EAAE;AAAA,aAE9B,KAAK;AACF,cAAA,MAAM,8BAA8B,GAAG;AAC/C,eAAS,4BAA4B;AACrC,qBAAe,OAAO;AAAA,IAC1B;AAAA,EAAA;AAGE,QAAA,2BAA2B,OAAO,cAAc;AAClD,UAAM,cAAc;AACpB,QAAI,WAAW;AAEf,UAAM,eAAe,YAAY;;AACzB,UAAA;AACA,cAAM,SAAS,MAAM,WAAW,QAAQ,gBAAgB,SAAS;AAEjE,YAAI,OAAO,cAAY,YAAO,YAAP,mBAAgB,kBAAiB;AAC1C,oBAAA,OAAO,QAAQ,eAAe;AACxC,gBAAM,qBAAqB,WAAW,OAAO,QAAQ,eAAe;AAC7D,iBAAA;AAAA,QACX;AAEA;AACA,YAAI,WAAW,aAAa;AACxB,qBAAW,cAAc,GAAI;AAAA,QAAA,OAC1B;AACH,mBAAS,8DAA8D;AACvE,yBAAe,OAAO;AAAA,QAC1B;AAEO,eAAA;AAAA,eACF,KAAK;AACF,gBAAA,MAAM,+BAA+B,GAAG;AAChD;AACA,YAAI,WAAW,aAAa;AACxB,qBAAW,cAAc,GAAI;AAAA,QAAA,OAC1B;AACH,mBAAS,6BAA6B;AACtC,yBAAe,OAAO;AAAA,QAC1B;AACO,eAAA;AAAA,MACX;AAAA,IAAA;AAGJ,eAAW,cAAc,GAAI;AAAA,EAAA;AAG3B,QAAA,wBAAwB,OAAO,oBAAoB;AACrD,cAAU,eAAe;AACzB,mBAAe,YAAY;AAEvB,QAAA;AACA,YAAM,WAAW,QAAQ;AAAA,QACrB,YAAY;AAAA,QACZ;AAAA,SACA,mDAAiB,cAAa;AAAA,QAC9B;AAAA,MAAA;AAGE,YAAA,qBAAqB,YAAY,IAAI,eAAe;AAAA,aACrDG,QAAO;AACJ,cAAA,MAAM,8BAA8BA,MAAK;AAC3C,YAAA,qBAAqB,YAAY,IAAI,eAAe;AAAA,IAC9D;AAAA,EAAA;AAGE,QAAA,uBAAuB,OAAO,WAAW,oBAAoB;AAC/D,mBAAe,SAAS;AAExB,QAAI,WAAW;AACX,gBAAU,WAAW,iBAAiB;AAAA,QAClC,SAAS,mDAAiB;AAAA,QAC1B,OAAO,+CAAe;AAAA,QACtB,QAAQ,2CAAa;AAAA,QACrB,QAAQ;AAAA,MAAA,CACX;AAAA,IACL;AAAA,EAAA;AAGE,QAAA,kBAAkB,OAAO,SAAS;AAChC,QAAA;AACM,YAAA,UAAU,UAAU,UAAU,IAAI;AACxC,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,aAClC,KAAK;AACF,cAAA,MAAM,mBAAmB,GAAG;AAAA,IACxC;AAAA,EAAA;AAGJ,QAAM,cAAc,MAAM;AACtB,mBAAe,eAAe;AAC9B,qBAAiB,IAAI;AACrB,uBAAmB,IAAI;AACvB,qBAAiB,IAAI;AACrB,cAAU,EAAE;AACZ,mBAAe,IAAI;AACnB,aAAS,EAAE;AACX,cAAU,EAAE;AAEZ,QAAI,SAAS;AACD;IACZ;AAAA,EAAA;AAGJ,QAAM,SAAS,MAAM;AACjB,QAAI,gBAAgB,kBAAkB;AAClC,qBAAe,eAAe;AAAA,IACvB,WAAA,gBAAgB,oBAAoB,gBAAgB,WAAW;AACtE,qBAAe,gBAAgB;AAAA,IACnC;AAAA,EAAA;AAGA,MAAA,CAAC,OAAe,QAAA;AAGhB,SAAAF,uCAAC,yBAAsB,QAAQ,cAAc,cAAc,EAAE,SAAS,gBAAgB,kBAAA,GAClF,UAAA;AAAA,IAACC,kCAAAA,IAAA,OAAA,EAAI,WAAU,+FACX,UAAAD,kCAAA;AAAA,MAAC,OAAO;AAAA,MAAP;AAAA,QACG,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,QAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,QAChC,MAAM,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,QAC/B,WAAW,wEAAwE,UAAU,SAAS,2BAA2B,wBAC7H;AAAA,QAGJ,UAAA;AAAA,UAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,8DACT,UAAA;AAAA,YAAA,gBAAgB,mBAAmB,gBAAgB,aAAa,gBAAgB,WAC9EC,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,UAAAA,kCAAAA,IAAC,WAAU,EAAA,WAAU,UAAU,CAAA;AAAA,cAAA;AAAA,YACnC;AAAA,YAGJA,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,UAAAA,kCAAAA,IAAC,GAAE,EAAA,WAAU,UAAU,CAAA;AAAA,cAAA;AAAA,YAC3B;AAAA,YAEAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,eACX,UAAA;AAAA,cAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,mDACX,UAAA;AAAA,gBAACC,kCAAAA,IAAA,UAAA,EAAS,WAAU,yBAAyB,CAAA;AAAA,gBAC5CA,kCAAA,IAAA,MAAA,EAAG,WAAU,qBAAoB,UAAe,mBAAA;AAAA,gBACjDA,kCAAAA,IAAC,UAAS,EAAA,WAAU,yBAAyB,CAAA;AAAA,cAAA,GACjD;AAAA,cACC,gBACGA,kCAAA,IAAC,KAAE,EAAA,WAAU,iDACR,UACL,cAAA;AAAA,oDAEH,OAAI,EAAA,WAAU,QACX,UAACD,kCAAA,KAAA,QAAA,EAAK,WAAU,qCAAoC,UAAA;AAAA,gBAAA;AAAA,gBAC9CD,QAAO,OAAO,QAAQ,CAAC;AAAA,cAAA,EAAA,CAC7B,EACJ,CAAA;AAAA,YAAA,GACJ;AAAA,UAAA,GACJ;AAAA,gDAGC,OAAI,EAAA,WAAU,qBACX,UAACC,kCAAA,KAAA,iBAAA,EAAgB,MAAK,QAEjB,UAAA;AAAA,YAAA,gBAAgB,mBACbA,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAC3B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAACC,kCAAA,IAAA,MAAA,EAAG,WAAU,0CAAyC,UAEvD,yBAAA;AAAA,kBAEAA,kCAAA;AAAA,oBAAC,OAAO;AAAA,oBAAP;AAAA,sBACG,YAAY,EAAE,OAAO,KAAK;AAAA,sBAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,sBACxB,SAAS,MAAM,mBAAmB,QAAQ;AAAA,sBAC1C,WAAU;AAAA,sBAEV,UAAAD,kCAAA,KAAC,OAAI,EAAA,WAAU,+BACX,UAAA;AAAA,wBAAAC,kCAAAA,IAAC,SAAI,WAAU,yFACX,gDAAC,QAAO,EAAA,WAAU,0BAAyB,EAC/C,CAAA;AAAA,wBACAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACX,UAAA;AAAA,0BAACC,kCAAA,IAAA,OAAA,EAAI,WAAU,iBAAgB,UAAc,kBAAA;AAAA,0BAC5CA,kCAAA,IAAA,OAAA,EAAI,WAAU,4CAA2C,UAE1D,kCAAA;AAAA,wBAAA,GACJ;AAAA,wBACAA,kCAAAA,IAAC,KAAI,EAAA,WAAU,iCAAiC,CAAA;AAAA,sBAAA,GACpD;AAAA,oBAAA;AAAA,kBACJ;AAAA,kBAEAA,kCAAA;AAAA,oBAAC,OAAO;AAAA,oBAAP;AAAA,sBACG,YAAY,EAAE,OAAO,KAAK;AAAA,sBAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,sBACxB,SAAS,MAAM,mBAAmB,IAAI;AAAA,sBACtC,WAAU;AAAA,sBAEV,UAAAD,kCAAA,KAAC,OAAI,EAAA,WAAU,+BACX,UAAA;AAAA,wBAAAC,kCAAAA,IAAC,SAAI,WAAU,yFACX,gDAAC,QAAO,EAAA,WAAU,0BAAyB,EAC/C,CAAA;AAAA,wBACAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACX,UAAA;AAAA,0BAACC,kCAAA,IAAA,OAAA,EAAI,WAAU,iBAAgB,UAAO,WAAA;AAAA,0BACrCA,kCAAA,IAAA,OAAA,EAAI,WAAU,4CAA2C,UAE1D,2BAAA;AAAA,wBAAA,GACJ;AAAA,sBAAA,GACJ;AAAA,oBAAA;AAAA,kBACJ;AAAA,gBAAA;AAAA,cAAA;AAAA,cA/CI;AAAA,YAgDR;AAAA,YAIH,gBAAgB,oBACbD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAC3B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAACC,kCAAA,IAAA,MAAA,EAAG,WAAU,0CAAyC,UAEvD,kBAAA;AAAA,kBAEC,UACIA,kCAAA,IAAA,OAAA,EAAI,WAAU,4BACX,UAAAA,sCAAC,WAAQ,WAAU,sCAAA,CAAsC,EAC7D,CAAA,0CAEC,OAAI,EAAA,WAAU,aACV,UAAS,SAAA,IAAI,CAAC,YACXA,kCAAA;AAAA,oBAAC,OAAO;AAAA,oBAAP;AAAA,sBAEG,YAAY,EAAE,OAAO,KAAK;AAAA,sBAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,sBACxB,SAAS,MAAM,oBAAoB,OAAO;AAAA,sBAC1C,WAAU;AAAA,sBAEV,UAAAD,kCAAA,KAAC,OAAI,EAAA,WAAU,+BACV,UAAA;AAAA,wBAAA,QAAQ,OACLC,kCAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACG,KAAK,QAAQ;AAAA,4BACb,KAAK,QAAQ;AAAA,4BACb,WAAU;AAAA,0BAAA;AAAA,wBAAA,IAGbA,kCAAA,IAAA,OAAA,EAAI,WAAU,oFACX,gDAAC,QAAK,EAAA,WAAU,oCACX,UAAA,QAAQ,UAAU,OAAO,CAAC,EAAE,cACjC,CAAA,GACJ;AAAA,wBAEJD,kCAAAA,KAAC,OAAI,EAAA,WAAU,oBACX,UAAA;AAAA,0BAAAC,kCAAA,IAAC,OAAI,EAAA,WAAU,iBAAiB,UAAA,QAAQ,MAAK;AAAA,gEAC5C,OAAI,EAAA,WAAU,4CACV,UAAQ,QAAA,UAAU,eACvB;AAAA,wBAAA,GACJ;AAAA,wBACAA,kCAAAA,IAAC,aAAY,EAAA,WAAU,6CAA6C,CAAA;AAAA,sBAAA,GACxE;AAAA,oBAAA;AAAA,oBA3BK,QAAQ;AAAA,kBA6BpB,CAAA,GACL;AAAA,gBAAA;AAAA,cAAA;AAAA,cAhDA;AAAA,YAkDR;AAAA,YAIH,gBAAgB,oBACbA,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAE3B,UAAAA,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACG;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,mBAAmB;AAAA,oBACnB,SAAS;AAAA,oBACT;AAAA,oBACA;AAAA,kBAAA;AAAA,gBACJ;AAAA,cAAA;AAAA,cAbI;AAAA,YAcR;AAAA,YAIH,gBAAgB,aACbD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE;AAAA,gBAC7B,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,gBAC5B,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,gBAC3B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,aACX,UAAA;AAAA,oBAACC,kCAAA,IAAA,MAAA,EAAG,WAAU,yBAAwB,UAAY,gBAAA;AAAA,oBACjDA,kCAAA,IAAA,KAAA,EAAE,WAAU,oCAAmC,UAEhD,0CAAA;AAAA,kBAAA,GACJ;AAAA,kBAEC,UACGA,kCAAA,IAAC,OAAI,EAAA,WAAU,gDACX,UAAAA,sCAAC,OAAI,EAAA,KAAK,QAAQ,KAAI,mBAAkB,WAAU,YAAY,CAAA,GAClE;AAAA,kBAGH,eACGD,kCAAA,KAAC,OAAI,EAAA,WAAU,aACX,UAAA;AAAA,oBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,wDACX,UAAA;AAAA,sBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,qCACX,UAAA;AAAA,wBAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAQ,YAAA;AAAA,wBAClEA,kCAAA,IAAA,QAAA,EAAK,WAAU,eAAe,6DAAiB,MAAK;AAAA,sBAAA,GACzD;AAAA,sBACAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,qCACX,UAAA;AAAA,wBAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAO,WAAA;AAAA,wBAClED,kCAAAA,KAAC,QAAK,EAAA,WAAU,eAAe,UAAA;AAAA,0BAAY,YAAA;AAAA,0BAAY;AAAA,0BAAE,+CAAe;AAAA,wBAAA,GAAO;AAAA,sBAAA,GACnF;AAAA,oBAAA,GACJ;AAAA,oBAEAA,kCAAAA,KAAC,OAAI,EAAA,WAAU,uFACX,UAAA;AAAA,sBAACC,kCAAAA,IAAA,SAAA,EAAQ,WAAU,uBAAuB,CAAA;AAAA,sBAC1CA,kCAAAA,IAAC,UAAK,UAAsB,yBAAA,CAAA;AAAA,oBAAA,GAChC;AAAA,kBAAA,GACJ;AAAA,gBAAA;AAAA,cAAA;AAAA,cApCA;AAAA,YAsCR;AAAA,YAIH,gBAAgB,gBACbD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,gBAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,gBAChC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,SAAI,WAAU,8FACX,gDAAC,SAAQ,EAAA,WAAU,uCAAsC,EAC7D,CAAA;AAAA,yDACC,OACG,EAAA,UAAA;AAAA,oBAACA,kCAAA,IAAA,MAAA,EAAG,WAAU,wCAAuC,UAAqB,yBAAA;AAAA,oBACzEA,kCAAA,IAAA,KAAA,EAAE,WAAU,yCAAwC,UAErD,uCAAA;AAAA,kBAAA,GACJ;AAAA,gBAAA;AAAA,cAAA;AAAA,cAbI;AAAA,YAcR;AAAA,YAIH,gBAAgB,aACbD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,gBAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,gBAChC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,SAAI,WAAU,gFACX,gDAAC,cAAa,EAAA,WAAU,0BAAyB,EACrD,CAAA;AAAA,yDACC,OACG,EAAA,UAAA;AAAA,oBAACA,kCAAA,IAAA,MAAA,EAAG,WAAU,wCAAuC,UAAmB,uBAAA;AAAA,oBACvEA,kCAAA,IAAA,KAAA,EAAE,WAAU,yCAAwC,UAErD,gDAAA;AAAA,kBAAA,GACJ;AAAA,kBAEC,gDACI,OAAI,EAAA,WAAU,8CACX,UAACD,kCAAAA,KAAA,OAAA,EAAI,WAAU,qCACX,UAAA;AAAA,oBAACC,kCAAA,IAAA,QAAA,EAAK,WAAU,4CAA2C,UAAY,gBAAA;AAAA,oBACvED,kCAAAA,KAAC,OAAI,EAAA,WAAU,+BACX,UAAA;AAAA,sBAACA,kCAAAA,KAAA,QAAA,EAAK,WAAU,qBACX,UAAA;AAAA,wBAAO,OAAA,MAAM,GAAG,CAAC;AAAA,wBAAE;AAAA,wBAAI,OAAO,MAAM,EAAE;AAAA,sBAAA,GAC3C;AAAA,sBACAC,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACG,SAAS,MAAM,gBAAgB,MAAM;AAAA,0BACrC,WAAU;AAAA,0BAEV,UAAAA,kCAAAA,IAAC,MAAK,EAAA,WAAU,UAAU,CAAA;AAAA,wBAAA;AAAA,sBAC9B;AAAA,uBACC,mDAAiB,gBACdA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACG,MAAM,GAAG,gBAAgB,WAAW,OAAO,MAAM;AAAA,0BACjD,QAAO;AAAA,0BACP,KAAI;AAAA,0BACJ,WAAU;AAAA,0BAEV,UAAAA,kCAAAA,IAAC,cAAa,EAAA,WAAU,UAAU,CAAA;AAAA,wBAAA;AAAA,sBACtC;AAAA,oBAAA,GAER;AAAA,kBAAA,EAAA,CACJ,EACJ,CAAA;AAAA,kBAGJA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACG,SAAS;AAAA,sBACT,WAAU;AAAA,sBACb,UAAA;AAAA,oBAAA;AAAA,kBAED;AAAA,gBAAA;AAAA,cAAA;AAAA,cAjDI;AAAA,YAkDR;AAAA,YAIH,gBAAgB,WACbD,kCAAA;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,SAAS,EAAE,OAAO,KAAK,SAAS,EAAE;AAAA,gBAClC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,gBAChC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,SAAI,WAAU,8EACX,gDAAC,aAAY,EAAA,WAAU,wBAAuB,EAClD,CAAA;AAAA,yDACC,OACG,EAAA,UAAA;AAAA,oBAACA,kCAAA,IAAA,MAAA,EAAG,WAAU,sCAAqC,UAAc,kBAAA;AAAA,oBAChEA,kCAAA,IAAA,KAAA,EAAE,WAAU,yCACR,mBAAS,2CACd;AAAA,kBAAA,GACJ;AAAA,kBAEAD,kCAAAA,KAAC,OAAI,EAAA,WAAU,aACX,UAAA;AAAA,oBAAAC,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACG,SAAS,MAAM;AACX,yCAAe,eAAe;AAC9B,mCAAS,EAAE;AAAA,wBACf;AAAA,wBACA,WAAU;AAAA,wBACb,UAAA;AAAA,sBAAA;AAAA,oBAED;AAAA,oBACAA,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACG,SAAS;AAAA,wBACT,WAAU;AAAA,wBACb,UAAA;AAAA,sBAAA;AAAA,oBAED;AAAA,kBAAA,GACJ;AAAA,gBAAA;AAAA,cAAA;AAAA,cA/BI;AAAA,YAgCR;AAAA,UAAA,EAAA,CAER,EACJ,CAAA;AAAA,gDAGC,OAAI,EAAA,WAAU,uEACX,UAACD,kCAAA,KAAA,KAAA,EAAE,WAAU,yBAAwB,UAAA;AAAA,YAAA;AAAA,YACrBC,kCAAA,IAAA,QAAA,EAAK,WAAU,gCAA+B,UAAO,WAAA;AAAA,UAAA,EAAA,CACrE,EACJ,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAER;AAAA,0CAEC,aAAY,EAAA;AAAA,EACjB,EAAA,CAAA;AAER;ACxxBA,MAAM,iBAAiB,cAAc,IAAI;AAElC,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,IAAI;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,CAAA,CAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,EAAE;AAEnD,QAAA,cAAc,CAACF,SAAQ,sBAAsB;AACjD,qBAAiBA,OAAM;AACvB,QAAI,mBAAmB;AACrB,mBAAa,iBAAiB;AAAA,IAChC;AACA,cAAU,IAAI;AAAA,EAAA;AAGhB,QAAM,eAAe,MAAM;AACzB,cAAU,KAAK;AACf,qBAAiB,IAAI;AACrB,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ;AAAA,IACpB;AAAA,EAAA;AAGF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,EAAA;AAGF,SACGC,kCAAAA,KAAA,eAAe,UAAf,EAAwB,OAAO,cAC7B,UAAA;AAAA,IAAA;AAAA,IACA,UAAU,iBACTC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,UAAU;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EAEJ,EAAA,CAAA;AAEJ;AAEa,MAAA,kBAAkB,WAAW,CACxC;AAAA,EACE,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,0BAA0B,CAAC;AAC7B,GACA,QACG;AACG,QAAA,UAAU,WAAW,cAAc;AAEzC,MAAI,CAAC,SAAS;AACN,UAAA,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEM,QAAA,EAAE,aAAa,aAAiB,IAAA;AAEhC,QAAA,OAAO,CAACF,YAAW;AACnB,QAAA;AACF,UAAI,OAAO;AACD,gBAAA,IAAI,yCAAyCA,OAAM;AAAA,MAC7D;AAEA,UAAI,CAACA,QAAO,UAAUA,QAAO,UAAU,GAAG;AAClC,cAAA,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAEA,YAAM,cAAc;AAAA,QAClB,GAAGA;AAAA,QACH,eAAeA,QAAO,iBAAiB;AAAA,QACvC,yBAAyB;AAAA,UACvB,GAAG;AAAA,UACH,GAAGA,QAAO;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,UACR,GAAGA,QAAO;AAAA,UACV;AAAA,UACA,iBAAiB;AAAA,QACnB;AAAA,MAAA;AAGF,YAAM,oBAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,kBAAY,aAAa,iBAAiB;AAAA,aACnC,OAAO;AACN,cAAA,MAAM,oCAAoC,KAAK;AACvD,UAAI,SAAS;AACX,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EAAA;AAGF,QAAM,QAAQ,MAAM;AACL;EAAA;AAGf,sBAAoB,KAAK,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,EACA,EAAA;AAEK,SAAA;AACT,CAAC;AAED,gBAAgB,cAAc;AAEvB,MAAM,aAAa,MAAM;AACxB,QAAA,UAAU,WAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACN,UAAA,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACO,SAAA;AACT;AAEO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,eAAe;AAAA,EACf;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,YAAY;AAErD,QAAM,UAAU,MAAM;AACX,aAAA,gBAAgB,aAAa,sBAAsB,KAAK;AAAA,EAAA,GAChE,CAAC,KAAK,CAAC;AAMV,+CACG,OAAI,EAAA,WAAW,iBAAiB,KAAK,IACnC,SACH,CAAA;AAEJ;ACtJY,MAAC,UAAU;AAGX,MAAC,QAAQ;AAAA,EACnB,cAAc,CAAC,QAAQ,WAAW,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAE/D,iBAAiB,CAAC,SAAS,aAAa,GAAG,WAAW,MAAM;AAC1D,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,QAAQ,UAAU,aAAa,SAAU,QAAO;AACpD,WAAO,GAAG,QAAQ,MAAM,GAAG,UAAU,CAAC,MAAM,QAAQ,MAAM,CAAC,QAAQ,CAAC;AAAA,EACrE;AAAA,EAED,gBAAgB,CAAC,SAAS,YAAY;AACpC,QAAI,CAAC,QAAS,QAAO;AAErB,YAAQ,QAAQ,YAAa,GAAA;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,sBAAsB,KAAK,OAAO;AAAA,MAC3C,KAAK;AACH,eAAO,qBAAqB,KAAK,OAAO;AAAA,MAC1C,KAAK;AACH,eAAO,gCAAgC,KAAK,OAAO;AAAA,MACrD;AACE,eAAO,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAED,iBAAiB,OAAO,SAAS;AAC/B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,aAAO;AAAA,IACb,QAAY;AACN,aAAO;AAAA,IACR;AAAA,EACF;AACH;AAGO,MAAM,qBAAqB,MAAM;AAAA,EACtC,YAAY,SAAS,MAAM;AACzB,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACb;AACH;AAGY,MAAC,iBAAiB;AAAA,EAC5B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AACZ;","x_google_ignoreList":[0,1]}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("framer-motion"),require("lucide-react"),require("@coinley/wallet-connect-core"),require("axios")):"function"==typeof define&&define.amd?define(["exports","react","framer-motion","lucide-react","@coinley/wallet-connect-core","axios"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).CoinleyTest={},e.React,e.FramerMotion,e.LucideReact,e.CoinleyWalletCore,e.axios)}(this,function(e,t,a,s,r,n){"use strict";var o={exports:{}},l={},i=t,c=Symbol.for("react.element"),d=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,h=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,u={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,a){var s,r={},n=null,o=null;for(s in void 0!==a&&(n=""+a),void 0!==t.key&&(n=""+t.key),void 0!==t.ref&&(o=t.ref),t)m.call(t,s)&&!u.hasOwnProperty(s)&&(r[s]=t[s]);if(e&&e.defaultProps)for(s in t=e.defaultProps)void 0===r[s]&&(r[s]=t[s]);return{$$typeof:c,type:e,key:n,ref:o,props:r,_owner:h.current}}l.Fragment=d,l.jsx=x,l.jsxs=x,o.exports=l;var y=o.exports;class p{constructor(e,t,a){this.apiKey=t,this.apiSecret=a,this.api=n.create({baseURL:e.endsWith("/")?e.slice(0,-1):e,timeout:3e4,headers:{"Content-Type":"application/json"}}),this.api.interceptors.request.use(e=>{var t;e.headers["X-API-Key"]=this.apiKey,e.headers["X-API-Secret"]=this.apiSecret;const a=this.generateMerchantToken();return a&&(e.headers.Authorization=`Bearer ${a}`),console.log("API Request:",{method:null==(t=e.method)?void 0:t.toUpperCase(),url:e.url,data:e.data}),e},e=>(console.error("Request interceptor error:",e),Promise.reject(e))),this.api.interceptors.response.use(e=>(console.log("API Response:",{status:e.status,url:e.config.url,data:e.data}),e),e=>{var t,a,s,r,n;if(console.error("API Error:",{status:null==(t=e.response)?void 0:t.status,data:null==(a=e.response)?void 0:a.data,message:e.message}),401===(null==(s=e.response)?void 0:s.status))throw new Error("Authentication failed. Please check your API credentials.");if(404===(null==(r=e.response)?void 0:r.status))throw new Error("API endpoint not found. Please check your API URL.");if((null==(n=e.response)?void 0:n.status)>=500)throw new Error("Server error. Please try again later.");throw e})}generateMerchantToken(){try{const e=`${this.apiKey}:${this.apiSecret}`;return btoa(e)}catch(e){return console.error("Failed to generate token:",e),null}}async createPayment(e){var t,a;try{return(await this.api.post("/api/payments/create",e)).data}catch(s){if(null==(a=null==(t=s.response)?void 0:t.data)?void 0:a.error)throw new Error(s.response.data.error);throw new Error(s.message||"Failed to create payment")}}async getPayment(e){var t,a;try{return(await this.api.get(`/api/payments/${e}`)).data}catch(s){if(null==(a=null==(t=s.response)?void 0:t.data)?void 0:a.error)throw new Error(s.response.data.error);throw new Error(s.message||"Failed to get payment details")}}async getNetworks(){try{return(await this.api.get("/api/networks")).data}catch(e){return console.error("Get networks failed:",e),{networks:[{id:"ethereum",name:"Ethereum",shortName:"ethereum",chainId:"1",type:"ethereum",explorerUrl:"https://etherscan.io",isTestnet:!1},{id:"bsc",name:"Binance Smart Chain",shortName:"bsc",chainId:"56",type:"bsc",explorerUrl:"https://bscscan.com",isTestnet:!1},{id:"polygon",name:"Polygon",shortName:"polygon",chainId:"137",type:"ethereum",explorerUrl:"https://polygonscan.com",isTestnet:!1}]}}}async getStablecoins(){try{return(await this.api.get("/api/networks/stablecoins")).data}catch(e){return console.error("Get stablecoins failed:",e),{stablecoins:[{id:"usdt-eth",name:"Tether USD",symbol:"USDT",contractAddress:"0xdAC17F958D2ee523a2206206994597C13D831ec7",decimals:6,isStablecoin:!0,networkId:"ethereum",Network:{id:"ethereum",name:"Ethereum",shortName:"ethereum",type:"ethereum"}},{id:"usdc-eth",name:"USD Coin",symbol:"USDC",contractAddress:"0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6",decimals:6,isStablecoin:!0,networkId:"ethereum",Network:{id:"ethereum",name:"Ethereum",shortName:"ethereum",type:"ethereum"}}]}}}async verifyQRPayment(e){var t,a;try{return(await this.api.post("/api/payments/verify-qr",{paymentId:e})).data}catch(s){if(null==(a=null==(t=s.response)?void 0:t.data)?void 0:a.error)throw new Error(s.response.data.error);throw new Error(s.message||"Failed to verify payment")}}async processPayment(e,t,a,s){var r,n;try{return(await this.api.post("/api/payments/process",{paymentId:e,transactionHash:t,network:a,senderAddress:s})).data}catch(o){if(null==(n=null==(r=o.response)?void 0:r.data)?void 0:n.error)throw new Error(o.response.data.error);throw new Error(o.message||"Failed to process payment")}}async healthCheck(){try{return 200===(await this.api.get("/api/health")).status}catch(e){return console.error("Health check failed:",e),!1}}}const g=({selectedNetwork:e,selectedToken:a,paymentData:n,onTransactionSent:o,onError:l,isConnecting:i,setIsConnecting:c})=>{const{isConnected:d,address:m}=r.useWallet(),{connectWallet:h,isPending:u}=r.useWalletConnect(),{detectedWallets:x,hasWallets:p,walletCount:g}=r.useWalletDetection(),{sendTransaction:f}=r.useWalletTransaction();t.useEffect(()=>{d&&n&&e&&a&&w()},[d,n]);const w=async()=>{var e;if(d&&n&&a)try{c(!0);const t=null==(e=n.metadata)?void 0:e.recipientWallet;if(!t)throw new Error("Recipient wallet address not found");let s;if(a.contractAddress){const e=(n.totalAmount*Math.pow(10,a.decimals)).toString(),r=`0xa9059cbb${t.slice(2).padStart(64,"0")}${parseInt(e).toString(16).padStart(64,"0")}`;s=await f({to:a.contractAddress,data:r,value:"0x0"})}else{const e=(n.totalAmount*Math.pow(10,18)).toString(16);s=await f({to:t,value:`0x${e}`})}s&&o(s)}catch(t){console.error("Transaction failed:",t),l(t.message||"Transaction failed")}finally{c(!1)}};return y.jsx("div",{className:"text-center space-y-6",children:y.jsxs("div",{className:"space-y-4",children:[y.jsx("div",{className:"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.Wallet,{className:"w-8 h-8 text-[#7042D2]"})}),y.jsx("h3",{className:"text-lg font-semibold",children:d?"Send Payment":`Connect Wallet (${g} detected)`}),d?y.jsxs("div",{className:"space-y-4",children:[y.jsxs("p",{className:"text-green-600 dark:text-green-400",children:["✅ Wallet Connected: ",null==m?void 0:m.slice(0,6),"...",null==m?void 0:m.slice(-4)]}),n&&y.jsxs("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2",children:[y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Amount:"}),y.jsxs("span",{className:"font-medium",children:[n.totalAmount," ",null==a?void 0:a.symbol]})]}),y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Network:"}),y.jsx("span",{className:"font-medium",children:null==e?void 0:e.name})]})]}),i&&y.jsxs("div",{className:"flex items-center justify-center space-x-2",children:[y.jsx(s.Loader2,{className:"w-5 h-5 animate-spin text-[#7042D2]"}),y.jsx("span",{children:"Processing transaction..."})]})]}):y.jsx("div",{className:"space-y-3",children:p?x.map((e,t)=>y.jsxs("button",{onClick:()=>h("injected"),disabled:u,className:"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors",children:[y.jsx("span",{className:"text-xl",children:e.icon}),y.jsxs("div",{className:"text-left",children:[y.jsx("div",{className:"font-medium",children:e.name}),y.jsx("div",{className:"text-xs text-gray-500",children:e.provider})]})]},t)):y.jsx("p",{className:"text-gray-600",children:"No wallets detected. Please install MetaMask."})})]})})},f=({apiKey:e,apiSecret:n,apiUrl:o="http://localhost:9000",onSuccess:l,onError:i,onClose:c,isOpen:d,config:m,theme:h="light",merchantName:u,debug:x=!1})=>{const[f,w]=t.useState("select-method"),[b,v]=t.useState([]),[N,j]=t.useState([]),[k,C]=t.useState(null),[S,P]=t.useState(null),[E,A]=t.useState(null),[D,T]=t.useState(""),[F,$]=t.useState(null),[I,R]=t.useState(!1),[W,U]=t.useState(""),[_,M]=t.useState(!1),[L,O]=t.useState(""),[q,H]=t.useState(!1),Q=t.useRef(new p(o,e,n)),z=r.createCoinleyWalletConfig({appName:u||"Coinley Payment",appDescription:"Crypto payment processing",chains:["ethereum","polygon","bsc","arbitrum"]});t.useEffect(()=>{d&&K()},[d]);const K=async()=>{try{R(!0),U("");const[e,t]=await Promise.all([Q.current.getNetworks(),Q.current.getStablecoins()]);v(e.networks||[]),j(t.stablecoins||[]),x&&(console.log("Initialized networks:",e.networks),console.log("Initialized tokens:",t.stablecoins))}catch(e){console.error("Failed to initialize payment:",e),U("Failed to load payment options. Please try again.")}finally{R(!1)}},B=e=>{A(e),w("select-network")},G=async(e,t)=>{try{R(!0);const a={amount:m.amount,currency:t.symbol,network:e.shortName,customerEmail:m.customerEmail,callbackUrl:m.callbackUrl,metadata:{...m.metadata,paymentMethod:E,selectedNetwork:e.shortName,selectedToken:t.symbol}},s=await Q.current.createPayment(a);$(s.payment),"wallet"===E?w("wallet-connect"):(await V(s.payment),w("qr-code"))}catch(a){console.error("Payment initiation failed:",a),U(a.message||"Failed to create payment"),w("error")}finally{R(!1)}},V=async e=>{var t,a;try{const s=(null==(t=e.metadata)?void 0:t.recipientWallet)||(null==(a=m.merchantWalletAddresses)?void 0:a[(null==k?void 0:k.shortName)||""]);if(!s)throw new Error("Recipient wallet address not found");let r="";r="ethereum"===(null==k?void 0:k.type)||"bsc"===(null==k?void 0:k.type)?(null==S?void 0:S.contractAddress)?`ethereum:${S.contractAddress}/transfer?address=${s}&uint256=${e.totalAmount*Math.pow(10,S.decimals)}`:`ethereum:${s}?value=${e.totalAmount}e18`:"tron"===(null==k?void 0:k.type)?`tron:${s}?amount=${e.totalAmount}`:`${null==S?void 0:S.symbol}:${s}?amount=${e.totalAmount}`;await QRCodeLib.toDataURL(r,{width:256,margin:2,color:{dark:"dark"===h?"#FFFFFF":"#000000",light:"dark"===h?"#000000":"#FFFFFF"}});T(s),X(e.id)}catch(s){console.error("QR code generation failed:",s),U("Failed to generate QR code"),w("error")}},X=async e=>{let t=0;const a=async()=>{var s;try{const r=await Q.current.verifyQRPayment(e);return r.verified&&(null==(s=r.payment)?void 0:s.transactionHash)?(O(r.payment.transactionHash),await Y(e,r.payment.transactionHash),!0):(t++,t<60?setTimeout(a,5e3):(U("Payment verification timeout. Please check your transaction."),w("error")),!1)}catch(r){return console.error("Payment verification error:",r),t++,t<60?setTimeout(a,5e3):(U("Payment verification failed"),w("error")),!1}};setTimeout(a,2e3)},Y=async(e,t)=>{w("success"),l&&l(e,t,{network:null==k?void 0:k.name,token:null==S?void 0:S.symbol,amount:null==F?void 0:F.totalAmount,method:E})},Z=()=>{w("select-method"),A(null),C(null),P(null),T(""),$(null),U(""),O(""),c&&c()};return d?y.jsxs(r.CoinleyWalletProvider,{config:z,walletConfig:{appName:u||"Coinley Payment"},children:[y.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm",children:y.jsxs(a.motion.div,{initial:{scale:.9,opacity:0},animate:{scale:1,opacity:1},exit:{scale:.9,opacity:0},className:"relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden "+("dark"===h?"bg-gray-900 text-white":"bg-white text-gray-900"),children:[y.jsxs("div",{className:"relative p-6 border-b border-gray-200 dark:border-gray-700",children:["select-method"!==f&&"success"!==f&&"error"!==f&&y.jsx("button",{onClick:()=>{"select-network"===f?w("select-method"):"wallet-connect"!==f&&"qr-code"!==f||w("select-network")},className:"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors",children:y.jsx(s.ArrowLeft,{className:"w-5 h-5"})}),y.jsx("button",{onClick:Z,className:"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors",children:y.jsx(s.X,{className:"w-5 h-5"})}),y.jsxs("div",{className:"text-center",children:[y.jsxs("div",{className:"flex items-center justify-center space-x-2 mb-2",children:[y.jsx(s.Sparkles,{className:"w-5 h-5 text-[#7042D2]"}),y.jsx("h2",{className:"text-xl font-bold",children:"Pay with Crypto"}),y.jsx(s.Sparkles,{className:"w-5 h-5 text-[#7042D2]"})]}),u&&y.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400 mt-1",children:u}),y.jsx("div",{className:"mt-2",children:y.jsxs("span",{className:"text-2xl font-bold text-[#7042D2]",children:["$",m.amount.toFixed(2)]})})]})]}),y.jsx("div",{className:"p-6 min-h-[400px]",children:y.jsxs(a.AnimatePresence,{mode:"wait",children:["select-method"===f&&y.jsxs(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},className:"space-y-4",children:[y.jsx("h3",{className:"text-lg font-semibold text-center mb-6",children:"Choose Payment Method"}),y.jsx(a.motion.button,{whileHover:{scale:1.02},whileTap:{scale:.98},onClick:()=>B("wallet"),className:"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group",children:y.jsxs("div",{className:"flex items-center space-x-4",children:[y.jsx("div",{className:"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors",children:y.jsx(s.Wallet,{className:"w-6 h-6 text-[#7042D2]"})}),y.jsxs("div",{className:"text-left",children:[y.jsx("div",{className:"font-semibold",children:"Connect Wallet"}),y.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:"MetaMask, WalletConnect & more"})]}),y.jsx(s.Zap,{className:"w-5 h-5 text-[#7042D2] ml-auto"})]})}),y.jsx(a.motion.button,{whileHover:{scale:1.02},whileTap:{scale:.98},onClick:()=>B("qr"),className:"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group",children:y.jsxs("div",{className:"flex items-center space-x-4",children:[y.jsx("div",{className:"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors",children:y.jsx(s.QrCode,{className:"w-6 h-6 text-[#7042D2]"})}),y.jsxs("div",{className:"text-left",children:[y.jsx("div",{className:"font-semibold",children:"QR Code"}),y.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Scan with mobile wallet"})]})]})})]},"select-method"),"select-network"===f&&y.jsxs(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},className:"space-y-4",children:[y.jsx("h3",{className:"text-lg font-semibold text-center mb-6",children:"Select Network"}),I?y.jsx("div",{className:"flex justify-center py-8",children:y.jsx(s.Loader2,{className:"w-8 h-8 animate-spin text-[#7042D2]"})}):y.jsx("div",{className:"space-y-3",children:b.map(e=>y.jsx(a.motion.button,{whileHover:{scale:1.02},whileTap:{scale:.98},onClick:()=>(async e=>{C(e);const t=N.filter(t=>{var a;return(null==(a=t.Network)?void 0:a.shortName)===e.shortName||t.networkId===e.id});if(t.length>0){const a=t.find(e=>"USDT"===e.symbol)||t[0];P(a),await G(e,a)}})(e),className:"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group",children:y.jsxs("div",{className:"flex items-center space-x-4",children:[e.logo?y.jsx("img",{src:e.logo,alt:e.name,className:"w-8 h-8 rounded-full"}):y.jsx("div",{className:"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center",children:y.jsx("span",{className:"text-sm font-bold text-[#7042D2]",children:e.shortName.charAt(0).toUpperCase()})}),y.jsxs("div",{className:"text-left flex-1",children:[y.jsx("div",{className:"font-semibold",children:e.name}),y.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:e.shortName.toUpperCase()})]}),y.jsx(s.ChevronDown,{className:"w-5 h-5 text-gray-400 transform -rotate-90"})]})},e.id))})]},"select-network"),"wallet-connect"===f&&y.jsx(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},children:y.jsx(g,{selectedNetwork:k,selectedToken:S,paymentData:F,onTransactionSent:async e=>{O(e),w("processing");try{await Q.current.processPayment(F.id,e,(null==k?void 0:k.shortName)||"",""),await Y(F.id,e)}catch(t){console.error("Payment processing failed:",t),await Y(F.id,e)}},onError:U,isConnecting:q,setIsConnecting:H})},"wallet-connect"),"qr-code"===f&&y.jsxs(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},className:"text-center space-y-6",children:[y.jsxs("div",{className:"space-y-4",children:[y.jsx("h3",{className:"text-lg font-semibold",children:"Scan QR Code"}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Use your mobile wallet to scan and pay"})]}),D&&y.jsx("div",{className:"bg-white p-4 rounded-xl mx-auto inline-block",children:y.jsx("img",{src:D,alt:"Payment QR Code",className:"w-48 h-48"})}),F&&y.jsxs("div",{className:"space-y-3",children:[y.jsxs("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2",children:[y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Network:"}),y.jsx("span",{className:"font-medium",children:null==k?void 0:k.name})]}),y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Amount:"}),y.jsxs("span",{className:"font-medium",children:[F.totalAmount," ",null==S?void 0:S.symbol]})]})]}),y.jsxs("div",{className:"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400",children:[y.jsx(s.Loader2,{className:"w-4 h-4 animate-spin"}),y.jsx("span",{children:"Waiting for payment..."})]})]})]},"qr-code"),"processing"===f&&y.jsxs(a.motion.div,{initial:{scale:.8,opacity:0},animate:{scale:1,opacity:1},className:"text-center space-y-6",children:[y.jsx("div",{className:"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.Loader2,{className:"w-8 h-8 animate-spin text-[#7042D2]"})}),y.jsxs("div",{children:[y.jsx("h3",{className:"text-lg font-semibold text-[#7042D2]",children:"Processing Payment..."}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:"Your transaction is being processed"})]})]},"processing"),"success"===f&&y.jsxs(a.motion.div,{initial:{scale:.8,opacity:0},animate:{scale:1,opacity:1},className:"text-center space-y-6",children:[y.jsx("div",{className:"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.CheckCircle2,{className:"w-8 h-8 text-green-500"})}),y.jsxs("div",{children:[y.jsx("h3",{className:"text-lg font-semibold text-green-600",children:"Payment Successful!"}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:"Your payment has been processed successfully"})]}),L&&y.jsx("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-4",children:y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Transaction:"}),y.jsxs("div",{className:"flex items-center space-x-2",children:[y.jsxs("span",{className:"font-mono text-sm",children:[L.slice(0,6),"...",L.slice(-4)]}),y.jsx("button",{onClick:()=>(async e=>{try{await navigator.clipboard.writeText(e),M(!0),setTimeout(()=>M(!1),2e3)}catch(t){console.error("Failed to copy:",t)}})(L),className:"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded",children:y.jsx(s.Copy,{className:"w-4 h-4"})}),(null==k?void 0:k.explorerUrl)&&y.jsx("a",{href:`${k.explorerUrl}/tx/${L}`,target:"_blank",rel:"noopener noreferrer",className:"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded",children:y.jsx(s.ExternalLink,{className:"w-4 h-4"})})]})]})}),y.jsx("button",{onClick:Z,className:"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors",children:"Close"})]},"success"),"error"===f&&y.jsxs(a.motion.div,{initial:{scale:.8,opacity:0},animate:{scale:1,opacity:1},className:"text-center space-y-6",children:[y.jsx("div",{className:"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.AlertCircle,{className:"w-8 h-8 text-red-500"})}),y.jsxs("div",{children:[y.jsx("h3",{className:"text-lg font-semibold text-red-600",children:"Payment Failed"}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:W||"Something went wrong. Please try again."})]}),y.jsxs("div",{className:"space-y-3",children:[y.jsx("button",{onClick:()=>{w("select-method"),U("")},className:"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors",children:"Try Again"}),y.jsx("button",{onClick:Z,className:"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors",children:"Close"})]})]},"error")]})}),y.jsx("div",{className:"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center",children:y.jsxs("p",{className:"text-xs text-gray-500",children:["Powered by ",y.jsx("span",{className:"font-semibold text-[#7042D2]",children:"Coinley"})]})})]})}),y.jsx(r.WalletModal,{})]}):null},w=t.createContext(null),b=t.forwardRef(({customerEmail:e="",merchantName:a="",onSuccess:s,onError:r,onClose:n,theme:o="light",autoOpen:l=!1,testMode:i=!1,debug:c=!1,merchantWalletAddresses:d={}},m)=>{const h=t.useContext(w);if(!h)throw new Error("CoinleyCheckout must be used within a CoinleyProvider");const{openPayment:u,closePayment:x}=h,y=t=>{try{if(c&&console.log("Opening Coinley checkout with config:",t),!t.amount||t.amount<=0)throw new Error("Amount must be greater than 0");const a={...t,customerEmail:t.customerEmail||e,merchantWalletAddresses:{...d,...t.merchantWalletAddresses},metadata:{...t.metadata,testMode:i,checkoutVersion:"1.0.0"}};u(a,{onSuccess:s,onError:r,onClose:n})}catch(a){console.error("Failed to open Coinley checkout:",a),r&&r(a)}},p=()=>{x()};return t.useImperativeHandle(m,()=>({open:y,close:p})),null});b.displayName="CoinleyCheckout";const v={formatAmount:(e,t=2)=>e.toFixed(t),truncateAddress:(e,t=6,a=4)=>e?e.length<=t+a?e:`${e.slice(0,t)}...${e.slice(-a)}`:"",isValidAddress:(e,t)=>{if(!e)return!1;switch(t.toLowerCase()){case"ethereum":case"bsc":case"polygon":return/^0x[a-fA-F0-9]{40}$/.test(e);case"tron":return/^T[a-zA-Z0-9]{33}$/.test(e);case"solana":return/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(e);default:return e.length>0}},copyToClipboard:async e=>{try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}};class N extends Error{constructor(e,t){super(e),this.name="CoinleyError",this.code=t}}e.CoinleyCheckout=b,e.CoinleyError=N,e.CoinleyPayment=f,e.CoinleyProvider=({apiKey:e,apiSecret:a,apiUrl:s,theme:r="light",debug:n=!1,children:o})=>{const[l,i]=t.useState(!1),[c,d]=t.useState(null),[m,h]=t.useState({}),[u,x]=t.useState(""),p=()=>{i(!1),d(null),m.onClose&&m.onClose()},g={openPayment:(e,t)=>{d(e),t&&h(t),i(!0)},closePayment:p};return y.jsxs(w.Provider,{value:g,children:[o,l&&c&&y.jsx(f,{apiKey:e,apiSecret:a,apiUrl:s,isOpen:l,config:c,theme:r,debug:n,merchantName:u,onSuccess:m.onSuccess,onError:m.onError,onClose:p})]})},e.DEFAULT_CONFIG={theme:"light",debug:!1,testMode:!1,autoOpen:!1},e.PaymentAPI=p,e.ThemeProvider=({initialTheme:e="light",children:a})=>{const[s,r]=t.useState(e);return t.useEffect(()=>{document.documentElement.setAttribute("data-coinley-theme",s)},[s]),y.jsx("div",{className:`coinley-theme-${s}`,children:a})},e.VERSION="0.0.0",e.useCoinley=()=>{const e=t.useContext(w);if(!e)throw new Error("useCoinley must be used within a CoinleyProvider");return e},e.utils=v,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("framer-motion"),require("lucide-react"),require("@coinley/wallet-connect-core"),require("axios")):"function"==typeof define&&define.amd?define(["exports","react","framer-motion","lucide-react","@coinley/wallet-connect-core","axios"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).CoinleyTest={},e.React,e.FramerMotion,e.LucideReact,e.CoinleyWalletCore,e.axios)}(this,function(e,t,a,s,r,n){"use strict";var o={exports:{}},l={},i=t,c=Symbol.for("react.element"),d=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,h=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,u={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,a){var s,r={},n=null,o=null;for(s in void 0!==a&&(n=""+a),void 0!==t.key&&(n=""+t.key),void 0!==t.ref&&(o=t.ref),t)m.call(t,s)&&!u.hasOwnProperty(s)&&(r[s]=t[s]);if(e&&e.defaultProps)for(s in t=e.defaultProps)void 0===r[s]&&(r[s]=t[s]);return{$$typeof:c,type:e,key:n,ref:o,props:r,_owner:h.current}}l.Fragment=d,l.jsx=x,l.jsxs=x,o.exports=l;var y=o.exports;class p{constructor(e,t,a){this.apiKey=t,this.apiSecret=a,this.api=n.create({baseURL:e.endsWith("/")?e.slice(0,-1):e,timeout:3e4,headers:{"Content-Type":"application/json"}}),this.api.interceptors.request.use(e=>{var t;e.headers["X-API-Key"]=this.apiKey,e.headers["X-API-Secret"]=this.apiSecret;const a=this.generateMerchantToken();return a&&(e.headers.Authorization=`Bearer ${a}`),console.log("API Request:",{method:null==(t=e.method)?void 0:t.toUpperCase(),url:e.url,data:e.data}),e},e=>(console.error("Request interceptor error:",e),Promise.reject(e))),this.api.interceptors.response.use(e=>(console.log("API Response:",{status:e.status,url:e.config.url,data:e.data}),e),e=>{var t,a,s,r,n;if(console.error("API Error:",{status:null==(t=e.response)?void 0:t.status,data:null==(a=e.response)?void 0:a.data,message:e.message}),401===(null==(s=e.response)?void 0:s.status))throw new Error("Authentication failed. Please check your API credentials.");if(404===(null==(r=e.response)?void 0:r.status))throw new Error("API endpoint not found. Please check your API URL.");if((null==(n=e.response)?void 0:n.status)>=500)throw new Error("Server error. Please try again later.");throw e})}generateMerchantToken(){try{const e=`${this.apiKey}:${this.apiSecret}`;return btoa(e)}catch(e){return console.error("Failed to generate token:",e),null}}async createPayment(e){var t,a;try{return(await this.api.post("/api/payments/create",e)).data}catch(s){if(null==(a=null==(t=s.response)?void 0:t.data)?void 0:a.error)throw new Error(s.response.data.error);throw new Error(s.message||"Failed to create payment")}}async getPayment(e){var t,a;try{return(await this.api.get(`/api/payments/${e}`)).data}catch(s){if(null==(a=null==(t=s.response)?void 0:t.data)?void 0:a.error)throw new Error(s.response.data.error);throw new Error(s.message||"Failed to get payment details")}}async getNetworks(){try{return(await this.api.get("/api/networks")).data}catch(e){return console.error("Get networks failed:",e),{networks:[{id:"ethereum",name:"Ethereum",shortName:"ethereum",chainId:"1",type:"ethereum",explorerUrl:"https://etherscan.io",isTestnet:!1},{id:"bsc",name:"Binance Smart Chain",shortName:"bsc",chainId:"56",type:"bsc",explorerUrl:"https://bscscan.com",isTestnet:!1},{id:"polygon",name:"Polygon",shortName:"polygon",chainId:"137",type:"ethereum",explorerUrl:"https://polygonscan.com",isTestnet:!1}]}}}async getStablecoins(){try{return(await this.api.get("/api/networks/stablecoins")).data}catch(e){return console.error("Get stablecoins failed:",e),{stablecoins:[{id:"usdt-eth",name:"Tether USD",symbol:"USDT",contractAddress:"0xdAC17F958D2ee523a2206206994597C13D831ec7",decimals:6,isStablecoin:!0,networkId:"ethereum",Network:{id:"ethereum",name:"Ethereum",shortName:"ethereum",type:"ethereum"}},{id:"usdc-eth",name:"USD Coin",symbol:"USDC",contractAddress:"0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6",decimals:6,isStablecoin:!0,networkId:"ethereum",Network:{id:"ethereum",name:"Ethereum",shortName:"ethereum",type:"ethereum"}}]}}}async verifyQRPayment(e){var t,a;try{return(await this.api.post("/api/payments/verify-qr",{paymentId:e})).data}catch(s){if(null==(a=null==(t=s.response)?void 0:t.data)?void 0:a.error)throw new Error(s.response.data.error);throw new Error(s.message||"Failed to verify payment")}}async processPayment(e,t,a,s){var r,n;try{return(await this.api.post("/api/payments/process",{paymentId:e,transactionHash:t,network:a,senderAddress:s})).data}catch(o){if(null==(n=null==(r=o.response)?void 0:r.data)?void 0:n.error)throw new Error(o.response.data.error);throw new Error(o.message||"Failed to process payment")}}async healthCheck(){try{return 200===(await this.api.get("/api/health")).status}catch(e){return console.error("Health check failed:",e),!1}}}const g=({selectedNetwork:e,selectedToken:a,paymentData:n,onTransactionSent:o,onError:l,isConnecting:i,setIsConnecting:c})=>{const{isConnected:d,address:m}=r.useWallet(),{connectWallet:h,isPending:u}=r.useWalletConnect(),{detectedWallets:x,hasWallets:p,walletCount:g}=r.useWalletDetection(),{sendTransaction:f}=r.useWalletTransaction();t.useEffect(()=>{d&&n&&e&&a&&w()},[d,n]);const w=async()=>{var t,s;if(d&&n&&a)try{c(!0);const r=(null==(t=n.metadata)?void 0:t.recipientWallet)||(null==(s=config.merchantWalletAddresses)?void 0:s[null==e?void 0:e.shortName]);if(!r)throw new Error("Recipient wallet address not found");let l;if(a.contractAddress){const e=(n.totalAmount*Math.pow(10,a.decimals)).toString(),t=`0xa9059cbb${r.slice(2).padStart(64,"0")}${parseInt(e).toString(16).padStart(64,"0")}`;l=await f({to:a.contractAddress,data:t,value:"0x0"})}else{const e=(n.totalAmount*Math.pow(10,18)).toString(16);l=await f({to:r,value:`0x${e}`})}l&&o(l)}catch(r){console.error("Transaction failed:",r),l(r.message||"Transaction failed")}finally{c(!1)}};return y.jsx("div",{className:"text-center space-y-6",children:y.jsxs("div",{className:"space-y-4",children:[y.jsx("div",{className:"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.Wallet,{className:"w-8 h-8 text-[#7042D2]"})}),y.jsx("h3",{className:"text-lg font-semibold",children:d?"Send Payment":`Connect Wallet (${g} detected)`}),d?y.jsxs("div",{className:"space-y-4",children:[y.jsxs("p",{className:"text-green-600 dark:text-green-400",children:["✅ Wallet Connected: ",null==m?void 0:m.slice(0,6),"...",null==m?void 0:m.slice(-4)]}),n&&y.jsxs("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2",children:[y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Amount:"}),y.jsxs("span",{className:"font-medium",children:[n.totalAmount," ",null==a?void 0:a.symbol]})]}),y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Network:"}),y.jsx("span",{className:"font-medium",children:null==e?void 0:e.name})]})]}),i&&y.jsxs("div",{className:"flex items-center justify-center space-x-2",children:[y.jsx(s.Loader2,{className:"w-5 h-5 animate-spin text-[#7042D2]"}),y.jsx("span",{children:"Processing transaction..."})]})]}):y.jsx("div",{className:"space-y-3",children:p?x.map((e,t)=>y.jsxs("button",{onClick:()=>h("injected"),disabled:u,className:"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors",children:[y.jsx("span",{className:"text-xl",children:e.icon}),y.jsxs("div",{className:"text-left",children:[y.jsx("div",{className:"font-medium",children:e.name}),y.jsx("div",{className:"text-xs text-gray-500",children:e.provider})]})]},t)):y.jsx("p",{className:"text-gray-600",children:"No wallets detected. Please install MetaMask."})})]})})},f=({apiKey:e,apiSecret:n,apiUrl:o="http://localhost:9000",onSuccess:l,onError:i,onClose:c,isOpen:d,config:m,theme:h="light",merchantName:u,debug:x=!1})=>{const[f,w]=t.useState("select-method"),[b,v]=t.useState([]),[N,j]=t.useState([]),[k,C]=t.useState(null),[S,P]=t.useState(null),[A,E]=t.useState(null),[D,T]=t.useState(""),[F,$]=t.useState(null),[I,W]=t.useState(!1),[R,U]=t.useState(""),[_,M]=t.useState(!1),[L,O]=t.useState(""),[q,H]=t.useState(!1),Q=t.useRef(new p(o,e,n)),z=r.createCoinleyWalletConfig({appName:u||"Coinley Payment",appDescription:"Crypto payment processing",chains:["ethereum","polygon","bsc","arbitrum"]});t.useEffect(()=>{d&&K()},[d]);const K=async()=>{try{W(!0),U("");const[e,t]=await Promise.all([Q.current.getNetworks(),Q.current.getStablecoins()]);v(e.networks||[]),j(t.stablecoins||[]),x&&(console.log("Initialized networks:",e.networks),console.log("Initialized tokens:",t.stablecoins))}catch(e){console.error("Failed to initialize payment:",e),U("Failed to load payment options. Please try again.")}finally{W(!1)}},B=e=>{E(e),w("select-network")},G=async(e,t)=>{try{W(!0);const a={amount:m.amount,currency:t.symbol,network:e.shortName,customerEmail:m.customerEmail,callbackUrl:m.callbackUrl,metadata:{...m.metadata,paymentMethod:A,selectedNetwork:e.shortName,selectedToken:t.symbol}},s=await Q.current.createPayment(a);$(s.payment),"wallet"===A?w("wallet-connect"):(await V(s.payment),w("qr-code"))}catch(a){console.error("Payment initiation failed:",a),U(a.message||"Failed to create payment"),w("error")}finally{W(!1)}},V=async e=>{var t,a;try{const s=(null==(t=e.metadata)?void 0:t.recipientWallet)||(null==(a=m.merchantWalletAddresses)?void 0:a[(null==k?void 0:k.shortName)||""]);if(!s)throw new Error("Recipient wallet address not found");let r="";r="ethereum"===(null==k?void 0:k.type)||"bsc"===(null==k?void 0:k.type)?(null==S?void 0:S.contractAddress)?`ethereum:${S.contractAddress}/transfer?address=${s}&uint256=${e.totalAmount*Math.pow(10,S.decimals)}`:`ethereum:${s}?value=${e.totalAmount}e18`:"tron"===(null==k?void 0:k.type)?`tron:${s}?amount=${e.totalAmount}`:`${null==S?void 0:S.symbol}:${s}?amount=${e.totalAmount}`;await QRCodeLib.toDataURL(r,{width:256,margin:2,color:{dark:"dark"===h?"#FFFFFF":"#000000",light:"dark"===h?"#000000":"#FFFFFF"}});T(s),X(e.id)}catch(s){console.error("QR code generation failed:",s),U("Failed to generate QR code"),w("error")}},X=async e=>{let t=0;const a=async()=>{var s;try{const r=await Q.current.verifyQRPayment(e);return r.verified&&(null==(s=r.payment)?void 0:s.transactionHash)?(O(r.payment.transactionHash),await Y(e,r.payment.transactionHash),!0):(t++,t<60?setTimeout(a,5e3):(U("Payment verification timeout. Please check your transaction."),w("error")),!1)}catch(r){return console.error("Payment verification error:",r),t++,t<60?setTimeout(a,5e3):(U("Payment verification failed"),w("error")),!1}};setTimeout(a,2e3)},Y=async(e,t)=>{w("success"),l&&l(e,t,{network:null==k?void 0:k.name,token:null==S?void 0:S.symbol,amount:null==F?void 0:F.totalAmount,method:A})},Z=()=>{w("select-method"),E(null),C(null),P(null),T(""),$(null),U(""),O(""),c&&c()};return d?y.jsxs(r.CoinleyWalletProvider,{config:z,walletConfig:{appName:u||"Coinley Payment"},children:[y.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm",children:y.jsxs(a.motion.div,{initial:{scale:.9,opacity:0},animate:{scale:1,opacity:1},exit:{scale:.9,opacity:0},className:"relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden "+("dark"===h?"bg-gray-900 text-white":"bg-white text-gray-900"),children:[y.jsxs("div",{className:"relative p-6 border-b border-gray-200 dark:border-gray-700",children:["select-method"!==f&&"success"!==f&&"error"!==f&&y.jsx("button",{onClick:()=>{"select-network"===f?w("select-method"):"wallet-connect"!==f&&"qr-code"!==f||w("select-network")},className:"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors",children:y.jsx(s.ArrowLeft,{className:"w-5 h-5"})}),y.jsx("button",{onClick:Z,className:"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors",children:y.jsx(s.X,{className:"w-5 h-5"})}),y.jsxs("div",{className:"text-center",children:[y.jsxs("div",{className:"flex items-center justify-center space-x-2 mb-2",children:[y.jsx(s.Sparkles,{className:"w-5 h-5 text-[#7042D2]"}),y.jsx("h2",{className:"text-xl font-bold",children:"Pay with Crypto"}),y.jsx(s.Sparkles,{className:"w-5 h-5 text-[#7042D2]"})]}),u&&y.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400 mt-1",children:u}),y.jsx("div",{className:"mt-2",children:y.jsxs("span",{className:"text-2xl font-bold text-[#7042D2]",children:["$",m.amount.toFixed(2)]})})]})]}),y.jsx("div",{className:"p-6 min-h-[400px]",children:y.jsxs(a.AnimatePresence,{mode:"wait",children:["select-method"===f&&y.jsxs(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},className:"space-y-4",children:[y.jsx("h3",{className:"text-lg font-semibold text-center mb-6",children:"Choose Payment Method"}),y.jsx(a.motion.button,{whileHover:{scale:1.02},whileTap:{scale:.98},onClick:()=>B("wallet"),className:"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group",children:y.jsxs("div",{className:"flex items-center space-x-4",children:[y.jsx("div",{className:"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors",children:y.jsx(s.Wallet,{className:"w-6 h-6 text-[#7042D2]"})}),y.jsxs("div",{className:"text-left",children:[y.jsx("div",{className:"font-semibold",children:"Connect Wallet"}),y.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:"MetaMask, WalletConnect & more"})]}),y.jsx(s.Zap,{className:"w-5 h-5 text-[#7042D2] ml-auto"})]})}),y.jsx(a.motion.button,{whileHover:{scale:1.02},whileTap:{scale:.98},onClick:()=>B("qr"),className:"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group",children:y.jsxs("div",{className:"flex items-center space-x-4",children:[y.jsx("div",{className:"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors",children:y.jsx(s.QrCode,{className:"w-6 h-6 text-[#7042D2]"})}),y.jsxs("div",{className:"text-left",children:[y.jsx("div",{className:"font-semibold",children:"QR Code"}),y.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Scan with mobile wallet"})]})]})})]},"select-method"),"select-network"===f&&y.jsxs(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},className:"space-y-4",children:[y.jsx("h3",{className:"text-lg font-semibold text-center mb-6",children:"Select Network"}),I?y.jsx("div",{className:"flex justify-center py-8",children:y.jsx(s.Loader2,{className:"w-8 h-8 animate-spin text-[#7042D2]"})}):y.jsx("div",{className:"space-y-3",children:b.map(e=>y.jsx(a.motion.button,{whileHover:{scale:1.02},whileTap:{scale:.98},onClick:()=>(async e=>{C(e);const t=N.filter(t=>{var a;return(null==(a=t.Network)?void 0:a.shortName)===e.shortName||t.networkId===e.id});if(t.length>0){const a=t.find(e=>"USDT"===e.symbol)||t[0];P(a),await G(e,a)}})(e),className:"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group",children:y.jsxs("div",{className:"flex items-center space-x-4",children:[e.logo?y.jsx("img",{src:e.logo,alt:e.name,className:"w-8 h-8 rounded-full"}):y.jsx("div",{className:"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center",children:y.jsx("span",{className:"text-sm font-bold text-[#7042D2]",children:e.shortName.charAt(0).toUpperCase()})}),y.jsxs("div",{className:"text-left flex-1",children:[y.jsx("div",{className:"font-semibold",children:e.name}),y.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:e.shortName.toUpperCase()})]}),y.jsx(s.ChevronDown,{className:"w-5 h-5 text-gray-400 transform -rotate-90"})]})},e.id))})]},"select-network"),"wallet-connect"===f&&y.jsx(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},children:y.jsx(g,{selectedNetwork:k,selectedToken:S,paymentData:F,onTransactionSent:async e=>{O(e),w("processing");try{await Q.current.processPayment(F.id,e,(null==k?void 0:k.shortName)||"",""),await Y(F.id,e)}catch(t){console.error("Payment processing failed:",t),await Y(F.id,e)}},onError:U,isConnecting:q,setIsConnecting:H})},"wallet-connect"),"qr-code"===f&&y.jsxs(a.motion.div,{initial:{x:20,opacity:0},animate:{x:0,opacity:1},exit:{x:-20,opacity:0},className:"text-center space-y-6",children:[y.jsxs("div",{className:"space-y-4",children:[y.jsx("h3",{className:"text-lg font-semibold",children:"Scan QR Code"}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Use your mobile wallet to scan and pay"})]}),D&&y.jsx("div",{className:"bg-white p-4 rounded-xl mx-auto inline-block",children:y.jsx("img",{src:D,alt:"Payment QR Code",className:"w-48 h-48"})}),F&&y.jsxs("div",{className:"space-y-3",children:[y.jsxs("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2",children:[y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Network:"}),y.jsx("span",{className:"font-medium",children:null==k?void 0:k.name})]}),y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Amount:"}),y.jsxs("span",{className:"font-medium",children:[F.totalAmount," ",null==S?void 0:S.symbol]})]})]}),y.jsxs("div",{className:"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400",children:[y.jsx(s.Loader2,{className:"w-4 h-4 animate-spin"}),y.jsx("span",{children:"Waiting for payment..."})]})]})]},"qr-code"),"processing"===f&&y.jsxs(a.motion.div,{initial:{scale:.8,opacity:0},animate:{scale:1,opacity:1},className:"text-center space-y-6",children:[y.jsx("div",{className:"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.Loader2,{className:"w-8 h-8 animate-spin text-[#7042D2]"})}),y.jsxs("div",{children:[y.jsx("h3",{className:"text-lg font-semibold text-[#7042D2]",children:"Processing Payment..."}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:"Your transaction is being processed"})]})]},"processing"),"success"===f&&y.jsxs(a.motion.div,{initial:{scale:.8,opacity:0},animate:{scale:1,opacity:1},className:"text-center space-y-6",children:[y.jsx("div",{className:"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.CheckCircle2,{className:"w-8 h-8 text-green-500"})}),y.jsxs("div",{children:[y.jsx("h3",{className:"text-lg font-semibold text-green-600",children:"Payment Successful!"}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:"Your payment has been processed successfully"})]}),L&&y.jsx("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-4",children:y.jsxs("div",{className:"flex justify-between items-center",children:[y.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Transaction:"}),y.jsxs("div",{className:"flex items-center space-x-2",children:[y.jsxs("span",{className:"font-mono text-sm",children:[L.slice(0,6),"...",L.slice(-4)]}),y.jsx("button",{onClick:()=>(async e=>{try{await navigator.clipboard.writeText(e),M(!0),setTimeout(()=>M(!1),2e3)}catch(t){console.error("Failed to copy:",t)}})(L),className:"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded",children:y.jsx(s.Copy,{className:"w-4 h-4"})}),(null==k?void 0:k.explorerUrl)&&y.jsx("a",{href:`${k.explorerUrl}/tx/${L}`,target:"_blank",rel:"noopener noreferrer",className:"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded",children:y.jsx(s.ExternalLink,{className:"w-4 h-4"})})]})]})}),y.jsx("button",{onClick:Z,className:"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors",children:"Close"})]},"success"),"error"===f&&y.jsxs(a.motion.div,{initial:{scale:.8,opacity:0},animate:{scale:1,opacity:1},className:"text-center space-y-6",children:[y.jsx("div",{className:"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto",children:y.jsx(s.AlertCircle,{className:"w-8 h-8 text-red-500"})}),y.jsxs("div",{children:[y.jsx("h3",{className:"text-lg font-semibold text-red-600",children:"Payment Failed"}),y.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:R||"Something went wrong. Please try again."})]}),y.jsxs("div",{className:"space-y-3",children:[y.jsx("button",{onClick:()=>{w("select-method"),U("")},className:"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors",children:"Try Again"}),y.jsx("button",{onClick:Z,className:"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors",children:"Close"})]})]},"error")]})}),y.jsx("div",{className:"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center",children:y.jsxs("p",{className:"text-xs text-gray-500",children:["Powered by ",y.jsx("span",{className:"font-semibold text-[#7042D2]",children:"Coinley"})]})})]})}),y.jsx(r.WalletModal,{})]}):null},w=t.createContext(null),b=t.forwardRef(({customerEmail:e="",merchantName:a="",onSuccess:s,onError:r,onClose:n,theme:o="light",autoOpen:l=!1,testMode:i=!1,debug:c=!1,merchantWalletAddresses:d={}},m)=>{const h=t.useContext(w);if(!h)throw new Error("CoinleyCheckout must be used within a CoinleyProvider");const{openPayment:u,closePayment:x}=h,y=t=>{try{if(c&&console.log("Opening Coinley checkout with config:",t),!t.amount||t.amount<=0)throw new Error("Amount must be greater than 0");const a={...t,customerEmail:t.customerEmail||e,merchantWalletAddresses:{...d,...t.merchantWalletAddresses},metadata:{...t.metadata,testMode:i,checkoutVersion:"1.0.0"}};u(a,{onSuccess:s,onError:r,onClose:n})}catch(a){console.error("Failed to open Coinley checkout:",a),r&&r(a)}},p=()=>{x()};return t.useImperativeHandle(m,()=>({open:y,close:p})),null});b.displayName="CoinleyCheckout";const v={formatAmount:(e,t=2)=>e.toFixed(t),truncateAddress:(e,t=6,a=4)=>e?e.length<=t+a?e:`${e.slice(0,t)}...${e.slice(-a)}`:"",isValidAddress:(e,t)=>{if(!e)return!1;switch(t.toLowerCase()){case"ethereum":case"bsc":case"polygon":return/^0x[a-fA-F0-9]{40}$/.test(e);case"tron":return/^T[a-zA-Z0-9]{33}$/.test(e);case"solana":return/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(e);default:return e.length>0}},copyToClipboard:async e=>{try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}};class N extends Error{constructor(e,t){super(e),this.name="CoinleyError",this.code=t}}e.CoinleyCheckout=b,e.CoinleyError=N,e.CoinleyPayment=f,e.CoinleyProvider=({apiKey:e,apiSecret:a,apiUrl:s,theme:r="light",debug:n=!1,children:o})=>{const[l,i]=t.useState(!1),[c,d]=t.useState(null),[m,h]=t.useState({}),[u,x]=t.useState(""),p=()=>{i(!1),d(null),m.onClose&&m.onClose()},g={openPayment:(e,t)=>{d(e),t&&h(t),i(!0)},closePayment:p};return y.jsxs(w.Provider,{value:g,children:[o,l&&c&&y.jsx(f,{apiKey:e,apiSecret:a,apiUrl:s,isOpen:l,config:c,theme:r,debug:n,merchantName:u,onSuccess:m.onSuccess,onError:m.onError,onClose:p})]})},e.DEFAULT_CONFIG={theme:"light",debug:!1,testMode:!1,autoOpen:!1},e.PaymentAPI=p,e.ThemeProvider=({initialTheme:e="light",children:a})=>{const[s,r]=t.useState(e);return t.useEffect(()=>{document.documentElement.setAttribute("data-coinley-theme",s)},[s]),y.jsx("div",{className:`coinley-theme-${s}`,children:a})},e.VERSION="0.0.0",e.useCoinley=()=>{const e=t.useContext(w);if(!e)throw new Error("useCoinley must be used within a CoinleyProvider");return e},e.utils=v,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/PaymentAPI.js","../src/CoinleyPayment.jsx","../src/CoinleyProvider.jsx","../src/index.js"],"sourcesContent":["/**\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/PaymentAPI.js\r\nimport axios from 'axios';\r\n\r\nexport class PaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n\r\n this.api = axios.create({\r\n baseURL: baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add request interceptor\r\n this.api.interceptors.request.use(\r\n (config) => {\r\n config.headers['X-API-Key'] = this.apiKey;\r\n config.headers['X-API-Secret'] = this.apiSecret;\r\n \r\n const token = this.generateMerchantToken();\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n console.log('API Request:', {\r\n method: config.method?.toUpperCase(),\r\n url: config.url,\r\n data: config.data\r\n });\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('Request interceptor error:', error);\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Add response interceptor\r\n this.api.interceptors.response.use(\r\n (response) => {\r\n console.log('API Response:', {\r\n status: response.status,\r\n url: response.config.url,\r\n data: response.data\r\n });\r\n return response;\r\n },\r\n (error) => {\r\n console.error('API Error:', {\r\n status: error.response?.status,\r\n data: error.response?.data,\r\n message: error.message\r\n });\r\n\r\n if (error.response?.status === 401) {\r\n throw new Error('Authentication failed. Please check your API credentials.');\r\n } else if (error.response?.status === 404) {\r\n throw new Error('API endpoint not found. Please check your API URL.');\r\n } else if (error.response?.status >= 500) {\r\n throw new Error('Server error. Please try again later.');\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n generateMerchantToken() {\r\n try {\r\n const credentials = `${this.apiKey}:${this.apiSecret}`;\r\n return btoa(credentials);\r\n } catch (error) {\r\n console.error('Failed to generate token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async createPayment(params) {\r\n try {\r\n const response = await this.api.post('/api/payments/create', params);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to create payment');\r\n }\r\n }\r\n\r\n async getPayment(paymentId) {\r\n try {\r\n const response = await this.api.get(`/api/payments/${paymentId}`);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to get payment details');\r\n }\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n const response = await this.api.get('/api/networks');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get networks failed:', error);\r\n \r\n // Return fallback networks\r\n return {\r\n networks: [\r\n {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n chainId: '1',\r\n type: 'ethereum',\r\n explorerUrl: 'https://etherscan.io',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'bsc',\r\n name: 'Binance Smart Chain',\r\n shortName: 'bsc',\r\n chainId: '56',\r\n type: 'bsc',\r\n explorerUrl: 'https://bscscan.com',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'polygon',\r\n name: 'Polygon',\r\n shortName: 'polygon',\r\n chainId: '137',\r\n type: 'ethereum',\r\n explorerUrl: 'https://polygonscan.com',\r\n isTestnet: false,\r\n },\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getStablecoins() {\r\n try {\r\n const response = await this.api.get('/api/networks/stablecoins');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get stablecoins failed:', error);\r\n \r\n // Return fallback stablecoins\r\n return {\r\n stablecoins: [\r\n {\r\n id: 'usdt-eth',\r\n name: 'Tether USD',\r\n symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n },\r\n {\r\n id: 'usdc-eth',\r\n name: 'USD Coin',\r\n symbol: 'USDC',\r\n contractAddress: '0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n try {\r\n const response = await this.api.post('/api/payments/verify-qr', {\r\n paymentId\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to verify payment');\r\n }\r\n }\r\n\r\n async processPayment(paymentId, transactionHash, network, senderAddress) {\r\n try {\r\n const response = await this.api.post('/api/payments/process', {\r\n paymentId,\r\n transactionHash,\r\n network,\r\n senderAddress\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to process payment');\r\n }\r\n }\r\n\r\n async healthCheck() {\r\n try {\r\n const response = await this.api.get('/api/health');\r\n return response.status === 200;\r\n } catch (error) {\r\n console.error('Health check failed:', error);\r\n return false;\r\n }\r\n }\r\n}","//src/CoinleyPayment.jsx\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { \r\n Wallet, \r\n QrCode, \r\n ChevronDown, \r\n Copy, \r\n Check, \r\n X, \r\n ArrowLeft,\r\n Loader2,\r\n ExternalLink,\r\n AlertCircle,\r\n CheckCircle2,\r\n Zap,\r\n Sparkles\r\n} from 'lucide-react';\r\n// import QRCodeLib from 'qrcode';\r\nimport { \r\n createCoinleyWalletConfig,\r\n CoinleyWalletProvider,\r\n ConnectButton,\r\n WalletModal,\r\n useWallet,\r\n useWalletConnect,\r\n useWalletTransaction,\r\n useWalletModal,\r\n useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\nimport { PaymentAPI } from './PaymentAPI';\r\n\r\n// Wallet Integration Component\r\nconst WalletIntegration = ({ \r\n selectedNetwork, \r\n selectedToken, \r\n paymentData, \r\n onTransactionSent, \r\n onError,\r\n isConnecting,\r\n setIsConnecting\r\n}) => {\r\n const { isConnected, address } = useWallet();\r\n const { connectWallet, isPending } = useWalletConnect();\r\n const { detectedWallets, hasWallets, walletCount } = useWalletDetection(); // ADD THIS\r\n const { sendTransaction } = useWalletTransaction();\r\n\r\n useEffect(() => {\r\n if (isConnected && paymentData && selectedNetwork && selectedToken) {\r\n handleSendTransaction();\r\n }\r\n }, [isConnected, paymentData]);\r\n\r\n const handleConnectWallet = async () => {\r\n try {\r\n setIsConnecting(true);\r\n openModal();\r\n } catch (error) {\r\n console.error('Wallet connection failed:', error);\r\n onError(error.message || 'Failed to connect wallet');\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n const handleSendTransaction = async () => {\r\n if (!isConnected || !paymentData || !selectedToken) return;\r\n\r\n try {\r\n setIsConnecting(true);\r\n \r\n const recipientAddress = paymentData.metadata?.recipientWallet;\r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let txHash;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 Token Transaction\r\n const amount = (paymentData.totalAmount * Math.pow(10, selectedToken.decimals)).toString();\r\n const transferData = `0xa9059cbb${recipientAddress.slice(2).padStart(64, '0')}${parseInt(amount).toString(16).padStart(64, '0')}`;\r\n \r\n txHash = await sendTransaction({\r\n to: selectedToken.contractAddress,\r\n data: transferData,\r\n value: '0x0'\r\n });\r\n } else {\r\n // Native Token Transaction\r\n const value = (paymentData.totalAmount * Math.pow(10, 18)).toString(16);\r\n \r\n txHash = await sendTransaction({\r\n to: recipientAddress,\r\n value: `0x${value}`\r\n });\r\n }\r\n\r\n if (txHash) {\r\n onTransactionSent(txHash);\r\n }\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n onError(error.message || 'Transaction failed');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"text-center space-y-6\">\r\n <div className=\"space-y-4\">\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Wallet className=\"w-8 h-8 text-[#7042D2]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold\">\r\n {isConnected ? 'Send Payment' : `Connect Wallet (${walletCount} detected)`}\r\n </h3>\r\n {!isConnected ? (\r\n <div className=\"space-y-3\">\r\n {hasWallets ? (\r\n detectedWallets.map((wallet, index) => (\r\n <button\r\n key={index}\r\n onClick={() => connectWallet('injected')}\r\n disabled={isPending}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors\"\r\n >\r\n <span className=\"text-xl\">{wallet.icon}</span>\r\n <div className=\"text-left\">\r\n <div className=\"font-medium\">{wallet.name}</div>\r\n <div className=\"text-xs text-gray-500\">{wallet.provider}</div>\r\n </div>\r\n </button>\r\n ))\r\n ) : (\r\n <p className=\"text-gray-600\">No wallets detected. Please install MetaMask.</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-green-600 dark:text-green-400\">\r\n ✅ Wallet Connected: {address?.slice(0, 6)}...{address?.slice(-4)}\r\n </p>\r\n \r\n {paymentData && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isConnecting && (\r\n <div className=\"flex items-center justify-center space-x-2\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[#7042D2]\" />\r\n <span>Processing transaction...</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst CoinleyPayment = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n isOpen,\r\n config,\r\n theme = 'light',\r\n merchantName,\r\n debug = false\r\n}) => {\r\n // State management\r\n const [currentStep, setCurrentStep] = useState('select-method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [qrCode, setQrCode] = useState('');\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [copied, setCopied] = useState(false);\r\n const [txHash, setTxHash] = useState('');\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n // Services\r\n const paymentAPI = useRef(new PaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Wallet configuration\r\n const walletConfig = createCoinleyWalletConfig({\r\n appName: merchantName || 'Coinley Payment',\r\n appDescription: 'Crypto payment processing',\r\n chains: ['ethereum', 'polygon', 'bsc', 'arbitrum']\r\n });\r\n\r\n // Initialize\r\n useEffect(() => {\r\n if (isOpen) {\r\n initializePayment();\r\n }\r\n }, [isOpen]);\r\n\r\n const initializePayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n \r\n const [networksRes, tokensRes] = await Promise.all([\r\n paymentAPI.current.getNetworks(),\r\n paymentAPI.current.getStablecoins()\r\n ]);\r\n\r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n\r\n if (debug) {\r\n console.log('Initialized networks:', networksRes.networks);\r\n console.log('Initialized tokens:', tokensRes.stablecoins);\r\n }\r\n } catch (err) {\r\n console.error('Failed to initialize payment:', err);\r\n setError('Failed to load payment options. Please try again.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMethodSelect = (method) => {\r\n setPaymentMethod(method);\r\n setCurrentStep('select-network');\r\n };\r\n\r\n const handleNetworkSelect = async (network) => {\r\n setSelectedNetwork(network);\r\n \r\n const networkTokens = tokens.filter(token => \r\n token.Network?.shortName === network.shortName || token.networkId === network.id\r\n );\r\n \r\n if (networkTokens.length > 0) {\r\n const preferredToken = networkTokens.find(t => t.symbol === 'USDT') || networkTokens[0];\r\n setSelectedToken(preferredToken);\r\n await initiatePayment(network, preferredToken);\r\n }\r\n };\r\n\r\n const initiatePayment = async (network, token) => {\r\n try {\r\n setLoading(true);\r\n \r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: token.symbol,\r\n network: network.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n paymentMethod,\r\n selectedNetwork: network.shortName,\r\n selectedToken: token.symbol\r\n }\r\n };\r\n\r\n const payment = await paymentAPI.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n\r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet-connect');\r\n } else {\r\n await generateQRCode(payment.payment);\r\n setCurrentStep('qr-code');\r\n }\r\n } catch (err) {\r\n console.error('Payment initiation failed:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setCurrentStep('error');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const generateQRCode = async (payment) => {\r\n try {\r\n const recipientAddress = payment.metadata?.recipientWallet || \r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName || ''];\r\n \r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let qrData = '';\r\n \r\n if (selectedNetwork?.type === 'ethereum' || selectedNetwork?.type === 'bsc') {\r\n qrData = selectedToken?.contractAddress \r\n ? `ethereum:${selectedToken.contractAddress}/transfer?address=${recipientAddress}&uint256=${payment.totalAmount * Math.pow(10, selectedToken.decimals)}`\r\n : `ethereum:${recipientAddress}?value=${payment.totalAmount}e18`;\r\n } else if (selectedNetwork?.type === 'tron') {\r\n qrData = `tron:${recipientAddress}?amount=${payment.totalAmount}`;\r\n } else {\r\n qrData = `${selectedToken?.symbol}:${recipientAddress}?amount=${payment.totalAmount}`;\r\n }\r\n\r\n const qrCodeDataURL = await QRCodeLib.toDataURL(qrData, {\r\n width: 256,\r\n margin: 2,\r\n color: {\r\n dark: theme === 'dark' ? '#FFFFFF' : '#000000',\r\n light: theme === 'dark' ? '#000000' : '#FFFFFF'\r\n }\r\n });\r\n\r\n // setQrCode(qrCodeDataURL);\r\n setQrCode(recipientAddress);\r\n startPaymentVerification(payment.id);\r\n \r\n } catch (err) {\r\n console.error('QR code generation failed:', err);\r\n setError('Failed to generate QR code');\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const startPaymentVerification = async (paymentId) => {\r\n const maxAttempts = 60;\r\n let attempts = 0;\r\n\r\n const checkPayment = async () => {\r\n try {\r\n const result = await paymentAPI.current.verifyQRPayment(paymentId);\r\n \r\n if (result.verified && result.payment?.transactionHash) {\r\n setTxHash(result.payment.transactionHash);\r\n await handlePaymentSuccess(paymentId, result.payment.transactionHash);\r\n return true;\r\n }\r\n \r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification timeout. Please check your transaction.');\r\n setCurrentStep('error');\r\n }\r\n \r\n return false;\r\n } catch (err) {\r\n console.error('Payment verification error:', err);\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification failed');\r\n setCurrentStep('error');\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n setTimeout(checkPayment, 2000);\r\n };\r\n\r\n const handleTransactionSent = async (transactionHash) => {\r\n setTxHash(transactionHash);\r\n setCurrentStep('processing');\r\n \r\n try {\r\n await paymentAPI.current.processPayment(\r\n paymentData.id,\r\n transactionHash,\r\n selectedNetwork?.shortName || '',\r\n ''\r\n );\r\n \r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n } catch (error) {\r\n console.error('Payment processing failed:', error);\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n }\r\n };\r\n\r\n const handlePaymentSuccess = async (paymentId, transactionHash) => {\r\n setCurrentStep('success');\r\n \r\n if (onSuccess) {\r\n onSuccess(paymentId, transactionHash, {\r\n network: selectedNetwork?.name,\r\n token: selectedToken?.symbol,\r\n amount: paymentData?.totalAmount,\r\n method: paymentMethod\r\n });\r\n }\r\n };\r\n\r\n const copyToClipboard = async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setCurrentStep('select-method');\r\n setPaymentMethod(null);\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setQrCode('');\r\n setPaymentData(null);\r\n setError('');\r\n setTxHash('');\r\n \r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const goBack = () => {\r\n if (currentStep === 'select-network') {\r\n setCurrentStep('select-method');\r\n } else if (currentStep === 'wallet-connect' || currentStep === 'qr-code') {\r\n setCurrentStep('select-network');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <CoinleyWalletProvider config={walletConfig} walletConfig={{ appName: merchantName || 'Coinley Payment' }}>\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm\">\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n className={`relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden ${\r\n theme === 'dark' ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'\r\n }`}\r\n >\r\n {/* Header */}\r\n <div className=\"relative p-6 border-b border-gray-200 dark:border-gray-700\">\r\n {(currentStep !== 'select-method' && currentStep !== 'success' && currentStep !== 'error') && (\r\n <button\r\n onClick={goBack}\r\n className=\"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n )}\r\n \r\n <button\r\n onClick={handleClose}\r\n className=\"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n \r\n <div className=\"text-center\">\r\n <div className=\"flex items-center justify-center space-x-2 mb-2\">\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n <h2 className=\"text-xl font-bold\">Pay with Crypto</h2>\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n </div>\r\n {merchantName && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\r\n {merchantName}\r\n </p>\r\n )}\r\n <div className=\"mt-2\">\r\n <span className=\"text-2xl font-bold text-[#7042D2]\">\r\n ${config.amount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 min-h-[400px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {/* Step 1: Select Payment Method */}\r\n {currentStep === 'select-method' && (\r\n <motion.div\r\n key=\"select-method\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Choose Payment Method\r\n </h3>\r\n \r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('wallet')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <Wallet className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">Connect Wallet</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n MetaMask, WalletConnect & more\r\n </div>\r\n </div>\r\n <Zap className=\"w-5 h-5 text-[#7042D2] ml-auto\" />\r\n </div>\r\n </motion.button>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('qr')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <QrCode className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">QR Code</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n Scan with mobile wallet\r\n </div>\r\n </div>\r\n </div>\r\n </motion.button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'select-network' && (\r\n <motion.div\r\n key=\"select-network\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Network\r\n </h3>\r\n \r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {networks.map((network) => (\r\n <motion.button\r\n key={network.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleNetworkSelect(network)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {network.logo ? (\r\n <img \r\n src={network.logo} \r\n alt={network.name}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {network.shortName.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{network.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {network.shortName.toUpperCase()}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))}\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Wallet Connect */}\r\n {currentStep === 'wallet-connect' && (\r\n <motion.div\r\n key=\"wallet-connect\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n >\r\n <WalletIntegration\r\n selectedNetwork={selectedNetwork}\r\n selectedToken={selectedToken}\r\n paymentData={paymentData}\r\n onTransactionSent={handleTransactionSent}\r\n onError={setError}\r\n isConnecting={isConnecting}\r\n setIsConnecting={setIsConnecting}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {/* QR Code */}\r\n {currentStep === 'qr-code' && (\r\n <motion.div\r\n key=\"qr-code\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Use your mobile wallet to scan and pay\r\n </p>\r\n </div>\r\n\r\n {qrCode && (\r\n <div className=\"bg-white p-4 rounded-xl mx-auto inline-block\">\r\n <img src={qrCode} alt=\"Payment QR Code\" className=\"w-48 h-48\" />\r\n </div>\r\n )}\r\n\r\n {paymentData && (\r\n <div className=\"space-y-3\">\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n </div>\r\n \r\n <div className=\"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Waiting for payment...</span>\r\n </div>\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Processing */}\r\n {currentStep === 'processing' && (\r\n <motion.div\r\n key=\"processing\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[#7042D2]\">Processing Payment...</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your transaction is being processed\r\n </p>\r\n </div>\r\n </motion.div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <motion.div\r\n key=\"success\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <CheckCircle2 className=\"w-8 h-8 text-green-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-green-600\">Payment Successful!</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your payment has been processed successfully\r\n </p>\r\n </div>\r\n\r\n {txHash && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Transaction:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {txHash.slice(0, 6)}...{txHash.slice(-4)}\r\n </span>\r\n <button\r\n onClick={() => copyToClipboard(txHash)}\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {selectedNetwork?.explorerUrl && (\r\n <a\r\n href={`${selectedNetwork.explorerUrl}/tx/${txHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Error */}\r\n {currentStep === 'error' && (\r\n <motion.div\r\n key=\"error\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto\">\r\n <AlertCircle className=\"w-8 h-8 text-red-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-red-600\">Payment Failed</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {error || 'Something went wrong. Please try again.'}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => {\r\n setCurrentStep('select-method');\r\n setError('');\r\n }}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center\">\r\n <p className=\"text-xs text-gray-500\">\r\n Powered by <span className=\"font-semibold text-[#7042D2]\">Coinley</span>\r\n </p>\r\n </div>\r\n </motion.div>\r\n </div>\r\n\r\n <WalletModal />\r\n </CoinleyWalletProvider>\r\n );\r\n};\r\n\r\nexport default CoinleyPayment;","//src/CoinleyProvider.jsx\r\nimport React, { createContext, useContext, useRef, forwardRef, useImperativeHandle } from 'react';\r\nimport CoinleyPayment from './CoinleyPayment';\r\n\r\nconst CoinleyContext = createContext(null);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n theme = 'light',\r\n debug = false,\r\n children\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [paymentConfig, setPaymentConfig] = React.useState(null);\r\n const [callbacks, setCallbacks] = React.useState({});\r\n const [merchantName, setMerchantName] = React.useState('');\r\n\r\n const openPayment = (config, checkoutCallbacks) => {\r\n setPaymentConfig(config);\r\n if (checkoutCallbacks) {\r\n setCallbacks(checkoutCallbacks);\r\n }\r\n setIsOpen(true);\r\n };\r\n\r\n const closePayment = () => {\r\n setIsOpen(false);\r\n setPaymentConfig(null);\r\n if (callbacks.onClose) {\r\n callbacks.onClose();\r\n }\r\n };\r\n\r\n const contextValue = {\r\n openPayment,\r\n closePayment\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={contextValue}>\r\n {children}\r\n {isOpen && paymentConfig && (\r\n <CoinleyPayment\r\n apiKey={apiKey}\r\n apiSecret={apiSecret}\r\n apiUrl={apiUrl}\r\n isOpen={isOpen}\r\n config={paymentConfig}\r\n theme={theme}\r\n debug={debug}\r\n merchantName={merchantName}\r\n onSuccess={callbacks.onSuccess}\r\n onError={callbacks.onError}\r\n onClose={closePayment}\r\n />\r\n )}\r\n </CoinleyContext.Provider>\r\n );\r\n};\r\n\r\nexport const CoinleyCheckout = forwardRef((\r\n {\r\n customerEmail = '',\r\n merchantName = '',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme = 'light',\r\n autoOpen = false,\r\n testMode = false,\r\n debug = false,\r\n merchantWalletAddresses = {}\r\n },\r\n ref\r\n) => {\r\n const context = useContext(CoinleyContext);\r\n\r\n if (!context) {\r\n throw new Error('CoinleyCheckout must be used within a CoinleyProvider');\r\n }\r\n\r\n const { openPayment, closePayment } = context;\r\n\r\n const open = (config) => {\r\n try {\r\n if (debug) {\r\n console.log('Opening Coinley checkout with config:', config);\r\n }\r\n\r\n if (!config.amount || config.amount <= 0) {\r\n throw new Error('Amount must be greater than 0');\r\n }\r\n\r\n const finalConfig = {\r\n ...config,\r\n customerEmail: config.customerEmail || customerEmail,\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...config.merchantWalletAddresses\r\n },\r\n metadata: {\r\n ...config.metadata,\r\n testMode,\r\n checkoutVersion: '1.0.0'\r\n }\r\n };\r\n\r\n const checkoutCallbacks = {\r\n onSuccess,\r\n onError,\r\n onClose\r\n };\r\n\r\n openPayment(finalConfig, checkoutCallbacks);\r\n } catch (error) {\r\n console.error('Failed to open Coinley checkout:', error);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n closePayment();\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n open,\r\n close\r\n }));\r\n\r\n return null;\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport const useCoinley = () => {\r\n const context = useContext(CoinleyContext);\r\n if (!context) {\r\n throw new Error('useCoinley must be used within a CoinleyProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ThemeProvider = ({\r\n initialTheme = 'light',\r\n children\r\n}) => {\r\n const [theme, setTheme] = React.useState(initialTheme);\r\n\r\n React.useEffect(() => {\r\n document.documentElement.setAttribute('data-coinley-theme', theme);\r\n }, [theme]);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n return (\r\n <div className={`coinley-theme-${theme}`}>\r\n {children}\r\n </div>\r\n );\r\n};","// Main SDK exports\r\nexport {\r\n CoinleyProvider,\r\n CoinleyCheckout,\r\n ThemeProvider,\r\n useCoinley\r\n} from './CoinleyProvider';\r\n\r\nexport { PaymentAPI } from './PaymentAPI';\r\nexport { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.0';\r\n\r\n// Utils\r\nexport const utils = {\r\n formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n if (!address) return '';\r\n if (address.length <= startChars + endChars) return address;\r\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n },\r\n\r\n isValidAddress: (address, network) => {\r\n if (!address) return false;\r\n \r\n switch (network.toLowerCase()) {\r\n case 'ethereum':\r\n case 'bsc':\r\n case 'polygon':\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n case 'tron':\r\n return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n case 'solana':\r\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n default:\r\n return address.length > 0;\r\n }\r\n },\r\n\r\n copyToClipboard: async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n};\r\n\r\n// Error classes\r\nexport class CoinleyError extends Error {\r\n constructor(message, code) {\r\n super(message);\r\n this.name = 'CoinleyError';\r\n this.code = code;\r\n }\r\n}\r\n\r\n// Default config\r\nexport const DEFAULT_CONFIG = {\r\n theme: 'light',\r\n debug: false,\r\n testMode: false,\r\n autoOpen: false\r\n};"],"names":["f","require$$0","k","Symbol","for","l","m","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","p","key","ref","__self","__source","q","c","a","g","b","d","e","h","call","defaultProps","$$typeof","type","props","_owner","current","reactJsxRuntime_production_min","jsx","jsxs","jsxRuntimeModule","exports","PaymentAPI","constructor","baseURL","apiKey","apiSecret","this","api","axios","create","endsWith","slice","timeout","headers","interceptors","request","use","config","token","generateMerchantToken","console","log","method","_a","toUpperCase","url","data","error","Promise","reject","response","status","_b","message","_c","Error","_d","_e","credentials","btoa","createPayment","params","post","getPayment","paymentId","get","getNetworks","networks","id","name","shortName","chainId","explorerUrl","isTestnet","getStablecoins","stablecoins","symbol","contractAddress","decimals","isStablecoin","networkId","Network","verifyQRPayment","processPayment","transactionHash","network","senderAddress","healthCheck","WalletIntegration","selectedNetwork","selectedToken","paymentData","onTransactionSent","onError","isConnecting","setIsConnecting","isConnected","address","useWallet","connectWallet","isPending","useWalletConnect","detectedWallets","hasWallets","walletCount","useWalletDetection","sendTransaction","useWalletTransaction","useEffect","handleSendTransaction","async","recipientAddress","metadata","recipientWallet","txHash","amount","totalAmount","Math","pow","toString","transferData","padStart","parseInt","to","value","className","children","Wallet","jsxRuntimeExports","Loader2","map","wallet","index","onClick","disabled","icon","provider","CoinleyPayment","apiUrl","onSuccess","onClose","isOpen","theme","merchantName","debug","currentStep","setCurrentStep","useState","setNetworks","tokens","setTokens","setSelectedNetwork","setSelectedToken","paymentMethod","setPaymentMethod","qrCode","setQrCode","setPaymentData","loading","setLoading","setError","copied","setCopied","setTxHash","paymentAPI","useRef","walletConfig","createCoinleyWalletConfig","appName","appDescription","chains","initializePayment","networksRes","tokensRes","all","err","handleMethodSelect","initiatePayment","paymentPayload","currency","customerEmail","callbackUrl","payment","generateQRCode","merchantWalletAddresses","qrData","QRCodeLib","toDataURL","width","margin","color","dark","light","startPaymentVerification","attempts","checkPayment","result","verified","handlePaymentSuccess","setTimeout","handleClose","CoinleyWalletProvider","motion","div","initial","scale","opacity","animate","exit","ArrowLeft","X","Sparkles","toFixed","AnimatePresence","mode","x","button","whileHover","whileTap","Zap","QrCode","networkTokens","filter","length","preferredToken","find","t","handleNetworkSelect","logo","src","alt","charAt","ChevronDown","CheckCircle2","text","navigator","clipboard","writeText","copyToClipboard","Copy","href","target","rel","ExternalLink","AlertCircle","WalletModal","CoinleyContext","createContext","CoinleyCheckout","forwardRef","autoOpen","testMode","context","useContext","openPayment","closePayment","open","finalConfig","checkoutVersion","close","React","useImperativeHandle","displayName","utils","formatAmount","truncateAddress","startChars","endChars","isValidAddress","toLowerCase","test","CoinleyError","code","super","setIsOpen","paymentConfig","setPaymentConfig","callbacks","setCallbacks","setMerchantName","contextValue","checkoutCallbacks","Provider","initialTheme","setTheme","document","documentElement","setAttribute"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"index.umd.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/PaymentAPI.js","../src/CoinleyPayment.jsx","../src/CoinleyProvider.jsx","../src/index.js"],"sourcesContent":["/**\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/PaymentAPI.js\r\nimport axios from 'axios';\r\n\r\nexport class PaymentAPI {\r\n constructor(baseURL, apiKey, apiSecret) {\r\n this.apiKey = apiKey;\r\n this.apiSecret = apiSecret;\r\n\r\n this.api = axios.create({\r\n baseURL: baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add request interceptor\r\n this.api.interceptors.request.use(\r\n (config) => {\r\n config.headers['X-API-Key'] = this.apiKey;\r\n config.headers['X-API-Secret'] = this.apiSecret;\r\n \r\n const token = this.generateMerchantToken();\r\n if (token) {\r\n config.headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n console.log('API Request:', {\r\n method: config.method?.toUpperCase(),\r\n url: config.url,\r\n data: config.data\r\n });\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('Request interceptor error:', error);\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Add response interceptor\r\n this.api.interceptors.response.use(\r\n (response) => {\r\n console.log('API Response:', {\r\n status: response.status,\r\n url: response.config.url,\r\n data: response.data\r\n });\r\n return response;\r\n },\r\n (error) => {\r\n console.error('API Error:', {\r\n status: error.response?.status,\r\n data: error.response?.data,\r\n message: error.message\r\n });\r\n\r\n if (error.response?.status === 401) {\r\n throw new Error('Authentication failed. Please check your API credentials.');\r\n } else if (error.response?.status === 404) {\r\n throw new Error('API endpoint not found. Please check your API URL.');\r\n } else if (error.response?.status >= 500) {\r\n throw new Error('Server error. Please try again later.');\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n generateMerchantToken() {\r\n try {\r\n const credentials = `${this.apiKey}:${this.apiSecret}`;\r\n return btoa(credentials);\r\n } catch (error) {\r\n console.error('Failed to generate token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async createPayment(params) {\r\n try {\r\n const response = await this.api.post('/api/payments/create', params);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to create payment');\r\n }\r\n }\r\n\r\n async getPayment(paymentId) {\r\n try {\r\n const response = await this.api.get(`/api/payments/${paymentId}`);\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to get payment details');\r\n }\r\n }\r\n\r\n async getNetworks() {\r\n try {\r\n const response = await this.api.get('/api/networks');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get networks failed:', error);\r\n \r\n // Return fallback networks\r\n return {\r\n networks: [\r\n {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n chainId: '1',\r\n type: 'ethereum',\r\n explorerUrl: 'https://etherscan.io',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'bsc',\r\n name: 'Binance Smart Chain',\r\n shortName: 'bsc',\r\n chainId: '56',\r\n type: 'bsc',\r\n explorerUrl: 'https://bscscan.com',\r\n isTestnet: false,\r\n },\r\n {\r\n id: 'polygon',\r\n name: 'Polygon',\r\n shortName: 'polygon',\r\n chainId: '137',\r\n type: 'ethereum',\r\n explorerUrl: 'https://polygonscan.com',\r\n isTestnet: false,\r\n },\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async getStablecoins() {\r\n try {\r\n const response = await this.api.get('/api/networks/stablecoins');\r\n return response.data;\r\n } catch (error) {\r\n console.error('Get stablecoins failed:', error);\r\n \r\n // Return fallback stablecoins\r\n return {\r\n stablecoins: [\r\n {\r\n id: 'usdt-eth',\r\n name: 'Tether USD',\r\n symbol: 'USDT',\r\n contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n },\r\n {\r\n id: 'usdc-eth',\r\n name: 'USD Coin',\r\n symbol: 'USDC',\r\n contractAddress: '0xA0b86a33E6441d81d0B93bF9EE0f74ca32F7e6f6',\r\n decimals: 6,\r\n isStablecoin: true,\r\n networkId: 'ethereum',\r\n Network: {\r\n id: 'ethereum',\r\n name: 'Ethereum',\r\n shortName: 'ethereum',\r\n type: 'ethereum',\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n async verifyQRPayment(paymentId) {\r\n try {\r\n const response = await this.api.post('/api/payments/verify-qr', {\r\n paymentId\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to verify payment');\r\n }\r\n }\r\n\r\n async processPayment(paymentId, transactionHash, network, senderAddress) {\r\n try {\r\n const response = await this.api.post('/api/payments/process', {\r\n paymentId,\r\n transactionHash,\r\n network,\r\n senderAddress\r\n });\r\n return response.data;\r\n } catch (error) {\r\n if (error.response?.data?.error) {\r\n throw new Error(error.response.data.error);\r\n }\r\n throw new Error(error.message || 'Failed to process payment');\r\n }\r\n }\r\n\r\n async healthCheck() {\r\n try {\r\n const response = await this.api.get('/api/health');\r\n return response.status === 200;\r\n } catch (error) {\r\n console.error('Health check failed:', error);\r\n return false;\r\n }\r\n }\r\n}","//src/CoinleyPayment.jsx\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport {\r\n Wallet,\r\n QrCode,\r\n ChevronDown,\r\n Copy,\r\n Check,\r\n X,\r\n ArrowLeft,\r\n Loader2,\r\n ExternalLink,\r\n AlertCircle,\r\n CheckCircle2,\r\n Zap,\r\n Sparkles\r\n} from 'lucide-react';\r\n// import QRCodeLib from 'qrcode';\r\nimport {\r\n createCoinleyWalletConfig,\r\n CoinleyWalletProvider,\r\n ConnectButton,\r\n WalletModal,\r\n useWallet,\r\n useWalletConnect,\r\n useWalletTransaction,\r\n useWalletModal,\r\n useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\nimport { PaymentAPI } from './PaymentAPI';\r\n\r\n// Wallet Integration Component\r\nconst WalletIntegration = ({\r\n selectedNetwork,\r\n selectedToken,\r\n paymentData,\r\n onTransactionSent,\r\n onError,\r\n isConnecting,\r\n setIsConnecting\r\n}) => {\r\n const { isConnected, address } = useWallet();\r\n const { connectWallet, isPending } = useWalletConnect();\r\n const { detectedWallets, hasWallets, walletCount } = useWalletDetection(); // ADD THIS\r\n const { sendTransaction } = useWalletTransaction();\r\n\r\n useEffect(() => {\r\n if (isConnected && paymentData && selectedNetwork && selectedToken) {\r\n handleSendTransaction();\r\n }\r\n }, [isConnected, paymentData]);\r\n\r\n const handleConnectWallet = async () => {\r\n try {\r\n setIsConnecting(true);\r\n openModal();\r\n } catch (error) {\r\n console.error('Wallet connection failed:', error);\r\n onError(error.message || 'Failed to connect wallet');\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n const handleSendTransaction = async () => {\r\n if (!isConnected || !paymentData || !selectedToken) return;\r\n\r\n try {\r\n setIsConnecting(true);\r\n\r\n const recipientAddress = paymentData.metadata?.recipientWallet ||\r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName];\r\n \r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let txHash;\r\n\r\n if (selectedToken.contractAddress) {\r\n // ERC-20 Token Transaction\r\n const amount = (paymentData.totalAmount * Math.pow(10, selectedToken.decimals)).toString();\r\n const transferData = `0xa9059cbb${recipientAddress.slice(2).padStart(64, '0')}${parseInt(amount).toString(16).padStart(64, '0')}`;\r\n\r\n txHash = await sendTransaction({\r\n to: selectedToken.contractAddress,\r\n data: transferData,\r\n value: '0x0'\r\n });\r\n } else {\r\n // Native Token Transaction\r\n const value = (paymentData.totalAmount * Math.pow(10, 18)).toString(16);\r\n\r\n txHash = await sendTransaction({\r\n to: recipientAddress,\r\n value: `0x${value}`\r\n });\r\n }\r\n\r\n if (txHash) {\r\n onTransactionSent(txHash);\r\n }\r\n } catch (error) {\r\n console.error('Transaction failed:', error);\r\n onError(error.message || 'Transaction failed');\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"text-center space-y-6\">\r\n <div className=\"space-y-4\">\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Wallet className=\"w-8 h-8 text-[#7042D2]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold\">\r\n {isConnected ? 'Send Payment' : `Connect Wallet (${walletCount} detected)`}\r\n </h3>\r\n {!isConnected ? (\r\n <div className=\"space-y-3\">\r\n {hasWallets ? (\r\n detectedWallets.map((wallet, index) => (\r\n <button\r\n key={index}\r\n onClick={() => connectWallet('injected')}\r\n disabled={isPending}\r\n className=\"w-full p-3 border border-gray-300 rounded-lg hover:border-[#7042D2] flex items-center space-x-3 transition-colors\"\r\n >\r\n <span className=\"text-xl\">{wallet.icon}</span>\r\n <div className=\"text-left\">\r\n <div className=\"font-medium\">{wallet.name}</div>\r\n <div className=\"text-xs text-gray-500\">{wallet.provider}</div>\r\n </div>\r\n </button>\r\n ))\r\n ) : (\r\n <p className=\"text-gray-600\">No wallets detected. Please install MetaMask.</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-green-600 dark:text-green-400\">\r\n ✅ Wallet Connected: {address?.slice(0, 6)}...{address?.slice(-4)}\r\n </p>\r\n\r\n {paymentData && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isConnecting && (\r\n <div className=\"flex items-center justify-center space-x-2\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[#7042D2]\" />\r\n <span>Processing transaction...</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst CoinleyPayment = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl = 'http://localhost:9000',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n isOpen,\r\n config,\r\n theme = 'light',\r\n merchantName,\r\n debug = false\r\n}) => {\r\n // State management\r\n const [currentStep, setCurrentStep] = useState('select-method');\r\n const [networks, setNetworks] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n const [selectedToken, setSelectedToken] = useState(null);\r\n const [paymentMethod, setPaymentMethod] = useState(null);\r\n const [qrCode, setQrCode] = useState('');\r\n const [paymentData, setPaymentData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [copied, setCopied] = useState(false);\r\n const [txHash, setTxHash] = useState('');\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n // Services\r\n const paymentAPI = useRef(new PaymentAPI(apiUrl, apiKey, apiSecret));\r\n\r\n // Wallet configuration\r\n const walletConfig = createCoinleyWalletConfig({\r\n appName: merchantName || 'Coinley Payment',\r\n appDescription: 'Crypto payment processing',\r\n chains: ['ethereum', 'polygon', 'bsc', 'arbitrum']\r\n });\r\n\r\n // Initialize\r\n useEffect(() => {\r\n if (isOpen) {\r\n initializePayment();\r\n }\r\n }, [isOpen]);\r\n\r\n const initializePayment = async () => {\r\n try {\r\n setLoading(true);\r\n setError('');\r\n\r\n const [networksRes, tokensRes] = await Promise.all([\r\n paymentAPI.current.getNetworks(),\r\n paymentAPI.current.getStablecoins()\r\n ]);\r\n\r\n setNetworks(networksRes.networks || []);\r\n setTokens(tokensRes.stablecoins || []);\r\n\r\n if (debug) {\r\n console.log('Initialized networks:', networksRes.networks);\r\n console.log('Initialized tokens:', tokensRes.stablecoins);\r\n }\r\n } catch (err) {\r\n console.error('Failed to initialize payment:', err);\r\n setError('Failed to load payment options. Please try again.');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMethodSelect = (method) => {\r\n setPaymentMethod(method);\r\n setCurrentStep('select-network');\r\n };\r\n\r\n const handleNetworkSelect = async (network) => {\r\n setSelectedNetwork(network);\r\n\r\n const networkTokens = tokens.filter(token =>\r\n token.Network?.shortName === network.shortName || token.networkId === network.id\r\n );\r\n\r\n if (networkTokens.length > 0) {\r\n const preferredToken = networkTokens.find(t => t.symbol === 'USDT') || networkTokens[0];\r\n setSelectedToken(preferredToken);\r\n await initiatePayment(network, preferredToken);\r\n }\r\n };\r\n\r\n const initiatePayment = async (network, token) => {\r\n try {\r\n setLoading(true);\r\n\r\n const paymentPayload = {\r\n amount: config.amount,\r\n currency: token.symbol,\r\n network: network.shortName,\r\n customerEmail: config.customerEmail,\r\n callbackUrl: config.callbackUrl,\r\n metadata: {\r\n ...config.metadata,\r\n paymentMethod,\r\n selectedNetwork: network.shortName,\r\n selectedToken: token.symbol\r\n }\r\n };\r\n\r\n const payment = await paymentAPI.current.createPayment(paymentPayload);\r\n setPaymentData(payment.payment);\r\n\r\n if (paymentMethod === 'wallet') {\r\n setCurrentStep('wallet-connect');\r\n } else {\r\n await generateQRCode(payment.payment);\r\n setCurrentStep('qr-code');\r\n }\r\n } catch (err) {\r\n console.error('Payment initiation failed:', err);\r\n setError(err.message || 'Failed to create payment');\r\n setCurrentStep('error');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const generateQRCode = async (payment) => {\r\n try {\r\n const recipientAddress = payment.metadata?.recipientWallet ||\r\n config.merchantWalletAddresses?.[selectedNetwork?.shortName || ''];\r\n\r\n if (!recipientAddress) {\r\n throw new Error('Recipient wallet address not found');\r\n }\r\n\r\n let qrData = '';\r\n\r\n if (selectedNetwork?.type === 'ethereum' || selectedNetwork?.type === 'bsc') {\r\n qrData = selectedToken?.contractAddress\r\n ? `ethereum:${selectedToken.contractAddress}/transfer?address=${recipientAddress}&uint256=${payment.totalAmount * Math.pow(10, selectedToken.decimals)}`\r\n : `ethereum:${recipientAddress}?value=${payment.totalAmount}e18`;\r\n } else if (selectedNetwork?.type === 'tron') {\r\n qrData = `tron:${recipientAddress}?amount=${payment.totalAmount}`;\r\n } else {\r\n qrData = `${selectedToken?.symbol}:${recipientAddress}?amount=${payment.totalAmount}`;\r\n }\r\n\r\n const qrCodeDataURL = await QRCodeLib.toDataURL(qrData, {\r\n width: 256,\r\n margin: 2,\r\n color: {\r\n dark: theme === 'dark' ? '#FFFFFF' : '#000000',\r\n light: theme === 'dark' ? '#000000' : '#FFFFFF'\r\n }\r\n });\r\n\r\n // setQrCode(qrCodeDataURL);\r\n setQrCode(recipientAddress);\r\n startPaymentVerification(payment.id);\r\n\r\n } catch (err) {\r\n console.error('QR code generation failed:', err);\r\n setError('Failed to generate QR code');\r\n setCurrentStep('error');\r\n }\r\n };\r\n\r\n const startPaymentVerification = async (paymentId) => {\r\n const maxAttempts = 60;\r\n let attempts = 0;\r\n\r\n const checkPayment = async () => {\r\n try {\r\n const result = await paymentAPI.current.verifyQRPayment(paymentId);\r\n\r\n if (result.verified && result.payment?.transactionHash) {\r\n setTxHash(result.payment.transactionHash);\r\n await handlePaymentSuccess(paymentId, result.payment.transactionHash);\r\n return true;\r\n }\r\n\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification timeout. Please check your transaction.');\r\n setCurrentStep('error');\r\n }\r\n\r\n return false;\r\n } catch (err) {\r\n console.error('Payment verification error:', err);\r\n attempts++;\r\n if (attempts < maxAttempts) {\r\n setTimeout(checkPayment, 5000);\r\n } else {\r\n setError('Payment verification failed');\r\n setCurrentStep('error');\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n setTimeout(checkPayment, 2000);\r\n };\r\n\r\n const handleTransactionSent = async (transactionHash) => {\r\n setTxHash(transactionHash);\r\n setCurrentStep('processing');\r\n\r\n try {\r\n await paymentAPI.current.processPayment(\r\n paymentData.id,\r\n transactionHash,\r\n selectedNetwork?.shortName || '',\r\n ''\r\n );\r\n\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n } catch (error) {\r\n console.error('Payment processing failed:', error);\r\n await handlePaymentSuccess(paymentData.id, transactionHash);\r\n }\r\n };\r\n\r\n const handlePaymentSuccess = async (paymentId, transactionHash) => {\r\n setCurrentStep('success');\r\n\r\n if (onSuccess) {\r\n onSuccess(paymentId, transactionHash, {\r\n network: selectedNetwork?.name,\r\n token: selectedToken?.symbol,\r\n amount: paymentData?.totalAmount,\r\n method: paymentMethod\r\n });\r\n }\r\n };\r\n\r\n const copyToClipboard = async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setCurrentStep('select-method');\r\n setPaymentMethod(null);\r\n setSelectedNetwork(null);\r\n setSelectedToken(null);\r\n setQrCode('');\r\n setPaymentData(null);\r\n setError('');\r\n setTxHash('');\r\n\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const goBack = () => {\r\n if (currentStep === 'select-network') {\r\n setCurrentStep('select-method');\r\n } else if (currentStep === 'wallet-connect' || currentStep === 'qr-code') {\r\n setCurrentStep('select-network');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <CoinleyWalletProvider config={walletConfig} walletConfig={{ appName: merchantName || 'Coinley Payment' }}>\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm\">\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n className={`relative w-full max-w-md mx-4 rounded-2xl shadow-2xl overflow-hidden ${theme === 'dark' ? 'bg-gray-900 text-white' : 'bg-white text-gray-900'\r\n }`}\r\n >\r\n {/* Header */}\r\n <div className=\"relative p-6 border-b border-gray-200 dark:border-gray-700\">\r\n {(currentStep !== 'select-method' && currentStep !== 'success' && currentStep !== 'error') && (\r\n <button\r\n onClick={goBack}\r\n className=\"absolute left-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute right-4 top-6 p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n\r\n <div className=\"text-center\">\r\n <div className=\"flex items-center justify-center space-x-2 mb-2\">\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n <h2 className=\"text-xl font-bold\">Pay with Crypto</h2>\r\n <Sparkles className=\"w-5 h-5 text-[#7042D2]\" />\r\n </div>\r\n {merchantName && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\r\n {merchantName}\r\n </p>\r\n )}\r\n <div className=\"mt-2\">\r\n <span className=\"text-2xl font-bold text-[#7042D2]\">\r\n ${config.amount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"p-6 min-h-[400px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {/* Step 1: Select Payment Method */}\r\n {currentStep === 'select-method' && (\r\n <motion.div\r\n key=\"select-method\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Choose Payment Method\r\n </h3>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('wallet')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <Wallet className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">Connect Wallet</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n MetaMask, WalletConnect & more\r\n </div>\r\n </div>\r\n <Zap className=\"w-5 h-5 text-[#7042D2] ml-auto\" />\r\n </div>\r\n </motion.button>\r\n\r\n <motion.button\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleMethodSelect('qr')}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"p-3 bg-[#7042D2] bg-opacity-10 rounded-lg group-hover:bg-opacity-20 transition-colors\">\r\n <QrCode className=\"w-6 h-6 text-[#7042D2]\" />\r\n </div>\r\n <div className=\"text-left\">\r\n <div className=\"font-semibold\">QR Code</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n Scan with mobile wallet\r\n </div>\r\n </div>\r\n </div>\r\n </motion.button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Step 2: Select Network */}\r\n {currentStep === 'select-network' && (\r\n <motion.div\r\n key=\"select-network\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"space-y-4\"\r\n >\r\n <h3 className=\"text-lg font-semibold text-center mb-6\">\r\n Select Network\r\n </h3>\r\n\r\n {loading ? (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3\">\r\n {networks.map((network) => (\r\n <motion.button\r\n key={network.id}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n onClick={() => handleNetworkSelect(network)}\r\n className=\"w-full p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl hover:border-[#7042D2] transition-colors group\"\r\n >\r\n <div className=\"flex items-center space-x-4\">\r\n {network.logo ? (\r\n <img\r\n src={network.logo}\r\n alt={network.name}\r\n className=\"w-8 h-8 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-8 h-8 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center\">\r\n <span className=\"text-sm font-bold text-[#7042D2]\">\r\n {network.shortName.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"text-left flex-1\">\r\n <div className=\"font-semibold\">{network.name}</div>\r\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {network.shortName.toUpperCase()}\r\n </div>\r\n </div>\r\n <ChevronDown className=\"w-5 h-5 text-gray-400 transform -rotate-90\" />\r\n </div>\r\n </motion.button>\r\n ))}\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Wallet Connect */}\r\n {currentStep === 'wallet-connect' && (\r\n <motion.div\r\n key=\"wallet-connect\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n >\r\n <WalletIntegration\r\n selectedNetwork={selectedNetwork}\r\n selectedToken={selectedToken}\r\n paymentData={paymentData}\r\n onTransactionSent={handleTransactionSent}\r\n onError={setError}\r\n isConnecting={isConnecting}\r\n setIsConnecting={setIsConnecting}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {/* QR Code */}\r\n {currentStep === 'qr-code' && (\r\n <motion.div\r\n key=\"qr-code\"\r\n initial={{ x: 20, opacity: 0 }}\r\n animate={{ x: 0, opacity: 1 }}\r\n exit={{ x: -20, opacity: 0 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Use your mobile wallet to scan and pay\r\n </p>\r\n </div>\r\n\r\n {qrCode && (\r\n <div className=\"bg-white p-4 rounded-xl mx-auto inline-block\">\r\n <img src={qrCode} alt=\"Payment QR Code\" className=\"w-48 h-48\" />\r\n </div>\r\n )}\r\n\r\n {paymentData && (\r\n <div className=\"space-y-3\">\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Network:</span>\r\n <span className=\"font-medium\">{selectedNetwork?.name}</span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Amount:</span>\r\n <span className=\"font-medium\">{paymentData.totalAmount} {selectedToken?.symbol}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-center space-x-2 text-sm text-gray-600 dark:text-gray-400\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span>Waiting for payment...</span>\r\n </div>\r\n </div>\r\n )}\r\n </motion.div>\r\n )}\r\n\r\n {/* Processing */}\r\n {currentStep === 'processing' && (\r\n <motion.div\r\n key=\"processing\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-[#7042D2] bg-opacity-20 rounded-full flex items-center justify-center mx-auto\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[#7042D2]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[#7042D2]\">Processing Payment...</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your transaction is being processed\r\n </p>\r\n </div>\r\n </motion.div>\r\n )}\r\n\r\n {/* Success */}\r\n {currentStep === 'success' && (\r\n <motion.div\r\n key=\"success\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto\">\r\n <CheckCircle2 className=\"w-8 h-8 text-green-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-green-600\">Payment Successful!</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n Your payment has been processed successfully\r\n </p>\r\n </div>\r\n\r\n {txHash && (\r\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">Transaction:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"font-mono text-sm\">\r\n {txHash.slice(0, 6)}...{txHash.slice(-4)}\r\n </span>\r\n <button\r\n onClick={() => copyToClipboard(txHash)}\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {selectedNetwork?.explorerUrl && (\r\n <a\r\n href={`${selectedNetwork.explorerUrl}/tx/${txHash}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\"\r\n >\r\n <ExternalLink className=\"w-4 h-4\" />\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </motion.div>\r\n )}\r\n\r\n {/* Error */}\r\n {currentStep === 'error' && (\r\n <motion.div\r\n key=\"error\"\r\n initial={{ scale: 0.8, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n className=\"text-center space-y-6\"\r\n >\r\n <div className=\"w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto\">\r\n <AlertCircle className=\"w-8 h-8 text-red-500\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-red-600\">Payment Failed</h3>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {error || 'Something went wrong. Please try again.'}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n <button\r\n onClick={() => {\r\n setCurrentStep('select-method');\r\n setError('');\r\n }}\r\n className=\"w-full bg-[#7042D2] text-white py-3 rounded-lg font-semibold hover:bg-[#7042D2]/90 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n <button\r\n onClick={handleClose}\r\n className=\"w-full border border-gray-300 dark:border-gray-600 py-3 rounded-lg font-semibold hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 text-center\">\r\n <p className=\"text-xs text-gray-500\">\r\n Powered by <span className=\"font-semibold text-[#7042D2]\">Coinley</span>\r\n </p>\r\n </div>\r\n </motion.div>\r\n </div>\r\n\r\n <WalletModal />\r\n </CoinleyWalletProvider>\r\n );\r\n};\r\n\r\nexport default CoinleyPayment;","//src/CoinleyProvider.jsx\r\nimport React, { createContext, useContext, useRef, forwardRef, useImperativeHandle } from 'react';\r\nimport CoinleyPayment from './CoinleyPayment';\r\n\r\nconst CoinleyContext = createContext(null);\r\n\r\nexport const CoinleyProvider = ({\r\n apiKey,\r\n apiSecret,\r\n apiUrl,\r\n theme = 'light',\r\n debug = false,\r\n children\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [paymentConfig, setPaymentConfig] = React.useState(null);\r\n const [callbacks, setCallbacks] = React.useState({});\r\n const [merchantName, setMerchantName] = React.useState('');\r\n\r\n const openPayment = (config, checkoutCallbacks) => {\r\n setPaymentConfig(config);\r\n if (checkoutCallbacks) {\r\n setCallbacks(checkoutCallbacks);\r\n }\r\n setIsOpen(true);\r\n };\r\n\r\n const closePayment = () => {\r\n setIsOpen(false);\r\n setPaymentConfig(null);\r\n if (callbacks.onClose) {\r\n callbacks.onClose();\r\n }\r\n };\r\n\r\n const contextValue = {\r\n openPayment,\r\n closePayment\r\n };\r\n\r\n return (\r\n <CoinleyContext.Provider value={contextValue}>\r\n {children}\r\n {isOpen && paymentConfig && (\r\n <CoinleyPayment\r\n apiKey={apiKey}\r\n apiSecret={apiSecret}\r\n apiUrl={apiUrl}\r\n isOpen={isOpen}\r\n config={paymentConfig}\r\n theme={theme}\r\n debug={debug}\r\n merchantName={merchantName}\r\n onSuccess={callbacks.onSuccess}\r\n onError={callbacks.onError}\r\n onClose={closePayment}\r\n />\r\n )}\r\n </CoinleyContext.Provider>\r\n );\r\n};\r\n\r\nexport const CoinleyCheckout = forwardRef((\r\n {\r\n customerEmail = '',\r\n merchantName = '',\r\n onSuccess,\r\n onError,\r\n onClose,\r\n theme = 'light',\r\n autoOpen = false,\r\n testMode = false,\r\n debug = false,\r\n merchantWalletAddresses = {}\r\n },\r\n ref\r\n) => {\r\n const context = useContext(CoinleyContext);\r\n\r\n if (!context) {\r\n throw new Error('CoinleyCheckout must be used within a CoinleyProvider');\r\n }\r\n\r\n const { openPayment, closePayment } = context;\r\n\r\n const open = (config) => {\r\n try {\r\n if (debug) {\r\n console.log('Opening Coinley checkout with config:', config);\r\n }\r\n\r\n if (!config.amount || config.amount <= 0) {\r\n throw new Error('Amount must be greater than 0');\r\n }\r\n\r\n const finalConfig = {\r\n ...config,\r\n customerEmail: config.customerEmail || customerEmail,\r\n merchantWalletAddresses: {\r\n ...merchantWalletAddresses,\r\n ...config.merchantWalletAddresses\r\n },\r\n metadata: {\r\n ...config.metadata,\r\n testMode,\r\n checkoutVersion: '1.0.0'\r\n }\r\n };\r\n\r\n const checkoutCallbacks = {\r\n onSuccess,\r\n onError,\r\n onClose\r\n };\r\n\r\n openPayment(finalConfig, checkoutCallbacks);\r\n } catch (error) {\r\n console.error('Failed to open Coinley checkout:', error);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n closePayment();\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n open,\r\n close\r\n }));\r\n\r\n return null;\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport const useCoinley = () => {\r\n const context = useContext(CoinleyContext);\r\n if (!context) {\r\n throw new Error('useCoinley must be used within a CoinleyProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ThemeProvider = ({\r\n initialTheme = 'light',\r\n children\r\n}) => {\r\n const [theme, setTheme] = React.useState(initialTheme);\r\n\r\n React.useEffect(() => {\r\n document.documentElement.setAttribute('data-coinley-theme', theme);\r\n }, [theme]);\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n };\r\n\r\n return (\r\n <div className={`coinley-theme-${theme}`}>\r\n {children}\r\n </div>\r\n );\r\n};","// Main SDK exports\r\nexport {\r\n CoinleyProvider,\r\n CoinleyCheckout,\r\n ThemeProvider,\r\n useCoinley\r\n} from './CoinleyProvider';\r\n\r\nexport { PaymentAPI } from './PaymentAPI';\r\nexport { default as CoinleyPayment } from './CoinleyPayment';\r\n\r\n// Import styles\r\nimport './styles/index.css';\r\n\r\n// Version\r\nexport const VERSION = '0.0.0';\r\n\r\n// Utils\r\nexport const utils = {\r\n formatAmount: (amount, decimals = 2) => amount.toFixed(decimals),\r\n \r\n truncateAddress: (address, startChars = 6, endChars = 4) => {\r\n if (!address) return '';\r\n if (address.length <= startChars + endChars) return address;\r\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\r\n },\r\n\r\n isValidAddress: (address, network) => {\r\n if (!address) return false;\r\n \r\n switch (network.toLowerCase()) {\r\n case 'ethereum':\r\n case 'bsc':\r\n case 'polygon':\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n case 'tron':\r\n return /^T[a-zA-Z0-9]{33}$/.test(address);\r\n case 'solana':\r\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\r\n default:\r\n return address.length > 0;\r\n }\r\n },\r\n\r\n copyToClipboard: async (text) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n};\r\n\r\n// Error classes\r\nexport class CoinleyError extends Error {\r\n constructor(message, code) {\r\n super(message);\r\n this.name = 'CoinleyError';\r\n this.code = code;\r\n }\r\n}\r\n\r\n// Default config\r\nexport const DEFAULT_CONFIG = {\r\n theme: 'light',\r\n debug: false,\r\n testMode: false,\r\n autoOpen: false\r\n};"],"names":["f","require$$0","k","Symbol","for","l","m","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","p","key","ref","__self","__source","q","c","a","g","b","d","e","h","call","defaultProps","$$typeof","type","props","_owner","current","reactJsxRuntime_production_min","jsx","jsxs","jsxRuntimeModule","exports","PaymentAPI","constructor","baseURL","apiKey","apiSecret","this","api","axios","create","endsWith","slice","timeout","headers","interceptors","request","use","config","token","generateMerchantToken","console","log","method","_a","toUpperCase","url","data","error","Promise","reject","response","status","_b","message","_c","Error","_d","_e","credentials","btoa","createPayment","params","post","getPayment","paymentId","get","getNetworks","networks","id","name","shortName","chainId","explorerUrl","isTestnet","getStablecoins","stablecoins","symbol","contractAddress","decimals","isStablecoin","networkId","Network","verifyQRPayment","processPayment","transactionHash","network","senderAddress","healthCheck","WalletIntegration","selectedNetwork","selectedToken","paymentData","onTransactionSent","onError","isConnecting","setIsConnecting","isConnected","address","useWallet","connectWallet","isPending","useWalletConnect","detectedWallets","hasWallets","walletCount","useWalletDetection","sendTransaction","useWalletTransaction","useEffect","handleSendTransaction","async","recipientAddress","metadata","recipientWallet","merchantWalletAddresses","txHash","amount","totalAmount","Math","pow","toString","transferData","padStart","parseInt","to","value","className","children","Wallet","jsxRuntimeExports","Loader2","map","wallet","index","onClick","disabled","icon","provider","CoinleyPayment","apiUrl","onSuccess","onClose","isOpen","theme","merchantName","debug","currentStep","setCurrentStep","useState","setNetworks","tokens","setTokens","setSelectedNetwork","setSelectedToken","paymentMethod","setPaymentMethod","qrCode","setQrCode","setPaymentData","loading","setLoading","setError","copied","setCopied","setTxHash","paymentAPI","useRef","walletConfig","createCoinleyWalletConfig","appName","appDescription","chains","initializePayment","networksRes","tokensRes","all","err","handleMethodSelect","initiatePayment","paymentPayload","currency","customerEmail","callbackUrl","payment","generateQRCode","config2","qrData","QRCodeLib","toDataURL","width","margin","color","dark","light","startPaymentVerification","attempts","checkPayment","result","verified","handlePaymentSuccess","setTimeout","handleClose","CoinleyWalletProvider","motion","div","initial","scale","opacity","animate","exit","ArrowLeft","X","Sparkles","toFixed","AnimatePresence","mode","x","button","whileHover","whileTap","Zap","QrCode","networkTokens","filter","length","preferredToken","find","t","handleNetworkSelect","logo","src","alt","charAt","ChevronDown","CheckCircle2","text","navigator","clipboard","writeText","copyToClipboard","Copy","href","target","rel","ExternalLink","AlertCircle","WalletModal","CoinleyContext","createContext","CoinleyCheckout","forwardRef","autoOpen","testMode","context","useContext","openPayment","closePayment","open","finalConfig","checkoutVersion","close","React","useImperativeHandle","displayName","utils","formatAmount","truncateAddress","startChars","endChars","isValidAddress","toLowerCase","test","CoinleyError","code","super","setIsOpen","paymentConfig","setPaymentConfig","callbacks","setCallbacks","setMerchantName","contextValue","checkoutCallbacks","Provider","initialTheme","setTheme","document","documentElement","setAttribute"],"mappings":"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","x_google_ignoreList":[0,1]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coinley-test",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "Beautiful blockchain payment gateway SDK for seamless crypto payments",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",