diff --git a/src/app.cpp b/src/app.cpp index cf12938..d63a7a6 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -3633,18 +3633,23 @@ std::string App::transactionRefreshProgressText() const bool canRefresh = state_.connected && !state_.warming_up && !state_.isLocked(); if (!running && !(canRefresh && transactions_dirty_)) return {}; - if (!running && transactions_dirty_) return TR("tx_loading_queued"); - char buf[128]; + + // A just-sent transaction being enriched always surfaces — the user is actively waiting on it. if (!send_txids_.empty()) { snprintf(buf, sizeof(buf), TR("tx_loading_enriching_sends"), (int)send_txids_.size()); return buf; } - if (!state_.transactions.empty()) { - snprintf(buf, sizeof(buf), TR("tx_loading_refreshing_cached"), (int)state_.transactions.size()); - return buf; - } + // Once history is on screen, stay quiet for routine background refreshes. The incremental + // shielded-receive scan re-dirties transactions_dirty_ on EVERY new block (each block moves the + // "scanned at tip" bar, invalidating prior per-address scans), so for a wallet with more + // z-addresses than the per-cycle scan budget the flag never clears — which left this banner lit + // indefinitely. New receives still appear live as they're scanned; only the INITIAL load + // (nothing displayed yet) and send enrichment (above) warrant a loading banner. + if (!state_.transactions.empty()) return {}; + + if (!running && transactions_dirty_) return TR("tx_loading_queued"); if (!state_.z_addresses.empty()) { snprintf(buf, sizeof(buf), TR("tx_loading_scanning_shielded"), (int)state_.z_addresses.size());