Releases: BoldBitcoinWallet/BoldWallet
v3.1.0
BoldWallet v3.1.0 – Loading Annoucements/Quotes Manchette, Semver Update Checks & Testnet / Dev Settings Hardening
✨ What's new
Loading screen & rolling quotes
- Quotes manchette — DB-first cache plus background sync of remote
QUOTES.md(configloading_quotes_json), refresh when the app returns to the foreground, and a bottom ticker on the unlock screen. - Animated marquee — horizontal scrolling quotes to keep the lock screen light; duration scales with content length; safe-area and typography tuned for iOS vs Android.
- Rich text in the strip —
**bold**segments render bold in both the animated marquee and the reduced-motion static path. - Tappable links in quotes —
__<https://…>__, optional__<url>(title)__, and bare__https://…__open in the system browser; static path uses the same rules for accessibility. - Motion & lifecycle — respects reduced motion; mounts after a short delay when the app is active to avoid jank on cold start.
Updates & version UX
- Semver-aware comparison —
compareSemver()compares the installed app to the GitHubBoldWalletlatest release tag so “newer version” detection is consistent. - Themed toasts on the lock screen —
LoadingScreenmountsToastwithcreateToastConfig(theme)so feedback matches the rest of the app while unauthenticated. - Manual “up to date” — when the user checks from the version chip and the installed build already matches the latest release, a success toast confirms it.
Wallet Settings & network safety
- Advanced / HD tuning — developer-oriented controls (e.g. gap limit, scan range) and clearer network switch confirmations.
- Testnet guard — when developer mode is off, flows avoid leaving the wallet on testnet unintentionally.
Native MPC & smaller BBMTLib surface
- Single
mpcSignPSBTon Android — removed the duplicate@ReactMethodoverload (explicit keyshare vs stored keyshare) that could trigger Duplicate method name mpcSignPSBT / JS runtime failure; one bridge path remains: PSBT signing with keyshare loaded from native secure storage (Kotlin / iOS.m/ Swift aligned). - BBMTLib — dropped legacy single-key Bitcoin send / WIF signing helpers from
Tsswhere superseded by MPC flows (smaller native API surface).
Mempool settings data
getStoredUserMempoolApiBaseFromDb()— reads the raw user-saved REST base fromapp_configonly (no public defaults), for prefilling settings / onboarding URL fields when nothing custom is stored.
Safer visuals on low-end devices
ParticlesErrorBoundary— if the particle layer throws during render, the error boundary disables heavy animation so weaker hardware is less likely to crash on the loading screen.
💛 No servers. No seed phrases. Just sovereign sats.
🔗 Learn more at boldbitcoinwallet.com
🔐 PGP public key at boldwallet-publickey.asc
📎 SHA256: app-release.apk.sha256
a1b569a8f8ef349a2e4a042ba20790cae3e13dde9b9a373d92e24c9d92adb0b2
🔑 SHA256-PGP-Signature: app-release.apk.sha256.asc
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEmqm9HSMiBJd7uQil0mO1cs3oHIwFAmnPfIUACgkQ0mO1cs3o
HIyqURAA0uLoKGdEaq920Mn1/gBwoh9jL1knMKBhvjFDSHK/SadHtdHRqZxs31Zd
paTNv5am2WhnM1UCGA/GcYeTKoen9heaguoE+/KcQBGu0wtzsATidJ8eSwbENuQp
T9w4g6sGqcSo/OSu0HNHowzQFFUtYiu4Au3J7I5mR/XbH/+7DfVhNFRL57btwS5m
bmQXdpe6VbKproP7BG+4RppaVTGan19dlEEULjkfqiXIWf7plIv9pK96ict7/7Y2
WLzbZnurdVZXj6yK7BdYebOAVIqcln3QJ14y/dRHs3RV2Dg3cyBLr4n3QGFl+noq
1ZRhnqbnJCvgF6K69TVOLJKZ66wSIFAbu/8xb9igtumi8gPQb8iZUok3G/ze0eIL
pQnV1kmaiTaIRbLhoI01O6UUpDkvpP9geCA6ocouJmJRaubvNiXdk2UOpSwfubYs
CBu8gL1N2H83uJN7R2G4BIDPcvX9rAR8rIHCDwBIj74kqDrTlV7h1WW642j1BBjo
AUDwlsOq2DTAPpUeb59IYJRKqIeAyJn59SbZ0dMqYBk0jgMQ7qj4gcN4c02b43Pi
LrlK7bvgDQ8wIGhWCkW93s/bykSVXvgIiQe+klqkICabDRlUNW4b84/7ixrWK21J
P9LuDlICNlQxra52k8/PAhFB1+FJ8u9rH2MGzqXIPz7FeNMcD20=
=ccc+
-----END PGP SIGNATURE-----
APK signature
This APK is signed with the official BoldWallet keystore.
Do not mix it with the F-Droid/Zapstore or other stores’ signed builds. Stick to one source for updates.
v3.0.7
BoldWallet v3.0.7 – Versions Updates Awareness & Mempool Validatio & Native Keyshare Enhancements
✨ What's new
Loading screen & updates
- Release awareness: Compares the installed app to GitHub
BoldWalletlatest release so users can see when a newer build exists. - Version chip: Shows version and build on the loading screen; background check runs quietly once the local version is known (manual flow can still drive UI).
- Safer visuals on low-end devices: A particle animation error boundary turns off heavy effects if rendering fails, avoiding crashes on weaker hardware.
Keyshare metadata for everyday wallet use
- Public fields only:
saveKeyshareMetadata/getKeyshareMetadatakeep committee keys, npub, and path-related metadata in EncryptedStorage plus a DB mirror—routine flows avoid parsing the full MPC JSON. - Wallet-wide adoption:
WalletService, home/contexts, and pairing use metadata wherever a full secret parse isn’t required; pairing still saves full metadata when the document is stored.
MPC keyshare stays on the device
- No full keyshare over the JS bridge for send/sign:
mpcSendBTCWithUTXOs,nostrMpcSendBTC, andnostrMpcSignPSBTload the keyshare from native secure storage (same layout asreact-native-encrypted-storage), not from JavaScript strings. - New native helpers:
getKeyshareNostrPrepJSONfor minimal Nostr prep JSON,mpcSignPSBTfor server-path PSBT signing from storage, andaesEncryptStoredKeyshareto encrypt using the stored blob without exposing it in JS. - Streamlined Nostr send:
nostrMpcSendBTCis UTXO multi-path only;nsecand signing material come from native storage. - Legacy paths removed: Old APIs that passed the full keyshare from JS (
mpcSendBTC,nostrMpcSendBTCWithUTXOswith JS keyshare) are gone so the contract stays “secrets in native code.”
Mempool API you can trust
- Validate before save: Custom Mempool REST URLs are checked with a live
/blocks/tip/hashrequest (with timeout) so bad URLs don’t get persisted. - One place for “which API?”:
resolveStoredMempoolApiBase()plus shared normalization (including/api), a canonical testnet base, and guards so testnet isn’t accidentally pointed at mainnet’s default host. - Smarter failover context: Helpers distinguish public mainnet mirror pools from private/self-hosted endpoints so round-robin behavior stays correct.
Cleaner transaction list code
transactionListUtils: Shared sorting and amount helpers for mempool-shaped txs, with unit tests in__tests__/transactionListUtils.test.ts.KeyshareMetadatatyping:types/keyshare.d.tsmatches the metadata layer.
Fixes & reliability
- iOS keyshare handling: Staging buffers for bridge key material are zeroed where practical; if JSON is huge or partially unparsable,
nseccan still be recovered (including regex fallback) with clearer diagnostics for Nostr prep. - Mempool settings UX: Saving and using custom endpoints is aligned with validation and network-specific rules end to end.
- Changelog & versioning: App metadata bumped to 3.0.7 (Android/iOS build 57) and documented in
CHANGELOG.md.
💛 No servers. No seed phrases. Just sovereign sats.
🔗 Learn more at boldbitcoinwallet.com
🔐 PGP public key at boldwallet-publickey.asc
📎 SHA256: app-release.apk.sha256
9584959bb47c5dcb176485536db5d1cd2bd2789e41b6723a1d2fb1fdd0153d7f
🔑 SHA256-PGP-Signature: app-release.apk.sha256.asc
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEmqm9HSMiBJd7uQil0mO1cs3oHIwFAmnODK4ACgkQ0mO1cs3o
HIwSXw//U8w03Vc7vnJehvUWOGqJMSlp8eG9X1ZOj7X4OybVZAbEpgzBuF4H+X0j
IKLoUETtIlwl99bea58z21w0dn+ZiC6Leo1BVvBYgdSwYzkgTJikY6fBRn/BwdHg
Y182/NXaw98jlCX/AIc1TDeFtJcZZem+Tr+dLUG3gZHMTI8dp4J2l4o/1xCbj6zR
wI8xm/R2EoIGN+2JjOqUfqUI/4wysmop0gs9shznfVNsTdz5IWPVR+iE+EJBS105
3928Mc3n0wFzxozGUgSjPFxYifP+y7bMM60no3FUlNtQms5sSrCxtC1VrzFvG+zV
tQ4VY4USZRGt3OH1TxtzKEvD7eBaMNfXfK/6axzMIIU3k5wI9Oq1e11+QdAPR7m9
EAUDESNn5Q9UmDdrbo/nz5JvuuVVkTYtJSyozDtSTN+jGyLtCDFbfyphRBFV9gFZ
STIeXZZC/xcsMcxQe1HsYRwV3/AVdt7oyx0TFWHK6uLekEiXiE0/ECbvIIRTjxyW
GP2kAFa9oF/3N17QZi0sOqmGLXtJgXgn2UmJJOpzih43DaywXy4U2jiRG45Im44l
VioIFgAct+OYUQA3gyDai8JIe4UyYNRArSn92ERrzd9i0WxdIwvFzvO4YXw77FpQ
fnR+m+VWZnaR+pOnj+1yXQw6oFE0QiFajz7bhE7BAv5uOq8rQ/s=
=ZMPT
-----END PGP SIGNATURE-----
APK signature
This APK is signed with the official BoldWallet keystore.
Do not mix it with the F-Droid/Zapstore or other stores signed build. Stick to one source for updates.
v3.0.6
BoldWallet v3.0.6 – Addresses Tab, Smart Ordering & Emulator-Friendly Builds
✨ What's new
New Addresses tab
- Dedicated addresses view: New
Addressestab with clear receive/change HD rows showing path, index, and address in one place. - Per-address balances: Each row shows BTC and fiat balance, so you can see where funds actually live at a glance.
- Direct receive flow: Tapping a row can open the receive modal directly for that specific address.
Address ordering modes
- Smart vs HD view: New toggle between AUTO (smart) and HD (derivation order) address ordering, persisted under your app settings.
- AUTO mode: Orders addresses by health tier, activity recency, derivation index, and then receive-before-change, so the “important” addresses float to the top.
- HD mode: Shows addresses strictly in derivation order for those who prefer a deterministic, path-first view.
Address health tiers & paging
- Health tiers: Each address is classified as Active, Used, or Unused using UTXOs, balance state, and last transaction metadata.
- Better scanning: The tiering makes it easier to spot dormant, active, and never-used addresses.
- Load-more paging: A “Show more” control extends the HD index window in small steps, reducing noise while keeping discovery cheap.
Smarter refresh behavior on addresses
- Per-row refresh: Manually refreshing from the addresses header now invalidates and re-syncs balance/UTXO state one address at a time, following a DB-first flow.
- Fresh receive data: Opening the receive modal from an address row first runs a targeted sync for that row, so the displayed balance and state are up to date.
- Visual polish: Address rows are easier to scan in dark mode, and header separators make groups clearer.
Easier Android emulator testing
- x86_64 native support: Android builds now ship with
x86_64along with ARM ABIs so the app runs smoothly on stock Android Studio emulators. - Crash-free AVDs: Avoids
libreactnative.sonot found / linker errors when launching on standard x86_64 system images. - Lean CI builds still possible: CI can still use ARM-only builds via
-PreactNativeArchitectures=armeabi-v7a,arm64-v8awhen emulator support isn’t needed.
Fixes & reliability
- Address auto-sorting: Improved auto-sorting and HD ordering so the addresses list remains stable and predictable as balances and activity change.
- Address tab rollout: Polished the addresses screen interactions and data wiring for a smoother first release.
- Changelog & versioning: Bumped app metadata to 3.0.6 (Android/iOS build 56) and documented the new flows.
💛 No servers. No seed phrases. Just sovereign sats.
🔗 Learn more at boldbitcoinwallet.com
🔐 PGP public key at boldwallet-publickey.asc
📎 SHA256: app-release.apk.sha256
e9b4a0f02b047a09bc8bacf660c3a0c77b6669011076ea177cecdcfeec75e3fb
🔑 SHA256-PGP-Signature: app-release.apk.sha256.asc
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEmqm9HSMiBJd7uQil0mO1cs3oHIwFAmnLeE8ACgkQ0mO1cs3o
HIwj1hAAw+IYwMmB22JqQeVciKDqvIiYcr9B00F+CUfbw0tWOHm4BtbAH23+3gx5
ii4j0WlHcaT6HD682UDytDJA6Csbo7kMMtkRu7IS4mzAZGsOtFw5wVdGtSoJPRNn
0Mvh2SCfMiKwVl6+QmfuVeS5TcgFPFbdTccsV1K0hJRMgwbQ+0AuNOo0/BqtHHfi
odHvaIQpbBm4V9w/aw/Kh8ixKBb+K/d8Q4FyvlQQKyLOoyTOV+qH76V/nqoKG7bo
ibMo1fI4lEnNnHIHXQQAA5Iy+LbIGgG3TZIBHfHu30Gkpx2TGlWuWQp4S2A5vngk
iHNnRgmh/z9pIZdETWgIkOqCZ7BYuhPM62yAZ5F6a9v6wnjdTLy4I2l5CKYs1RXl
20sLjsrfpf0i75XM21HNjD7Z5OMZwp3OYWWFLpZc2DU1uT1f9w3BFzfZUGTfRHJH
PTZId/xpWWSgX8p2HjwlnHB+sHz/wv+SM+RylMZvsmhE3/RsqzUH9W/NejzG82C/
qbTiFPUV4Q99ExfB+QZKXrVI+uX+XN+3nDgWHQNNIoNN/bB1KLselWSWyDhBMUaQ
R7DwpJNysXB2vQPDp246HzZevBOLIEt/bz4eTEyZCXty+0RJDxaPzoPJjqL0B/y/
OfXIKH2fggFmPdi9xRNVLdifk6S2EqT9OdVrSHxssezO8GPeLUQ=
=Km2U
-----END PGP SIGNATURE-----
APK signature
This APK is signed with the official BoldWallet keystore.
Do not mix it with the F-Droid/Zapstore or other stores signed build. Stick to one source for updates.
v3.0.5
BoldWallet v3.0.5 – Smarter Refresh, HD Restore & Resilience
✨ What's new
Tap vs long-press refresh
• Tap the cache indicator (or let background sync run) for a lightweight refresh — only the active set of addresses is synced (recent receive/change, UTXO holders, pending-tx addresses). Fast and gentle on the API.
• Long-press the cache indicator when you need a full rebuild: HD discovery plus balance, transaction, and UTXO sync over all addresses. Existing data is kept; only sync is re-run. A confirmation dialog appears before starting.
• Clear feedback so you know when a quick tap is enough versus when to run a full sync.
Abort while refreshing
• Tapping the cache indicator while a sync is in progress now offers to abort the current run. On confirm, all in-flight API calls stop and the “refreshing” state clears immediately.
• Handy when you started a full sync by mistake or the network is slow and you want to cancel.
Long-press uses full address list
• After a long-press full sync, transaction sync now uses the full wallet address list instead of only the active window, so all receive and change addresses are re-fetched and the list stays complete.
Keyshare restore: full re-indexing
• After restoring or importing a keyshare, the app runs full re-indexing: HD discovery plus balance, transaction, and UTXO sync before you reach the wallet.
• Restore defaults to mainnet and native SegWit only (no legacy or SegWit-compatible scan at import), so setup is faster. You can switch address type later in settings if needed.
• Progress is shown step-by-step: “Syncing balances…”, “Syncing transactions…”, “Syncing UTXOs…” with address counts (e.g. 3/9).
Round-robin and failover
• When you Skip API selection on first run (no custom endpoint), the app uses the public mempool host list and round-robins the first request across hosts. Load is spread and a slow or failing host doesn’t block you.
• When a request fails (e.g. 404 or 5xx) and multiple public hosts are in use, the client retries on the next host instead of failing immediately. Mirrors that don’t support every endpoint no longer break restore or sync, note that this does not apply to custom private user entered hosts (privacy preseved).
Sync error feedback
• Sync failures (timeouts, API errors) show a short message in the cache bar and “Tap to retry”. One toast explains that cached data is being used; no modal.
• Same behaviour on the home screen and UTXO screen.
Discovery timeout
• HD address discovery during keyshare restore uses a timeout per address check, so slow or congested APIs are less likely to abort the scan. Reduces “Index discovery incomplete” on poor networks.
Confirmations where it matters
• Long-press full sync and abort (tap-while-refreshing) both show a confirmation so you don’t trigger them by accident.
Fixes
• Fixed long-press full sync clearing existing cache first; it now keeps existing DB data and only runs discovery + full sync (no wipe).
• Fixed transaction sync after long-press still using the active address set; it now uses the full address list.
• Fixed keyshare restore not running full re-indexing (discovery + balance/tx/UTXO sync); restore now always runs the full pipeline.
• Fixed discovery and sync failing on slow APIs due to a short (5 s) timeout; discovery now uses a 20 s timeout and can override per request where needed.
• Fixed 404 (or other 4xx) from one public mirror failing the whole request; when round-robin is in use, the client now retries on the next host.
• Fixed round-robin being used even when a custom API was chosen; round-robin is now only used when you Skip (no custom base).
💛 No servers. No seed phrases. Just sovereign sats.
🔗 Learn more at boldbitcoinwallet.com
🔐 PGP public key at boldwallet-publickey.asc
📎 SHA256: app-release.apk.sha256
2afa950d368278f255bf343b3bc73cc5348880236d7673627ff83073bfb05e68
🔑 SHA256-PGP-Signature: app-release.apk.sha256.asc
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEmqm9HSMiBJd7uQil0mO1cs3oHIwFAmnA4XsACgkQ0mO1cs3o
HIwrsxAAmsbJ3xmzIqO4aaIB62311ou2F6jK8+eqeS6mCFC0qCZ8GcVEfatbHaar
ZrOiEzafwZWU1eNRzJSH+n1Dxfw3jj0Oh0w6BlrNgcp7jafDdwSy5nKL081gyZW5
vGZcPV5AOrRiEQtt+YH49+IV/mfU3eGTS2hsjxXIxlNU6XrA2xCsqH9NXeo7bRC3
9CPfhXOQAkxYIhZ/WszQRYGBm7NxWRZSo/JvSJhIwcWM+yRhqtRbMEWHY2I4jgcl
koNpW80fhM7vYyL5md8sDfwcqak0w+bRCFP7ZP6OLYP4nsN0jJ6Z4G+lkdQJh5ea
/TZ9mnz2FtvIdKz7F/AYhxJBmoptBkfS99DKojQIZme839b0f2Yi/TE+7LB8rbUa
mHVEQmMyzTbh9uEGzKGDfQsPhpp40nDS8bpt2jPk9F9y/dqcmxzU2esvFwy7ODcZ
EMv/z/ra+2hijes1S28TpMB4V2Hlfb93Nnyid+8PEg9aK3UkK33p76E3bPsAMODz
SOU9t2KvkBqzln7A3g9xq3wNFsN2gU5tohYv5CMPqbYj8wPEbVtzQShFt6CrFEGF
EsWDYjbLMdSLgazFBwNbIk8iCB75Zu6Ly/vnqCuGqipDVrvoRZZi7HULoUA6idmn
9pO6yUpG3X/eFuzSMzvM4HCnvk5rmolQYBo31RDTgcV5Z0RkCCo=
=/+Mi
-----END PGP SIGNATURE-----
APK signature
This APK is signed with the official BoldWallet keystore.
Do not mix it with the F-Droid/Zapstore or other stores signed build. Stick to one source for updates.
v2.2.0
BoldWallet v2.2.0 – FIPS 140-3 Compliance, Extension Pairing, Build Hardening
✨ What's changed
Security: FIPS 140-3 Compliance
- FIPS-Approved Build: Optional FIPS-approved build for BBMTLib and Docker — ensures high-assurance cryptographic operations
- Enhanced Randomness: Uses SP 800-90A DRBG with mixed entropy for critical security operations
- Platform Support: Native FIPS-aware builds supported for Android, Docker (Red Hat UBI9-based), and CI pipelines
Bold Web Extension
- Dedicated Pairing Modal: Replaced standard alerts with a new Extension Pairing modal — features step-by-step setup guidance, Confirm/Cancel actions, and theme-aware typography
- Extension Store Link: Direct link to install the Bold Wallet Chrome Extension added to the "Bold Web • Extension" section in the Device tab
BBMTLib: Build Hardening
- Reliable Builds: Hardened
build.shwith environment validation and stricter failure handling (set -euo pipefail) - Dependency Management: Integrated
go mod tidyand gomobile/gobind validation for clean and verifiable native binaries - CI Integration: Automated pipeline checks for FIPS capability and module cleanliness
Fixes and Cleanup
- UI Polish: Resolved inline-style warnings in
ExtensionPairingModalandKeyshareInfoContentfor better performance and maintainability - Code Optimization: Removed unused imports across several key screens including
MobilesPairing,SignedPSBTModal, andUserPreferenceScreen
Technical
- Version: 2.2.0 (package.json); iOS MARKETING_VERSION 2.2.0; Android versionName 2.2.0
- Build: Updated iOS Xcode project and Android build configuration to support FIPS-aware native builds; Go 1.24+ required for FIPS mode
💛 No servers. No seed phrases. Just sovereign sats.
—
🔗 Learn more at boldbitcoinwallet.com
🔐 PGP public key at boldwallet-publickey.asc
📎 SHA256: app-release.apk.sha256
cf0bdcff6376bc3425a66d4d6334665b22bbf620a1cad2d950614cae3049f897
🔑 SHA256-PGP-Signature: app-release.apk.sha256.asc
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEmqm9HSMiBJd7uQil0mO1cs3oHIwFAmmUEL8ACgkQ0mO1cs3o
HIwXUw/+IaTeidqL0mWRXzzKTlMElupcfVaY4h93CdPvzr3pskrWxZBzhchYha/S
xZI9m77Mp/j5yqbcm7NO1YS2AiuAEw1+YZ7OyWAi4XNlNm5BTweAgyA94DK24GrW
v2YwTwF8HVlb0PBunhEnfGxf0mMn5OHhFdXvG1OxS6kOQcWHj/5ytDgnVTM9NBj+
H/z4hEO13G/0HrGlzVF36LL21PEKlI6BxxmkR2BQqub1OjhTKNAT7adZ+LxRrMa4
JOvF26o9w9XkjGveo7ZBFGcSWW0LULE3UetoYAkoqorhSsRpX3OC01fPU0/Noqc5
O/s7AcabyxrB8qQmoWL9k3B2Yxj6MDrpgbv90bjW+j5iMa3Q60qgbOU62gSrNKv3
m3zY4rmz0+XcaBOBp3n4FhwuwOFxgRDWVzn8BDZGtfhXszH6gy/DNSQoGwcJd3hy
LwV/auz1ECSKzdeaAiYnk52dQwrc+RF0Xp2pDuN2I5nor7K7txO0t+U2tsj+DQH9
sR8ygQ3KVlvP2ZbnuJP61aBmbsR9Tl1wc17OMMXFMOYnOITiut5yU1/JnWSR4FA9
gzHiWMDlt2pHH3wldrgVkOVMOfgN04cgC3onDdmETUzL+OI5y9hUZeLCE1F4Iji6
CA/CujcTYwSh0KasAaq5/feSdv7q/B/yDlHEnySmDdC3HM6evpo=
=JPtI
-----END PGP SIGNATURE-----
APK signature
This APK is signed with the official BoldWallet keystore.
Do not mix it with the F-Droid/Zapstore or other stores signed build. Stick to one source for updates.