diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 742301ed..de4762fa 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -77,6 +77,32 @@ vector> database::sort return refs; } +template<> +vector> database::sort_votable_objects(size_t count) const +{ + const auto& all_sons = get_index_type().indices().get< by_id >(); + std::vector> refs; + for( auto& son : all_sons ) + { + if(son.has_valid_config()) + { + refs.push_back(std::cref(son)); + } + } + count = std::min(count, refs.size()); + std::partial_sort(refs.begin(), refs.begin() + count, refs.end(), + [this](const son_object& a, const son_object& b)->bool { + share_type oa_vote = _vote_tally_buffer[a.vote_id]; + share_type ob_vote = _vote_tally_buffer[b.vote_id]; + if( oa_vote != ob_vote ) + return oa_vote > ob_vote; + return a.vote_id < b.vote_id; + }); + + refs.resize(count, refs.front()); + return refs; +} + template void database::perform_account_maintenance(Type tally_helper) { @@ -730,6 +756,13 @@ void database::update_active_sons() return swi.son_id; }); _sso.scheduler.update(active_sons); + // similar to witness, produce schedule for sons + if(cur_active_sons.size() == 0 && new_active_sons.size() > 0) + { + witness_scheduler_rng rng(_sso.rng_seed.begin(), GRAPHENE_NEAR_SCHEDULE_CTR_IV); + for( size_t i=0; i sidechain_public_keys; void pay_son_fee(share_type pay, database& db); + bool has_valid_config()const; }; struct by_account; diff --git a/libraries/chain/son_evaluator.cpp b/libraries/chain/son_evaluator.cpp index 3974550f..2a849014 100644 --- a/libraries/chain/son_evaluator.cpp +++ b/libraries/chain/son_evaluator.cpp @@ -76,6 +76,7 @@ void_result delete_son_evaluator::do_evaluate(const son_delete_operation& op) void_result delete_son_evaluator::do_apply(const son_delete_operation& op) { try { const auto& idx = db().get_index_type().indices().get(); + const auto& ss_idx = db().get_index_type().indices().get(); auto son = idx.find(op.son_id); if(son != idx.end()) { vesting_balance_object deposit = son->deposit(db()); @@ -88,6 +89,9 @@ void_result delete_son_evaluator::do_apply(const son_delete_operation& op) vbo.policy = new_vesting_policy; }); + auto stats_obj = ss_idx.find(son->statistics); + if(stats_obj != ss_idx.end()) + db().remove(*stats_obj); db().remove(*son); } return void_result(); diff --git a/libraries/chain/son_object.cpp b/libraries/chain/son_object.cpp index 2d3c48ae..bf54c833 100644 --- a/libraries/chain/son_object.cpp +++ b/libraries/chain/son_object.cpp @@ -5,4 +5,11 @@ namespace graphene { namespace chain { void son_object::pay_son_fee(share_type pay, database& db) { db.adjust_balance(son_account, pay); } + + bool son_object::has_valid_config()const { + return ((std::string(signing_key).length() > 0) && + (sidechain_public_keys.size() > 0) && + (sidechain_public_keys.find( sidechain_type::bitcoin ) != sidechain_public_keys.end()) && + (sidechain_public_keys.at(sidechain_type::bitcoin).length() > 0)); + } }}