Page MenuHomePhabricator

D14646.diff
No OneTemporary

D14646.diff

diff --git a/src/avalanche/test/CMakeLists.txt b/src/avalanche/test/CMakeLists.txt
--- a/src/avalanche/test/CMakeLists.txt
+++ b/src/avalanche/test/CMakeLists.txt
@@ -21,6 +21,7 @@
proof_tests.cpp
proofcomparator_tests.cpp
proofpool_tests.cpp
+ stakingrewards_tests.cpp
voterecord_tests.cpp
)
diff --git a/src/avalanche/test/stakingrewards_tests.cpp b/src/avalanche/test/stakingrewards_tests.cpp
new file mode 100644
--- /dev/null
+++ b/src/avalanche/test/stakingrewards_tests.cpp
@@ -0,0 +1,83 @@
+// Copyright (c) 2023 The Bitcoin developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <avalanche/avalanche.h>
+#include <avalanche/processor.h>
+#include <chainparams.h>
+#include <consensus/activation.h>
+#include <net_processing.h>
+#include <policy/block/stakingrewards.h>
+
+#include <test/util/blockindex.h>
+#include <test/util/setup_common.h>
+
+#include <boost/test/unit_test.hpp>
+
+struct StakingRewardsActivationTestingSetup : public TestingSetup {
+ void checkStakingRewardsActivation(const std::string &net,
+ const bool expectActivation) {
+ SelectParams(net);
+ const Consensus::Params &params = Params().GetConsensus();
+
+ gArgs.ForceSetArg("-avalanche", "1");
+
+ bilingual_str error;
+ g_avalanche = avalanche::Processor::MakeProcessor(
+ *m_node.args, *m_node.chain, m_node.connman.get(),
+ *Assert(m_node.chainman), m_node.mempool.get(), *m_node.scheduler,
+ error);
+
+ BOOST_CHECK(g_avalanche);
+ BOOST_CHECK(isAvalancheEnabled(gArgs));
+
+ // Before Cowperthwaite activation
+ const auto activation = gArgs.GetIntArg(
+ "-cowperthwaiteactivationtime", params.cowperthwaiteActivationTime);
+ SetMockTime(activation - 1000000);
+
+ std::array<CBlockIndex, 12> blocks;
+ for (size_t i = 1; i < blocks.size(); ++i) {
+ blocks[i].pprev = &blocks[i - 1];
+ }
+
+ SetMTP(blocks, activation - 1);
+ BOOST_CHECK(!IsStakingRewardsActivated(params, &blocks.back()));
+
+ SetMTP(blocks, activation);
+ BOOST_CHECK_EQUAL(IsStakingRewardsActivated(params, &blocks.back()),
+ expectActivation);
+
+ SetMTP(blocks, activation + 1);
+ BOOST_CHECK_EQUAL(IsStakingRewardsActivated(params, &blocks.back()),
+ expectActivation);
+
+ // If avalanche is disabled, staking rewards are disabled
+ gArgs.ForceSetArg("-avalanche", "0");
+ BOOST_CHECK(!isAvalancheEnabled(gArgs));
+ BOOST_CHECK(!IsStakingRewardsActivated(params, &blocks.back()));
+
+ gArgs.ForceSetArg("-avalanche", "1");
+ BOOST_CHECK(isAvalancheEnabled(gArgs));
+ BOOST_CHECK_EQUAL(IsStakingRewardsActivated(params, &blocks.back()),
+ expectActivation);
+
+ // If g_avalanche is null, staking rewards are disabled
+ g_avalanche.reset(nullptr);
+ BOOST_CHECK(!g_avalanche);
+ BOOST_CHECK(!IsStakingRewardsActivated(params, &blocks.back()));
+
+ gArgs.ClearForcedArg("-avalanche");
+ }
+};
+
+BOOST_FIXTURE_TEST_SUITE(stakingrewards_tests,
+ StakingRewardsActivationTestingSetup)
+
+BOOST_AUTO_TEST_CASE(isstakingrewardsactivated) {
+ checkStakingRewardsActivation("regtest", false);
+ checkStakingRewardsActivation("test", false);
+ checkStakingRewardsActivation("main", true);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/node/miner.cpp b/src/node/miner.cpp
--- a/src/node/miner.cpp
+++ b/src/node/miner.cpp
@@ -200,10 +200,7 @@
}
CScript stakingRewardsPayoutScript;
- if (IsCowperthwaiteEnabled(consensusParams, pindexPrev) && g_avalanche &&
- isAvalancheEnabled(gArgs) &&
- gArgs.GetBoolArg("-avalanchestakingrewards",
- consensusParams.enableStakingRewards) &&
+ if (IsStakingRewardsActivated(consensusParams, pindexPrev) &&
g_avalanche->getStakingRewardWinner(pindexPrev->GetBlockHash(),
stakingRewardsPayoutScript)) {
const Amount stakingRewards = GetStakingRewardsAmount(blockReward);
diff --git a/src/policy/block/stakingrewards.h b/src/policy/block/stakingrewards.h
--- a/src/policy/block/stakingrewards.h
+++ b/src/policy/block/stakingrewards.h
@@ -33,5 +33,7 @@
};
Amount GetStakingRewardsAmount(const Amount &coinbaseValue);
+bool IsStakingRewardsActivated(const Consensus::Params &params,
+ const CBlockIndex *pprev);
#endif // BITCOIN_POLICY_BLOCK_STAKINGREWARDS_H
diff --git a/src/policy/block/stakingrewards.cpp b/src/policy/block/stakingrewards.cpp
--- a/src/policy/block/stakingrewards.cpp
+++ b/src/policy/block/stakingrewards.cpp
@@ -30,9 +30,7 @@
const BlockHash blockhash = m_blockIndex.GetBlockHash();
CScript winner;
- if (!g_avalanche || !isAvalancheEnabled(gArgs) ||
- !gArgs.GetBoolArg("-avalanchestakingrewards",
- m_consensusParams.enableStakingRewards) ||
+ if (!IsStakingRewardsActivated(m_consensusParams, m_blockIndex.pprev) ||
!g_avalanche->getStakingRewardWinner(m_blockIndex.pprev->GetBlockHash(),
winner)) {
LogPrint(BCLog::AVALANCHE,
@@ -66,3 +64,11 @@
Amount GetStakingRewardsAmount(const Amount &coinbaseValue) {
return STAKING_REWARD_RATIO * coinbaseValue / 100;
}
+
+bool IsStakingRewardsActivated(const Consensus::Params &params,
+ const CBlockIndex *pprev) {
+ return IsCowperthwaiteEnabled(params, pprev) && g_avalanche &&
+ isAvalancheEnabled(gArgs) &&
+ gArgs.GetBoolArg("-avalanchestakingrewards",
+ params.enableStakingRewards);
+}
diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
--- a/src/rpc/mining.cpp
+++ b/src/rpc/mining.cpp
@@ -1059,10 +1059,7 @@
coinbasetxn.pushKV("minerfund", minerFund);
CScript stakingRewardsPayoutScript;
- if (IsCowperthwaiteEnabled(consensusParams, pindexPrev) &&
- g_avalanche && isAvalancheEnabled(gArgs) &&
- gArgs.GetBoolArg("-avalanchestakingrewards",
- consensusParams.enableStakingRewards) &&
+ if (IsStakingRewardsActivated(consensusParams, pindexPrev) &&
g_avalanche->getStakingRewardWinner(
pindexPrev->GetBlockHash(), stakingRewardsPayoutScript)) {
UniValue stakingRewards(UniValue::VOBJ);

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 1, 09:06 (1 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187163
Default Alt Text
D14646.diff (6 KB)

Event Timeline