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.
251const std::span<const std::byte> in_b{MakeByteSpan(in_s)};253BOOST_CHECK_EQUAL(HexStr(in_u), out_exp);254BOOST_CHECK_EQUAL(HexStr(in_s), out_exp);255BOOST_CHECK_EQUAL(HexStr(in_b), out_exp);256}258{259auto input = std::string();260for (size_t i=0; i<256; ++i) {261input.push_back(static_cast<char>(i));262}264auto hex = HexStr(input);265BOOST_TEST_REQUIRE(hex.size() == 512);266static constexpr auto hexmap = std::string_view("0123456789abcdef");267for (size_t i = 0; i < 256; ++i) {268auto upper = hexmap.find(hex[i * 2]);269auto lower = hexmap.find(hex[i * 2 + 1]);270BOOST_TEST_REQUIRE(upper != std::string_view::npos);271BOOST_TEST_REQUIRE(lower != std::string_view::npos);272BOOST_TEST_REQUIRE(i == upper*16 + lower);273}274}275}277BOOST_AUTO_TEST_CASE(span_write_bytes)278{279std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};280const auto mut_bytes{MakeWritableByteSpan(mut_arr)};281mut_bytes[1] = std::byte{0x11};282BOOST_CHECK_EQUAL(mut_arr.at(0), 0xaa);283BOOST_CHECK_EQUAL(mut_arr.at(1), 0x11);284}286BOOST_AUTO_TEST_CASE(util_Join)287{288// Normal version289BOOST_CHECK_EQUAL(Join(std::vector<std::string>{}, ", "), "");290BOOST_CHECK_EQUAL(Join(std::vector<std::string>{"foo"}, ", "), "foo");291BOOST_CHECK_EQUAL(Join(std::vector<std::string>{"foo", "bar"}, ", "), "foo, bar");293// Version with unary operator294const auto op_upper = [](const std::string& s) { return ToUpper(s); };295BOOST_CHECK_EQUAL(Join(std::list<std::string>{}, ", ", op_upper), "");296BOOST_CHECK_EQUAL(Join(std::list<std::string>{"foo"}, ", ", op_upper), "FOO");297BOOST_CHECK_EQUAL(Join(std::list<std::string>{"foo", "bar"}, ", ", op_upper), "FOO, BAR");298}300BOOST_AUTO_TEST_CASE(util_ReplaceAll)301{302const std::string original("A test \"%s\" string '%s'.");303auto test_replaceall{[](std::string test, std::string_view search, std::string_view substitute, std::string_view expected) {304ReplaceAll(test, search, substitute);305BOOST_CHECK_EQUAL(test, expected);306}};308test_replaceall(original, "", "foo", original);309test_replaceall(original, "missing", "foo", original);310test_replaceall(original, original, "foo", "foo");311test_replaceall(original, "%s", "foo", "A test \"foo\" string 'foo'.");312test_replaceall(original, "\"", "foo", "A test foo%sfoo string '%s'.");313test_replaceall(original, "'", "foo", "A test \"%s\" string foo%sfoo.");314test_replaceall("a.b", ".", "x", "axb");315test_replaceall("%w and %w", "%w", "$&$`$'$1$$", "$&$`$'$1$$ and $&$`$'$1$$");316test_replaceall("x", "x", "xx", "xx");317}319BOOST_AUTO_TEST_CASE(util_TrimString)320{321BOOST_CHECK_EQUAL(TrimString(" foo bar "), "foo bar");322BOOST_CHECK_EQUAL(TrimStringView("\t \n \n \f\n\r\t\v\tfoo \n \f\n\r\t\v\tbar\t \n \f\n\r\t\v\t\n "), "foo \n \f\n\r\t\v\tbar");323BOOST_CHECK_EQUAL(TrimString("\t \n foo \n\tbar\t \n "), "foo \n\tbar");324BOOST_CHECK_EQUAL(TrimStringView("\t \n foo \n\tbar\t \n ", "fobar"), "\t \n foo \n\tbar\t \n ");325BOOST_CHECK_EQUAL(TrimString("foo bar"), "foo bar");326BOOST_CHECK_EQUAL(TrimStringView("foo bar", "fobar"), " ");327BOOST_CHECK_EQUAL(TrimString(std::string("\0 foo \0 ", 8)), std::string("\0 foo \0", 7));328BOOST_CHECK_EQUAL(TrimStringView(std::string(" foo ", 5)), std::string("foo", 3));329BOOST_CHECK_EQUAL(TrimString(std::string("\t\t\0\0\n\n", 6)), std::string("\0\0", 2));330BOOST_CHECK_EQUAL(TrimStringView(std::string("\x05\x04\x03\x02\x01\x00", 6)), std::string("\x05\x04\x03\x02\x01\x00", 6));331BOOST_CHECK_EQUAL(TrimString(std::string("\x05\x04\x03\x02\x01\x00", 6), std::string("\x05\x04\x03\x02\x01", 5)), std::string("\0", 1));332BOOST_CHECK_EQUAL(TrimStringView(std::string("\x05\x04\x03\x02\x01\x00", 6), std::string("\x05\x04\x03\x02\x01\x00", 6)), "");333}335BOOST_AUTO_TEST_CASE(util_ParseISO8601DateTime)336{337BOOST_CHECK_EQUAL(ParseISO8601DateTime("1969-12-31T23:59:59Z").value(), -1);338BOOST_CHECK_EQUAL(ParseISO8601DateTime("1970-01-01T00:00:00Z").value(), 0);339BOOST_CHECK_EQUAL(ParseISO8601DateTime("1970-01-01T00:00:01Z").value(), 1);340BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T00:00:01Z").value(), 946684801);341BOOST_CHECK_EQUAL(ParseISO8601DateTime("2011-09-30T23:36:17Z").value(), 1317425777);342BOOST_CHECK_EQUAL(ParseISO8601DateTime("2100-12-31T23:59:59Z").value(), 4133980799);343BOOST_CHECK_EQUAL(ParseISO8601DateTime("9999-12-31T23:59:59Z").value(), 253402300799);345// Accept edge-cases, where the time overflows. They are not produced by346// FormatISO8601DateTime, so this can be changed in the future, if needed.347// For now, keep compatibility with the previous implementation.348BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T99:00:00Z").value(), 947041200);349BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T00:99:00Z").value(), 946690740);350BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T00:00:99Z").value(), 946684899);351BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T99:99:99Z").value(), 947047239);353// Reject date overflows.354BOOST_CHECK(!ParseISO8601DateTime("2000-99-01T00:00:00Z"));355BOOST_CHECK(!ParseISO8601DateTime("2000-01-99T00:00:00Z"));357// Reject out-of-range years358BOOST_CHECK(!ParseISO8601DateTime("32768-12-31T23:59:59Z"));359BOOST_CHECK(!ParseISO8601DateTime("32767-12-31T23:59:59Z"));360BOOST_CHECK(!ParseISO8601DateTime("32767-12-31T00:00:00Z"));361BOOST_CHECK(!ParseISO8601DateTime("999-12-31T00:00:00Z"));363// Reject invalid format364const std::string valid{"2000-01-01T00:00:01Z"};365BOOST_CHECK(ParseISO8601DateTime(valid).has_value());366for (auto mut{0U}; mut < valid.size(); ++mut) {367std::string invalid{valid};368invalid[mut] = 'a';369BOOST_CHECK(!ParseISO8601DateTime(invalid));370}371}373BOOST_AUTO_TEST_CASE(util_FormatISO8601DateTime)374{375BOOST_CHECK_EQUAL(FormatISO8601DateTime(971890963199), "32767-12-31T23:59:59Z");376BOOST_CHECK_EQUAL(FormatISO8601DateTime(971890876800), "32767-12-31T00:00:00Z");378BOOST_CHECK_EQUAL(FormatISO8601DateTime(-1), "1969-12-31T23:59:59Z");379BOOST_CHECK_EQUAL(FormatISO8601DateTime(0), "1970-01-01T00:00:00Z");380BOOST_CHECK_EQUAL(FormatISO8601DateTime(1), "1970-01-01T00:00:01Z");381BOOST_CHECK_EQUAL(FormatISO8601DateTime(946684801), "2000-01-01T00:00:01Z");382BOOST_CHECK_EQUAL(FormatISO8601DateTime(1317425777), "2011-09-30T23:36:17Z");383BOOST_CHECK_EQUAL(FormatISO8601DateTime(4133980799), "2100-12-31T23:59:59Z");384BOOST_CHECK_EQUAL(FormatISO8601DateTime(253402300799), "9999-12-31T23:59:59Z");385}387BOOST_AUTO_TEST_CASE(util_FormatISO8601Date)388{389BOOST_CHECK_EQUAL(FormatISO8601Date(971890963199), "32767-12-31");390BOOST_CHECK_EQUAL(FormatISO8601Date(971890876800), "32767-12-31");392BOOST_CHECK_EQUAL(FormatISO8601Date(0), "1970-01-01");393BOOST_CHECK_EQUAL(FormatISO8601Date(1317425777), "2011-09-30");394}397BOOST_AUTO_TEST_CASE(util_FormatRFC1123DateTime)398{399BOOST_CHECK_EQUAL(FormatRFC1123DateTime(std::numeric_limits<int64_t>::max()), "");400BOOST_CHECK_EQUAL(FormatRFC1123DateTime(253402300800), "");401BOOST_CHECK_EQUAL(FormatRFC1123DateTime(253402300799), "Fri, 31 Dec 9999 23:59:59 GMT");402BOOST_CHECK_EQUAL(FormatRFC1123DateTime(253402214400), "Fri, 31 Dec 9999 00:00:00 GMT");403BOOST_CHECK_EQUAL(FormatRFC1123DateTime(1717429609), "Mon, 03 Jun 2024 15:46:49 GMT");404BOOST_CHECK_EQUAL(FormatRFC1123DateTime(0), "Thu, 01 Jan 1970 00:00:00 GMT");405BOOST_CHECK_EQUAL(FormatRFC1123DateTime(-1), "Wed, 31 Dec 1969 23:59:59 GMT");406BOOST_CHECK_EQUAL(FormatRFC1123DateTime(-1717429609), "Sat, 31 Jul 1915 08:13:11 GMT");407BOOST_CHECK_EQUAL(FormatRFC1123DateTime(-62167219200), "Sat, 01 Jan 0000 00:00:00 GMT");408BOOST_CHECK_EQUAL(FormatRFC1123DateTime(-62167219201), "");409}411BOOST_AUTO_TEST_CASE(util_FormatMoney)412{413BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");414BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789), "12345.6789");415BOOST_CHECK_EQUAL(FormatMoney(-COIN), "-1.00");417BOOST_CHECK_EQUAL(FormatMoney(COIN*100000000), "100000000.00");418BOOST_CHECK_EQUAL(FormatMoney(COIN*10000000), "10000000.00");419BOOST_CHECK_EQUAL(FormatMoney(COIN*1000000), "1000000.00");420BOOST_CHECK_EQUAL(FormatMoney(COIN*100000), "100000.00");421BOOST_CHECK_EQUAL(FormatMoney(COIN*10000), "10000.00");422BOOST_CHECK_EQUAL(FormatMoney(COIN*1000), "1000.00");423BOOST_CHECK_EQUAL(FormatMoney(COIN*100), "100.00");424BOOST_CHECK_EQUAL(FormatMoney(COIN*10), "10.00");425BOOST_CHECK_EQUAL(FormatMoney(COIN), "1.00");426BOOST_CHECK_EQUAL(FormatMoney(COIN/10), "0.10");427BOOST_CHECK_EQUAL(FormatMoney(COIN/100), "0.01");428BOOST_CHECK_EQUAL(FormatMoney(COIN/1000), "0.001");429BOOST_CHECK_EQUAL(FormatMoney(COIN/10000), "0.0001");430BOOST_CHECK_EQUAL(FormatMoney(COIN/100000), "0.00001");431BOOST_CHECK_EQUAL(FormatMoney(COIN/1000000), "0.000001");432BOOST_CHECK_EQUAL(FormatMoney(COIN/10000000), "0.0000001");433BOOST_CHECK_EQUAL(FormatMoney(COIN/100000000), "0.00000001");435BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max()), "92233720368.54775807");436BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max() - 1), "92233720368.54775806");437BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max() - 2), "92233720368.54775805");438BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max() - 3), "92233720368.54775804");439// ...440BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min() + 3), "-92233720368.54775805");441BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min() + 2), "-92233720368.54775806");442BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min() + 1), "-92233720368.54775807");443BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min()), "-92233720368.54775808");444}446BOOST_AUTO_TEST_CASE(util_ParseMoney)447{448BOOST_CHECK_EQUAL(ParseMoney("0.0").value(), 0);449BOOST_CHECK_EQUAL(ParseMoney(".").value(), 0);450BOOST_CHECK_EQUAL(ParseMoney("0.").value(), 0);451BOOST_CHECK_EQUAL(ParseMoney(".0").value(), 0);452BOOST_CHECK_EQUAL(ParseMoney(".6789").value(), 6789'0000);453BOOST_CHECK_EQUAL(ParseMoney("12345.").value(), COIN * 12345);455BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789);457BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000);458BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000);459BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000);460BOOST_CHECK_EQUAL(ParseMoney("10000.00").value(), COIN*10000);461BOOST_CHECK_EQUAL(ParseMoney("1000.00").value(), COIN*1000);462BOOST_CHECK_EQUAL(ParseMoney("100.00").value(), COIN*100);463BOOST_CHECK_EQUAL(ParseMoney("10.00").value(), COIN*10);464BOOST_CHECK_EQUAL(ParseMoney("1.00").value(), COIN);465BOOST_CHECK_EQUAL(ParseMoney("1").value(), COIN);466BOOST_CHECK_EQUAL(ParseMoney(" 1").value(), COIN);467BOOST_CHECK_EQUAL(ParseMoney("1 ").value(), COIN);468BOOST_CHECK_EQUAL(ParseMoney(" 1 ").value(), COIN);469BOOST_CHECK_EQUAL(ParseMoney("0.1").value(), COIN/10);470BOOST_CHECK_EQUAL(ParseMoney("0.01").value(), COIN/100);471BOOST_CHECK_EQUAL(ParseMoney("0.001").value(), COIN/1000);472BOOST_CHECK_EQUAL(ParseMoney("0.0001").value(), COIN/10000);473BOOST_CHECK_EQUAL(ParseMoney("0.00001").value(), COIN/100000);474BOOST_CHECK_EQUAL(ParseMoney("0.000001").value(), COIN/1000000);475BOOST_CHECK_EQUAL(ParseMoney("0.0000001").value(), COIN/10000000);476BOOST_CHECK_EQUAL(ParseMoney("0.00000001").value(), COIN/100000000);477BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001 ").value(), COIN/100000000);478BOOST_CHECK_EQUAL(ParseMoney("0.00000001 ").value(), COIN/100000000);479BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000);481// Parsing amount that cannot be represented should fail482BOOST_CHECK(!ParseMoney("100000000.00"));483BOOST_CHECK(!ParseMoney("0.000000001"));485// Parsing empty string should fail486BOOST_CHECK(!ParseMoney(""));487BOOST_CHECK(!ParseMoney(" "));488BOOST_CHECK(!ParseMoney(" "));490// Parsing two numbers should fail491BOOST_CHECK(!ParseMoney(".."));492BOOST_CHECK(!ParseMoney("0..0"));493BOOST_CHECK(!ParseMoney("1 2"));494BOOST_CHECK(!ParseMoney(" 1 2 "));495BOOST_CHECK(!ParseMoney(" 1.2 3 "));496BOOST_CHECK(!ParseMoney(" 1 2.3 "));498// Embedded whitespace should fail499BOOST_CHECK(!ParseMoney(" -1 .2 "));500BOOST_CHECK(!ParseMoney(" 1 .2 "));
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.