diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 9aed8b4e..7187fd9b 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -733,9 +733,9 @@ double calculate_vesting_factor(const database& d, const account_object& stake_a // get global data related to gpos const auto &gpo = d.get_global_properties(); - const auto vesting_period = gpo.parameters.gpos_period; - const auto vesting_subperiod = gpo.parameters.gpos_subperiod; - const auto period_start = gpo.parameters.gpos_period_start; + const auto vesting_period = gpo.parameters.gpos_period(); + const auto vesting_subperiod = gpo.parameters.gpos_subperiod(); + const auto period_start = fc::time_point_sec(gpo.parameters.gpos_period_start()); // variables needed const fc::time_point_sec period_end = period_start + vesting_period; @@ -830,15 +830,16 @@ void rolling_period_start(database& db) { if(db.head_block_time() >= HARDFORK_GPOS_TIME) { - auto period_start = db.get_global_properties().parameters.gpos_period_start; - auto vesting_period = db.get_global_properties().parameters.gpos_period; + auto gpo = db.get_global_properties(); + auto period_start = db.get_global_properties().parameters.gpos_period_start(); + auto vesting_period = db.get_global_properties().parameters.gpos_period(); auto now = db.head_block_time(); - if(now.sec_since_epoch() > (period_start.sec_since_epoch() + vesting_period)) + if(now.sec_since_epoch() > (period_start + vesting_period)) { // roll db.modify(db.get_global_properties(), [now](global_property_object& p) { - p.parameters.gpos_period_start = now; + p.parameters.extensions.value.gpos_period_start = now.sec_since_epoch(); }); } } diff --git a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp index ef12e65e..87c2e3fe 100644 --- a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp +++ b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp @@ -39,6 +39,10 @@ namespace graphene { namespace chain { optional< uint16_t > betting_rake_fee_percentage; optional< flat_map > permitted_betting_odds_increments; optional< uint16_t > live_betting_delay_time; + /* gpos parameters */ + optional < uint32_t > gpos_period; + optional < uint32_t > gpos_subperiod; + optional < uint32_t > gpos_period_start; }; struct chain_parameters @@ -88,10 +92,6 @@ namespace graphene { namespace chain { uint32_t maximum_tournament_start_time_in_future = TOURNAMENT_MAX_START_TIME_IN_FUTURE; uint32_t maximum_tournament_start_delay = TOURNAMENT_MAX_START_DELAY; uint16_t maximum_tournament_number_of_wins = TOURNAMENT_MAX_NUMBER_OF_WINS; - /* gpos parameters constraints */ - uint32_t gpos_period = GPOS_PERIOD; /// toal seconds of current gpos period - uint32_t gpos_subperiod = GPOS_SUBPERIOD; /// gpos_period % gpos_subperiod = 0 - time_point_sec gpos_period_start = HARDFORK_GPOS_TIME; /// current period start date extension extensions; /** defined in fee_schedule.cpp */ @@ -112,6 +112,15 @@ namespace graphene { namespace chain { inline uint16_t live_betting_delay_time()const { return extensions.value.live_betting_delay_time.valid() ? *extensions.value.live_betting_delay_time : GRAPHENE_DEFAULT_LIVE_BETTING_DELAY_TIME; } + inline uint32_t gpos_period()const { + return extensions.value.gpos_period.valid() ? *extensions.value.gpos_period : GPOS_PERIOD; /// total seconds of current gpos period + } + inline uint32_t gpos_subperiod()const { + return extensions.value.gpos_subperiod.valid() ? *extensions.value.gpos_subperiod : GPOS_SUBPERIOD; /// gpos_period % gpos_subperiod = 0 + } + inline uint32_t gpos_period_start()const { + return extensions.value.gpos_period_start.valid() ? *extensions.value.gpos_period_start : HARDFORK_GPOS_TIME.sec_since_epoch(); /// current period start date + } }; } } // graphene::chain @@ -122,6 +131,9 @@ FC_REFLECT( graphene::chain::parameter_extension, (betting_rake_fee_percentage) (permitted_betting_odds_increments) (live_betting_delay_time) + (gpos_period) + (gpos_subperiod) + (gpos_period_start) ) FC_REFLECT( graphene::chain::chain_parameters, @@ -167,8 +179,5 @@ FC_REFLECT( graphene::chain::chain_parameters, (maximum_tournament_start_time_in_future) (maximum_tournament_start_delay) (maximum_tournament_number_of_wins) - (gpos_period) - (gpos_subperiod) - (gpos_period_start) (extensions) ) diff --git a/libraries/chain/vesting_balance_evaluator.cpp b/libraries/chain/vesting_balance_evaluator.cpp index c3a833cd..0b6e192e 100644 --- a/libraries/chain/vesting_balance_evaluator.cpp +++ b/libraries/chain/vesting_balance_evaluator.cpp @@ -101,8 +101,8 @@ object_id_type vesting_balance_create_evaluator::do_apply( const vesting_balance // forcing gpos policy linear_vesting_policy p; p.begin_timestamp = now; - p.vesting_cliff_seconds = gpo.parameters.gpos_subperiod; - p.vesting_duration_seconds = gpo.parameters.gpos_subperiod; + p.vesting_cliff_seconds = gpo.parameters.gpos_subperiod(); + p.vesting_duration_seconds = gpo.parameters.gpos_subperiod(); obj.policy = p; } else { diff --git a/tests/tests/gpos_tests.cpp b/tests/tests/gpos_tests.cpp index ebae4c6b..b283aceb 100644 --- a/tests/tests/gpos_tests.cpp +++ b/tests/tests/gpos_tests.cpp @@ -85,13 +85,13 @@ struct gpos_fixture: database_fixture void update_gpos_global(uint32_t vesting_period, uint32_t vesting_subperiod, fc::time_point_sec period_start) { db.modify(db.get_global_properties(), [vesting_period, vesting_subperiod, period_start](global_property_object& p) { - p.parameters.gpos_period = vesting_period; - p.parameters.gpos_subperiod = vesting_subperiod; - p.parameters.gpos_period_start = period_start; + p.parameters.extensions.value.gpos_period = vesting_period; + p.parameters.extensions.value.gpos_subperiod = vesting_subperiod; + p.parameters.extensions.value.gpos_period_start = period_start.sec_since_epoch(); }); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period, vesting_period); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod, vesting_subperiod); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start.sec_since_epoch(), period_start.sec_since_epoch()); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), vesting_period); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), vesting_subperiod); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), period_start.sec_since_epoch()); } void vote_for(const account_id_type account_id, const vote_id_type vote_for, const fc::ecc::private_key& key) { @@ -163,9 +163,9 @@ BOOST_AUTO_TEST_CASE(gpos_vesting_type) // check created vesting amount and policy BOOST_CHECK_EQUAL(alice_vesting.balance.amount.value, 100); BOOST_CHECK_EQUAL(alice_vesting.policy.get().vesting_duration_seconds, - db.get_global_properties().parameters.gpos_subperiod); + db.get_global_properties().parameters.gpos_subperiod()); BOOST_CHECK_EQUAL(alice_vesting.policy.get().vesting_cliff_seconds, - db.get_global_properties().parameters.gpos_subperiod); + db.get_global_properties().parameters.gpos_subperiod()); // bob creates a gpos vesting with his custom policy { @@ -188,9 +188,9 @@ BOOST_AUTO_TEST_CASE(gpos_vesting_type) // policy is not the one defined by the user but default BOOST_CHECK_EQUAL(bob_vesting.balance.amount.value, 200); BOOST_CHECK_EQUAL(bob_vesting.policy.get().vesting_duration_seconds, - db.get_global_properties().parameters.gpos_subperiod); + db.get_global_properties().parameters.gpos_subperiod()); BOOST_CHECK_EQUAL(bob_vesting.policy.get().vesting_cliff_seconds, - db.get_global_properties().parameters.gpos_subperiod); + db.get_global_properties().parameters.gpos_subperiod()); } catch (fc::exception& e) @@ -347,9 +347,9 @@ BOOST_AUTO_TEST_CASE( voting ) generate_block(); // default gpos values - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period, 15552000); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod, 2592000); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start.sec_since_epoch(), HARDFORK_GPOS_TIME.sec_since_epoch()); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), 15552000); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), 2592000); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), HARDFORK_GPOS_TIME.sec_since_epoch()); // update default gpos for test speed auto now = db.head_block_time(); @@ -357,9 +357,9 @@ BOOST_AUTO_TEST_CASE( voting ) // 86400 = 60x60x24 = 1 day update_gpos_global(518400, 86400, now); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period, 518400); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod, 86400); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start.sec_since_epoch(), now.sec_since_epoch()); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), 518400); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), 86400); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); // end global changes generate_block(); @@ -464,7 +464,7 @@ BOOST_AUTO_TEST_CASE( rolling_period_start ) generate_block(); // period start rolled - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start.sec_since_epoch(), now.sec_since_epoch()); + BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); } catch (fc::exception &e) { edump((e.to_detail_string()));