Skip to content

Commit acd3ce7

Browse files
UdjinM6knst
authored andcommitted
fix: ignore triggers from the past when voting (dashpay#5798)
## Issue being fixed or feature implemented we should not vote on triggers from the past ## What was done? ## How Has This Been Tested? n/a ## Breaking Changes n/a ## Checklist: - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_
1 parent 4ebdaf6 commit acd3ce7

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/governance/governance.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,11 @@ void CGovernanceManager::VoteGovernanceTriggers(const std::optional<const CGover
738738
const auto activeTriggers = triggerman.GetActiveTriggers();
739739
for (const auto& trigger : activeTriggers) {
740740
const uint256 trigger_hash = trigger->GetGovernanceObject(*this)->GetHash();
741+
if (trigger->GetBlockHeight() <= nCachedBlockHeight) {
742+
// ignore triggers from the past
743+
LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s Not voting NO-FUNDING for outdated trigger:%s\n", __func__, trigger_hash.ToString());
744+
continue;
745+
}
741746
if (trigger_hash == votedFundingYesTriggerHash) {
742747
// Skip actual trigger
743748
LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s Not voting NO-FUNDING for trigger:%s, we voted yes for it already\n", __func__, trigger_hash.ToString());

test/functional/feature_governance.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,34 @@ def sync_gov(node):
303303
self.check_superblockbudget(True)
304304
self.check_superblock()
305305

306+
# Move a few block past the recent superblock height and make sure we have no new votes
307+
for _ in range(5):
308+
with self.nodes[1].assert_debug_log("", [f"Voting NO-FUNDING for trigger:{winning_trigger_hash} success"]):
309+
self.nodes[0].generate(1)
310+
self.bump_mocktime(1)
311+
self.sync_blocks()
312+
# Votes on both triggers should NOT change
313+
assert_equal(self.nodes[0].gobject("list", "valid", "triggers")[winning_trigger_hash]['NoCount'], 1)
314+
assert_equal(self.nodes[0].gobject("list", "valid", "triggers")[isolated_trigger_hash]['NoCount'], self.mn_count - 1)
315+
316+
block_count = self.nodes[0].getblockcount()
317+
n = sb_cycle - block_count % sb_cycle
318+
319+
# Move remaining n blocks until the next Superblock
320+
for i in range(n):
321+
self.nodes[0].generate(1)
322+
self.bump_mocktime(1)
323+
self.sync_blocks()
324+
assert_equal(self.nodes[0].getblockcount(), 260)
325+
assert_equal(self.nodes[0].getblockchaininfo()["softforks"]["v20"]["bip9"]["status"], "active")
326+
306327
# Mine and check a couple more superblocks
307328
for i in range(2):
308329
for _ in range(20):
309330
self.nodes[0].generate(1)
310331
self.bump_mocktime(1)
311332
self.sync_blocks()
312-
assert_equal(self.nodes[0].getblockcount(), 240 + (i + 1) * 20)
333+
assert_equal(self.nodes[0].getblockcount(), 260 + (i + 1) * 20)
313334
assert_equal(self.nodes[0].getblockchaininfo()["softforks"]["v20"]["bip9"]["status"], "active")
314335
self.check_superblockbudget(True)
315336
self.check_superblock()

0 commit comments

Comments
 (0)