]> Nutra Git (v1) - gamesguru/feather.git/commitdiff
fix scan mempool (refresh) bug; update message feat/smart-sync 2/head
authorgg <chown_tee@proton.me>
Thu, 22 Jan 2026 22:50:07 +0000 (17:50 -0500)
committergg <chown_tee@proton.me>
Thu, 22 Jan 2026 22:50:07 +0000 (17:50 -0500)
src/MainWindow.cpp
src/libwalletqt/Wallet.cpp

index eb4db9b1afe0955a86175f7396b862fa8df02483..600525a48c9280760c3ea7b57609c9029735131b 100644 (file)
@@ -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();
         }
index 8e4e31a956609cbb5e1080401331da4e7a276bc2..d7af5446ecf227499657c8d0010ca49c1fad2a63 100644 (file)
@@ -126,7 +126,7 @@ void Wallet::setConnectionStatus(ConnectionStatus value) {
     }
 
     m_connectionStatus.store(value);
-    emit connectionStatusChanged(static_cast<ConnectionStatus>(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);