From 9b25a7224a8e9b8b2b06355efc46b6c96db0108f Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Fri, 17 Jul 2026 21:38:24 -0300 Subject: [PATCH] fix(amm): read selected holdings once --- apps/amm/src/NewPositionRuntime.cpp | 26 +++++++++------- apps/amm/tests/cpp/NewPositionRuntimeTest.cpp | 30 +++++++++++++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/apps/amm/src/NewPositionRuntime.cpp b/apps/amm/src/NewPositionRuntime.cpp index 0e8985f..9da92ed 100644 --- a/apps/amm/src/NewPositionRuntime.cpp +++ b/apps/amm/src/NewPositionRuntime.cpp @@ -509,24 +509,28 @@ void NewPositionRuntime::buildQuoteInputAsync( QVector fixedReads) mutable { if (!guard) return; + QStringList selectedIds; + for (const QString& key : { + QStringLiteral("holdingAId"), + QStringLiteral("holdingBId"), + QStringLiteral("lpHoldingId") }) { + const QString id = accountIdHex( + requestObject.value(key).toString()); + if (!id.isEmpty() && !selectedIds.contains(id)) + selectedIds.append(id); + } + QStringList walletIds = guard->m_walletPublicAccountIds; + for (const QString& id : selectedIds) + walletIds.removeAll(id); guard->m_sequencer->readAccounts( - guard->m_walletPublicAccountIds, false, + walletIds, false, [guard, requestObject, network, walletOpen, config, pair, + selectedIds = std::move(selectedIds), fixedReads = std::move(fixedReads), callback = std::move(callback)]( QVector walletReads) mutable { if (!guard) return; - QStringList selectedIds; - for (const QString& key : { - QStringLiteral("holdingAId"), - QStringLiteral("holdingBId"), - QStringLiteral("lpHoldingId") }) { - const QString id = accountIdHex( - requestObject.value(key).toString()); - if (!id.isEmpty() && !selectedIds.contains(id)) - selectedIds.append(id); - } auto finish = [requestObject, network, walletOpen, config, fixedReads = std::move(fixedReads), walletReads = std::move(walletReads), diff --git a/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp b/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp index b9c7d73..06ca3a2 100644 --- a/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp +++ b/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp @@ -744,6 +744,36 @@ int main(int argc, char** argv) "forced context should reread config and wallet holding")) return 1; + FakeWallet selectedWallet; + NewPositionRuntime selectedRuntime( + &selectedWallet, &refreshClient, &sequencer); + const QString selectedAccountHex = QStringLiteral( + "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f"); + WalletAccount selectedAccount; + selectedAccount.address = selectedAccountHex; + selectedAccount.isPublic = true; + selectedRuntime.setWalletAccounts({ selectedAccount }); + QVariantMap selectedRequest = request; + selectedRequest.insert( + QStringLiteral("holdingAId"), + QStringLiteral("1thX6LZfHDZZKUs92febYZhYRcXddmzfzF2NvTkPNE")); + const int requestsBeforeSelectedQuote = server.requestCount(); + const int normalizationsBeforeSelectedQuote = + refreshClient.normalizedAccountIds.count(selectedAccountHex); + QVariantMap selectedQuote; + selectedRuntime.quoteAsync( + selectedRequest, readyNetwork(), true, false, + [&](QVariantMap result) { selectedQuote = std::move(result); }); + if (!expect(waitForCondition([&]() { return !selectedQuote.isEmpty(); }), + "selected-holding quote should complete")) + return 1; + if (!expect(server.requestCount() == requestsBeforeSelectedQuote + 1 + && refreshClient.normalizedAccountIds.count(selectedAccountHex) + == normalizationsBeforeSelectedQuote + 1, + "selected holding should be read once per cold quote")) + return 1; + server.failNextRequest(); QVector failedRefresh; if (!expect(waitForAccounts(sequencer, { holding.address }, true,