diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 06e15a19..e075e225 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -415,6 +415,18 @@ void database::process_budget() rec.witness_budget = witness_budget; available_funds -= witness_budget; + // Before making a budget we should pay out SONs for the last day + // To be implemented once son base code is available + // This function should check if its time to pay sons + // and modify the global son funds accordingly, whatever is left is passed on to next budget + //pay_sons() + share_type son_budget = gpo.parameters.son_pay_daily_max(); + son_budget = std::min(son_budget, available_funds); + rec.son_budget = son_budget; + rec.leftover_son_funds = dpo.son_budget; + available_funds += rec.leftover_son_funds; + available_funds -= son_budget; + fc::uint128_t worker_budget_u128 = gpo.parameters.worker_budget_per_day.value; worker_budget_u128 *= uint64_t(time_to_maint); worker_budget_u128 /= 60*60*24; @@ -434,9 +446,11 @@ void database::process_budget() rec.supply_delta = rec.witness_budget + rec.worker_budget + + rec.son_budget - rec.leftover_worker_funds - rec.from_accumulated_fees - - rec.from_unused_witness_budget; + - rec.from_unused_witness_budget + - rec.leftover_son_funds; modify(core, [&]( asset_dynamic_data_object& _core ) { @@ -445,9 +459,11 @@ void database::process_budget() assert( rec.supply_delta == witness_budget + worker_budget + + son_budget - leftover_worker_funds - _core.accumulated_fees - dpo.witness_budget + - dpo.son_budget ); _core.accumulated_fees = 0; }); @@ -458,6 +474,7 @@ void database::process_budget() // available_funds, we replace it with witness_budget // instead of adding it. _dpo.witness_budget = witness_budget; + _dpo.son_budget = son_budget; _dpo.last_budget_time = now; }); diff --git a/libraries/chain/include/graphene/chain/budget_record_object.hpp b/libraries/chain/include/graphene/chain/budget_record_object.hpp index 49544793..63784c71 100644 --- a/libraries/chain/include/graphene/chain/budget_record_object.hpp +++ b/libraries/chain/include/graphene/chain/budget_record_object.hpp @@ -46,9 +46,11 @@ struct budget_record // sinks of budget, should sum up to total_budget share_type witness_budget = 0; share_type worker_budget = 0; + share_type son_budget = 0; // unused budget share_type leftover_worker_funds = 0; + share_type leftover_son_funds = 0; // change in supply due to budget operations share_type supply_delta = 0; diff --git a/libraries/chain/include/graphene/chain/config.hpp b/libraries/chain/include/graphene/chain/config.hpp index fbb9a550..b23aa0d4 100644 --- a/libraries/chain/include/graphene/chain/config.hpp +++ b/libraries/chain/include/graphene/chain/config.hpp @@ -229,3 +229,4 @@ #define GPOS_PERIOD (60*60*24*30*6) // 6 months #define GPOS_SUBPERIOD (60*60*24*30) // 1 month #define MIN_SON_MEMBER_COUNT 15 +#define MIN_SON_PAY_DAILY_MAX 200 diff --git a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp index 3a186be2..c0799a1e 100644 --- a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp +++ b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp @@ -44,6 +44,7 @@ namespace graphene { namespace chain { optional < uint32_t > gpos_subperiod; optional < uint32_t > gpos_period_start; optional < uint16_t > son_count; + optional < uint32_t > son_pay_daily_max; }; struct chain_parameters @@ -125,6 +126,9 @@ namespace graphene { namespace chain { inline uint16_t son_count()const { return extensions.value.son_count.valid() ? *extensions.value.son_count : MIN_SON_MEMBER_COUNT; } + inline uint16_t son_pay_daily_max()const { + return extensions.value.son_pay_daily_max.valid() ? *extensions.value.son_pay_daily_max : MIN_SON_PAY_DAILY_MAX; + } }; } } // graphene::chain @@ -139,6 +143,7 @@ FC_REFLECT( graphene::chain::parameter_extension, (gpos_subperiod) (gpos_period_start) (son_count) + (son_pay_daily_max) ) FC_REFLECT( graphene::chain::chain_parameters,