stellar-wallet-kit 2.0.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/adapters/FreighterAdapter.ts","../src/utils/balanceUtils.ts","../src/context/WalletContext.tsx","../src/components/WalletModal.tsx","../src/components/ConnectButton.tsx"],"names":["WalletType","NetworkType","isConnected","isAllowed","setAllowed","getUserInfo","getNetwork","signTransaction","signAuthEntry","createContext","useState","useEffect","useCallback","error","useMemo","React","useContext"],"mappings":"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","file":"index.js","sourcesContent":["// src/types/index.ts\r\n\r\nexport enum WalletType {\r\n FREIGHTER = 'freighter',\r\n // Add more wallet types as needed\r\n // XBULL = 'xbull',\r\n // ALBEDO = 'albedo',\r\n}\r\n\r\nexport enum NetworkType {\r\n PUBLIC = 'PUBLIC',\r\n TESTNET = 'TESTNET',\r\n FUTURENET = 'FUTURENET',\r\n STANDALONE = 'STANDALONE',\r\n}\r\n\r\nexport interface WalletAccount {\r\n address: string;\r\n publicKey: string;\r\n displayName?: string;\r\n balances?: AccountBalance[];\r\n}\r\n\r\nexport interface AccountBalance {\r\n asset_type: string;\r\n asset_code?: string;\r\n asset_issuer?: string;\r\n balance: string;\r\n limit?: string;\r\n buying_liabilities?: string;\r\n selling_liabilities?: string;\r\n is_authorized?: boolean;\r\n is_authorized_to_maintain_liabilities?: boolean;\r\n last_modified_ledger?: number;\r\n sponsor?: string;\r\n}\r\n\r\nexport interface WalletInfo {\r\n id: WalletType;\r\n name: string;\r\n icon: string;\r\n description?: string;\r\n installed: boolean;\r\n downloadUrl?: string;\r\n}\r\n\r\nexport interface ConnectWalletResponse {\r\n address: string;\r\n publicKey: string;\r\n}\r\n\r\nexport interface SignTransactionResponse {\r\n signedTxXdr: string;\r\n}\r\n\r\nexport interface SignAuthEntryResponse {\r\n signedAuthEntry: string;\r\n}\r\n\r\nexport interface WalletAdapter {\r\n type: WalletType;\r\n isAvailable(): Promise<boolean>;\r\n connect(): Promise<ConnectWalletResponse>;\r\n disconnect(): Promise<void>;\r\n getPublicKey(): Promise<string | null>;\r\n getNetwork(): Promise<string>;\r\n signTransaction(xdr: string, options?: SignTransactionOptions): Promise<SignTransactionResponse>;\r\n signAuthEntry(entryXdr: string, options?: SignAuthEntryOptions): Promise<SignAuthEntryResponse>;\r\n}\r\n\r\nexport interface SignTransactionOptions {\r\n network?: string;\r\n networkPassphrase?: string;\r\n accountToSign?: string;\r\n}\r\n\r\nexport interface SignAuthEntryOptions {\r\n accountToSign?: string;\r\n}\r\n\r\nexport interface StellarWalletKitConfig {\r\n network?: NetworkType;\r\n defaultWallet?: WalletType;\r\n autoConnect?: boolean;\r\n theme?: WalletTheme;\r\n appName?: string;\r\n appIcon?: string;\r\n}\r\n\r\nexport interface WalletTheme {\r\n mode?: 'light' | 'dark' | 'auto';\r\n primaryColor?: string;\r\n backgroundColor?: string;\r\n borderRadius?: string;\r\n fontFamily?: string;\r\n overlayBackground?: string;\r\n modalBackground?: string;\r\n textColor?: string;\r\n buttonHoverColor?: string;\r\n}\r\n\r\nexport interface ModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n wallets: WalletInfo[];\r\n onSelectWallet: (walletType: WalletType) => void;\r\n theme?: WalletTheme;\r\n appName?: string;\r\n appIcon?: string;\r\n}\r\n\r\nexport interface WalletContextValue {\r\n account: WalletAccount | null;\r\n isConnected: boolean;\r\n isConnecting: boolean;\r\n error: Error | null;\r\n network: NetworkType;\r\n selectedWallet: WalletType | null;\r\n connect: (walletType?: WalletType) => Promise<void>;\r\n disconnect: () => Promise<void>;\r\n signTransaction: (xdr: string, options?: SignTransactionOptions) => Promise<SignTransactionResponse>;\r\n signAuthEntry: (entryXdr: string, options?: SignAuthEntryOptions) => Promise<SignAuthEntryResponse>;\r\n switchNetwork: (network: NetworkType) => Promise<void>;\r\n availableWallets: WalletInfo[];\r\n refreshBalances: () => Promise<void>;\r\n isLoadingBalances: boolean;\r\n}","// src/adapters/FreighterAdapter.ts\r\n\r\nimport {\r\n isConnected,\r\n isAllowed,\r\n setAllowed,\r\n getUserInfo,\r\n signTransaction,\r\n signAuthEntry,\r\n getNetwork,\r\n} from '@stellar/freighter-api';\r\n\r\nimport { WalletType } from '../types';\r\nimport type {\r\n WalletAdapter,\r\n ConnectWalletResponse,\r\n SignTransactionResponse,\r\n SignAuthEntryResponse,\r\n SignTransactionOptions,\r\n SignAuthEntryOptions,\r\n} from '../types';\r\n\r\nexport class FreighterAdapter implements WalletAdapter {\r\n readonly type = WalletType.FREIGHTER;\r\n\r\n async isAvailable(): Promise<boolean> {\r\n try {\r\n return await isConnected();\r\n } catch (error) {\r\n console.error('Error checking Freighter availability:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async connect(): Promise<ConnectWalletResponse> {\r\n try {\r\n // Check if Freighter is installed\r\n const connected = await isConnected();\r\n if (!connected) {\r\n throw new Error('Freighter wallet is not installed');\r\n }\r\n\r\n // Check if already allowed\r\n const allowed = await isAllowed();\r\n \r\n if (!allowed) {\r\n // Request permission\r\n await setAllowed();\r\n }\r\n\r\n // Get user info\r\n const userInfo = await getUserInfo();\r\n \r\n if (!userInfo || !userInfo.publicKey) {\r\n throw new Error('Failed to get user information from Freighter');\r\n }\r\n\r\n return {\r\n address: userInfo.publicKey,\r\n publicKey: userInfo.publicKey,\r\n };\r\n } catch (error) {\r\n console.error('Error connecting to Freighter:', error);\r\n throw new Error(`Failed to connect to Freighter: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n // Freighter doesn't have a disconnect method in the API\r\n // The user needs to disconnect manually from the extension\r\n // We just clear local state\r\n console.log('Freighter disconnect requested - user must disconnect from extension');\r\n }\r\n\r\n async getPublicKey(): Promise<string | null> {\r\n try {\r\n const allowed = await isAllowed();\r\n if (!allowed) {\r\n return null;\r\n }\r\n\r\n const userInfo = await getUserInfo();\r\n return userInfo?.publicKey || null;\r\n } catch (error) {\r\n console.error('Error getting public key:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async getNetwork(): Promise<string> {\r\n try {\r\n const network = await getNetwork();\r\n return network;\r\n } catch (error) {\r\n console.error('Error getting network:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async signTransaction(\r\n xdr: string,\r\n options?: SignTransactionOptions\r\n ): Promise<SignTransactionResponse> {\r\n try {\r\n const result = await signTransaction(xdr, {\r\n network: options?.network,\r\n networkPassphrase: options?.networkPassphrase,\r\n accountToSign: options?.accountToSign,\r\n });\r\n\r\n if (!result || typeof result !== 'string') {\r\n throw new Error('Invalid response from Freighter');\r\n }\r\n\r\n return {\r\n signedTxXdr: result,\r\n };\r\n } catch (error) {\r\n console.error('Error signing transaction:', error);\r\n throw new Error(`Failed to sign transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async signAuthEntry(\r\n entryXdr: string,\r\n options?: SignAuthEntryOptions\r\n ): Promise<SignAuthEntryResponse> {\r\n try {\r\n const result = await signAuthEntry(entryXdr, {\r\n accountToSign: options?.accountToSign,\r\n });\r\n\r\n if (!result || typeof result !== 'string') {\r\n throw new Error('Invalid response from Freighter');\r\n }\r\n\r\n return {\r\n signedAuthEntry: result,\r\n };\r\n } catch (error) {\r\n console.error('Error signing auth entry:', error);\r\n throw new Error(`Failed to sign auth entry: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n}","// src/utils/balanceUtils.ts\r\n\r\nimport type { AccountBalance, NetworkType } from '../types';\r\n\r\ninterface HorizonBalanceRecord {\r\n asset_type: string;\r\n asset_code?: string;\r\n asset_issuer?: string;\r\n balance: string;\r\n limit?: string;\r\n buying_liabilities?: string;\r\n selling_liabilities?: string;\r\n is_authorized?: boolean;\r\n is_authorized_to_maintain_liabilities?: boolean;\r\n last_modified_ledger?: number;\r\n sponsor?: string;\r\n}\r\n\r\ninterface HorizonAccountResponse {\r\n id: string;\r\n account_id: string;\r\n sequence: string;\r\n balances: HorizonBalanceRecord[];\r\n}\r\n\r\nconst HORIZON_URLS: Record<NetworkType, string> = {\r\n PUBLIC: 'https://horizon.stellar.org',\r\n TESTNET: 'https://horizon-testnet.stellar.org',\r\n FUTURENET: 'https://horizon-futurenet.stellar.org',\r\n STANDALONE: 'http://localhost:8000',\r\n};\r\n\r\n/**\r\n * Fetches account balances from Horizon\r\n */\r\nexport async function fetchAccountBalances(\r\n publicKey: string,\r\n network: NetworkType\r\n): Promise<AccountBalance[]> {\r\n const horizonUrl = HORIZON_URLS[network];\r\n \r\n try {\r\n const response = await fetch(`${horizonUrl}/accounts/${publicKey}`);\r\n \r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n throw new Error('Account not found. Make sure the account is funded.');\r\n }\r\n throw new Error(`Failed to fetch account: ${response.statusText}`);\r\n }\r\n \r\n const data: HorizonAccountResponse = await response.json();\r\n return data.balances as AccountBalance[];\r\n } catch (error) {\r\n console.error('Error fetching balances:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the native (XLM) balance from balances array\r\n */\r\nexport function getNativeBalance(balances: AccountBalance[]): string {\r\n const nativeBalance = balances.find(b => b.asset_type === 'native');\r\n return nativeBalance?.balance || '0';\r\n}\r\n\r\n/**\r\n * Formats balance for display\r\n */\r\nexport function formatBalance(balance: string, decimals: number = 7): string {\r\n const num = parseFloat(balance);\r\n if (isNaN(num)) return '0';\r\n \r\n // Format with specified decimals, remove trailing zeros\r\n return num.toFixed(decimals).replace(/\\.?0+$/, '');\r\n}\r\n\r\n/**\r\n * Gets balance for a specific asset\r\n */\r\nexport function getAssetBalance(\r\n balances: AccountBalance[],\r\n assetCode?: string,\r\n assetIssuer?: string\r\n): string {\r\n if (!assetCode) {\r\n return getNativeBalance(balances);\r\n }\r\n \r\n const asset = balances.find(\r\n b => b.asset_code === assetCode && \r\n (!assetIssuer || b.asset_issuer === assetIssuer)\r\n );\r\n \r\n return asset?.balance || '0';\r\n}\r\n\r\n/**\r\n * Checks if account has sufficient balance for a transaction\r\n */\r\nexport function hasSufficientBalance(\r\n balances: AccountBalance[],\r\n requiredAmount: string,\r\n assetCode?: string,\r\n assetIssuer?: string\r\n): boolean {\r\n const balance = getAssetBalance(balances, assetCode, assetIssuer);\r\n return parseFloat(balance) >= parseFloat(requiredAmount);\r\n}\r\n\r\n/**\r\n * Gets total account value in XLM (simplified - just returns native balance)\r\n * For real implementation, you'd need asset prices\r\n */\r\nexport function getTotalValueXLM(balances: AccountBalance[]): string {\r\n return getNativeBalance(balances);\r\n}\r\n\r\n/**\r\n * Groups balances by type (native, credit_alphanum4, credit_alphanum12, liquidity_pool_shares)\r\n */\r\nexport function groupBalancesByType(balances: AccountBalance[]) {\r\n return balances.reduce((acc, balance) => {\r\n const type = balance.asset_type;\r\n if (!acc[type]) {\r\n acc[type] = [];\r\n }\r\n acc[type].push(balance);\r\n return acc;\r\n }, {} as Record<string, AccountBalance[]>);\r\n}","// src/context/WalletContext.tsx\r\n\r\nimport React, { createContext, useContext, useState, useEffect, useCallback, useMemo, PropsWithChildren } from 'react';\r\nimport {\r\n WalletType,\r\n NetworkType,\r\n} from '../types';\r\nimport type {\r\n WalletContextValue,\r\n WalletAccount,\r\n StellarWalletKitConfig,\r\n WalletInfo,\r\n SignTransactionOptions,\r\n SignAuthEntryOptions,\r\n SignTransactionResponse,\r\n SignAuthEntryResponse,\r\n WalletAdapter,\r\n} from '../types';\r\nimport { FreighterAdapter } from '../adapters/FreighterAdapter';\r\nimport { fetchAccountBalances } from '../utils/balanceUtils';\r\n\r\nconst WalletContext = createContext<WalletContextValue | undefined>(undefined);\r\n\r\nconst STORAGE_KEY = 'stellar_wallet_kit';\r\n\r\ninterface StorageData {\r\n selectedWallet: WalletType | null;\r\n autoConnect: boolean;\r\n}\r\n\r\nconst getStorageData = (): StorageData => {\r\n if (typeof window === 'undefined') {\r\n return { selectedWallet: null, autoConnect: false };\r\n }\r\n try {\r\n const data = localStorage.getItem(STORAGE_KEY);\r\n return data ? JSON.parse(data) : { selectedWallet: null, autoConnect: false };\r\n } catch {\r\n return { selectedWallet: null, autoConnect: false };\r\n }\r\n};\r\n\r\nconst setStorageData = (data: Partial<StorageData>) => {\r\n if (typeof window === 'undefined') return;\r\n try {\r\n const existing = getStorageData();\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ ...existing, ...data }));\r\n } catch (error) {\r\n console.error('Failed to save to localStorage:', error);\r\n }\r\n};\r\n\r\n// Check if we're in a browser environment\r\nconst isBrowser = typeof window !== 'undefined';\r\n\r\n// Wallet registry - add new wallet adapters here\r\nconst walletAdapters: Record<WalletType, WalletAdapter> = {\r\n [WalletType.FREIGHTER]: new FreighterAdapter(),\r\n};\r\n\r\nconst walletMetadata: Record<WalletType, Omit<WalletInfo, 'installed'>> = {\r\n [WalletType.FREIGHTER]: {\r\n id: WalletType.FREIGHTER,\r\n name: 'Freighter',\r\n icon: 'https://stellar.creit.tech/wallet-icons/freighter.svg',\r\n description: 'Freighter browser extension wallet',\r\n downloadUrl: 'https://chrome.google.com/webstore/detail/freighter/bcacfldlkkdogcmkkibnjlakofdplcbk',\r\n },\r\n};\r\n\r\ntype WalletProviderProps = PropsWithChildren<{\r\n config?: StellarWalletKitConfig;\r\n}>;\r\n\r\nexport function WalletProvider({ config = {}, children }: WalletProviderProps) {\r\n const [account, setAccount] = useState<WalletAccount | null>(null);\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [network, setNetwork] = useState<NetworkType>(config.network || NetworkType.TESTNET);\r\n const [selectedWallet, setSelectedWallet] = useState<WalletType | null>(null);\r\n const [availableWallets, setAvailableWallets] = useState<WalletInfo[]>([]);\r\n const [isLoadingBalances, setIsLoadingBalances] = useState(false);\r\n\r\n const isConnected = !!account;\r\n\r\n // Check available wallets on mount\r\n useEffect(() => {\r\n if (!isBrowser) return;\r\n \r\n const checkWallets = async () => {\r\n const wallets: WalletInfo[] = [];\r\n \r\n for (const [type, adapter] of Object.entries(walletAdapters)) {\r\n const installed = await adapter.isAvailable();\r\n wallets.push({\r\n ...walletMetadata[type as WalletType],\r\n installed,\r\n });\r\n }\r\n \r\n setAvailableWallets(wallets);\r\n };\r\n\r\n checkWallets();\r\n }, []);\r\n\r\n // Auto-connect on mount if configured\r\n useEffect(() => {\r\n if (!isBrowser) return;\r\n \r\n const autoConnectWallet = async () => {\r\n const storage = getStorageData();\r\n \r\n if (config.autoConnect && storage.selectedWallet) {\r\n try {\r\n await connect(storage.selectedWallet);\r\n } catch (err) {\r\n console.error('Auto-connect failed:', err);\r\n }\r\n }\r\n };\r\n\r\n autoConnectWallet();\r\n }, [config.autoConnect]);\r\n\r\n const refreshBalances = useCallback(async () => {\r\n if (!account?.publicKey) {\r\n return;\r\n }\r\n\r\n setIsLoadingBalances(true);\r\n try {\r\n const balances = await fetchAccountBalances(account.publicKey, network);\r\n setAccount(prev => prev ? { ...prev, balances } : null);\r\n } catch (err) {\r\n console.error('Failed to fetch balances:', err);\r\n // Don't set error state for balance fetch failures\r\n } finally {\r\n setIsLoadingBalances(false);\r\n }\r\n }, [account?.publicKey, network]);\r\n\r\n const connect = useCallback(async (walletType?: WalletType) => {\r\n setIsConnecting(true);\r\n setError(null);\r\n\r\n try {\r\n const typeToConnect = walletType || config.defaultWallet || WalletType.FREIGHTER;\r\n const adapter = walletAdapters[typeToConnect];\r\n\r\n if (!adapter) {\r\n throw new Error(`Wallet adapter not found for ${typeToConnect}`);\r\n }\r\n\r\n const available = await adapter.isAvailable();\r\n if (!available) {\r\n throw new Error(`${walletMetadata[typeToConnect].name} is not installed`);\r\n }\r\n\r\n const response = await adapter.connect();\r\n\r\n const newAccount: WalletAccount = {\r\n address: response.address,\r\n publicKey: response.publicKey,\r\n displayName: `${response.address.slice(0, 4)}...${response.address.slice(-4)}`,\r\n };\r\n\r\n setAccount(newAccount);\r\n setSelectedWallet(typeToConnect);\r\n setStorageData({ selectedWallet: typeToConnect, autoConnect: true });\r\n\r\n // Fetch balances after connecting\r\n try {\r\n const balances = await fetchAccountBalances(response.publicKey, network);\r\n setAccount(prev => prev ? { ...prev, balances } : null);\r\n } catch (balanceError) {\r\n console.error('Failed to fetch initial balances:', balanceError);\r\n // Don't fail the connection if balance fetch fails\r\n }\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Failed to connect wallet');\r\n setError(error);\r\n throw error;\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n }, [config.defaultWallet]);\r\n\r\n const disconnect = useCallback(async () => {\r\n try {\r\n if (selectedWallet) {\r\n const adapter = walletAdapters[selectedWallet];\r\n await adapter.disconnect();\r\n }\r\n \r\n setAccount(null);\r\n setSelectedWallet(null);\r\n setError(null);\r\n setStorageData({ selectedWallet: null, autoConnect: false });\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Failed to disconnect wallet');\r\n setError(error);\r\n throw error;\r\n }\r\n }, [selectedWallet]);\r\n\r\n const signTransaction = useCallback(async (\r\n xdr: string,\r\n options?: SignTransactionOptions\r\n ): Promise<SignTransactionResponse> => {\r\n if (!selectedWallet) {\r\n throw new Error('No wallet connected');\r\n }\r\n\r\n const adapter = walletAdapters[selectedWallet];\r\n return adapter.signTransaction(xdr, options);\r\n }, [selectedWallet]);\r\n\r\n const signAuthEntry = useCallback(async (\r\n entryXdr: string,\r\n options?: SignAuthEntryOptions\r\n ): Promise<SignAuthEntryResponse> => {\r\n if (!selectedWallet) {\r\n throw new Error('No wallet connected');\r\n }\r\n\r\n const adapter = walletAdapters[selectedWallet];\r\n return adapter.signAuthEntry(entryXdr, options);\r\n }, [selectedWallet]);\r\n\r\n const switchNetwork = useCallback(async (newNetwork: NetworkType) => {\r\n setNetwork(newNetwork);\r\n // Refresh balances when network changes\r\n if (account?.publicKey) {\r\n await refreshBalances();\r\n }\r\n }, [account?.publicKey, refreshBalances]);\r\n\r\n // Auto-refresh balances periodically\r\n useEffect(() => {\r\n if (!account?.publicKey || !isBrowser) return;\r\n\r\n // Initial balance fetch\r\n refreshBalances();\r\n\r\n // Set up periodic refresh (every 30 seconds)\r\n const interval = setInterval(() => {\r\n refreshBalances();\r\n }, 30000);\r\n\r\n return () => clearInterval(interval);\r\n }, [account?.publicKey, refreshBalances]);\r\n\r\n const value = useMemo<WalletContextValue>(\r\n () => ({\r\n account,\r\n isConnected,\r\n isConnecting,\r\n error,\r\n network,\r\n selectedWallet,\r\n connect,\r\n disconnect,\r\n signTransaction,\r\n signAuthEntry,\r\n switchNetwork,\r\n availableWallets,\r\n refreshBalances,\r\n isLoadingBalances,\r\n }),\r\n [\r\n account,\r\n isConnected,\r\n isConnecting,\r\n error,\r\n network,\r\n selectedWallet,\r\n connect,\r\n disconnect,\r\n signTransaction,\r\n signAuthEntry,\r\n switchNetwork,\r\n availableWallets,\r\n refreshBalances,\r\n isLoadingBalances,\r\n ]\r\n );\r\n\r\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>;\r\n}\r\n\r\nexport function useWallet(): WalletContextValue {\r\n const context = useContext(WalletContext);\r\n if (context === undefined) {\r\n throw new Error('useWallet must be used within a WalletProvider');\r\n }\r\n return context;\r\n}","// src/components/WalletModal.tsx\r\n\r\nimport React, { useEffect } from 'react';\r\nimport type { ModalProps } from '../types';\r\n\r\nexport function WalletModal({\r\n isOpen,\r\n onClose,\r\n wallets,\r\n onSelectWallet,\r\n theme,\r\n appName = 'Your App',\r\n appIcon,\r\n}: ModalProps) {\r\n // Handle ESC key\r\n useEffect(() => {\r\n const handleEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n \r\n if (isOpen) {\r\n document.addEventListener('keydown', handleEsc);\r\n document.body.style.overflow = 'hidden';\r\n }\r\n \r\n return () => {\r\n document.removeEventListener('keydown', handleEsc);\r\n document.body.style.overflow = 'unset';\r\n };\r\n }, [isOpen, onClose]);\r\n\r\n if (!isOpen) return null;\r\n\r\n const themeMode = theme?.mode || 'light';\r\n const isDark = themeMode === 'dark' || (themeMode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);\r\n\r\n const styles = {\r\n overlay: {\r\n position: 'fixed' as const,\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: theme?.overlayBackground || (isDark ? 'rgba(0, 0, 0, 0.8)' : 'rgba(0, 0, 0, 0.5)'),\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 9999,\r\n animation: 'swk-fade-in 0.2s ease-out',\r\n },\r\n modal: {\r\n backgroundColor: theme?.modalBackground || (isDark ? '#1a1a1a' : '#ffffff'),\r\n borderRadius: theme?.borderRadius || '16px',\r\n padding: '24px',\r\n maxWidth: '420px',\r\n width: '90%',\r\n maxHeight: '80vh',\r\n overflowY: 'auto' as const,\r\n boxShadow: isDark ? '0 8px 32px rgba(0, 0, 0, 0.4)' : '0 8px 32px rgba(0, 0, 0, 0.1)',\r\n animation: 'swk-slide-up 0.3s ease-out',\r\n fontFamily: theme?.fontFamily || '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n header: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n marginBottom: '24px',\r\n },\r\n title: {\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: theme?.textColor || (isDark ? '#ffffff' : '#000000'),\r\n margin: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px',\r\n },\r\n closeButton: {\r\n background: 'none',\r\n border: 'none',\r\n fontSize: '24px',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n color: theme?.textColor || (isDark ? '#888888' : '#666666'),\r\n transition: 'color 0.2s',\r\n lineHeight: 1,\r\n },\r\n walletList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '12px',\r\n },\r\n walletButton: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '16px',\r\n padding: '16px',\r\n border: `1px solid ${isDark ? '#333333' : '#e5e5e5'}`,\r\n borderRadius: theme?.borderRadius || '12px',\r\n background: 'none',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s',\r\n width: '100%',\r\n textAlign: 'left' as const,\r\n fontFamily: 'inherit',\r\n },\r\n walletIcon: {\r\n width: '40px',\r\n height: '40px',\r\n borderRadius: '8px',\r\n flexShrink: 0,\r\n },\r\n walletInfo: {\r\n flex: 1,\r\n },\r\n walletName: {\r\n fontSize: '16px',\r\n fontWeight: 500,\r\n color: theme?.textColor || (isDark ? '#ffffff' : '#000000'),\r\n margin: 0,\r\n marginBottom: '4px',\r\n },\r\n walletDescription: {\r\n fontSize: '13px',\r\n color: theme?.textColor || (isDark ? '#888888' : '#666666'),\r\n margin: 0,\r\n },\r\n badge: {\r\n padding: '4px 8px',\r\n borderRadius: '6px',\r\n fontSize: '12px',\r\n fontWeight: 500,\r\n flexShrink: 0,\r\n },\r\n installedBadge: {\r\n backgroundColor: theme?.primaryColor || (isDark ? '#4CAF50' : '#4CAF50'),\r\n color: '#ffffff',\r\n },\r\n notInstalledBadge: {\r\n backgroundColor: isDark ? '#333333' : '#f0f0f0',\r\n color: isDark ? '#888888' : '#666666',\r\n },\r\n footer: {\r\n marginTop: '24px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${isDark ? '#333333' : '#e5e5e5'}`,\r\n fontSize: '13px',\r\n color: isDark ? '#888888' : '#666666',\r\n textAlign: 'center' as const,\r\n },\r\n link: {\r\n color: theme?.primaryColor || '#8b5cf6',\r\n textDecoration: 'none',\r\n },\r\n };\r\n\r\n const handleWalletClick = (wallet: any) => {\r\n if (wallet.installed) {\r\n onSelectWallet(wallet.id);\r\n } else if (wallet.downloadUrl) {\r\n window.open(wallet.downloadUrl, '_blank');\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <style>{`\r\n @keyframes swk-fade-in {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n @keyframes swk-slide-up {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n .swk-wallet-button:hover {\r\n background-color: ${theme?.buttonHoverColor || (isDark ? '#252525' : '#f5f5f5')} !important;\r\n border-color: ${theme?.primaryColor || '#8b5cf6'} !important;\r\n }\r\n .swk-close-button:hover {\r\n color: ${theme?.primaryColor || '#8b5cf6'} !important;\r\n }\r\n `}</style>\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.modal} onClick={(e) => e.stopPropagation()}>\r\n <div style={styles.header}>\r\n <h2 style={styles.title}>\r\n {appIcon && <img src={appIcon} alt=\"\" style={{ width: '32px', height: '32px', borderRadius: '8px' }} />}\r\n Connect Wallet\r\n </h2>\r\n <button\r\n className=\"swk-close-button\"\r\n style={styles.closeButton}\r\n onClick={onClose}\r\n aria-label=\"Close modal\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div style={styles.walletList}>\r\n {wallets.map((wallet) => (\r\n <button\r\n key={wallet.id}\r\n className=\"swk-wallet-button\"\r\n style={styles.walletButton}\r\n onClick={() => handleWalletClick(wallet)}\r\n disabled={!wallet.installed && !wallet.downloadUrl}\r\n >\r\n <img\r\n src={wallet.icon}\r\n alt={`${wallet.name} icon`}\r\n style={styles.walletIcon}\r\n />\r\n <div style={styles.walletInfo}>\r\n <p style={styles.walletName}>{wallet.name}</p>\r\n {wallet.description && (\r\n <p style={styles.walletDescription}>{wallet.description}</p>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n ...styles.badge,\r\n ...(wallet.installed ? styles.installedBadge : styles.notInstalledBadge),\r\n }}\r\n >\r\n {wallet.installed ? 'Installed' : 'Get'}\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div style={styles.footer}>\r\n <p style={{ margin: 0 }}>\r\n Don't have a wallet?{' '}\r\n <a\r\n href=\"https://www.stellar.org/ecosystem/projects#wallets\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={styles.link}\r\n >\r\n Learn more\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}","// src/components/ConnectButton.tsx\r\n\r\nimport React, { useState } from 'react';\r\nimport { useWallet } from '../context/WalletContext';\r\nimport { WalletModal } from './WalletModal';\r\nimport type { WalletTheme } from '../types';\r\nimport { getNativeBalance, formatBalance } from '../utils/balanceUtils';\r\n\r\ninterface ConnectButtonProps {\r\n label?: string;\r\n theme?: WalletTheme;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n showBalance?: boolean;\r\n onConnect?: () => void;\r\n onDisconnect?: () => void;\r\n}\r\n\r\nexport function ConnectButton({\r\n label = 'Connect Wallet',\r\n theme,\r\n className,\r\n style,\r\n showBalance = false,\r\n onConnect,\r\n onDisconnect,\r\n}: ConnectButtonProps) {\r\n const {\r\n account,\r\n isConnected,\r\n isConnecting,\r\n connect,\r\n disconnect,\r\n availableWallets,\r\n selectedWallet,\r\n refreshBalances,\r\n isLoadingBalances,\r\n } = useWallet();\r\n\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [showDropdown, setShowDropdown] = useState(false);\r\n\r\n const themeMode = theme?.mode || 'light';\r\n const isDark = themeMode === 'dark' || (themeMode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);\r\n\r\n const defaultButtonStyles: React.CSSProperties = {\r\n padding: '12px 24px',\r\n borderRadius: theme?.borderRadius || '12px',\r\n border: 'none',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s',\r\n fontFamily: theme?.fontFamily || '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n ...style,\r\n };\r\n\r\n const connectButtonStyles: React.CSSProperties = {\r\n ...defaultButtonStyles,\r\n backgroundColor: theme?.primaryColor || '#8b5cf6',\r\n color: '#ffffff',\r\n };\r\n\r\n const accountButtonStyles: React.CSSProperties = {\r\n ...defaultButtonStyles,\r\n backgroundColor: isDark ? '#252525' : '#f5f5f5',\r\n color: theme?.textColor || (isDark ? '#ffffff' : '#000000'),\r\n border: `1px solid ${isDark ? '#333333' : '#e5e5e5'}`,\r\n position: 'relative',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n };\r\n\r\n const dropdownStyles: React.CSSProperties = {\r\n position: 'absolute',\r\n top: 'calc(100% + 8px)',\r\n right: 0,\r\n backgroundColor: theme?.modalBackground || (isDark ? '#1a1a1a' : '#ffffff'),\r\n border: `1px solid ${isDark ? '#333333' : '#e5e5e5'}`,\r\n borderRadius: theme?.borderRadius || '12px',\r\n padding: '8px',\r\n minWidth: '200px',\r\n boxShadow: isDark ? '0 4px 16px rgba(0, 0, 0, 0.4)' : '0 4px 16px rgba(0, 0, 0, 0.1)',\r\n zIndex: 1000,\r\n };\r\n\r\n const dropdownItemStyles: React.CSSProperties = {\r\n padding: '12px 16px',\r\n border: 'none',\r\n background: 'none',\r\n cursor: 'pointer',\r\n width: '100%',\r\n textAlign: 'left',\r\n fontSize: '14px',\r\n color: theme?.textColor || (isDark ? '#ffffff' : '#000000'),\r\n borderRadius: '8px',\r\n transition: 'background-color 0.2s',\r\n fontFamily: 'inherit',\r\n };\r\n\r\n const handleConnect = async (walletType: any) => {\r\n try {\r\n await connect(walletType);\r\n setIsModalOpen(false);\r\n onConnect?.();\r\n } catch (error) {\r\n console.error('Connection error:', error);\r\n }\r\n };\r\n\r\n const handleDisconnect = async () => {\r\n try {\r\n await disconnect();\r\n setShowDropdown(false);\r\n onDisconnect?.();\r\n } catch (error) {\r\n console.error('Disconnect error:', error);\r\n }\r\n };\r\n\r\n const copyAddress = () => {\r\n if (account?.address) {\r\n navigator.clipboard.writeText(account.address);\r\n // You could add a toast notification here\r\n setShowDropdown(false);\r\n }\r\n };\r\n\r\n if (isConnecting) {\r\n return (\r\n <button\r\n className={className}\r\n style={connectButtonStyles}\r\n disabled\r\n >\r\n Connecting...\r\n </button>\r\n );\r\n }\r\n\r\n if (!isConnected || !account) {\r\n return (\r\n <>\r\n <button\r\n className={className}\r\n style={connectButtonStyles}\r\n onClick={() => setIsModalOpen(true)}\r\n >\r\n {label}\r\n </button>\r\n <WalletModal\r\n isOpen={isModalOpen}\r\n onClose={() => setIsModalOpen(false)}\r\n wallets={availableWallets}\r\n onSelectWallet={handleConnect}\r\n theme={theme}\r\n />\r\n </>\r\n );\r\n }\r\n\r\n const walletIcon = availableWallets.find(w => w.id === selectedWallet)?.icon;\r\n const nativeBalance = account?.balances ? getNativeBalance(account.balances) : null;\r\n const formattedBalance = nativeBalance ? formatBalance(nativeBalance, 2) : null;\r\n\r\n return (\r\n <>\r\n <div style={{ position: 'relative' }}>\r\n <button\r\n className={className}\r\n style={accountButtonStyles}\r\n onClick={() => setShowDropdown(!showDropdown)}\r\n >\r\n {walletIcon && (\r\n <img\r\n src={walletIcon}\r\n alt=\"Wallet\"\r\n style={{ width: '20px', height: '20px', borderRadius: '4px' }}\r\n />\r\n )}\r\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px' }}>\r\n <span>{account.displayName}</span>\r\n {showBalance && formattedBalance && (\r\n <span style={{ fontSize: '12px', opacity: 0.7, fontWeight: 400 }}>\r\n {isLoadingBalances ? '...' : `${formattedBalance} XLM`}\r\n </span>\r\n )}\r\n </div>\r\n <span style={{ fontSize: '12px', opacity: 0.7 }}>▼</span>\r\n </button>\r\n\r\n {showDropdown && (\r\n <>\r\n <div\r\n style={{\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n zIndex: 999,\r\n }}\r\n onClick={() => setShowDropdown(false)}\r\n />\r\n <div style={dropdownStyles}>\r\n <button\r\n style={dropdownItemStyles}\r\n onClick={() => {\r\n refreshBalances();\r\n setShowDropdown(false);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = theme?.buttonHoverColor || (isDark ? '#333333' : '#f0f0f0');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n 🔄 Refresh Balances\r\n </button>\r\n <button\r\n style={dropdownItemStyles}\r\n onClick={copyAddress}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = theme?.buttonHoverColor || (isDark ? '#333333' : '#f0f0f0');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n 📋 Copy Address\r\n </button>\r\n <button\r\n style={{\r\n ...dropdownItemStyles,\r\n color: '#ef4444',\r\n }}\r\n onClick={handleDisconnect}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = theme?.buttonHoverColor || (isDark ? '#333333' : '#f0f0f0');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n 🚪 Disconnect\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </>\r\n );\r\n}"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/adapters/FreighterAdapter.ts","../src/utils/balanceUtils.ts","../src/utils/albedoCallback.ts","../src/adapters/AlbedoAdapter.ts","../src/context/WalletContext.tsx","../src/components/WalletModal.tsx","../src/components/ConnectButton.tsx"],"names":["WalletType","NetworkType","isConnected","isAllowed","setAllowed","getUserInfo","getNetwork","signTransaction","signAuthEntry","createContext","useState","useEffect","useCallback","error","useMemo","React","useContext"],"mappings":"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","file":"index.js","sourcesContent":["export enum WalletType {\r\n FREIGHTER = \"freighter\",\r\n ALBEDO = \"albedo\",\r\n // XBULL = 'xbull',\r\n}\r\n\r\nexport enum NetworkType {\r\n PUBLIC = \"PUBLIC\",\r\n TESTNET = \"TESTNET\",\r\n FUTURENET = \"FUTURENET\",\r\n STANDALONE = \"STANDALONE\",\r\n}\r\n\r\nexport interface WalletAccount {\r\n address: string;\r\n publicKey: string;\r\n displayName?: string;\r\n balances?: AccountBalance[];\r\n}\r\n\r\nexport interface AccountBalance {\r\n asset_type: string;\r\n asset_code?: string;\r\n asset_issuer?: string;\r\n balance: string;\r\n limit?: string;\r\n buying_liabilities?: string;\r\n selling_liabilities?: string;\r\n is_authorized?: boolean;\r\n is_authorized_to_maintain_liabilities?: boolean;\r\n last_modified_ledger?: number;\r\n sponsor?: string;\r\n}\r\n\r\nexport interface WalletInfo {\r\n id: WalletType;\r\n name: string;\r\n icon: string;\r\n description?: string;\r\n\r\n /** true = ready to use (installed OR web wallet) */\r\n installed: boolean;\r\n\r\n /** Optional install link (extensions only) */\r\n downloadUrl?: string;\r\n\r\n /** NEW: wallet delivery model */\r\n kind?: WalletKind;\r\n\r\n /** NEW: capability flags (future-proof) */\r\n capabilities?: {\r\n silentReconnect?: boolean;\r\n networkDetection?: boolean;\r\n authEntrySigning?: boolean;\r\n };\r\n}\r\n\r\nexport interface ConnectWalletResponse {\r\n address: string;\r\n publicKey: string;\r\n}\r\n\r\nexport interface SignTransactionResponse {\r\n signedTxXdr: string;\r\n}\r\n\r\nexport interface SignAuthEntryResponse {\r\n signedAuthEntry: string;\r\n}\r\n\r\nexport interface WalletAdapter {\r\n type: WalletType;\r\n isAvailable(): Promise<boolean>;\r\n connect(): Promise<ConnectWalletResponse>;\r\n disconnect(): Promise<void>;\r\n getPublicKey(): Promise<string | null>;\r\n getNetwork(): Promise<string>;\r\n signTransaction(\r\n xdr: string,\r\n options?: SignTransactionOptions\r\n ): Promise<SignTransactionResponse>;\r\n signAuthEntry(\r\n entryXdr: string,\r\n options?: SignAuthEntryOptions\r\n ): Promise<SignAuthEntryResponse>;\r\n}\r\n\r\nexport interface SignTransactionOptions {\r\n network?: string;\r\n networkPassphrase?: string;\r\n accountToSign?: string;\r\n}\r\n\r\nexport interface SignAuthEntryOptions {\r\n accountToSign?: string;\r\n}\r\n\r\nexport interface StellarWalletKitConfig {\r\n network?: NetworkType;\r\n defaultWallet?: WalletType;\r\n autoConnect?: boolean;\r\n theme?: WalletTheme;\r\n appName?: string;\r\n appIcon?: string;\r\n}\r\n\r\nexport interface WalletTheme {\r\n mode?: \"light\" | \"dark\" | \"auto\";\r\n primaryColor?: string;\r\n backgroundColor?: string;\r\n borderRadius?: string;\r\n fontFamily?: string;\r\n overlayBackground?: string;\r\n modalBackground?: string;\r\n textColor?: string;\r\n buttonHoverColor?: string;\r\n}\r\n\r\nexport interface ModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n wallets: WalletInfo[];\r\n onSelectWallet: (walletType: WalletType) => void;\r\n theme?: WalletTheme;\r\n appName?: string;\r\n appIcon?: string;\r\n}\r\n\r\nexport interface WalletContextValue {\r\n account: WalletAccount | null;\r\n isConnected: boolean;\r\n isConnecting: boolean;\r\n error: Error | null;\r\n network: NetworkType;\r\n selectedWallet: WalletType | null;\r\n connect: (walletType?: WalletType) => Promise<void>;\r\n disconnect: () => Promise<void>;\r\n signTransaction: (\r\n xdr: string,\r\n options?: SignTransactionOptions\r\n ) => Promise<SignTransactionResponse>;\r\n signAuthEntry: (\r\n entryXdr: string,\r\n options?: SignAuthEntryOptions\r\n ) => Promise<SignAuthEntryResponse>;\r\n switchNetwork: (network: NetworkType) => Promise<void>;\r\n availableWallets: WalletInfo[];\r\n refreshBalances: () => Promise<void>;\r\n isLoadingBalances: boolean;\r\n supports: {\r\n silentReconnect: boolean;\r\n networkDetection: boolean;\r\n authEntrySigning: boolean;\r\n };\r\n}\r\n\r\nexport type WalletKind = \"extension\" | \"web\";\r\n","import {\r\n isConnected,\r\n isAllowed,\r\n setAllowed,\r\n getUserInfo,\r\n signTransaction,\r\n signAuthEntry,\r\n getNetwork,\r\n} from '@stellar/freighter-api';\r\n\r\nimport { WalletType } from '../types';\r\nimport type {\r\n WalletAdapter,\r\n ConnectWalletResponse,\r\n SignTransactionResponse,\r\n SignAuthEntryResponse,\r\n SignTransactionOptions,\r\n SignAuthEntryOptions,\r\n} from '../types';\r\n\r\nexport class FreighterAdapter implements WalletAdapter {\r\n readonly type = WalletType.FREIGHTER;\r\n\r\n async isAvailable(): Promise<boolean> {\r\n try {\r\n return await isConnected();\r\n } catch (error) {\r\n console.error('Error checking Freighter availability:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async connect(): Promise<ConnectWalletResponse> {\r\n try {\r\n // Check if Freighter is installed\r\n const connected = await isConnected();\r\n if (!connected) {\r\n throw new Error('Freighter wallet is not installed');\r\n }\r\n\r\n // Check if already allowed\r\n const allowed = await isAllowed();\r\n \r\n if (!allowed) {\r\n // Request permission\r\n await setAllowed();\r\n }\r\n\r\n // Get user info\r\n const userInfo = await getUserInfo();\r\n \r\n if (!userInfo || !userInfo.publicKey) {\r\n throw new Error('Failed to get user information from Freighter');\r\n }\r\n\r\n return {\r\n address: userInfo.publicKey,\r\n publicKey: userInfo.publicKey,\r\n };\r\n } catch (error) {\r\n console.error('Error connecting to Freighter:', error);\r\n throw new Error(`Failed to connect to Freighter: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n // Freighter doesn't have a disconnect method in the API\r\n // The user needs to disconnect manually from the extension\r\n // We just clear local state\r\n console.log('Freighter disconnect requested - user must disconnect from extension');\r\n }\r\n\r\n async getPublicKey(): Promise<string | null> {\r\n try {\r\n const allowed = await isAllowed();\r\n if (!allowed) {\r\n return null;\r\n }\r\n\r\n const userInfo = await getUserInfo();\r\n return userInfo?.publicKey || null;\r\n } catch (error) {\r\n console.error('Error getting public key:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async getNetwork(): Promise<string> {\r\n try {\r\n const network = await getNetwork();\r\n return network;\r\n } catch (error) {\r\n console.error('Error getting network:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async signTransaction(\r\n xdr: string,\r\n options?: SignTransactionOptions\r\n ): Promise<SignTransactionResponse> {\r\n try {\r\n const result = await signTransaction(xdr, {\r\n network: options?.network,\r\n networkPassphrase: options?.networkPassphrase,\r\n accountToSign: options?.accountToSign,\r\n });\r\n\r\n if (!result || typeof result !== 'string') {\r\n throw new Error('Invalid response from Freighter');\r\n }\r\n\r\n return {\r\n signedTxXdr: result,\r\n };\r\n } catch (error) {\r\n console.error('Error signing transaction:', error);\r\n throw new Error(`Failed to sign transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async signAuthEntry(\r\n entryXdr: string,\r\n options?: SignAuthEntryOptions\r\n ): Promise<SignAuthEntryResponse> {\r\n try {\r\n const result = await signAuthEntry(entryXdr, {\r\n accountToSign: options?.accountToSign,\r\n });\r\n\r\n if (!result || typeof result !== 'string') {\r\n throw new Error('Invalid response from Freighter');\r\n }\r\n\r\n return {\r\n signedAuthEntry: result,\r\n };\r\n } catch (error) {\r\n console.error('Error signing auth entry:', error);\r\n throw new Error(`Failed to sign auth entry: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n}","import type { AccountBalance, NetworkType } from '../types';\r\n\r\ninterface HorizonBalanceRecord {\r\n asset_type: string;\r\n asset_code?: string;\r\n asset_issuer?: string;\r\n balance: string;\r\n limit?: string;\r\n buying_liabilities?: string;\r\n selling_liabilities?: string;\r\n is_authorized?: boolean;\r\n is_authorized_to_maintain_liabilities?: boolean;\r\n last_modified_ledger?: number;\r\n sponsor?: string;\r\n}\r\n\r\ninterface HorizonAccountResponse {\r\n id: string;\r\n account_id: string;\r\n sequence: string;\r\n balances: HorizonBalanceRecord[];\r\n}\r\n\r\nconst HORIZON_URLS: Record<NetworkType, string> = {\r\n PUBLIC: 'https://horizon.stellar.org',\r\n TESTNET: 'https://horizon-testnet.stellar.org',\r\n FUTURENET: 'https://horizon-futurenet.stellar.org',\r\n STANDALONE: 'http://localhost:8000',\r\n};\r\n\r\n/**\r\n * Fetches account balances from Horizon\r\n */\r\nexport async function fetchAccountBalances(\r\n publicKey: string,\r\n network: NetworkType\r\n): Promise<AccountBalance[]> {\r\n const horizonUrl = HORIZON_URLS[network];\r\n \r\n try {\r\n const response = await fetch(`${horizonUrl}/accounts/${publicKey}`);\r\n \r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n throw new Error('Account not found. Make sure the account is funded.');\r\n }\r\n throw new Error(`Failed to fetch account: ${response.statusText}`);\r\n }\r\n \r\n const data: HorizonAccountResponse = await response.json();\r\n return data.balances as AccountBalance[];\r\n } catch (error) {\r\n console.error('Error fetching balances:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the native (XLM) balance from balances array\r\n */\r\nexport function getNativeBalance(balances: AccountBalance[]): string {\r\n const nativeBalance = balances.find(b => b.asset_type === 'native');\r\n return nativeBalance?.balance || '0';\r\n}\r\n\r\n/**\r\n * Formats balance for display\r\n */\r\nexport function formatBalance(balance: string, decimals: number = 7): string {\r\n const num = parseFloat(balance);\r\n if (isNaN(num)) return '0';\r\n \r\n // Format with specified decimals, remove trailing zeros\r\n return num.toFixed(decimals).replace(/\\.?0+$/, '');\r\n}\r\n\r\n/**\r\n * Gets balance for a specific asset\r\n */\r\nexport function getAssetBalance(\r\n balances: AccountBalance[],\r\n assetCode?: string,\r\n assetIssuer?: string\r\n): string {\r\n if (!assetCode) {\r\n return getNativeBalance(balances);\r\n }\r\n \r\n const asset = balances.find(\r\n b => b.asset_code === assetCode && \r\n (!assetIssuer || b.asset_issuer === assetIssuer)\r\n );\r\n \r\n return asset?.balance || '0';\r\n}\r\n\r\n/**\r\n * Checks if account has sufficient balance for a transaction\r\n */\r\nexport function hasSufficientBalance(\r\n balances: AccountBalance[],\r\n requiredAmount: string,\r\n assetCode?: string,\r\n assetIssuer?: string\r\n): boolean {\r\n const balance = getAssetBalance(balances, assetCode, assetIssuer);\r\n return parseFloat(balance) >= parseFloat(requiredAmount);\r\n}\r\n\r\n/**\r\n * Gets total account value in XLM (simplified - just returns native balance)\r\n * For real implementation, you'd need asset prices\r\n */\r\nexport function getTotalValueXLM(balances: AccountBalance[]): string {\r\n return getNativeBalance(balances);\r\n}\r\n\r\n/**\r\n * Groups balances by type (native, credit_alphanum4, credit_alphanum12, liquidity_pool_shares)\r\n */\r\nexport function groupBalancesByType(balances: AccountBalance[]) {\r\n return balances.reduce((acc, balance) => {\r\n const type = balance.asset_type;\r\n if (!acc[type]) {\r\n acc[type] = [];\r\n }\r\n acc[type].push(balance);\r\n return acc;\r\n }, {} as Record<string, AccountBalance[]>);\r\n}","export function openAlbedoPopup(url: string): Window {\r\n const popup = window.open(\r\n url,\r\n \"albedo\",\r\n \"width=420,height=720,resizable=yes,scrollbars=yes\"\r\n );\r\n\r\n if (!popup) {\r\n throw new Error(\"Failed to open Albedo popup (blocked by browser)\");\r\n }\r\n\r\n return popup;\r\n}\r\n\r\nexport function waitForAlbedoResult(): Promise<Record<string, string>> {\r\n return new Promise((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n reject(new Error(\"Albedo response timeout\"));\r\n }, 2 * 60 * 1000);\r\n\r\n const parseResult = () => {\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n if (\r\n !params.has(\"pubkey\") &&\r\n !params.has(\"signed_envelope_xdr\") &&\r\n !params.has(\"signed_xdr\")\r\n ) {\r\n return;\r\n }\r\n\r\n clearTimeout(timeout);\r\n\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n\r\n // Clean URL (important UX polish)\r\n window.history.replaceState({}, document.title, window.location.pathname);\r\n\r\n resolve(result);\r\n };\r\n\r\n parseResult();\r\n window.addEventListener(\"popstate\", parseResult);\r\n });\r\n}\r\n\r\nexport function handleAlbedoCallback(): Record<string, string> | null {\r\n if (typeof window === \"undefined\") return null;\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n if (\r\n !params.has(\"pubkey\") &&\r\n !params.has(\"signed_envelope_xdr\") &&\r\n !params.has(\"signed_xdr\")\r\n ) {\r\n return null;\r\n }\r\n\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n\r\n // Clean URL\r\n window.history.replaceState({}, document.title, window.location.pathname);\r\n\r\n return result;\r\n}\r\n\r\nexport function waitForAlbedoPopup(): Promise<Record<string, string>> {\r\n return new Promise((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n reject(new Error(\"Albedo response timeout\"));\r\n }, 2 * 60 * 1000);\r\n\r\n function handler(event: MessageEvent) {\r\n if (\r\n event.origin !== window.location.origin ||\r\n event.data?.type !== \"ALBEDO_RESULT\"\r\n ) {\r\n return;\r\n }\r\n\r\n clearTimeout(timeout);\r\n window.removeEventListener(\"message\", handler);\r\n resolve(event.data.payload);\r\n }\r\n\r\n window.addEventListener(\"message\", handler);\r\n });\r\n}\r\n","import type {\r\n ConnectWalletResponse,\r\n SignTransactionResponse,\r\n SignAuthEntryResponse,\r\n SignTransactionOptions,\r\n SignAuthEntryOptions,\r\n} from \"../types\";\r\nimport { WalletType } from \"../types\";\r\nimport {\r\n waitForAlbedoPopup,\r\n waitForAlbedoResult,\r\n} from \"../utils/albedoCallback\";\r\nimport { openAlbedoPopup } from \"../utils/albedoCallback\";\r\n\r\nexport class AlbedoAdapter {\r\n readonly type = WalletType.ALBEDO;\r\n\r\n async isAvailable(): Promise<boolean> {\r\n return typeof window !== \"undefined\";\r\n }\r\n\r\n async connect(): Promise<ConnectWalletResponse> {\r\n const url = new URL(\"https://albedo.link\");\r\n\r\n url.searchParams.set(\"intent\", \"public-key\");\r\n url.searchParams.set(\"app_name\", \"Stellar Wallet Kit\");\r\n url.searchParams.set(\"network\", \"testnet\");\r\n url.searchParams.set(\r\n \"callback\",\r\n `${window.location.origin}/albedo-callback`\r\n );\r\n url.searchParams.set(\"origin\", window.location.origin);\r\n\r\n openAlbedoPopup(url.toString());\r\n\r\n const result = await waitForAlbedoPopup();\r\n\r\n if (!result.pubkey) {\r\n throw new Error(\"Albedo connection rejected\");\r\n }\r\n\r\n return {\r\n address: result.pubkey,\r\n publicKey: result.pubkey,\r\n };\r\n }\r\n\r\n async disconnect() {}\r\n\r\n async getPublicKey(): Promise<string | null> {\r\n return null;\r\n }\r\n\r\n async getNetwork(): Promise<string> {\r\n throw new Error(\"Albedo does not expose network\");\r\n }\r\n\r\n async signTransaction(\r\n xdr: string,\r\n _options?: SignTransactionOptions\r\n ): Promise<SignTransactionResponse> {\r\n const url = new URL(\"https://albedo.link\");\r\n\r\n url.searchParams.set(\"intent\", \"tx\");\r\n url.searchParams.set(\"xdr\", xdr);\r\n url.searchParams.set(\"app_name\", \"Stellar Wallet Kit\");\r\n url.searchParams.set(\"network\", \"testnet\");\r\n url.searchParams.set(\"callback\", window.location.href);\r\n url.searchParams.set(\"origin\", window.location.origin);\r\n\r\n window.location.href = url.toString();\r\n\r\n const result = await waitForAlbedoResult();\r\n\r\n if (!result.signed_envelope_xdr) {\r\n throw new Error(\"Albedo signing rejected\");\r\n }\r\n\r\n return { signedTxXdr: result.signed_envelope_xdr };\r\n }\r\n\r\n async signAuthEntry(\r\n entryXdr: string,\r\n _options?: SignAuthEntryOptions\r\n ): Promise<SignAuthEntryResponse> {\r\n const url = new URL(\"https://albedo.link\");\r\n\r\n url.searchParams.set(\"intent\", \"sign-auth-entry\");\r\n url.searchParams.set(\"xdr\", entryXdr);\r\n url.searchParams.set(\"app_name\", \"Stellar Wallet Kit\");\r\n url.searchParams.set(\"network\", \"testnet\");\r\n url.searchParams.set(\"callback\", window.location.href);\r\n url.searchParams.set(\"origin\", window.location.origin);\r\n\r\n window.location.href = url.toString();\r\n\r\n const result = await waitForAlbedoResult();\r\n\r\n if (!result.signed_xdr) {\r\n throw new Error(\"Albedo auth entry rejected\");\r\n }\r\n\r\n return { signedAuthEntry: result.signed_xdr };\r\n }\r\n}\r\n","import React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n PropsWithChildren,\r\n} from \"react\";\r\nimport { WalletType, NetworkType } from \"../types\";\r\nimport type {\r\n WalletContextValue,\r\n WalletAccount,\r\n StellarWalletKitConfig,\r\n WalletInfo,\r\n SignTransactionOptions,\r\n SignAuthEntryOptions,\r\n SignTransactionResponse,\r\n SignAuthEntryResponse,\r\n WalletAdapter,\r\n} from \"../types\";\r\n\r\nimport { FreighterAdapter } from \"../adapters/FreighterAdapter\";\r\nimport { fetchAccountBalances } from \"../utils/balanceUtils\";\r\nimport { AlbedoAdapter } from \"../adapters/AlbedoAdapter\";\r\n\r\nconst DEFAULT_SUPPORTS = {\r\n silentReconnect: false,\r\n networkDetection: false,\r\n authEntrySigning: false,\r\n};\r\n\r\nconst WalletContext = createContext<WalletContextValue | undefined>(undefined);\r\n\r\nconst STORAGE_KEY = \"stellar_wallet_kit\";\r\n\r\ninterface StorageData {\r\n selectedWallet: WalletType | null;\r\n autoConnect: boolean;\r\n}\r\n\r\nconst getStorageData = (): StorageData => {\r\n if (typeof window === \"undefined\") {\r\n return { selectedWallet: null, autoConnect: false };\r\n }\r\n try {\r\n const data = localStorage.getItem(STORAGE_KEY);\r\n return data\r\n ? JSON.parse(data)\r\n : { selectedWallet: null, autoConnect: false };\r\n } catch {\r\n return { selectedWallet: null, autoConnect: false };\r\n }\r\n};\r\n\r\nconst setStorageData = (data: Partial<StorageData>) => {\r\n if (typeof window === \"undefined\") return;\r\n try {\r\n const existing = getStorageData();\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ ...existing, ...data }));\r\n } catch (error) {\r\n console.error(\"Failed to save to localStorage:\", error);\r\n }\r\n};\r\n\r\n// Check if we're in a browser environment\r\nconst isBrowser = typeof window !== \"undefined\";\r\n\r\n// Wallet registry - add new wallet adapters here\r\nconst walletAdapters: Record<WalletType, WalletAdapter> = {\r\n [WalletType.FREIGHTER]: new FreighterAdapter(),\r\n [WalletType.ALBEDO]: new AlbedoAdapter(),\r\n};\r\n\r\nconst walletMetadata: Record<WalletType, Omit<WalletInfo, \"installed\">> = {\r\n [WalletType.FREIGHTER]: {\r\n id: WalletType.FREIGHTER,\r\n name: \"Freighter\",\r\n icon: \"https://stellar.creit.tech/wallet-icons/freighter.svg\",\r\n description: \"Freighter browser extension wallet\",\r\n downloadUrl:\r\n \"https://chrome.google.com/webstore/detail/freighter/bcacfldlkkdogcmkkibnjlakofdplcbk\",\r\n kind: \"extension\",\r\n capabilities: {\r\n silentReconnect: true,\r\n networkDetection: true,\r\n authEntrySigning: true,\r\n },\r\n },\r\n\r\n [WalletType.ALBEDO]: {\r\n id: WalletType.ALBEDO,\r\n name: \"Albedo\",\r\n icon: \"https://stellar.creit.tech/wallet-icons/albedo.svg\",\r\n description: \"Web-based Stellar wallet\",\r\n kind: \"web\",\r\n capabilities: {\r\n silentReconnect: false,\r\n networkDetection: false,\r\n authEntrySigning: true,\r\n },\r\n },\r\n};\r\n\r\ntype WalletProviderProps = PropsWithChildren<{\r\n config?: StellarWalletKitConfig;\r\n}>;\r\n\r\nexport function WalletProvider({ config = {}, children }: WalletProviderProps) {\r\n const [account, setAccount] = useState<WalletAccount | null>(null);\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [network, setNetwork] = useState<NetworkType>(\r\n config.network || NetworkType.TESTNET\r\n );\r\n const [selectedWallet, setSelectedWallet] = useState<WalletType | null>(null);\r\n const [availableWallets, setAvailableWallets] = useState<WalletInfo[]>([]);\r\n const [isLoadingBalances, setIsLoadingBalances] = useState(false);\r\n\r\n const isConnected = !!account;\r\n\r\n // Check available wallets on mount\r\n useEffect(() => {\r\n if (!isBrowser) return;\r\n\r\n const checkWallets = async () => {\r\n const wallets: WalletInfo[] = [];\r\n\r\n for (const [type, adapter] of Object.entries(walletAdapters)) {\r\n const walletType = type as WalletType;\r\n const meta = walletMetadata[walletType];\r\n\r\n let installed = true;\r\n\r\n if (meta.kind === \"extension\") {\r\n installed = await adapter.isAvailable();\r\n }\r\n\r\n wallets.push({\r\n ...meta,\r\n installed,\r\n });\r\n }\r\n\r\n setAvailableWallets(wallets);\r\n };\r\n\r\n checkWallets();\r\n }, []);\r\n\r\n // Auto-connect on mount if configured\r\n useEffect(() => {\r\n if (!isBrowser) return;\r\n\r\n const autoConnectWallet = async () => {\r\n const storage = getStorageData();\r\n\r\n if (config.autoConnect && storage.selectedWallet) {\r\n try {\r\n await connect(storage.selectedWallet);\r\n } catch (err) {\r\n console.error(\"Auto-connect failed:\", err);\r\n }\r\n }\r\n };\r\n\r\n autoConnectWallet();\r\n }, [config.autoConnect]);\r\n\r\n const refreshBalances = useCallback(async () => {\r\n if (!account?.publicKey) {\r\n return;\r\n }\r\n\r\n setIsLoadingBalances(true);\r\n try {\r\n const balances = await fetchAccountBalances(account.publicKey, network);\r\n setAccount((prev) => (prev ? { ...prev, balances } : null));\r\n } catch (err) {\r\n console.error(\"Failed to fetch balances:\", err);\r\n // Don't set error state for balance fetch failures\r\n } finally {\r\n setIsLoadingBalances(false);\r\n }\r\n }, [account?.publicKey, network]);\r\n\r\n const connect = useCallback(\r\n async (walletType?: WalletType) => {\r\n setIsConnecting(true);\r\n setError(null);\r\n\r\n try {\r\n const typeToConnect =\r\n walletType || config.defaultWallet || WalletType.FREIGHTER;\r\n const adapter = walletAdapters[typeToConnect];\r\n\r\n if (!adapter) {\r\n throw new Error(`Wallet adapter not found for ${typeToConnect}`);\r\n }\r\n\r\n const meta = walletMetadata[typeToConnect];\r\n\r\n if (meta.kind === \"extension\") {\r\n const available = await adapter.isAvailable();\r\n if (!available) {\r\n throw new Error(`${meta.name} is not installed`);\r\n }\r\n }\r\n\r\n const response = await adapter.connect();\r\n\r\n const newAccount: WalletAccount = {\r\n address: response.address,\r\n publicKey: response.publicKey,\r\n displayName: `${response.address.slice(\r\n 0,\r\n 4\r\n )}...${response.address.slice(-4)}`,\r\n };\r\n\r\n setAccount(newAccount);\r\n setSelectedWallet(typeToConnect);\r\n setStorageData({ selectedWallet: typeToConnect, autoConnect: true });\r\n\r\n // Fetch balances after connecting\r\n try {\r\n const balances = await fetchAccountBalances(\r\n response.publicKey,\r\n network\r\n );\r\n setAccount((prev) => (prev ? { ...prev, balances } : null));\r\n } catch (balanceError) {\r\n console.error(\"Failed to fetch initial balances:\", balanceError);\r\n // Don't fail the connection if balance fetch fails\r\n }\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error(\"Failed to connect wallet\");\r\n setError(error);\r\n throw error;\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n },\r\n [config.defaultWallet]\r\n );\r\n\r\n const disconnect = useCallback(async () => {\r\n try {\r\n if (selectedWallet) {\r\n const adapter = walletAdapters[selectedWallet];\r\n await adapter.disconnect();\r\n }\r\n\r\n setAccount(null);\r\n setSelectedWallet(null);\r\n setError(null);\r\n setStorageData({ selectedWallet: null, autoConnect: false });\r\n } catch (err) {\r\n const error =\r\n err instanceof Error ? err : new Error(\"Failed to disconnect wallet\");\r\n setError(error);\r\n throw error;\r\n }\r\n }, [selectedWallet]);\r\n\r\n const signTransaction = useCallback(\r\n async (\r\n xdr: string,\r\n options?: SignTransactionOptions\r\n ): Promise<SignTransactionResponse> => {\r\n if (!selectedWallet) {\r\n throw new Error(\"No wallet connected\");\r\n }\r\n\r\n const adapter = walletAdapters[selectedWallet];\r\n return adapter.signTransaction(xdr, options);\r\n },\r\n [selectedWallet]\r\n );\r\n\r\n const signAuthEntry = useCallback(\r\n async (\r\n entryXdr: string,\r\n options?: SignAuthEntryOptions\r\n ): Promise<SignAuthEntryResponse> => {\r\n if (!selectedWallet) {\r\n throw new Error(\"No wallet connected\");\r\n }\r\n\r\n const adapter = walletAdapters[selectedWallet];\r\n return adapter.signAuthEntry(entryXdr, options);\r\n },\r\n [selectedWallet]\r\n );\r\n\r\n const switchNetwork = useCallback(\r\n async (newNetwork: NetworkType) => {\r\n setNetwork(newNetwork);\r\n // Refresh balances when network changes\r\n if (account?.publicKey) {\r\n await refreshBalances();\r\n }\r\n },\r\n [account?.publicKey, refreshBalances]\r\n );\r\n\r\n // Auto-refresh balances periodically\r\n useEffect(() => {\r\n if (!account?.publicKey || !isBrowser) return;\r\n\r\n // Initial balance fetch\r\n refreshBalances();\r\n\r\n // Set up periodic refresh (every 30 seconds)\r\n const interval = setInterval(() => {\r\n refreshBalances();\r\n }, 30000);\r\n\r\n return () => clearInterval(interval);\r\n }, [account?.publicKey, refreshBalances]);\r\n\r\n const supports = useMemo(() => {\r\n if (!selectedWallet) {\r\n return DEFAULT_SUPPORTS;\r\n }\r\n\r\n const meta = walletMetadata[selectedWallet];\r\n return {\r\n silentReconnect: !!meta.capabilities?.silentReconnect,\r\n networkDetection: !!meta.capabilities?.networkDetection,\r\n authEntrySigning: !!meta.capabilities?.authEntrySigning,\r\n };\r\n }, [selectedWallet]);\r\n\r\n const value = useMemo<WalletContextValue>(\r\n () => ({\r\n account,\r\n isConnected,\r\n isConnecting,\r\n error,\r\n network,\r\n selectedWallet,\r\n connect,\r\n disconnect,\r\n signTransaction,\r\n signAuthEntry,\r\n switchNetwork,\r\n availableWallets,\r\n refreshBalances,\r\n isLoadingBalances,\r\n supports,\r\n }),\r\n [\r\n account,\r\n isConnected,\r\n isConnecting,\r\n error,\r\n network,\r\n selectedWallet,\r\n connect,\r\n disconnect,\r\n signTransaction,\r\n signAuthEntry,\r\n switchNetwork,\r\n availableWallets,\r\n refreshBalances,\r\n isLoadingBalances,\r\n supports,\r\n ]\r\n );\r\n\r\n return (\r\n <WalletContext.Provider value={value}>{children}</WalletContext.Provider>\r\n );\r\n}\r\n\r\nexport function useWallet(): WalletContextValue {\r\n const context = useContext(WalletContext);\r\n if (context === undefined) {\r\n throw new Error(\"useWallet must be used within a WalletProvider\");\r\n }\r\n return context;\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport type { ModalProps } from '../types';\r\n\r\nexport function WalletModal({\r\n isOpen,\r\n onClose,\r\n wallets,\r\n onSelectWallet,\r\n theme,\r\n appName = 'Your App',\r\n appIcon,\r\n}: ModalProps) {\r\n useEffect(() => {\r\n const onEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n\r\n if (isOpen) {\r\n document.addEventListener('keydown', onEsc);\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('keydown', onEsc);\r\n document.body.style.overflow = 'auto';\r\n };\r\n }, [isOpen, onClose]);\r\n\r\n if (!isOpen) return null;\r\n\r\n const isDark =\r\n theme?.mode === 'dark' ||\r\n (theme?.mode === 'auto' &&\r\n window.matchMedia('(prefers-color-scheme: dark)').matches);\r\n\r\n const bg = theme?.modalBackground || (isDark ? '#0f0f11' : '#ffffff');\r\n const text = theme?.textColor || (isDark ? '#ffffff' : '#0a0a0a');\r\n const muted = isDark ? '#8b8b8b' : '#6b6b6b';\r\n const border = isDark ? '#1f1f23' : '#eaeaea';\r\n const hover = theme?.buttonHoverColor || (isDark ? '#1a1a1f' : '#f6f6f6');\r\n\r\n return (\r\n <>\r\n <style>{`\r\n .swk-overlay {\r\n position: fixed;\r\n inset: 0;\r\n background: rgba(0,0,0,0.55);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 9999;\r\n }\r\n\r\n .swk-modal {\r\n width: 420px;\r\n max-width: 92vw;\r\n background: ${bg};\r\n border-radius: 20px;\r\n padding: 28px;\r\n box-shadow: 0 20px 60px rgba(0,0,0,0.4);\r\n font-family: ${theme?.fontFamily || 'Inter, system-ui, sans-serif'};\r\n }\r\n\r\n .swk-wallet {\r\n display: flex;\r\n align-items: center;\r\n gap: 14px;\r\n padding: 14px 16px;\r\n border-radius: 14px;\r\n cursor: pointer;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .swk-wallet:hover {\r\n background: ${hover};\r\n }\r\n\r\n .swk-pill {\r\n font-size: 12px;\r\n padding: 4px 10px;\r\n border-radius: 999px;\r\n background: ${theme?.primaryColor || '#6c5ce7'};\r\n color: white;\r\n font-weight: 500;\r\n }\r\n `}</style>\r\n\r\n <div className=\"swk-overlay\" onClick={onClose}>\r\n <div className=\"swk-modal\" onClick={(e) => e.stopPropagation()}>\r\n {/* Header */}\r\n <div style={{ marginBottom: 24 }}>\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 12,\r\n marginBottom: 8,\r\n }}\r\n >\r\n {appIcon && (\r\n <img\r\n src={appIcon}\r\n alt=\"\"\r\n style={{ width: 32, height: 32, borderRadius: 8 }}\r\n />\r\n )}\r\n <span style={{ color: muted, fontSize: 14 }}>\r\n Log in or sign up\r\n </span>\r\n </div>\r\n\r\n <h2\r\n style={{\r\n margin: 0,\r\n fontSize: 22,\r\n fontWeight: 600,\r\n color: text,\r\n }}\r\n >\r\n {appName}\r\n </h2>\r\n </div>\r\n\r\n {/* Wallet list */}\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {wallets.map((wallet, i) => (\r\n <div\r\n key={wallet.id}\r\n className=\"swk-wallet\"\r\n onClick={() => onSelectWallet(wallet.id)}\r\n >\r\n <img\r\n src={wallet.icon}\r\n alt={wallet.name}\r\n style={{ width: 36, height: 36, borderRadius: 10 }}\r\n />\r\n\r\n <div style={{ flex: 1 }}>\r\n <div\r\n style={{\r\n fontSize: 15,\r\n fontWeight: 500,\r\n color: text,\r\n }}\r\n >\r\n {wallet.name}\r\n </div>\r\n\r\n {wallet.description && (\r\n <div\r\n style={{\r\n fontSize: 13,\r\n color: muted,\r\n marginTop: 2,\r\n }}\r\n >\r\n {wallet.description}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {i === 0 && <div className=\"swk-pill\">Recent</div>}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n marginTop: 24,\r\n paddingTop: 16,\r\n borderTop: `1px solid ${border}`,\r\n textAlign: 'center',\r\n fontSize: 13,\r\n color: muted,\r\n }}\r\n >\r\n Powered by Stellar Wallet Kit\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport { useWallet } from '../context/WalletContext';\r\nimport { WalletModal } from './WalletModal';\r\nimport type { WalletTheme } from '../types';\r\nimport { getNativeBalance, formatBalance } from '../utils/balanceUtils';\r\n\r\ninterface ConnectButtonProps {\r\n label?: string;\r\n theme?: WalletTheme;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n showBalance?: boolean;\r\n onConnect?: () => void;\r\n onDisconnect?: () => void;\r\n}\r\n\r\nexport function ConnectButton({\r\n label = 'Connect Wallet',\r\n theme,\r\n className,\r\n style,\r\n showBalance = false,\r\n onConnect,\r\n onDisconnect,\r\n}: ConnectButtonProps) {\r\n const {\r\n account,\r\n isConnected,\r\n isConnecting,\r\n connect,\r\n disconnect,\r\n availableWallets,\r\n selectedWallet,\r\n refreshBalances,\r\n isLoadingBalances,\r\n } = useWallet();\r\n\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [showDropdown, setShowDropdown] = useState(false);\r\n\r\n const themeMode = theme?.mode || 'light';\r\n const isDark = themeMode === 'dark' || (themeMode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);\r\n\r\n const defaultButtonStyles: React.CSSProperties = {\r\n padding: '12px 24px',\r\n borderRadius: theme?.borderRadius || '12px',\r\n border: 'none',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s',\r\n fontFamily: theme?.fontFamily || '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n ...style,\r\n };\r\n\r\n const connectButtonStyles: React.CSSProperties = {\r\n ...defaultButtonStyles,\r\n backgroundColor: theme?.primaryColor || '#8b5cf6',\r\n color: '#ffffff',\r\n };\r\n\r\n const accountButtonStyles: React.CSSProperties = {\r\n ...defaultButtonStyles,\r\n backgroundColor: isDark ? '#252525' : '#f5f5f5',\r\n color: theme?.textColor || (isDark ? '#ffffff' : '#000000'),\r\n border: `1px solid ${isDark ? '#333333' : '#e5e5e5'}`,\r\n position: 'relative',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n };\r\n\r\n const dropdownStyles: React.CSSProperties = {\r\n position: 'absolute',\r\n top: 'calc(100% + 8px)',\r\n right: 0,\r\n backgroundColor: theme?.modalBackground || (isDark ? '#1a1a1a' : '#ffffff'),\r\n border: `1px solid ${isDark ? '#333333' : '#e5e5e5'}`,\r\n borderRadius: theme?.borderRadius || '12px',\r\n padding: '8px',\r\n minWidth: '200px',\r\n boxShadow: isDark ? '0 4px 16px rgba(0, 0, 0, 0.4)' : '0 4px 16px rgba(0, 0, 0, 0.1)',\r\n zIndex: 1000,\r\n };\r\n\r\n const dropdownItemStyles: React.CSSProperties = {\r\n padding: '12px 16px',\r\n border: 'none',\r\n background: 'none',\r\n cursor: 'pointer',\r\n width: '100%',\r\n textAlign: 'left',\r\n fontSize: '14px',\r\n color: theme?.textColor || (isDark ? '#ffffff' : '#000000'),\r\n borderRadius: '8px',\r\n transition: 'background-color 0.2s',\r\n fontFamily: 'inherit',\r\n };\r\n\r\n const handleConnect = async (walletType: any) => {\r\n try {\r\n await connect(walletType);\r\n setIsModalOpen(false);\r\n onConnect?.();\r\n } catch (error) {\r\n console.error('Connection error:', error);\r\n }\r\n };\r\n\r\n const handleDisconnect = async () => {\r\n try {\r\n await disconnect();\r\n setShowDropdown(false);\r\n onDisconnect?.();\r\n } catch (error) {\r\n console.error('Disconnect error:', error);\r\n }\r\n };\r\n\r\n const copyAddress = () => {\r\n if (account?.address) {\r\n navigator.clipboard.writeText(account.address);\r\n // You could add a toast notification here\r\n setShowDropdown(false);\r\n }\r\n };\r\n\r\n if (isConnecting) {\r\n return (\r\n <button\r\n className={className}\r\n style={connectButtonStyles}\r\n disabled\r\n >\r\n Connecting...\r\n </button>\r\n );\r\n }\r\n\r\n if (!isConnected || !account) {\r\n return (\r\n <>\r\n <button\r\n className={className}\r\n style={connectButtonStyles}\r\n onClick={() => setIsModalOpen(true)}\r\n >\r\n {label}\r\n </button>\r\n <WalletModal\r\n isOpen={isModalOpen}\r\n onClose={() => setIsModalOpen(false)}\r\n wallets={availableWallets}\r\n onSelectWallet={handleConnect}\r\n theme={theme}\r\n />\r\n </>\r\n );\r\n }\r\n\r\n const walletIcon = availableWallets.find(w => w.id === selectedWallet)?.icon;\r\n const nativeBalance = account?.balances ? getNativeBalance(account.balances) : null;\r\n const formattedBalance = nativeBalance ? formatBalance(nativeBalance, 2) : null;\r\n\r\n return (\r\n <>\r\n <div style={{ position: 'relative' }}>\r\n <button\r\n className={className}\r\n style={accountButtonStyles}\r\n onClick={() => setShowDropdown(!showDropdown)}\r\n >\r\n {walletIcon && (\r\n <img\r\n src={walletIcon}\r\n alt=\"Wallet\"\r\n style={{ width: '20px', height: '20px', borderRadius: '4px' }}\r\n />\r\n )}\r\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px' }}>\r\n <span>{account.displayName}</span>\r\n {showBalance && formattedBalance && (\r\n <span style={{ fontSize: '12px', opacity: 0.7, fontWeight: 400 }}>\r\n {isLoadingBalances ? '...' : `${formattedBalance} XLM`}\r\n </span>\r\n )}\r\n </div>\r\n <span style={{ fontSize: '12px', opacity: 0.7 }}>▼</span>\r\n </button>\r\n\r\n {showDropdown && (\r\n <>\r\n <div\r\n style={{\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n zIndex: 999,\r\n }}\r\n onClick={() => setShowDropdown(false)}\r\n />\r\n <div style={dropdownStyles}>\r\n <button\r\n style={dropdownItemStyles}\r\n onClick={() => {\r\n refreshBalances();\r\n setShowDropdown(false);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = theme?.buttonHoverColor || (isDark ? '#333333' : '#f0f0f0');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n 🔄 Refresh Balances\r\n </button>\r\n <button\r\n style={dropdownItemStyles}\r\n onClick={copyAddress}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = theme?.buttonHoverColor || (isDark ? '#333333' : '#f0f0f0');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n 📋 Copy Address\r\n </button>\r\n <button\r\n style={{\r\n ...dropdownItemStyles,\r\n color: '#ef4444',\r\n }}\r\n onClick={handleDisconnect}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = theme?.buttonHoverColor || (isDark ? '#333333' : '#f0f0f0');\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n 🚪 Disconnect\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </>\r\n );\r\n}"]}