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();