From 801aba02e4b12930da152f81908813c4d025c5c0 Mon Sep 17 00:00:00 2001
From: pbattu123
Date: Tue, 22 Oct 2019 12:37:40 -0300
Subject: [PATCH] Eliminate time gap between two consecutive vesting periods
---
libraries/chain/db_maint.cpp | 41 +++++++++++++++++++++++++++---------
1 file changed, 31 insertions(+), 10 deletions(-)
diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp
index 81fce8f9..4cf8818c 100644
--- a/libraries/chain/db_maint.cpp
+++ b/libraries/chain/db_maint.cpp
@@ -725,13 +725,8 @@ void deprecate_annual_members( database& db )
return;
}
-double database::calculate_vesting_factor(const account_object& stake_account)
+uint32_t database::get_gpos_current_subperiod()
{
- // get last time voted form stats
- const auto &stats = stake_account.statistics(*this);
- fc::time_point_sec last_date_voted = stats.last_vote_time;
-
- // get global data related to gpos
const auto &gpo = this->get_global_properties();
const auto vesting_period = gpo.parameters.gpos_period();
const auto vesting_subperiod = gpo.parameters.gpos_subperiod();
@@ -741,7 +736,6 @@ double database::calculate_vesting_factor(const account_object& stake_account)
const fc::time_point_sec period_end = period_start + vesting_period;
const auto number_of_subperiods = vesting_period / vesting_subperiod;
const auto now = this->head_block_time();
- double vesting_factor;
auto seconds_since_period_start = now.sec_since_epoch() - period_start.sec_since_epoch();
FC_ASSERT(period_start <= now && now <= period_end);
@@ -757,6 +751,28 @@ double database::calculate_vesting_factor(const account_object& stake_account)
current_subperiod = period;
});
+ return current_subperiod;
+}
+
+double database::calculate_vesting_factor(const account_object& stake_account)
+{
+ // get last time voted form stats
+ const auto &stats = stake_account.statistics(*this);
+ fc::time_point_sec last_date_voted = stats.last_vote_time;
+
+ // get global data related to gpos
+ const auto &gpo = this->get_global_properties();
+ 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 auto number_of_subperiods = vesting_period / vesting_subperiod;
+ double vesting_factor;
+
+ // get in what sub period we are
+ uint32_t current_subperiod = get_gpos_current_subperiod();
+
if(current_subperiod == 0 || current_subperiod > number_of_subperiods) return 0;
if(last_date_voted < period_start) return 0;
@@ -829,7 +845,7 @@ void rolling_period_start(database& db)
auto vesting_period = db.get_global_properties().parameters.gpos_period();
auto now = db.head_block_time();
- if(now.sec_since_epoch() > (period_start + vesting_period))
+ if(now.sec_since_epoch() >= (period_start + vesting_period))
{
// roll
db.modify(db.get_global_properties(), [now](global_property_object& p) {
@@ -1386,10 +1402,9 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g
distribute_fba_balances(*this);
create_buyback_orders(*this);
- rolling_period_start(*this);
-
process_dividend_assets(*this);
+ rolling_period_start(*this);
struct vote_tally_helper {
database& d;
const global_property_object& props;
@@ -1558,6 +1573,12 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g
p.pending_parameters->extensions.value.permitted_betting_odds_increments = p.parameters.extensions.value.permitted_betting_odds_increments;
if( !p.pending_parameters->extensions.value.live_betting_delay_time.valid() )
p.pending_parameters->extensions.value.live_betting_delay_time = p.parameters.extensions.value.live_betting_delay_time;
+ if( !p.pending_parameters->extensions.value.gpos_period.valid() )
+ p.pending_parameters->extensions.value.gpos_period = p.parameters.extensions.value.gpos_period;
+ if( !p.pending_parameters->extensions.value.gpos_subperiod.valid() )
+ p.pending_parameters->extensions.value.gpos_subperiod = p.parameters.extensions.value.gpos_subperiod;
+ if( !p.pending_parameters->extensions.value.gpos_vesting_lockin_period.valid() )
+ p.pending_parameters->extensions.value.gpos_vesting_lockin_period = p.parameters.extensions.value.gpos_vesting_lockin_period;
p.parameters = std::move(*p.pending_parameters);
p.pending_parameters.reset();
}