From a1ea85fcdb7d05cd5f3e667729838b9c6602aaeb Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Tue, 28 Mar 2023 16:48:52 +0300 Subject: [PATCH 1/5] hpmn adjustements to projectedmnpayees --- src/evo/deterministicmns.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index 9905d351b542..d8008ae04fef 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -223,10 +223,30 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int std::vector result; result.reserve(nCount); + auto remaining_hpmn_payments = 0; + ForEachMNShared(true, [&](const CDeterministicMNCPtr& dmn) { + if (dmn->pdmnState->nLastPaidHeight == nHeight) { + // We found the last MN Payee. + // If the last payee is a HPMN, we need to check its consecutive payments and pay him again if needed + if (dmn->nType == MnType::HighPerformance && dmn->pdmnState->nConsecutivePayments < dmn_types::HighPerformance.voting_weight) { + remaining_hpmn_payments = dmn_types::HighPerformance.voting_weight - dmn->pdmnState->nConsecutivePayments; + for ([[maybe_unused]] auto _ : irange::range(remaining_hpmn_payments)) { + result.emplace_back(dmn); + } + } + } + return; + }); + ForEachMNShared(true, [&](const CDeterministicMNCPtr& dmn) { result.emplace_back(dmn); + if (dmn->nType == MnType::HighPerformance) { + result.emplace_back(dmn); + result.emplace_back(dmn); + result.emplace_back(dmn); + } }); - std::sort(result.begin(), result.end(), [&](const CDeterministicMNCPtr& a, const CDeterministicMNCPtr& b) { + std::sort(result.begin() + remaining_hpmn_payments, result.end(), [&](const CDeterministicMNCPtr& a, const CDeterministicMNCPtr& b) { return CompareByLastPaid(a.get(), b.get()); }); From c84b501be543bf5a2825867a90918952aa0fd450 Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Wed, 29 Mar 2023 15:46:50 +0300 Subject: [PATCH 2/5] refactoring --- src/evo/deterministicmns.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index d8008ae04fef..0a2d26b5896c 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -239,10 +239,7 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int }); ForEachMNShared(true, [&](const CDeterministicMNCPtr& dmn) { - result.emplace_back(dmn); - if (dmn->nType == MnType::HighPerformance) { - result.emplace_back(dmn); - result.emplace_back(dmn); + for ([[maybe_unused]] auto _ : irange::range(GetMnType(dmn->nType).voting_weight)) { result.emplace_back(dmn); } }); From d0d4d062dac6e2c57152847713b952aed9a208db Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Wed, 29 Mar 2023 23:36:32 +0300 Subject: [PATCH 3/5] added GetValidWeightedMNsCount --- src/evo/deterministicmns.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/evo/deterministicmns.h b/src/evo/deterministicmns.h index bd7f74d15fa7..108cbbc75f7d 100644 --- a/src/evo/deterministicmns.h +++ b/src/evo/deterministicmns.h @@ -19,6 +19,7 @@ #include +#include #include #include @@ -241,6 +242,14 @@ class CDeterministicMNList return ranges::count_if(mnMap, [](const auto& p) { return p.second->nType == MnType::HighPerformance && IsMNValid(*p.second); }); } + [[nodiscard]] size_t GetValidWeightedMNsCount() const + { + return std::accumulate(mnMap.begin(), mnMap.end(), 0, [](auto res, const auto& p) { + if (!IsMNValid(*p.second)) return res; + return res + GetMnType(p.second->nType).voting_weight; + }); + } + /** * Execute a callback on all masternodes in the mnList. This will pass a reference * of each masternode to the callback function. This should be preferred over ForEachMNShared. From b19cf7d62fa4d1b2e7d52ab8dc549662e8dad05e Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Wed, 29 Mar 2023 23:36:50 +0300 Subject: [PATCH 4/5] applied suggestions --- src/evo/deterministicmns.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index 0a2d26b5896c..79207687d62c 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -218,12 +218,13 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int if (nCount < 0 ) { return {}; } - nCount = std::min(nCount, int(GetValidMNsCount())); + nCount = std::min(nCount, int(GetValidWeightedMNsCount())); std::vector result; result.reserve(nCount); auto remaining_hpmn_payments = 0; + CDeterministicMNCPtr hpmn_to_be_skipped = nullptr; ForEachMNShared(true, [&](const CDeterministicMNCPtr& dmn) { if (dmn->pdmnState->nLastPaidHeight == nHeight) { // We found the last MN Payee. @@ -232,6 +233,7 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int remaining_hpmn_payments = dmn_types::HighPerformance.voting_weight - dmn->pdmnState->nConsecutivePayments; for ([[maybe_unused]] auto _ : irange::range(remaining_hpmn_payments)) { result.emplace_back(dmn); + hpmn_to_be_skipped = dmn; } } } @@ -239,6 +241,7 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int }); ForEachMNShared(true, [&](const CDeterministicMNCPtr& dmn) { + if (dmn == hpmn_to_be_skipped) return; for ([[maybe_unused]] auto _ : irange::range(GetMnType(dmn->nType).voting_weight)) { result.emplace_back(dmn); } @@ -247,7 +250,7 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int return CompareByLastPaid(a.get(), b.get()); }); - result.resize(nCount); + result.resize(nCount - (GetMnType(MnType::HighPerformance).voting_weight - remaining_hpmn_payments)); return result; } From 81bafcee1af1c586260d9db4c17ab51e65827c6d Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Thu, 30 Mar 2023 11:39:14 +0300 Subject: [PATCH 5/5] reverted change --- src/evo/deterministicmns.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index 79207687d62c..fe266149ad9c 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -250,7 +250,7 @@ std::vector CDeterministicMNList::GetProjectedMNPayees(int return CompareByLastPaid(a.get(), b.get()); }); - result.resize(nCount - (GetMnType(MnType::HighPerformance).voting_weight - remaining_hpmn_payments)); + result.resize(nCount); return result; }