From fea39b19290b3cf307b8fd945e0e4bdf8aff519c Mon Sep 17 00:00:00 2001 From: tobtoht Date: Wed, 26 Mar 2025 16:00:31 +0100 Subject: [PATCH] subaddress: ensure at least one unused subaddress is available --- src/libwalletqt/Subaddress.cpp | 25 +++++++++++++++++++++++-- src/libwalletqt/Subaddress.h | 1 + 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/libwalletqt/Subaddress.cpp b/src/libwalletqt/Subaddress.cpp index 95be89f6..b7e2ecc2 100644 --- a/src/libwalletqt/Subaddress.cpp +++ b/src/libwalletqt/Subaddress.cpp @@ -16,6 +16,10 @@ Subaddress::Subaddress(Wallet *wallet, tools::wallet2 *wallet2, QObject *parent) QString hidden = m_wallet->getCacheAttribute("feather.hiddenaddresses"); m_hidden = hidden.split(","); + + connect(this, &Subaddress::noUnusedSubaddresses, [this] { + this->addRow(m_wallet->currentSubaddressAccount(), ""); + }); } bool Subaddress::refresh(quint32 accountIndex) @@ -24,6 +28,7 @@ bool Subaddress::refresh(quint32 accountIndex) m_rows.clear(); + bool haveUnused = false; bool potentialWalletFileCorruption = false; for (quint32 i = 0; i < m_wallet2->get_num_subaddresses(accountIndex); ++i) @@ -46,13 +51,17 @@ bool Subaddress::refresh(quint32 accountIndex) QString addressStr = QString::fromStdString(cryptonote::get_account_address_as_str(m_wallet2->nettype(), !index.is_zero(), address)); + bool used = m_wallet2->get_subaddress_used({accountIndex, (uint32_t)i}); m_rows.emplace_back( addressStr, QString::fromStdString(m_wallet2->get_subaddress_label(index)), - m_wallet2->get_subaddress_used({accountIndex, (uint32_t)i}), + used, this->isHidden(addressStr), this->isPinned(addressStr) ); + if (!used && i > 0) { + haveUnused = true; + } } // Make sure keys are intact. We NEVER want to display incorrect addresses in case of memory corruption. @@ -66,18 +75,30 @@ bool Subaddress::refresh(quint32 accountIndex) emit refreshFinished(); + if (!haveUnused) { + emit noUnusedSubaddresses(); + } + return !potentialWalletFileCorruption; } void Subaddress::updateUsed(quint32 accountIndex) { + bool haveUnused = false; for (quint32 i = 0; i < m_rows.count(); i++) { SubaddressRow& row = m_rows[i]; - if (m_wallet2->get_subaddress_used({accountIndex, i}) != row.used) { + bool used = m_wallet2->get_subaddress_used({accountIndex, i}); + if (used != row.used) { row.used = !row.used; emit rowUpdated(i); } + if (!used && i > 0) { + haveUnused = true; + } + } + if (!haveUnused) { + emit noUnusedSubaddresses(); } } diff --git a/src/libwalletqt/Subaddress.h b/src/libwalletqt/Subaddress.h index 2f5f6a11..03c0931f 100644 --- a/src/libwalletqt/Subaddress.h +++ b/src/libwalletqt/Subaddress.h @@ -41,6 +41,7 @@ signals: void refreshFinished() const; void rowUpdated(qsizetype index) const; void corrupted() const; + void noUnusedSubaddresses() const; private: explicit Subaddress(Wallet *wallet, tools::wallet2 *wallet2, QObject *parent); -- 2.52.0