Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2016-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <consensus/amount.h>6#include <policy/feerate.h>8#include <limits>10#include <boost/test/unit_test.hpp>12BOOST_AUTO_TEST_SUITE(amount_tests)14BOOST_AUTO_TEST_CASE(MoneyRangeTest)15{16BOOST_CHECK_EQUAL(MoneyRange(CAmount(-1)), false);17BOOST_CHECK_EQUAL(MoneyRange(CAmount(0)), true);18BOOST_CHECK_EQUAL(MoneyRange(CAmount(1)), true);19BOOST_CHECK_EQUAL(MoneyRange(MAX_MONEY), true);20BOOST_CHECK_EQUAL(MoneyRange(MAX_MONEY + CAmount(1)), false);21}23BOOST_AUTO_TEST_CASE(GetFeeTest)24{25CFeeRate feeRate, altFeeRate;27feeRate = CFeeRate(0);28// Must always return 029BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));30BOOST_CHECK_EQUAL(feeRate.GetFee(1e5), CAmount(0));32feeRate = CFeeRate(1000);33// Must always just return the arg34BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));35BOOST_CHECK_EQUAL(feeRate.GetFee(1), CAmount(1));36BOOST_CHECK_EQUAL(feeRate.GetFee(121), CAmount(121));37BOOST_CHECK_EQUAL(feeRate.GetFee(999), CAmount(999));38BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), CAmount(1e3));39BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), CAmount(9e3));41feeRate = CFeeRate(-1000);42// Must always just return -1 * arg43BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));44BOOST_CHECK_EQUAL(feeRate.GetFee(1), CAmount(-1));45BOOST_CHECK_EQUAL(feeRate.GetFee(121), CAmount(-121));46BOOST_CHECK_EQUAL(feeRate.GetFee(999), CAmount(-999));47BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), CAmount(-1e3));48BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), CAmount(-9e3));50feeRate = CFeeRate(123);51// Rounds up the result, if not integer52BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));53BOOST_CHECK_EQUAL(feeRate.GetFee(8), CAmount(1)); // Special case: returns 1 instead of 054BOOST_CHECK_EQUAL(feeRate.GetFee(9), CAmount(2));55BOOST_CHECK_EQUAL(feeRate.GetFee(121), CAmount(15));56BOOST_CHECK_EQUAL(feeRate.GetFee(122), CAmount(16));57BOOST_CHECK_EQUAL(feeRate.GetFee(999), CAmount(123));58BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), CAmount(123));59BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), CAmount(1107));61feeRate = CFeeRate(-123);62// Truncates the result, if not integer63BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));64BOOST_CHECK_EQUAL(feeRate.GetFee(8), CAmount(-1)); // Special case: returns -1 instead of 065BOOST_CHECK_EQUAL(feeRate.GetFee(9), CAmount(-1));67// check alternate constructor68feeRate = CFeeRate(1000);69altFeeRate = CFeeRate(feeRate);70BOOST_CHECK_EQUAL(feeRate.GetFee(100), altFeeRate.GetFee(100));72// Check full constructor73BOOST_CHECK(CFeeRate(CAmount(-1), 0) == CFeeRate(0));74BOOST_CHECK(CFeeRate(CAmount(0), 0) == CFeeRate(0));75BOOST_CHECK(CFeeRate(CAmount(1), 0) == CFeeRate(0));76BOOST_CHECK(CFeeRate(CAmount(1), -1000) == CFeeRate(0));77// default value78BOOST_CHECK(CFeeRate(CAmount(-1), 1000) == CFeeRate(-1));79BOOST_CHECK(CFeeRate(CAmount(0), 1000) == CFeeRate(0));80BOOST_CHECK(CFeeRate(CAmount(1), 1000) == CFeeRate(1));81// Previously, precision was limited to three decimal digits82// due to only supporting satoshis per kB, so CFeeRate(CAmount(1), 1001) was equal to CFeeRate(0)83// Since #32750, higher precision is maintained.84BOOST_CHECK(CFeeRate(CAmount(1), 1001) > CFeeRate(0));85BOOST_CHECK(CFeeRate(CAmount(1), 1001) < CFeeRate(1));86BOOST_CHECK(CFeeRate(CAmount(2), 1001) > CFeeRate(1));87BOOST_CHECK(CFeeRate(CAmount(2), 1001) < CFeeRate(2));88// some more integer checks89BOOST_CHECK(CFeeRate(CAmount(26), 789) > CFeeRate(32));90BOOST_CHECK(CFeeRate(CAmount(26), 789) < CFeeRate(33));91BOOST_CHECK(CFeeRate(CAmount(27), 789) > CFeeRate(34));92BOOST_CHECK(CFeeRate(CAmount(27), 789) < CFeeRate(35));93// Maximum size in bytes, should not crash94CFeeRate(MAX_MONEY, std::numeric_limits<int32_t>::max()).GetFeePerK();96// check multiplication operator97// check multiplying by zero98feeRate = CFeeRate(1000);99BOOST_CHECK(0 * feeRate == CFeeRate(0));100BOOST_CHECK(feeRate * 0 == CFeeRate(0));101// check multiplying by a positive integer102BOOST_CHECK(3 * feeRate == CFeeRate(3000));103BOOST_CHECK(feeRate * 3 == CFeeRate(3000));104// check multiplying by a negative integer105BOOST_CHECK(-3 * feeRate == CFeeRate(-3000));106BOOST_CHECK(feeRate * -3 == CFeeRate(-3000));107// check commutativity108BOOST_CHECK(2 * feeRate == feeRate * 2);109// check with large numbers110int largeNumber = 1000000;111BOOST_CHECK(largeNumber * feeRate == feeRate * largeNumber);112// check boundary values113int maxInt = std::numeric_limits<int>::max();114feeRate = CFeeRate(maxInt);115BOOST_CHECK(feeRate * 2 == CFeeRate(static_cast<int64_t>(maxInt) * 2));116BOOST_CHECK(2 * feeRate == CFeeRate(static_cast<int64_t>(maxInt) * 2));117// check with zero fee rate118feeRate = CFeeRate(0);119BOOST_CHECK(feeRate * 5 == CFeeRate(0));120BOOST_CHECK(5 * feeRate == CFeeRate(0));121}123BOOST_AUTO_TEST_CASE(BinaryOperatorTest)124{125CFeeRate a, b;126a = CFeeRate(1);127b = CFeeRate(2);128BOOST_CHECK(a < b);129BOOST_CHECK(b > a);130BOOST_CHECK(a == a);131BOOST_CHECK(a <= b);132BOOST_CHECK(a <= a);133BOOST_CHECK(b >= a);134BOOST_CHECK(b >= b);135// a should be 0.00000002 BTC/kvB now136a += a;137BOOST_CHECK(a == b);138}140BOOST_AUTO_TEST_CASE(ToStringTest)141{142CFeeRate feeRate;143feeRate = CFeeRate(1);144BOOST_CHECK_EQUAL(feeRate.ToString(), "0.00000001 BTC/kvB");145BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::BTC_KVB), "0.00000001 BTC/kvB");146BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "0.001 sat/vB");148feeRate = CFeeRate(0);149BOOST_CHECK_EQUAL(feeRate.ToString(), "0.00000000 BTC/kvB");150BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::BTC_KVB), "0.00000000 BTC/kvB");151BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "0.000 sat/vB");153feeRate = CFeeRate(-1);154BOOST_CHECK_EQUAL(feeRate.ToString(), "-0.00000001 BTC/kvB");155BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::BTC_KVB), "-0.00000001 BTC/kvB");156BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "-0.001 sat/vB");158feeRate = CFeeRate(-1000);159BOOST_CHECK_EQUAL(feeRate.ToString(), "-0.00001000 BTC/kvB");160BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "-1.000 sat/vB");162feeRate = CFeeRate(-COIN - 1);163BOOST_CHECK_EQUAL(feeRate.ToString(), "-1.00000001 BTC/kvB");164BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "-100000.001 sat/vB");165}167BOOST_AUTO_TEST_SUITE_END()
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.