diff --git a/src/qt/forms/masternodelist.ui b/src/qt/forms/masternodelist.ui index 03c08266d67a1..ae2f9495d2b94 100644 --- a/src/qt/forms/masternodelist.ui +++ b/src/qt/forms/masternodelist.ui @@ -73,6 +73,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 6691d18d752fd..40238b3cbede4 100644 --- a/src/qt/masternodelist.cpp +++ b/src/qt/masternodelist.cpp @@ -107,6 +107,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::updateDIP3List() { if (ShutdownRequested()) { @@ -146,7 +157,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())); @@ -222,6 +252,13 @@ void MasternodeList::on_filterLineEditDIP3_textChanged(const QString& strFilterI ui->countLabelDIP3->setText(QString::fromStdString(strprintf("Please wait... %d", MASTERNODELIST_FILTER_COOLDOWN_SECONDS))); } +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 0c19830eafe24..d27b87f0d10a4 100644 --- a/src/qt/masternodelist.h +++ b/src/qt/masternodelist.h @@ -65,6 +65,7 @@ public Q_SLOTS: private Q_SLOTS: void showContextMenuDIP3(const QPoint&); void on_filterLineEditDIP3_textChanged(const QString& strFilterIn); + void on_checkBoxMyMasternodesOnly_stateChanged(int state); void extraInfoDIP3_clicked(); void copyProTxHash_clicked();