Skip to content

Commit

Permalink
Make bc::settings::max_money a function.
Browse files Browse the repository at this point in the history
  • Loading branch information
toxeus committed Aug 28, 2018
1 parent 18b2bca commit 9483190
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 46 deletions.
3 changes: 1 addition & 2 deletions include/bitcoin/bitcoin/settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class BC_API settings
//--------------------------------------------------------------------------

uint64_t bitcoin_to_satoshi(uint64_t bitcoin_units=1) const;
uint64_t max_money() const;

uint32_t retargeting_factor;
uint32_t block_spacing_seconds;
Expand Down Expand Up @@ -98,9 +99,7 @@ class BC_API settings

uint64_t satoshi_per_bitcoin;
uint64_t initial_block_subsidy_bitcoin;
uint64_t recursive_money;
uint64_t subsidy_interval;
uint64_t max_money;
};

} // namespace libbitcoin
Expand Down
23 changes: 15 additions & 8 deletions src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ settings::settings()
bip9_version_bit1(1u << 1),
bip9_version_base(0x20000000),
satoshi_per_bitcoin(100000000),
initial_block_subsidy_bitcoin(50),
recursive_money(9999999989u)
initial_block_subsidy_bitcoin(50)
{
}

Expand Down Expand Up @@ -237,7 +236,19 @@ settings::settings(config::settings context)
{
}
}
}

uint64_t settings::bitcoin_to_satoshi(uint64_t bitcoin_units) const
{
return bitcoin_units * satoshi_per_bitcoin;
}

uint64_t settings::max_money() const
{
static const std::function<uint64_t(uint64_t)> recursive_money =
[](uint64_t money){
return money > 0 ? money + recursive_money(money >> 1u) : 0;
};
//**************************************************************************
// CONSENSUS: This is the true maximum amount of money that can be created.
// The satoshi client uses a "sanity check" value that is effectively based
Expand All @@ -246,12 +257,8 @@ settings::settings(config::settings context)
// value could be consensus critical unless it was *less* than the true
// value.
//**************************************************************************
max_money = recursive_money * subsidy_interval;
}

uint64_t settings::bitcoin_to_satoshi(uint64_t bitcoin_units) const
{
return bitcoin_units * satoshi_per_bitcoin;
return recursive_money(bitcoin_to_satoshi(initial_block_subsidy_bitcoin)) *
subsidy_interval;
}

} // namespace libbitcoin
16 changes: 8 additions & 8 deletions test/formats/base_10.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ TEST_AMOUNT(zero, 0, "0")
TEST_AMOUNT(max_uint64, max_uint64, "18446744073709551615")

// Max money (mainnet, testnet):
TEST_AMOUNT(max_money_retarget, settings(bc::config::settings::mainnet).max_money, "20999999.9769", btc_decimal_places)
TEST_AMOUNT(overflow_max_money_retarget, settings(bc::config::settings::mainnet).max_money + 1, "20999999.97690001", btc_decimal_places)
TEST_AMOUNT(max_money_retarget, settings(bc::config::settings::mainnet).max_money(), "20999999.9769", btc_decimal_places)
TEST_AMOUNT(overflow_max_money_retarget, settings(bc::config::settings::mainnet).max_money() + 1, "20999999.97690001", btc_decimal_places)

// Max money (regtest):
TEST_AMOUNT(max_money, settings(bc::config::settings::regtest).max_money, "14999.99998350", btc_decimal_places)
TEST_AMOUNT(overflow_max_money, settings(bc::config::settings::regtest).max_money + 1, "14999.99998351", btc_decimal_places)
TEST_AMOUNT(max_money, settings(bc::config::settings::regtest).max_money(), "14999.99998350", btc_decimal_places)
TEST_AMOUNT(overflow_max_money, settings(bc::config::settings::regtest).max_money() + 1, "14999.99998351", btc_decimal_places)

// Decimal points:
TEST_AMOUNT(pure_integer, 42, "42.0", 0)
Expand Down Expand Up @@ -89,12 +89,12 @@ TEST_FORMAT(zero, "0", 0)
TEST_FORMAT(max_uint64, "18446744073709551615", max_uint64)

// Max money (mainnet, testnet):
TEST_FORMAT(max_money_retarget, "20999999.9769", settings(bc::config::settings::mainnet).max_money, btc_decimal_places)
TEST_FORMAT(overflow_max_money_retarget, "20999999.97690001", settings(bc::config::settings::mainnet).max_money + 1, btc_decimal_places)
TEST_FORMAT(max_money_retarget, "20999999.9769", settings(bc::config::settings::mainnet).max_money(), btc_decimal_places)
TEST_FORMAT(overflow_max_money_retarget, "20999999.97690001", settings(bc::config::settings::mainnet).max_money() + 1, btc_decimal_places)

// Max money (regtest):
TEST_FORMAT(max_money, "14999.9999835", settings(bc::config::settings::regtest).max_money, btc_decimal_places)
TEST_FORMAT(overflow_max_money, "14999.99998351", settings(bc::config::settings::regtest).max_money + 1, btc_decimal_places)
TEST_FORMAT(max_money, "14999.9999835", settings(bc::config::settings::regtest).max_money(), btc_decimal_places)
TEST_FORMAT(overflow_max_money, "14999.99998351", settings(bc::config::settings::regtest).max_money() + 1, btc_decimal_places)

// Decimal points:
TEST_FORMAT(pure_integer, "42", 42, 0)
Expand Down
31 changes: 3 additions & 28 deletions test/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,6 @@ using namespace bc;

