diff --git a/src/qt/forms/masternodelist.ui b/src/qt/forms/masternodelist.ui index f479a608d9e7f..9f5ca2c414863 100644 --- a/src/qt/forms/masternodelist.ui +++ b/src/qt/forms/masternodelist.ui @@ -356,6 +356,16 @@ + + + + Show only masternodes this wallet has keys for. + + + My masternodes only + + + diff --git a/src/qt/masternodelist.cpp b/src/qt/masternodelist.cpp index 1331025aa5b3f..9e0896b92cee2 100644 --- a/src/qt/masternodelist.cpp +++ b/src/qt/masternodelist.cpp @@ -148,6 +148,17 @@ void MasternodeList::showContextMenuDIP3(const QPoint& point) if (item) contextMenuDIP3->exec(QCursor::pos()); } +static bool CheckWalletOwnsScript(const CScript& script) +{ + CTxDestination dest; + if (ExtractDestination(script, dest)) { + if ((boost::get(&dest) && pwalletMain->HaveKey(*boost::get(&dest))) || (boost::get(&dest) && pwalletMain->HaveCScript(*boost::get(&dest)))) { + return true; + } + } + return false; +} + void MasternodeList::StartAlias(std::string strAlias) { std::string strStatusHtml; @@ -442,7 +453,26 @@ void MasternodeList::updateDIP3List() nextPayments.emplace(dmn->proTxHash, mnList.GetHeight() + (int)i + 1); } + std::set setOutpts; + if (pwalletMain && ui->checkBoxMyMasternodesOnly->isChecked()) { + LOCK(pwalletMain->cs_wallet); + std::vector vOutpts; + pwalletMain->ListProTxCoins(vOutpts); + for (const auto& outpt : vOutpts) { + setOutpts.emplace(outpt); + } + } + mnList.ForEachMN(false, [&](const CDeterministicMNCPtr& dmn) { + if (pwalletMain && ui->checkBoxMyMasternodesOnly->isChecked()) { + LOCK(pwalletMain->cs_wallet); + bool fMyMasternode = setOutpts.count(dmn->collateralOutpoint) || + pwalletMain->HaveKey(dmn->pdmnState->keyIDOwner) || + pwalletMain->HaveKey(dmn->pdmnState->keyIDVoting) || + CheckWalletOwnsScript(dmn->pdmnState->scriptPayout) || + CheckWalletOwnsScript(dmn->pdmnState->scriptOperatorPayout); + if (!fMyMasternode) return; + } // populate list // Address, Protocol, Status, Active Seconds, Last Seen, Pub Key QTableWidgetItem* addressItem = new QTableWidgetItem(QString::fromStdString(dmn->pdmnState->addr.ToString())); @@ -701,6 +731,13 @@ void MasternodeList::ShowQRCode(std::string strAlias) dialog->show(); } +void MasternodeList::on_checkBoxMyMasternodesOnly_stateChanged(int state) +{ + // no cooldown + nTimeFilterUpdatedDIP3 = GetTime() - MASTERNODELIST_FILTER_COOLDOWN_SECONDS; + fFilterUpdatedDIP3 = true; +} + CDeterministicMNCPtr MasternodeList::GetSelectedDIP3MN() { std::string strProTxHash; diff --git a/src/qt/masternodelist.h b/src/qt/masternodelist.h index 5532c94e661ca..88ef6fe6d4485 100644 --- a/src/qt/masternodelist.h +++ b/src/qt/masternodelist.h @@ -90,6 +90,7 @@ private Q_SLOTS: void on_startMissingButton_clicked(); void on_tableWidgetMyMasternodes_itemSelectionChanged(); void on_UpdateButton_clicked(); + void on_checkBoxMyMasternodesOnly_stateChanged(int state); void extraInfoDIP3_clicked(); void copyProTxHash_clicked();