@cicero-zcash/react 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/CiceroContext.tsx","../src/utils/zip321.ts","../src/wallet/zucchini.ts","../src/wallets/zucchini.ts","../src/wallets/zashi.ts","../src/wallets/ywallet.ts","../src/wallets/viewingKey.ts","../src/wallets/burner.ts","../src/wallets/index.ts","../src/hooks/useZcashPrice.ts","../src/components/CiceroConnectModal.tsx","../src/components/CiceroQRCode.tsx","../src/components/CiceroAccountModal.tsx","../src/utils/address.ts","../src/components/CiceroConnectButton.tsx","../src/components/CiceroPayButton.tsx","../src/hooks/useCiceroPayment.ts","../src/components/CiceroModal.tsx","../src/components/CiceroInvoice.tsx","../src/hooks/useZucchiniWallet.ts"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport { ZcashNetwork } from '../types';\nimport {\n ZcashWallet,\n WalletSession,\n SendPaymentParams,\n SendPaymentResult,\n getDefaultWallets,\n} from '../wallets';\nimport { useZcashPrice } from '../hooks/useZcashPrice';\nimport { ZucchiniWalletAdapter } from '../wallet/zucchini';\nimport { CiceroConnectModal } from '../components/CiceroConnectModal';\nimport { CiceroAccountModal } from '../components/CiceroAccountModal';\n\nexport interface AccountState {\n address: string | null;\n viewingKey: string | null;\n isConnected: boolean;\n isConnecting: boolean;\n status: 'disconnected' | 'connecting' | 'connected' | 'error';\n wallet: ZcashWallet | null;\n error: string | null;\n}\n\nexport interface BalanceState {\n zec: number;\n usd: string | null;\n isLoading: boolean;\n}\n\nexport interface CiceroContextType {\n // Account\n account: AccountState;\n address: string | null;\n isConnected: boolean;\n isConnecting: boolean;\n wallet: ZcashWallet | null;\n\n // Network\n network: ZcashNetwork;\n switchNetwork: (net: ZcashNetwork) => void;\n\n // Balance\n balance: BalanceState;\n refetchBalance: () => Promise<void>;\n\n // Actions\n connect: (walletId: string, customAddressOrKey?: string) => Promise<void>;\n disconnect: () => Promise<void>;\n sendPayment: (params: SendPaymentParams) => Promise<SendPaymentResult>;\n\n // Modals\n isConnectModalOpen: boolean;\n openConnectModal: () => void;\n closeConnectModal: () => void;\n\n isAccountModalOpen: boolean;\n openAccountModal: () => void;\n closeAccountModal: () => void;\n\n // Config\n wallets: ZcashWallet[];\n appName?: string;\n appLogo?: string;\n}\n\nconst CiceroContext = createContext<CiceroContextType | null>(null);\n\nexport interface CiceroProviderProps {\n children: React.ReactNode;\n initialNetwork?: ZcashNetwork;\n wallets?: ZcashWallet[];\n appName?: string;\n appLogo?: string;\n autoConnect?: boolean;\n}\n\nexport const CiceroProvider: React.FC<CiceroProviderProps> = ({\n children,\n initialNetwork = 'mainnet',\n wallets = getDefaultWallets(),\n appName = 'Zcash App',\n appLogo,\n autoConnect = true,\n}) => {\n const [network, setNetwork] = useState<ZcashNetwork>(initialNetwork);\n const [account, setAccount] = useState<AccountState>({\n address: null,\n viewingKey: null,\n isConnected: false,\n isConnecting: false,\n status: 'disconnected',\n wallet: null,\n error: null,\n });\n\n const [balance, setBalance] = useState<BalanceState>({\n zec: 0,\n usd: null,\n isLoading: false,\n });\n\n // Modal states\n const [isConnectModalOpen, setIsConnectModalOpen] = useState(false);\n const [isAccountModalOpen, setIsAccountModalOpen] = useState(false);\n\n // Price oracle\n const { convertZecToUsd } = useZcashPrice(true);\n\n // Stable refs for props/hooks to prevent infinite re-render loops\n const convertZecToUsdRef = useRef(convertZecToUsd);\n convertZecToUsdRef.current = convertZecToUsd;\n\n const walletsRef = useRef(wallets);\n walletsRef.current = wallets;\n\n // Local storage restoration on initial mount\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const savedWalletId = localStorage.getItem('cicero_wallet_id');\n const savedAddress = localStorage.getItem('cicero_address');\n const savedNetwork = localStorage.getItem('cicero_network') as ZcashNetwork;\n\n if (savedNetwork) {\n setNetwork(savedNetwork);\n }\n\n if (autoConnect && savedWalletId) {\n const targetWallet = walletsRef.current.find((w) => w.id === savedWalletId);\n // If we have a saved address or the wallet is available, restore session immediately\n if (targetWallet && (savedAddress || targetWallet.isAvailable())) {\n const savedBal = localStorage.getItem('cicero_balance');\n const parsedBal = savedBal ? parseFloat(savedBal) : null;\n const activeZec = parsedBal !== null && !isNaN(parsedBal) ? parsedBal : 0;\n const initialUsd = convertZecToUsdRef.current(activeZec);\n\n setAccount({\n address: savedAddress || null,\n viewingKey: null,\n isConnected: true,\n isConnecting: false,\n status: 'connected',\n wallet: targetWallet,\n error: null,\n });\n\n setBalance({\n zec: activeZec,\n usd: initialUsd,\n isLoading: false,\n });\n\n // Background query to sync latest real balance once wallet is ready\n if (targetWallet.getBalance) {\n targetWallet\n .getBalance({ address: savedAddress || undefined, network })\n .then((freshBal) => {\n if (freshBal !== null && !isNaN(freshBal)) {\n setBalance({\n zec: freshBal,\n usd: convertZecToUsdRef.current(freshBal),\n isLoading: false,\n });\n localStorage.setItem('cicero_balance', freshBal.toString());\n }\n })\n .catch(() => {});\n }\n }\n }\n }, [autoConnect]);\n\n // Live Zucchini event listener: detects unlock, account changes, or late injection\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // Listen for extension readiness (handles late injection without disconnect)\n const cleanupReady = ZucchiniWalletAdapter.onReady(() => {\n const savedWalletId = localStorage.getItem('cicero_wallet_id');\n const savedAddress = localStorage.getItem('cicero_address');\n\n if (savedWalletId === 'zucchini' && autoConnect) {\n const zucchini = walletsRef.current.find((w) => w.id === 'zucchini');\n if (zucchini) {\n // If extension became ready, ensure connected state is active\n setAccount((prev) => {\n if (prev.isConnected && prev.wallet?.id === 'zucchini') return prev;\n return {\n address: savedAddress || null,\n viewingKey: null,\n isConnected: true,\n isConnecting: false,\n status: 'connected',\n wallet: zucchini,\n error: null,\n };\n });\n }\n }\n });\n\n return () => {\n cleanupReady();\n };\n }, [autoConnect]);\n\n // Update USD balance when ZEC price updates\n useEffect(() => {\n if (account.isConnected) {\n setBalance((prev) => {\n const newUsd = convertZecToUsd(prev.zec);\n if (prev.usd === newUsd) return prev; // Prevent unnecessary state churn\n return {\n ...prev,\n usd: newUsd,\n };\n });\n }\n }, [account.isConnected, balance.zec, convertZecToUsd]);\n\n const switchNetwork = useCallback((newNet: ZcashNetwork) => {\n setNetwork(newNet);\n if (typeof window !== 'undefined') {\n localStorage.setItem('cicero_network', newNet);\n }\n }, []);\n\n const connect = useCallback(\n async (walletId: string, customAddressOrKey?: string) => {\n const targetWallet = wallets.find((w) => w.id === walletId);\n if (!targetWallet) {\n throw new Error(`Wallet ${walletId} not found in registered wallets`);\n }\n\n setAccount((prev) => ({\n ...prev,\n isConnecting: true,\n status: 'connecting',\n error: null,\n }));\n\n try {\n let session: WalletSession;\n\n if (walletId === 'viewing-key' && customAddressOrKey) {\n session = {\n address: customAddressOrKey,\n viewingKey: customAddressOrKey.startsWith('zx') || customAddressOrKey.startsWith('uview')\n ? customAddressOrKey\n : undefined,\n connected: true,\n network,\n walletId: 'viewing-key',\n };\n } else {\n session = await targetWallet.connect({ network });\n }\n\n const resolvedAddress = session.address || customAddressOrKey || null;\n\n setAccount({\n address: resolvedAddress,\n viewingKey: session.viewingKey || null,\n isConnected: true,\n isConnecting: false,\n status: 'connected',\n wallet: targetWallet,\n error: null,\n });\n\n // Resolve real balance from wallet session or getBalance query\n let resolvedZec: number | null = session.balance ?? null;\n\n if (resolvedZec === null && targetWallet.getBalance) {\n try {\n resolvedZec = await targetWallet.getBalance({\n address: resolvedAddress || undefined,\n network,\n });\n } catch {\n // best effort\n }\n }\n\n if (resolvedZec === null && typeof window !== 'undefined') {\n const cached = localStorage.getItem('cicero_balance');\n if (cached && !isNaN(parseFloat(cached))) {\n resolvedZec = parseFloat(cached);\n }\n }\n\n const activeZec = resolvedZec !== null && !isNaN(resolvedZec) ? resolvedZec : 0;\n\n setBalance({\n zec: activeZec,\n usd: convertZecToUsd(activeZec),\n isLoading: false,\n });\n\n if (typeof window !== 'undefined' && resolvedZec !== null) {\n localStorage.setItem('cicero_balance', resolvedZec.toString());\n }\n\n if (typeof window !== 'undefined') {\n localStorage.setItem('cicero_wallet_id', walletId);\n if (resolvedAddress) {\n localStorage.setItem('cicero_address', resolvedAddress);\n }\n }\n\n setIsConnectModalOpen(false);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Connection failed';\n setAccount((prev) => ({\n ...prev,\n isConnecting: false,\n status: 'error',\n error: msg,\n }));\n throw err;\n }\n },\n [wallets, network, convertZecToUsd]\n );\n\n const disconnect = useCallback(async () => {\n if (account.wallet?.disconnect) {\n try {\n await account.wallet.disconnect();\n } catch {\n // best effort\n }\n }\n\n setAccount({\n address: null,\n viewingKey: null,\n isConnected: false,\n isConnecting: false,\n status: 'disconnected',\n wallet: null,\n error: null,\n });\n\n setBalance({\n zec: 0,\n usd: null,\n isLoading: false,\n });\n\n if (typeof window !== 'undefined') {\n localStorage.removeItem('cicero_wallet_id');\n localStorage.removeItem('cicero_address');\n localStorage.removeItem('cicero_balance');\n }\n\n setIsAccountModalOpen(false);\n }, [account.wallet]);\n\n const sendPayment = useCallback(\n async (params: SendPaymentParams): Promise<SendPaymentResult> => {\n if (!account.wallet) {\n throw new Error('No wallet connected. Please connect a Zcash wallet first.');\n }\n\n if (account.wallet.sendPayment) {\n return account.wallet.sendPayment(params);\n }\n\n throw new Error(`Wallet ${account.wallet.name} does not support programmatic send.`);\n },\n [account.wallet]\n );\n\n const refetchBalance = useCallback(async () => {\n if (!account.wallet) return;\n setBalance((prev) => ({ ...prev, isLoading: true }));\n\n try {\n let freshZec: number | null = null;\n if (account.wallet.getBalance) {\n freshZec = await account.wallet.getBalance({\n address: account.address || undefined,\n network,\n });\n }\n\n if (freshZec !== null && !isNaN(freshZec)) {\n setBalance({\n zec: freshZec,\n usd: convertZecToUsd(freshZec),\n isLoading: false,\n });\n if (typeof window !== 'undefined') {\n localStorage.setItem('cicero_balance', freshZec.toString());\n }\n return;\n }\n } catch {\n // best effort\n }\n\n setBalance((prev) => ({\n ...prev,\n isLoading: false,\n usd: convertZecToUsd(prev.zec),\n }));\n }, [account.wallet, account.address, network, convertZecToUsd]);\n\n const openConnectModal = useCallback(() => setIsConnectModalOpen(true), []);\n const closeConnectModal = useCallback(() => setIsConnectModalOpen(false), []);\n const openAccountModal = useCallback(() => setIsAccountModalOpen(true), []);\n const closeAccountModal = useCallback(() => setIsAccountModalOpen(false), []);\n\n const value = useMemo<CiceroContextType>(\n () => ({\n account,\n address: account.address,\n isConnected: account.isConnected,\n isConnecting: account.isConnecting,\n wallet: account.wallet,\n network,\n switchNetwork,\n balance,\n refetchBalance,\n connect,\n disconnect,\n sendPayment,\n isConnectModalOpen,\n openConnectModal,\n closeConnectModal,\n isAccountModalOpen,\n openAccountModal,\n closeAccountModal,\n wallets,\n appName,\n appLogo,\n }),\n [\n account,\n network,\n switchNetwork,\n balance,\n refetchBalance,\n connect,\n disconnect,\n sendPayment,\n isConnectModalOpen,\n openConnectModal,\n closeConnectModal,\n isAccountModalOpen,\n openAccountModal,\n closeAccountModal,\n wallets,\n appName,\n appLogo,\n ]\n );\n\n return (\n <CiceroContext.Provider value={value}>\n {children}\n <CiceroConnectModal />\n <CiceroAccountModal />\n </CiceroContext.Provider>\n );\n};\n\nexport function useCicero(): CiceroContextType {\n const ctx = useContext(CiceroContext);\n if (!ctx) {\n throw new Error('useCicero must be used within a <CiceroProvider>');\n }\n return ctx;\n}\n\n// Convenient RainbowKit-style aliases\nexport const useAccount = () => {\n const { account, address, isConnected, isConnecting, wallet, disconnect } = useCicero();\n return { ...account, address, isConnected, isConnecting, wallet, disconnect };\n};\n\nexport const useBalance = () => {\n const { balance, refetchBalance } = useCicero();\n return { ...balance, refetch: refetchBalance };\n};\n\nexport const useConnectModal = () => {\n const { isConnectModalOpen, openConnectModal, closeConnectModal } = useCicero();\n return {\n isOpen: isConnectModalOpen,\n openConnectModal,\n closeConnectModal,\n };\n};\n\nexport const useAccountModal = () => {\n const { isAccountModalOpen, openAccountModal, closeAccountModal } = useCicero();\n return {\n isOpen: isAccountModalOpen,\n openAccountModal,\n closeAccountModal,\n };\n};\n","import { Zip321PaymentRequest } from '../types';\n\n/**\n * Encodes a string to Base64URL without padding per RFC 4648 §5 / ZIP-321 specification.\n */\nexport function encodeBase64Url(str: string): string {\n try {\n const bytes = new TextEncoder().encode(str);\n let binary = '';\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n // Convert base64 to base64url: '+' -> '-', '/' -> '_', remove '='\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n } catch {\n return '';\n }\n}\n\n/**\n * Decodes a Base64URL string without padding per ZIP-321 specification.\n */\nexport function decodeBase64Url(base64url: string): string {\n try {\n let base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n while (base64.length % 4) {\n base64 += '=';\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n } catch {\n return '';\n }\n}\n\nexport interface BuildZip321Params {\n address: string;\n amount?: number | string;\n memo?: string;\n message?: string;\n}\n\n/**\n * Generates an RFC-compliant ZIP-321 Payment Request URI.\n * Example output:\n * zcash:u1xyz...?amount=0.05&memo=T3JkZXIgIzEwNDI&message=Payment%20for%20order\n */\nexport function generateZip321Uri({\n address,\n amount,\n memo,\n message,\n}: BuildZip321Params): string {\n const cleanAddress = address.trim();\n const params = new URLSearchParams();\n\n if (amount !== undefined && amount !== null && amount !== '') {\n const numAmount = typeof amount === 'number' ? amount : parseFloat(amount);\n if (!isNaN(numAmount) && numAmount > 0) {\n params.append('amount', numAmount.toString());\n }\n }\n\n if (memo && memo.trim().length > 0) {\n const encodedMemo = encodeBase64Url(memo.trim());\n if (encodedMemo) {\n params.append('memo', encodedMemo);\n }\n }\n\n if (message && message.trim().length > 0) {\n params.append('message', message.trim());\n }\n\n const queryString = params.toString();\n return queryString ? `zcash:${cleanAddress}?${queryString}` : `zcash:${cleanAddress}`;\n}\n\n/**\n * Parses a ZIP-321 URI back into its component parts.\n */\nexport function parseZip321Uri(rawUri: string): Zip321PaymentRequest {\n const trimmed = rawUri.trim();\n const withoutScheme = trimmed.startsWith('zcash:') ? trimmed.slice(6) : trimmed;\n const [addressPart, queryPart] = withoutScheme.split('?');\n\n const result: Zip321PaymentRequest = {\n address: addressPart || '',\n rawUri: trimmed,\n };\n\n if (!queryPart) {\n return result;\n }\n\n const searchParams = new URLSearchParams(queryPart);\n const amount = searchParams.get('amount');\n const memo = searchParams.get('memo');\n const message = searchParams.get('message');\n\n if (amount) result.amount = amount;\n if (memo) result.memo = decodeBase64Url(memo);\n if (message) result.message = message;\n\n return result;\n}\n\n/**\n * Generates deep link URLs for major mobile Zcash wallets:\n * - Zashi (Electric Coin Co.)\n * - Ywallet\n */\nexport function getWalletDeepLinks(zip321Uri: string): {\n generic: string;\n zashi: string;\n ywallet: string;\n} {\n return {\n generic: zip321Uri,\n zashi: zip321Uri, // Zashi registers the native zcash: URI handler on iOS/Android\n ywallet: zip321Uri, // Ywallet also natively handles zcash: protocol\n };\n}\n","import { generateZip321Uri } from '../utils/zip321';\n\nexport type WalletConnectionStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'error';\n\nexport type WalletPaymentStatus =\n | 'idle'\n | 'requesting'\n | 'submitted'\n | 'error';\n\nexport interface WalletSession {\n address?: string;\n connected: boolean;\n balance?: number;\n}\n\nexport interface WalletPaymentResult {\n txId: string;\n submitted: boolean;\n}\n\n/**\n * Adapter for the Zucchini Wallet browser extension.\n *\n * Zucchini injects a provider onto window.zucchini (or window.zcash) and implements\n * the typed @zucchinifi/dapp-sdk Zcash contract.\n */\nexport class ZucchiniWalletAdapter {\n private client: any = null;\n private provider: any = null;\n private _connected = false;\n private _address: string | null = null;\n private _lastAccounts: any[] = [];\n\n /**\n * Checks whether the Zucchini Wallet extension is installed and its\n * provider is available in the current browser environment.\n */\n static isAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n const win = window as any;\n if (win.zucchini && typeof win.zucchini.request === 'function') {\n return true;\n }\n if (win.zcash) {\n return true;\n }\n return !!win.zucchini;\n }\n\n /**\n * Subscribes to wallet readiness. Fires callback immediately if already available,\n * or listens for injection events / polls briefly for late extension initialization.\n */\n static onReady(callback: () => void): () => void {\n if (typeof window === 'undefined') return () => {};\n\n if (ZucchiniWalletAdapter.isAvailable()) {\n callback();\n return () => {};\n }\n\n const handler = () => callback();\n window.addEventListener('zucchini#initialized', handler);\n window.addEventListener('zcash#initialized', handler);\n\n // Poll every 150ms for up to 3.5 seconds\n const interval = setInterval(() => {\n if (ZucchiniWalletAdapter.isAvailable()) {\n clearInterval(interval);\n callback();\n }\n }, 150);\n\n const timeout = setTimeout(() => {\n clearInterval(interval);\n }, 3500);\n\n return () => {\n window.removeEventListener('zucchini#initialized', handler);\n window.removeEventListener('zcash#initialized', handler);\n clearInterval(interval);\n clearTimeout(timeout);\n };\n }\n\n /**\n * Discovers and initializes the Zucchini Client using @zucchinifi/dapp-sdk/zcash\n * with graceful fallback to raw window.zucchini / window.zcash globals.\n */\n private async getClient(): Promise<any> {\n if (this.client) return this.client;\n\n if (typeof window === 'undefined') {\n throw new Error('Zucchini Wallet is only available in browser environments.');\n }\n\n const win = window as any;\n let rawProvider = win.zucchini || win.zcash;\n\n try {\n // Import the official dapp SDK\n const { discoverZucchiniProvider, createZucchiniClient } = await import(\n '@zucchinifi/dapp-sdk/zcash'\n );\n\n const discovered = discoverZucchiniProvider() || rawProvider;\n if (discovered) {\n this.provider = discovered;\n this.client = createZucchiniClient(discovered);\n return this.client;\n }\n } catch {\n // SDK import fallback to direct window object wrapping\n }\n\n if (rawProvider) {\n this.provider = rawProvider;\n // Synthetic fallback client\n this.client = {\n async connect(req?: any) {\n if (typeof rawProvider.connect === 'function') {\n return rawProvider.connect(req?.permissions || ['view_addresses', 'view_balance', 'send_transaction']);\n }\n if (typeof rawProvider.request === 'function') {\n return rawProvider.request({ method: 'connect', params: req });\n }\n return { connected: true };\n },\n async disconnect() {\n if (typeof rawProvider.disconnect === 'function') {\n return rawProvider.disconnect();\n }\n },\n async requestPayment(uri: string) {\n if (typeof rawProvider.request === 'function') {\n const res = await rawProvider.request({\n method: 'zcash_requestPayment',\n params: { uri },\n });\n return { txid: res?.txid || res?.txId || res };\n }\n throw new Error('Direct ZIP-321 send not supported by provider');\n },\n async getAddresses() {\n if (typeof rawProvider.request === 'function') {\n return rawProvider.request({ method: 'getAddresses' });\n }\n return {};\n },\n on(event: string, listener: (val: any) => void) {\n rawProvider.on?.(event, listener);\n return () => rawProvider.off?.(event, listener);\n },\n };\n return this.client;\n }\n\n throw new Error(\n 'Zucchini Wallet extension not detected. Please install it from the Chrome Web Store or ensure the side-panel is open.'\n );\n }\n\n /**\n * Requests connection with view_addresses and send_transaction permissions.\n * Resolves the user's active Shielded Unified Address.\n */\n async connect(): Promise<WalletSession> {\n const client = await this.getClient();\n\n const connection = await client.connect({\n permissions: ['view_addresses', 'view_balance', 'send_transaction'],\n });\n\n let address: string | undefined = undefined;\n\n // Check connection accounts array\n if (connection?.accounts && connection.accounts.length > 0) {\n address = connection.accounts[0].address;\n }\n\n // If address not in connection result, query getAddresses() explicitly\n if (!address && typeof client.getAddresses === 'function') {\n try {\n const addresses = await client.getAddresses();\n address =\n addresses?.unified ||\n addresses?.orchard ||\n addresses?.sapling ||\n addresses?.transparent;\n } catch {\n // best effort\n }\n }\n\n this._lastAccounts = connection?.accounts || [];\n\n // Query live balance via view_balance grant\n const balance = await this.getBalance({ address });\n\n this._connected = true;\n this._address = address || null;\n\n return {\n address,\n connected: true,\n balance: balance ?? undefined,\n };\n }\n\n /**\n * Helper to normalize raw balance formats (e.g. number, string, zatoshis, or pool totals).\n */\n private parseBalancePayload(payload: any): number | null {\n if (payload === undefined || payload === null) return null;\n if (typeof payload === 'number') {\n return payload > 1000000 ? payload / 100000000 : payload;\n }\n if (typeof payload === 'string') {\n const parsed = parseFloat(payload);\n if (!isNaN(parsed)) {\n return parsed > 1000000 ? parsed / 100000000 : parsed;\n }\n }\n if (typeof payload === 'object') {\n const cand =\n payload.total ??\n payload.balance ??\n payload.amount ??\n payload.zec ??\n payload.value ??\n payload.zatoshis;\n if (cand !== undefined && cand !== null) {\n return this.parseBalancePayload(cand);\n }\n let sum = 0;\n let hasPool = false;\n for (const pool of ['orchard', 'sapling', 'transparent', 'shielded', 'unshielded']) {\n if (payload[pool] !== undefined) {\n const v = this.parseBalancePayload(payload[pool]);\n if (v !== null) {\n sum += v;\n hasPool = true;\n }\n }\n }\n if (hasPool) return sum;\n }\n return null;\n }\n\n /**\n * Reads real-time balance from Zucchini provider.\n */\n async getBalance(options?: { address?: string; network?: string }): Promise<number | null> {\n const raw =\n this.provider ||\n (typeof window !== 'undefined'\n ? (window as any).zucchini || (window as any).zcash\n : null);\n\n const methods = [\n 'getBalance',\n 'getBalances',\n 'zcash_getBalance',\n 'zcash_getBalances',\n 'view_balance',\n 'getBalanceSummary',\n ];\n\n if (raw && typeof raw.request === 'function') {\n for (const method of methods) {\n try {\n const res = await raw.request({ method, params: options });\n const parsed = this.parseBalancePayload(res);\n if (parsed !== null) return parsed;\n } catch {\n // try next RPC method\n }\n }\n }\n\n // Inspect cached accounts from connection\n if (this._lastAccounts && this._lastAccounts.length > 0) {\n for (const acc of this._lastAccounts) {\n const parsed = this.parseBalancePayload(acc);\n if (parsed !== null) return parsed;\n }\n }\n\n return null;\n }\n\n /**\n * Sends payment via standard ZIP-321 URI requestPayment or transaction fallback.\n */\n async requestPayment(params: {\n recipient: string;\n amount: number | string;\n memo?: string;\n }): Promise<WalletPaymentResult> {\n if (!this._connected) {\n await this.connect();\n }\n\n const client = await this.getClient();\n const numAmount =\n typeof params.amount === 'number'\n ? params.amount\n : parseFloat(params.amount);\n\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error('Payment amount must be a positive number.');\n }\n\n // 1. Generate standard ZIP-321 URI\n const uri = generateZip321Uri({\n address: params.recipient.trim(),\n amount: numAmount,\n memo: params.memo?.trim(),\n });\n\n try {\n if (typeof client.requestPayment === 'function') {\n const res = await client.requestPayment(uri);\n const txId = res?.txid || res?.txId || '';\n return { txId, submitted: true };\n }\n } catch (e) {\n // If requestPayment fails or is unsupported, try requestTransaction\n }\n\n // 2. Fallback: requestTransaction\n if (typeof client.requestTransaction === 'function') {\n const zatoshis = BigInt(Math.round(numAmount * 100000000));\n const res = await client.requestTransaction({\n amountZatoshis: zatoshis,\n recipient: params.recipient.trim(),\n memo: params.memo?.trim(),\n });\n return { txId: res?.txid || '', submitted: true };\n }\n\n throw new Error('Zucchini Wallet does not support payment dispatch.');\n }\n\n /**\n * Subscribes to accountsChanged events.\n */\n onAccountsChanged(listener: (accounts: any) => void): () => void {\n if (this.client?.on) {\n return this.client.on('accountsChanged', listener);\n }\n if (this.provider?.on) {\n this.provider.on('accountsChanged', listener);\n return () => this.provider?.off?.('accountsChanged', listener);\n }\n return () => {};\n }\n\n /**\n * Subscribes to disconnect events.\n */\n onDisconnect(listener: () => void): () => void {\n if (this.client?.on) {\n return this.client.on('disconnect', listener);\n }\n if (this.provider?.on) {\n this.provider.on('disconnect', listener);\n return () => this.provider?.off?.('disconnect', listener);\n }\n return () => {};\n }\n\n /**\n * Disconnects the current session.\n */\n async disconnect(): Promise<void> {\n try {\n if (this.client?.disconnect) {\n await this.client.disconnect();\n } else if (this.provider?.disconnect) {\n await this.provider.disconnect();\n }\n } catch {\n // best-effort\n }\n this._connected = false;\n this._address = null;\n }\n\n get isConnected(): boolean {\n return this._connected;\n }\n\n get address(): string | null {\n return this._address;\n }\n}\n","import { ZcashWallet, WalletSession, SendPaymentParams, SendPaymentResult } from './types';\nimport { ZucchiniWalletAdapter } from '../wallet/zucchini';\n\nconst adapter = new ZucchiniWalletAdapter();\n\nexport const zucchiniWallet: ZcashWallet = {\n id: 'zucchini',\n name: 'Zucchini Wallet',\n icon: '🥒',\n description: 'In-browser Chrome extension with 1-click side-panel approvals',\n category: 'extension',\n downloadUrl: 'https://chromewebstore.google.com/detail/zucchini-wallet',\n isAvailable: () => ZucchiniWalletAdapter.isAvailable(),\n\n connect: async (options): Promise<WalletSession> => {\n const session = await adapter.connect();\n return {\n address: session.address,\n connected: true,\n network: options?.network || 'mainnet',\n walletId: 'zucchini',\n balance: session.balance,\n };\n },\n\n disconnect: async () => {\n await adapter.disconnect();\n },\n\n getBalance: async (options) => {\n return adapter.getBalance(options);\n },\n\n sendPayment: async (params: SendPaymentParams): Promise<SendPaymentResult> => {\n const res = await adapter.requestPayment({\n recipient: params.recipient,\n amount: params.amount,\n memo: params.memo,\n });\n return {\n txId: res.txId,\n submitted: res.submitted,\n };\n },\n};\n","import { ZcashWallet, WalletSession, SendPaymentParams, SendPaymentResult } from './types';\nimport { generateZip321Uri } from '../utils/zip321';\n\nexport const zashiWallet: ZcashWallet = {\n id: 'zashi',\n name: 'Zashi by ECC',\n icon: '🛡️',\n description: 'Official zero-knowledge mobile wallet by Electric Coin Co.',\n category: 'mobile',\n downloadUrl: 'https://electriccoin.co/zashi/',\n isAvailable: () => true, // Available via mobile QR or deep link\n\n connect: async (options): Promise<WalletSession> => {\n // In a mobile/QR context, user can connect by scanning or confirming their Unified Address\n return {\n connected: true,\n network: options?.network || 'mainnet',\n walletId: 'zashi',\n };\n },\n\n sendPayment: async (params: SendPaymentParams): Promise<SendPaymentResult> => {\n const rawUri = generateZip321Uri({\n address: params.recipient,\n amount: params.amount,\n memo: params.memo,\n message: params.message,\n });\n\n // Trigger protocol handler if on mobile or supported desktop\n if (typeof window !== 'undefined') {\n window.location.href = rawUri;\n }\n\n return {\n txId: '',\n submitted: false,\n rawUri,\n };\n },\n};\n","import { ZcashWallet, WalletSession, SendPaymentParams, SendPaymentResult } from './types';\nimport { generateZip321Uri } from '../utils/zip321';\n\nexport const ywallet: ZcashWallet = {\n id: 'ywallet',\n name: 'Ywallet',\n icon: '⚡',\n description: 'Fast-syncing multi-platform shielded wallet for mobile & desktop',\n category: 'mobile',\n downloadUrl: 'https://ywallet.app/',\n isAvailable: () => true,\n\n connect: async (options): Promise<WalletSession> => {\n return {\n connected: true,\n network: options?.network || 'mainnet',\n walletId: 'ywallet',\n };\n },\n\n sendPayment: async (params: SendPaymentParams): Promise<SendPaymentResult> => {\n const rawUri = generateZip321Uri({\n address: params.recipient,\n amount: params.amount,\n memo: params.memo,\n message: params.message,\n });\n\n if (typeof window !== 'undefined') {\n window.location.href = rawUri;\n }\n\n return {\n txId: '',\n submitted: false,\n rawUri,\n };\n },\n};\n","import { ZcashWallet, WalletSession } from './types';\n\nexport const viewingKeyWallet: ZcashWallet = {\n id: 'viewing-key',\n name: 'Viewing Key / Auditor',\n icon: '👁️',\n description: 'Connect with a Unified Address or Viewing Key for read-only audit mode',\n category: 'read-only',\n isAvailable: () => true,\n\n connect: async (options): Promise<WalletSession> => {\n return {\n connected: true,\n network: options?.network || 'mainnet',\n walletId: 'viewing-key',\n };\n },\n};\n","import { ZcashWallet, WalletSession, SendPaymentParams, SendPaymentResult } from './types';\n\n// Deterministic or random mock session address\nconst MOCK_BURNER_ADDR =\n 'u1qwe829xkps9482mzsll049281kz8471hzkas093847zkd09472619as8361048293710293847102938471029384710';\n\nexport const burnerWallet: ZcashWallet = {\n id: 'burner',\n name: 'Dev Session Wallet',\n icon: '🧪',\n description: 'Instant ephemeral shielded test wallet for rapid local testing',\n category: 'developer',\n isAvailable: () => true,\n\n connect: async (options): Promise<WalletSession> => {\n return {\n address: MOCK_BURNER_ADDR,\n connected: true,\n network: options?.network || 'testnet',\n walletId: 'burner',\n };\n },\n\n sendPayment: async (_params: SendPaymentParams): Promise<SendPaymentResult> => {\n const mockTxId = `0x${Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('')}`;\n\n return {\n txId: mockTxId,\n submitted: true,\n };\n },\n};\n","import { ZcashWallet } from './types';\nimport { zucchiniWallet } from './zucchini';\nimport { zashiWallet } from './zashi';\nimport { ywallet } from './ywallet';\nimport { viewingKeyWallet } from './viewingKey';\nimport { burnerWallet } from './burner';\n\nexport * from './types';\nexport { zucchiniWallet } from './zucchini';\nexport { zashiWallet } from './zashi';\nexport { ywallet } from './ywallet';\nexport { viewingKeyWallet } from './viewingKey';\nexport { burnerWallet } from './burner';\n\n/**\n * Returns the default suite of supported Zcash wallets.\n * Zucchini will be marked as available if the browser extension is detected.\n */\nexport function getDefaultWallets(): ZcashWallet[] {\n return [\n zucchiniWallet,\n zashiWallet,\n ywallet,\n viewingKeyWallet,\n burnerWallet,\n ];\n}\n","import { useState, useEffect, useCallback } from 'react';\n\ninterface ZcashPriceState {\n usdPrice: number | null;\n loading: boolean;\n error: string | null;\n lastUpdated: number | null;\n}\n\n// In-memory cache to share across component instances\nlet cachedPrice: number | null = null;\nlet lastFetchTime = 0;\nconst CACHE_DURATION_MS = 60000; // 1 minute\n\nexport function useZcashPrice(enabled = true) {\n const [state, setState] = useState<ZcashPriceState>(() => ({\n usdPrice: cachedPrice,\n loading: !cachedPrice && enabled,\n error: null,\n lastUpdated: lastFetchTime || null,\n }));\n\n useEffect(() => {\n if (!enabled) return;\n\n let isMounted = true;\n const now = Date.now();\n\n // Use cached value if fresh\n if (cachedPrice && now - lastFetchTime < CACHE_DURATION_MS) {\n setState((prev) => {\n if (prev.usdPrice === cachedPrice && !prev.loading) return prev;\n return {\n usdPrice: cachedPrice,\n loading: false,\n error: null,\n lastUpdated: lastFetchTime,\n };\n });\n return;\n }\n\n async function fetchPrice() {\n try {\n // Primary: CoinGecko public API\n const res = await fetch(\n 'https://api.coingecko.com/api/v3/simple/price?ids=zcash&vs_currencies=usd',\n { signal: AbortSignal.timeout(4000) }\n );\n\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = await res.json();\n const price = data?.zcash?.usd;\n\n if (typeof price === 'number') {\n cachedPrice = price;\n lastFetchTime = Date.now();\n if (isMounted) {\n setState({\n usdPrice: price,\n loading: false,\n error: null,\n lastUpdated: lastFetchTime,\n });\n }\n return;\n }\n throw new Error('Invalid price payload');\n } catch (err: unknown) {\n // Fallback: Binance public ticker\n try {\n const binanceRes = await fetch(\n 'https://api.binance.com/api/v3/ticker/price?symbol=ZECUSDT',\n { signal: AbortSignal.timeout(3000) }\n );\n if (binanceRes.ok) {\n const bData = await binanceRes.json();\n const bPrice = parseFloat(bData.price);\n if (!isNaN(bPrice) && bPrice > 0) {\n cachedPrice = bPrice;\n lastFetchTime = Date.now();\n if (isMounted) {\n setState({\n usdPrice: bPrice,\n loading: false,\n error: null,\n lastUpdated: lastFetchTime,\n });\n }\n return;\n }\n }\n } catch {\n // Both failed, use fallback baseline or keep existing\n }\n\n if (isMounted) {\n const fallback = cachedPrice ?? 38.5; // sensible baseline fallback\n setState({\n usdPrice: fallback,\n loading: false,\n error: err instanceof Error ? err.message : 'Price fetch error',\n lastUpdated: Date.now(),\n });\n }\n }\n }\n\n fetchPrice();\n\n return () => {\n isMounted = false;\n };\n }, [enabled]);\n\n const convertZecToUsd = useCallback(\n (zecAmount: number | string): string | null => {\n const num = typeof zecAmount === 'number' ? zecAmount : parseFloat(zecAmount);\n if (isNaN(num) || state.usdPrice === null) return null;\n return (num * state.usdPrice).toFixed(2);\n },\n [state.usdPrice]\n );\n\n return {\n ...state,\n convertZecToUsd,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n X,\n ExternalLink,\n Shield,\n Sparkles,\n AlertCircle,\n ArrowRight,\n} from 'lucide-react';\nimport { useCicero } from '../context/CiceroContext';\nimport { CiceroQRCode } from './CiceroQRCode';\nimport { ZucchiniWalletAdapter } from '../wallet/zucchini';\n\nexport interface CiceroConnectModalProps {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const CiceroConnectModal: React.FC<CiceroConnectModalProps> = ({\n isOpen: propIsOpen,\n onClose: propOnClose,\n}) => {\n const {\n isConnectModalOpen,\n closeConnectModal,\n wallets,\n connect,\n network,\n appName,\n } = useCicero();\n\n const isOpen = propIsOpen !== undefined ? propIsOpen : isConnectModalOpen;\n const handleClose = propOnClose || closeConnectModal;\n\n const [selectedWalletId, setSelectedWalletId] = useState<string>('zucchini');\n const [customKeyInput, setCustomKeyInput] = useState<string>('');\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [mounted, setMounted] = useState<boolean>(false);\n const [, setAvailabilityTick] = useState<number>(0);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Live detection of extension readiness (e.g. user unlocks wallet while modal is open)\n useEffect(() => {\n if (!isOpen) return;\n\n const cleanupReady = ZucchiniWalletAdapter.onReady(() => {\n setAvailabilityTick((t) => t + 1);\n });\n\n const interval = setInterval(() => {\n setAvailabilityTick((t) => t + 1);\n }, 600);\n\n return () => {\n cleanupReady();\n clearInterval(interval);\n };\n }, [isOpen]);\n\n // Escape key handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n handleClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleClose]);\n\n if (!isOpen || !mounted) return null;\n\n const selectedWallet = wallets.find((w) => w.id === selectedWalletId) || wallets[0];\n const isAvailable = selectedWallet?.isAvailable();\n\n const handleWalletSelect = (walletId: string) => {\n setSelectedWalletId(walletId);\n setError(null);\n };\n\n const handleConnectAction = async () => {\n if (!selectedWallet) return;\n setError(null);\n setIsSubmitting(true);\n\n try {\n if (selectedWallet.id === 'viewing-key') {\n if (!customKeyInput.trim()) {\n throw new Error('Please enter a valid Unified Address or Viewing Key.');\n }\n await connect(selectedWallet.id, customKeyInput.trim());\n } else {\n await connect(selectedWallet.id);\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Connection failed');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return createPortal(\n <div className=\"fixed inset-0 z-[99999] flex items-center justify-center p-4 sm:p-6 overflow-y-auto font-sans\">\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-[#171717]/60 backdrop-blur-sm transition-opacity z-[99999]\"\n onClick={handleClose}\n />\n\n {/* Modal Surface - Supabase design */}\n <div className=\"relative w-full max-w-2xl bg-white rounded-xl border border-[#ededed] shadow-2xl overflow-hidden z-[100000] text-[#171717] animate-in fade-in zoom-in-95 duration-150\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-[#ededed] bg-[#fafafa]\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"w-8 h-8 rounded-md bg-[#171717] flex items-center justify-center text-[#3ecf8e]\">\n <Shield className=\"w-4 h-4 fill-[#3ecf8e]\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-sm text-[#171717]\">Connect Zcash Wallet</span>\n <span className=\"text-[10px] uppercase tracking-wider font-semibold px-2 py-0.5 rounded-full bg-[#3ecf8e]/15 text-[#24b47e] border border-[#3ecf8e]/30\">\n {network}\n </span>\n </div>\n <p className=\"text-xs text-[#707070] mt-0.5\">\n Connect to <strong className=\"text-[#171717]\">{appName}</strong> with your preferred zero-knowledge wallet.\n </p>\n </div>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1 rounded-md text-[#707070] hover:text-[#171717] hover:bg-[#ededed] transition-colors\"\n aria-label=\"Close modal\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* 2-Column RainbowKit Layout */}\n <div className=\"grid grid-cols-1 md:grid-cols-12 min-h-[380px]\">\n {/* Left Column: Wallet Selector List (5 cols) */}\n <div className=\"md:col-span-5 p-3 bg-[#fafafa] border-r border-[#ededed] space-y-1\">\n <div className=\"px-3 py-2 text-[11px] font-mono uppercase tracking-wider text-[#707070]\">\n Available Wallets\n </div>\n\n {wallets.map((w) => {\n const active = w.id === selectedWalletId;\n const available = w.isAvailable();\n\n return (\n <button\n key={w.id}\n onClick={() => handleWalletSelect(w.id)}\n className={`w-full flex items-center justify-between p-3 rounded-lg text-left text-xs transition-all ${\n active\n ? 'bg-white shadow-sm border border-[#dfdfdf] text-[#171717] font-medium'\n : 'hover:bg-white/60 text-[#707070] hover:text-[#171717] border border-transparent'\n }`}\n >\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-base\">{w.icon}</span>\n <div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-sm text-[#171717] font-medium\">{w.name}</span>\n {w.id === 'zucchini' && available && (\n <span className=\"text-[9px] uppercase font-mono px-1.5 py-0.2 rounded bg-emerald-100 text-emerald-800 font-bold\">\n Detected\n </span>\n )}\n </div>\n <span className=\"text-[11px] text-[#9a9a9a] line-clamp-1\">\n {w.category === 'extension'\n ? 'Browser Extension'\n : w.category === 'mobile'\n ? 'Mobile / QR'\n : w.category === 'read-only'\n ? 'Auditor View'\n : 'Dev Session'}\n </span>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n\n {/* Right Column: Wallet Connection Screen (7 cols) */}\n <div className=\"md:col-span-7 p-6 flex flex-col justify-between bg-white\">\n <div className=\"space-y-4\">\n {/* Wallet Header */}\n <div className=\"flex items-start justify-between pb-4 border-b border-[#ededed]\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-2xl\">{selectedWallet.icon}</span>\n <div>\n <h4 className=\"text-base font-semibold text-[#171717]\">\n {selectedWallet.name}\n </h4>\n <p className=\"text-xs text-[#707070] mt-0.5\">\n {selectedWallet.description}\n </p>\n </div>\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"p-3 rounded-md bg-rose-50 border border-rose-200 text-rose-800 text-xs flex items-start gap-2\">\n <AlertCircle className=\"w-4 h-4 text-rose-600 flex-shrink-0 mt-0.5\" />\n <span>{error}</span>\n </div>\n )}\n\n {/* Specific Content by Wallet Type */}\n\n {/* 1. Zucchini Wallet (Browser Extension) */}\n {selectedWallet.id === 'zucchini' && (\n <div className=\"space-y-4 py-2\">\n {isAvailable ? (\n <div className=\"p-4 rounded-lg bg-emerald-50 border border-emerald-200 text-xs text-emerald-950 space-y-2\">\n <div className=\"flex items-center gap-2 font-semibold\">\n <Sparkles className=\"w-4 h-4 text-[#24b47e]\" />\n <span>Extension Detected & Ready</span>\n </div>\n <p className=\"text-emerald-800 leading-relaxed\">\n Clicking connect will prompt your Zucchini Wallet side-panel to authorize access.\n </p>\n </div>\n ) : (\n <div className=\"p-4 rounded-lg bg-[#fafafa] border border-[#ededed] text-xs text-[#707070] space-y-3\">\n <p>\n Zucchini Wallet extension was not detected in this browser. Install it to enable 1-click in-browser approvals.\n </p>\n {selectedWallet.downloadUrl && (\n <a\n href={selectedWallet.downloadUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-[#171717] text-white text-xs font-medium hover:bg-[#212121]\"\n >\n <span>Install from Chrome Web Store</span>\n <ExternalLink className=\"w-3.5 h-3.5\" />\n </a>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* 2. Mobile Wallets (Zashi or Ywallet via ZIP-321 QR) */}\n {(selectedWallet.id === 'zashi' || selectedWallet.id === 'ywallet') && (\n <div className=\"text-center space-y-3 py-1\">\n <div className=\"flex justify-center\">\n <CiceroQRCode\n value={`zcash:u1demo?message=Connect%20to%20${encodeURIComponent(appName || 'Cicero App')}`}\n size={150}\n />\n </div>\n <div>\n <p className=\"text-xs font-medium text-[#171717]\">\n Scan with {selectedWallet.name} app\n </p>\n <p className=\"text-[11px] text-[#707070] mt-0.5\">\n Open {selectedWallet.name} on iOS/Android and scan this QR code to authenticate.\n </p>\n </div>\n </div>\n )}\n\n {/* 3. Viewing Key / Auditor Mode */}\n {selectedWallet.id === 'viewing-key' && (\n <div className=\"space-y-3 py-2 text-xs\">\n <div>\n <label className=\"font-medium text-[#171717] block mb-1\">\n Unified Address or Viewing Key\n </label>\n <textarea\n rows={3}\n value={customKeyInput}\n onChange={(e) => setCustomKeyInput(e.target.value)}\n placeholder=\"Paste u1... address, zxviews... or uview... key\"\n className=\"w-full p-2.5 rounded-md bg-white border border-[#dfdfdf] font-mono text-xs text-[#171717] focus:outline-none focus:border-[#3ecf8e]\"\n />\n </div>\n <p className=\"text-[11px] text-[#707070]\">\n Read-only connection for tax calculation, accounting reconciliation, or proof-of-reserves.\n </p>\n </div>\n )}\n\n {/* 4. Burner / Dev Wallet */}\n {selectedWallet.id === 'burner' && (\n <div className=\"space-y-3 py-2 text-xs\">\n <div className=\"p-3.5 rounded-lg bg-[#fafafa] border border-[#ededed] space-y-1.5\">\n <span className=\"font-semibold text-[#171717]\">Ephemeral Shielded Test Wallet</span>\n <p className=\"text-[#707070] leading-relaxed\">\n Instantly creates an in-memory session wallet pre-funded with simulated testnet ZEC. Perfect for testing dApps without needing external extensions.\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Bottom Connect Action Button */}\n <div className=\"pt-4 border-t border-[#ededed] mt-4 flex items-center justify-between\">\n <span className=\"text-[11px] text-[#9a9a9a]\">\n End-to-End Encrypted\n </span>\n\n <button\n onClick={handleConnectAction}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 px-5 py-2.5 rounded-md bg-[#3ecf8e] text-[#171717] font-semibold text-xs hover:bg-[#24b47e] transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <>\n <span className=\"w-3.5 h-3.5 border-2 border-[#171717]/30 border-t-[#171717] rounded-full animate-spin\" />\n <span>Connecting...</span>\n </>\n ) : (\n <>\n <span>\n {selectedWallet.id === 'viewing-key'\n ? 'Connect Read-Only'\n : selectedWallet.id === 'burner'\n ? 'Launch Dev Session'\n : `Connect ${selectedWallet.name}`}\n </span>\n <ArrowRight className=\"w-3.5 h-3.5\" />\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n};\n","import React from 'react';\nimport { QRCodeSVG } from 'qrcode.react';\n\nexport interface CiceroQRCodeProps {\n value: string;\n size?: number;\n className?: string;\n level?: 'L' | 'M' | 'Q' | 'H';\n includeMargin?: boolean;\n}\n\nexport const CiceroQRCode: React.FC<CiceroQRCodeProps> = ({\n value,\n size = 200,\n className = '',\n level = 'M',\n includeMargin = true,\n}) => {\n return (\n <div\n className={`inline-flex items-center justify-center p-3 bg-white rounded-lg border border-[#ededed] shadow-sm ${className}`}\n >\n <QRCodeSVG\n value={value}\n size={size}\n level={level}\n includeMargin={includeMargin}\n imageSettings={{\n src: \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23171717'%3E%3Cpath d='M12 2L3 7v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5zm0 4.5l5 2.5v4.5c0 3.3-2.1 6.3-5 7.2-2.9-.9-5-3.9-5-7.2V9l5-2.5z'/%3E%3Cpath d='M10 11h4l-3 4h3' stroke='%233ecf8e' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\",\n height: 28,\n width: 28,\n excavate: true,\n }}\n />\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n X,\n Copy,\n Check,\n LogOut,\n ExternalLink,\n Shield,\n RefreshCw,\n QrCode,\n ArrowRightLeft,\n} from 'lucide-react';\nimport { useCicero } from '../context/CiceroContext';\nimport { truncateAddress } from '../utils/address';\nimport { CiceroQRCode } from './CiceroQRCode';\n\nexport interface CiceroAccountModalProps {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const CiceroAccountModal: React.FC<CiceroAccountModalProps> = ({\n isOpen: propIsOpen,\n onClose: propOnClose,\n}) => {\n const {\n isAccountModalOpen,\n closeAccountModal,\n address,\n wallet,\n network,\n switchNetwork,\n balance,\n refetchBalance,\n disconnect,\n } = useCicero();\n\n const isOpen = propIsOpen !== undefined ? propIsOpen : isAccountModalOpen;\n const handleClose = propOnClose || closeAccountModal;\n\n const [copied, setCopied] = useState(false);\n const [showQr, setShowQr] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Escape key handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n handleClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleClose]);\n\n if (!isOpen || !mounted) return null;\n\n const copyAddress = async () => {\n if (!address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // fallback\n }\n };\n\n return createPortal(\n <div className=\"fixed inset-0 z-[99999] flex items-center justify-center p-4 sm:p-6 overflow-y-auto font-sans\">\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-[#171717]/60 backdrop-blur-sm transition-opacity z-[99999]\"\n onClick={handleClose}\n />\n\n {/* Modal Surface */}\n <div className=\"relative w-full max-w-md bg-white rounded-xl border border-[#ededed] shadow-2xl overflow-hidden z-[100000] text-[#171717] animate-in fade-in zoom-in-95 duration-150\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-[#ededed] bg-[#fafafa]\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xl\">{wallet?.icon || '🛡️'}</span>\n <div>\n <span className=\"font-semibold text-sm text-[#171717]\">\n {wallet?.name || 'Zcash Wallet'}\n </span>\n <div className=\"flex items-center gap-1.5 text-[11px] text-[#707070]\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-[#24b47e]\"></span>\n <span>Connected</span>\n </div>\n </div>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1 rounded-md text-[#707070] hover:text-[#171717] hover:bg-[#ededed] transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Body */}\n <div className=\"p-6 space-y-5\">\n {/* Balance Display */}\n <div className=\"p-4 rounded-lg bg-[#fafafa] border border-[#ededed] text-center space-y-1\">\n <div className=\"flex items-center justify-center gap-1.5 text-xs text-[#707070]\">\n <span>Shielded Balance</span>\n <button\n onClick={() => refetchBalance()}\n className=\"hover:text-[#171717] p-0.5\"\n title=\"Refresh balance\"\n >\n <RefreshCw\n className={`w-3 h-3 ${balance.isLoading ? 'animate-spin text-[#3ecf8e]' : ''}`}\n />\n </button>\n </div>\n <div className=\"flex items-baseline justify-center gap-1.5\">\n <span className=\"text-3xl font-bold font-mono text-[#171717] tracking-tight\">\n {balance.zec}\n </span>\n <span className=\"text-sm font-medium text-[#707070]\">ZEC</span>\n </div>\n {balance.usd && (\n <p className=\"text-xs text-[#707070] font-mono\">≈ ${balance.usd} USD</p>\n )}\n </div>\n\n {/* Connected Address Card */}\n <div className=\"space-y-2 text-xs\">\n <div className=\"flex items-center justify-between text-[#707070]\">\n <span>Your Shielded Address</span>\n <button\n onClick={() => setShowQr(!showQr)}\n className=\"flex items-center gap-1 text-[#24b47e] hover:underline\"\n >\n <QrCode className=\"w-3.5 h-3.5\" />\n <span>{showQr ? 'Hide QR' : 'Show QR'}</span>\n </button>\n </div>\n\n {address ? (\n <div className=\"p-3 bg-[#fafafa] rounded-md border border-[#ededed] font-mono text-xs text-[#171717] break-all select-all flex items-center justify-between gap-2\">\n <span className=\"truncate\">{truncateAddress(address, 16, 12)}</span>\n <button\n onClick={copyAddress}\n className=\"p-1 rounded hover:bg-white text-[#707070] hover:text-[#171717] transition-colors flex-shrink-0\"\n title=\"Copy full address\"\n >\n {copied ? (\n <Check className=\"w-3.5 h-3.5 text-[#24b47e]\" />\n ) : (\n <Copy className=\"w-3.5 h-3.5\" />\n )}\n </button>\n </div>\n ) : (\n <div className=\"p-3 bg-[#fafafa] rounded-md border border-[#ededed] text-xs text-[#707070]\">\n Connected in Read-Only Mode\n </div>\n )}\n\n {/* Expandable Receive QR */}\n {showQr && address && (\n <div className=\"pt-2 flex justify-center\">\n <CiceroQRCode value={`zcash:${address}`} size={160} />\n </div>\n )}\n\n {/* Shielded badge & Explorer link */}\n {address && (\n <div className=\"flex items-center justify-between text-[11px] pt-1\">\n <span className=\"flex items-center gap-1 text-[#707070]\">\n <Shield className=\"w-3 h-3 text-[#3ecf8e]\" />\n <span>zk-Shielded Address</span>\n </span>\n <a\n href={\n network === 'testnet'\n ? `https://blockexplorer.one/zcash/testnet/address/${address}`\n : `https://blockchair.com/zcash/address/${address}`\n }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-[#24b47e] hover:underline\"\n >\n <span>View on Explorer</span>\n <ExternalLink className=\"w-3 h-3\" />\n </a>\n </div>\n )}\n </div>\n\n {/* Network Switcher Row */}\n <div className=\"flex items-center justify-between p-3 rounded-lg border border-[#ededed] bg-white text-xs\">\n <div className=\"flex items-center gap-2\">\n <ArrowRightLeft className=\"w-4 h-4 text-[#707070]\" />\n <span className=\"text-[#171717] font-medium\">Network</span>\n </div>\n <div className=\"flex items-center gap-1 p-0.5 rounded bg-[#fafafa] border border-[#dfdfdf]\">\n <button\n onClick={() => switchNetwork('mainnet')}\n className={`px-2 py-1 rounded text-[11px] font-medium transition-colors ${\n network === 'mainnet'\n ? 'bg-white shadow-sm text-[#24b47e] font-semibold'\n : 'text-[#707070]'\n }`}\n >\n Mainnet\n </button>\n <button\n onClick={() => switchNetwork('testnet')}\n className={`px-2 py-1 rounded text-[11px] font-medium transition-colors ${\n network === 'testnet'\n ? 'bg-white shadow-sm text-amber-700 font-semibold'\n : 'text-[#707070]'\n }`}\n >\n Testnet\n </button>\n </div>\n </div>\n </div>\n\n {/* Footer with Disconnect */}\n <div className=\"px-6 py-3.5 bg-[#fafafa] border-t border-[#ededed] flex items-center justify-between\">\n <button\n onClick={disconnect}\n className=\"flex items-center gap-1.5 text-xs text-rose-600 hover:text-rose-700 font-medium transition-colors\"\n >\n <LogOut className=\"w-3.5 h-3.5\" />\n <span>Disconnect Wallet</span>\n </button>\n\n <button\n onClick={handleClose}\n className=\"px-3.5 py-1.5 rounded-md border border-[#dfdfdf] bg-white hover:bg-[#fafafa] text-xs font-medium text-[#171717] transition-colors\"\n >\n Done\n </button>\n </div>\n </div>\n </div>,\n document.body\n );\n};\n","import { ZcashAddressType } from '../types';\n\n/**\n * Detects the type of a Zcash address.\n */\nexport function getAddressType(address: string): ZcashAddressType {\n if (!address || typeof address !== 'string') {\n return 'unknown';\n }\n\n const clean = address.trim();\n\n // Unified Address (ZIP-316)\n if (clean.startsWith('u1') || clean.startsWith('utest1')) {\n return 'unified';\n }\n\n // Sapling Shielded Address\n if (clean.startsWith('zs1') || clean.startsWith('ztestsapling1')) {\n return 'sapling';\n }\n\n // Transparent Address\n if (clean.startsWith('t1') || clean.startsWith('t3') || clean.startsWith('tm')) {\n return 'transparent';\n }\n\n return 'unknown';\n}\n\n/**\n * Checks whether an address supports zero-knowledge shielded encryption (Unified or Sapling).\n */\nexport function isShieldedAddress(address: string): boolean {\n const type = getAddressType(address);\n return type === 'unified' || type === 'sapling';\n}\n\n/**\n * Truncates a long address for display purposes.\n * e.g., u1abcdef...987654\n */\nexport function truncateAddress(address: string, start = 8, end = 8): string {\n if (!address) return '';\n const clean = address.trim();\n if (clean.length <= start + end + 3) {\n return clean;\n }\n return `${clean.slice(0, start)}...${clean.slice(-end)}`;\n}\n\n/**\n * Validates whether the address supports encrypted memos.\n * Memos in Zcash are strictly for shielded receivers (Sapling & Orchard).\n * Transparent addresses do not support on-chain encrypted memos.\n */\nexport function validateMemoSupport(address: string, memo?: string): {\n valid: boolean;\n warning?: string;\n byteLength: number;\n} {\n const byteLength = memo ? new TextEncoder().encode(memo).length : 0;\n const isAddressShielded = isShieldedAddress(address);\n\n if (byteLength > 512) {\n return {\n valid: false,\n warning: `Memo exceeds Zcash protocol limit of 512 bytes (current: ${byteLength} bytes).`,\n byteLength,\n };\n }\n\n if (memo && !isAddressShielded) {\n return {\n valid: true,\n warning: 'Warning: Transparent addresses (t-addr) do not support shielded encrypted memos. Use a Unified (u1) or Sapling (zs1) address to protect your memo.',\n byteLength,\n };\n }\n\n return {\n valid: true,\n byteLength,\n };\n}\n","import React from 'react';\nimport { Shield, ChevronDown } from 'lucide-react';\nimport { useCicero } from '../context/CiceroContext';\nimport { truncateAddress } from '../utils/address';\n\nexport interface CiceroConnectButtonProps {\n label?: string;\n variant?: 'primary' | 'outline' | 'dark';\n size?: 'sm' | 'md' | 'lg';\n showBalance?: boolean;\n showNetwork?: boolean;\n className?: string;\n}\n\nexport const CiceroConnectButton: React.FC<CiceroConnectButtonProps> = ({\n label = 'Connect Zcash Wallet',\n variant = 'primary',\n size = 'md',\n showBalance = true,\n showNetwork = true,\n className = '',\n}) => {\n const {\n account,\n address,\n isConnected,\n isConnecting,\n network,\n balance,\n openConnectModal,\n openAccountModal,\n } = useCicero();\n\n const sizeClasses = {\n sm: 'text-xs px-2.5 py-1.5 gap-1.5',\n md: 'text-sm px-3.5 py-2 gap-2',\n lg: 'text-base px-4.5 py-2.5 gap-2.5',\n }[size];\n\n const variantClasses = {\n primary:\n 'bg-[#3ecf8e] text-[#171717] hover:bg-[#24b47e] font-semibold shadow-sm',\n outline:\n 'bg-white text-[#171717] border border-[#dfdfdf] hover:border-[#c7c7c7] hover:bg-[#fafafa] font-medium shadow-sm',\n dark:\n 'bg-[#1c1c1c] text-white hover:bg-[#242424] font-medium shadow-sm',\n }[variant];\n\n return (\n <>\n {!isConnected ? (\n <button\n type=\"button\"\n onClick={openConnectModal}\n disabled={isConnecting}\n className={`inline-flex items-center justify-center rounded-[6px] transition-all select-none ${sizeClasses} ${variantClasses} ${className}`}\n >\n <Shield\n className={`flex-shrink-0 ${\n size === 'sm' ? 'w-3.5 h-3.5' : size === 'lg' ? 'w-5 h-5' : 'w-4 h-4'\n } ${variant === 'primary' ? 'fill-[#171717]/20' : 'text-[#3ecf8e]'}`}\n />\n <span>{isConnecting ? 'Connecting...' : label}</span>\n </button>\n ) : (\n /* Connected State Pill (RainbowKit style) */\n <div className={`inline-flex items-center rounded-[6px] border border-[#dfdfdf] bg-white p-0.5 shadow-sm text-xs ${className}`}>\n {/* Network tag */}\n {showNetwork && (\n <div className=\"flex items-center gap-1.5 px-2.5 py-1 text-[11px] font-medium text-[#707070] border-r border-[#ededed]\">\n <span\n className={`w-2 h-2 rounded-full ${\n network === 'mainnet' ? 'bg-[#3ecf8e]' : 'bg-amber-400'\n }`}\n />\n <span className=\"capitalize\">{network}</span>\n </div>\n )}\n\n {/* Balance */}\n {showBalance && (\n <div className=\"px-2.5 py-1 font-mono font-medium text-[#171717] border-r border-[#ededed]\">\n <span>{balance.zec}</span> <span className=\"text-[#707070] font-normal\">ZEC</span>\n </div>\n )}\n\n {/* Account Pill button */}\n <button\n type=\"button\"\n onClick={openAccountModal}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-[4px] hover:bg-[#fafafa] text-[#171717] font-medium transition-colors\"\n >\n <span className=\"text-sm\">{account.wallet?.icon || '🛡️'}</span>\n <span className=\"font-mono text-[11px]\">\n {address ? truncateAddress(address, 6, 4) : 'Connected'}\n </span>\n <ChevronDown className=\"w-3 h-3 text-[#707070]\" />\n </button>\n </div>\n )}\n </>\n );\n};\n","import React from 'react';\nimport { Shield } from 'lucide-react';\nimport { CiceroPayProps } from '../types';\nimport { useCiceroPayment } from '../hooks/useCiceroPayment';\nimport { CiceroModal } from './CiceroModal';\n\nexport const CiceroPayButton: React.FC<CiceroPayProps> = ({\n recipient,\n amount,\n memo,\n message,\n label = 'Pay with Zcash',\n network = 'mainnet',\n variant = 'primary',\n size = 'md',\n showUsd = true,\n modalTitle,\n modalSubtitle,\n expiresInSeconds = 900,\n customRpcUrl,\n invoiceId,\n onSuccess,\n onError,\n onStatusChange,\n className = '',\n disabled = false,\n}) => {\n const {\n status,\n txId,\n secondsRemaining,\n isModalOpen,\n openModal,\n closeModal,\n resetPayment,\n zip321Uri,\n addressType,\n isShielded,\n memoValidation,\n simulateDetection,\n zucchiniAvailable,\n zucchiniPaying,\n payWithZucchini,\n } = useCiceroPayment({\n recipient,\n amount,\n memo,\n message,\n network,\n expiresInSeconds,\n invoiceId,\n customRpcUrl,\n onSuccess,\n onError,\n onStatusChange,\n });\n\n // Supabase styling tokens\n const sizeClasses = {\n sm: 'text-xs px-3 py-1.5 gap-1.5',\n md: 'text-sm px-4 py-2 gap-2',\n lg: 'text-base px-5 py-2.5 gap-2.5',\n }[size];\n\n const variantClasses = {\n // Signature Supabase emerald CTA: #3ecf8e background, #171717 text, 6px radius\n primary:\n 'bg-[#3ecf8e] text-[#171717] hover:bg-[#24b47e] active:bg-[#24b47e] shadow-sm font-medium',\n // Secondary outline on white\n outline:\n 'bg-white text-[#171717] border border-[#dfdfdf] hover:border-[#c7c7c7] hover:bg-[#fafafa] font-medium shadow-sm',\n // Dark canvas-night\n dark:\n 'bg-[#1c1c1c] text-white hover:bg-[#242424] font-medium shadow-sm',\n }[variant];\n\n return (\n <>\n <button\n type=\"button\"\n onClick={openModal}\n disabled={disabled}\n className={`inline-flex items-center justify-center rounded-[6px] transition-all duration-150 select-none disabled:opacity-50 disabled:cursor-not-allowed ${sizeClasses} ${variantClasses} ${className}`}\n >\n <Shield\n className={`flex-shrink-0 ${\n size === 'sm' ? 'w-3.5 h-3.5' : size === 'lg' ? 'w-5 h-5' : 'w-4 h-4'\n } ${variant === 'primary' ? 'fill-[#171717]/20' : 'text-[#3ecf8e]'}`}\n />\n <span>{label}</span>\n </button>\n\n <CiceroModal\n isOpen={isModalOpen}\n onClose={closeModal}\n recipient={recipient}\n amount={amount}\n memo={memo}\n message={message}\n network={network}\n status={status}\n txId={txId}\n secondsRemaining={secondsRemaining}\n zip321Uri={zip321Uri}\n addressType={addressType}\n isShielded={isShielded}\n memoValidation={memoValidation}\n onSimulateDetection={simulateDetection}\n onResetPayment={resetPayment}\n title={modalTitle}\n subtitle={modalSubtitle}\n showUsd={showUsd}\n zucchiniAvailable={zucchiniAvailable}\n zucchiniPaying={zucchiniPaying}\n onPayWithZucchini={payWithZucchini}\n />\n </>\n );\n};\n","import { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { PaymentStatus, ZcashNetwork } from '../types';\nimport { generateZip321Uri, getWalletDeepLinks } from '../utils/zip321';\nimport { getAddressType, isShieldedAddress, validateMemoSupport } from '../utils/address';\nimport { ZucchiniWalletAdapter } from '../wallet/zucchini';\n\nexport interface UseCiceroPaymentOptions {\n recipient: string;\n amount: number | string;\n memo?: string;\n message?: string;\n network?: ZcashNetwork;\n expiresInSeconds?: number;\n invoiceId?: string;\n customRpcUrl?: string;\n onSuccess?: (tx: { txId: string; amount: number; memo?: string }) => void;\n onError?: (error: Error) => void;\n onStatusChange?: (status: PaymentStatus) => void;\n}\n\nexport function useCiceroPayment({\n recipient,\n amount,\n memo,\n message,\n network = 'mainnet',\n expiresInSeconds = 900, // 15 mins\n invoiceId,\n customRpcUrl,\n onSuccess,\n onError,\n onStatusChange,\n}: UseCiceroPaymentOptions) {\n // Callback refs to prevent infinite re-render loops from inline handler props\n const onSuccessRef = useRef(onSuccess);\n onSuccessRef.current = onSuccess;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onStatusChangeRef = useRef(onStatusChange);\n onStatusChangeRef.current = onStatusChange;\n\n const [status, setStatus] = useState<PaymentStatus>('pending');\n const [txId, setTxId] = useState<string | null>(null);\n const [secondsRemaining, setSecondsRemaining] = useState<number>(expiresInSeconds);\n const [isModalOpen, setIsModalOpen] = useState<boolean>(false);\n\n // Zucchini Wallet detection\n const [zucchiniAvailable, setZucchiniAvailable] = useState(false);\n const [zucchiniAdapter] = useState(() => new ZucchiniWalletAdapter());\n const [zucchiniPaying, setZucchiniPaying] = useState(false);\n\n useEffect(() => {\n // Check after mount (window must be available)\n setZucchiniAvailable(ZucchiniWalletAdapter.isAvailable());\n }, []);\n\n // Address inspection\n const addressType = useMemo(() => getAddressType(recipient), [recipient]);\n const isShielded = useMemo(() => isShieldedAddress(recipient), [recipient]);\n const memoValidation = useMemo(\n () => validateMemoSupport(recipient, memo),\n [recipient, memo]\n );\n\n const lastWarningRef = useRef<string | null>(null);\n useEffect(() => {\n if (!memoValidation.valid && memoValidation.warning) {\n if (lastWarningRef.current !== memoValidation.warning) {\n lastWarningRef.current = memoValidation.warning;\n onErrorRef.current?.(new Error(memoValidation.warning));\n }\n } else {\n lastWarningRef.current = null;\n }\n }, [memoValidation.valid, memoValidation.warning]);\n\n // ZIP-321 URI & Deep links\n const zip321Uri = useMemo(() => {\n return generateZip321Uri({\n address: recipient,\n amount,\n memo,\n message,\n });\n }, [recipient, amount, memo, message]);\n\n const deepLinks = useMemo(() => getWalletDeepLinks(zip321Uri), [zip321Uri]);\n\n // Stable update status and fire callback\n const updateStatus = useCallback((newStatus: PaymentStatus) => {\n setStatus(newStatus);\n onStatusChangeRef.current?.(newStatus);\n }, []);\n\n // Expiration countdown\n useEffect(() => {\n if (status !== 'pending') return;\n\n const timer = setInterval(() => {\n setSecondsRemaining((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n updateStatus('expired');\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [status, updateStatus]);\n\n // Reset payment state\n const resetPayment = useCallback(() => {\n setStatus('pending');\n setTxId(null);\n setSecondsRemaining(expiresInSeconds);\n setZucchiniPaying(false);\n }, [expiresInSeconds]);\n\n // Open & Close modal\n const openModal = useCallback(() => {\n resetPayment();\n setIsModalOpen(true);\n }, [resetPayment]);\n\n const closeModal = useCallback(() => {\n setIsModalOpen(false);\n }, []);\n\n // ─── Zucchini Wallet: Pay directly via browser extension ───\n const payWithZucchini = useCallback(async () => {\n setZucchiniPaying(true);\n try {\n // Connect (prompts user in extension side-panel)\n await zucchiniAdapter.connect();\n\n // Request payment (opens send-review screen)\n const numAmount = typeof amount === 'number' ? amount : parseFloat(amount);\n const result = await zucchiniAdapter.requestPayment({\n recipient,\n amount: numAmount,\n memo,\n });\n\n // Mark as detected then confirmed\n updateStatus('detected');\n setTxId(result.txId);\n\n // Brief delay to show the \"detected\" animation, then confirm\n setTimeout(() => {\n updateStatus('confirmed');\n onSuccessRef.current?.({\n txId: result.txId,\n amount: isNaN(numAmount) ? 0 : numAmount,\n memo,\n });\n setZucchiniPaying(false);\n }, 1500);\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error('Zucchini payment failed');\n onErrorRef.current?.(error);\n setZucchiniPaying(false);\n }\n }, [recipient, amount, memo, zucchiniAdapter, updateStatus]);\n\n // Demo simulator functions (allows judges and developers to test the payment flow)\n const simulateDetection = useCallback(() => {\n updateStatus('detected');\n setTimeout(() => {\n const mockTxId = `0x${Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('')}`;\n setTxId(mockTxId);\n updateStatus('confirmed');\n const numAmount = typeof amount === 'number' ? amount : parseFloat(amount);\n onSuccessRef.current?.({\n txId: mockTxId,\n amount: isNaN(numAmount) ? 0 : numAmount,\n memo,\n });\n }, 2000);\n }, [amount, memo, updateStatus]);\n\n return {\n status,\n txId,\n secondsRemaining,\n isModalOpen,\n openModal,\n closeModal,\n resetPayment,\n zip321Uri,\n deepLinks,\n addressType,\n isShielded,\n memoValidation,\n simulateDetection,\n invoiceId,\n network,\n customRpcUrl,\n // Zucchini Wallet\n zucchiniAvailable,\n zucchiniPaying,\n payWithZucchini,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n Shield,\n Copy,\n Check,\n ExternalLink,\n Clock,\n CheckCircle2,\n AlertCircle,\n X,\n Lock,\n Sparkles,\n Zap,\n} from 'lucide-react';\nimport { CiceroQRCode } from './CiceroQRCode';\nimport { PaymentStatus, ZcashNetwork } from '../types';\nimport { truncateAddress } from '../utils/address';\nimport { useZcashPrice } from '../hooks/useZcashPrice';\n\nexport interface CiceroModalProps {\n isOpen: boolean;\n onClose: () => void;\n recipient: string;\n amount: number | string;\n memo?: string;\n message?: string;\n network?: ZcashNetwork;\n status: PaymentStatus;\n txId: string | null;\n secondsRemaining: number;\n zip321Uri: string;\n addressType: string;\n isShielded: boolean;\n memoValidation: { valid: boolean; warning?: string; byteLength: number };\n onSimulateDetection?: () => void;\n onResetPayment?: () => void;\n title?: string;\n subtitle?: string;\n showUsd?: boolean;\n /** Zucchini Wallet integration */\n zucchiniAvailable?: boolean;\n zucchiniPaying?: boolean;\n onPayWithZucchini?: () => void;\n}\n\nexport const CiceroModal: React.FC<CiceroModalProps> = ({\n isOpen,\n onClose,\n recipient,\n amount,\n memo,\n message,\n network = 'mainnet',\n status,\n txId,\n secondsRemaining,\n zip321Uri,\n addressType,\n isShielded,\n memoValidation,\n onSimulateDetection,\n onResetPayment,\n title = 'Pay with Shielded Zcash',\n subtitle = 'Zero-Knowledge, Confidential Checkout',\n showUsd = true,\n zucchiniAvailable = false,\n zucchiniPaying = false,\n onPayWithZucchini,\n}) => {\n const [copiedType, setCopiedType] = useState<'address' | 'uri' | 'memo' | null>(null);\n const { convertZecToUsd } = useZcashPrice(showUsd);\n\n // Close on Escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!isOpen || !mounted) return null;\n\n const copyToClipboard = async (text: string, type: 'address' | 'uri' | 'memo') => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedType(type);\n setTimeout(() => setCopiedType(null), 2000);\n } catch {\n // fallback\n }\n };\n\n const formatTime = (secs: number) => {\n const m = Math.floor(secs / 60);\n const s = secs % 60;\n return `${m}:${s < 10 ? '0' : ''}${s}`;\n };\n\n const usdValue = convertZecToUsd(amount);\n\n return createPortal(\n <div className=\"fixed inset-0 z-[99999] flex items-center justify-center p-4 sm:p-6 overflow-y-auto\">\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-[#171717]/60 backdrop-blur-sm transition-opacity z-[99999]\"\n onClick={onClose}\n />\n\n {/* Modal Surface - Supabase clean canvas */}\n <div className=\"relative w-full max-w-lg bg-white rounded-xl border border-[#ededed] shadow-2xl overflow-hidden z-[100000] text-[#171717] font-sans animate-in fade-in zoom-in-95 duration-150\">\n {/* Top Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-[#ededed] bg-[#fafafa]\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"w-8 h-8 rounded-md bg-[#171717] flex items-center justify-center text-[#3ecf8e]\">\n <Shield className=\"w-4 h-4 fill-[#3ecf8e]\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-sm text-[#171717]\">{title}</span>\n <span className=\"text-[10px] uppercase tracking-wider font-semibold px-2 py-0.5 rounded-full bg-[#3ecf8e]/15 text-[#24b47e] border border-[#3ecf8e]/30\">\n {isShielded ? 'zk-Shielded' : 'Transparent'}\n </span>\n {network === 'testnet' && (\n <span className=\"text-[10px] uppercase tracking-wider font-semibold px-2 py-0.5 rounded-full bg-amber-100 text-amber-800 border border-amber-200\">\n Testnet\n </span>\n )}\n </div>\n <p className=\"text-xs text-[#707070] mt-0.5\">{subtitle}</p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 rounded-md text-[#707070] hover:text-[#171717] hover:bg-[#ededed] transition-colors\"\n aria-label=\"Close modal\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Status Banner */}\n <div className=\"px-6 py-2.5 bg-white border-b border-[#ededed] flex items-center justify-between text-xs\">\n <div className=\"flex items-center gap-2\">\n {status === 'pending' && (\n <>\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-[#3ecf8e] opacity-75\"></span>\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-[#24b47e]\"></span>\n </span>\n <span className=\"text-[#707070]\">Listening for transaction...</span>\n </>\n )}\n {status === 'detected' && (\n <>\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-amber-400 opacity-75\"></span>\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-amber-500\"></span>\n </span>\n <span className=\"text-amber-800 font-medium\">Transaction spotted in mempool! Confirming...</span>\n </>\n )}\n {status === 'confirmed' && (\n <>\n <CheckCircle2 className=\"w-4 h-4 text-[#24b47e]\" />\n <span className=\"text-[#24b47e] font-medium\">Payment Confirmed On-Chain!</span>\n </>\n )}\n {status === 'expired' && (\n <>\n <AlertCircle className=\"w-4 h-4 text-rose-500\" />\n <span className=\"text-rose-600 font-medium\">Payment window expired</span>\n </>\n )}\n </div>\n\n {status === 'pending' && (\n <div className=\"flex items-center gap-1 text-[#707070] font-mono text-[11px]\">\n <Clock className=\"w-3 h-3\" />\n <span>{formatTime(secondsRemaining)}</span>\n </div>\n )}\n </div>\n\n {/* Modal Body */}\n <div className=\"p-6 space-y-5\">\n {/* Confirmed State View */}\n {status === 'confirmed' ? (\n <div className=\"py-6 text-center space-y-4\">\n <div className=\"w-16 h-16 mx-auto rounded-full bg-[#3ecf8e]/15 border border-[#3ecf8e]/40 flex items-center justify-center text-[#24b47e] animate-bounce\">\n <CheckCircle2 className=\"w-8 h-8\" />\n </div>\n <div>\n <h3 className=\"text-lg font-medium text-[#171717]\">Payment Received & Shielded!</h3>\n <p className=\"text-xs text-[#707070] max-w-sm mx-auto mt-1\">\n Your transaction has been verified using zero-knowledge proofs. No sender or recipient address was leaked.\n </p>\n </div>\n\n {txId && (\n <div className=\"p-3 bg-[#fafafa] rounded-md border border-[#ededed] text-left\">\n <div className=\"flex items-center justify-between text-[11px] text-[#707070] mb-1\">\n <span>Transaction Hash</span>\n <span className=\"text-[#24b47e] font-mono\">Shielded Note</span>\n </div>\n <div className=\"font-mono text-xs text-[#171717] break-all\">\n {txId}\n </div>\n </div>\n )}\n\n <button\n onClick={onClose}\n className=\"w-full py-2.5 px-4 rounded-md bg-[#3ecf8e] text-[#171717] font-medium text-sm hover:bg-[#24b47e] transition-colors\"\n >\n Close & Return\n </button>\n </div>\n ) : (\n <>\n {/* Payment Amount Card */}\n <div className=\"flex items-center justify-between p-4 bg-[#fafafa] rounded-lg border border-[#ededed]\">\n <div>\n <span className=\"text-xs text-[#707070] uppercase font-mono tracking-wider\">Total Amount</span>\n <div className=\"flex items-baseline gap-2 mt-0.5\">\n <span className=\"text-2xl font-semibold tracking-tight text-[#171717] font-mono\">\n {amount} <span className=\"text-sm font-normal text-[#707070]\">ZEC</span>\n </span>\n {usdValue && (\n <span className=\"text-xs text-[#707070] font-mono\">\n ≈ ${usdValue} USD\n </span>\n )}\n </div>\n </div>\n\n <div className=\"text-right\">\n <span className=\"text-[11px] text-[#707070] block font-mono\">Address Standard</span>\n <span className=\"inline-block mt-0.5 px-2 py-0.5 text-xs font-mono font-medium rounded bg-white border border-[#dfdfdf] text-[#171717]\">\n {addressType === 'unified' ? 'Unified (ZIP-316)' : addressType === 'sapling' ? 'Sapling (Shielded)' : 'Transparent'}\n </span>\n </div>\n </div>\n\n {/* Optional Order / Invoice Message */}\n {message && (\n <div className=\"px-3.5 py-2 bg-[#fafafa] rounded-md border border-[#ededed] text-xs text-[#707070]\">\n <span className=\"font-medium text-[#171717]\">Order Note: </span>\n <span>{message}</span>\n </div>\n )}\n\n {/* QR Code & Mobile Deep Link */}\n <div className=\"flex flex-col sm:flex-row items-center gap-5 p-4 rounded-lg border border-[#ededed] bg-white\">\n <div className=\"flex-shrink-0\">\n <CiceroQRCode value={zip321Uri} size={150} />\n </div>\n\n <div className=\"space-y-3 w-full text-center sm:text-left\">\n <div>\n <h4 className=\"text-sm font-medium text-[#171717] flex items-center justify-center sm:justify-start gap-1.5\">\n <span>Scan with Shielded Wallet</span>\n <Sparkles className=\"w-3.5 h-3.5 text-[#3ecf8e]\" />\n </h4>\n <p className=\"text-xs text-[#707070] mt-0.5 leading-relaxed\">\n Compatible with <strong className=\"text-[#171717]\">Zashi</strong>, <strong className=\"text-[#171717]\">Ywallet</strong>, or any ZIP-321 compliant Zcash wallet.\n </p>\n </div>\n\n {/* Deep link button */}\n <a\n href={zip321Uri}\n className=\"inline-flex items-center justify-center gap-1.5 w-full py-2 px-3 rounded-md bg-[#171717] text-white text-xs font-medium hover:bg-[#212121] transition-colors\"\n >\n <span>Open in Mobile / Desktop Wallet</span>\n <ExternalLink className=\"w-3.5 h-3.5 text-[#3ecf8e]\" />\n </a>\n\n {/* Zucchini Wallet — Browser Extension Pay */}\n {zucchiniAvailable && onPayWithZucchini && (\n <button\n onClick={onPayWithZucchini}\n disabled={zucchiniPaying}\n className=\"inline-flex items-center justify-center gap-2 w-full py-2.5 px-3 rounded-md bg-[#3ecf8e] text-[#171717] text-xs font-semibold hover:bg-[#24b47e] transition-colors disabled:opacity-60 disabled:cursor-wait shadow-sm\"\n >\n {zucchiniPaying ? (\n <>\n <span className=\"w-3.5 h-3.5 border-2 border-[#171717]/30 border-t-[#171717] rounded-full animate-spin\" />\n <span>Confirming in Zucchini...</span>\n </>\n ) : (\n <>\n <span className=\"text-sm\">🥒</span>\n <span>Pay with Zucchini Wallet</span>\n </>\n )}\n </button>\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => copyToClipboard(zip321Uri, 'uri')}\n className=\"flex-1 py-1.5 px-2.5 rounded-md border border-[#ededed] hover:border-[#dfdfdf] hover:bg-[#fafafa] text-xs font-medium text-[#171717] transition-colors flex items-center justify-center gap-1\"\n >\n {copiedType === 'uri' ? (\n <>\n <Check className=\"w-3 h-3 text-[#24b47e]\" />\n <span className=\"text-[#24b47e]\">Copied URI</span>\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3 text-[#707070]\" />\n <span>Copy ZIP-321 URI</span>\n </>\n )}\n </button>\n <button\n onClick={() => copyToClipboard(recipient, 'address')}\n className=\"flex-1 py-1.5 px-2.5 rounded-md border border-[#ededed] hover:border-[#dfdfdf] hover:bg-[#fafafa] text-xs font-medium text-[#171717] transition-colors flex items-center justify-center gap-1\"\n >\n {copiedType === 'address' ? (\n <>\n <Check className=\"w-3 h-3 text-[#24b47e]\" />\n <span className=\"text-[#24b47e]\">Copied Address</span>\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3 text-[#707070]\" />\n <span>Copy Address</span>\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* Recipient Address Details */}\n <div className=\"space-y-1.5 text-xs\">\n <div className=\"flex items-center justify-between text-[#707070]\">\n <span>Recipient Address</span>\n <span className=\"font-mono text-[11px]\">{truncateAddress(recipient, 12, 10)}</span>\n </div>\n <div className=\"p-2 bg-[#fafafa] rounded-md border border-[#ededed] font-mono text-[11px] text-[#171717] break-all select-all\">\n {recipient}\n </div>\n </div>\n\n {/* Encrypted Memo Section (if present) */}\n {memo && (\n <div className=\"space-y-1.5 text-xs p-3 rounded-md bg-[#fafafa] border border-[#ededed]\">\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 font-medium text-[#171717]\">\n <Lock className=\"w-3 h-3 text-[#3ecf8e]\" />\n <span>Encrypted Memo</span>\n </span>\n <span className=\"text-[10px] font-mono text-[#707070]\">\n {memoValidation.byteLength}/512 bytes\n </span>\n </div>\n <p className=\"font-mono text-xs text-[#171717] bg-white p-2 rounded border border-[#dfdfdf]\">\n {memo}\n </p>\n <p className=\"text-[11px] text-[#707070]\">\n Only the recipient holding the viewing/spending key can decrypt this message on-chain.\n </p>\n </div>\n )}\n\n {/* Warning if transparent with memo */}\n {memoValidation.warning && (\n <div className=\"p-2.5 rounded-md bg-amber-50 border border-amber-200 text-amber-800 text-xs flex items-start gap-2\">\n <AlertCircle className=\"w-4 h-4 flex-shrink-0 mt-0.5 text-amber-600\" />\n <span>{memoValidation.warning}</span>\n </div>\n )}\n\n {/* Hackathon Developer Testing Tool Bar */}\n <div className=\"pt-2 border-t border-[#ededed] flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5 text-[11px] text-[#707070]\">\n <Zap className=\"w-3 h-3 text-[#3ecf8e]\" />\n <span>Demo Controls:</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onSimulateDetection}\n className=\"px-2.5 py-1 text-[11px] font-medium rounded border border-[#dfdfdf] hover:border-[#3ecf8e] hover:text-[#24b47e] bg-white text-[#171717] transition-colors\"\n >\n Simulate Payment\n </button>\n {status === 'expired' && (\n <button\n onClick={onResetPayment}\n className=\"px-2.5 py-1 text-[11px] font-medium rounded bg-[#171717] text-white hover:bg-[#212121] transition-colors\"\n >\n Refresh\n </button>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n </div>,\n document.body\n );\n};\n","import React, { useState } from 'react';\nimport {\n Shield,\n Copy,\n Check,\n ExternalLink,\n Clock,\n CheckCircle2,\n AlertCircle,\n Lock,\n Sparkles,\n} from 'lucide-react';\nimport { CiceroQRCode } from './CiceroQRCode';\nimport { CiceroPayProps } from '../types';\nimport { useCiceroPayment } from '../hooks/useCiceroPayment';\nimport { truncateAddress } from '../utils/address';\nimport { useZcashPrice } from '../hooks/useZcashPrice';\n\nexport const CiceroInvoice: React.FC<CiceroPayProps> = ({\n recipient,\n amount,\n memo,\n message,\n network = 'mainnet',\n expiresInSeconds = 900,\n showUsd = true,\n invoiceId,\n customRpcUrl,\n onSuccess,\n onError,\n onStatusChange,\n className = '',\n}) => {\n const [copiedType, setCopiedType] = useState<'address' | 'uri' | 'memo' | null>(null);\n const { convertZecToUsd } = useZcashPrice(showUsd);\n\n const {\n status,\n txId,\n secondsRemaining,\n zip321Uri,\n addressType,\n isShielded,\n memoValidation,\n simulateDetection,\n resetPayment,\n zucchiniAvailable,\n zucchiniPaying,\n payWithZucchini,\n } = useCiceroPayment({\n recipient,\n amount,\n memo,\n message,\n network,\n expiresInSeconds,\n invoiceId,\n customRpcUrl,\n onSuccess,\n onError,\n onStatusChange,\n });\n\n const copyToClipboard = async (text: string, type: 'address' | 'uri' | 'memo') => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedType(type);\n setTimeout(() => setCopiedType(null), 2000);\n } catch {\n // fallback\n }\n };\n\n const formatTime = (secs: number) => {\n const m = Math.floor(secs / 60);\n const s = secs % 60;\n return `${m}:${s < 10 ? '0' : ''}${s}`;\n };\n\n const usdValue = convertZecToUsd(amount);\n\n return (\n <div\n className={`bg-white rounded-xl border border-[#ededed] shadow-sm overflow-hidden text-[#171717] font-sans ${className}`}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3.5 border-b border-[#ededed] bg-[#fafafa]\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-7 h-7 rounded-md bg-[#171717] flex items-center justify-center text-[#3ecf8e]\">\n <Shield className=\"w-3.5 h-3.5 fill-[#3ecf8e]\" />\n </div>\n <div>\n <span className=\"font-medium text-xs text-[#171717]\">Shielded Zcash Invoice</span>\n {invoiceId && (\n <span className=\"text-[10px] text-[#707070] ml-2 font-mono\">#{invoiceId}</span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-mono px-1.5 py-0.5 rounded bg-white border border-[#dfdfdf] text-[#171717]\">\n {addressType === 'unified' ? 'Unified' : addressType === 'sapling' ? 'Sapling' : 'Transparent'}\n </span>\n <span className=\"text-[10px] uppercase tracking-wider font-semibold px-2 py-0.5 rounded-full bg-[#3ecf8e]/15 text-[#24b47e] border border-[#3ecf8e]/30\">\n {isShielded ? 'zk-Shielded' : 'Transparent'}\n </span>\n {network === 'testnet' && (\n <span className=\"text-[10px] uppercase tracking-wider font-semibold px-2 py-0.5 rounded-full bg-amber-100 text-amber-800 border border-amber-200\">\n Testnet\n </span>\n )}\n </div>\n </div>\n\n {/* Body */}\n <div className=\"p-5 space-y-4\">\n {status === 'confirmed' ? (\n <div className=\"py-6 text-center space-y-3\">\n <div className=\"w-12 h-12 mx-auto rounded-full bg-[#3ecf8e]/15 border border-[#3ecf8e]/40 flex items-center justify-center text-[#24b47e]\">\n <CheckCircle2 className=\"w-6 h-6\" />\n </div>\n <div>\n <h4 className=\"font-medium text-sm text-[#171717]\">Payment Verified!</h4>\n <p className=\"text-xs text-[#707070] mt-0.5\">\n Shielded transaction detected and settled on-chain.\n </p>\n </div>\n {txId && (\n <div className=\"font-mono text-[11px] p-2 bg-[#fafafa] rounded border border-[#ededed] text-[#707070] break-all\">\n {txId}\n </div>\n )}\n </div>\n ) : (\n <>\n {/* Amount card */}\n <div className=\"flex items-center justify-between p-3.5 bg-[#fafafa] rounded-lg border border-[#ededed]\">\n <div>\n <span className=\"text-[10px] text-[#707070] uppercase font-mono tracking-wider\">Amount Due</span>\n <div className=\"flex items-baseline gap-2 mt-0.5\">\n <span className=\"text-xl font-semibold tracking-tight text-[#171717] font-mono\">\n {amount} <span className=\"text-xs font-normal text-[#707070]\">ZEC</span>\n </span>\n {usdValue && (\n <span className=\"text-xs text-[#707070] font-mono\">≈ ${usdValue} USD</span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-1.5 text-[#707070] font-mono text-xs\">\n <Clock className=\"w-3.5 h-3.5\" />\n <span>{formatTime(secondsRemaining)}</span>\n </div>\n </div>\n\n {/* QR and actions */}\n <div className=\"flex flex-col sm:flex-row items-center gap-4\">\n <CiceroQRCode value={zip321Uri} size={140} />\n <div className=\"space-y-2.5 w-full\">\n {/* Zucchini Extension Pay Button */}\n {zucchiniAvailable && (\n <button\n onClick={payWithZucchini}\n disabled={zucchiniPaying}\n className=\"inline-flex items-center justify-center gap-1.5 w-full py-2 px-3 rounded-md bg-[#3ecf8e] text-[#171717] text-xs font-semibold hover:bg-[#24b47e] transition-colors disabled:opacity-60 shadow-sm\"\n >\n {zucchiniPaying ? (\n <>\n <span className=\"w-3.5 h-3.5 border-2 border-[#171717]/30 border-t-[#171717] rounded-full animate-spin\" />\n <span>Confirming in Zucchini...</span>\n </>\n ) : (\n <>\n <span>🥒</span>\n <span>Pay with Zucchini Wallet</span>\n </>\n )}\n </button>\n )}\n\n <a\n href={zip321Uri}\n className=\"inline-flex items-center justify-center gap-1.5 w-full py-2 px-3 rounded-md bg-[#171717] text-white text-xs font-medium hover:bg-[#212121] transition-colors\"\n >\n <span>Pay with Wallet App</span>\n <ExternalLink className=\"w-3.5 h-3.5 text-[#3ecf8e]\" />\n </a>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <button\n onClick={() => copyToClipboard(zip321Uri, 'uri')}\n className=\"py-1.5 px-2 rounded-md border border-[#ededed] hover:bg-[#fafafa] text-[11px] font-medium text-[#171717] transition-colors flex items-center justify-center gap-1\"\n >\n {copiedType === 'uri' ? (\n <Check className=\"w-3 h-3 text-[#24b47e]\" />\n ) : (\n <Copy className=\"w-3 h-3 text-[#707070]\" />\n )}\n <span>{copiedType === 'uri' ? 'Copied' : 'Copy URI'}</span>\n </button>\n <button\n onClick={() => copyToClipboard(recipient, 'address')}\n className=\"py-1.5 px-2 rounded-md border border-[#ededed] hover:bg-[#fafafa] text-[11px] font-medium text-[#171717] transition-colors flex items-center justify-center gap-1\"\n >\n {copiedType === 'address' ? (\n <Check className=\"w-3 h-3 text-[#24b47e]\" />\n ) : (\n <Copy className=\"w-3 h-3 text-[#707070]\" />\n )}\n <span>{copiedType === 'address' ? 'Copied' : 'Copy Addr'}</span>\n </button>\n </div>\n\n <div className=\"text-[11px] text-[#707070] font-mono truncate\">\n To: {truncateAddress(recipient, 10, 8)}\n </div>\n </div>\n </div>\n\n {/* Memo */}\n {memo && (\n <div className=\"p-2.5 bg-[#fafafa] rounded-md border border-[#ededed] text-xs\">\n <div className=\"flex items-center gap-1 text-[11px] font-medium text-[#171717] mb-0.5\">\n <Lock className=\"w-3 h-3 text-[#3ecf8e]\" />\n <span>Encrypted Memo</span>\n </div>\n <div className=\"font-mono text-[11px] text-[#171717]\">{memo}</div>\n </div>\n )}\n\n {/* Warning if any */}\n {memoValidation.warning && (\n <div className=\"p-2 rounded bg-amber-50 border border-amber-200 text-amber-800 text-[11px] flex items-start gap-1.5\">\n <AlertCircle className=\"w-3.5 h-3.5 flex-shrink-0 mt-0.5 text-amber-600\" />\n <span>{memoValidation.warning}</span>\n </div>\n )}\n\n {/* Expired state */}\n {status === 'expired' && (\n <div className=\"p-2 rounded bg-rose-50 border border-rose-200 text-rose-800 text-xs flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5\">\n <AlertCircle className=\"w-3.5 h-3.5 text-rose-600\" />\n <span>Invoice has expired</span>\n </div>\n <button\n onClick={resetPayment}\n className=\"px-2 py-0.5 text-[11px] font-medium rounded bg-[#171717] text-white hover:bg-[#212121]\"\n >\n Reset\n </button>\n </div>\n )}\n\n {/* Demo bar */}\n <div className=\"pt-2 border-t border-[#ededed] flex items-center justify-between text-[11px] text-[#707070]\">\n <span className=\"flex items-center gap-1\">\n <Sparkles className=\"w-3 h-3 text-[#3ecf8e]\" />\n Demo test\n </span>\n <button\n onClick={simulateDetection}\n className=\"px-2 py-0.5 rounded border border-[#dfdfdf] hover:border-[#3ecf8e] text-[#171717] bg-white transition-colors\"\n >\n Simulate Success\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport {\n ZucchiniWalletAdapter,\n WalletConnectionStatus,\n WalletPaymentStatus,\n WalletSession,\n} from '../wallet/zucchini';\n\nexport interface UseZucchiniWalletOptions {\n /** Auto-connect on mount when extension is detected */\n autoConnect?: boolean;\n}\n\nexport function useZucchiniWallet(options: UseZucchiniWalletOptions = {}) {\n const { autoConnect = false } = options;\n\n const [adapter] = useState(() => new ZucchiniWalletAdapter());\n const [isAvailable, setIsAvailable] = useState(false);\n const [connectionStatus, setConnectionStatus] =\n useState<WalletConnectionStatus>('disconnected');\n const [paymentStatus, setPaymentStatus] =\n useState<WalletPaymentStatus>('idle');\n const [session, setSession] = useState<WalletSession | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Detect extension on mount\n useEffect(() => {\n const detected = ZucchiniWalletAdapter.isAvailable();\n setIsAvailable(detected);\n\n if (detected && autoConnect) {\n connect();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const connect = useCallback(async () => {\n setConnectionStatus('connecting');\n setError(null);\n try {\n const sess = await adapter.connect();\n setSession(sess);\n setConnectionStatus('connected');\n return sess;\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? err.message : 'Failed to connect to Zucchini Wallet';\n setError(msg);\n setConnectionStatus('error');\n throw err;\n }\n }, [adapter]);\n\n const requestPayment = useCallback(\n async (params: { recipient: string; amount: number | string; memo?: string }) => {\n setPaymentStatus('requesting');\n setError(null);\n try {\n const result = await adapter.requestPayment(params);\n setPaymentStatus('submitted');\n return result;\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? err.message : 'Payment request failed';\n setError(msg);\n setPaymentStatus('error');\n throw err;\n }\n },\n [adapter]\n );\n\n const disconnect = useCallback(async () => {\n await adapter.disconnect();\n setSession(null);\n setConnectionStatus('disconnected');\n setPaymentStatus('idle');\n }, [adapter]);\n\n return {\n /** Whether the Zucchini extension is installed in this browser */\n isAvailable,\n /** Current wallet connection lifecycle state */\n connectionStatus,\n /** Current payment request lifecycle state */\n paymentStatus,\n /** Active session info (address, etc.) */\n session,\n /** Last error message (if any) */\n error,\n /** Prompt the user to connect their Zucchini Wallet */\n connect,\n /** Send a ZIP-321 payment request for user review & approval */\n requestPayment,\n /** Disconnect the current session */\n disconnect,\n };\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useState","useEffect","jsx","useState","useEffect","useState","useEffect","createPortal","X","ExternalLink","Shield","jsx","jsxs","useState","useEffect","createPortal","X","Shield","ExternalLink","jsx","jsxs","useState","useEffect","useCallback","Shield","Fragment","jsx","jsxs","Shield","Shield","useState","useEffect","useCallback","useMemo","useRef","useRef","useState","useEffect","useMemo","useCallback","useState","useEffect","createPortal","Shield","Copy","Check","ExternalLink","AlertCircle","X","Sparkles","Fragment","jsx","jsxs","useState","useEffect","createPortal","Shield","X","AlertCircle","Sparkles","ExternalLink","Check","Copy","Fragment","jsx","jsxs","Shield","useState","Shield","Copy","Check","ExternalLink","Clock","CheckCircle2","AlertCircle","Lock","Sparkles","Fragment","jsx","jsxs","useState","Shield","CheckCircle2","Clock","ExternalLink","Check","Copy","Lock","AlertCircle","Sparkles","useState","useEffect","useCallback","adapter","useState","useEffect","useCallback"]}
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "@cicero-zcash/react",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Drop-in React payment button and checkout modal for shielded Zcash (ZIP-321 compliant)",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/index.css"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/Kaycee276/cicero.git",
26
+ "directory": "packages/cicero"
27
+ },
28
+ "homepage": "https://github.com/Kaycee276/cicero#readme",
29
+ "bugs": {
30
+ "url": "https://github.com/Kaycee276/cicero/issues"
31
+ },
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch",
35
+ "lint": "tsc --noEmit"
36
+ },
37
+ "keywords": [
38
+ "zcash",
39
+ "shielded-payments",
40
+ "react",
41
+ "checkout",
42
+ "zip-321",
43
+ "unified-addresses",
44
+ "zashi",
45
+ "ywallet"
46
+ ],
47
+ "author": "Kaycee276",
48
+ "license": "MIT",
49
+ "peerDependencies": {
50
+ "react": ">=18.0.0",
51
+ "react-dom": ">=18.0.0"
52
+ },
53
+ "dependencies": {
54
+ "@zucchinifi/dapp-sdk": "^0.3.0",
55
+ "clsx": "^2.1.1",
56
+ "lucide-react": "^0.475.0",
57
+ "qrcode.react": "^4.2.0",
58
+ "tailwind-merge": "^3.0.1"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^22.13.4",
62
+ "@types/react": "^19.0.8",
63
+ "@types/react-dom": "^19.0.3",
64
+ "react": "^19.0.0",
65
+ "react-dom": "^19.0.0",
66
+ "tsup": "^8.3.6",
67
+ "typescript": "^5.7.3"
68
+ }
69
+ }