From 96bb601f16d628efa2ba5793ffa10da6ca16bbde Mon Sep 17 00:00:00 2001 From: pasta Date: Tue, 17 Feb 2026 08:18:56 -0600 Subject: [PATCH 01/12] Merge #7147: fix(qt): prevent overview page font double scaling, recalculate minimum width correctly, `SERVICE` and `STATUS` sorting, fix common types filtering b56816397807850ef436fb9ec70c42ab5a233821 fix: calculate `COMMON_TYPES` programmatically, add dust to exclusions (Kittywhiskers Van Gogh) 269b73ee311986dd16951d63056c4c820ad15a70 fix: correct forward declaration to prevent ABI warning (Kittywhiskers Van Gogh) 2d99c57bcf31ee0d0569d3cbd0b334121447b863 fix: factor status age when sorting by active/ban status (Kittywhiskers Van Gogh) 087859eb77d5cb680a90634ecdc49d2aa3baa140 fix: restore `SERVICE` column comparison behavior lost in MVC refactor (Kittywhiskers Van Gogh) e673c9cfe59f55cf65e86e1540f83a9bbfad3bc4 fix: recalculate minimum width when buttons are enabled (Kittywhiskers Van Gogh) 31b305e594cb514160d0664c695f753a3ab55e2a fix: use constant base size in overview page to prevent double scaling (Kittywhiskers Van Gogh) Pull request description: ## Additional Information | Fix | develop (06e761e2) | This PR (ec8ee9ce) | | --- | -------------------- | -------------------- | | Correct common types filter behaviour to restore exclusion of CoinJoin mixing transactions | ![](https://github.com/user-attachments/assets/8a6d0847-f900-4d1d-8622-ea06f97edaa3) | ![](https://github.com/user-attachments/assets/dbbea7b5-4533-4604-ab0a-df4a699673fa) | | Enforce minimum width correctly (and prevent double scaling, look at "Recent transactions" font size) | ![](https://github.com/user-attachments/assets/45f22096-6f8e-4c2a-af9d-d48b0318537c) | ![](https://github.com/user-attachments/assets/a1d57cbc-cce6-4d71-9459-7d1149c6ca1c) | | Sorting by age (oldest active node) |

Does not work

