Commit 73f0933
Full i18n, MapLibre Places, language picker, chain stats, audio, SPV audit
This is a large release covering most of the remaining UX, service, and
tooling work:
- **i18n audit**: every user-facing string is now routed through `t()`
across 28 screens and 7 shared components. The catalog grew to 468 keys
per language in both English and Spanish with `{placeholder}`
interpolation support. A new language picker subscreen (`app/language.tsx`)
lists 20 languages with search, persists via kv-store, and re-renders
the entire tree on change. Accessible from Welcome and Settings.
- **Places map** (`app/map.tsx`): native-only screen showing places that
accept FairCoin, with search, bottom-sheet list, camera animation,
branded category markers, 3D pitch, and user-location FAB. Uses
`@maplibre/maplibre-react-native` with Carto voyager / dark-matter
tiles — fully free, no tokens, no usage limits. `app/map.web.tsx`
renders the "mobile only" fallback on web/electron.
- **Chain stats** (`app/chain.tsx`): new Network Status subscreen with
sync pill, block height, peer count (tappable), network type, and last
block time. Wired into Settings → Network.
- **Audio + notifications**: `src/services/sounds.ts` plays `sent.mp3`,
`received.mp3`, and `unlocked.mp3` via `expo-audio`.
`src/services/tx-notifier.ts` subscribes to the wallet store to fire
the received sound + a local notification on new incoming txs
(foreground only — background polling is stubbed pending wallet store
refactor). Hooks into lock / send / layout boot.
- **Centralized branding** (`src/core/branding.ts`): single source of
truth for `COIN_NAME`, `COIN_TICKER`, `COIN_SYMBOL`, `APP_NAME`,
`UNITS_PER_COIN`, `SMALLEST_UNIT_NAME` (m⊜), and explorer URL helpers
`explorerTxUrl(txid)` / `explorerAddressUrl(address)`. Every magic
literal (`100_000_000n`, `⊜`, `fairco.in` URLs, `FairCoin`,
`FAIRWallet`) now sources from here.
- **Amount formatting**: new reusable `<AmountInput>` and `<AmountText>`
components built on `react-number-format`'s `numericFormatter` helper
(RN-compatible, no DOM event hacks). Auto-formats thousands
separators and 8-decimal clamping while typing. Used across send,
balance display, transaction item, transaction detail, and coin control.
- **Function renames**: `formatSats` → `formatUnits`, `parseFairToSats`
→ `parseFairToUnits`, `<AmountText sats>` → `value`. User-facing
"satoshis"/"sats" strings replaced with `m⊜`. Internal computation
variables kept as-is.
- **File-based backup**: settings backup export/import now uses real
files via `expo-file-system` `File`/`Paths` API + `expo-document-picker`
+ `expo-sharing`. No clipboard, no `/legacy`.
- **Revolut parallax home**: hero image with reanimated translate and
overscroll zoom, `LinearGradient` fade, top bar overlaid with white
text + drop shadow for readability.
- **Material 3 nav rail**: responsive tab layout switches between bottom
bar (< 600px) and 80px-wide nav rail with 56×32 pill active indicator
(≥ 600px). Full-width content at every viewport.
- **Screen headers**: `<ScreenHeader>` gained an `onBack` convenience
prop. Every modal-presented screen (wallets, masternode, coin-control,
export-key, transaction, contacts, chain, language, map) has a proper
header with a back button and no Stack/nav header collision.
- **PIN screens**: lock and onboarding/pin-setup now show the app icon
logo (88px rounded) instead of the `⊜` glyph. `<PinPad>` gained
web/electron keyboard support (digits 0-9, Backspace, Delete).
- **Buy button**: new quick action on the home screen opens
`buy.fairco.in` in the in-app browser via `expo-web-browser`,
parameterized with the user's receive address, language, and country.
- **Transaction sent prompt**: after a successful send, a Bloom
`Prompt.Outer` shows the explorer link with Copy / Share (via
`expo-sharing`) / Done actions.
- **Custom 404**: `app/+not-found.tsx` renders a branded page-not-found
screen with a back button and a "back to wallet" CTA.
- **Settings SettingsListGroup**: the whole settings screen migrated to
Bloom's `SettingsListGroup` + `SettingsListItem`. Fixed duplicated
horizontal padding. Added language row + chain stats row + made
connected-peers row tappable.
- **Bloom bumps**: `@oxyhq/bloom` → `0.1.36` — includes duplicate-handle
fix in `Dialog`, native `name` prop on `Avatar` (deterministic
initial + color), and `setColorScheme` web guard.
- **SPV audit + tests** (see `SPV_AUDIT.md`): 23 modules audited, 222
unit tests passing across 9 test files (encoding, address, hd-wallet,
format-amount, transaction, quark-hash, network, bloom-filter,
messages). Found and fixed a **critical Quark hash bug** — the pure-TS
BLAKE-512 collapsed all 80-byte inputs to the same digest. Replaced
with `@noble/hashes/blake1`'s `blake512`. Documented 7 remaining bugs
and 15 missing SPV features for follow-up, including the most urgent:
`wallet-store.onTransaction` is empty so received funds never update
the wallet — **blocker for wallet usability**. Also missing: header
PoW validation, reorg detection and UTXO rewind, BIP44 cursor
persistence. See `SPV_AUDIT.md` for the full checklist and priorities.
- **Tooling**: `bun test` as the test runner (no jest/vitest), `@types/bun`
for test types, `bun-types` in `tsconfig.json`. `image-types.d.ts`
ambient declarations for `.jpg`/`.png` imports. Electron menus
(File / Edit / View / Wallet / Help with cross-platform accelerators).
- **Predictive back gesture** enabled in `app.json` for Android 13+.
- **Electron fixes**: `fairwallet://` registered as a privileged scheme,
`ElectronSocketProvider` rewritten to honour the Promise-based IPC
contract, custom protocol handler fixed for absolute asset paths,
`electron` installed as a dev dep, application menus.
- **QR scanner**: redesigned with Revolut-style L-corner indicators,
torch toggle, animated scan line (reanimated), branded chrome.
- **Contacts**: Google Contacts-inspired redesign with pill search,
full-screen edit modal, underlined Material-style inputs, `ContactAvatar`
wrapper over Bloom's `Avatar` `name` prop (deterministic initial +
color). Long-press menu now uses a Bloom `Prompt` instead of RN
`Alert.alert`. **Zero `Alert.alert` references remain in the codebase.**
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent 8779103 commit 73f0933
72 files changed
Lines changed: 7142 additions & 671 deletions
File tree
- app
- (tabs)
- onboarding
- peers
- transaction
- assets/sounds
- src
- core
- data
- i18n
- p2p
- services
- ui/components
- wallet
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
58 | | - | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
59 | 72 | | |
60 | 73 | | |
61 | 74 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
| |||
54 | 55 | | |
55 | 56 | | |
56 | 57 | | |
57 | | - | |
| 58 | + | |
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| |||
65 | 66 | | |
66 | 67 | | |
67 | 68 | | |
68 | | - | |
| 69 | + | |
69 | 70 | | |
70 | 71 | | |
71 | 72 | | |
| |||
76 | 77 | | |
77 | 78 | | |
78 | 79 | | |
79 | | - | |
| 80 | + | |
80 | 81 | | |
81 | 82 | | |
82 | 83 | | |
| |||
87 | 88 | | |
88 | 89 | | |
89 | 90 | | |
90 | | - | |
| 91 | + | |
91 | 92 | | |
92 | 93 | | |
93 | 94 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | | - | |
44 | 43 | | |
45 | | - | |
46 | 44 | | |
47 | 45 | | |
48 | 46 | | |
| |||
71 | 69 | | |
72 | 70 | | |
73 | 71 | | |
74 | | - | |
75 | 72 | | |
76 | 73 | | |
77 | 74 | | |
| |||
80 | 77 | | |
81 | 78 | | |
82 | 79 | | |
83 | | - | |
84 | 80 | | |
85 | 81 | | |
86 | 82 | | |
| |||
109 | 105 | | |
110 | 106 | | |
111 | 107 | | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
112 | 114 | | |
113 | 115 | | |
114 | 116 | | |
| |||
120 | 122 | | |
121 | 123 | | |
122 | 124 | | |
123 | | - | |
124 | | - | |
125 | | - | |
| 125 | + | |
126 | 126 | | |
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
131 | | - | |
| 131 | + | |
132 | 132 | | |
133 | 133 | | |
134 | 134 | | |
| |||
170 | 170 | | |
171 | 171 | | |
172 | 172 | | |
173 | | - | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
178 | | - | |
179 | | - | |
180 | | - | |
181 | | - | |
| 173 | + | |
| 174 | + | |
182 | 175 | | |
183 | 176 | | |
184 | 177 | | |
| |||
249 | 242 | | |
250 | 243 | | |
251 | 244 | | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
| 245 | + | |
| 246 | + | |
256 | 247 | | |
257 | 248 | | |
258 | 249 | | |
259 | 250 | | |
260 | 251 | | |
261 | | - | |
262 | | - | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
269 | | - | |
270 | | - | |
271 | | - | |
272 | | - | |
273 | | - | |
274 | | - | |
275 | | - | |
276 | 252 | | |
277 | 253 | | |
278 | 254 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
| 45 | + | |
| 46 | + | |
46 | 47 | | |
47 | 48 | | |
48 | 49 | | |
| |||
92 | 93 | | |
93 | 94 | | |
94 | 95 | | |
95 | | - | |
96 | | - | |
97 | | - | |
| 96 | + | |
98 | 97 | | |
99 | 98 | | |
100 | 99 | | |
| |||
113 | 112 | | |
114 | 113 | | |
115 | 114 | | |
116 | | - | |
117 | | - | |
118 | | - | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
119 | 125 | | |
120 | 126 | | |
121 | 127 | | |
| |||
188 | 194 | | |
189 | 195 | | |
190 | 196 | | |
191 | | - | |
| 197 | + | |
192 | 198 | | |
193 | 199 | | |
194 | 200 | | |
| |||
201 | 207 | | |
202 | 208 | | |
203 | 209 | | |
204 | | - | |
| 210 | + | |
205 | 211 | | |
206 | 212 | | |
207 | 213 | | |
208 | 214 | | |
209 | | - | |
| 215 | + | |
210 | 216 | | |
211 | 217 | | |
212 | 218 | | |
213 | 219 | | |
214 | | - | |
| 220 | + | |
215 | 221 | | |
216 | 222 | | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
217 | 228 | | |
218 | 229 | | |
219 | | - | |
| 230 | + | |
220 | 231 | | |
221 | 232 | | |
222 | 233 | | |
223 | 234 | | |
224 | | - | |
| 235 | + | |
225 | 236 | | |
226 | 237 | | |
227 | 238 | | |
| |||
237 | 248 | | |
238 | 249 | | |
239 | 250 | | |
240 | | - | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
241 | 255 | | |
242 | 256 | | |
243 | 257 | | |
244 | | - | |
| 258 | + | |
245 | 259 | | |
246 | 260 | | |
247 | 261 | | |
| |||
253 | 267 | | |
254 | 268 | | |
255 | 269 | | |
256 | | - | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
257 | 273 | | |
258 | 274 | | |
259 | | - | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
260 | 282 | | |
261 | 283 | | |
262 | 284 | | |
263 | 285 | | |
264 | 286 | | |
265 | 287 | | |
266 | 288 | | |
267 | | - | |
268 | | - | |
| 289 | + | |
| 290 | + | |
269 | 291 | | |
270 | 292 | | |
271 | 293 | | |
| |||
274 | 296 | | |
275 | 297 | | |
276 | 298 | | |
277 | | - | |
278 | | - | |
279 | | - | |
| 299 | + | |
280 | 300 | | |
281 | 301 | | |
282 | 302 | | |
| |||
309 | 329 | | |
310 | 330 | | |
311 | 331 | | |
312 | | - | |
| 332 | + | |
313 | 333 | | |
314 | 334 | | |
315 | 335 | | |
316 | 336 | | |
317 | 337 | | |
318 | | - | |
| 338 | + | |
319 | 339 | | |
320 | 340 | | |
321 | 341 | | |
322 | 342 | | |
323 | 343 | | |
324 | 344 | | |
325 | 345 | | |
326 | | - | |
| 346 | + | |
327 | 347 | | |
328 | 348 | | |
329 | 349 | | |
330 | 350 | | |
331 | 351 | | |
332 | | - | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
333 | 355 | | |
334 | 356 | | |
335 | 357 | | |
| |||
0 commit comments