diff --git a/src/governance/governance-object.h b/src/governance/governance-object.h index 30d7a66aec85b0..21659c275daf61 100644 --- a/src/governance/governance-object.h +++ b/src/governance/governance-object.h @@ -25,6 +25,7 @@ class CGovernanceVote; static const int MIN_GOVERNANCE_PEER_PROTO_VERSION = 70213; static const int GOVERNANCE_FILTER_PROTO_VERSION = 70206; +static const int GOVERNANCE_POSE_BANNED_VOTES_VERSION = 70215; static const double GOVERNANCE_FILTER_FP_RATE = 0.001; diff --git a/src/governance/governance-vote.cpp b/src/governance/governance-vote.cpp index bf58cb12ab69ab..5836e78a9fb640 100644 --- a/src/governance/governance-vote.cpp +++ b/src/governance/governance-vote.cpp @@ -120,8 +120,21 @@ void CGovernanceVote::Relay(CConnman& connman) const return; } + auto mnList = deterministicMNManager->GetListAtChainTip(); + auto dmn = mnList.GetMNByCollateral(masternodeOutpoint); + if (!dmn) { + return; + } + + // When this vote is from non-valid (PoSe banned) MN, we should only announce it to v0.14.0.1 nodes as older nodes + // will ban us otherwise. + int minVersion = MIN_GOVERNANCE_PEER_PROTO_VERSION; + if (!mnList.IsMNValid(dmn)) { + minVersion = GOVERNANCE_POSE_BANNED_VOTES_VERSION; + } + CInv inv(MSG_GOVERNANCE_OBJECT_VOTE, GetHash()); - connman.RelayInv(inv, MIN_GOVERNANCE_PEER_PROTO_VERSION); + connman.RelayInv(inv, minVersion); } void CGovernanceVote::UpdateHash() const