| ![](https://github.com/user-attachments/assets/e6bf63c5-eb1c-41f8-bed8-c514eae1bd32) | | Sorting by service (IP address) |

Does not work

| ![](https://github.com/user-attachments/assets/9e212e90-8adb-41d4-8348-b5e07d98ce38) | ## Breaking Changes None expected. ## Checklist - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests **(note: N/A)** - [x] I have made corresponding changes to the documentation **(note: N/A)** - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: UdjinM6: light ACK b56816397807850ef436fb9ec70c42ab5a233821 Tree-SHA512: 7d0bdadc9d1da3b06108cb561b1296df2bbe108283eeb88b482ac1575d439c77eeae2c347790ccd1a1a9f551e19df69c50599d60b032181e957b358d66900bdc --- src/dummywallet.cpp | 2 +- src/qt/bitcoingui.cpp | 2 ++ src/qt/masternodelist.cpp | 16 ++++++++++++++-- src/qt/masternodelist.h | 1 + src/qt/masternodemodel.cpp | 16 ++++++++++++++++ src/qt/overviewpage.cpp | 8 +++----- src/qt/transactionfilterproxy.h | 20 ++++++++++++++++---- src/qt/transactionrecord.h | 2 +- 8 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/dummywallet.cpp b/src/dummywallet.cpp index 5ad3b2ee23ee..14eb342d596e 100644 --- a/src/dummywallet.cpp +++ b/src/dummywallet.cpp @@ -18,7 +18,7 @@ class Loader; } // namespace CoinJoin } // namespace interfaces namespace node { -class NodeContext; +struct NodeContext; } // namespace node namespace wallet { class CWallet; diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 166e19155bd8..256aec68f65d 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -1091,6 +1091,8 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) openAction->setEnabled(enabled); m_close_wallet_action->setEnabled(enabled); m_close_all_wallets_action->setEnabled(enabled); + + updateWidth(); } void BitcoinGUI::createTrayIcon() diff --git a/src/qt/masternodelist.cpp b/src/qt/masternodelist.cpp index d6368fa0ce58..8d2b5cbf7993 100644 --- a/src/qt/masternodelist.cpp +++ b/src/qt/masternodelist.cpp @@ -45,8 +45,8 @@ bool MasternodeListSortFilterProxyModel::filterAcceptsRow(int source_row, const // Banned filter if (m_hide_banned) { QModelIndex idx = sourceModel()->index(source_row, MasternodeModel::STATUS, source_parent); - int banned = sourceModel()->data(idx, Qt::EditRole).toInt(); - if (banned != 0) { + int status_value = sourceModel()->data(idx, Qt::EditRole).toInt(); + if (status_value > 0) { return false; } } @@ -72,6 +72,18 @@ bool MasternodeListSortFilterProxyModel::filterAcceptsRow(int source_row, const return true; } +bool MasternodeListSortFilterProxyModel::lessThan(const QModelIndex& lhs, const QModelIndex& rhs) const +{ + if (lhs.column() == MasternodeModel::SERVICE) { + QVariant lhs_data{sourceModel()->data(lhs, sortRole())}; + QVariant rhs_data{sourceModel()->data(rhs, sortRole())}; + if (lhs_data.userType() == QMetaType::QByteArray && rhs_data.userType() == QMetaType::QByteArray) { + return lhs_data.toByteArray() < rhs_data.toByteArray(); + } + } + return QSortFilterProxyModel::lessThan(lhs, rhs); +} + MasternodeList::MasternodeList(QWidget* parent) : QWidget(parent), ui(new Ui::MasternodeList), diff --git a/src/qt/masternodelist.h b/src/qt/masternodelist.h index ce07082cd9f0..7c916884f932 100644 --- a/src/qt/masternodelist.h +++ b/src/qt/masternodelist.h @@ -56,6 +56,7 @@ class MasternodeListSortFilterProxyModel : public QSortFilterProxyModel protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + bool lessThan(const QModelIndex& lhs, const QModelIndex& rhs) const override; private: bool m_hide_banned{true}; diff --git a/src/qt/masternodemodel.cpp b/src/qt/masternodemodel.cpp index 5eb0d0da1e7c..39477c1f1795 100644 --- a/src/qt/masternodemodel.cpp +++ b/src/qt/masternodemodel.cpp @@ -285,6 +285,22 @@ QVariant MasternodeModel::data(const QModelIndex& index, int role) const case Column::TYPE: return static_cast(entry->type()); case Column::STATUS: + if (m_current_height > 0) { + if (entry->isBanned()) { + // Banned nodes use positive values + if (auto ban_height = entry->poseBanHeight(); ban_height && *ban_height > 0) { + return m_current_height - *ban_height; + } + return 0; // Unknown ban time, treat as freshly banned + } else { + // Active nodes use negative values + int32_t active_height = entry->registeredHeight(); + if (auto revived_height = entry->poseRevivedHeight(); revived_height && *revived_height > 0) { + active_height = *revived_height; + } + return -(m_current_height - active_height); + } + } return entry->isBanned() ? 1 : 0; case Column::POSE: return entry->posePenalty(); diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index 7dbd085b8360..7f11fde0f9a8 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -63,7 +63,7 @@ class TxViewDelegate : public QAbstractItemDelegate QRect rectBottomHalf(mainRect.left() + xspace, mainRect.top() + ypad + halfheight + 5, mainRect.width() - xspace, halfheight); QRect rectBounding; QColor colorForeground; - qreal initialFontSize = painter->font().pointSizeF(); + constexpr auto initial_size{GUIUtil::FontRegistry::DEFAULT_FONT_SIZE}; // Grab model indexes for desired data from TransactionTableModel QModelIndex indexDate = index.sibling(index.row(), TransactionTableModel::Date); @@ -72,7 +72,7 @@ class TxViewDelegate : public QAbstractItemDelegate // Draw first line (with slightly bigger font than the second line will get) // Content: Date/Time, Optional IS indicator, Amount - painter->setFont(GUIUtil::getScaledFont(/*baseSize=*/initialFontSize, /*bold=*/false, /*multiplier=*/1.17)); + painter->setFont(GUIUtil::getScaledFont(/*baseSize=*/initial_size, /*bold=*/false, /*multiplier=*/1.17)); // Date/Time colorForeground = qvariant_cast(indexDate.data(Qt::ForegroundRole)); QString strDate = indexDate.data(Qt::DisplayRole).toString(); @@ -93,7 +93,7 @@ class TxViewDelegate : public QAbstractItemDelegate // Draw second line (with the initial font) // Content: Address/label, Optional Watchonly indicator - painter->setFont(GUIUtil::getScaledFont(/*baseSize=*/initialFontSize, /*bold=*/false)); + painter->setFont(GUIUtil::getScaledFont(/*baseSize=*/initial_size, /*bold=*/false)); // Address/Label colorForeground = qvariant_cast(indexAddress.data(Qt::ForegroundRole)); QString address = indexAddress.data(Qt::DisplayRole).toString(); @@ -756,8 +756,6 @@ void OverviewPage::SetupTransactionList(int nNumItems) filter->setDynamicSortFilter(true); filter->setSortRole(Qt::EditRole); filter->setShowInactive(false); - // Exclude dust receive transactions from overview - filter->setTypeFilter(TransactionFilterProxy::ALL_TYPES & ~TransactionFilterProxy::TYPE(TransactionRecord::DustReceive)); filter->sort(TransactionTableModel::Date, Qt::DescendingOrder); ui->listTransactions->setModel(filter.get()); } diff --git a/src/qt/transactionfilterproxy.h b/src/qt/transactionfilterproxy.h index 1801d27bcae8..271be2541197 100644 --- a/src/qt/transactionfilterproxy.h +++ b/src/qt/transactionfilterproxy.h @@ -6,12 +6,16 @@ #define BITCOIN_QT_TRANSACTIONFILTERPROXY_H #include +#include #include #include #include +/** Helper function to convert transaction type enum to bit field */ +constexpr quint32 TransactionTypeToBit(int type) { return 1u << type; } + /** Filter the transaction list according to pre-specified rules. */ class TransactionFilterProxy : public QSortFilterProxyModel { @@ -20,12 +24,20 @@ class TransactionFilterProxy : public QSortFilterProxyModel public: explicit TransactionFilterProxy(QObject *parent = nullptr); + /** Types to exclude from common transaction lists (CoinJoin internal transactions and dust) */ + static constexpr quint32 EXCLUDED_TYPES = + TransactionTypeToBit(TransactionRecord::CoinJoinCollateralPayment) | + TransactionTypeToBit(TransactionRecord::CoinJoinCreateDenominations) | + TransactionTypeToBit(TransactionRecord::CoinJoinMakeCollaterals) | + TransactionTypeToBit(TransactionRecord::CoinJoinMixing) | + TransactionTypeToBit(TransactionRecord::DustReceive) | + TransactionTypeToBit(TransactionRecord::RecvWithCoinJoin); /** Type filter bit field (all types) */ - static const quint32 ALL_TYPES = 0xFFFFFFFF; - /** Type filter bit field (all types but Darksend-SPAM) */ - static const quint32 COMMON_TYPES = 0x307f; + static constexpr quint32 ALL_TYPES = 0xFFFFFFFF; + /** Type filter bit field (all types except excluded) */ + static constexpr quint32 COMMON_TYPES = ALL_TYPES & ~EXCLUDED_TYPES; - static quint32 TYPE(int type) { return 1< Date: Tue, 17 Feb 2026 08:19:36 -0600 Subject: [PATCH 02/12] Merge #7148: feat(qt): persist filter preferences in masternode list a653b268ee3c0bae5217b381d45437942543f0ea feat(qt): persist filter preferences in masternode list (Kittywhiskers Van Gogh) 6c97bc1517b74329522fa3998b514db94968766b qt: don't hide banned nodes by default (Kittywhiskers Van Gogh) Pull request description: ## Additional Information In response to community feedback to the UI changes done in [dash#7116](https://github.com/dashpay/dash/pull/7116), the following changes have been implemented * Banned masternodes are no longer hidden by default (to aid MNOs in knowing the status of their nodes at immediate glance) * Persisting filter preferences across restarts (the new layout introduced four different filter options and they'll now be remembered across restarts) ## Breaking Changes None expected. ## Checklist - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas **(note: N/A)** - [x] I have added or updated relevant unit/integration/functional/e2e tests **(note: N/A)** - [x] I have made corresponding changes to the documentation **(note: N/A)** - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: UdjinM6: light ACK a653b268ee3c0bae5217b381d45437942543f0ea Tree-SHA512: 471f2d174e64396c22ad8c0ed2c0cc50d85bf0d2b63cd1a85feb720358d78a78c14bc1065ca30a762badd7bea35cbefd21f9105e66e0443ae923abfcaccc2a95 --- src/qt/forms/masternodelist.ui | 2 +- src/qt/masternodelist.cpp | 28 ++++++++++++++++++++++++---- src/qt/masternodelist.h | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/qt/forms/masternodelist.ui b/src/qt/forms/masternodelist.ui index 6ad419c8c709..41d519b2095a 100644 --- a/src/qt/forms/masternodelist.ui +++ b/src/qt/forms/masternodelist.ui @@ -89,7 +89,7 @@ Hide banned - true + false diff --git a/src/qt/masternodelist.cpp b/src/qt/masternodelist.cpp index 8d2b5cbf7993..7db659a44ddd 100644 --- a/src/qt/masternodelist.cpp +++ b/src/qt/masternodelist.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -121,9 +122,6 @@ MasternodeList::MasternodeList(QWidget* parent) : // Hide ProTx Hash column (used for internal lookup) ui->tableViewMasternodes->setColumnHidden(MasternodeModel::PROTX_HASH, true); - // Hide PoSe column by default (since "Hide banned" is checked by default) - ui->tableViewMasternodes->setColumnHidden(MasternodeModel::POSE, true); - ui->checkBoxOwned->setEnabled(false); contextMenuDIP3 = new QMenu(this); @@ -154,6 +152,12 @@ MasternodeList::MasternodeList(QWidget* parent) : // Debounce timer to apply masternode list changes m_timer->setSingleShot(true); connect(m_timer, &QTimer::timeout, this, &MasternodeList::updateDIP3ListScheduled); + + // Load filter settings + QSettings settings; + ui->checkBoxHideBanned->setChecked(settings.value("mnListHideBanned", false).toBool()); + ui->comboBoxType->setCurrentIndex(settings.value("mnListTypeFilter", 0).toInt()); + ui->filterText->setText(settings.value("mnListFilterText", "").toString()); } MasternodeList::~MasternodeList() @@ -186,7 +190,11 @@ void MasternodeList::setClientModel(ClientModel* model) void MasternodeList::setWalletModel(WalletModel* model) { this->walletModel = model; - ui->checkBoxOwned->setEnabled(model != nullptr); + ui->checkBoxOwned->setEnabled(walletModel != nullptr); + if (walletModel) { + QSettings settings; + ui->checkBoxOwned->setChecked(settings.value("mnListOwnedOnly", false).toBool()); + } } void MasternodeList::showContextMenuDIP3(const QPoint& point) @@ -337,6 +345,9 @@ void MasternodeList::on_filterText_textChanged(const QString& strFilterIn) m_proxy_model->setFilterRegularExpression( QRegularExpression(QRegularExpression::escape(strFilterIn), QRegularExpression::CaseInsensitiveOption)); updateFilteredCount(); + + QSettings settings; + settings.setValue("mnListFilterText", strFilterIn); } void MasternodeList::on_comboBoxType_currentIndexChanged(int index) @@ -349,6 +360,9 @@ void MasternodeList::on_comboBoxType_currentIndexChanged(int index) m_proxy_model->setTypeFilter(index_enum); m_proxy_model->forceInvalidateFilter(); updateFilteredCount(); + + QSettings settings; + settings.setValue("mnListTypeFilter", index); } void MasternodeList::on_checkBoxOwned_stateChanged(int state) @@ -356,6 +370,9 @@ void MasternodeList::on_checkBoxOwned_stateChanged(int state) m_proxy_model->setShowOwnedOnly(state == Qt::Checked); m_proxy_model->forceInvalidateFilter(); updateFilteredCount(); + + QSettings settings; + settings.setValue("mnListOwnedOnly", state == Qt::Checked); } void MasternodeList::on_checkBoxHideBanned_stateChanged(int state) @@ -365,6 +382,9 @@ void MasternodeList::on_checkBoxHideBanned_stateChanged(int state) m_proxy_model->setHideBanned(hide_banned); m_proxy_model->forceInvalidateFilter(); updateFilteredCount(); + + QSettings settings; + settings.setValue("mnListHideBanned", hide_banned); } const MasternodeEntry* MasternodeList::GetSelectedEntry() diff --git a/src/qt/masternodelist.h b/src/qt/masternodelist.h index 7c916884f932..cffe4cc0b0d5 100644 --- a/src/qt/masternodelist.h +++ b/src/qt/masternodelist.h @@ -59,7 +59,7 @@ class MasternodeListSortFilterProxyModel : public QSortFilterProxyModel bool lessThan(const QModelIndex& lhs, const QModelIndex& rhs) const override; private: - bool m_hide_banned{true}; + bool m_hide_banned{false}; bool m_show_owned_only{false}; QSet m_owned_mns; TypeFilter m_type_filter{TypeFilter::All}; From 33f013838c2ea73acf0a0fb2471c2dc39fa38188 Mon Sep 17 00:00:00 2001 From: pasta Date: Tue, 17 Feb 2026 08:22:30 -0600 Subject: [PATCH 03/12] Merge #7145: fix(qt): move labelError styling from proposalcreate.ui into general.css MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bc779c67c549249e9a90a591e06e4293d0e3cb30 fix(qt): move labelError styling from proposalcreate.ui into general.css (UdjinM6) Pull request description: ## Issue being fixed or feature implemented `labelError` styling is in the wrong place, it's a translatable string (missed `notr="true"`) and... it is not actually working at all 🤷‍♂️ |develop | this PR| |-|-| | Screenshot 2026-02-14 at 00 27 44 | Screenshot 2026-02-14 at 00 29 24 | Discovered thanks to a broken translation found by @coderabbitai https://github.com/dashpay/dash/pull/7141#discussion_r2805968915 ## What was done? Move `labelError` styling from `proposalcreate.ui` into `general.css`. Will be dropped from `*.ts` files in some future Translations PR. ## How Has This Been Tested? ## Breaking Changes ## Checklist: - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [ ] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: kwvg: utACK bc779c67c549249e9a90a591e06e4293d0e3cb30 Tree-SHA512: 08724dd5506723ba00cad50a9643b6b8a143894df2d53ab6f193d11e84880757d9c82c4aa9a13fe25cb5f2953ffcde590f6d7630bdae8d436b739c1f6fa8f647 --- src/qt/forms/proposalcreate.ui | 3 --- src/qt/res/css/general.css | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qt/forms/proposalcreate.ui b/src/qt/forms/proposalcreate.ui index bc673aab86b6..9cbe85c342c9 100644 --- a/src/qt/forms/proposalcreate.ui +++ b/src/qt/forms/proposalcreate.ui @@ -387,9 +387,6 @@ Qt::AlignLeft|Qt::AlignVCenter - - margin-left: 8px; - diff --git a/src/qt/res/css/general.css b/src/qt/res/css/general.css index cf49b570302f..b46369e709b5 100644 --- a/src/qt/res/css/general.css +++ b/src/qt/res/css/general.css @@ -1621,6 +1621,13 @@ QWidget .QFrame#frame_2 QListView { /* Transaction List */ margin-right: 10px; } +/****************************************************** +ProposalCreate +******************************************************/ +QDialog#ProposalCreate #labelError { + margin-left: 8px; +} + /****************************************************** ProposalResume ******************************************************/ From cc6f0bb272fb8dd8c36a7f43c947c2f1832e2a4e Mon Sep 17 00:00:00 2001 From: pasta Date: Thu, 19 Feb 2026 09:21:13 -0600 Subject: [PATCH 04/12] Merge #7154: fix: MN update notifications had old_list/new_list swapped 5e5aaec5f97aca5804c91e6c504609f77f54cf74 fix: MN update notifications had old_list/new_list swapped (UdjinM6) Pull request description: ## Issue being fixed or feature implemented - UI: Masternode list tab displayed state at block X-1 while node was at block X - Net: mnauth disconnect handling could miss removals, keeping removed masternode peers connected longer than intended Noticed while reviewing #7146 ## What was done? ## How Has This Been Tested? Run qt, open masternode list tab, sort by last paid (desc). Open Info dialog to see block height, wait for another block after full sync and compare. ## Breaking Changes n/a ## Checklist: - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [ ] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: PastaPastaPasta: utACK 5e5aaec5f97aca5804c91e6c504609f77f54cf74 kwvg: utACK 5e5aaec5f97aca5804c91e6c504609f77f54cf74 Tree-SHA512: 00cd0abd17a46e025f4419b8c06ca0ac5a5edbb07a372da75f1b40866b9b218116fa803f4f903b4010dd878aa05e6377d3ca7e8df99aa184d6b24a0f76a00325 --- src/evo/deterministicmns.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index ac89530dc6ee..32b2f8b61296 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -702,7 +702,7 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_nullactive()) { @@ -755,7 +755,7 @@ bool CDeterministicMNManager::UndoBlock(gsl::not_null pindex curList.ApplyDiff(pindex, diff); auto inversedDiff{curList.BuildDiff(prevList)}; - updatesRet = {curList, prevList, inversedDiff}; + updatesRet = {.old_list = curList, .new_list = prevList, .diff = inversedDiff}; } const auto& consensusParams = Params().GetConsensus(); From 8fd53cd2379c4d79e443e9a70090c6cef0f21c44 Mon Sep 17 00:00:00 2001 From: pasta Date: Thu, 19 Feb 2026 11:23:09 -0600 Subject: [PATCH 05/12] Merge #7144: feat(qt): add support for reporting `OP_RETURN` payloads as Data Transactions 5c22389f34df5fba9d8174a6be478056eb80f9c9 qt: add support for reporting `OP_RETURN` payloads as Data Transactions (Kittywhiskers Van Gogh) Pull request description: ## Additional Information * Depends on https://github.com/dashpay/dash/pull/7147 | `develop` (06e761e2) | This PR (97ae6893) | | ---------------------- | -------------------- | | ![](https://github.com/user-attachments/assets/251830d0-41e8-4737-b758-cc0b64b81927) | ![](https://github.com/user-attachments/assets/215e491b-0457-43e9-a3c4-d8ff4786e9a0) | | ![](https://github.com/user-attachments/assets/780cb660-d610-4f8d-af28-b1009732be35) | ![](https://github.com/user-attachments/assets/20bb43f6-b6d5-45a6-9afc-77ebb4aaedd6) | ## Breaking Changes None expected. ## Checklist - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests **(note: N/A)** - [x] I have made corresponding changes to the documentation **(note: N/A)** - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: PastaPastaPasta: utACK 5c22389f34df5fba9d8174a6be478056eb80f9c9 UdjinM6: utACK 5c22389f34df5fba9d8174a6be478056eb80f9c9 Tree-SHA512: 37ade0aed7f64885268551cdab79c8c966508792d63e74c97a4f622b834cde74954d7c5e3b08b7ae35b38122270f148bff27935290de08644b0a72be81cb5127 --- src/qt/transactiondesc.cpp | 24 +++++++++++++++++++++++- src/qt/transactionrecord.cpp | 18 +++++++++++++++++- src/qt/transactionrecord.h | 10 +++++++++- src/qt/transactiontablemodel.cpp | 5 +++++ src/qt/transactionview.cpp | 1 + 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 821781c9f077..354bc63f9072 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -15,9 +15,11 @@ #include #include -#include #include #include +#include +#include