Mobile Wallet
The Monolythium Mobile Wallet is a React Native application built with Expo 54, designed for iOS and Android. It provides wallet creation and import, sending and receiving LYTH (with QR codes), staking, multi-network management, a contact book, and profile-based access control.
Overview
| Property | Details |
|---|---|
| Stack | React Native 0.81, Expo 54, TypeScript 5.9, Expo Router 6 |
| Platforms | iOS, Android |
| Crypto | Pure TypeScript -- @noble/curves, @noble/hashes, @scure/bip32, bip39 |
| Secure Storage | expo-secure-store (iOS Keychain / Android Keystore) |
| State Management | Zustand 5, TanStack Query 5 |
| UI Framework | NativeWind (TailwindCSS 3 for React Native) |
| Chain Client | Direct Cosmos REST API calls (no heavy SDK dependency) |
Installation
iOS
The Monolythium Wallet will be available on the App Store. During the beta period, you can install it via TestFlight.
Android
The Monolythium Wallet will be available on Google Play. During the beta period, you can install the APK directly from the GitHub Releases page.
Building from Source
# Clone the repository
git clone https://github.com/mono-labs-org/mobile-wallet.git
cd mobile-wallet
# Install dependencies
npm install --legacy-peer-deps
# Start Expo dev server
npx expo start
# Press 'i' for iOS simulator or 'a' for Android emulator
The project requires the --legacy-peer-deps flag due to a peer dependency mismatch between React 19 and some Expo packages. An .npmrc file is included in the repository with this setting.
Creating a Profile
On first launch, the app displays a splash screen, then navigates to the Profile flow.
1. Create Profile
- Tap Create New Profile.
- Enter a profile name (this is displayed in the app header).
- Set a password. This password protects access to the app and is required to unlock it after the auto-lock timeout.
The password hash is stored securely in the device's encrypted keychain (iOS) or keystore (Android) via expo-secure-store.
2. Unlock Profile
On subsequent launches, you will see the Unlock screen. Enter your password to proceed to the dashboard.
Creating a Wallet
After your profile is set up, you can create or import a wallet.
Create New Wallet
- Navigate to Create Wallet (from the dashboard or after profile creation).
- The app generates a BIP39 mnemonic seed phrase. You can choose:
- 24-word mnemonic (256-bit entropy, default)
- 12-word mnemonic (128-bit entropy)
- Write down your seed phrase on paper. Do not take a screenshot.
- Confirm your seed phrase by selecting the words in the correct order.
- The wallet derives your addresses using the appropriate HD path:
m/44'/60'/0'/0/0for EthSecp256k1 chains (Monolythium)m/44'/118'/0'/0/0for standard Cosmos chains
Import Existing Wallet
- Navigate to Import Wallet.
- Enter your BIP39 mnemonic phrase (12 or 24 words).
- The wallet validates the mnemonic and derives your addresses.
Each wallet stores its private key in expo-secure-store (encrypted by the OS) and its metadata (name, addresses, network assignment) in AsyncStorage.
Sending LYTH
- From the dashboard, tap on a wallet to view its details.
- Tap Send.
- Enter the recipient address (bech32
mono1...or EVM0x...format). - Enter the amount in LYTH.
- Review the transaction details.
- Tap Confirm Send.
- The app signs the transaction locally using the private key from secure storage and broadcasts it to the chain via the Cosmos REST API.
An alert dialog confirms the transaction hash on success.
Receiving LYTH
- From a wallet detail screen, tap Receive.
- The receive screen displays:
- A QR code encoding your address (for easy scanning by the sender)
- Your bech32 address (
mono1...) - Your EVM address (
0x...) if applicable
- Tap an address to copy it to the clipboard.
- Tap Share Address to send your address via the OS share sheet (Messages, AirDrop, email, etc.).
Both addresses refer to the same on-chain account. Use bech32 for Cosmos tools and EVM for Ethereum-compatible tools.
Staking
The Staking tab provides a full staking interface with two sub-tabs: Validators and Delegations.
Viewing Validators
The Validators tab lists all active validators on the current network, sorted by voting power. Each entry shows:
- Rank
- Validator moniker (name)
- Total staked tokens
- Commission rate
- Jailed status (if applicable)
Pull down to refresh the validator list.
Delegate
- Find a validator and tap Delegate.
- A bottom sheet appears prompting you for the amount (LYTH) to delegate.
- Tap Confirm Delegate.
- The app builds a
MsgDelegatetransaction, signs it, and broadcasts it.
Unbond
- Switch to the Delegations tab to see your active delegations.
- Tap Unbond on a delegation.
- Enter the amount to unbond.
- Tap Confirm Unbond.
The unbonding period on Monolythium is 3 days, after which your tokens become available.
Claim Rewards
When you have unclaimed rewards, a rewards banner appears at the top of the staking screen showing the total unclaimed amount. Tap Claim to withdraw all pending rewards across your delegations.
Multi-Network Switching
The mobile wallet supports multiple Monolythium networks and Cosmos ecosystem chains. Network configuration is defined in the built-in chain registry, which includes:
- Monolythium Sprintnet (testnet)
- Monolythium Testnet
- Monolythium Mainnet
- Monolythium Localnet
Each network has its own RPC endpoints, chain ID, denomination, and staking parameters. You can switch the active network from the Settings tab or the network selector.
When you switch networks, the wallet uses the appropriate HD path and key algorithm for that chain, deriving the correct address format automatically.
Contacts
The Contacts tab provides an address book for saving frequently used addresses.
- Add a contact: Enter a name, address, network, and optional notes.
- Tap a contact to copy the address or use it in a send transaction.
- Contacts are stored locally in
AsyncStorageon the device.
Security
Secure Key Storage
Private keys are stored in expo-secure-store, which uses:
- iOS: The Keychain Services API with hardware-backed encryption
- Android: The Android Keystore system
Private keys never leave secure storage in plaintext except when signing a transaction in memory.
PIN / Password Protection
The app requires a password to unlock your profile on each launch. The password hash is stored in expo-secure-store, and the app checks it before granting access to wallet functionality.
Auto-Lock
The app supports a configurable auto-lock timer (default: 5 minutes). After the timeout period of inactivity, the profile is locked and the unlock screen is displayed.
Biometrics
The settings store includes a biometrics_enabled option for future Face ID / fingerprint unlock support.
Backup and Recovery
Backing Up Your Wallet
Your BIP39 mnemonic seed phrase is the only backup you need. With it, you can restore your wallet in any compatible application (the Monolythium Desktop Wallet, Keplr, MetaMask, or any BIP39-compatible wallet using the same HD path).
Best practices:
- Write your seed phrase on paper (or use a metal backup plate).
- Store it in a secure, offline location.
- Never share your seed phrase with anyone.
- Never enter your seed phrase into a website.
Restoring a Wallet
- Install the Monolythium Mobile Wallet on a new device.
- Create a new profile.
- Select Import Wallet.
- Enter your 12- or 24-word mnemonic seed phrase.
- Your addresses and balances will be restored automatically from the chain.
Transaction history is queried from the chain's REST API, so all on-chain activity is available once you restore.
Settings
The Settings tab provides the following options:
| Setting | Options | Default |
|---|---|---|
| Theme | Dark, Light | Dark |
| Accent Color | Blue, Green, Purple | Blue |
| Language | English | English |
| Currency | USD | USD |
| Auto-lock timer | Configurable | 5 minutes |
| Biometrics | Enabled / Disabled | Disabled |
Troubleshooting
App crashes on launch
Clear the app data (or reinstall) and restore your wallet from your mnemonic seed phrase.
Transaction fails
Ensure your wallet has sufficient balance to cover the transfer amount plus gas fees. On Monolythium, the minimum gas price is 20 gwei (20,000,000,000 alyth).
Staking rewards not showing
Pull down to refresh the staking screen. Rewards are queried from the chain's REST API and may take a few seconds to update after a new block.