From cbfd937eeb8fdc224c088a45609c9845d071590c Mon Sep 17 00:00:00 2001 From: satyakoneru <15652887+satyakoneru@users.noreply.github.com> Date: Fri, 3 Apr 2020 17:44:09 +0000 Subject: [PATCH] [SON-291,SON-328] - SON Configuration invalid, PW creation issues --- libraries/chain/db_maint.cpp | 26 +++++++++++++++++++ .../include/graphene/chain/son_object.hpp | 1 + libraries/chain/son_evaluator.cpp | 4 +++ libraries/chain/son_object.cpp | 7 +++++ 4 files changed, 38 insertions(+) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 96d44602..70ebb6b4 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) { diff --git a/libraries/chain/include/graphene/chain/son_object.hpp b/libraries/chain/include/graphene/chain/son_object.hpp index 0bc87ecc..5d1adf20 100644 --- a/libraries/chain/include/graphene/chain/son_object.hpp +++ b/libraries/chain/include/graphene/chain/son_object.hpp @@ -73,6 +73,7 @@ namespace graphene { namespace chain { flat_map 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 021d8d20..1da9a811 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)); + } }}