diff --git a/src/policy/feerate.cpp b/src/policy/feerate.cpp index e89ca308f..93bc4649d 100644 --- a/src/policy/feerate.cpp +++ b/src/policy/feerate.cpp @@ -4,6 +4,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include #include #include @@ -14,7 +15,10 @@ CFeeRate::CFeeRate(const CAmount& nFeePaid, uint32_t num_bytes) { const int64_t nSize{num_bytes}; - if (nSize > 0) { + if (nFeePaid >= MAX_MONEY && nSize > 0) { + arith_uint256 nSatsPerK = arith_uint256(nFeePaid) * 1000 / arith_uint256(nSize); + nSatoshisPerK = nSatsPerK.GetLow64(); + } else if (nSize > 0) { nSatoshisPerK = nFeePaid * 1000 / nSize; } else { nSatoshisPerK = 0; diff --git a/src/test/amount_tests.cpp b/src/test/amount_tests.cpp index d91527a11..9272d5f8e 100644 --- a/src/test/amount_tests.cpp +++ b/src/test/amount_tests.cpp @@ -6,6 +6,8 @@ #include #include +#include + #include #include @@ -84,8 +86,15 @@ BOOST_AUTO_TEST_CASE(GetFeeTest) // some more integer checks BOOST_CHECK(CFeeRate(CAmount(26), 789) == CFeeRate(32)); BOOST_CHECK(CFeeRate(CAmount(27), 789) == CFeeRate(34)); +} + +BOOST_AUTO_TEST_CASE(SizeLimitTest) +{ // Maximum size in bytes, should not crash - CFeeRate(MAX_MONEY, std::numeric_limits::max()).GetFeePerK(); + BOOST_CHECK(CFeeRate(MAX_MONEY, std::numeric_limits::max()) == CFeeRate(2147483648487)); + BOOST_CHECK_EQUAL(CFeeRate(MAX_MONEY, std::numeric_limits::max()).ToString() , "21474.83648487 RDD/kvB"); + BOOST_CHECK_EQUAL(CFeeRate(MAX_MONEY, std::numeric_limits::max()).ToString(FeeEstimateMode::BTC_KVB) , "21474.83648487 RDD/kvB"); + BOOST_CHECK_EQUAL(CFeeRate(MAX_MONEY, std::numeric_limits::max()).ToString(FeeEstimateMode::SAT_VB) , "2147483648.487 sat/vB"); } BOOST_AUTO_TEST_CASE(BinaryOperatorTest)