@moneymq/react 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/wallet-modal-provider.tsx","../src/wallet-modal.tsx","../src/pay-button.tsx","../src/payment-modal.tsx","../src/use-payment.ts"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react';\nimport { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets';\nimport { CustomWalletModalProvider, type Branding } from './wallet-modal-provider';\n\n// MoneyMQ client interface (matches @moneymq/sdk)\nexport interface MoneyMQClient {\n config: {\n endpoint: string;\n };\n}\n\nexport interface MoneyMQProviderProps {\n children: React.ReactNode;\n client: MoneyMQClient;\n branding?: Branding;\n}\n\n// Sandbox account interface\nexport interface SandboxAccount {\n id: string;\n name: string;\n address: string;\n secretKeyHex?: string;\n stablecoins?: {\n usdc?: string;\n };\n usdcBalance?: number;\n}\n\n// Sandbox context state\ninterface SandboxContextState {\n isSandboxMode: boolean;\n sandboxAccounts: SandboxAccount[];\n}\n\nconst MoneyMQContext = createContext<MoneyMQClient | null>(null);\nconst SandboxContext = createContext<SandboxContextState>({\n isSandboxMode: false,\n sandboxAccounts: [],\n});\n\nconst DEFAULT_RPC_URL = 'https://api.devnet.solana.com';\nconst SANDBOX_HASH_PREFIX = 'SURFNETxSAFEHASH';\n\ninterface ServerConfigResponse {\n x402?: {\n validator?: {\n rpcUrl?: string;\n };\n };\n}\n\ninterface SandboxAccountsResponse {\n solana?: {\n userAccounts?: Array<{\n address: string;\n label: string;\n secretKeyHex?: string;\n stablecoins?: {\n usdc?: string;\n };\n }>;\n };\n}\n\n/**\n * Normalize RPC URL for browser access (0.0.0.0 doesn't work in browsers)\n */\nfunction normalizeRpcUrl(url: string): string {\n return url.replace('0.0.0.0', 'localhost').replace('127.0.0.1', 'localhost');\n}\n\n/**\n * Get RPC URL from MoneyMQ server config\n */\nasync function getRpcUrl(apiUrl: string): Promise<string> {\n try {\n console.log('[MoneyMQ] Fetching config from:', `${apiUrl}/config`);\n const response = await fetch(`${apiUrl}/config`);\n const config = (await response.json()) as ServerConfigResponse;\n const rawRpcUrl = config.x402?.validator?.rpcUrl || DEFAULT_RPC_URL;\n console.log('[MoneyMQ] Raw RPC URL from config:', rawRpcUrl);\n const normalizedUrl = normalizeRpcUrl(rawRpcUrl);\n console.log('[MoneyMQ] Normalized RPC URL:', normalizedUrl);\n return normalizedUrl;\n } catch (err) {\n console.error('[MoneyMQ] Error fetching config:', err);\n return DEFAULT_RPC_URL;\n }\n}\n\n/**\n * Check if we're in sandbox mode by calling getLatestBlockhash RPC\n */\nasync function checkSandboxMode(rpcUrl: string): Promise<boolean> {\n try {\n console.log('[MoneyMQ] Checking sandbox mode with RPC:', rpcUrl);\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getLatestBlockhash',\n params: [{ commitment: 'finalized' }],\n }),\n });\n const data = await response.json();\n const blockhash = data?.result?.value?.blockhash || '';\n const isSandbox = blockhash.startsWith(SANDBOX_HASH_PREFIX);\n console.log('[MoneyMQ] Blockhash:', blockhash, '| Sandbox:', isSandbox);\n return isSandbox;\n } catch (err) {\n console.error('[MoneyMQ] Error checking sandbox mode:', err);\n return false;\n }\n}\n\n/**\n * Fetch token balance for a token account address\n */\nasync function fetchTokenBalance(rpcUrl: string, tokenAccountAddress: string): Promise<number> {\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [tokenAccountAddress, { encoding: 'jsonParsed' }],\n }),\n });\n const data = await response.json();\n if (data.result?.value?.data?.parsed?.info?.tokenAmount) {\n return parseFloat(data.result.value.data.parsed.info.tokenAmount.uiAmountString || '0');\n }\n return 0;\n } catch {\n return 0;\n }\n}\n\n/**\n * Fetch sandbox accounts from the MoneyMQ server\n */\nasync function fetchSandboxAccounts(apiUrl: string, rpcUrl: string): Promise<SandboxAccount[]> {\n try {\n console.log('[MoneyMQ] Fetching sandbox accounts from:', `${apiUrl}/sandbox/accounts`);\n const response = await fetch(`${apiUrl}/sandbox/accounts`);\n if (!response.ok) {\n console.log('[MoneyMQ] Sandbox accounts fetch failed:', response.status);\n return [];\n }\n\n const data = (await response.json()) as SandboxAccountsResponse;\n if (data.solana?.userAccounts) {\n // Fetch balances for each account in parallel\n const accounts = await Promise.all(\n data.solana.userAccounts.map(async (acc) => {\n let usdcBalance = 0;\n if (acc.stablecoins?.usdc) {\n usdcBalance = await fetchTokenBalance(rpcUrl, acc.stablecoins.usdc);\n }\n return {\n id: acc.address,\n name: acc.label,\n address: acc.address,\n secretKeyHex: acc.secretKeyHex,\n stablecoins: acc.stablecoins,\n usdcBalance,\n };\n })\n );\n console.log('[MoneyMQ] Sandbox accounts loaded:', accounts.length);\n return accounts;\n }\n return [];\n } catch (err) {\n console.error('[MoneyMQ] Error fetching sandbox accounts:', err);\n return [];\n }\n}\n\nexport function useMoneyMQ(): MoneyMQClient {\n const client = useContext(MoneyMQContext);\n if (!client) {\n throw new Error('useMoneyMQ must be used within a MoneyMQProvider');\n }\n return client;\n}\n\nexport function useSandbox(): SandboxContextState {\n return useContext(SandboxContext);\n}\n\nexport function MoneyMQProvider({\n children,\n client,\n branding,\n}: MoneyMQProviderProps) {\n const [rpcEndpoint, setRpcEndpoint] = useState<string | null>(null);\n const [isSandboxMode, setIsSandboxMode] = useState(false);\n const [sandboxAccounts, setSandboxAccounts] = useState<SandboxAccount[]>([]);\n\n useEffect(() => {\n async function initialize() {\n const rpcUrl = await getRpcUrl(client.config.endpoint);\n setRpcEndpoint(rpcUrl);\n\n // Check if we're in sandbox mode\n const isSandbox = await checkSandboxMode(rpcUrl);\n setIsSandboxMode(isSandbox);\n\n // If in sandbox mode, fetch sandbox accounts\n if (isSandbox) {\n const accounts = await fetchSandboxAccounts(client.config.endpoint, rpcUrl);\n setSandboxAccounts(accounts);\n }\n }\n initialize();\n }, [client.config.endpoint]);\n\n const wallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new SolflareWalletAdapter(),\n ],\n []\n );\n\n const sandboxContextValue = useMemo(\n () => ({ isSandboxMode, sandboxAccounts }),\n [isSandboxMode, sandboxAccounts]\n );\n\n // Don't render until we have the RPC endpoint\n if (!rpcEndpoint) {\n return null;\n }\n\n return (\n <MoneyMQContext.Provider value={client}>\n <SandboxContext.Provider value={sandboxContextValue}>\n <ConnectionProvider endpoint={rpcEndpoint}>\n <WalletProvider wallets={wallets} autoConnect>\n <CustomWalletModalProvider branding={branding}>\n {children}\n </CustomWalletModalProvider>\n </WalletProvider>\n </ConnectionProvider>\n </SandboxContext.Provider>\n </MoneyMQContext.Provider>\n );\n}\n","'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport { WalletModal } from './wallet-modal';\n\nexport interface Branding {\n logo?: string;\n title?: string;\n description?: string;\n accentColor?: string;\n}\n\ninterface WalletModalContextState {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n}\n\nconst WalletModalContext = createContext<WalletModalContextState>({\n visible: false,\n setVisible: () => {},\n});\n\nconst BrandingContext = createContext<Branding | undefined>(undefined);\n\nexport function useWalletModal() {\n return useContext(WalletModalContext);\n}\n\nexport function useBranding() {\n return useContext(BrandingContext);\n}\n\nexport interface CustomWalletModalProviderProps {\n children: React.ReactNode;\n branding?: Branding;\n}\n\nexport function CustomWalletModalProvider({ children, branding }: CustomWalletModalProviderProps) {\n const [visible, setVisible] = useState(false);\n\n const handleClose = useCallback(() => setVisible(false), []);\n\n const contextValue = useMemo(\n () => ({ visible, setVisible }),\n [visible]\n );\n\n return (\n <BrandingContext.Provider value={branding}>\n <WalletModalContext.Provider value={contextValue}>\n {children}\n <WalletModal visible={visible} onClose={handleClose} branding={branding} />\n </WalletModalContext.Provider>\n </BrandingContext.Provider>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport type { Wallet } from '@solana/wallet-adapter-react';\n\nexport interface WalletModalProps {\n visible: boolean;\n onClose: () => void;\n branding?: {\n logo?: string;\n title?: string;\n description?: string;\n accentColor?: string;\n };\n}\n\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n backdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n animation: 'fadeIn 150ms ease-out',\n};\n\nconst modalStyle: React.CSSProperties = {\n backgroundColor: '#18181b',\n borderRadius: '1rem',\n padding: '1.5rem',\n width: '100%',\n maxWidth: '400px',\n maxHeight: '90vh',\n overflow: 'auto',\n border: '1px solid #27272a',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\n animation: 'slideUp 150ms ease-out',\n};\n\nconst headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n marginBottom: '0.5rem',\n};\n\nconst logoStyle: React.CSSProperties = {\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.5rem',\n objectFit: 'contain',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '1.25rem',\n fontWeight: 600,\n color: '#fafafa',\n margin: 0,\n};\n\nconst descriptionStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n color: '#a1a1aa',\n marginBottom: '1.5rem',\n};\n\nconst walletListStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n};\n\nconst walletButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.875rem 1rem',\n backgroundColor: '#27272a',\n border: '1px solid #3f3f46',\n borderRadius: '0.75rem',\n cursor: 'pointer',\n transition: 'all 150ms',\n textAlign: 'left',\n};\n\nconst walletIconStyle: React.CSSProperties = {\n width: '2rem',\n height: '2rem',\n borderRadius: '0.375rem',\n};\n\nconst walletNameStyle: React.CSSProperties = {\n flex: 1,\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fafafa',\n};\n\nconst walletTagStyle: React.CSSProperties = {\n fontSize: '0.75rem',\n padding: '0.25rem 0.5rem',\n borderRadius: '9999px',\n backgroundColor: '#3f3f46',\n color: '#a1a1aa',\n};\n\nconst closeButtonStyle: React.CSSProperties = {\n position: 'absolute',\n top: '1rem',\n right: '1rem',\n padding: '0.5rem',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n color: '#71717a',\n transition: 'color 150ms',\n};\n\nconst noWalletsStyle: React.CSSProperties = {\n textAlign: 'center',\n padding: '2rem 1rem',\n color: '#a1a1aa',\n fontSize: '0.875rem',\n};\n\nexport function WalletModal({ visible, onClose, branding }: WalletModalProps) {\n const { wallets, select, connecting } = useWallet();\n const [hoveredWallet, setHoveredWallet] = useState<string | null>(null);\n\n const accentColor = branding?.accentColor || '#ec4899';\n\n // Filter and sort wallets\n const sortedWallets = useMemo(() => {\n const installed: Wallet[] = [];\n const notInstalled: Wallet[] = [];\n\n for (const wallet of wallets) {\n if (wallet.readyState === 'Installed') {\n installed.push(wallet);\n } else if (wallet.readyState === 'Loadable' || wallet.readyState === 'NotDetected') {\n notInstalled.push(wallet);\n }\n }\n\n return [...installed, ...notInstalled];\n }, [wallets]);\n\n const handleSelect = useCallback((wallet: Wallet) => {\n select(wallet.adapter.name);\n onClose();\n }, [select, onClose]);\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n if (visible) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = '';\n };\n }, [visible, onClose]);\n\n if (!visible) return null;\n\n return (\n <>\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes slideUp {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n <div style={overlayStyle} onClick={onClose}>\n <div\n style={{ ...modalStyle, position: 'relative' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Close button */}\n <button\n style={closeButtonStyle}\n onClick={onClose}\n onMouseEnter={(e) => (e.currentTarget.style.color = '#fafafa')}\n onMouseLeave={(e) => (e.currentTarget.style.color = '#71717a')}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {/* Header */}\n <div style={headerStyle}>\n {branding?.logo && (\n <img src={branding.logo} alt=\"\" style={logoStyle} />\n )}\n <h2 style={titleStyle}>\n {branding?.title || 'Connect Wallet'}\n </h2>\n </div>\n\n {/* Description */}\n <p style={descriptionStyle}>\n {branding?.description || 'Select a wallet to connect and pay securely.'}\n </p>\n\n {/* Wallet list */}\n <div style={walletListStyle}>\n {sortedWallets.length === 0 ? (\n <div style={noWalletsStyle}>\n No wallets found. Please install a Solana wallet extension.\n </div>\n ) : (\n sortedWallets.map((wallet) => {\n const isInstalled = wallet.readyState === 'Installed';\n const isHovered = hoveredWallet === wallet.adapter.name;\n\n return (\n <button\n key={wallet.adapter.name}\n style={{\n ...walletButtonStyle,\n backgroundColor: isHovered ? '#3f3f46' : '#27272a',\n borderColor: isHovered ? accentColor : '#3f3f46',\n }}\n onClick={() => handleSelect(wallet)}\n onMouseEnter={() => setHoveredWallet(wallet.adapter.name)}\n onMouseLeave={() => setHoveredWallet(null)}\n disabled={connecting}\n >\n <img\n src={wallet.adapter.icon}\n alt={wallet.adapter.name}\n style={walletIconStyle}\n />\n <span style={walletNameStyle}>{wallet.adapter.name}</span>\n {isInstalled ? (\n <span style={{ ...walletTagStyle, backgroundColor: accentColor + '20', color: accentColor }}>\n Detected\n </span>\n ) : (\n <span style={walletTagStyle}>Install</span>\n )}\n </button>\n );\n })\n )}\n </div>\n </div>\n </div>\n </>\n );\n}\n","'use client';\n\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { PaymentModal } from './payment-modal';\nimport { useMoneyMQ } from './provider';\n\nexport interface Payment {\n id: string;\n amount: number;\n currency: string;\n status: 'pending' | 'completed' | 'failed';\n signature?: string;\n}\n\ninterface PriceDetails {\n id: string;\n unit_amount: number;\n currency: string;\n product: string;\n}\n\ninterface ProductDetails {\n id: string;\n name: string;\n description?: string;\n}\n\ninterface ServerConfig {\n x402?: {\n payoutAccount?: {\n address?: string;\n currency?: string;\n };\n };\n}\n\nexport interface Price {\n id: string;\n unit_amount: number;\n currency: string;\n product?: string;\n}\n\nexport interface Product {\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface PayButtonProps {\n /** Price ID to fetch details from API */\n priceId?: string;\n /** Price object (alternative to priceId) */\n price?: Price;\n /** Product object */\n product?: Product;\n onSuccess?: (payment: Payment) => void;\n onError?: (error: Error) => void;\n variant?: 'solid' | 'outline';\n children?: React.ReactNode;\n disabled?: boolean;\n}\n\nconst baseStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n padding: '0.625rem 1rem',\n cursor: 'pointer',\n transition: 'all 200ms',\n border: 'none',\n};\n\nconst solidStyle: React.CSSProperties = {\n ...baseStyle,\n backgroundColor: '#ec4899',\n color: 'white',\n boxShadow: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n};\n\nconst outlineStyle: React.CSSProperties = {\n ...baseStyle,\n backgroundColor: 'transparent',\n color: '#ec4899',\n border: '1px solid #ec4899',\n};\n\nexport const PayButton = forwardRef<HTMLButtonElement, PayButtonProps>(\n function PayButton(\n {\n priceId,\n price: priceObject,\n product: productObject,\n onSuccess,\n onError,\n variant = 'solid',\n children,\n disabled,\n },\n ref\n ) {\n const client = useMoneyMQ();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Check if price object is provided directly\n const hasPriceObject = priceObject !== undefined;\n\n const [isLoading, setIsLoading] = useState(!hasPriceObject);\n const [error, setError] = useState<string | null>(null);\n\n // Payment data (unit_amount is in cents)\n const [amount, setAmount] = useState<number>(hasPriceObject ? priceObject.unit_amount / 100 : 0);\n const [currency, setCurrency] = useState<string>(hasPriceObject ? priceObject.currency.toUpperCase() : 'USDC');\n const [recipient, setRecipient] = useState<string>('');\n const [productName, setProductName] = useState<string | undefined>(productObject?.name);\n\n useEffect(() => {\n async function fetchPaymentDetails() {\n setIsLoading(true);\n setError(null);\n\n try {\n const apiUrl = client.config.endpoint;\n\n // Fetch server config to get recipient\n const configResponse = await fetch(`${apiUrl}/config`);\n if (!configResponse.ok) {\n throw new Error(`Failed to fetch config: ${configResponse.status}`);\n }\n const config = (await configResponse.json()) as ServerConfig;\n if (config.x402?.payoutAccount?.address) {\n setRecipient(config.x402.payoutAccount.address);\n }\n\n // If price object provided, use it directly\n if (hasPriceObject) {\n setAmount(priceObject.unit_amount / 100);\n setCurrency(priceObject.currency.toUpperCase());\n\n // Use product object if provided, otherwise fetch\n if (productObject) {\n setProductName(productObject.name);\n } else if (priceObject.product) {\n try {\n const productResponse = await fetch(`${apiUrl}/catalog/v1/products/${priceObject.product}`);\n if (productResponse.ok) {\n const product = (await productResponse.json()) as ProductDetails;\n setProductName(product.name);\n }\n } catch {\n // Product fetch is optional, ignore errors\n }\n }\n } else if (priceId) {\n // Fetch price details by ID\n const priceResponse = await fetch(`${apiUrl}/catalog/v1/prices/${priceId}`);\n if (!priceResponse.ok) {\n throw new Error(`Failed to fetch price: ${priceResponse.status}`);\n }\n const price = (await priceResponse.json()) as PriceDetails;\n setAmount(price.unit_amount / 100);\n setCurrency(price.currency.toUpperCase());\n\n // Fetch product details if available\n if (price.product) {\n try {\n const productResponse = await fetch(`${apiUrl}/catalog/v1/products/${price.product}`);\n if (productResponse.ok) {\n const product = (await productResponse.json()) as ProductDetails;\n setProductName(product.name);\n }\n } catch {\n // Product fetch is optional, ignore errors\n }\n }\n } else {\n throw new Error('Either priceId or price object is required');\n }\n } catch (err) {\n console.error('[PayButton] Error fetching payment details:', err);\n const errorMessage = err instanceof Error ? err.message : 'Failed to load payment details';\n setError(errorMessage);\n onError?.(new Error(errorMessage));\n } finally {\n setIsLoading(false);\n }\n }\n\n fetchPaymentDetails();\n }, [priceId, priceObject, productObject, client.config.endpoint, onError, hasPriceObject]);\n\n const handleClick = () => {\n if (!isLoading && !error) {\n setIsModalOpen(true);\n }\n };\n\n const handlePaymentSuccess = (signature: string) => {\n const payment: Payment = {\n id: `pay_${Date.now()}`,\n amount,\n currency,\n status: 'completed',\n signature,\n };\n onSuccess?.(payment);\n };\n\n const handlePaymentError = (error: Error) => {\n onError?.(error);\n };\n\n const isDisabled = disabled || isLoading || !!error;\n\n const buttonStyle: React.CSSProperties = {\n ...(variant === 'outline' ? outlineStyle : solidStyle),\n backgroundColor: variant === 'solid'\n ? (isHovered && !isDisabled ? '#db2777' : '#ec4899')\n : (isHovered && !isDisabled ? 'rgba(236, 72, 153, 0.1)' : 'transparent'),\n opacity: isDisabled ? 0.5 : 1,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n };\n\n return (\n <>\n <button\n ref={ref}\n onClick={handleClick}\n disabled={isDisabled}\n style={buttonStyle}\n title={error || undefined}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {isLoading ? (\n <span>Loading...</span>\n ) : error ? (\n <span>Error</span>\n ) : (\n children || <span>Pay</span>\n )}\n </button>\n\n <PaymentModal\n visible={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n amount={amount}\n currency={currency}\n recipient={recipient}\n productName={productName}\n onSuccess={handlePaymentSuccess}\n onError={handlePaymentError}\n />\n </>\n );\n }\n);\n","'use client';\n\nimport React, { useCallback, useState } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport type { Wallet } from '@solana/wallet-adapter-react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { useBranding } from './wallet-modal-provider';\nimport { useMoneyMQ, useSandbox, type SandboxAccount } from './provider';\n\n// Helper to convert object to form-encoded data\nfunction encodeFormData(data: Record<string, unknown>): string {\n const params = new URLSearchParams();\n\n const addParams = (obj: Record<string, unknown>, prefix = '') => {\n for (const [key, value] of Object.entries(obj)) {\n const paramKey = prefix ? `${prefix}[${key}]` : key;\n\n if (value === null || value === undefined) {\n continue;\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n addParams(value as Record<string, unknown>, paramKey);\n } else {\n params.append(paramKey, String(value));\n }\n }\n };\n\n addParams(data);\n return params.toString();\n}\n\n// Normalize RPC URL for browser access\nfunction normalizeRpcUrl(url: string): string {\n return url.replace('0.0.0.0', 'localhost').replace('127.0.0.1', 'localhost');\n}\n\n// Handle 402 Payment Required responses\nasync function makeRequestWith402Handling(\n url: string,\n method: 'POST' | 'GET',\n body: Record<string, unknown> | undefined,\n secretKeyHex: string,\n rpcUrl: string,\n headers: Record<string, string> = {}\n): Promise<unknown> {\n console.log(`[MoneyMQ] Making ${method} request to ${url}`);\n const formData = body ? encodeFormData(body) : undefined;\n\n let response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers,\n },\n body: formData,\n });\n\n let data = await response.json();\n console.log(`[MoneyMQ] Response status: ${response.status}`, data);\n\n // Handle 402 Payment Required\n if (response.status === 402) {\n console.log('[MoneyMQ] 💳 402 Payment Required - processing payment...');\n\n const paymentRequirements = data?.payment_requirements || data?.error?.payment_requirements || [];\n\n if (paymentRequirements.length === 0) {\n console.warn('[MoneyMQ] ⚠️ No payment requirements found in 402 response');\n throw new Error('Payment required but no payment requirements provided');\n }\n\n console.log('[MoneyMQ] Payment requirements:', paymentRequirements);\n\n // Dynamic import x402 libraries\n const { createPaymentHeader, selectPaymentRequirements } = await import('x402/client');\n const { createSigner } = await import('x402-fetch');\n\n // Create signer from secret key\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const signer = await createSigner('solana', secretKeyHex, {\n svmConfig: rpcUrl,\n });\n\n // Select appropriate payment requirement\n const selectedPaymentRequirement = selectPaymentRequirements(paymentRequirements, 'solana', 'exact');\n\n console.log(`[MoneyMQ] 💰 Creating payment for ${selectedPaymentRequirement.network}...`);\n\n // Create payment header\n const paymentHeaderValue = await createPaymentHeader(\n signer,\n 1, // x402Version\n selectedPaymentRequirement,\n {\n svmConfig: {\n rpcUrl,\n },\n }\n );\n\n console.log('[MoneyMQ] ✅ Payment header created, retrying request...');\n\n // Retry with X-Payment header\n response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-Payment': paymentHeaderValue,\n ...headers,\n },\n body: formData,\n });\n\n data = await response.json();\n console.log(`[MoneyMQ] Retry response status: ${response.status}`, data);\n\n if (!response.ok) {\n throw new Error(data.error?.message || 'Request failed after payment');\n }\n } else if (!response.ok) {\n throw new Error(data.error?.message || 'Request failed');\n }\n\n return data;\n}\n\n// Create and confirm payment intent for sandbox accounts\nasync function createSandboxPayment(\n apiUrl: string,\n rpcUrl: string,\n amount: number,\n currency: string,\n recipient: string,\n senderAddress: string,\n secretKeyHex: string,\n productName?: string\n): Promise<string> {\n console.log('[MoneyMQ] Creating sandbox payment...', { amount, currency, recipient, senderAddress });\n\n // Step 1: Create payment intent\n const paymentIntent = await makeRequestWith402Handling(\n `${apiUrl}/catalog/v1/payment_intents`,\n 'POST',\n {\n amount: Math.round(amount * 100), // Convert to cents (Stripe-style)\n currency: currency.toLowerCase(),\n customer: senderAddress,\n description: productName ? `Purchase - ${productName}` : 'Payment',\n metadata: {\n sender_address: senderAddress,\n recipient_address: recipient,\n },\n },\n secretKeyHex,\n rpcUrl\n ) as { id: string };\n\n console.log('[MoneyMQ] Payment intent created:', paymentIntent);\n\n // Step 2: Confirm payment intent\n console.log('[MoneyMQ] Confirming payment intent:', paymentIntent.id);\n const confirmedIntent = await makeRequestWith402Handling(\n `${apiUrl}/catalog/v1/payment_intents/${paymentIntent.id}/confirm`,\n 'POST',\n {},\n secretKeyHex,\n rpcUrl\n ) as { id: string; status: string };\n\n console.log('[MoneyMQ] Payment intent confirmed:', confirmedIntent);\n\n return confirmedIntent.id;\n}\n\n// Payment method types\ntype PaymentMethodType = 'browser_extension' | 'sandbox_account';\n\ninterface SelectedPaymentMethod {\n type: PaymentMethodType;\n wallet?: Wallet;\n sandboxAccount?: SandboxAccount;\n}\n\nexport interface PaymentModalProps {\n visible: boolean;\n onClose: () => void;\n amount: number;\n currency: string;\n recipient: string;\n productName?: string;\n onSuccess?: (signature: string) => void;\n onError?: (error: Error) => void;\n accentColor?: string;\n}\n\nconst truncateAddress = (address: string) => {\n if (address.length <= 12) return address;\n return `${address.slice(0, 4)}...${address.slice(-4)}`;\n};\n\nexport function PaymentModal({\n visible,\n onClose,\n amount,\n currency,\n recipient,\n productName,\n onSuccess,\n onError,\n accentColor = '#ec4899',\n}: PaymentModalProps) {\n const [isSending, setIsSending] = useState(false);\n const [copiedSender, setCopiedSender] = useState(false);\n const [copiedRecipient, setCopiedRecipient] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n const [selectedWallet, setSelectedWallet] = useState<Wallet | null>(null);\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<SelectedPaymentMethod | null>(null);\n const { publicKey, connected, disconnect, wallets, select, wallet: connectedWallet } = useWallet();\n const branding = useBranding();\n const { isSandboxMode, sandboxAccounts } = useSandbox();\n const client = useMoneyMQ();\n\n const copyToClipboard = (text: string, type: 'sender' | 'recipient') => {\n navigator.clipboard.writeText(text);\n if (type === 'sender') {\n setCopiedSender(true);\n setTimeout(() => setCopiedSender(false), 2000);\n } else {\n setCopiedRecipient(true);\n setTimeout(() => setCopiedRecipient(false), 2000);\n }\n };\n\n const handleSelectWallet = (wallet: Wallet) => {\n setSelectedWallet(wallet);\n setSelectedPaymentMethod({ type: 'browser_extension', wallet });\n select(wallet.adapter.name);\n };\n\n const handleSelectSandboxAccount = (account: SandboxAccount) => {\n setSelectedPaymentMethod({ type: 'sandbox_account', sandboxAccount: account });\n setSelectedWallet(null);\n };\n\n const handleDisconnect = async () => {\n await disconnect();\n setSelectedWallet(null);\n setSelectedPaymentMethod(null);\n };\n\n // Filter to only show installed/detected wallets\n const availableWallets = wallets.filter(\n (wallet) => wallet.readyState === 'Installed' || wallet.readyState === 'Loadable'\n );\n\n // Limit sandbox accounts to first 3\n const displayedSandboxAccounts = sandboxAccounts.slice(0, 3);\n\n // Get the current wallet icon (connected wallet, selected wallet, or default)\n const currentWalletIcon = connectedWallet?.adapter.icon || selectedWallet?.adapter.icon;\n const currentWalletName = connectedWallet?.adapter.name || selectedWallet?.adapter.name;\n\n // Get current selection display info\n const getCurrentSelectionDisplay = () => {\n if (connected && publicKey) {\n return {\n icon: currentWalletIcon,\n name: currentWalletName,\n address: publicKey.toBase58(),\n type: 'browser_extension' as const,\n };\n }\n if (selectedPaymentMethod?.type === 'sandbox_account' && selectedPaymentMethod.sandboxAccount) {\n const name = selectedPaymentMethod.sandboxAccount.name;\n return {\n icon: null,\n name: name.charAt(0).toUpperCase() + name.slice(1),\n address: selectedPaymentMethod.sandboxAccount.address,\n type: 'sandbox_account' as const,\n };\n }\n return null;\n };\n\n const currentSelection = getCurrentSelectionDisplay();\n\n const handlePay = useCallback(async () => {\n if (!recipient) return;\n\n // Determine the sender based on payment method\n let senderAddress: string;\n let secretKeyHex: string | undefined;\n\n if (selectedPaymentMethod?.type === 'sandbox_account' && selectedPaymentMethod.sandboxAccount) {\n senderAddress = selectedPaymentMethod.sandboxAccount.address;\n secretKeyHex = selectedPaymentMethod.sandboxAccount.secretKeyHex;\n } else if (publicKey) {\n senderAddress = publicKey.toBase58();\n } else {\n return;\n }\n\n setIsSending(true);\n\n try {\n // For sandbox accounts, handle payment directly\n if (selectedPaymentMethod?.type === 'sandbox_account' && secretKeyHex) {\n const apiUrl = normalizeRpcUrl(client.config.endpoint);\n\n // Fetch RPC URL from config\n let rpcUrl = 'http://localhost:8899';\n try {\n const configResponse = await fetch(`${apiUrl}/config`);\n const config = await configResponse.json();\n rpcUrl = normalizeRpcUrl(config.x402?.validator?.rpcUrl || rpcUrl);\n } catch {\n console.log('[MoneyMQ] Using default RPC URL');\n }\n\n const paymentId = await createSandboxPayment(\n apiUrl,\n rpcUrl,\n amount,\n currency,\n recipient,\n senderAddress,\n secretKeyHex,\n productName\n );\n\n setIsSending(false);\n onSuccess?.(paymentId);\n onClose();\n return;\n }\n\n // For browser extension wallets, dispatch event for external handling\n const event = new CustomEvent('moneymq:payment-initiated', {\n detail: {\n amount,\n currency,\n recipient,\n sender: senderAddress,\n paymentMethod: selectedPaymentMethod?.type || 'browser_extension',\n },\n bubbles: true,\n });\n window.dispatchEvent(event);\n\n const signature = await new Promise<string>((resolve, reject) => {\n const handleSuccess = (e: Event) => {\n const customEvent = e as CustomEvent<{ signature: string }>;\n cleanup();\n resolve(customEvent.detail.signature);\n };\n\n const handleError = (e: Event) => {\n const customEvent = e as CustomEvent<Error>;\n cleanup();\n reject(customEvent.detail);\n };\n\n const cleanup = () => {\n window.removeEventListener('moneymq:payment-success', handleSuccess);\n window.removeEventListener('moneymq:payment-error', handleError);\n };\n\n window.addEventListener('moneymq:payment-success', handleSuccess);\n window.addEventListener('moneymq:payment-error', handleError);\n\n setTimeout(() => {\n cleanup();\n reject(new Error('Payment timeout'));\n }, 60000);\n });\n\n setIsSending(false);\n onSuccess?.(signature);\n onClose();\n } catch (err) {\n console.error('Payment failed:', err);\n setIsSending(false);\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }, [publicKey, recipient, amount, currency, onSuccess, onError, onClose, selectedPaymentMethod, client.config.endpoint, productName]);\n\n // Can pay with either browser extension (connected) or sandbox account\n const canPay = (\n ((connected && publicKey) || selectedPaymentMethod?.type === 'sandbox_account') &&\n recipient &&\n !isSending\n );\n\n if (!visible) return null;\n\n // Wallet icon SVG\n const WalletIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M21 12V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2h14a2 2 0 002-2v-5z\" />\n <path d=\"M16 12h.01\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Sandbox account icon SVG (beaker/test tube)\n const SandboxIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M9.75 3.104v5.714a2.25 2.25 0 0 1-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 0 1 4.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0 1 12 15a9.065 9.065 0 0 1-6.23.693L5 15.5m14.8-.2a2.25 2.25 0 0 1 .775 2.646l-.972 2.916a2.25 2.25 0 0 1-2.134 1.538H6.532a2.25 2.25 0 0 1-2.135-1.538l-.971-2.916A2.25 2.25 0 0 1 4.2 15.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n\n\n return (\n <>\n <style>{`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n\n {/* Backdrop */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9998,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n backdropFilter: 'blur(8px)',\n }}\n onClick={onClose}\n />\n\n {/* Modal */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n }}\n onClick={onClose}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '380px',\n backgroundColor: '#2c2c2e',\n borderRadius: '1rem',\n overflow: 'hidden',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '1rem 1.25rem',\n borderBottom: '1px solid #3a3a3c',\n }}\n >\n {branding?.logo ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <img\n src={branding.logo}\n alt=\"Logo\"\n style={{ height: '24px', width: 'auto', filter: 'invert(1)' }}\n />\n {isSandboxMode && (\n <span style={{ fontSize: '0.75rem', fontWeight: 600, color: '#ff9f0a' }}>\n | SANDBOX\n </span>\n )}\n </div>\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill={accentColor} />\n <path d=\"M8 12l2.5 2.5L16 9\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span style={{ fontSize: '1.125rem', fontWeight: 600, color: '#fff' }}>Pay</span>\n {isSandboxMode && (\n <span style={{ fontSize: '0.75rem', fontWeight: 600, color: '#ff9f0a' }}>\n | SANDBOX\n </span>\n )}\n </div>\n )}\n <button\n onClick={onClose}\n style={{\n padding: '0.375rem 0.75rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#0a84ff',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '0.75rem' }}>\n {/* From (Wallet/Sandbox) Card */}\n {currentSelection ? (\n <div\n style={{\n backgroundColor: '#3a3a3c',\n borderRadius: '0.75rem',\n padding: '0.875rem 1rem',\n marginBottom: '0.5rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: currentSelection.icon ? 'transparent' : '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n overflow: 'hidden',\n }}\n >\n {currentSelection.icon ? (\n <img\n src={currentSelection.icon}\n alt={currentSelection.name || 'Wallet'}\n style={{ width: '40px', height: '40px', borderRadius: '0.5rem' }}\n />\n ) : currentSelection.type === 'sandbox_account' ? (\n <SandboxIcon />\n ) : (\n <WalletIcon />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem', marginBottom: '0.125rem' }}>\n <span style={{ fontSize: '0.75rem', color: '#8e8e93' }}>\n From {truncateAddress(currentSelection.address)}\n </span>\n <button\n onClick={() => copyToClipboard(currentSelection.address, 'sender')}\n style={{\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: copiedSender ? '#30d158' : '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n </button>\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fff',\n }}\n >\n {currentSelection.name}\n </span>\n </div>\n <button\n onClick={handleDisconnect}\n style={{\n fontSize: '0.75rem',\n fontWeight: 500,\n color: '#ff453a',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '0.25rem 0.5rem',\n }}\n >\n unlink\n </button>\n </div>\n </div>\n ) : (\n <Menu as=\"div\" style={{ position: 'relative', marginBottom: '0.5rem' }}>\n <MenuButton\n style={{\n width: '100%',\n backgroundColor: '#3a3a3c',\n borderRadius: '0.75rem',\n padding: '0.875rem 1rem',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n textAlign: 'left',\n }}\n >\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: currentWalletIcon ? 'transparent' : '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {currentWalletIcon ? (\n <img\n src={currentWalletIcon}\n alt={currentWalletName || 'Wallet'}\n style={{ width: '40px', height: '40px', borderRadius: '0.5rem' }}\n />\n ) : (\n <WalletIcon />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '0.75rem', color: '#8e8e93', marginBottom: '0.125rem' }}>\n From\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#0a84ff',\n }}\n >\n {selectedWallet ? selectedWallet.adapter.name : 'Connect Wallet'}\n </span>\n </div>\n {/* ChevronUpDownIcon */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"#8e8e93\"\n style={{ flexShrink: 0 }}\n >\n <path fillRule=\"evenodd\" d=\"M5.22 10.22a.75.75 0 0 1 1.06 0L8 11.94l1.72-1.72a.75.75 0 1 1 1.06 1.06l-2.25 2.25a.75.75 0 0 1-1.06 0l-2.25-2.25a.75.75 0 0 1 0-1.06ZM10.78 5.78a.75.75 0 0 1-1.06 0L8 4.06 6.28 5.78a.75.75 0 0 1-1.06-1.06l2.25-2.25a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1 0 1.06Z\" clipRule=\"evenodd\" />\n </svg>\n </MenuButton>\n <MenuItems\n anchor=\"bottom start\"\n style={{\n backgroundColor: '#2c2c2e',\n borderRadius: '0.75rem',\n padding: '0.25rem',\n boxShadow: '0 10px 25px rgba(0, 0, 0, 0.4)',\n zIndex: 10000,\n outline: 'none',\n border: '1px solid #48484a',\n maxHeight: '300px',\n overflowY: 'auto',\n width: 'var(--button-width)',\n marginTop: '0.25rem',\n }}\n >\n {/* Sandbox Accounts Section */}\n {isSandboxMode && displayedSandboxAccounts.length > 0 && (\n <>\n {displayedSandboxAccounts.map((account) => (\n <MenuItem key={account.id}>\n {({ focus }) => (\n <button\n onClick={() => handleSelectSandboxAccount(account)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.875rem 1rem',\n backgroundColor: focus ? '#3a3a3c' : 'transparent',\n borderRadius: '0.5rem',\n border: 'none',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n transition: 'background-color 150ms',\n }}\n >\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n color: '#fff',\n }}\n >\n <SandboxIcon />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem', marginBottom: '0.125rem' }}>\n <span style={{ fontSize: '0.75rem', color: '#8e8e93' }}>\n From {truncateAddress(account.address)}\n </span>\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n navigator.clipboard.writeText(account.address);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation();\n navigator.clipboard.writeText(account.address);\n }\n }}\n style={{\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n </span>\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fff',\n }}\n >\n {account.name.charAt(0).toUpperCase() + account.name.slice(1)}\n </span>\n </div>\n {account.usdcBalance !== undefined && (\n <span\n style={{\n fontSize: '0.6875rem',\n color: '#ff9f0a',\n backgroundColor: 'rgba(255, 159, 10, 0.15)',\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n flexShrink: 0,\n }}\n >\n {account.usdcBalance.toLocaleString()} USDC\n </span>\n )}\n </button>\n )}\n </MenuItem>\n ))}\n {/* Divider between sandbox and browser extensions */}\n {availableWallets.length > 0 && (\n <div style={{ height: '1px', backgroundColor: '#48484a', margin: '0.25rem 0' }} />\n )}\n </>\n )}\n\n {/* Browser Extension Wallets Section */}\n {availableWallets.length > 0 ? (\n availableWallets.map((wallet) => (\n <MenuItem key={wallet.adapter.name}>\n {({ focus }) => (\n <button\n onClick={() => handleSelectWallet(wallet)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.875rem 1rem',\n backgroundColor: focus ? '#3a3a3c' : 'transparent',\n borderRadius: '0.5rem',\n border: 'none',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n transition: 'background-color 150ms',\n }}\n >\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {wallet.adapter.icon ? (\n <img\n src={wallet.adapter.icon}\n alt={wallet.adapter.name}\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n }}\n />\n ) : (\n <WalletIcon />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '0.75rem', color: '#8e8e93', marginBottom: '0.125rem' }}>\n Browser Extension\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fff',\n }}\n >\n {wallet.adapter.name}\n </span>\n </div>\n {wallet.readyState === 'Installed' && (\n <span\n style={{\n fontSize: '0.6875rem',\n color: '#30d158',\n backgroundColor: 'rgba(48, 209, 88, 0.15)',\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n flexShrink: 0,\n }}\n >\n Detected\n </span>\n )}\n </button>\n )}\n </MenuItem>\n ))\n ) : !isSandboxMode || displayedSandboxAccounts.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '1.5rem',\n color: '#8e8e93',\n fontSize: '0.875rem',\n }}\n >\n No wallets detected\n </div>\n ) : null}\n </MenuItems>\n </Menu>\n )}\n\n </div>\n\n {/* Footer with amount and pay button */}\n <div\n style={{\n padding: '1rem 1.25rem 1.25rem',\n borderTop: '1px solid #3a3a3c',\n }}\n >\n {/* Product name and amount */}\n <div style={{ marginBottom: '1rem' }}>\n <div style={{ fontSize: '0.875rem', color: '#8e8e93', marginBottom: '0.25rem' }}>\n {productName ? `Pay ${productName}` : 'Total'}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: '0.375rem' }}>\n <span style={{ fontSize: '2rem', fontWeight: 600, color: '#fff' }}>\n {amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}\n </span>\n <span style={{ fontSize: '1rem', fontWeight: 500, color: '#8e8e93' }}>\n {currency}\n </span>\n </div>\n <button\n onClick={() => setShowDetails(!showDetails)}\n style={{\n width: '22px',\n height: '22px',\n borderRadius: '50%',\n border: '1.5px solid #8e8e93',\n background: 'none',\n color: '#8e8e93',\n fontSize: '0.8125rem',\n fontWeight: 600,\n fontStyle: 'italic',\n fontFamily: 'Georgia, serif',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n transition: 'all 150ms',\n }}\n title=\"Show payment details\"\n >\n i\n </button>\n </div>\n\n {/* Recipient details (shown when info button is clicked) */}\n {showDetails && (\n <div\n style={{\n marginTop: '0.75rem',\n padding: '0.625rem 0.75rem',\n backgroundColor: '#3a3a3c',\n borderRadius: '0.5rem',\n fontSize: '0.8125rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span style={{ color: '#8e8e93' }}>Recipient</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem' }}>\n <span\n style={{\n color: '#fff',\n fontFamily: 'ui-monospace, monospace',\n fontSize: '0.75rem',\n }}\n >\n {truncateAddress(recipient)}\n </span>\n <button\n onClick={() => copyToClipboard(recipient, 'recipient')}\n style={{\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: copiedRecipient ? '#30d158' : '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Pay Button */}\n <button\n onClick={handlePay}\n disabled={!canPay}\n style={{\n width: '100%',\n padding: '1rem',\n borderRadius: '0.75rem',\n border: 'none',\n fontSize: '1.0625rem',\n fontWeight: 600,\n cursor: canPay ? 'pointer' : 'not-allowed',\n backgroundColor: canPay ? accentColor : '#48484a',\n color: canPay ? '#fff' : '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n transition: 'opacity 150ms',\n }}\n >\n {isSending ? (\n <>\n <div\n style={{\n width: '1.25rem',\n height: '1.25rem',\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <span>Processing...</span>\n </>\n ) : (\n <>\n {/* ShieldCheck Heroicon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M12.516 2.17a.75.75 0 0 0-1.032 0 11.209 11.209 0 0 1-7.877 3.08.75.75 0 0 0-.722.515A12.74 12.74 0 0 0 2.25 9.75c0 5.942 4.064 10.933 9.563 12.348a.749.749 0 0 0 .374 0c5.499-1.415 9.563-6.406 9.563-12.348 0-1.39-.223-2.73-.635-3.985a.75.75 0 0 0-.722-.516 11.209 11.209 0 0 1-7.877-3.08ZM10.28 10.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.06 0l3.75-3.75a.75.75 0 0 0-1.06-1.06l-3.22 3.22-1.72-1.72Z\" clipRule=\"evenodd\" />\n </svg>\n <span>Pay {amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {currency}</span>\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n </>\n );\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useWalletModal } from './wallet-modal-provider';\n\nexport interface Payment {\n id: string;\n amount: number;\n currency: string;\n status: 'pending' | 'completed' | 'failed';\n signature?: string;\n}\n\nexport interface UsePaymentReturn {\n pay: (priceId: string) => Promise<Payment | null>;\n isPending: boolean;\n lastPayment: Payment | null;\n}\n\nexport function usePayment(): UsePaymentReturn {\n const [isPending, setIsPending] = useState(false);\n const [lastPayment, setLastPayment] = useState<Payment | null>(null);\n const { publicKey, connected } = useWallet();\n const { setVisible } = useWalletModal();\n\n const pay = useCallback(async (priceId: string): Promise<Payment | null> => {\n // If not connected, open wallet modal\n if (!connected || !publicKey) {\n setVisible(true);\n return null;\n }\n\n setIsPending(true);\n\n try {\n const event = new CustomEvent('moneymq:pay', {\n detail: { priceId, publicKey: publicKey.toBase58() },\n bubbles: true,\n });\n window.dispatchEvent(event);\n\n const result = await new Promise<Payment>((resolve, reject) => {\n const handleSuccess = (e: Event) => {\n const customEvent = e as CustomEvent<Payment>;\n cleanup();\n resolve(customEvent.detail);\n };\n\n const handleError = (e: Event) => {\n const customEvent = e as CustomEvent<Error>;\n cleanup();\n reject(customEvent.detail);\n };\n\n const cleanup = () => {\n window.removeEventListener('moneymq:payment-success', handleSuccess);\n window.removeEventListener('moneymq:payment-error', handleError);\n };\n\n window.addEventListener('moneymq:payment-success', handleSuccess);\n window.addEventListener('moneymq:payment-error', handleError);\n\n setTimeout(() => {\n cleanup();\n reject(new Error('Payment timeout'));\n }, 60000);\n });\n\n setLastPayment(result);\n return result;\n } catch {\n return null;\n } finally {\n setIsPending(false);\n }\n }, [connected, publicKey, setVisible]);\n\n return { pay, isPending, lastPayment };\n}\n"],"mappings":"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","names":["createContext","useContext","useEffect","useMemo","useState","useState","useCallback","useMemo","jsx","jsxs","useState","useCallback","useMemo","jsx","createContext","useContext","useState","useEffect","useMemo","useEffect","useState","useCallback","useState","useWallet","Fragment","jsx","jsxs","normalizeRpcUrl","useState","useWallet","useCallback","Fragment","jsx","jsxs","PayButton","useState","useEffect","error","useCallback","useState","useWallet","useState","useWallet","useCallback"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/wallet-modal-provider.tsx","../src/wallet-modal.tsx","../src/pay-button.tsx","../src/payment-modal.tsx","../src/use-payment.ts"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react';\nimport { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets';\nimport { CustomWalletModalProvider, type Branding } from './wallet-modal-provider';\n\n// MoneyMQ client interface (matches @moneymq/sdk)\nexport interface MoneyMQClient {\n config: {\n endpoint: string;\n };\n}\n\nexport interface MoneyMQProviderProps {\n children: React.ReactNode;\n client: MoneyMQClient;\n branding?: Branding;\n}\n\n// Sandbox account interface\nexport interface SandboxAccount {\n id: string;\n name: string;\n address: string;\n secretKeyHex?: string;\n stablecoins?: {\n usdc?: string;\n };\n usdcBalance?: number;\n}\n\n// Sandbox context state\ninterface SandboxContextState {\n isSandboxMode: boolean;\n sandboxAccounts: SandboxAccount[];\n}\n\nconst MoneyMQContext = createContext<MoneyMQClient | null>(null);\nconst SandboxContext = createContext<SandboxContextState>({\n isSandboxMode: false,\n sandboxAccounts: [],\n});\n\nconst DEFAULT_RPC_URL = 'https://api.devnet.solana.com';\nconst SANDBOX_HASH_PREFIX = 'SURFNETxSAFEHASH';\n\ninterface ServerConfigResponse {\n x402?: {\n validator?: {\n rpcUrl?: string;\n };\n };\n}\n\ninterface SandboxAccountsResponse {\n solana?: {\n userAccounts?: Array<{\n address: string;\n label: string;\n secretKeyHex?: string;\n stablecoins?: {\n usdc?: string;\n };\n }>;\n };\n}\n\n/**\n * Normalize RPC URL for browser access (0.0.0.0 doesn't work in browsers)\n */\nfunction normalizeRpcUrl(url: string): string {\n return url.replace('0.0.0.0', 'localhost').replace('127.0.0.1', 'localhost');\n}\n\n/**\n * Get RPC URL from MoneyMQ server config\n */\nasync function getRpcUrl(apiUrl: string): Promise<string> {\n try {\n console.log('[MoneyMQ] Fetching config from:', `${apiUrl}/config`);\n const response = await fetch(`${apiUrl}/config`);\n const config = (await response.json()) as ServerConfigResponse;\n const rawRpcUrl = config.x402?.validator?.rpcUrl || DEFAULT_RPC_URL;\n console.log('[MoneyMQ] Raw RPC URL from config:', rawRpcUrl);\n const normalizedUrl = normalizeRpcUrl(rawRpcUrl);\n console.log('[MoneyMQ] Normalized RPC URL:', normalizedUrl);\n return normalizedUrl;\n } catch (err) {\n console.error('[MoneyMQ] Error fetching config:', err);\n return DEFAULT_RPC_URL;\n }\n}\n\n/**\n * Check if we're in sandbox mode by calling getLatestBlockhash RPC\n */\nasync function checkSandboxMode(rpcUrl: string): Promise<boolean> {\n try {\n console.log('[MoneyMQ] Checking sandbox mode with RPC:', rpcUrl);\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getLatestBlockhash',\n params: [{ commitment: 'finalized' }],\n }),\n });\n const data = await response.json();\n const blockhash = data?.result?.value?.blockhash || '';\n const isSandbox = blockhash.startsWith(SANDBOX_HASH_PREFIX);\n console.log('[MoneyMQ] Blockhash:', blockhash, '| Sandbox:', isSandbox);\n return isSandbox;\n } catch (err) {\n console.error('[MoneyMQ] Error checking sandbox mode:', err);\n return false;\n }\n}\n\n/**\n * Fetch token balance for a token account address\n */\nasync function fetchTokenBalance(rpcUrl: string, tokenAccountAddress: string): Promise<number> {\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [tokenAccountAddress, { encoding: 'jsonParsed' }],\n }),\n });\n const data = await response.json();\n if (data.result?.value?.data?.parsed?.info?.tokenAmount) {\n return parseFloat(data.result.value.data.parsed.info.tokenAmount.uiAmountString || '0');\n }\n return 0;\n } catch {\n return 0;\n }\n}\n\n/**\n * Fetch sandbox accounts from the MoneyMQ server\n */\nasync function fetchSandboxAccounts(apiUrl: string, rpcUrl: string): Promise<SandboxAccount[]> {\n try {\n console.log('[MoneyMQ] Fetching sandbox accounts from:', `${apiUrl}/sandbox/accounts`);\n const response = await fetch(`${apiUrl}/sandbox/accounts`);\n if (!response.ok) {\n console.log('[MoneyMQ] Sandbox accounts fetch failed:', response.status);\n return [];\n }\n\n const data = (await response.json()) as SandboxAccountsResponse;\n if (data.solana?.userAccounts) {\n // Fetch balances for each account in parallel\n const accounts = await Promise.all(\n data.solana.userAccounts.map(async (acc) => {\n let usdcBalance = 0;\n if (acc.stablecoins?.usdc) {\n usdcBalance = await fetchTokenBalance(rpcUrl, acc.stablecoins.usdc);\n }\n return {\n id: acc.address,\n name: acc.label,\n address: acc.address,\n secretKeyHex: acc.secretKeyHex,\n stablecoins: acc.stablecoins,\n usdcBalance,\n };\n })\n );\n console.log('[MoneyMQ] Sandbox accounts loaded:', accounts.length);\n return accounts;\n }\n return [];\n } catch (err) {\n console.error('[MoneyMQ] Error fetching sandbox accounts:', err);\n return [];\n }\n}\n\nexport function useMoneyMQ(): MoneyMQClient {\n const client = useContext(MoneyMQContext);\n if (!client) {\n throw new Error('useMoneyMQ must be used within a MoneyMQProvider');\n }\n return client;\n}\n\nexport function useSandbox(): SandboxContextState {\n return useContext(SandboxContext);\n}\n\nexport function MoneyMQProvider({\n children,\n client,\n branding,\n}: MoneyMQProviderProps) {\n const [rpcEndpoint, setRpcEndpoint] = useState<string | null>(null);\n const [isSandboxMode, setIsSandboxMode] = useState(false);\n const [sandboxAccounts, setSandboxAccounts] = useState<SandboxAccount[]>([]);\n\n useEffect(() => {\n async function initialize() {\n const rpcUrl = await getRpcUrl(client.config.endpoint);\n setRpcEndpoint(rpcUrl);\n\n // Check if we're in sandbox mode\n const isSandbox = await checkSandboxMode(rpcUrl);\n setIsSandboxMode(isSandbox);\n\n // If in sandbox mode, fetch sandbox accounts\n if (isSandbox) {\n const accounts = await fetchSandboxAccounts(client.config.endpoint, rpcUrl);\n setSandboxAccounts(accounts);\n }\n }\n initialize();\n }, [client.config.endpoint]);\n\n const wallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new SolflareWalletAdapter(),\n ],\n []\n );\n\n const sandboxContextValue = useMemo(\n () => ({ isSandboxMode, sandboxAccounts }),\n [isSandboxMode, sandboxAccounts]\n );\n\n // Don't render until we have the RPC endpoint\n if (!rpcEndpoint) {\n return null;\n }\n\n return (\n <MoneyMQContext.Provider value={client}>\n <SandboxContext.Provider value={sandboxContextValue}>\n <ConnectionProvider endpoint={rpcEndpoint}>\n <WalletProvider wallets={wallets} autoConnect>\n <CustomWalletModalProvider branding={branding}>\n {children}\n </CustomWalletModalProvider>\n </WalletProvider>\n </ConnectionProvider>\n </SandboxContext.Provider>\n </MoneyMQContext.Provider>\n );\n}\n","'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport { WalletModal } from './wallet-modal';\n\nexport interface Branding {\n logo?: string;\n title?: string;\n description?: string;\n accentColor?: string;\n}\n\ninterface WalletModalContextState {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n}\n\nconst WalletModalContext = createContext<WalletModalContextState>({\n visible: false,\n setVisible: () => {},\n});\n\nconst BrandingContext = createContext<Branding | undefined>(undefined);\n\nexport function useWalletModal() {\n return useContext(WalletModalContext);\n}\n\nexport function useBranding() {\n return useContext(BrandingContext);\n}\n\nexport interface CustomWalletModalProviderProps {\n children: React.ReactNode;\n branding?: Branding;\n}\n\nexport function CustomWalletModalProvider({ children, branding }: CustomWalletModalProviderProps) {\n const [visible, setVisible] = useState(false);\n\n const handleClose = useCallback(() => setVisible(false), []);\n\n const contextValue = useMemo(\n () => ({ visible, setVisible }),\n [visible]\n );\n\n return (\n <BrandingContext.Provider value={branding}>\n <WalletModalContext.Provider value={contextValue}>\n {children}\n <WalletModal visible={visible} onClose={handleClose} branding={branding} />\n </WalletModalContext.Provider>\n </BrandingContext.Provider>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport type { Wallet } from '@solana/wallet-adapter-react';\n\nexport interface WalletModalProps {\n visible: boolean;\n onClose: () => void;\n branding?: {\n logo?: string;\n title?: string;\n description?: string;\n accentColor?: string;\n };\n}\n\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n backdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n animation: 'fadeIn 150ms ease-out',\n};\n\nconst modalStyle: React.CSSProperties = {\n backgroundColor: '#18181b',\n borderRadius: '1rem',\n padding: '1.5rem',\n width: '100%',\n maxWidth: '400px',\n maxHeight: '90vh',\n overflow: 'auto',\n border: '1px solid #27272a',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\n animation: 'slideUp 150ms ease-out',\n};\n\nconst headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n marginBottom: '0.5rem',\n};\n\nconst logoStyle: React.CSSProperties = {\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.5rem',\n objectFit: 'contain',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '1.25rem',\n fontWeight: 600,\n color: '#fafafa',\n margin: 0,\n};\n\nconst descriptionStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n color: '#a1a1aa',\n marginBottom: '1.5rem',\n};\n\nconst walletListStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n};\n\nconst walletButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.875rem 1rem',\n backgroundColor: '#27272a',\n border: '1px solid #3f3f46',\n borderRadius: '0.75rem',\n cursor: 'pointer',\n transition: 'all 150ms',\n textAlign: 'left',\n};\n\nconst walletIconStyle: React.CSSProperties = {\n width: '2rem',\n height: '2rem',\n borderRadius: '0.375rem',\n};\n\nconst walletNameStyle: React.CSSProperties = {\n flex: 1,\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fafafa',\n};\n\nconst walletTagStyle: React.CSSProperties = {\n fontSize: '0.75rem',\n padding: '0.25rem 0.5rem',\n borderRadius: '9999px',\n backgroundColor: '#3f3f46',\n color: '#a1a1aa',\n};\n\nconst closeButtonStyle: React.CSSProperties = {\n position: 'absolute',\n top: '1rem',\n right: '1rem',\n padding: '0.5rem',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n color: '#71717a',\n transition: 'color 150ms',\n};\n\nconst noWalletsStyle: React.CSSProperties = {\n textAlign: 'center',\n padding: '2rem 1rem',\n color: '#a1a1aa',\n fontSize: '0.875rem',\n};\n\nexport function WalletModal({ visible, onClose, branding }: WalletModalProps) {\n const { wallets, select, connecting } = useWallet();\n const [hoveredWallet, setHoveredWallet] = useState<string | null>(null);\n\n const accentColor = branding?.accentColor || '#ec4899';\n\n // Filter and sort wallets\n const sortedWallets = useMemo(() => {\n const installed: Wallet[] = [];\n const notInstalled: Wallet[] = [];\n\n for (const wallet of wallets) {\n if (wallet.readyState === 'Installed') {\n installed.push(wallet);\n } else if (wallet.readyState === 'Loadable' || wallet.readyState === 'NotDetected') {\n notInstalled.push(wallet);\n }\n }\n\n return [...installed, ...notInstalled];\n }, [wallets]);\n\n const handleSelect = useCallback((wallet: Wallet) => {\n select(wallet.adapter.name);\n onClose();\n }, [select, onClose]);\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n if (visible) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = '';\n };\n }, [visible, onClose]);\n\n if (!visible) return null;\n\n return (\n <>\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes slideUp {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n <div style={overlayStyle} onClick={onClose}>\n <div\n style={{ ...modalStyle, position: 'relative' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Close button */}\n <button\n style={closeButtonStyle}\n onClick={onClose}\n onMouseEnter={(e) => (e.currentTarget.style.color = '#fafafa')}\n onMouseLeave={(e) => (e.currentTarget.style.color = '#71717a')}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {/* Header */}\n <div style={headerStyle}>\n {branding?.logo && (\n <img src={branding.logo} alt=\"\" style={logoStyle} />\n )}\n <h2 style={titleStyle}>\n {branding?.title || 'Connect Wallet'}\n </h2>\n </div>\n\n {/* Description */}\n <p style={descriptionStyle}>\n {branding?.description || 'Select a wallet to connect and pay securely.'}\n </p>\n\n {/* Wallet list */}\n <div style={walletListStyle}>\n {sortedWallets.length === 0 ? (\n <div style={noWalletsStyle}>\n No wallets found. Please install a Solana wallet extension.\n </div>\n ) : (\n sortedWallets.map((wallet) => {\n const isInstalled = wallet.readyState === 'Installed';\n const isHovered = hoveredWallet === wallet.adapter.name;\n\n return (\n <button\n key={wallet.adapter.name}\n style={{\n ...walletButtonStyle,\n backgroundColor: isHovered ? '#3f3f46' : '#27272a',\n borderColor: isHovered ? accentColor : '#3f3f46',\n }}\n onClick={() => handleSelect(wallet)}\n onMouseEnter={() => setHoveredWallet(wallet.adapter.name)}\n onMouseLeave={() => setHoveredWallet(null)}\n disabled={connecting}\n >\n <img\n src={wallet.adapter.icon}\n alt={wallet.adapter.name}\n style={walletIconStyle}\n />\n <span style={walletNameStyle}>{wallet.adapter.name}</span>\n {isInstalled ? (\n <span style={{ ...walletTagStyle, backgroundColor: accentColor + '20', color: accentColor }}>\n Detected\n </span>\n ) : (\n <span style={walletTagStyle}>Install</span>\n )}\n </button>\n );\n })\n )}\n </div>\n </div>\n </div>\n </>\n );\n}\n","'use client';\n\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { PaymentModal } from './payment-modal';\nimport { useMoneyMQ } from './provider';\n\nexport interface Payment {\n id: string;\n amount: number;\n currency: string;\n status: 'pending' | 'completed' | 'failed';\n signature?: string;\n}\n\ninterface ServerConfig {\n x402?: {\n payoutAccount?: {\n address?: string;\n currency?: string;\n };\n };\n}\n\nexport interface Price {\n id: string;\n unit_amount: number;\n currency: string;\n product?: string;\n}\n\nexport interface Product {\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface BasketItem {\n /** Product details */\n product: Product;\n /** Price details */\n price: Price;\n /** Quantity (defaults to 1) */\n quantity?: number;\n}\n\nexport interface PayButtonProps {\n /** Basket of items to purchase */\n basket: BasketItem[];\n onSuccess?: (payment: Payment) => void;\n onError?: (error: Error) => void;\n variant?: 'solid' | 'outline';\n children?: React.ReactNode;\n disabled?: boolean;\n}\n\nconst baseStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n padding: '0.625rem 1rem',\n cursor: 'pointer',\n transition: 'all 200ms',\n border: 'none',\n};\n\nconst solidStyle: React.CSSProperties = {\n ...baseStyle,\n backgroundColor: '#ec4899',\n color: 'white',\n boxShadow: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n};\n\nconst outlineStyle: React.CSSProperties = {\n ...baseStyle,\n backgroundColor: 'transparent',\n color: '#ec4899',\n border: '1px solid #ec4899',\n};\n\nexport const PayButton = forwardRef<HTMLButtonElement, PayButtonProps>(\n function PayButton(\n {\n basket,\n onSuccess,\n onError,\n variant = 'solid',\n children,\n disabled,\n },\n ref\n ) {\n const client = useMoneyMQ();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Payment data computed from basket\n const [recipient, setRecipient] = useState<string>('');\n\n // Compute totals from basket\n const { totalAmount, currency, lineItems } = React.useMemo(() => {\n if (!basket || basket.length === 0) {\n return { totalAmount: 0, currency: 'USDC', lineItems: [] };\n }\n\n // Use the currency from the first item (assuming all items have same currency)\n const baseCurrency = basket[0].price.currency.toUpperCase();\n\n const items = basket.map((item) => ({\n product: item.product,\n price: item.price,\n quantity: item.quantity ?? 1,\n subtotal: (item.price.unit_amount / 100) * (item.quantity ?? 1),\n }));\n\n const total = items.reduce((sum, item) => sum + item.subtotal, 0);\n\n return {\n totalAmount: total,\n currency: baseCurrency,\n lineItems: items,\n };\n }, [basket]);\n\n useEffect(() => {\n async function fetchPaymentDetails() {\n setIsLoading(true);\n setError(null);\n\n try {\n if (!basket || basket.length === 0) {\n throw new Error('Basket is empty');\n }\n\n const apiUrl = client.config.endpoint;\n\n // Fetch server config to get recipient\n const configResponse = await fetch(`${apiUrl}/config`);\n if (!configResponse.ok) {\n throw new Error(`Failed to fetch config: ${configResponse.status}`);\n }\n const config = (await configResponse.json()) as ServerConfig;\n if (config.x402?.payoutAccount?.address) {\n setRecipient(config.x402.payoutAccount.address);\n }\n } catch (err) {\n console.error('[PayButton] Error fetching payment details:', err);\n const errorMessage = err instanceof Error ? err.message : 'Failed to load payment details';\n setError(errorMessage);\n onError?.(new Error(errorMessage));\n } finally {\n setIsLoading(false);\n }\n }\n\n fetchPaymentDetails();\n }, [basket, client.config.endpoint, onError]);\n\n const handleClick = () => {\n if (!isLoading && !error) {\n setIsModalOpen(true);\n }\n };\n\n const handlePaymentSuccess = (signature: string) => {\n const payment: Payment = {\n id: `pay_${Date.now()}`,\n amount: totalAmount,\n currency,\n status: 'completed',\n signature,\n };\n onSuccess?.(payment);\n };\n\n const handlePaymentError = (error: Error) => {\n onError?.(error);\n };\n\n const isDisabled = disabled || isLoading || !!error;\n\n const buttonStyle: React.CSSProperties = {\n ...(variant === 'outline' ? outlineStyle : solidStyle),\n backgroundColor: variant === 'solid'\n ? (isHovered && !isDisabled ? '#db2777' : '#ec4899')\n : (isHovered && !isDisabled ? 'rgba(236, 72, 153, 0.1)' : 'transparent'),\n opacity: isDisabled ? 0.5 : 1,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n };\n\n return (\n <>\n <button\n ref={ref}\n onClick={handleClick}\n disabled={isDisabled}\n style={buttonStyle}\n title={error || undefined}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {isLoading ? (\n <span>Loading...</span>\n ) : error ? (\n <span>Error</span>\n ) : (\n children || <span>Pay</span>\n )}\n </button>\n\n <PaymentModal\n visible={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n amount={totalAmount}\n currency={currency}\n recipient={recipient}\n lineItems={lineItems}\n onSuccess={handlePaymentSuccess}\n onError={handlePaymentError}\n />\n </>\n );\n }\n);\n","'use client';\n\nimport React, { useCallback, useState } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport type { Wallet } from '@solana/wallet-adapter-react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { useBranding } from './wallet-modal-provider';\nimport { useMoneyMQ, useSandbox, type SandboxAccount } from './provider';\n\n// Helper to convert object to form-encoded data\nfunction encodeFormData(data: Record<string, unknown>): string {\n const params = new URLSearchParams();\n\n const addParams = (obj: Record<string, unknown>, prefix = '') => {\n for (const [key, value] of Object.entries(obj)) {\n const paramKey = prefix ? `${prefix}[${key}]` : key;\n\n if (value === null || value === undefined) {\n continue;\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n addParams(value as Record<string, unknown>, paramKey);\n } else {\n params.append(paramKey, String(value));\n }\n }\n };\n\n addParams(data);\n return params.toString();\n}\n\n// Normalize RPC URL for browser access\nfunction normalizeRpcUrl(url: string): string {\n return url.replace('0.0.0.0', 'localhost').replace('127.0.0.1', 'localhost');\n}\n\n// Handle 402 Payment Required responses\nasync function makeRequestWith402Handling(\n url: string,\n method: 'POST' | 'GET',\n body: Record<string, unknown> | undefined,\n secretKeyHex: string,\n rpcUrl: string,\n headers: Record<string, string> = {}\n): Promise<unknown> {\n console.log(`[MoneyMQ] Making ${method} request to ${url}`);\n const formData = body ? encodeFormData(body) : undefined;\n\n let response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers,\n },\n body: formData,\n });\n\n let data = await response.json();\n console.log(`[MoneyMQ] Response status: ${response.status}`, data);\n\n // Handle 402 Payment Required\n if (response.status === 402) {\n console.log('[MoneyMQ] 💳 402 Payment Required - processing payment...');\n\n const paymentRequirements = data?.payment_requirements || data?.error?.payment_requirements || [];\n\n if (paymentRequirements.length === 0) {\n console.warn('[MoneyMQ] ⚠️ No payment requirements found in 402 response');\n throw new Error('Payment required but no payment requirements provided');\n }\n\n console.log('[MoneyMQ] Payment requirements:', paymentRequirements);\n\n // Dynamic import x402 libraries\n const { createPaymentHeader, selectPaymentRequirements } = await import('x402/client');\n const { createSigner } = await import('x402-fetch');\n\n // Create signer from secret key\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const signer = await createSigner('solana', secretKeyHex, {\n svmConfig: rpcUrl,\n });\n\n // Select appropriate payment requirement\n const selectedPaymentRequirement = selectPaymentRequirements(paymentRequirements, 'solana', 'exact');\n\n console.log(`[MoneyMQ] 💰 Creating payment for ${selectedPaymentRequirement.network}...`);\n\n // Create payment header\n const paymentHeaderValue = await createPaymentHeader(\n signer,\n 1, // x402Version\n selectedPaymentRequirement,\n {\n svmConfig: {\n rpcUrl,\n },\n }\n );\n\n console.log('[MoneyMQ] ✅ Payment header created, retrying request...');\n\n // Retry with X-Payment header\n response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-Payment': paymentHeaderValue,\n ...headers,\n },\n body: formData,\n });\n\n data = await response.json();\n console.log(`[MoneyMQ] Retry response status: ${response.status}`, data);\n\n if (!response.ok) {\n throw new Error(data.error?.message || 'Request failed after payment');\n }\n } else if (!response.ok) {\n throw new Error(data.error?.message || 'Request failed');\n }\n\n return data;\n}\n\n// Create and confirm payment intent for sandbox accounts\nasync function createSandboxPayment(\n apiUrl: string,\n rpcUrl: string,\n amount: number,\n currency: string,\n recipient: string,\n senderAddress: string,\n secretKeyHex: string,\n lineItems?: LineItem[]\n): Promise<string> {\n console.log('[MoneyMQ] Creating sandbox payment...', { amount, currency, recipient, senderAddress });\n\n // Build description from line items\n const description = lineItems && lineItems.length > 0\n ? `Purchase - ${lineItems.map(item => item.product.name).join(', ')}`\n : 'Payment';\n\n // Step 1: Create payment intent\n const paymentIntent = await makeRequestWith402Handling(\n `${apiUrl}/catalog/v1/payment_intents`,\n 'POST',\n {\n amount: Math.round(amount * 100), // Convert to cents (Stripe-style)\n currency: currency.toLowerCase(),\n customer: senderAddress,\n description,\n metadata: {\n sender_address: senderAddress,\n recipient_address: recipient,\n },\n },\n secretKeyHex,\n rpcUrl\n ) as { id: string };\n\n console.log('[MoneyMQ] Payment intent created:', paymentIntent);\n\n // Step 2: Confirm payment intent\n console.log('[MoneyMQ] Confirming payment intent:', paymentIntent.id);\n const confirmedIntent = await makeRequestWith402Handling(\n `${apiUrl}/catalog/v1/payment_intents/${paymentIntent.id}/confirm`,\n 'POST',\n {},\n secretKeyHex,\n rpcUrl\n ) as { id: string; status: string };\n\n console.log('[MoneyMQ] Payment intent confirmed:', confirmedIntent);\n\n return confirmedIntent.id;\n}\n\n// Payment method types\ntype PaymentMethodType = 'browser_extension' | 'sandbox_account';\n\ninterface SelectedPaymentMethod {\n type: PaymentMethodType;\n wallet?: Wallet;\n sandboxAccount?: SandboxAccount;\n}\n\nexport interface LineItem {\n product: {\n id: string;\n name: string;\n description?: string;\n };\n price: {\n id: string;\n unit_amount: number;\n currency: string;\n };\n quantity: number;\n subtotal: number;\n}\n\nexport interface PaymentModalProps {\n visible: boolean;\n onClose: () => void;\n amount: number;\n currency: string;\n recipient: string;\n lineItems?: LineItem[];\n onSuccess?: (signature: string) => void;\n onError?: (error: Error) => void;\n accentColor?: string;\n}\n\nconst truncateAddress = (address: string) => {\n if (address.length <= 12) return address;\n return `${address.slice(0, 4)}...${address.slice(-4)}`;\n};\n\nexport function PaymentModal({\n visible,\n onClose,\n amount,\n currency,\n recipient,\n lineItems,\n onSuccess,\n onError,\n accentColor = '#ec4899',\n}: PaymentModalProps) {\n const [isSending, setIsSending] = useState(false);\n const [copiedSender, setCopiedSender] = useState(false);\n const [copiedRecipient, setCopiedRecipient] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n const [selectedWallet, setSelectedWallet] = useState<Wallet | null>(null);\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<SelectedPaymentMethod | null>(null);\n const { publicKey, connected, disconnect, wallets, select, wallet: connectedWallet } = useWallet();\n const branding = useBranding();\n const { isSandboxMode, sandboxAccounts } = useSandbox();\n const client = useMoneyMQ();\n\n const copyToClipboard = (text: string, type: 'sender' | 'recipient') => {\n navigator.clipboard.writeText(text);\n if (type === 'sender') {\n setCopiedSender(true);\n setTimeout(() => setCopiedSender(false), 2000);\n } else {\n setCopiedRecipient(true);\n setTimeout(() => setCopiedRecipient(false), 2000);\n }\n };\n\n const handleSelectWallet = (wallet: Wallet) => {\n setSelectedWallet(wallet);\n setSelectedPaymentMethod({ type: 'browser_extension', wallet });\n select(wallet.adapter.name);\n };\n\n const handleSelectSandboxAccount = (account: SandboxAccount) => {\n setSelectedPaymentMethod({ type: 'sandbox_account', sandboxAccount: account });\n setSelectedWallet(null);\n };\n\n const handleDisconnect = async () => {\n await disconnect();\n setSelectedWallet(null);\n setSelectedPaymentMethod(null);\n };\n\n // Filter to only show installed/detected wallets\n const availableWallets = wallets.filter(\n (wallet) => wallet.readyState === 'Installed' || wallet.readyState === 'Loadable'\n );\n\n // Limit sandbox accounts to first 3\n const displayedSandboxAccounts = sandboxAccounts.slice(0, 3);\n\n // Get the current wallet icon (connected wallet, selected wallet, or default)\n const currentWalletIcon = connectedWallet?.adapter.icon || selectedWallet?.adapter.icon;\n const currentWalletName = connectedWallet?.adapter.name || selectedWallet?.adapter.name;\n\n // Get current selection display info\n const getCurrentSelectionDisplay = () => {\n if (connected && publicKey) {\n return {\n icon: currentWalletIcon,\n name: currentWalletName,\n address: publicKey.toBase58(),\n type: 'browser_extension' as const,\n };\n }\n if (selectedPaymentMethod?.type === 'sandbox_account' && selectedPaymentMethod.sandboxAccount) {\n const name = selectedPaymentMethod.sandboxAccount.name;\n return {\n icon: null,\n name: name.charAt(0).toUpperCase() + name.slice(1),\n address: selectedPaymentMethod.sandboxAccount.address,\n type: 'sandbox_account' as const,\n };\n }\n return null;\n };\n\n const currentSelection = getCurrentSelectionDisplay();\n\n const handlePay = useCallback(async () => {\n if (!recipient) return;\n\n // Determine the sender based on payment method\n let senderAddress: string;\n let secretKeyHex: string | undefined;\n\n if (selectedPaymentMethod?.type === 'sandbox_account' && selectedPaymentMethod.sandboxAccount) {\n senderAddress = selectedPaymentMethod.sandboxAccount.address;\n secretKeyHex = selectedPaymentMethod.sandboxAccount.secretKeyHex;\n } else if (publicKey) {\n senderAddress = publicKey.toBase58();\n } else {\n return;\n }\n\n setIsSending(true);\n\n try {\n // For sandbox accounts, handle payment directly\n if (selectedPaymentMethod?.type === 'sandbox_account' && secretKeyHex) {\n const apiUrl = normalizeRpcUrl(client.config.endpoint);\n\n // Fetch RPC URL from config\n let rpcUrl = 'http://localhost:8899';\n try {\n const configResponse = await fetch(`${apiUrl}/config`);\n const config = await configResponse.json();\n rpcUrl = normalizeRpcUrl(config.x402?.validator?.rpcUrl || rpcUrl);\n } catch {\n console.log('[MoneyMQ] Using default RPC URL');\n }\n\n const paymentId = await createSandboxPayment(\n apiUrl,\n rpcUrl,\n amount,\n currency,\n recipient,\n senderAddress,\n secretKeyHex,\n lineItems\n );\n\n setIsSending(false);\n onSuccess?.(paymentId);\n onClose();\n return;\n }\n\n // For browser extension wallets, dispatch event for external handling\n const event = new CustomEvent('moneymq:payment-initiated', {\n detail: {\n amount,\n currency,\n recipient,\n sender: senderAddress,\n paymentMethod: selectedPaymentMethod?.type || 'browser_extension',\n },\n bubbles: true,\n });\n window.dispatchEvent(event);\n\n const signature = await new Promise<string>((resolve, reject) => {\n const handleSuccess = (e: Event) => {\n const customEvent = e as CustomEvent<{ signature: string }>;\n cleanup();\n resolve(customEvent.detail.signature);\n };\n\n const handleError = (e: Event) => {\n const customEvent = e as CustomEvent<Error>;\n cleanup();\n reject(customEvent.detail);\n };\n\n const cleanup = () => {\n window.removeEventListener('moneymq:payment-success', handleSuccess);\n window.removeEventListener('moneymq:payment-error', handleError);\n };\n\n window.addEventListener('moneymq:payment-success', handleSuccess);\n window.addEventListener('moneymq:payment-error', handleError);\n\n setTimeout(() => {\n cleanup();\n reject(new Error('Payment timeout'));\n }, 60000);\n });\n\n setIsSending(false);\n onSuccess?.(signature);\n onClose();\n } catch (err) {\n console.error('Payment failed:', err);\n setIsSending(false);\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }, [publicKey, recipient, amount, currency, onSuccess, onError, onClose, selectedPaymentMethod, client.config.endpoint, lineItems]);\n\n // Can pay with either browser extension (connected) or sandbox account\n const canPay = (\n ((connected && publicKey) || selectedPaymentMethod?.type === 'sandbox_account') &&\n recipient &&\n !isSending\n );\n\n if (!visible) return null;\n\n // Wallet icon SVG\n const WalletIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M21 12V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2h14a2 2 0 002-2v-5z\" />\n <path d=\"M16 12h.01\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Sandbox account icon SVG (beaker/test tube)\n const SandboxIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M9.75 3.104v5.714a2.25 2.25 0 0 1-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 0 1 4.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0 1 12 15a9.065 9.065 0 0 1-6.23.693L5 15.5m14.8-.2a2.25 2.25 0 0 1 .775 2.646l-.972 2.916a2.25 2.25 0 0 1-2.134 1.538H6.532a2.25 2.25 0 0 1-2.135-1.538l-.971-2.916A2.25 2.25 0 0 1 4.2 15.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n\n\n return (\n <>\n <style>{`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n\n {/* Backdrop */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9998,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n backdropFilter: 'blur(8px)',\n }}\n onClick={onClose}\n />\n\n {/* Modal */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n }}\n onClick={onClose}\n >\n <div\n style={{\n width: '100%',\n maxWidth: '380px',\n backgroundColor: '#2c2c2e',\n borderRadius: '1rem',\n overflow: 'hidden',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '1rem 1.25rem',\n borderBottom: '1px solid #3a3a3c',\n }}\n >\n {branding?.logo ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <img\n src={branding.logo}\n alt=\"Logo\"\n style={{ height: '24px', width: 'auto', filter: 'invert(1)' }}\n />\n {isSandboxMode && (\n <span style={{ fontSize: '0.75rem', fontWeight: 600, color: '#ff9f0a' }}>\n | SANDBOX\n </span>\n )}\n </div>\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill={accentColor} />\n <path d=\"M8 12l2.5 2.5L16 9\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span style={{ fontSize: '1.125rem', fontWeight: 600, color: '#fff' }}>Pay</span>\n {isSandboxMode && (\n <span style={{ fontSize: '0.75rem', fontWeight: 600, color: '#ff9f0a' }}>\n | SANDBOX\n </span>\n )}\n </div>\n )}\n <button\n onClick={onClose}\n style={{\n padding: '0.375rem 0.75rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#0a84ff',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '0.75rem' }}>\n {/* From (Wallet/Sandbox) Card */}\n {currentSelection ? (\n <div\n style={{\n backgroundColor: '#3a3a3c',\n borderRadius: '0.75rem',\n padding: '0.875rem 1rem',\n marginBottom: '0.5rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: currentSelection.icon ? 'transparent' : '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n overflow: 'hidden',\n }}\n >\n {currentSelection.icon ? (\n <img\n src={currentSelection.icon}\n alt={currentSelection.name || 'Wallet'}\n style={{ width: '40px', height: '40px', borderRadius: '0.5rem' }}\n />\n ) : currentSelection.type === 'sandbox_account' ? (\n <SandboxIcon />\n ) : (\n <WalletIcon />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem', marginBottom: '0.125rem' }}>\n <span style={{ fontSize: '0.75rem', color: '#8e8e93' }}>\n From {truncateAddress(currentSelection.address)}\n </span>\n <button\n onClick={() => copyToClipboard(currentSelection.address, 'sender')}\n style={{\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: copiedSender ? '#30d158' : '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n </button>\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fff',\n }}\n >\n {currentSelection.name}\n </span>\n </div>\n <button\n onClick={handleDisconnect}\n style={{\n fontSize: '0.75rem',\n fontWeight: 500,\n color: '#ff453a',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '0.25rem 0.5rem',\n }}\n >\n unlink\n </button>\n </div>\n </div>\n ) : (\n <Menu as=\"div\" style={{ position: 'relative', marginBottom: '0.5rem' }}>\n <MenuButton\n style={{\n width: '100%',\n backgroundColor: '#3a3a3c',\n borderRadius: '0.75rem',\n padding: '0.875rem 1rem',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n textAlign: 'left',\n }}\n >\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: currentWalletIcon ? 'transparent' : '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {currentWalletIcon ? (\n <img\n src={currentWalletIcon}\n alt={currentWalletName || 'Wallet'}\n style={{ width: '40px', height: '40px', borderRadius: '0.5rem' }}\n />\n ) : (\n <WalletIcon />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '0.75rem', color: '#8e8e93', marginBottom: '0.125rem' }}>\n From\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#0a84ff',\n }}\n >\n {selectedWallet ? selectedWallet.adapter.name : 'Connect Wallet'}\n </span>\n </div>\n {/* ChevronUpDownIcon */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"#8e8e93\"\n style={{ flexShrink: 0 }}\n >\n <path fillRule=\"evenodd\" d=\"M5.22 10.22a.75.75 0 0 1 1.06 0L8 11.94l1.72-1.72a.75.75 0 1 1 1.06 1.06l-2.25 2.25a.75.75 0 0 1-1.06 0l-2.25-2.25a.75.75 0 0 1 0-1.06ZM10.78 5.78a.75.75 0 0 1-1.06 0L8 4.06 6.28 5.78a.75.75 0 0 1-1.06-1.06l2.25-2.25a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1 0 1.06Z\" clipRule=\"evenodd\" />\n </svg>\n </MenuButton>\n <MenuItems\n anchor=\"bottom start\"\n style={{\n backgroundColor: '#2c2c2e',\n borderRadius: '0.75rem',\n padding: '0.25rem',\n boxShadow: '0 10px 25px rgba(0, 0, 0, 0.4)',\n zIndex: 10000,\n outline: 'none',\n border: '1px solid #48484a',\n maxHeight: '300px',\n overflowY: 'auto',\n width: 'var(--button-width)',\n marginTop: '0.25rem',\n }}\n >\n {/* Sandbox Accounts Section */}\n {isSandboxMode && displayedSandboxAccounts.length > 0 && (\n <>\n {displayedSandboxAccounts.map((account) => (\n <MenuItem key={account.id}>\n {({ focus }) => (\n <button\n onClick={() => handleSelectSandboxAccount(account)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.875rem 1rem',\n backgroundColor: focus ? '#3a3a3c' : 'transparent',\n borderRadius: '0.5rem',\n border: 'none',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n transition: 'background-color 150ms',\n }}\n >\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n color: '#fff',\n }}\n >\n <SandboxIcon />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem', marginBottom: '0.125rem' }}>\n <span style={{ fontSize: '0.75rem', color: '#8e8e93' }}>\n From {truncateAddress(account.address)}\n </span>\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n navigator.clipboard.writeText(account.address);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation();\n navigator.clipboard.writeText(account.address);\n }\n }}\n style={{\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n </span>\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fff',\n }}\n >\n {account.name.charAt(0).toUpperCase() + account.name.slice(1)}\n </span>\n </div>\n {account.usdcBalance !== undefined && (\n <span\n style={{\n fontSize: '0.6875rem',\n color: '#ff9f0a',\n backgroundColor: 'rgba(255, 159, 10, 0.15)',\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n flexShrink: 0,\n }}\n >\n {account.usdcBalance.toLocaleString()} USDC\n </span>\n )}\n </button>\n )}\n </MenuItem>\n ))}\n {/* Divider between sandbox and browser extensions */}\n {availableWallets.length > 0 && (\n <div style={{ height: '1px', backgroundColor: '#48484a', margin: '0.25rem 0' }} />\n )}\n </>\n )}\n\n {/* Browser Extension Wallets Section */}\n {availableWallets.length > 0 ? (\n availableWallets.map((wallet) => (\n <MenuItem key={wallet.adapter.name}>\n {({ focus }) => (\n <button\n onClick={() => handleSelectWallet(wallet)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.875rem 1rem',\n backgroundColor: focus ? '#3a3a3c' : 'transparent',\n borderRadius: '0.5rem',\n border: 'none',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n transition: 'background-color 150ms',\n }}\n >\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n backgroundColor: '#636366',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {wallet.adapter.icon ? (\n <img\n src={wallet.adapter.icon}\n alt={wallet.adapter.name}\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '0.5rem',\n }}\n />\n ) : (\n <WalletIcon />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '0.75rem', color: '#8e8e93', marginBottom: '0.125rem' }}>\n Browser Extension\n </div>\n <span\n style={{\n fontSize: '0.9375rem',\n fontWeight: 500,\n color: '#fff',\n }}\n >\n {wallet.adapter.name}\n </span>\n </div>\n {wallet.readyState === 'Installed' && (\n <span\n style={{\n fontSize: '0.6875rem',\n color: '#30d158',\n backgroundColor: 'rgba(48, 209, 88, 0.15)',\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n flexShrink: 0,\n }}\n >\n Detected\n </span>\n )}\n </button>\n )}\n </MenuItem>\n ))\n ) : !isSandboxMode || displayedSandboxAccounts.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '1.5rem',\n color: '#8e8e93',\n fontSize: '0.875rem',\n }}\n >\n No wallets detected\n </div>\n ) : null}\n </MenuItems>\n </Menu>\n )}\n\n </div>\n\n {/* Footer with amount and pay button */}\n <div\n style={{\n padding: '1rem 1.25rem 1.25rem',\n borderTop: '1px solid #3a3a3c',\n }}\n >\n {/* Line items and amount */}\n <div style={{ marginBottom: '1rem' }}>\n {/* Line items list */}\n {lineItems && lineItems.length > 0 && (\n <div style={{ marginBottom: '0.75rem' }}>\n {lineItems.map((item, index) => (\n <div\n key={item.product.id + '-' + index}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '0.5rem 0',\n borderBottom: index < lineItems.length - 1 ? '1px solid #3a3a3c' : 'none',\n }}\n >\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: '0.875rem', color: '#fff', fontWeight: 500 }}>\n {item.product.name}\n </div>\n {item.quantity > 1 && (\n <div style={{ fontSize: '0.75rem', color: '#8e8e93' }}>\n Qty: {item.quantity} × {(item.price.unit_amount / 100).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {item.price.currency.toUpperCase()}\n </div>\n )}\n </div>\n <div style={{ fontSize: '0.875rem', color: '#fff', fontWeight: 500 }}>\n {item.subtotal.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {item.price.currency.toUpperCase()}\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div style={{ fontSize: '0.875rem', color: '#8e8e93', marginBottom: '0.25rem' }}>\n Total\n </div>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: '0.375rem' }}>\n <span style={{ fontSize: '2rem', fontWeight: 600, color: '#fff' }}>\n {amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}\n </span>\n <span style={{ fontSize: '1rem', fontWeight: 500, color: '#8e8e93' }}>\n {currency}\n </span>\n </div>\n <button\n onClick={() => setShowDetails(!showDetails)}\n style={{\n width: '22px',\n height: '22px',\n borderRadius: '50%',\n border: '1.5px solid #8e8e93',\n background: 'none',\n color: '#8e8e93',\n fontSize: '0.8125rem',\n fontWeight: 600,\n fontStyle: 'italic',\n fontFamily: 'Georgia, serif',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n transition: 'all 150ms',\n }}\n title=\"Show payment details\"\n >\n i\n </button>\n </div>\n\n {/* Recipient details (shown when info button is clicked) */}\n {showDetails && (\n <div\n style={{\n marginTop: '0.75rem',\n padding: '0.625rem 0.75rem',\n backgroundColor: '#3a3a3c',\n borderRadius: '0.5rem',\n fontSize: '0.8125rem',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span style={{ color: '#8e8e93' }}>Recipient</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.375rem' }}>\n <span\n style={{\n color: '#fff',\n fontFamily: 'ui-monospace, monospace',\n fontSize: '0.75rem',\n }}\n >\n {truncateAddress(recipient)}\n </span>\n <button\n onClick={() => copyToClipboard(recipient, 'recipient')}\n style={{\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: copiedRecipient ? '#30d158' : '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Pay Button */}\n <button\n onClick={handlePay}\n disabled={!canPay}\n style={{\n width: '100%',\n padding: '1rem',\n borderRadius: '0.75rem',\n border: 'none',\n fontSize: '1.0625rem',\n fontWeight: 600,\n cursor: canPay ? 'pointer' : 'not-allowed',\n backgroundColor: canPay ? accentColor : '#48484a',\n color: canPay ? '#fff' : '#8e8e93',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n transition: 'opacity 150ms',\n }}\n >\n {isSending ? (\n <>\n <div\n style={{\n width: '1.25rem',\n height: '1.25rem',\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <span>Processing...</span>\n </>\n ) : (\n <>\n {/* ShieldCheck Heroicon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M12.516 2.17a.75.75 0 0 0-1.032 0 11.209 11.209 0 0 1-7.877 3.08.75.75 0 0 0-.722.515A12.74 12.74 0 0 0 2.25 9.75c0 5.942 4.064 10.933 9.563 12.348a.749.749 0 0 0 .374 0c5.499-1.415 9.563-6.406 9.563-12.348 0-1.39-.223-2.73-.635-3.985a.75.75 0 0 0-.722-.516 11.209 11.209 0 0 1-7.877-3.08ZM10.28 10.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.06 0l3.75-3.75a.75.75 0 0 0-1.06-1.06l-3.22 3.22-1.72-1.72Z\" clipRule=\"evenodd\" />\n </svg>\n <span>Pay {amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {currency}</span>\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n </>\n );\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useWalletModal } from './wallet-modal-provider';\n\nexport interface Payment {\n id: string;\n amount: number;\n currency: string;\n status: 'pending' | 'completed' | 'failed';\n signature?: string;\n}\n\nexport interface UsePaymentReturn {\n pay: (priceId: string) => Promise<Payment | null>;\n isPending: boolean;\n lastPayment: Payment | null;\n}\n\nexport function usePayment(): UsePaymentReturn {\n const [isPending, setIsPending] = useState(false);\n const [lastPayment, setLastPayment] = useState<Payment | null>(null);\n const { publicKey, connected } = useWallet();\n const { setVisible } = useWalletModal();\n\n const pay = useCallback(async (priceId: string): Promise<Payment | null> => {\n // If not connected, open wallet modal\n if (!connected || !publicKey) {\n setVisible(true);\n return null;\n }\n\n setIsPending(true);\n\n try {\n const event = new CustomEvent('moneymq:pay', {\n detail: { priceId, publicKey: publicKey.toBase58() },\n bubbles: true,\n });\n window.dispatchEvent(event);\n\n const result = await new Promise<Payment>((resolve, reject) => {\n const handleSuccess = (e: Event) => {\n const customEvent = e as CustomEvent<Payment>;\n cleanup();\n resolve(customEvent.detail);\n };\n\n const handleError = (e: Event) => {\n const customEvent = e as CustomEvent<Error>;\n cleanup();\n reject(customEvent.detail);\n };\n\n const cleanup = () => {\n window.removeEventListener('moneymq:payment-success', handleSuccess);\n window.removeEventListener('moneymq:payment-error', handleError);\n };\n\n window.addEventListener('moneymq:payment-success', handleSuccess);\n window.addEventListener('moneymq:payment-error', handleError);\n\n setTimeout(() => {\n cleanup();\n reject(new Error('Payment timeout'));\n }, 60000);\n });\n\n setLastPayment(result);\n return result;\n } catch {\n return null;\n } finally {\n setIsPending(false);\n }\n }, [connected, publicKey, setVisible]);\n\n return { pay, isPending, lastPayment };\n}\n"],"mappings":"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","names":["createContext","useContext","useEffect","useMemo","useState","useState","useCallback","useMemo","jsx","jsxs","useState","useCallback","useMemo","jsx","createContext","useContext","useState","useEffect","useMemo","React","useEffect","useState","useCallback","useState","useWallet","Fragment","jsx","jsxs","normalizeRpcUrl","useState","useWallet","useCallback","Fragment","jsx","jsxs","PayButton","useState","React","useEffect","error","useCallback","useState","useWallet","useState","useWallet","useCallback"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moneymq/react",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "MoneyMQ React components for accepting stablecoin payments",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -15,12 +15,6 @@
15
15
  "files": [
16
16
  "dist"
17
17
  ],
18
- "scripts": {
19
- "build": "tsup",
20
- "dev": "tsup --watch",
21
- "typecheck": "tsc --noEmit",
22
- "clean": "rm -rf dist .turbo node_modules"
23
- },
24
18
  "repository": {
25
19
  "type": "git",
26
20
  "url": "git+https://github.com/txtx/moneymq-js.git",
@@ -54,5 +48,11 @@
54
48
  "@types/react-dom": "^19",
55
49
  "tsup": "^8.0.0",
56
50
  "typescript": "^5"
51
+ },
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "dev": "tsup --watch",
55
+ "typecheck": "tsc --noEmit",
56
+ "clean": "rm -rf dist .turbo node_modules"
57
57
  }
58
- }
58
+ }