From 88e2ef2b0a788f88d34683beae1f31f070d82aa5 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Sat, 18 Jul 2026 03:09:38 -0300 Subject: [PATCH] perf(amm): avoid stale wallet context refreshes --- apps/amm/src/AmmUiBackend.cpp | 29 +++++++++++++++++++++++------ apps/amm/src/AmmUiBackend.h | 4 +++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/apps/amm/src/AmmUiBackend.cpp b/apps/amm/src/AmmUiBackend.cpp index 10f3be1..a120f82 100644 --- a/apps/amm/src/AmmUiBackend.cpp +++ b/apps/amm/src/AmmUiBackend.cpp @@ -11,6 +11,8 @@ #include #include +#include + #include "AmmClient.h" #include "LogosWalletProvider.h" #include "NewPositionRuntime.h" @@ -88,6 +90,11 @@ AmmUiBackend::AmmUiBackend(LogosAPI* logosAPI, QObject* parent) connect(m_walletController.get(), &WalletController::stateChanged, this, &AmmUiBackend::syncWalletState); + connect(m_walletController.get(), &WalletController::snapshotChanged, + this, [this]() { + if (m_walletController->state().isWalletOpen) + m_walletSnapshotPending = true; + }); syncWalletState(); m_walletController->start(); } @@ -206,6 +213,7 @@ void AmmUiBackend::requestNewPositionSubmit(QVariantMap request, void AmmUiBackend::syncWalletState() { const WalletUiState& state = m_walletController->state(); + const bool walletSnapshotApplied = std::exchange(m_walletSnapshotPending, false); const bool walletWasOpen = isWalletOpen(); const bool walletCouldSubmit = walletCanSubmit(); const bool wasReachable = sequencerReachable(); @@ -240,23 +248,31 @@ void AmmUiBackend::syncWalletState() m_transactionTimer->stop(); m_network.sequencerChanged(!state.sequencerAddress.isEmpty()); } - if (addressChanged || wasReachable != state.sequencerReachable) { + const bool reachabilityChanged = wasReachable != state.sequencerReachable; + const bool walletClosed = walletWasOpen && !state.isWalletOpen; + if (addressChanged || reachabilityChanged) { m_identityRetryTimer->stop(); m_network.reachabilityChanged(state.sequencerReachable, wasReachable); } - if (walletWasOpen && !state.isWalletOpen) { + if (walletClosed) { m_newPosition->clearWalletAccounts(); setAssets({}); setAssetStatus(QStringLiteral("idle")); setAssetError({}); } - if (state.canSubmit()) { + if (state.canSubmit() && walletSnapshotApplied) { const WalletSnapshot snapshot = m_wallet->snapshot(); if (snapshot.ok()) m_newPosition->setWalletAccounts(snapshot.accounts); } - publishNetworkContext(); + const bool refreshContext = !m_hasPublishedNetworkContext + || walletSnapshotApplied + || walletClosed + || addressChanged + || reachabilityChanged; + publishNetworkContext(refreshContext); + m_hasPublishedNetworkContext = true; if (state.sequencerReachable && m_network.needsIdentityProbe()) probeNetworkIdentity(); } @@ -318,13 +334,14 @@ void AmmUiBackend::probeNetworkIdentity() }); } -void AmmUiBackend::publishNetworkContext() +void AmmUiBackend::publishNetworkContext(bool refreshContext) { const ActiveNetworkSnapshot network = m_network.snapshot(); setActiveNetwork(network.id); setNetworkStatus(network.status); setNetworkFingerprint(network.fingerprint); - refreshNewPositionContext(m_newPositionHints); + if (refreshContext) + refreshNewPositionContext(m_newPositionHints); } void AmmUiBackend::publishWalletAssets(const QVariantMap& context) diff --git a/apps/amm/src/AmmUiBackend.h b/apps/amm/src/AmmUiBackend.h index 9618215..7d78469 100644 --- a/apps/amm/src/AmmUiBackend.h +++ b/apps/amm/src/AmmUiBackend.h @@ -64,7 +64,7 @@ public slots: private: void syncWalletState(); void probeNetworkIdentity(); - void publishNetworkContext(); + void publishNetworkContext(bool refreshContext = true); void publishWalletAssets(const QVariantMap& context); void watchTransaction(const QVariantMap& result); void pollTransactions(); @@ -84,6 +84,8 @@ private: ActiveNetwork m_network; QVariantMap m_newPositionHints; bool m_identityProbeInFlight = false; + bool m_walletSnapshotPending = false; + bool m_hasPublishedNetworkContext = false; quint64 m_contextGeneration = 0; struct PendingTransaction { QString nativeHash;