|
8 | 8 | #include <evo/dmnstate.h> |
9 | 9 | #include <evo/evodb.h> |
10 | 10 | #include <evo/providertx.h> |
| 11 | +#include <evo/simplifiedmns.h> |
11 | 12 | #include <evo/specialtx.h> |
12 | 13 | #include <llmq/commitment.h> |
13 | 14 | #include <llmq/utils.h> |
@@ -255,6 +256,14 @@ std::vector<CDeterministicMNCPtr> CDeterministicMNList::GetProjectedMNPayees(gsl |
255 | 256 | return result; |
256 | 257 | } |
257 | 258 |
|
| 259 | +gsl::not_null<std::shared_ptr<const CSimplifiedMNList>> CDeterministicMNList::GetSML() const |
| 260 | +{ |
| 261 | + if (!m_cached_sml) { |
| 262 | + m_cached_sml = std::make_shared<const CSimplifiedMNList>(*this); |
| 263 | + } |
| 264 | + return m_cached_sml; |
| 265 | +} |
| 266 | + |
258 | 267 | int CDeterministicMNList::CalcMaxPoSePenalty() const |
259 | 268 | { |
260 | 269 | // Maximum PoSe penalty is dynamic and equals the number of registered MNs |
@@ -440,6 +449,7 @@ void CDeterministicMNList::AddMN(const CDeterministicMNCPtr& dmn, bool fBumpTota |
440 | 449 |
|
441 | 450 | mnMap = mnMap.set(dmn->proTxHash, dmn); |
442 | 451 | mnInternalIdMap = mnInternalIdMap.set(dmn->GetInternalId(), dmn->proTxHash); |
| 452 | + m_cached_sml = nullptr; |
443 | 453 | if (fBumpTotalCount) { |
444 | 454 | // nTotalRegisteredCount acts more like a checkpoint, not as a limit, |
445 | 455 | nTotalRegisteredCount = std::max(dmn->GetInternalId() + 1, (uint64_t)nTotalRegisteredCount); |
@@ -510,6 +520,9 @@ void CDeterministicMNList::UpdateMN(const CDeterministicMN& oldDmn, const std::s |
510 | 520 |
|
511 | 521 | dmn->pdmnState = pdmnState; |
512 | 522 | mnMap = mnMap.set(oldDmn.proTxHash, dmn); |
| 523 | + if (m_cached_sml && CSimplifiedMNListEntry{oldDmn} != CSimplifiedMNListEntry{*dmn}) { |
| 524 | + m_cached_sml = nullptr; |
| 525 | + } |
513 | 526 | } |
514 | 527 |
|
515 | 528 | void CDeterministicMNList::UpdateMN(const uint256& proTxHash, const std::shared_ptr<const CDeterministicMNState>& pdmnState) |
@@ -581,6 +594,7 @@ void CDeterministicMNList::RemoveMN(const uint256& proTxHash) |
581 | 594 |
|
582 | 595 | mnMap = mnMap.erase(proTxHash); |
583 | 596 | mnInternalIdMap = mnInternalIdMap.erase(dmn->GetInternalId()); |
| 597 | + m_cached_sml = nullptr; |
584 | 598 | } |
585 | 599 |
|
586 | 600 | bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, |
|
0 commit comments