This document describes the comprehensive Freighter wallet integration for Stellar blockchain authentication and transaction signing, addressing issue #2.
The Freighter wallet integration provides seamless Stellar blockchain authentication, transaction signing, account management, and balance display functionality. It includes all required components with proper error handling, mobile compatibility, and security best practices.
-
Wallet Connection Interface
- Automatic Freighter detection
- One-click wallet connection
- Connection status management
- Error handling for failed connections
-
Transaction Signing Functionality
- XDR transaction signing
- Custom transaction creation
- Transaction preview
- User confirmation prompts
-
Account Balance Display
- Real-time balance updates
- Multiple token support
- USD value conversion
- Historical balance tracking
-
Network Switching Support
- Public, Testnet, and Futurenet support
- Automatic network detection
- Seamless network switching
- Network-specific configurations
-
Connection Status Management
- Real-time connection monitoring
- Automatic reconnection handling
- Connection state persistence
- Status indicators
-
Error Handling for Failed Connections
- Comprehensive error messages
- User-friendly error display
- Automatic retry mechanisms
- Fallback options
frontend/src/
├── components/
│ ├── Wallet/
│ │ ├── FreighterConnect.tsx # Wallet connection component
│ │ ├── TransactionSigner.tsx # Transaction signing interface
│ │ ├── AccountManager.tsx # Account management interface
│ │ ├── BalanceDisplay.tsx # Balance display component
│ │ └── index.ts # Component exports
│ └── ui/
│ └── Card.tsx # UI card component
├── hooks/
│ └── useFreighter.ts # Main wallet hook
├── services/
│ └── freighterService.ts # Freighter API service
└── pages/
└── WalletDemo.tsx # Demo page
Props:
onConnect?: (publicKey: string) => void- Callback on successful connectiononDisconnect?: () => void- Callback on disconnectionclassName?: string- Additional CSS classesshowStatus?: boolean- Show connection statuscompact?: boolean- Compact display mode
Features:
- Automatic Freighter detection
- Installation prompt for non-users
- Connection status display
- Address copying functionality
Props:
onTransactionSigned?: (signedXdr: string) => void- Callback on successful signingonTransactionFailed?: (error: Error) => void- Callback on failureclassName?: string- Additional CSS classesshowPreview?: boolean- Show transaction previewallowCustomXDR?: boolean- Allow custom transaction creation
Features:
- XDR transaction signing
- Custom transaction creation
- Transaction preview
- Explorer integration
Props:
onAccountChange?: (publicKey: string) => void- Callback on account changeonNetworkChange?: (network: string) => void- Callback on network changeclassName?: string- Additional CSS classesshowNetworkSelector?: boolean- Show network selectorcompact?: boolean- Compact display mode
Features:
- Account information display
- Network switching
- Balance display
- Security notifications
Props:
className?: string- Additional CSS classesshowTokens?: boolean- Show token balancesshowPercentageChange?: boolean- Show percentage changesrefreshInterval?: number- Auto-refresh intervalcompact?: boolean- Compact display modelarge?: boolean- Large display mode
Features:
- Real-time balance updates
- Multiple token support
- USD value conversion
- Historical tracking
Returns:
{
// Connection state
isConnected: boolean;
isConnecting: boolean;
account: FreighterAccount | null;
// Balance state
balance: FreighterBalance | null;
isLoadingBalance: boolean;
// Network state
network: FreighterNetwork | null;
isLoadingNetwork: boolean;
// Availability
isFreighterAvailable: boolean;
isCheckingAvailability: boolean;
// Actions
connect: () => Promise<void>;
disconnect: () => Promise<void>;
refreshBalance: () => Promise<void>;
switchNetwork: (network: string) => Promise<void>;
signTransaction: (xdr: string) => Promise<string>;
// Utilities
getErrorMessage: (error: unknown) => string;
isValidAddress: (address: string) => boolean;
}Methods:
isAvailable(): Promise<boolean>- Check if Freighter is availableconnect(): Promise<FreighterAccount>- Connect to walletdisconnect(): Promise<void>- Disconnect from walletgetBalance(publicKey: string): Promise<FreighterBalance>- Get account balancegetNetwork(): Promise<FreighterNetwork>- Get current networkswitchNetwork(network: Networks): Promise<void>- Switch networksignTransaction(xdr: string, network: Networks): Promise<string>- Sign transactioncreateAndSignPayment(): Promise<string>- Create and sign paymentgetConnectionStatus(): Promise<boolean>- Check connection status
import { FreighterConnect } from './components/Wallet';
function MyComponent() {
const handleConnect = (publicKey: string) => {
console.log('Connected:', publicKey);
};
return (
<FreighterConnect
onConnect={handleConnect}
showStatus={true}
/>
);
}import { TransactionSigner } from './components/Wallet';
function TransactionComponent() {
const handleSigned = (signedXdr: string) => {
console.log('Transaction signed:', signedXdr);
};
return (
<TransactionSigner
onTransactionSigned={handleSigned}
showPreview={true}
allowCustomXDR={true}
/>
);
}import { useFreighter } from './hooks/useFreighter';
function WalletComponent() {
const {
isConnected,
account,
balance,
connect,
disconnect,
signTransaction
} = useFreighter();
const handleSign = async () => {
try {
const signed = await signTransaction(transactionXdr);
console.log('Signed:', signed);
} catch (error) {
console.error('Signing failed:', error);
}
};
return (
<div>
{isConnected ? (
<div>
<p>Connected: {account?.publicKey}</p>
<p>Balance: {balance?.native} XLM</p>
<button onClick={handleSign}>Sign Transaction</button>
<button onClick={disconnect}>Disconnect</button>
</div>
) : (
<button onClick={connect}>Connect Wallet</button>
)}
</div>
);
}| Criteria | Status | Implementation |
|---|---|---|
| Connection request → wallet connects | ✅ | FreighterConnect component |
| Transaction → Freighter prompts for approval | ✅ | TransactionSigner component |
| Network switch → wallet updates network | ✅ | AccountManager component |
| Disconnection → wallet disconnects cleanly | ✅ | useFreighter hook |
| Balance check → displays current balance | ✅ | BalanceDisplay component |
| Error states handled gracefully | ✅ | Comprehensive error handling |
| Security best practices implemented | ✅ | Secure key management |
| Mobile compatible | ✅ | Responsive design |
-
Private Key Security
- Private keys never leave Freighter wallet
- No key storage in application
- Secure transaction signing
-
Connection Security
- HTTPS-only connections
- Domain validation
- Secure message passing
-
Transaction Security
- Transaction validation
- User confirmation required
- Replay attack prevention
-
Data Protection
- No sensitive data logging
- Secure data transmission
- Memory cleanup
- Responsive Design: All components adapt to mobile screens
- Touch Support: Touch-friendly interfaces
- Mobile Wallet Support: Works with Freighter mobile
- Cross-Platform: iOS and Android compatibility
- Chrome: Full support
- Firefox: Full support
- Safari: Full support
- Edge: Full support
- Mobile Browsers: Full support
Visit /wallet-demo to test all wallet functionality:
- Connection Test: Connect/disconnect wallet
- Balance Test: View account balance
- Transaction Test: Sign transactions
- Network Test: Switch between networks
- Error Test: Test error scenarios
# Install dependencies
npm install
# Start development server
npm start
# Navigate to wallet demo
http://localhost:3000/wallet-demo-
Freighter Not Installed
- Detection and installation prompt
- Clear error messages
- Alternative options
-
Connection Failed
- Automatic retry
- User-friendly messages
- Troubleshooting steps
-
Transaction Failed
- Detailed error information
- Transaction recovery
- User guidance
-
Network Issues
- Network switching
- Fallback options
- Status indicators
- Lazy Loading: Components load on demand
- Caching: Balance and network caching
- Debouncing: Prevent excessive API calls
- Memory Management: Proper cleanup
- Multi-Wallet Support: Support for other Stellar wallets
- Advanced Transactions: Complex transaction types
- Delegation: Delegated signing
- NFT Support: NFT balance display
- Analytics: Usage tracking and analytics
npm install @stellar/stellar-sdk react-hot-toast lucide-reactimport { FreighterConnect, useFreighter } from './components/Wallet';function App() {
return (
<div>
<FreighterConnect />
{/* Your app content */}
</div>
);
}npm start
# Visit http://localhost:3000/wallet-demoFor issues and questions:
- Check the demo page for usage examples
- Review the component documentation
- Test with different browsers and devices
- Check Freighter wallet documentation
- Create GitHub issues for bugs and feature requests
MIT License - see LICENSE file for details.