A production-ready mobile wallet for the Voi Network and Algorand blockchain ecosystem. Built with React Native, Expo, and TypeScript.
- Multi-Account Support: Create, import, and manage multiple accounts
- Ledger Hardware Wallet: Full support for Ledger device integration via Bluetooth
- WalletConnect v2: Connect to dApps securely
- ARC-200 & ARC-72: Support for fungible and non-fungible tokens
- Network Switching: Seamless switching between Voi Network and Algorand Mainnet
- Envoi Integration: Human-readable names for addresses
- Transaction History: Complete transaction tracking and details
- Secure Storage: PIN protection and biometric authentication
- Account Rekeying: Advanced account security features
- Node.js (v18 or later recommended)
- npm or yarn
- Expo CLI
- iOS Simulator (macOS) or Android Emulator
# Clone the repository
git clone https://github.com/xarmain/voi-wallet.git
cd voi-wallet
# Install dependencies
npm install
# Start the development server
npm startThe app expects a WalletConnect v2 project ID at build time. Set the environment variable before running or building:
export EXPO_PUBLIC_WALLETCONNECT_PROJECT_ID=your_project_id
npm startFor EAS builds, configure the same variable (or WALLETCONNECT_PROJECT_ID) via eas secret:create or the env block in eas.json.
# iOS
npm run ios
# Android
npm run android
# Web
npm run web# Build for Android (APK)
eas build --platform android --profile preview
# Build for iOS (IPA)
eas build --platform ios --profile preview
# Build for both platforms
eas build --platform all --profile preview# Android (AAB for Play Store)
eas build --platform android --profile production
# iOS (IPA for App Store)
eas build --platform ios --profile productionBuild profiles:
development: Development builds with Expo Dev Clientpreview: APK/IPA for direct installation and testingproduction: App bundles/IPAs optimized for store submission
# Lint TypeScript code
npm run lint
# Auto-fix linting issues
npm run lint:fix
# Format code with Prettier
npm run format
# Type check
npm run typecheckvoi-wallet/
├── src/
│ ├── components/ # Reusable UI components
│ ├── screens/ # Screen components
│ ├── navigation/ # Navigation configuration
│ ├── services/ # Business logic and API integrations
│ ├── store/ # Zustand state management
│ ├── contexts/ # React contexts
│ ├── hooks/ # Custom React hooks
│ ├── utils/ # Utility functions
│ ├── types/ # TypeScript type definitions
│ └── config/ # App configuration
├── assets/ # Images, fonts, and other static assets
├── App.tsx # Application entry point
└── app.config.js # Expo configuration
- Private keys are stored using Expo SecureStore
- PIN authentication with a hardware-backed 6-digit code stored via SecureStore
- Optional biometric authentication (Face ID/Touch ID/Fingerprint)
- Transaction signing requires authentication
- No private keys are ever transmitted
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- Follow TypeScript best practices
- Maintain 2-space indentation
- Run
npm run lintandnpm run typecheckbefore committing - Use conventional commit messages (feat, fix, chore, etc.)
- Keep PRs focused and under 300 LOC when possible
- Framework: React Native with Expo
- Language: TypeScript
- State Management: Zustand
- Navigation: React Navigation
- Blockchain SDK: algosdk
- Hardware Wallet: Ledger (@ledgerhq packages)
- dApp Protocol: WalletConnect v2
- Styling: React Native StyleSheet
- Voi Network: Primary network (Mainnet)
- Algorand: Algorand Mainnet support
- Gotcha Guide - Common pitfalls and best practices
- Contributing Guidelines - How to contribute to this project
This project is licensed under the MIT License - see the LICENSE file for details.
For issues, questions, or contributions, please open an issue on GitHub.
Built with ❤️ for the Voi Network community
