// Copyright (c) 2015-2021 The Dogecoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include BOOST_FIXTURE_TEST_SUITE(dogecoin_tests, TestingSetup) BOOST_AUTO_TEST_CASE(subsidy_test) { const int nHeight = 36; const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN); const auto params = chainParams->GetConsensus(); uint256 prevHash = uint256S("0x4eb7c3f5914a84a25ea0ae12c39d1e5390a8ea576490035b63dcd03fcc14d106"); // Block 35 CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, prevHash); BOOST_CHECK_EQUAL(nSubsidy, 228450 * COIN); } BOOST_AUTO_TEST_CASE(subsidy_limit_test_first_100k) { const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN); const auto params = chainParams->GetConsensus(); CAmount nSum = 0; arith_uint256 prevHash = UintToArith256(uint256S("0")); for (int nHeight = 0; nHeight <= 100000; nHeight++) { CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, ArithToUint256(prevHash)); BOOST_CHECK(MoneyRange(nSubsidy)); BOOST_CHECK(nSubsidy <= 1000000 * COIN); nSum += nSubsidy; // Use nSubsidy to give us some variation in previous block hash, without requiring full block templates prevHash += nSubsidy; } const CAmount expected = 54894174438 * COIN; BOOST_CHECK_EQUAL(expected, nSum); } BOOST_AUTO_TEST_CASE(subsidy_limit_test_100k_145k) { const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN); const auto params = chainParams->GetConsensus(); CAmount nSum = 0; arith_uint256 prevHash = UintToArith256(uint256S("0")); for (int nHeight = 100000; nHeight <= 145000; nHeight++) { CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, ArithToUint256(prevHash)); BOOST_CHECK(MoneyRange(nSubsidy)); BOOST_CHECK(nSubsidy <= 500000 * COIN); nSum += nSubsidy; // Use nSubsidy to give us some variation in previous block hash, without requiring full block templates prevHash += nSubsidy; } const CAmount expected = 12349960000 * COIN; BOOST_CHECK_EQUAL(expected, nSum); } // Check the simplified rewards after block 145,000 BOOST_AUTO_TEST_CASE(subsidy_limit_test_post_145k) { const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN); const auto params = chainParams->GetConsensus(); CAmount nSum = 0; const uint256 prevHash = uint256S("0"); for (int nHeight = 145000; nHeight < 600000; nHeight++) { CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, prevHash); CAmount nExpectedSubsidy = (500000 >> (nHeight / 100000)) * COIN; BOOST_CHECK(MoneyRange(nSubsidy)); BOOST_CHECK_EQUAL(nSubsidy, nExpectedSubsidy); nSum += nSubsidy; } // Test reward at 600k+ is constant CAmount nConstantSubsidy = GetDogecoinBlockSubsidy(600000, params, prevHash); BOOST_CHECK_EQUAL(nConstantSubsidy, 10000 * COIN); nConstantSubsidy = GetDogecoinBlockSubsidy(700000, params, prevHash); BOOST_CHECK_EQUAL(nConstantSubsidy, 10000 * COIN); } BOOST_AUTO_TEST_CASE(get_next_work_difficulty_limit) { SelectParams(CBaseChainParams::MAIN); const Consensus::Params& params = Params().GetConsensus(); CBlockIndex pindexLast; int64_t nLastRetargetTime = 1386474927; // Block # 1 pindexLast.nHeight = 239; pindexLast.nTime = 1386475638; // Block #239 pindexLast.nBits = 0x1e0ffff0; BOOST_CHECK_EQUAL(CalculateDogecoinNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1e00ffff); } BOOST_AUTO_TEST_CASE(get_next_work_pre_digishield) { SelectParams(CBaseChainParams::MAIN); const Consensus::Params& params = Params().GetConsensus(); CBlockIndex pindexLast; int64_t nLastRetargetTime = 1386942008; // Block 9359 pindexLast.nHeight = 9599; pindexLast.nTime = 1386954113; pindexLast.nBits = 0x1c1a1206; BOOST_CHECK_EQUAL(CalculateDogecoinNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1c15ea59); } BOOST_AUTO_TEST_CASE(get_next_work_digishield) { SelectParams(CBaseChainParams::MAIN); const Consensus::Params& params = Params().GetConsensus(); CBlockIndex pindexLast; int64_t nLastRetargetTime = 1395094427; // First hard-fork at 145,000, which applies to block 145,001 onwards pindexLast.nHeight = 145000; pindexLast.nTime = 1395094679; pindexLast.nBits = 0x1b499dfd; BOOST_CHECK_EQUAL(CalculateDogecoinNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1b671062); } BOOST_AUTO_TEST_CASE(get_next_work_digishield_modulated_upper) { SelectParams(CBaseChainParams::MAIN); const Consensus::Params& params = Params().GetConsensus(); CBlockIndex pindexLast; int64_t nLastRetargetTime = 1395100835; // Test the upper bound on modulated time using mainnet block #145,107 pindexLast.nHeight = 145107; pindexLast.nTime = 1395101360; pindexLast.nBits = 0x1b3439cd; BOOST_CHECK_EQUAL(CalculateDogecoinNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1b4e56b3); } BOOST_AUTO_TEST_CASE(get_next_work_digishield_modulated_lower) { SelectParams(CBaseChainParams::MAIN); const Consensus::Params& params = Params().GetConsensus(); CBlockIndex pindexLast; int64_t nLastRetargetTime = 1395380517; // Test the lower bound on modulated time using mainnet block #149,423 pindexLast.nHeight = 149423; pindexLast.nTime = 1395380447; pindexLast.nBits = 0x1b446f21; BOOST_CHECK_EQUAL(CalculateDogecoinNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1b335358); } BOOST_AUTO_TEST_CASE(get_next_work_digishield_rounding) { SelectParams(CBaseChainParams::MAIN); const Consensus::Params& params = Params().GetConsensus(); CBlockIndex pindexLast; int64_t nLastRetargetTime = 1395094679; // Test case for correct rounding of modulated time - this depends on // handling of integer division, and is not obvious from the code pindexLast.nHeight = 145001; pindexLast.nTime = 1395094727; pindexLast.nBits = 0x1b671062; BOOST_CHECK_EQUAL(CalculateDogecoinNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1b6558a4); } BOOST_AUTO_TEST_SUITE_END()