Packages: core (BIP39/32/44/49/84/86 derivation, WIF), keystore (PBKDF2 + AES-GCM), psbt, p2p (BIP157/158 SPV daemon, Dandelion++ broadcast with relay-echo verification), blockbook, rpc, electrum, net, bns, web-ui (React/Vite), mobile (Expo). ops/ holds the nginx vhost, systemd unit and push.sh deploy script for digibyte.x/web.
114 lines
5.9 KiB
Markdown
114 lines
5.9 KiB
Markdown
# @dgb-wallet/mobile
|
|
|
|
DigiByte.X Wallet — React Native (Expo) app. Ports the same recovery-first UI as `@dgb-wallet/web-ui` using React Native primitives (`View`/`Text`/`Pressable` instead of `div`/`button`).
|
|
|
|
Shares the same crypto core via the monorepo workspace — no re-implementation of address derivation or PSBT signing.
|
|
|
|
## Prerequisites
|
|
|
|
- Node 20+ (already installed)
|
|
- **Android Studio** with:
|
|
- Android SDK (API 34+ recommended)
|
|
- An Android emulator device (e.g., Pixel 6 running Android 14)
|
|
- `ANDROID_HOME` env var set (usually `%LOCALAPPDATA%\Android\Sdk`)
|
|
- Java JDK 17 (Android Studio bundles one)
|
|
|
|
## First run
|
|
|
|
```powershell
|
|
cd "D:\Dev\SilentCode\Digibyte"
|
|
|
|
# 1. Install (installs Expo + RN + polyfills in packages/mobile)
|
|
npm install
|
|
|
|
# 2. Start Android emulator from Android Studio (Device Manager > play)
|
|
|
|
# 3. Boot the app
|
|
npm run android -w @dgb-wallet/mobile
|
|
```
|
|
|
|
First launch takes ~5 min: Metro bundles ~2000 modules, Expo compiles the dev client, APK installs on emulator. Subsequent launches are seconds.
|
|
|
|
## What's in the box (v0.0.2)
|
|
|
|
- **Three tabs**, bottom navigation via `@react-navigation/bottom-tabs`:
|
|
- **Import** — paste seed, live BIP39 validation, derive all 5 descriptor paths, show first 5 addresses per path.
|
|
- **Balance** — derive BIP84 xpub, POST to the wallet daemon at `http://10.0.2.2:5174/balance` (Android emulator alias for host localhost), show totalSats + UTXO list + filter/block/timing stats.
|
|
- **Send** — build & sign a BIP84 P2WPKH tx, broadcast via daemon; toggle between Dandelion++ (default) and direct fan-out.
|
|
|
|
Balance and Send both talk to `@dgb-wallet/p2p`'s daemon over HTTP — run it in a separate terminal before opening those tabs:
|
|
|
|
```powershell
|
|
npm run daemon -w @dgb-wallet/p2p
|
|
```
|
|
|
|
For an iOS simulator, edit `src/rpc-native.ts` and switch `DAEMON_URL` to `http://127.0.0.1:5174` — the `10.0.2.2` alias is Android-emulator-only.
|
|
|
|
## Verified state
|
|
|
|
- `tsc --noEmit` passes cleanly on `packages/mobile` (once `npm install` has run at the repo root — the `@react-navigation/*`, `react-native-screens`, and `react-native-safe-area-context` deps hoist into `packages/mobile/node_modules`).
|
|
- The daemon HTTP contract that `src/rpc-native.ts` calls (`POST /balance` with `{xpub, purpose, account, gapLimit}`, `POST /broadcast` with `{hex}`) is verified end-to-end via the `@dgb-wallet/web-ui` package, which hits the same daemon endpoints with the same crypto core. The mobile screens are a straight React Native port of those flows.
|
|
- **Emulator boot is blocked on Intel VT-x being disabled in BIOS** on the current dev machine — see next section.
|
|
|
|
## Requires: hardware virtualization
|
|
|
|
Android x86 emulators need a hypervisor. On Windows that means either **AEHD** (Android Emulator Hypervisor Driver, HAXM's successor) or **WHPX** (Windows Hypervisor Platform). Both silently fall over if Intel VT-x / AMD-V is off in firmware.
|
|
|
|
**Check first:**
|
|
|
|
```powershell
|
|
Get-CimInstance Win32_Processor | Select-Object Name, VirtualizationFirmwareEnabled, SecondLevelAddressTranslationExtensions
|
|
```
|
|
|
|
If `VirtualizationFirmwareEnabled` is `False`, no software fix will work — reboot into BIOS/UEFI, find "Intel Virtualization Technology" / "VT-x" (typically under Advanced → CPU Configuration or Security), enable it, save, boot back to Windows.
|
|
|
|
**Then install AEHD (already downloaded with the SDK):**
|
|
|
|
```powershell
|
|
cd "$env:LOCALAPPDATA\Android\Sdk\extras\google\Android_Emulator_Hypervisor_Driver"
|
|
.\silent_install.bat # runs elevated via UAC
|
|
sc query aehd # STATE should say RUNNING
|
|
```
|
|
|
|
If AEHD's service is already registered but stops with `sc start aehd` returning `error 4294967201` (`ERROR_NOT_SUPPORTED`), that's the VT-x-off symptom — driver installed fine, but the CPU refuses to enter root mode. Fix in BIOS.
|
|
|
|
**Then boot the emulator normally:**
|
|
|
|
```powershell
|
|
& "$env:LOCALAPPDATA\Android\Sdk\emulator\emulator.exe" -avd Pixel_3a_API_30_x86
|
|
```
|
|
|
|
## Crypto polyfills — the non-obvious bit
|
|
|
|
React Native has no `crypto` or `Buffer` globals like Node/browser. This app plugs those gaps via:
|
|
|
|
- `react-native-quick-crypto` — implements Node's `crypto` API using native code (fast, correct)
|
|
- `buffer` npm package — Buffer polyfill
|
|
- `react-native-get-random-values` — polyfills `crypto.getRandomValues` used by `bip39.generateMnemonic`
|
|
|
|
All wired up in `index.js` (loads BEFORE any app code) and `metro.config.js` (aliases so bitcoinjs-lib et al find them).
|
|
|
|
## Layout
|
|
|
|
```
|
|
packages/mobile/
|
|
├── app.json Expo config (name, package, orientation)
|
|
├── babel.config.js babel-preset-expo
|
|
├── index.js Entry — installs crypto polyfill THEN app
|
|
├── metro.config.js Monorepo + Node-shim resolution
|
|
├── src/
|
|
│ ├── App.tsx Root (header + bottom-tab navigation)
|
|
│ ├── ImportScreen.tsx Recovery UX in RN primitives
|
|
│ ├── BalanceScreen.tsx P2P daemon /balance client
|
|
│ ├── SendScreen.tsx P2P build+sign+broadcast (Dandelion default)
|
|
│ ├── derive.ts Same as web-ui/src/derive.ts (kept parallel for now)
|
|
│ ├── rpc-native.ts Fetch helpers pointed at 10.0.2.2:5174
|
|
│ └── styles.ts Shared StyleSheet across screens
|
|
└── tsconfig.json extends expo's base config
|
|
```
|
|
|
|
## Known limitations at this scaffold stage
|
|
|
|
- **No on-device run yet.** Balance/Send tabs are wired against the daemon HTTP contract that the browser web-ui exercises today, but they haven't run on an actual Android surface — that's blocked by VT-x on this workstation (see previous section). A physical Android phone with USB debugging would unblock the same verification without touching BIOS.
|
|
- No secure keystore integration yet — imported seeds live in component state only. Production will use `expo-secure-store` (Android Keystore / iOS Keychain).
|
|
- Send tab uses BIP84 only, single account, flat 5000-sat fee (same demo scope as web-ui).
|