BOOST_AUTO_TEST_SUITE(settings_tests)

uint64_t max_money_recursive(uint64_t money)
{
return money > 0 ? money + max_money_recursive(money >> 1) : 0;
}

// constructors
//-----------------------------------------------------------------------------

Expand All @@ -51,11 +46,6 @@ BOOST_AUTO_TEST_CASE(settings__construct__default_context__expected)
BOOST_REQUIRE_EQUAL(configuration.bip9_version_base, 0x20000000);
BOOST_REQUIRE_EQUAL(configuration.satoshi_per_bitcoin, 100000000);
BOOST_REQUIRE_EQUAL(configuration.initial_block_subsidy_bitcoin, 50);
BOOST_REQUIRE_EQUAL(configuration.recursive_money, 9999999989u);
auto coin_subsidy = configuration.initial_block_subsidy_bitcoin;
coin_subsidy = configuration.bitcoin_to_satoshi(coin_subsidy);
const auto recursive_money = max_money_recursive(coin_subsidy);
BOOST_REQUIRE_EQUAL(recursive_money, configuration.recursive_money);
const auto satoshi_per_bitcoin = configuration.bitcoin_to_satoshi(1);
BOOST_REQUIRE_EQUAL(satoshi_per_bitcoin, configuration.satoshi_per_bitcoin);
}
Expand Down Expand Up @@ -138,15 +128,10 @@ BOOST_AUTO_TEST_CASE(settings__construct__mainnet_context__expected)
BOOST_REQUIRE_EQUAL(configuration.bip9_bit1_active_checkpoint, bit1_active);
BOOST_REQUIRE_EQUAL(configuration.satoshi_per_bitcoin, 100000000);
BOOST_REQUIRE_EQUAL(configuration.initial_block_subsidy_bitcoin, 50);
BOOST_REQUIRE_EQUAL(configuration.recursive_money, 9999999989u);
BOOST_REQUIRE_EQUAL(configuration.subsidy_interval, 210000);
auto coin_subsidy = configuration.initial_block_subsidy_bitcoin;
coin_subsidy = configuration.bitcoin_to_satoshi(coin_subsidy);
const auto recursive_money = max_money_recursive(coin_subsidy);
BOOST_REQUIRE_EQUAL(recursive_money, configuration.recursive_money);
const auto satoshi_per_bitcoin = configuration.bitcoin_to_satoshi(1);
BOOST_REQUIRE_EQUAL(satoshi_per_bitcoin, configuration.satoshi_per_bitcoin);
BOOST_REQUIRE_EQUAL(configuration.max_money, 2099999997690000);
BOOST_REQUIRE_EQUAL(configuration.max_money(), 2099999997690000);
}

BOOST_AUTO_TEST_CASE(settings__construct__testnet_context__expected)
Expand Down Expand Up @@ -227,15 +212,10 @@ BOOST_AUTO_TEST_CASE(settings__construct__testnet_context__expected)
BOOST_REQUIRE_EQUAL(configuration.bip9_bit1_active_checkpoint, bit1_active);
BOOST_REQUIRE_EQUAL(configuration.satoshi_per_bitcoin, 100000000);
BOOST_REQUIRE_EQUAL(configuration.initial_block_subsidy_bitcoin, 50);
BOOST_REQUIRE_EQUAL(configuration.recursive_money, 9999999989u);
BOOST_REQUIRE_EQUAL(configuration.subsidy_interval, 210000);
auto coin_subsidy = configuration.initial_block_subsidy_bitcoin;
coin_subsidy = configuration.bitcoin_to_satoshi(coin_subsidy);
const auto recursive_money = max_money_recursive(coin_subsidy);
BOOST_REQUIRE_EQUAL(recursive_money, configuration.recursive_money);
const auto satoshi_per_bitcoin = configuration.bitcoin_to_satoshi(1);
BOOST_REQUIRE_EQUAL(satoshi_per_bitcoin, configuration.satoshi_per_bitcoin);
BOOST_REQUIRE_EQUAL(configuration.max_money, 2099999997690000);
BOOST_REQUIRE_EQUAL(configuration.max_money(), 2099999997690000);
}

BOOST_AUTO_TEST_CASE(settings__construct__regtest_context__expected)
Expand Down Expand Up @@ -305,15 +285,10 @@ BOOST_AUTO_TEST_CASE(settings__construct__regtest_context__expected)
BOOST_REQUIRE_EQUAL(configuration.bip9_bit1_active_checkpoint, genesis);
BOOST_REQUIRE_EQUAL(configuration.satoshi_per_bitcoin, 100000000);
BOOST_REQUIRE_EQUAL(configuration.initial_block_subsidy_bitcoin, 50);
BOOST_REQUIRE_EQUAL(configuration.recursive_money, 9999999989u);
BOOST_REQUIRE_EQUAL(configuration.subsidy_interval, 150);
auto coin_subsidy = configuration.initial_block_subsidy_bitcoin;
coin_subsidy = configuration.bitcoin_to_satoshi(coin_subsidy);
const auto recursive_money = max_money_recursive(coin_subsidy);
BOOST_REQUIRE_EQUAL(recursive_money, configuration.recursive_money);
const auto satoshi_per_bitcoin = configuration.bitcoin_to_satoshi(1);
BOOST_REQUIRE_EQUAL(satoshi_per_bitcoin, configuration.satoshi_per_bitcoin);
BOOST_REQUIRE_EQUAL(configuration.max_money, 1499999998350);
BOOST_REQUIRE_EQUAL(configuration.max_money(), 1499999998350);
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 9483190

Please sign in to comment.