A secure React Native cryptocurrency wallet supporting Bitcoin and Ethereum, built with Expo.
- 🔐 Secure Wallet Creation: Generate new wallets with 12-word mnemonic phrases
- 📱 Import Existing Wallets: Import wallets using recovery phrases
- 💰 Multi-Currency Support: Bitcoin (BTC) and Ethereum (ETH)
- 📊 Balance Tracking: View real-time balances for all supported currencies
- 💸 Send Transactions: Send Bitcoin and Ethereum to any address
- 📨 Receive Funds: Generate QR codes and share addresses
- 🔒 Secure Storage: Private keys stored securely on device using Expo SecureStore
- 🎨 Modern UI: Clean, intuitive interface with Material Design principles
Screenshots would be added here in a real project
- Node.js (v14 or higher)
- npm or yarn
- Expo CLI (
npm install -g expo-cli
) - iOS Simulator (for iOS development) or Android Emulator (for Android development)
- Clone the repository:
git clone <repository-url>
cd crypto-wallet
- Install dependencies:
npm install
# or
yarn install
- Start the development server:
npm start
# or
yarn start
- Run on your preferred platform:
- iOS: Press
i
in the terminal or scan QR code with Camera app - Android: Press
a
in the terminal or scan QR code with Expo Go app - Web: Press
w
in the terminal
crypto-wallet/
├── App.js # Main app component with navigation
├── src/
│ ├── screens/ # App screens
│ │ ├── WelcomeScreen.js
│ │ ├── CreateWalletScreen.js
│ │ ├── ImportWalletScreen.js
│ │ ├── WalletScreen.js
│ │ ├── SendScreen.js
│ │ ├── ReceiveScreen.js
│ │ └── SettingsScreen.js
│ └── utils/
│ └── cryptoUtils.js # Cryptocurrency utilities
├── package.json
├── app.json # Expo configuration
└── README.md
- React Native: Cross-platform mobile development
- Expo: Development platform and tools
- React Navigation: Navigation library
- bitcoinjs-lib: Bitcoin operations
- ethers: Ethereum operations
- bip39: Mnemonic phrase generation and validation
- expo-secure-store: Secure local storage
- react-native-qrcode-svg: QR code generation
- Mnemonic Generation: Cryptographically secure 12-word recovery phrases
- Secure Storage: Private keys encrypted and stored locally using Expo SecureStore
- No Server Storage: All sensitive data stays on your device
- Address Validation: Validates Bitcoin and Ethereum addresses before transactions
- Open the app and tap "Create New Wallet"
- Write down your 12-word recovery phrase securely
- Confirm you've saved the phrase
- Your wallet is ready to use!
- Open the app and tap "Import Existing Wallet"
- Enter your 12-word recovery phrase
- Tap "Import Wallet"
- Your wallet will be restored with all addresses
- Go to the "Send" tab
- Select Bitcoin or Ethereum
- Enter the recipient's address
- Enter the amount to send
- Review and confirm the transaction
- Go to the "Receive" tab
- Select Bitcoin or Ethereum
- Share your address or QR code
- The sender can use either to send you funds
This demo app includes mock implementations for:
- Balance fetching: Returns static demo balances
- Transaction broadcasting: Returns mock transaction hashes
- Price data: Shows placeholder USD values
For a production app, you would need to:
-
Connect to real blockchain networks:
- Bitcoin: Use services like BlockCypher, Blockstream API, or run your own Bitcoin node
- Ethereum: Use Infura, Alchemy, or other Ethereum providers
-
Implement real transaction broadcasting:
- Construct and sign actual transactions
- Broadcast to the respective networks
- Handle transaction confirmations
-
Add price feeds:
- Integrate with CoinGecko, CoinMarketCap, or other price APIs
- Calculate real USD values for balances
-
Enhanced security:
- Add biometric authentication
- Implement transaction limits
- Add multi-signature support
// Example using BlockCypher API
const getBitcoinBalance = async (address) => {
const response = await fetch(`https://api.blockcypher.com/v1/btc/main/addrs/${address}/balance`);
const data = await response.json();
return (data.balance / 100000000).toString(); // Convert satoshis to BTC
};
// Example using Infura
const provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_API_KEY');
const getEthereumBalance = async (address) => {
const balance = await provider.getBalance(address);
return ethers.utils.formatEther(balance);
};
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- Never share your private keys or mnemonic phrase
- Always verify recipient addresses before sending
- Test with small amounts first
- Keep your recovery phrase in a safe, offline location
- This is a demo app - use caution with real funds
This project is licensed under the MIT License - see the LICENSE file for details.
This is a demo cryptocurrency wallet for educational purposes. While it implements security best practices, it should not be used with real funds without thorough testing and security audits. Cryptocurrency transactions are irreversible, and lost private keys cannot be recovered.
For questions or support, please open an issue on GitHub or contact the development team.
Built with ❤️ using React Native and Expo