- Loading screen manchette (rolling quotes) — DB-first cache plus background sync of remote
QUOTES.md(config keyloading_quotes_json), refresh when the app returns to the foreground, and a bottom ticker on the unlock screen. - WebView CSS marquee — horizontal scrolling quotes rendered in
react-native-webview(HTML/CSS animation) to avoid heavy RN layout on the lock screen;**bold**segments render as bold in the ticker and in the reduced-motion static text path. - Themed toasts on the lock screen —
LoadingScreenmountsToastwithcreateToastConfig(theme)so success/error feedback matches the rest of the app while unauthenticated (noAppContenttree). - Manual “up to date” feedback — when the user checks for updates from the version chip and the installed build already matches the latest GitHub release, a success toast confirms it.
react-native-webviewdependency (iOS Pods / Android autolink) for the marquee.services/LoadingQuotesCache.ts— parseQUOTES.md, persist payload in SQLite viaAppConfigRepository, fetch/sync helpers.CONFIG_KEYS.LOADING_QUOTES_JSONinAppConfigRepositoryfor cached quote JSON.
- Wallet Settings (advanced) — developer / HD tuning (e.g. gap limit, scan range), clearer network switch confirmations, and a guard when developer mode is off so the wallet is not left on testnet unintentionally.
- Loading screen polish — safe-area and font handling for the manchette on iOS vs Android; unlock UI retains particles, logo/button motion, and biometric affordances alongside the ticker.
- Package manager — lockfile moved to npm (
package-lock.json);yarn.lockremoved; optional.npmrcfor registry defaults.
- Android TurboModule startup — removed duplicate
@ReactMethodmpcSignPSBToverload (explicit keyshare vs stored keyshare) that causedDuplicate method name mpcSignPSBT/ JS runtime failure; one bridge method remains: PSBT signing with keyshare loaded from native secure storage (iOS.m/ Swift aligned with Kotlin). - BBMTLib — removed legacy single-key Bitcoin send / WIF signing helpers from
Tsssurface where superseded by MPC flows (smaller native API surface).
- Version:
package.json3.0.8; AndroidversionCode58 /versionName3.0.8; iOS build 58 /MARKETING_VERSION3.0.8 (align store metadata if the branch still shows 3.1.0 during parallel bumps). - New files:
services/LoadingQuotesCache.ts,.npmrc(optional). - Modified files (selection):
screens/LoadingScreen.tsx,screens/WalletSettings.tsx,services/repositories/AppConfigRepository.ts,android/.../BBMTLibNativeModule.kt,ios/BBMTLibNativeModule.swift,ios/BBMTLibNativeModule.m,BBMTLib/tss/btc.go,package.json,package-lock.json,ios/Podfile.lock,android/app/build.gradle,ios/BoldWallet.xcodeproj/project.pbxproj.
- Update awareness on the loading screen — checks GitHub
BoldWalletreleases for a newer tag than the installed app, with a version/build chip, optional update modal, and a quiet background check once the local version is known (manual check can still drive UI feedback). - Mempool REST base validation — saving a custom Mempool API URL now probes
/blocks/tip/hash(with timeout) so broken or mis-typed endpoints are caught before they are stored. mempoolApiBasehelpers — shared normalization (/apisuffix), canonical testnet base,resolveStoredMempoolApiBase()for wallet traffic, validation that testnet is not accidentally pointed at mainnet’s default host, and helpers to classify public mainnet mirror hosts vs private endpoints for failover behavior.- Non-secret keyshare metadata —
saveKeyshareMetadata/getKeyshareMetadatapersist and read only public fields (committee keys, npub, paths metadata, etc.) via EncryptedStorage + SQLite mirror, so routine wallet logic avoids parsing the full MPC blob. - Native
getKeyshareNostrPrepJSON— minimal JSON for Nostr session/UI prep with the full keyshare read only inside native code. mpcSignPSBT(server/MPC path) — PSBT signing with keyshare loaded from secure storage on the native side, consistent with other MPC entry points.aesEncryptStoredKeyshare— encrypt using the keyshare loaded from RNES-compatible storage without passing plaintext through JS.transactionListUtils— pure helpers for mempool transaction sorting and amount breakdowns, with unit tests (__tests__/transactionListUtils.test.ts).types/keyshare.d.ts—KeyshareMetadatainterface aligned with the metadata layer.
- MPC signing and sends: keyshare stays in native secure storage —
mpcSendBTCWithUTXOs,nostrMpcSendBTC, andnostrMpcSignPSBTno longer accept keyshare orpartyNsecfrom JavaScript; iOS/Android read the blob from the same Keychain/Keystore layout asreact-native-encrypted-storage. Legacy bridge APIs that passed full keyshare strings from JS were removed (mpcSendBTC,nostrMpcSendBTCWithUTXOswith JS keyshare). nostrMpcSendBTC— UTXO multi-path only; native loadsnsecand signing material from stored keyshare.- Wallet and contexts use metadata first —
WalletService,WalletHome,UserContext,WalletContext, and pairing flows usegetKeyshareMetadata()where a full secret parse is unnecessary; pairing screens callsaveKeyshareMetadatawhen the full document is saved. - Mempool client configuration —
WalletServiceand related screens useresolveStoredMempoolApiBaseand the new validation helpers for consistent API root selection and user feedback when editing endpoints.
- iOS native keyshare handling — staging buffers for bridge-supplied key material are zeroed where possible; improved recovery when JSON is huge or partially unparsable but
nseccan still be extracted (e.g. regex fallback), with diagnostics for Nostr prep. - Loading screen particle animation —
ParticlesErrorBoundarydisables heavy animation if rendering fails on low-end devices.
- Version:
package.json3.0.7; AndroidversionCode57 /versionName3.0.7; iOS build 57 /MARKETING_VERSION3.0.7. - New files:
services/mempoolApiBase.ts,utils/transactionListUtils.ts,types/keyshare.d.ts,__tests__/transactionListUtils.test.ts. - Modified files (selection):
App.tsx,android/.../BBMTLibNativeModule.kt,ios/BBMTLibNativeModule.swift,ios/BBMTLibNativeModule.m,components/TransactionList.tsx,screens/LoadingScreen.tsx,screens/MobileNostrPairing.tsx,screens/MobilesPairing.tsx,screens/UserPreferenceScreen.tsx,screens/WalletSettings.tsx,screens/WalletHome.tsx,services/WalletService.ts,services/MempoolClient.ts,utils.js,context/UserContext.tsx,context/WalletContext.tsx,context/NetworkContext.tsx.
- Addresses tab: new dedicated
AddressesScreenwith receive/change HD rows (path, index, and address), per-row BTC/fiat balance, and direct open intoReceiveModal. - Address ordering modes: added persisted list mode toggle (
AUTOsmart view vsHDderivation order) stored underCONFIG_KEYS.ADDRESSES_VIEW_MODE. - Address health tiers: rows are classified as
Active,Used, orUnusedusing UTXO presence, balance state, and last transaction activity metadata. - Load-more paging: added "Show more" control that extends the HD index window by address pairs while keeping DB-first rendering.
- Smart sort behavior: in
AUTO, addresses are ordered by tier first, then recency (lastActivity), then derivation index, then receive-before-change. - Refresh semantics: manual header refresh now explicitly invalidates visible balance/UTXO sync metadata and re-syncs one address at a time (DB-first update flow).
- Receive UX from addresses list: tapping a row performs targeted balance/UTXO sync for that address before opening the receive modal with fresh row data.
- Addresses row visual polish: improved index readability in dark mode and added a separator under the row header line for clearer grouping.
- Version:
package.json3.0.6; AndroidversionCode56 /versionName3.0.6; iOS build 56 /MARKETING_VERSION3.0.6. - New files:
screens/AddressesScreen.tsx,assets/addresses-icon.png. - Modified files (selection):
App.tsx,context/UserContext.tsx,screens/WalletHome.tsx,screens/WalletSettings.tsx,services/WalletService.ts,services/repositories/WalletRepository.ts,services/repositories/TransactionRepository.ts,services/repositories/AppConfigRepository.ts,utils.js.
- Lightweight tap-to-refresh — tap on the cache indicator (and background SyncCoordinator cycles) now sync only the active address set (recent receive/change index window, UTXO holders, pending-tx addresses, current receive). Full sync runs only on long-press on the cache indicator (clear cache + HD discovery + full balance/tx rebuild).
WalletService.getActiveAddressesWithPaths(network, addressType)— returns the subset of HD addresses used for lightweight sync: recent index window, addresses with UTXOs, addresses with pending txs, and current receive address.getWalletBalanceAggregate(..., activeOnly)— whenactiveOnlyis true, balance sync uses the active set instead of the full HD list.versionbuild.sh— script to bump version and build across Android (versionName/versionCode), iOS (MARKETING_VERSION/CURRENT_PROJECT_VERSION), andpackage.json. Usage:./versionbuild.sh <version> <build>(e.g../versionbuild.sh 3.0.5 55).
WalletHome.fetchData(activeOnly = true)— default tap-to-refresh and app-resume use lightweight sync; long-press reconstruction callsfetchData(false)for a full balance sync over all addresses.- SyncCoordinator —
_syncBalances,_syncTxs, and_syncUtxosnow usegetActiveAddressesWithPaths()for the address list (with fallback to full config list when active is empty). HD discovery and price sync unchanged. - TransactionList — "Syncing transactions…" on unlock and refresh now uses the active address set for API sync (
syncAddressesAtomic/fetchTransactionsForAddresses); display still uses the full wallet address list and DB cache.
- Version:
package.json3.0.5; AndroidversionCode55 /versionName3.0.5; iOS build 55 /MARKETING_VERSION3.0.5. - New file:
versionbuild.sh. - Modified files:
screens/WalletHome.tsx,components/TransactionList.tsx,services/sync/SyncCoordinator.ts,services/WalletService.ts,android/app/build.gradle,ios/BoldWallet.xcodeproj/project.pbxproj,package.json.
- Pure-TypeScript fee estimation (
feeUtils.ts) — fee calculation fully ported from Go to TypeScript, eliminating the native bridge round-trip during send flow. Covers UTXO selection (smallest-first), two-pass vbyte estimation for P2PKH/P2SH/P2WPKH/P2TR, dust-threshold enforcement, and change-output handling. Fee rates are fetched from the mempool API with a 30-second DB-backed cache (fee_ratestable). - DB-level TTL freshness checks — every syncer (
BalanceSyncer,UtxoSyncer,TransactionSyncer,PriceSyncer) now checkssync_metadata.last_synced_atbefore making API calls; when data is fresh the network round-trip is skipped entirely and the cached DB result is returned, dramatically reducing redundant API traffic on app resume and screen transitions. SyncRepository.isFresh(entityType, entityKey, ttlMs)— generic freshness helper queried by all syncers andWalletServiceaggregate methods.- Host-independent API caching in
MempoolClient— cache keys are derived from the URL path only (stripHost), so switching between public mempool hosts (round-robin) still benefits from cached responses. - Round-robin failover for public API endpoints — when the configured API base is a known public mempool host,
MempoolClientautomatically cycles through all available public hosts on failure, improving reliability without user configuration. MempoolClient.invalidateAll()— bulk cache eviction used during network/address-type switches.MempoolClient.evictInflight(urlPrefix)— targeted eviction of in-flight deduplication entries to force fresh requests on retry.ApiQueue.clear()— drops all pending (not yet started) jobs from the queue; called on network/address-type switch to prevent stale background work from the previous network bleeding into the new session.- Progressive HD index persistence —
discoverHdIndexesForNetworknow reads previously scanned addresses fromwallet_addressesat the start and skips native key derivation + API calls for known indexes, resuming from the last gap position. New discoveries are progressively persisted viawalletRepository.upsertAddress(). - Fast-switch for network/address-type changes —
canFastSwitchinWalletSettingscheckswalletRepository.getHdState().restoreDone; whentrue,fastSwitchupdates config, stops old sync workers, clears the API queue, and navigates directly toWalletHome— bypassing the fullrunRestoreIndexingflow. Database.invalidateSyncMetadataForAddressType(network, addressType)— surgical invalidation that only deletessync_metadatarows for the relevant addresses while preserving all cached balance, UTXO, and transaction data for instant display.- Synchronous DB-first initialization in
WalletHome—address,addressType,selectedCurrency,isBlurred,walletAddresses, andwalletAddressesReadyare all initialized fromappConfigRepositoryandwalletRepositoryin theiruseStatecalls, so the wallet UI renders immediately on unlock or address-type switch without showing a loading skeleton.
WalletHomeDB-first architecture enforced — UI state is always read from SQLite viarefreshFromDB; API calls write to DB only;SyncCoordinator.onSyncCompletetriggersrefreshFromDBto reflect background updates. Five redundantuseEffecthooks removed.WalletHomeinit no longer blocks on native calls —loadingstate starts asfalsewhen cached data exists; the keyshare/native init runs in the background while the DB-seeded UI is already visible.walletAddressesReadyflip-flop eliminated —setWalletAddressesReady(false)is now only called whenrestoreDoneisfalse(actual HD discovery needed); whenrestoreDoneistrue, the DB-seeded address list stays visible while the fast cache-hit derive runs silently.TransactionListpreserves data across state transitions — removedsetTransactions([])when addresses are temporarilyundefinedduring network/address-type switches; DB pre-populate no longer guarded by!isFetching.current, so cached transactions always show instantly regardless of live fetch status.UtxosScreenprice loading is DB-first — synchronously reads cached price frompriceRepository.getCachedPrice()on mount, then refreshes from API in background.SendBitcoinModalfee estimation uses DB-cached UTXOs —getFeefetches HD addresses and UTXOs from DB first; only falls back to a live API fetch if the DB is empty. Input-based cache guard (lastFeeInputsRef) prevents redundant re-estimation; debounced function stabilized with ref pattern.SyncCoordinator._syncUtxosnow retrieves and passesderivationPathfromWalletService.getHdAddressesWithPaths(), ensuring theutxostable has correct derivation paths for spend operations.- Network/address-type switch cleanup — both
fastSwitchandrunRestoreIndexingnow callsyncCoordinator.stop()+apiQueue.clear()before proceeding, preventing stale background jobs from the previous network. WalletSettingsnetwork toggle consistency — optimistic UI update with revert on failure:setIsTestnetandsetActiveNetworkare called immediately, then rolled back ifrunRestoreIndexingfails.- Per-key
AbortControllerinWalletService—withTimeoutuses isolated abort controllers per operation instead of sharing one, preventing a single timeout from cascading across unrelated calls. - Dead code removed from
WalletHome— unusedupdateAddressTypeModal,updateAddressForNetworkfunctions andgetDerivePathForNetworkimport removed.
- Balance showing 0 on UI after restore —
fetchDatacallback usedisInitializedRef.current(ref) instead ofisInitialized(stale closure), ensuring it runs as soon as initialization completes. - Stale in-flight deduplication in
MempoolClient—evictInflightclears cached promises before retry, forcing a fresh HTTP request instead of returning a stale dedup result. - Transaction list empty for ~90 seconds on app unlock — three compounding issues fixed: (1)
walletAddressesReadyno longer flips tofalsewhenrestoreDoneis alreadytrue; (2)TransactionListDB pre-populate not blocked byisFetching.current; (3) existing transactions preserved during transient addressundefinedstates. - Stale testnet sync jobs running after switching to mainnet —
ApiQueue.clear()now drops pending jobs andSyncCoordinator.stop()halts timers before navigation, preventing old-network work from bleeding through. - Fee estimation "No UTXOs available" error —
SyncCoordinatornow passesderivationPathtoUtxoSyncer, ensuring UTXO table entries have correct paths for spend operations. - Fee estimation UI flickering — input-based cache guard prevents re-estimation when inputs haven't changed; stable debounce ref prevents timer resets on every render.
UtxosScreenprice not loading from DB on mount — added synchronous read frompriceRepository.getCachedPrice()before async API refresh.- Lint warnings — removed unused
errorbindings in catch blocks, unused function declarations, and stale eslint-disable comments.
- Version:
package.json3.0.4; AndroidversionCode54 /versionName3.0.4; iOS build 54 /MARKETING_VERSION3.0.4. - New file:
services/feeUtils.ts—fetchFeeRates,detectAddressType,estimateVbytes,selectUtxos,pickRate,estimateFee. - New DB table:
fee_rates(id,rates_json,fetched_at). - Modified files (20):
components/TransactionList.tsx,components/TransportModeSelector.tsx,screens/MobileNostrPairing.tsx,screens/MobilesPairing.tsx,screens/SendBitcoinModal.tsx,screens/UtxosScreen.tsx,screens/WalletHome.tsx,screens/WalletSettings.tsx,services/ApiQueue.ts,services/Database.ts,services/MempoolClient.ts,services/WalletService.ts,services/repositories/SyncRepository.ts,services/sync/BalanceSyncer.ts,services/sync/PriceSyncer.ts,services/sync/SyncCoordinator.ts,services/sync/TransactionSyncer.ts,services/sync/UtxoSyncer.ts.
- Periodic HD index re-discovery in
SyncCoordinator— background sync now includes automatic HD address discovery every 2 hours, ensuring change addresses and newly-used receive addresses are picked up across devices without manual intervention. - Force HD discovery on app launch — the first
SyncCoordinatorcycle always runsdiscoverHdIndexesForNetworkregardless of staleness, guaranteeing correct indexes after code updates that fix derivation bugs. - HD discovery progress in
CacheIndicator— both automatic (SyncCoordinator) and manual (long-press) HD discovery now report status ("Discovering addresses…", "Scanning receive/change addresses…") viaonSyncStatuscallback, displayed in the CacheIndicator shimmer bar. - Long-press full wallet reconstruction — long-pressing
CacheIndicatoron WalletHome or UtxosScreen now performs a complete nuke-and-rebuild: clears all cached wallet DB data (transactions, balances, UTXOs, sync cursors, pending txs), flushes in-memory API and address caches, re-discovers HD indexes from the blockchain, and re-fetches all data fresh. CacheIndicatoronLongPressprop — the component now accepts an optionalonLongPresshandler, forwarded to the underlyingAppPressable.TransactionRepository.ensureAddressLinks— new bulkINSERT OR IGNOREmethod that backfillstransaction_addressesrows for known transactions, ensuring every tx returned by the API is linked to its real Bitcoin address.Database.clearWalletCacheData()used by long-press — selective wipe of all fetched data while preservinghd_stateso discovery has correct indexes as a baseline.
- Missing transaction on cross-device sync — transactions could be invisible when their txid existed in the
transactionstable (from a prior synthetic-key write or migration) but lacked atransaction_addresseslink to the real Bitcoin address. TheTransactionSyncernow backfills address links for every known txid it encounters from the API, in bothsyncAddressesAtomicandsyncAddress. - Stale synthetic transaction cache hiding new data —
transactionsFromCacheForWalletpreviously read from a synthetic cache key (wallet_txs_<network>_<addressType>) first; if that had stale data from a prior session, newly-synced transactions were invisible. The method now queries by real HD addresses first (the authoritative source written byTransactionSyncer), falling back to the synthetic key only when the keyshare is unavailable. TransactionSyncertwo-phase forward-pass — always fetches the newest page (/txs, no cursor) before falling back to the stored cursor for backfill, ensuring transactions confirmed after the last sync are discovered.- Confirmation status overlay from DB —
getTxsandtransactionsFromCacheForWalletoverlay authoritativeis_confirmed,block_height,block_timefrom the DB onto parsedrawJson, preventing stale "Consolidating" labels on already-confirmed transactions.
transactionsFromCacheForWalletpriority inverted — real HD address query (viagetTransactionsForAddresses) is now the primary path; the synthetic wallet-level cache key is the fallback for early-boot scenarios when the keyshare is not yet available.SyncCoordinatornow manages HD discovery lifecycle — moved periodic re-discovery from aWalletHomeuseEffectintoSyncCoordinator._syncAll, with configurableHD_DISCOVERY_STALE_MS(2 hours) andonAddressesChangedcallback to update the UI address list.
- Version:
package.json3.0.3; AndroidversionCode53 /versionName3.0.3; iOS build 53 /MARKETING_VERSION3.0.3. - Modified files:
services/sync/TransactionSyncer.ts,services/sync/SyncCoordinator.ts,services/WalletService.ts,services/repositories/TransactionRepository.ts,components/CacheIndicator.tsx,screens/WalletHome.tsx,screens/UtxosScreen.tsx.
- SQLite persistence layer — full migration from file-based
LocalCacheto a WAL-mode SQLite database (@op-engineering/op-sqlite) as the single source of truth for all wallet data.- Repository pattern:
AppConfigRepository,WalletRepository,BalanceRepository,TransactionRepository,UtxoRepository,PriceRepository,SyncRepository— each owns its table schema and CRUD operations. - Background sync infrastructure:
SyncCoordinatororchestratesBalanceSyncer,TransactionSyncer,UtxoSyncer, andPriceSyncer; runs on foreground + configurable intervals; failures are silent and retried on next foreground event. - Database-first rule enforced everywhere:
API → write DB → UI reads DB. UI never reads directly from API responses; any API error falls back to cached DB state.
- Repository pattern:
- Central API Queue (
ApiQueue) — global singleton that serializes all logical API operations (balance, price, UTXOs, transactions) so they execute one at a time; subscribers are notified with the running operation label and progress for UI status display. - Atomic sync operations —
BalanceSyncer,UtxoSyncer, andTransactionSyncernow collect all address data in memory and only commit to DB when every address succeeds; on any failure nothing is written (BalanceSyncError,UtxoSyncError,TxSyncError), preserving data consistency. - 429 rate-limit retry with backoff — new
rateLimitRetrymodule: automatic retry on HTTP 429 (up to 2 retries / 3 attempts), respectsRetry-Afterheader (1–120 s), inter-address throttling delay (300 ms) to reduce rate-limit triggers; applied across all syncers. MempoolClientRetry-Aftersupport — parsesRetry-Afterheader (integer seconds or HTTP-date) from 429 responses, exposesretryAfterSecondsonMempoolResponse.- Progress indicators —
CacheIndicatorandRestoringIndexesModalnow showcurrent/totalprogress (e.g. "3/5") during multi-address sync operations; progress floats right inCacheIndicator. - CacheIndicator status messages — shows the currently running
ApiQueueoperation label (e.g. "Fetching balance…", "Fetching fiat rate…") instead of generic "Refreshing...". - Descriptive sync failure toasts — specific Toast messages for each sync type ("Could not fetch balance", "Could not fetch UTXOs", "Could not fetch transactions") with "Using cached data." fallback, replacing generic "Sync failed".
- Atomic wallet reset + reindex + pre-sync (
runRestoreIndexingin WalletSettings): the entire pipeline — HD index discovery, balance sync, transaction sync, UTXO sync, and aggregate balance computation — must succeed fully before navigating to WalletHome. On any failure the function throws, the caller shows aToasterror, and navigation is aborted (rollback semantics).RestoringIndexesModalnow shows aphaselabel and progress during post-discovery sync steps ("Syncing balances… 3/5", "Syncing transactions…", "Syncing UTXOs…").- All callers (network switch, address-type switch, Clear Cache) wrapped in
try/catchwith descriptive error toasts; navigation only fires after full success.
- Aggregate balance pre-computed and persisted after the balance sync phase of
runRestoreIndexing; WalletHome reads the pre-computed row on first render viagetCachedAggregateBalancewith no extra API call. - Balance DB-first floor guard — when the fresh API returns 0 BTC,
fetchDatacross-checks against the stored DB aggregate to prevent transient 0-balance display (e.g. right after device unlock when iOS Keychain is still initialising). - Pre-skeleton DB balance seed — on cold start, balance is read synchronously from DB and set in state before the loading skeleton appears, eliminating flash of
0or'-'. Database.clearWalletCacheData(): selective clear that wipes fetched data (address_balances,utxos,transactions, and related tables) while preservinghd_stateandwallet_addresses; used for network/address-type switches so discovery always has the previous correct indexes as a baseline.- UTXO
block_timepersistence:utxostable now storesblock_time;StoredUtxo,UtxoRepository.replaceUtxosForAddress, andstoredToUtxoWithPathpropagate the value end-to-end so the "Confirmed / Unconfirmed" label inUtxosScreenmatches the summary card. - Historical vs. current fiat prices for transactions: confirmed transactions use the block-time historical rate from
PriceRepository; pending/unconfirmed transactions fall back to the current livebtcRate;TransactionListfetches missing historical rates in batch. - Full wallet reset on
ShowcaseScreenload: clears all SQLite wallet tables, in-memory and HTTP caches, and relevantEncryptedStoragepreference keys (preservingkeyshare) so each new import starts from a guaranteed clean state. - LoadingScreen version:build — app version and build number displayed at the bottom center of the loading screen.
- Mempool Playground: GET Historical Price — new endpoint for querying BTC price at a given Unix timestamp with currency parameter.
- UtxosScreen dedicated header style — top summary card uses a new
utxoHeaderStylewith glassmorphism effects, dedicated padding, theme-aware text colours for dark/light mode, and proper border/shadow; replaces reuse ofwalletHeaderStyle. - UtxosScreen refresh via
UtxoSyncer— replaced the manual per-address fetch loop withutxoSyncer.syncAddresses, ensuring 429 retry, inter-address throttling, and atomic write benefits. - UTXO derivation path right-aligned — chain badge row uses
flexDirection: 'row'withjustifyContent: 'space-between'; derivation path floats right. - TransactionList atomic sync via
ApiQueue— multi-address transaction refresh usestransactionSyncer.syncAddressesAtomicthrough theApiQueue, showing "Fetching transactions…" status inCacheIndicator. WalletServiceatomic balance writes —getWalletBalanceAggregatecollects all per-address balances in memory and writes them atomically; when the address list is empty (keyshare unavailable), falls back to cached aggregate instead of returning 0.MempoolClientTTL adjustments — default TTL set to 15 s for balance/UTXO/transaction endpoints; historical price cache extended from 7 days to 30 days; fee-rate endpoint at 30 s.- WalletHome balance always visible: balance text is shown from the first frame using a pulsing
Animated.Viewopacity during loading; the balance is never replaced with a shimmer or blank slot. - Instant balance on lock/unlock:
reinitializeWalletnow readsbalanceRepository.getBalance('aggregate_…')synchronously at startup — before anyawait— so the cached BTC (and fiat ifbtcRateis already in state) is painted in the same render batch as the loading start; no flash of0or'-'. - Transaction list merge-not-replace: API results are merged into existing state using
sortTxs; the list count can only grow, never shrink, even on partial API responses. runRestoreIndexingcache invalidation order:mempoolClient.invalidateAll()andws.invalidateAddressCache()are flushed beforediscoverHdIndexesForNetworkso every address-used check hits the network with fresh data.WalletSettingsnetwork toggle: now wrapped intry/catch; setsnewNetwork(notactiveNetwork) in navigation reset to prevent stale-closure bug.- Mempool Playground dropdown: dark mode background explicitly uses
cardBackgroundfor better visibility. - WalletHome
CacheIndicatorrefresh — "Tap to refresh" now triggersfetchData(balance + price via ApiQueue) followed by transaction list refresh, instead of only refreshing transactions. - Focus guard against duplicate fetches —
useFocusEffectchecks bothisReinitInProgressRefandisFetchInProgressRefto prevent racing parallel fetches.
- Fiat currency reset on cold start: user's selected currency (e.g. EUR) was overwritten to USD on every app restart; the initialisation code now only defaults to USD when no preference is saved.
- Balance zeroing on refresh:
getWalletBalanceAggregatenow persists per-address balances atomically and falls back to the stored aggregate on any single-address failure; a complete API failure returns the cached aggregate instead of0.00000000. - Transaction count decreasing after refresh:
setTransactionsuses a functional update that merges API results with existing state; transactions are inserted withINSERT OR IGNORE/ UPSERT so rows can only accumulate. - TransactionSyncer not truly atomic: on
!res.ok(e.g. 429 after retries), the old code wouldbreakand still write partial data; now throwsTxSyncErrorso nothing is written. - UTXO screen random / empty entries: eliminated by always writing API responses to DB per-address and then reading the full address set from DB as the final source; partial API failures no longer produce half-populated lists.
- Fiat price always showing "-": fixed a
keysToFetchregex mismatch that prevented historical rate fetches; block-time is now stored directly in aMapand looked up without regex parsing. - Wallet reindex instant-close + 0 balance:
clearWalletCacheData()(notclearWalletData()) preserveshd_stateduring switches, so discovery uses prior correct indexes as a baseline; discovery failures abort navigation rather than landing on WalletHome with empty state. - UTXO confirmed/unconfirmed mismatch:
block_timeis now written to theutxostable and read back throughstoredToUtxoWithPath; the summary count and the list label now agree. UtxoRepository.getUtxosForNetworkaddress-type filtering: fallback query accepts an optionaladdressTypeand filters byderivation_pathprefix so only UTXOs relevant to the active HD wallet type are returned.- MobilesPairing modal close navigation: closing the signed TX broadcast modal (Copy/Share/Broadcast) now navigates back to the previous screen instead of leaving the user stranded.
- Version:
package.json3.0.2; AndroidversionCode52 /versionName3.0.2; iOS build 52 /MARKETING_VERSION3.0.2. - New files:
services/Database.ts,services/LocalCacheMigration.ts,services/repositories/(6 repositories),services/sync/(BalanceSyncer,TransactionSyncer,UtxoSyncer,PriceSyncer,SyncCoordinator),services/ApiQueue.ts,services/sync/rateLimitRetry.ts. StoredUtxointerface: addedblockTime: number | null;utxosDDL addsblock_time INTEGERwith anALTER TABLE … ADD COLUMNmigration guard.RestoringIndexesModal: new optionalphase?: stringandprogress?: { current: number; total: number }props; title switches between "Restoring indexes" and "Syncing wallet" depending on phase.CacheIndicator: new optionalstatusMessage?: stringandprogress?: { current: number; total: number }props; progress displayed right-aligned.PendingTxDatainterface: typed interface for pending transaction objects shared betweenTransactionRepositoryandTransactionList.- Error classes:
BalanceSyncError,UtxoSyncError,TxSyncError— each carriesfailedAddressfor targeted diagnostics. ApiQueue:ApiQueueStateincludeslabeland optionalprogress;enqueue<T>(label, job)returnsPromise<T>; subscribers notified on start/complete/error.rateLimitRetry:with429Retry<T>(label, request),sleep(ms), constantsRATE_LIMIT_DELAY_MS(5 s),MAX_429_RETRIES(2),INTER_ADDRESS_DELAY_MS(300 ms).MempoolResponse<T>: addedretryAfterSeconds?: number;parseRetryAfter(value)handles both integer-seconds and HTTP-date formats.
- HTTP caching layer (
MempoolClient): In-memory cache wrapping allfetchcalls to mempool.space; per-endpoint TTL (30 s default, 5 min for immutable tx details, 60 s for fee rates and BTC price); in-flight request deduplication prevents duplicate concurrent fetches; only HTTP-200 responses are cached;invalidate(prefix)andinvalidateAll()for manual eviction. - Universal 10-second API timeout: Every outbound
fetchthroughMempoolClientis capped at 10 s viaAbortController; caller signals are combined using a React Native–compatiblecombineSignalshelper. - Balance via address-stats endpoint:
getWalletBalanceAggregatenow usesGET /api/address/:address(chain_stats+mempool_stats) instead of fetching full UTXO arrays — responses are ~50× smaller and are fully cached throughMempoolClient. Formula:(chain_stats.funded − chain_stats.spent) + (mempool_stats.funded − mempool_stats.spent)per address. - Confirmed / unconfirmed balance breakdown in
WalletBalance:pendingSatsfield exposes the net mempool delta (positive = incoming unconfirmed, negative = outgoing unconfirmed) alongside the total balance. - WalletHome pending chip: When
pendingSats ≠ 0, a small amber pill is shown below the fiat balance (⏳ +X.XXXXXXXX BTC incoming/⏳ X.XXXXXXXX BTC outgoing); hidden while loading or in privacy-blur mode. - UtxosScreen balance summary card: Static card pinned above the scrollable UTXO list showing Total, ✓ Confirmed, and ⏳ Pending balances with BTC, fiat, and UTXO counts; computed locally from the already-loaded UTXO set (zero extra API calls).
- Multi-path HD wallet (no-address-reuse): Full support for per-address indexing and spending across receive and change paths.
- WalletService: Aggregate balance and UTXO fetch across all HD addresses;
getHdAddressesWithPathswith in-memory cache;fetchUtxosWithPathswith sequential API calls and empty-address skip cache;fetchMoreTransactionsForAddressesfor cursor-based multi-address transaction pagination. - HdIndexService: Centralized HD index management; discovery uses
GAP_LIMITandMIN_SCAN_INDEX; runtime address range based onmax(externalIndex, maxUsedExternal)andchangeIndex. - Receive: Restoring-indexes flow; receive index advances only when current address is used; receive button shows busy state while computing next address.
- WalletService: Aggregate balance and UTXO fetch across all HD addresses;
- Multi-path UTXO spend and fee estimation:
- BBMTLib (Go):
SpendingHashWithUTXOsfor deterministic spending hash from a pre-fetched UTXO set;estimateFeeWithUTXOs; sequential API behavior and improved logging in fee/UTXO paths. - Native bridges: iOS/Android expose
spendingHashWithUTXOs; Send flow uses multi-path UTXOs for fee and spending hash.
- BBMTLib (Go):
- Transaction list and details:
- TransactionList: Multi-address transaction list with per-address cursor pagination; consolidation (1 internal output) vs rebalancing (2+ internal outputs) labels; animations for Sending/Receiving/Consolidating/Rebalancing; derivation path in details only (no Ix row in list).
- TransactionDetailsModal: Inputs/outputs flow diagram (PSBT-style); internal (ours) outputs highlighted with theme accent; summary bar with fee; address path map for paths.
- Pairing screens: Inputs/outputs flow in MobilesPairing and MobileNostrPairing; “Signing Path” instead of “From Address”; network badge and flow diagram aligned.
- RestoringIndexesModal: Dedicated modal for index discovery progress.
- Deterministic co-signing via QR (changeAddress field): The send-bitcoin QR now encodes a 9th field (
changeAddress); both the sender and the scanning device use the identical pre-computed change output in UI preview and in the native MPC call.decodeSendBitcoinQR/encodeSendBitcoinQRare fully backward-compatible with v1–v4 QRs (3–8 fields). - Change address derivation path in outputs preview: If a transaction output is the wallet's change address, its HD derivation path (e.g.,
m/84'/0'/0'/1/3) is displayed below the address in both MobilesPairing and MobileNostrPairing;WalletService.getNextChangeAddressWithPathreturns{address, path}as a single atomic call. - Address shortening in transaction previews: All Bitcoin addresses in the inputs/outputs flow on MobilesPairing and MobileNostrPairing are displayed in a compact “first 4…last 4” format (e.g.,
bc1q…xyz1) via a newshortenAddressutility inutils.js. - Abort functionality in MobileNostrPairing: Full abort support added to the Nostr co-signing modal — abort button in the in-progress modal,
nostrAbortRefreset at the start of each signing session, mid-flow abort checks after raw TX is produced, and suppressed error alerts when the user aborts intentionally; behaviour is now consistent with MobilesPairing.
TransactionList: Migrated fromaxiostoMempoolClient; manualtimeoutPromiserace removed (timeout now enforced insideMempoolClient).- WalletHome balance rendering:
ActivityIndicatorspinners replaced with areact-native-reanimatedshimmer animation while balances load; fiat balance derived viauseMemofrombalanceBTC × btcRateto prevent the 0-BTC / non-zero-fiat display mismatch. - Mempool API: All WalletService calls to mempool.space (UTXOs, transactions) are sequential/synchronous to avoid rate limits and non-determinism.
- SendBitcoinModal: Passes
activeNetwork(e.g. testnet3) to WalletService; fee estimation uses multi-path UTXOs and nativeestimateFeeWithUTXOswith fallback. - UtxosScreen / WalletHome: Use aggregate balance and multi-address–aware flows.
- BBMTLib build:
build.shbanner and note for Go 1.25 taggedPointerPack; FIPS check and toolchain steps unchanged. - FIPS Android (Dockerfile.fips and fips-android.sh):
WORKDIR /workspacesodocker run -v $(pwd):/workspace ./build.shruns against mounted source;-w /workspacein script.- BuildKit cache mounts: dnf, Go tarball, Android SDK download and per-platform install cache, Go modules/gomobile.
- Platform default:
linux/arm64on Apple Silicon (avoids Go 1.25 taggedPointerPack under QEMU),linux/amd64elsewhere; optionalFIPS_ANDROID_PLATFORMoverride. - Run-from-BBMTLib check so
build.shexists in mounted dir.
- Receive flow address mismatch:
getCurrentReceivePathInfonow atomically derives and returns{path, index, address}in one call;WalletHomepasses the address from this combined result toReceiveModal, eliminating QR flicker and stale-address display when advancing to a new receive index. - Receive index: No longer advances on network errors; discovery records partial/failed state without bumping indexes;
bumpExternalIndexIfCurrentUsedonly when address is actually used. - Fee estimation: Multi-path UTXO set used for native fee estimation; “insufficient funds” handling and logging aligned with multi-path.
- Transaction list: Removed legacy single-address consolidation detection and Ix row; correct merge/sort for multi-address pagination.
- Scanning device UTXO mismatch / session stall: The scanning device now populates both the UI preview and the native MPC signing call directly from the UTXOs embedded in the QR code (enriched with
scriptpubkeyvia a targeted API call); previously the scanner re-fetched UTXOs independently, causing mismatches that stalled co-signing sessions. - Transaction inputs not shown on scanning device: The
txPrevieweffect now usesroute.params.utxosJsonwhen available, bypassing a cold-cachefetchUtxosWithPathscall that returned empty results on the scanner. - Inconsistent change address between devices: The sender’s pre-computed change address is now threaded end-to-end — from
SendBitcoinModal→WalletHome→ QR field 9 →processScannedQRData→navigationParams→ pairing screens → native MPC call — guaranteeing both devices sign with the same change output.
- Version:
package.json3.0.0. - New file:
services/MempoolClient.ts—MempoolClientclass;MempoolResponse<T>interface;buildKey,ttlForUrl,combineSignalshelpers; singletonmempoolClientexport. WalletBalanceinterface: Added optionalpendingSats?: number(backward-compatible with cached entries).- BBMTLib:
go.mod/go.sum;tss/btc.go(SpendingHashWithUTXOs, fee/UTXO);tss/mpc_nostr.go; iOS/Android native module updates;Dockerfile.fips(Go 1.25.x, TARGETARCH, cache mounts, WORKDIR /workspace). - Context: UserContext/WalletContext and utils.js updates for tabs and routing where applicable.
- QR format v5:
encodeSendBitcoinQR/decodeSendBitcoinQRinutils.jsextended to 9 fields;TransportModeSelectorpasseschangeAddress;WalletHome.processScannedQRDataextracts and stores it inpendingSendParams. shortenAddressutility (utils.js): Returns first 4…last 4 characters for addresses longer than 8 chars; used across pairing screen previews.WalletService.getNextChangeAddressWithPath: New method returning{address, path};getNextChangeAddressdelegates to it for backward compatibility.
- FIPS 140-3 (SP 800-90A DRBG) compliance: Optional FIPS-approved build for BBMTLib and Docker.
- BBMTLib:
build.shsupportsGOFIPS140=v1.0.0(default) orGOFIPS140=off; FIPS mode uses SP 800-90A DRBG with mixed entropy; requires Go 1.24+. - Docker:
Dockerfile.fipsand Red Hat UBI9-based FIPS build;Dockerfilepasses through build args for FIPS. - Android:
fips-android.shand Gradle integration for FIPS-aware native build. - CI: Build and test pipeline checks FIPS capability and
go mod tidycleanliness.
- BBMTLib:
- Bold Wallet Chrome extension: Device tab and Wallet home improvements.
- Device tab: In the “Bold Web • Extension” section, added a link to install the Bold Wallet Chrome extension (Chrome Web Store).
- Wallet home: Replaced the extension-pairing system Alert with a dedicated Extension Pairing modal: step-by-step explanation, Confirm/Cancel, and theme-aware typography (AppText, light/dark).
- BBMTLib build:
build.shhardened (set -euo pipefail), FIPS and environment checks,go mod tidy/download/verify; gomobile/gobind validation. - Lint: Resolved inline-style warnings in
ExtensionPairingModalandKeyshareInfoContent; removed unused imports inMobilesPairing,SignedPSBTModal, andUserPreferenceScreen.
- Version:
package.json2.2.0; Android/iOS version bumps as applicable. - BBMTLib:
go.mod/go.sumupdates; README documents FIPS build and randomness behavior.
- Send Bitcoin: sats-aware amount input:
SendBitcoinModalnow respects the BTC/Sats toggle from Wallet Home for the main amount field, including label/placeholder (“Amount in sats” vs “Amount in BTC”), numeric keyboard selection, and Max behavior, while keeping all internal math in BTC and sending in sats. - Send Bitcoin: fee estimation UX: Added consistent fee error handling with a unified “Fee Estimation Error” dialog that offers Retry/Cancel; prevents overlapping fee requests (Max is disabled while estimating), and ensures no alerts or side effects fire once the modal is closed or unmounted.
- Send Bitcoin: address validation: Uses network-aware validation via
validateBitcoinAddressEnhancedso fee estimation, Max, QR imports, and send confirmation all require an address valid for the currently selected network, with inline error messaging. - Static QR copy behavior: The “Scan on another device to auto fill” QR in
TransportModeSelectoris now explicitly non-copiable viacopyDisabled, while other QR usages remain copiable by default.
- Device QR toast ordering: Resolved a Toast host conflict so QR-related toasts on the Devices screen now appear above their modals (no longer hidden underneath overlays).
- Version bump: Updated Android
versionCode/versionName, iOSCURRENT_PROJECT_VERSION/MARKETING_VERSION, andpackage.jsonto2.1.15.
- Settings sections and subsections: Reorganized Settings into clear groups
- App: Theme, Balance Display, Haptics, Storage, App Icon (Android)
- Wallet: Security, Address Type (with address-type-icon), Network providers, Nostr Relays
- Advanced: Wallet tab, UTXOs tab, PSBT, Mempool Playground, Dev Debug, Font Testing
- Info: Legal and About under a single “Info” section header
- Tab visibility toggles (Advanced): User can show/hide tabs; preferences persisted
- Wallet tab toggle (default on)
- PSBT tab toggle (default off)
- UTXOs tab toggle (default off)
- Mempool Playground (Play) tab toggle (default off)
- Active tab priority on load: Wallet → PSBT → Device (only if toggled on)
- Address Type: Uses
address-type-icon.pngin Settings - UTXOs tab: Uses
utxo-icon.pngin tab bar (replacing out-icon) - Tab bar labels: Auto-shrink to fit (bounded width,
adjustsFontSizeToFiton iOS); smaller base font on Android; icon wrapper in StyleSheet (lint) - Tab bar icon: Slight inset so UTXO icon (and others) are not trimmed at top
- Lock / reopen:
UserProviderwraps both lock screen and main content so tab preferences and last-active tab persist across lock/unlock (e.g. reopening stays on PSBT when PSBT was active)
- UserContext:
showWalletTab,showPsbtTab(default off),showMempoolPlayground(default off),showUtxosTab(default off); load/save via LocalCache (wallet_tab_enabled,psbt_tab_enabled,mempool_playground_enabled,utxos_tab_enabled) - utils.js:
getResetToMainTabsWallet/getResetToMainTabsPSBTacceptshowWallet; routes omit Wallet/PSBT when toggled off; selected index follows priority Wallet → PSBT → Device - App.tsx: Tab.Screen for Wallet/PSBT conditional on
showWalletTab/showPsbtTab;initialRouteName= first available of Wallet, PSBT, Device;UserProvidermoved to wrap lock + main content - WalletSettings:
SettingsSectionGroupfor section headers; Advanced holds Wallet tab, UTXOs, PSBT, Playground, Dev Debug, Font Testing; Info holds Legal and About
- Bottom Tab Navigation: New tab-based navigation for main app areas
- Four tabs: Device, Wallet, PSBT, Settings — direct access without drilling through stack
- Custom tab bar with theme-aware icons (Device, Wallet, Cosign, Settings)
- Floating lock FAB (bottom-right) for quick lock, with platform-specific styling
- Main content (Wallet, PSBT, Settings) lives in tabs; pairing flows remain in stack
- Device Tab / DeviceScreen: Dedicated screen for device and keyshare management
- New Device tab as first-class destination for keyshare info, backup, and device-related actions
- Replaces deep navigation from Wallet/Settings for device operations
- Toast Notifications: App-wide toast feedback
- Integrated
react-native-toast-messagewith theme-awarecreateToastConfig - Used for copy confirmations, success/error feedback, and debug badges
- Toast wrapper in App root with correct z-index and pointer-events
- Integrated
- Address Type Modal: Dedicated modal for address type selection/display
AddressTypeModalcomponent for choosing or viewing address type (Legacy, SegWit Native, SegWit Compatible)- Used in WalletHome and flows that depend on address type (e.g. after network change)
- Integrates with
updateAddressTypeModalfor network-driven address updates
- AppPressable Component: Reusable pressable for consistent touch UX
- New
AppPressablewith variants (default, strong, none) and optional haptic feedback - Replaces
TouchableOpacityacross modals, settings, pairing, and wallet screens - Unified opacity and feedback behavior app-wide
- New
- Keyshare UI Refactor: Backup and info split from legacy KeyshareModal
BackupKeyshareModalandKeyshareInfoContentfor backup and detailed keyshare infoKeyshareModal.tsxremoved; functionality consolidated into BackupKeyshareModal and KeyshareInfoContent- Clearer separation between “backup” and “info” use cases
- Navigation Structure: Stack now wraps MainTabs (Device, Wallet, PSBT, Settings)
- Welcome, Devices Pairing, Nostr Connect, and User Preferences remain stack-only
- Home/PSBT/Settings moved into tab navigator with per-tab headers
- Header / Network Provider: Network provider row tappable; optional settings callback
HeaderNetworkProvidersupportsonPressandonSettingsPressfor provider/settings access- Side button width standardized (
SIDE_BUTTON_WIDTH) for layout symmetry
- Theme and Controls: Switch and warning colors aligned with theme
- Switch colors use theme palette for light/dark mode
- Warning colors consolidated in theme; removed hardcoded values and
warningBg - WalletSettings styles made reactive to theme changes (fixes Android theme switch)
- Debug Logging: Session-based debug with safe console restore
- When enabling debug, original console methods restored before use, then re-applied
- Exported
setDebugLoggingEnabled/isDebugLoggingEnabledfor WalletSettings - Avoids “logging enabled” message being dropped when console was previously disabled
- Network Routing for QR Scanning: Correct routing when opening QR scanner from different contexts (e.g. Send vs Receive)
- Android Exit Button Styling: Styling and behavior of exit/back button in relevant screens (e.g. pairing/QR) corrected
- WalletSettings Theme Reactivity: Force re-render on Android when theme changes so styles update immediately
- TSS / Nostr: LocalStateNostr type restored; mutex deadlock fixes in Nostr/TSS layer (mpc_nostr, relay, etc.)
- Docs: Removed obsolete
docs/BITCOIN_DISPLAY_PLAN.md
- Dependencies:
@react-navigation/bottom-tabs,react-native-toast-messageadded;utils/toastConfig.tsxfor theme-aware toast config - New/Refactored Components:
DeviceScreen,AddressTypeModal,AppPressable;BackupKeyshareModal+KeyshareInfoContent; tab bar icons andTabBarButtonin App - App.tsx: MainTabs with tab bar, lock FAB, Toast wrapper; debug logging tied to
debugLoggingEnabledRefand native log listeners - BBMTLib: btc.go, hooks.go, interfaces.go, mpc.go, mpc_nostr.go, relay.go, logs.go updates; localstate_nostr cleanup
- Version: 2.1.13 (package.json); build numbers updated for iOS/Android as applicable
- Custom Font System: Professional typography with Inter and JetBrains Mono fonts
- Inter font family for UI text (Regular, Medium, SemiBold weights)
- JetBrains Mono font family for technical content like Bitcoin addresses (Regular, Medium, Bold weights)
- New font system with proper font family mappings and weight-to-family conversion
- Font comparison and verification components for testing and validation
- Automated font download scripts and comprehensive documentation
- Font assets properly linked for both iOS and Android platforms
- Enhanced typography consistency across all screens and components
- Mempool Privacy Configuration: New user preference screen for enhanced privacy
- Custom mempool.space API endpoint configuration during wallet setup
- Privacy-focused feature to reduce third-party tracking of Bitcoin addresses
- API endpoint validation with automatic URL normalization
- Option to skip configuration and use default public mempool servers
- Settings integration for changing API endpoint after wallet creation
- Educational information about privacy benefits of self-hosted mempool servers
- Comprehensive Icon Asset Library: Added 50+ new icon assets for improved UI consistency
- Icons for settings, actions, network status, and wallet features
- Theme-aware icon support with inverted variants for dark mode
- Consistent icon styling across all screens and components
- User Preference Screen: New onboarding screen for privacy configuration
- Clean, professional UI with privacy-focused messaging
- API endpoint input with validation and error handling
- Skip option for users who prefer default settings
- Integrated into app navigation flow
- Settings: Wallet Balance Formatting Option: New user preference for balance display formatting
- Toggle between raw numbers and formatted display with thousand separators
- Better readability for large Bitcoin amounts and satoshi values
- Preference persists across app sessions
- Enhanced visual clarity for decimal precision verification
- Settings: Dev Debug Mode (Advanced): Developer-focused debugging features
- Hidden developer debug section accessible via build number (7 clicks on Android)
- Debug logging toggle for logcat visibility (Android only)
- Session-only debug logging that resets on app restart
- Visual progress indicator with badge and toast notifications
- Enhanced UI with status indicators and card-based layout
- Warning messages for sensitive information handling
- Typography System Refactoring: Complete font system overhaul
- Migrated from system fonts to custom Inter and JetBrains Mono fonts
- New
theme/fonts.tsmodule with font utilities and mappings - Font weight to font family mapping for proper font selection
- Enhanced font style creation with theme integration
- All components updated to use new font system
- Component Font Updates: Updated all components to use new font families
- TransactionList, TransactionDetailsModal, TransactionListSkeleton with Inter fonts
- WalletSkeleton, Header, CurrencySelector with updated typography
- QRScanner components with monospace font for addresses
- TransportModeSelector, CacheIndicator, and other UI components
- Consistent font usage across all screens
- Screen Refactoring: Improved code organization and font integration
- MobileNostrPairing, MobilesPairing screens with font updates
- PSBTModal, PSBTScreen with enhanced typography
- SendBitcoinModal, ReceiveModal, SignedPSBTModal with font improvements
- WalletHome, WalletSettings, ShowcaseScreen with updated fonts
- LoadingScreen with theme-aware font support
- Asset Organization: Better asset management and organization
- New assets directory structure with organized icon assets
- Font assets properly linked via manifest files
- Improved asset loading and caching
- Font Normalizations (iOS and Android): Enhanced cross-platform font consistency
- Improved font rendering consistency across iOS and Android platforms
- Better font weight mapping and family selection
- Optimized font loading and caching
- Enhanced monospace font rendering for technical content
- Nostr Pairing UI Flow Simplification: Streamlined device pairing experience
- Simplified pairing flow with clearer step indicators
- Reduced UI complexity and improved user guidance
- Better error messaging and recovery paths
- Enhanced visual feedback during pairing process
- Enhanced Device Keyshare Modal Info Optimization: Improved keyshare information display
- Enhanced wallet information display with better organization
- Clearer capabilities and feature indicators
- Bold Web Extension connector information
- Watch Wallet Export with output descriptor support
- Better visual hierarchy and information architecture
- Better Network Handling: Improved network error management
- Reduced annoying UI error alerts for network issues
- Background API retry logic with exponential backoff
- Better error recovery and user feedback
- Graceful degradation when network is unavailable
- Improved timeout handling and connection management
- React Native Performance Optimization and Refactoring: Enhanced app performance
- Code refactoring for better maintainability
- Performance optimizations across components and screens
- Reduced re-renders and improved state management
- Better memory management and resource cleanup
- Optimized asset loading and caching
- Nostr/TSS Performance and Stability Enhancements: Improved reliability
- Enhanced Nostr transport layer performance
- Better TSS library stability and error handling
- Improved session management and recovery
- Optimized message processing and chunk handling
- Enhanced panic recovery and error logging
- Font Consistency Issues: Fixed inconsistent font rendering across platforms
- Proper font family mapping for iOS and Android
- Fixed font weight issues with correct font file selection
- Improved monospace font rendering for Bitcoin addresses
- Better font fallback handling
- Code Cleanup: Removed unused code and contexts
- Removed unused NetworkContext, UserContext, WalletContext files
- Cleaned up unused components and utilities
- Removed deprecated useQRScanner hook
- Improved code organization and maintainability
- Co-Signing Timeout Fix: Fixed transaction co-signing timeout issues
- Added validation to ensure all npubs are fully converted before enabling co-signing button
- Prevents session ID mismatch between devices during pre-agreement phase
- Button now properly disabled until all device npubs are loaded and converted from hex format
- Fixes timeout issues when Android and iOS devices have different session IDs
- Final Step UI Improvements: Enhanced Final Step section UI and layout
- Removed card container wrapper for cleaner layout
- Moved "All devices ready" checkbox and "Start Key Generation" button to appropriate sections
- Improved spacing and visual hierarchy in Final Step section
- Better participant device information display
- Updated typography for participant titles
- Dev Debug Section UI/UX: Enhanced developer tools interface
- Improved visual design with card-based layout
- Better status indicators and feedback
- Enhanced button styling and interactions
- Improved accessibility and user experience
- Font System: New
theme/fonts.tsmodule with comprehensive font utilities- Font family mappings for Inter and JetBrains Mono
- Weight-to-family conversion for proper font selection
- Font style creation utilities with theme integration
- Platform-specific font handling
- Font Assets: Added font files for both iOS and Android
- Inter-Regular.ttf, Inter-Medium.ttf, Inter-SemiBold.ttf
- JetBrainsMono-Regular.ttf, JetBrainsMono-Medium.ttf, JetBrainsMono-Bold.ttf
- Proper font linking via link-assets-manifest.json files
- User Preference Screen: New screen component for privacy configuration
- API endpoint validation with timeout handling
- URL normalization and validation logic
- Integration with UserContext for API provider management
- Asset Management: 50+ new icon assets added
- Icons organized in assets/assets/assets/ directory
- Theme-aware icon variants for light and dark modes
- Files Changed: 144 files changed with 6,026 insertions and 3,817 deletions
- Components Updated: All major components updated for new font system
- Screens Updated: All screens updated with font improvements and privacy features
- Build System: Updated iOS Xcode project and Android build configuration for font assets
- Dev Debug Implementation: New developer tools section in WalletSettings
- Build number click tracking with visual feedback
- Session-based debug logging toggle
- Enhanced UI components with status indicators
- Performance Improvements: Multiple optimization passes
- Component refactoring for better performance
- State management optimizations
- Network handling improvements
- Native Libraries: Updated TSS framework binaries for iOS and Android
- Transaction List Typography Improvements: Enhanced font sizes and weights for better readability and visual hierarchy
- Status text increased from 13px to 16px (lg) for improved readability
- Fiat amount increased from 12px to 13px (base) for better accessibility
- Address labels and transaction IDs standardized to 13px (base) for consistency
- Improved typography hierarchy following mobile financial app best practices
- Better visual balance between primary, secondary, and tertiary information
- Dark Mode Color Theme: Replaced yellow accent colors with Bitcoin orange (#F7931A) in dark mode
- Transaction status badges now use Bitcoin orange instead of yellow in dark mode
- All accent colors across screens and components updated to Bitcoin orange in dark mode
- Maintains yellow accent in light mode for consistency
- Updated components: TransactionDetailsModal, TransactionList, TransportModeSelector, CurrencySelector, CacheIndicator, Styles
- Updated screens: WalletSettings, ShowcaseScreen, SendBitcoinModal, PSBTScreen, MobilesPairing, MobileNostrPairing
- Header Visual Symmetry: Improved header layout balance
- Price button width now matches combined width of lock and settings buttons for visual symmetry
- Better visual balance between left and right header elements
- Enhanced header component consistency
- Transaction Details Font Sizing: Fixed inconsistent font sizes in transaction details modal
- From/To address font sizes aligned with transaction ID font size (14px)
- Address index labels standardized to 14px for consistency
- Improved readability and visual consistency across transaction details
- Files Changed: 14 files changed with 341 insertions and 219 deletions
- Components Updated: TransactionList, TransactionDetailsModal, Header, Styles, CacheIndicator, CurrencySelector, TransportModeSelector
- Screens Updated: WalletSettings, ShowcaseScreen, SendBitcoinModal, PSBTScreen, MobilesPairing, MobileNostrPairing
- Version Update: Version bumped to 2.1.11
- Comprehensive Panic Recovery in Nostr Transport: Enhanced error handling and crash prevention throughout the Nostr transport layer
- Panic recovery added to chunk assembler operations (
ChunkAssembler.Add,ChunkPayload,ParseChunkTag) - Panic recovery in message pump operations (
MessagePump.Run,processEvent, query goroutines) - Panic recovery in session coordinator (
SessionCoordinator.AwaitPeers,PublishReady,PublishComplete) - Stack trace logging for all panic recoveries to aid debugging
- Improved reliability and stability of Nostr-based device pairing and transaction signing
- Panic recovery added to chunk assembler operations (
- Theme-Aware Typography System: Font system now uses theme constants for consistency
- Font sizes now use
theme.fontSizes(xl, lg, base) instead of hardcoded values - Font weights use
theme.fontWeights(bold, semibold, normal) with proper type casting - Font families use
theme.fontFamilies(regular, monospace) for better theming support - Enhanced typography consistency across all screens and components
- Font sizes now use
- Nostr Transport Layer Refactoring: Improved code organization and error handling
- Enhanced chunk handling with better metadata parsing and validation
- Improved message processing with better error recovery
- Enhanced session management with better peer coordination
- Improved client connection handling and relay communication
- Better error messages and logging throughout the transport layer
- Screen Component Refactoring: Major refactoring across multiple screens for better code organization
MobileNostrPairing.tsx: Significant refactoring (1102 lines changed) with improved error handling and code formattingMobilesPairing.tsx: Refactored with better code structure (474 lines changed)PSBTModal.tsx: Enhanced with improved UI and error handling (217 lines changed)WalletSettings.tsx: Updated with better organization (251 lines changed)ShowcaseScreen.tsx: Improved layout and functionality (118 lines changed)WalletHome.tsx: Refactored for better maintainability (168 lines changed)PSBTScreen.tsx,SendBitcoinModal.tsx,SignedPSBTModal.tsx: Enhanced with improvements
- Component Theme Integration: Enhanced components with better theme support
Header.tsx: Updated with theme-aware typography (47 lines changed)TransactionList.tsx: Improved theme integration (47 lines changed)QRScanner.tsx: Enhanced with theme constants (18 lines changed)KeyshareModal.tsx: Updated with improvements (14 lines changed)Styles.tsx: Refactored for better organization (153 lines changed)
- TSS Library Updates: Updated native libraries with improvements
- Updated TSS framework binaries for iOS (all architectures)
- Updated TSS AAR library for Android
- Enhanced Go library with improved error handling and panic recovery
- Nostr Transport Stability: Fixed potential crashes from unhandled panics in transport operations
- All critical operations now have panic recovery with proper error handling
- Better error messages for debugging transport issues
- Improved reliability of chunk assembly and message processing
- Code Formatting and Consistency: Improved code formatting across multiple files
- Better indentation and line breaks for improved readability
- Consistent code style across screens and components
- Removed unused code (LoadingScreen.tsx cleanup)
- Nostr Transport Layer: Enhanced with comprehensive panic recovery
chunker.go: Added panic recovery to chunk operationspump.go: Enhanced message pump with panic recovery in all goroutinessession.go: Added panic recovery to session operationsclient.go,messenger.go,relay.go: Improved error handling
- Version Update: Android version code bumped to 43, version name to 2.1.10
- Files Changed: 39 files changed with 2,213 insertions and 1,152 deletions
- Build System: Updated iOS Xcode project and Android build configuration
- Modular Header Components: New reusable header components for better code organization
HeaderPriceButton: Standalone BTC price display component with currency selector integrationHeaderNetworkProvider: Network and API provider information display component- Improved component modularity and reusability across the app
- Extended Theme Color System: Enhanced theme palette with comprehensive overlay colors
- New color constants:
bitcoinOrange,warning,success, and their variants - Glassmorphism overlay colors:
blackOverlay02-50,whiteOverlay08-30,primaryOverlay95 - Status color overlays:
receivedOverlay15/40,dangerOverlay15/40 - Skeleton loading colors:
skeletonGray - Better support for layered UI effects and visual depth
- New color constants:
- Balance Header Controls: New style properties for balance visibility and unit toggling
balanceHeaderControls,balanceEyeIcon,balanceUnitToggleContainerstyles- Foundation for enhanced balance display controls
- Theme Color Consistency: Replaced hardcoded color values with theme color constants
- Modal backdrops now use
theme.colors.modalBackdropinstead of hardcoded rgba values - Error boundary colors use
theme.colors.dangerandtheme.colors.white - QR Scanner components use theme colors for text, progress bars, and backgrounds
- Currency selector and legal modals use theme-aware backdrop colors
- Modal backdrops now use
- Dark Mode Detection: Simplified dark mode detection logic
- Changed from checking background color strings to simple
!== '#ffffff'comparison - More reliable and performant dark mode detection
- Consistent dark mode behavior across all header components
- Changed from checking background color strings to simple
- Header Component Styling: Enhanced header button and container styling
- Consistent use of
theme.colors.blackOverlay06andtheme.colors.blackOverlay10for light mode - Better border and background color consistency across header elements
- Improved visual hierarchy with theme-aware styling
- Consistent use of
- Glassmorphism Effects: Enhanced glassmorphism with new overlay color system
- Wallet header uses
primaryOverlay95in light mode andwhiteOverlay15in dark mode - Consistent border colors using
whiteOverlay30for better contrast - More refined visual depth and layering effects
- Wallet header uses
- Color Consistency Issues: Fixed hardcoded color values throughout components
- Replaced
rgba(0, 0, 0, 0.5)withtheme.colors.modalBackdropin modals - Replaced
#ff6b6bwiththeme.colors.dangerin error boundaries - Replaced
#FFFFFFand rgba white values withtheme.colors.whiteand opacity variants - Replaced
#F7931Awiththeme.colors.bitcoinOrangein QR scanners
- Replaced
- QR Scanner Theme Support: Improved QR scanner color consistency
- All text colors now use theme color constants with proper opacity
- Progress bars use theme colors for better visual consistency
- Better dark mode support across all QR scanner variants
- Component Refactoring: Header component split into modular sub-components
HeaderPriceButton: 216 lines of new component codeHeaderNetworkProvider: 216 lines of new component code- Better separation of concerns and component reusability
- Theme System: Extended
Styles.tsxwith 30+ new color constants- New overlay color system for glassmorphism effects
- Better type safety with TypeScript theme definitions
- Version Update: Android version code bumped to 42, version name to 2.1.9
- Files Changed: Multiple components updated for theme color consistency
Header.tsx,Styles.tsx,ErrorBoundary.tsx,CurrencySelector.tsxLegalModal.tsx,LegacyWalletModal.tsx,QRScanner.tsx,QRScanner.foss.tsx
- Dark Mode Support: Complete dark mode implementation with system theme detection
- New theme system with light and dark themes (
theme/themes.ts) - Theme context provider with OS-based, light, and dark mode options (
theme/context.tsx) - Automatic system theme detection and persistence of user preference
- Dark mode optimized color palette with improved contrast and readability
- Support for theme mode switching in wallet settings
- New theme system with light and dark themes (
- Wallet Home UI Revamp: Redesigned wallet home screen with enhanced visual hierarchy
- Improved balance container styling with dark mode support
- Enhanced glassmorphism effects for better visual depth
- Updated wallet header with better contrast and visibility
- Refined action button styling and positioning
- Enhanced Header Component: New header system with integrated features
- BTC price display in header with currency selector integration
- Custom header components with configurable height
- Improved header button styling with dark mode support
- Better visual integration of price and currency information
- iOS Framework dSYM Generation: Automated dSYM generation for crash reporting
- New script (
ios/scripts/generate_framework_dsyms.sh) for generating dSYM files - Automatic dSYM generation for Tss.framework and hermesvm.framework
- Integrated into Xcode build process for release builds
- Improved crash symbolication support for embedded frameworks
- New script (
- Dark Mode Assets: New inverted icon assets for dark mode compatibility
bold-icon-inverted.pngfor dark mode header displayicon-inverted.pngfor dark mode app icon variants
- Theme System Refactoring: Complete theme architecture overhaul
- Migrated from single
theme.jsto modular theme system (theme/directory) - Separated theme types, definitions, context, and utilities
- Improved type safety with TypeScript theme definitions
- Better theme mode management with OS default support
- Migrated from single
- UI Components Dark Mode Support: All major components updated for dark mode
TransactionListandTransactionListSkeletonwith dark mode stylingTransactionDetailsModalwith improved dark mode contrastTransportModeSelectorwith theme-aware stylingWalletSkeletonwith dark mode loading statesQRScannercomponents with dark mode supportCurrencySelectorwith theme-aware UILegalModalandLegacyWalletModalwith dark mode styling
- Wallet Settings Theme Integration: Theme selector in wallet settings
- New theme mode selector (OS Default, Light, Dark)
- Theme preference persistence across app sessions
- Legacy theme migration support
- Docker Build Optimizations: Improved Docker build process
- Fixed working directory context in Dockerfile
- Better path handling for Go module downloads
- Improved build reliability and consistency
- Loading Screen Theme Support: Fixed loading screen background for dark mode
- Error Boundary Theme Integration: Updated error boundary with theme support
- Cache Indicator Dark Mode: Improved cache indicator visibility in dark mode
- Showcase Screen Theme Support: Updated showcase screen with dark mode styling
- PSBT Screen Theme Integration: Enhanced PSBT screen with theme-aware components
- Receive Modal Dark Mode: Improved receive modal styling for dark mode
- Send Bitcoin Modal Theme Support: Enhanced send modal with dark mode styling
- Theme Architecture: New
theme/directory structuretypes.ts: TypeScript type definitions for themesthemes.ts: Light and dark theme definitionscontext.tsx: React context for theme managementutils.ts: Theme utility functionsindex.ts: Theme module exports
- Component Updates: 39 files changed with 2,967 insertions and 1,522 deletions
- Build System: iOS Xcode project updated with dSYM generation build phase
- Asset Management: New inverted icon assets for dark mode compatibility
- Docker Build System: Complete Docker-based build infrastructure for Android APK compilation with cross-platform support
- Enhanced QR Code for Send Bitcoin: QR codes now include address type, derivation path, and network to prevent session timeouts between devices
- From Address Display: Transaction details now show the source (from) address in pairing screens
- Watch-Only Wallet Export: Streamlined to output descriptors only (removed xpub/tpub export)
- Multiple Address Display in Transactions: Transaction details now show all recipient addresses for sent transactions and all sender addresses for received transactions
- Sent transactions with multiple outputs (e.g., PSBT transactions) display all recipient addresses with individual amounts
- Received transactions with multiple inputs display all sender addresses with the received output amount
- Each address shows its BTC amount and fiat equivalent
- Transaction list shows count indicator for multiple recipients: "To: address... (+2 more)"
- Docker Build System: Moved Docker scripts to organized
docker/scripts/directory - Android Build Configuration: Enhanced build system with Docker-specific Gradle settings and improved ProGuard rules
- Nostr Transport Panic Recovery: Enhanced panic recovery in co-signing operations with better error handling
- Legacy Wallet Migration Modal: New modal appears for users with legacy wallets, advising migration to new wallet setup
- Network Reset on Wallet Import: Network always resets to mainnet when importing a keyshare to ensure clean state
- Address Flickering Issue: Fixed address changing/flickering after lock/unlock by making UserContext the single source of truth
- Session Timeout Fix for QR Code Scanning: Fixed session timeouts when scanning send Bitcoin QR codes from second device
- TransactionList Loading State: Fixed infinite "Loading..." state and network errors when restoring wallet for the first time
- Balance Card in Send Modal: New prominent balance card displayed above amount input in Send Bitcoin modal
- Shows available balance in BTC and fiat currency
- Integrated "Max" button for quick balance selection
- Clean, professional UI with card styling
- Smart Balance Check for Send Button: Automatic balance refresh when clicking Send with zero balance
- Prevents modal from opening prematurely when balance hasn't loaded
- Shows loading spinner on Send button during balance check
- Automatically opens modal if balance is found, or shows alert if truly zero
- Prevents multiple rapid clicks with button disable state
- 5-second timeout with graceful error handling
- Co-signing Go Panic Recovery: Fixed potential panic crashes in Nostr transport layer during co-signing
- Added panic recovery with stack trace logging in
Client.Publishgoroutine - Improved nil pointer safety when extracting relay URLs
- Better error messages for debugging relay connection issues
- Enhanced resiliency for co-signing message delivery across multiple relays
- Added panic recovery with stack trace logging in
- Send Button Balance Race Condition: Fixed issue where Send button would show "Insufficient Balance" alert even when balance was still loading
- Eliminates flickering and need to click Send button multiple times
- Better UX with immediate feedback during balance check
- Send Modal UI Enhancement: Improved balance visibility and Max button placement
- Balance card replaces inline "Max" text link
- More prominent balance display with better visual hierarchy
- Updated QR scanner icon to use scan-icon.png for consistency
- WalletHome.tsx: Added
checkBalanceForSend()function for dedicated balance fetching - SendBitcoinModal.tsx: New balance card component with integrated Max button
- client.go: Enhanced panic recovery and error handling in Nostr publish operations
- Error Handling: Improved timeout and error recovery for balance checks
- Resilient Nostr relay connections: BTC sends now work reliably even if some Nostr relays are down
- Automatically connects to multiple relays in parallel
- Continues working if relays fail during the signing process
- Faster connection establishment and better error recovery
- Faster pre-agreement timeout: Reduced from 2 minutes to 16 seconds for quicker failure detection
- Android navigation bar overlap: Fixed bottom navigation bar overlapping system navigation on Android devices (e.g., Samsung)
- Message delivery reliability: Improved handling of messages sent just before subscription starts
- Hide/show balance user preference: Tap balance to toggle visibility, preference persists across app sessions
- Unified QR Scanner component (
components/QRScanner.tsxandcomponents/QRScanner.foss.tsx):- Platform-specific implementations: iOS uses
react-native-vision-camera, Android usesrn-barcode-zxing-scan - Support for both single and continuous scanning modes
- Progress indicator for animated QR codes
- Customizable titles, subtitles, and close button text
- Platform-specific implementations: iOS uses
- New
useQRScannerhook for reusable QR scanning logic - Enhanced pubkey matching logic in
BBMTLib/tss/psbt.go:- Better validation of input ownership before signing
- Improved logging for debugging signature issues
- Skips signing inputs that don't belong to the wallet (prevents errors)
- More reliable pubkey derivation verification
- PSBT sign filter: Automatically filters and only signs inputs that belong to the wallet, preventing errors from unrelated inputs
- QR Scan shortcut for Send (Second Device): Added QR code option in transport mode selector to share transaction details (address, amount, fee) from one phone to another for quick entry
- Wallet mode terminology: Updated from "basic/flexi" to "duo/trio" for clearer wallet type indication (2/2 vs 2/3 multisig)
- Keyshare backup naming: Keyshare backup files now use xpub-based naming with index (e.g.,
a6tr2-1.ks,a6tr2-2.ks,a6tr2-3.ks) for better organization and identification - Default address type: New wallets default to SegWit Native (BIP84) instead of Legacy addresses for better efficiency and lower fees
- Refactored screens to use new QR scanner:
MobileNostrPairing.tsx- Simplified QR scanning integrationSendBitcoinModal.tsx- Improved QR code scanning UXPSBTModal.tsx- Enhanced QR code handlingWalletHome.tsx- Updated QR scanning flow
- Code cleanup: Removed large FOSS variant files (reduced codebase by ~8,500 lines):
screens/MobileNostrPairing.foss.tsx(6,032 lines removed)screens/PSBTModal.foss.tsx(1,661 lines removed)screens/SendBitcoinModal.foss.tsx(782 lines removed)
- Wallet Context & Address Handling: Improved address type handling with legacy wallet detection
- Derive path management: Better derive path management for different network types
- Address type caching: Enhanced address type caching and retrieval
- Build & Dependencies: Updated Android build configuration and TSS library binaries (iOS and Android)
- Release script: Improved release script (
android/release.sh)
- Components: Updated
KeyshareModal.tsx,TransportModeSelector.tsx, andStyles.tsx - Screens: Improvements to
WalletSettings.tsx,ShowcaseScreen.tsx, andPSBTScreen.tsx - Utilities: New utility functions in
utils.js(53 lines added) with improved error handling and logging - Native Libraries: Updated TSS framework binaries for iOS (all architectures) and TSS AAR library for Android
- Native headers: Updated native headers and Info.plist files
- Statistics: 32 files changed, 1,570 insertions, 9,089 deletions (net reduction of ~7,500 lines)
bold-spendcross-platform binary: New standalone binary for spending Bitcoin from keyshares- Works on Windows, Linux, and macOS (AMD64 and ARM64)
- Self-contained - spawns itself as separate processes (no external dependencies)
- Supports all address types (P2PKH, P2WPKH, P2SH-P2WPKH, P2TR)
- Preview mode for fee estimation without sending transactions
- Support for encrypted keyshares with separate passphrases per keyshare
- Direct file path support (works with mobile app backup files)
- Enhanced
spend-bitcoin.shscript:- Named arguments (flags) for better clarity and user experience
--passphrase1and--passphrase2for individual keyshare decryption--keyshare1and--keyshare2flags to override default file paths--previewflag for fee estimation without executing transactions- Improved error messages listing missing required arguments
- Default keyshare files:
peer1.ksandpeer2.ks
- Comprehensive Recovery Documentation:
- Updated
RECOVER.mdwith mobile app backup file naming conventions - Examples for using
.sharefiles directly from mobile app backups - Platform-specific instructions for Windows, Linux, and macOS
- Complete workflow examples for both
bold-spendbinary andspend-bitcoin.shscript
- Updated
- PSBT Screen Section Titles: Updated to "Bold Cosign | PSBT Signer" for clarity
- Import Button Text: "Upload PSBT File" → "Load PSBT File" for better clarity
- Expand Icon Rotation: Fixed to rotate 90° clockwise (was 180°) for both collapsible sections in PSBT screen and settings
- Embedded PSBT Modal: Removed redundant borders when used inside collapsible sections
- PSBTModal.foss.tsx Alignment: Fully aligned styles and UI with PSBTModal.tsx
- Network badge styling (fontSize: 10, fontWeight: 700, letterSpacing: 0.5)
- Cancel button disabled state (opacity: 0.5, added text disabled style)
- Middle button container positioning (moved inside action buttons container)
- Double Borders: Removed borders from embedded PSBT modal to prevent double borders in collapsible sections
- Collapsible Section Expand Icons: Fixed rotation animation in both PSBTScreen and WalletSettings
- New binary:
BBMTLib/tss/cmd/bold-spend/main.go- Cross-platform Go binary - Build script:
BBMTLib/build-bold-spend.sh- Automated cross-compilation for all platforms - Documentation: Enhanced
RECOVER.mdwith mobile app backup file format examples and platform-specific guidance - PSBT Screen: Added collapsible Sign PSBT section with smart default states
- Added
psbt_mode_first_visitflag in EncryptedStorage for state tracking - Added
psbtRotationAnimanimation for Sign PSBT section - First visit after PSBT mode toggle: Both sections closed
- Subsequent visits: Bold Connect closed, Sign PSBT open by default
- Added
- Modal Alignment: Aligned all style properties between PSBTModal.tsx and PSBTModal.foss.tsx
- Multi-address type output descriptors: Support for generating output descriptors for all three Bitcoin address types (Legacy, SegWit Native, SegWit Compatible)
- PSBT Screen enhancements:
- New dedicated PSBT screen with collapsible "Bold Connect" section
- Display of all three output descriptor types with individual copy/share/QR buttons
- Improved UI/UX with consistent styling, shadows, and borders
- Transport mode selector integration for PSBT signing
- Keyshare Modal improvements:
- Display of wallet creation timestamp (
created_at) in keyshare details - List of all output descriptors (Legacy, SegWit Native, SegWit Compatible) in Wallet Home modal
- Display of wallet creation timestamp (
- Utility function:
generateAllOutputDescriptors()inutils.jsfor centralized descriptor generation logic
- Backward compatibility for old wallets:
- Old wallets (created_at <= 1765894825732) continue using BIP44 paths for all address types
- Old wallets show all three descriptor formats (pkh, wpkh, sh(wpkh)) but all use BIP44 derivation path
- New wallets use optimized BIP84/BIP49 paths for SegWit address types
- Derivation path logic: Updated
getDerivePathForNetwork()to support address types with legacy wallet detection - Output descriptor generation: Go function
GetOutputDescriptor()now acceptsaddressTypeparameter - Native bindings: Updated iOS (Swift/Objective-C) and Android (Kotlin) bindings to support address type parameter
- ESLint warnings for unused variables
- JSX syntax errors in PSBTModal
- Collapsible section animation issues in PSBTScreen
- Go changes:
BBMTLib/tss/common.go- Added addressType parameter toGetOutputDescriptor() - Native modules: Updated iOS and Android native module bindings
- UI components: Enhanced PSBTScreen, KeyshareModal, and WalletHome with multi-descriptor support
- Migration strategy: Timestamp-based detection (1765894825732) to distinguish old vs new wallets
- FOSS Version for MobileNostrPairing: Added
MobileNostrPairing.foss.tsxfor F-Droid builds - Removed react-native-vision-camera Dependency: Replaced iOS camera with
BarcodeZxingScanfor both iOS and Android platforms - F-Droid Build Support: MobileNostrPairing now passes F-Droid open source restrictions, similar to SendBitcoinModal
- Loading Screen Background Fix: Added proper background color to safe area container for consistent theming
- Android Launcher Icons: Updated and optimized Android app launcher icons across all density variants
- Icon Optimization: Reduced file sizes while maintaining visual quality
- Docker Caching for Nostr Relay: Added Docker image caching for nostr-rs-relay in GitHub Actions to speed up test runs
- Improved Test Pipeline: Updated GitHub Actions workflow to require local Docker-based Nostr relay for testing
- Test Script Enhancements: Enhanced test-all.sh with better error messages and local relay requirements
- Test Optimization: Removed redundant tests that are already covered by the local relay
- Created FOSS-compatible version of MobileNostrPairing screen
- Unified QR scanning implementation using BarcodeZxingScan across all platforms
- Maintained full feature parity with standard version
- Version code bumped to 32 (Android) and build 32 (iOS)
- Fix Double Promise Callback Crash: Prevented SIGABRT crash caused by double promise resolution in native modules
- PostTx Retry Logic: Transaction broadcasting now automatically retries up to 4 times with exponential backoff (1s, 2s, 3s delays) if the initial broadcast fails
- Redesigned Header Layout: Help button moved to the left, title centered, abort/cancel button aligned to the right
- Consistent Button Styling: Cancel/Abort buttons now use pill-shaped outlined style matching local pairing screen
- Icon-Based Help Modal: Replaced emoji icons with consistent app asset icons
- Improved Text Labels: "Your Device" → "This Device", shortened step labels
- Compact Copy/QR Buttons: Icon-only buttons for copy and QR actions
- Relay Config Repositioned: Advanced Nostr relay settings moved for better flow
- Reduced Padding: Tighter spacing for a more compact layout
- Refactored
PostTxwith retry logic and exponential backoff - Added new button styles for consistency across screens
- Updated header alignment styles
Bold Wallet now supports Nostr for device pairing and transaction signing. Connect devices through decentralized Nostr relays - no local network required. Works from anywhere in the world.
Key Benefits:
- Connect devices from anywhere, not just on the same WiFi network
- Uses decentralized Nostr relays for communication
- Enhanced security with NIP-44 encryption
- Flexible transport mode selection (Local WiFi/Hotspot or Nostr)
All Nostr communications use NIP-44 encryption for maximum security.
Android users can now customize their app icon from wallet settings.
- Better address display and linking
- Improved amount formatting
- Clearer transaction status indicators
- Direct links to blockchain explorers
New interface to choose between:
- Local WiFi/Hotspot: Fast and reliable for nearby devices
- Nostr: Connect through decentralized relays from anywhere
- Improved session management and recovery
- Better error handling for network issues
- Go panic recovery coverage
- Unique pre-send session agreements
- Resilient relay connection with background retries
- Nostr relay configuration
- Dynamic relay fetching from GitHub
- Better backup setup with filename handling
- Improved keyshare information display
- Complete Nostr transport layer implementation
MobileNostrPairing.tsxscreen (5,500+ lines)- NIP-44 encryption integration
- Rumor/wrap/seal message pattern
- Performance optimizations
- Bug fixes and stability improvements
- App store metadata updates
- Compliance improvements
- User interface improvements
- Lock screen optimizations
- Performance enhancements
- Added Terms and Conditions
- Added Privacy Policy
- Settings improvements
- Support for SegWit Native addresses
- Support for SegWit Compatible addresses
- Wallet cache checks
- Multi-signature Bitcoin wallet
- TSS (Threshold Signature Scheme) support
- Duo and Trio wallet modes
- Local WiFi/Hotspot device pairing
- Transaction signing and broadcasting
- QR code scanning for addresses
- Blockchain explorer integration
Repository: BoldBitcoinWallet/BoldWallet