[6.12.0]
New Features
- Coins (UTXO) view: See every unspent output in a Bitcoin wallet — amount, label, keychain, and confirmation status — from a new "Coins" entry on the wallet screen. Sort and filter your coins, then freeze any you don't want to spend; frozen coins are excluded from every transaction until you unfreeze them, and the freeze survives app restarts. Built on the new
bull_uidesign system. And when a payment can't be covered by your spendable balance but you hold frozen coins, the "not enough balance" error now names the frozen amount and points you to Manage coins to unfreeze, instead of a dead end. (#760, #2304, #2337) - Coldcard NFC: Import a Coldcard Q or Mk4 wallet and sign transactions over NFC — a tap instead of finicky QR scanning. (#1544, #2224)
- BitBox02 Nova over Bluetooth: The BitBox02 Nova now works on iOS via BLE, lifting the previous Android-only restriction. Pairing, import, signing, and address verification are shared across USB (Android) and Bluetooth (iOS), with clear handling of Bluetooth permission and availability errors. The BitBox02 is also no longer feature-gated — it's available to all users. (#2323, #2388)
- Sub-1 sat/vByte fees: You can now set fee rates below 1 sat/vByte (e.g. 0.5) to take advantage of low-mempool conditions. Fractional rates are stored losslessly in BDK's native unit, Bitcoin fee presets are sourced from mempool's precise endpoint (with a fallback for self-hosted servers), and the fee shown in the preview is now the exact fee of the transaction that gets broadcast. A live relay-minimum floor prevents building a transaction the network won't accept. (#2133, #2199)
- Swap recovery via mnemonic: Swap secrets (including the preimage) are now derived deterministically from a standardized path, so stuck or orphaned swaps can be restored through Boltz's
restoreendpoint by sharing the master xpub. This aligns Bull with the new Boltz swap-mnemonic standard and lays the groundwork for reliable swap recovery. (#2282, #2138, #2316) - Export logs as a file: Share app logs as a file attachment instead of copy-pasting, making it practical to send large logs to support. (#2194, #2317)
Exchange & Payouts
- Funding blocked for restricted users: Users in the
RESTRICTED_FULLorRISK_PROHIBITED_COUNTRYgroups can no longer proceed through the funding flow in the app, matching the gating already enforced by the web exchange (BBX). Part of the wider effort to align mobile KYC gating with BBX across all jurisdictions. (#2385, #2393, see #2262) - Staging exchange access restored (dev/testnet): The staging exchange basic-auth credentials are now stored and read from the database, so testnet mode can reach the exchange again under dev mode. (#2291, #2310)
- Clearer funding option label: Updated a funding option label for clarity. (#2298)
Bug Fixes
Sending & Receiving
- Lightning invoice memos are now displayed on the send confirmation screen instead of being parsed and dropped. (#2189, #2309)
- Sending a BOLT11 invoice below the Boltz swap minimum now shows a specific, actionable error on the address screen instead of the generic "Something went wrong". (#2321, #2322)
- Fixed the recipients page getting stuck on an infinite loading spinner. (#2305, #2336)
- The QR scanner now handles non-standard BIP21 and donation URIs:
%40-encoded Lightning addresses are decoded, LNURLs are extracted from non-standard URIs, and unrecognized QR codes now show a clear "unsupported format" error and dismiss the scanner instead of hanging. (#2202, #2300)
Swaps
- Reverse-swap claim fees are now pinned, and stored claim fees are always used for send-exact-amount, so preview and broadcast stay consistent. (#2388, #2400)
- Swap-review pass: the send flow's swap status watcher now uses a live database watch, Lightning receive shows a loading shimmer during load, and the confirmation screen aligns the invoice with a copy button and a copyable swap ID. Also floors the claim fee at the relay minimum, adds proper watcher teardown, and fixes several send-flow fee edge cases (preserving lockup fee, tx-fee fallback, confirm-amount flash). (#2290)
Wallet Sync
- The pull-to-refresh spinner now stays visible until every chain (Bitcoin, Liquid, swaps) has finished syncing, instead of releasing after Bitcoin alone. (#2386)
- The wallet-card sync bar is now visible in light theme. (#2387)
UI & Layout
- Added missing back arrows to the RecoverBull "connecting" and vault-selection screens. (#2335)
- Fixed invisible snackbar text in dark mode. (#2329, #2343)
- Fixed unreadable colors in the encrypted-vault (Google Drive) delete confirmation dialog in dark theme. (#2257, #2260)
Stability
- Fixed a startup crash —
Bad state: Content hash on Dart side ... is different from Rust side— caused by a stale prebuilt native library.bull_sdknow pins Boltz and LWK to their reproducible v0.5.0 tags instead of moving branches to prevent recurrence. (#2401) - Fixed a QR scanner crash on iOS caused by symbol stripping (
STRIP_STYLE = non-global), and added the iOS location-permission description required when a website opened in the in-app browser requests geolocation — the app itself never collects location. (#2402)
Error Messages
- User-facing error sanitization: Established a repo-wide pattern that keeps raw exception text, node rejection reasons, and BDK/Electrum/NFC internals out of the UI — replacing them with clear, localized messages. Rolled out across backup settings, RecoverBull, Bitcoin price, seed view, Electrum settings, mempool settings, BIP85 entropy, replace-by-fee, and mnemonic import. (#1895, #2293, #2328, #2330, #2331, #2332, #2334, #2339, #2342, #2344, #2346)
Translations
- Simplified Chinese: word fixes. (#2308)
- German: translation updates. (#2263, #2345)
- Spanish: shortened the auto-transfer settings label so it fits. (#2278, #2284)
Under the Hood
Developer-facing changes with no direct user impact.
- Back to official bdk-dart: Switched the
bdk_dartdependency from thei5hi/bdk-dartfork back to the officialbitcoindevkit/bdk-dart(1.0.0-rc.2), updated call sites to the upstreamNetworkKindAPI, and removed the now-obsoletedependency_overrides. (#2389) - Migrations collapsed: Folded the accumulated database migrations into a single 12→13 step. (#2338, #2383)
bull_uidesign-system package: Introduced a standalonebull_uipackage with official-theme foundation tokens and duplicated core widgets, plus a Widgetbook v3 component catalogue in CI. This is the foundation the new Coins view is built on. (#2302)- Flutter 3.44 migration: Migrated to Flutter 3.44.1 / Dart 3.12.1 (FVM 4.1.0, Android Kotlin/DSL compat flags,
font_awesome_flutter11.0.0), then bumped to Flutter 3.44.2 with FVM versions aligned across CI and images and more robust devcontainer/reproducible-build tooling. (#2271, #2318) - Architecture docs & Melos skeleton: Consolidated architecture documentation (datasource→repository→usecase→bloc layering, contributor onboarding) and a Melos monorepo skeleton, routing analysis through a single
make analyzeentry point. (#2276) - Localization cleanup: Removed dead localization keys from non-English ARB files. (#2285)
- Devcontainer Wayland forwarding: Fixed Wayland socket forwarding via the host
XDG_RUNTIME_DIR. (#2303) - GitHub Actions modernization: Version bumps, supply-chain and least-privilege hardening, SHA-pinned third-party actions, faster pre-commit hook (runs analysis only on staged Dart files), and commit-SHA-tagged build artifacts. (#2395, #2392)
- Per-OS devcontainers: Split
.devcontainerinto self-containedlinux/andmacos/configs so it can start on Apple Silicon (via Rosetta) as well as Linux. (#2307) - Crash-cache → issues sync: New manually-dispatched workflow that turns the latest app version's reported crashes into GitHub issues, deduplicated by fingerprint. (#2347)
- CI reliability: Free disk space before analyze/test to avoid "No space left on device" (#2311), and fixed intermittent libgit2 SSL failures during container cargo fetches (#2320).
- Version bumps to 6.12.0. (#2382, #2390)