From 41a3b2d5513593de56c6217f94186fd4ee54ac66 Mon Sep 17 00:00:00 2001 From: gg Date: Thu, 22 Jan 2026 17:50:07 -0500 Subject: [PATCH] fix scan mempool (refresh) bug; update message --- src/MainWindow.cpp | 28 +++++++++++++++++++++++----- src/libwalletqt/Wallet.cpp | 22 ++++++++++++++-------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index eb4db9b1..600525a4 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -131,7 +131,12 @@ MainWindow::MainWindow(WindowManager *windowManager, Wallet *wallet, QWidget *pa connect(conf(), &Config::changed, this, [this](Config::ConfigKey key){ if (key == Config::syncPaused) { - this->setSyncPaused(conf()->get(Config::syncPaused).toBool()); + bool paused = conf()->get(Config::syncPaused).toBool(); + this->setSyncPaused(paused); + // "Scan mempool when paused" only makes sense when sync is paused + if (m_updateNetworkInfoAction) { + m_updateNetworkInfoAction->setEnabled(paused); + } } }); @@ -309,7 +314,8 @@ void MainWindow::initStatusBar() { if (!m_wallet) return; QString msg = tr("Sync Unconfirmed (Smart Sync) will scan only the specific blocks required to unlock your pending funds (e.g. 10 confirmations).\n\n" - "This minimizes data usage by pausing immediately after verification.\n\n" + "This minimizes data usage and processing time by seeking out only the blocks required to unlock your pending funds and pausing immediately after verification.\n\n" + "NOTE: You need to manually add all Tx IDs or scan the range of all transactions to ensure an accurate balance and use all features.\n\n" "Continue?"); if (QMessageBox::question(this, tr("Sync Unconfirmed"), msg) == QMessageBox::Yes) { @@ -626,9 +632,11 @@ void MainWindow::initOffline() { } m_updateNetworkInfoAction->setCheckable(true); + // Only enable this action when sync is paused + m_updateNetworkInfoAction->setEnabled(conf()->get(Config::syncPaused).toBool()); connect(m_updateNetworkInfoAction, &QAction::toggled, this, [this](bool checked) { if (!m_wallet) return; - + m_wallet->setScanMempoolWhenPaused(checked); if (checked) { @@ -636,6 +644,11 @@ void MainWindow::initOffline() { if (m_wallet->connectionStatus() == Wallet::ConnectionStatus_Disconnected) { m_nodes->connectToNode(); } + } else { + // Disconnect if paused and no longer scanning mempool + if (conf()->get(Config::syncPaused).toBool()) { + m_nodes->disconnectCurrentNode(); + } } }); @@ -809,8 +822,13 @@ void MainWindow::onWalletOpened() { if (!conf()->get(Config::disableAutoRefresh).toBool()) { if (conf()->get(Config::syncPaused).toBool()) { m_wallet->setSyncPaused(true); - // Manually set status to Disconnected/Paused so UI looks correct immediately - this->onConnectionStatusChanged(Wallet::ConnectionStatus_Disconnected); + // Still connect to daemon if mempool scanning is enabled while paused + if (m_updateNetworkInfoAction && m_updateNetworkInfoAction->isChecked()) { + m_nodes->connectToNode(); + } else { + // Manually set status to Disconnected/Paused so UI looks correct immediately + this->onConnectionStatusChanged(Wallet::ConnectionStatus_Disconnected); + } } else { m_nodes->connectToNode(); } diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 8e4e31a9..d7af5446 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -126,7 +126,7 @@ void Wallet::setConnectionStatus(ConnectionStatus value) { } m_connectionStatus.store(value); - emit connectionStatusChanged(static_cast(m_connectionStatus.load())); + emit connectionStatusChanged(value); } bool Wallet::isSynchronized() const { @@ -629,15 +629,18 @@ void Wallet::setSyncPaused(bool paused) { m_wallet2->set_offline(true); setConnectionStatus(ConnectionStatus_Disconnected); } else { - // Paused, but scanning mempool -> We consider this "Idle" in the UI sense (connected but waiting) - setConnectionStatus(ConnectionStatus_Idle); + // Paused with mempool scanning: stay online but don't sync blocks + // Only set Idle if we already have a daemon connection m_wallet2->set_offline(false); - startRefresh(true); // Trigger scan immediately + if (!m_wallet2->get_daemon_address().empty()) { + setConnectionStatus(ConnectionStatus_Idle); + } + startRefresh(true); } } else { m_syncState = SyncState::Active; m_wallet2->set_offline(false); - // setConnectionStatus(ConnectionStatus_Synchronizing); // Let loop set it + // Let the refresh loop set the appropriate connection status startRefresh(true); } } @@ -650,7 +653,10 @@ void Wallet::setScanMempoolWhenPaused(bool enabled) { if (enabled) { m_syncState = SyncState::PausedScanning; m_wallet2->set_offline(false); - setConnectionStatus(ConnectionStatus_Idle); + // Only set Idle if we already have a daemon connection + if (!m_wallet2->get_daemon_address().empty()) { + setConnectionStatus(ConnectionStatus_Idle); + } startRefresh(true); } else { m_syncState = SyncState::Paused; @@ -773,7 +779,6 @@ void Wallet::startSmartSync(quint64 requestedTarget) { m_rangeSyncActive = true; m_syncState = SyncState::SyncingOneShot; m_lastSyncTime = QDateTime::currentDateTime().toMSecsSinceEpoch(); - m_lastSyncTime = QDateTime::currentDateTime().toMSecsSinceEpoch(); setConnectionStatus(ConnectionStatus_Synchronizing); startRefresh(true); @@ -1846,7 +1851,8 @@ void Wallet::handlePausedState() } // Update network stats if we just scanned OR if we don't have stats yet (startup recovery) - if (shouldScanMempool || m_daemonBlockChainHeight == 0) { + // But only if we actually have a daemon address configured + if ((shouldScanMempool || m_daemonBlockChainHeight == 0) && !m_wallet2->get_daemon_address().empty()) { quint64 daemonHeight = m_walletImpl->daemonBlockChainHeight(); quint64 targetHeight = (daemonHeight > 0) ? m_walletImpl->daemonBlockChainTargetHeight() : 0; emit heightsRefreshed(daemonHeight > 0, daemonHeight, targetHeight); -- 2.52.0