diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 9d3148db..21542d9d 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -432,10 +432,10 @@ namespace graphene { namespace app { } case balance_object_type:{ /** these are free from any accounts */ break; - } case son_member_object_type:{ - const auto& son_object = dynamic_cast(obj); - assert( son_object != nullptr ); - accounts.insert( son_object->son_member_account ); + } case son_object_type:{ + const auto& aobj = dynamic_cast(obj); + assert( aobj != nullptr ); + accounts.insert( aobj->son_member_account ); break; } case sport_object_type: diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index d6bffe04..ccf68c53 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -137,7 +137,7 @@ class database_api_impl : public std::enable_shared_from_this map lookup_committee_member_accounts(const string& lower_bound_name, uint32_t limit)const; // SON members - fc::optional get_son_member_by_account(account_id_type account)const; + fc::optional get_son_member_by_account(account_id_type account)const; // Votes vector lookup_vote_ids( const vector& votes )const; @@ -1586,12 +1586,12 @@ map database_api_impl::lookup_committee_member // // ////////////////////////////////////////////////////////////////////// -fc::optional database_api::get_son_member_by_account(account_id_type account)const +fc::optional database_api::get_son_member_by_account(account_id_type account)const { return my->get_son_member_by_account( account ); } -fc::optional database_api_impl::get_son_member_by_account(account_id_type account) const +fc::optional database_api_impl::get_son_member_by_account(account_id_type account) const { const auto& idx = _db.get_index_type().indices().get(); auto itr = idx.find(account); diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index c67f220f..a202264e 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -283,6 +283,9 @@ struct get_impacted_account_visitor } void operator()( const affiliate_referral_payout_operation& op ) { } void operator()( const son_create_operation& op ){ + _impacted.insert( op.owner_account ); + } + void operator()( const son_update_operation& op ){ _impacted.insert( op.owner_account ); } void operator()( const son_delete_operation& op ){ diff --git a/libraries/app/include/graphene/app/database_api.hpp b/libraries/app/include/graphene/app/database_api.hpp index c6430243..7d239b20 100644 --- a/libraries/app/include/graphene/app/database_api.hpp +++ b/libraries/app/include/graphene/app/database_api.hpp @@ -556,7 +556,7 @@ class database_api * @param account The ID of the account whose son_member should be retrieved * @return The son_member object, or null if the account does not have a son_member */ - fc::optional get_son_member_by_account(account_id_type account)const; + fc::optional get_son_member_by_account(account_id_type account)const; /// WORKERS diff --git a/libraries/chain/db_notify.cpp b/libraries/chain/db_notify.cpp index de4f57b4..3709382c 100644 --- a/libraries/chain/db_notify.cpp +++ b/libraries/chain/db_notify.cpp @@ -272,6 +272,9 @@ struct get_impacted_account_visitor void operator()( const son_create_operation& op ) { _impacted.insert( op.owner_account ); } + void operator()( const son_update_operation& op ) { + _impacted.insert( op.owner_account ); + } void operator()( const son_delete_operation& op ) { _impacted.insert( op.owner_account ); } @@ -363,10 +366,10 @@ void get_relevant_accounts( const object* obj, flat_set& accoun } case balance_object_type:{ /** these are free from any accounts */ break; - } case son_member_object_type:{ - const auto& son_object = dynamic_cast(obj); - assert( son_object != nullptr ); - accounts.insert( son_object->son_member_account ); + } case son_object_type:{ + const auto& aobj = dynamic_cast(obj); + assert( aobj != nullptr ); + accounts.insert( aobj->son_member_account ); break; } } diff --git a/libraries/chain/include/graphene/chain/global_property_object.hpp b/libraries/chain/include/graphene/chain/global_property_object.hpp index 277f6cf5..771e912c 100644 --- a/libraries/chain/include/graphene/chain/global_property_object.hpp +++ b/libraries/chain/include/graphene/chain/global_property_object.hpp @@ -53,7 +53,7 @@ namespace graphene { namespace chain { flat_set active_witnesses; // updated once per maintenance interval // n.b. witness scheduling is done by witness_schedule object - flat_set active_son_members; // updated once per maintenance interval + flat_set active_son_members; // updated once per maintenance interval }; /** diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index 5259c0da..cd31a5d2 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -132,6 +132,7 @@ namespace graphene { namespace chain { affiliate_payout_operation, // VIRTUAL affiliate_referral_payout_operation, // VIRTUAL son_create_operation, + son_update_operation, son_delete_operation > operation; diff --git a/libraries/chain/include/graphene/chain/protocol/son.hpp b/libraries/chain/include/graphene/chain/protocol/son.hpp index eb355433..5d6bb18b 100644 --- a/libraries/chain/include/graphene/chain/protocol/son.hpp +++ b/libraries/chain/include/graphene/chain/protocol/son.hpp @@ -15,6 +15,19 @@ namespace graphene { namespace chain { share_type calculate_fee(const fee_parameters_type& k)const { return 0; } }; + struct son_update_operation : public base_operation + { + struct fee_parameters_type { uint64_t fee = 0; }; + + asset fee; + son_id_type son_id; + account_id_type owner_account; + std::string new_url; + + account_id_type fee_payer()const { return owner_account; } + share_type calculate_fee(const fee_parameters_type& k)const { return 0; } + }; + struct son_delete_operation : public base_operation { struct fee_parameters_type { uint64_t fee = 0; }; @@ -31,5 +44,8 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::son_create_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::son_create_operation, (fee)(owner_account)(url) ) +FC_REFLECT( graphene::chain::son_update_operation::fee_parameters_type, (fee) ) +FC_REFLECT( graphene::chain::son_update_operation, (fee)(son_id)(owner_account)(new_url) ) + FC_REFLECT( graphene::chain::son_delete_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::son_delete_operation, (fee)(owner_account) ) diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index cdac849b..326f69c7 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -145,7 +145,7 @@ namespace graphene { namespace chain { betting_market_group_object_type, betting_market_object_type, bet_object_type, - son_member_object_type, + son_object_type, OBJECT_TYPE_COUNT ///< Sentry value which contains the number of different object types }; @@ -203,7 +203,7 @@ namespace graphene { namespace chain { class betting_market_group_object; class betting_market_object; class bet_object; - class son_member_object; + class son_object; typedef object_id< protocol_ids, account_object_type, account_object> account_id_type; typedef object_id< protocol_ids, asset_object_type, asset_object> asset_id_type; @@ -230,7 +230,7 @@ namespace graphene { namespace chain { typedef object_id< protocol_ids, betting_market_group_object_type, betting_market_group_object> betting_market_group_id_type; typedef object_id< protocol_ids, betting_market_object_type, betting_market_object> betting_market_id_type; typedef object_id< protocol_ids, bet_object_type, bet_object> bet_id_type; - typedef object_id< protocol_ids, son_member_object_type, son_member_object> son_member_id_type; + typedef object_id< protocol_ids, son_object_type, son_object> son_id_type; // implementation types class global_property_object; @@ -405,7 +405,7 @@ FC_REFLECT_ENUM( graphene::chain::object_type, (betting_market_group_object_type) (betting_market_object_type) (bet_object_type) - (son_member_object_type) + (son_object_type) (OBJECT_TYPE_COUNT) ) FC_REFLECT_ENUM( graphene::chain::impl_object_type, @@ -473,6 +473,8 @@ FC_REFLECT_TYPENAME( graphene::chain::fba_accumulator_id_type ) FC_REFLECT_TYPENAME( graphene::chain::betting_market_position_id_type ) FC_REFLECT_TYPENAME( graphene::chain::global_betting_statistics_id_type ) FC_REFLECT_TYPENAME( graphene::chain::tournament_details_id_type ) +FC_REFLECT_TYPENAME( graphene::chain::son_id_type ) + FC_REFLECT( graphene::chain::void_t, ) diff --git a/libraries/chain/include/graphene/chain/son_evaluator.hpp b/libraries/chain/include/graphene/chain/son_evaluator.hpp index 43cfd0fb..bb6a1820 100644 --- a/libraries/chain/include/graphene/chain/son_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/son_evaluator.hpp @@ -13,6 +13,15 @@ public: object_id_type do_apply(const son_create_operation& o); }; +class update_son_evaluator : public evaluator +{ +public: + typedef son_update_operation operation_type; + + void_result do_evaluate(const son_update_operation& o); + object_id_type do_apply(const son_update_operation& o); +}; + class delete_son_evaluator : public evaluator { public: diff --git a/libraries/chain/include/graphene/chain/son_object.hpp b/libraries/chain/include/graphene/chain/son_object.hpp index 6b6d7bac..114b27cd 100644 --- a/libraries/chain/include/graphene/chain/son_object.hpp +++ b/libraries/chain/include/graphene/chain/son_object.hpp @@ -7,15 +7,15 @@ namespace graphene { namespace chain { using namespace graphene::db; /** - * @class son_member_object + * @class son_object * @brief tracks information about a son_member account. * @ingroup object */ - class son_member_object : public abstract_object + class son_object : public abstract_object { public: static const uint8_t space_id = protocol_ids; - static const uint8_t type_id = son_member_object_type; + static const uint8_t type_id = son_object_type; account_id_type son_member_account; vote_id_type vote_id; @@ -26,21 +26,21 @@ namespace graphene { namespace chain { struct by_account; struct by_vote_id; using son_member_multi_index_type = multi_index_container< - son_member_object, + son_object, indexed_by< ordered_unique< tag, member >, ordered_unique< tag, - member + member >, ordered_unique< tag, - member + member > > >; - using son_member_index = generic_index; + using son_member_index = generic_index; } } // graphene::chain -FC_REFLECT_DERIVED( graphene::chain::son_member_object, (graphene::db::object), +FC_REFLECT_DERIVED( graphene::chain::son_object, (graphene::db::object), (son_member_account)(vote_id)(total_votes)(url) ) diff --git a/libraries/chain/son_evaluator.cpp b/libraries/chain/son_evaluator.cpp index a5551a64..b12363d9 100644 --- a/libraries/chain/son_evaluator.cpp +++ b/libraries/chain/son_evaluator.cpp @@ -18,7 +18,7 @@ object_id_type create_son_evaluator::do_apply(const son_create_operation& op) vote_id = get_next_vote_id(p, vote_id_type::son); }); - const auto& new_son_object = db().create( [&]( son_member_object& obj ){ + const auto& new_son_object = db().create( [&]( son_object& obj ){ obj.son_member_account = op.owner_account; obj.vote_id = vote_id; obj.url = op.url; @@ -26,6 +26,19 @@ object_id_type create_son_evaluator::do_apply(const son_create_operation& op) return new_son_object.id; } FC_CAPTURE_AND_RETHROW( (op) ) } +void_result update_son_evaluator::do_evaluate(const son_update_operation& op) +{ try{ + + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + +object_id_type update_son_evaluator::do_apply(const son_update_operation& op) +{ try { + + + return son_id_type(0); +} FC_CAPTURE_AND_RETHROW( (op) ) } + void_result delete_son_evaluator::do_evaluate(const son_delete_operation& op) { try { database& d = db(); diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 3c0629db..630add0f 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -2031,7 +2031,7 @@ public: { try { account_object voting_account_object = get_account(voting_account); account_id_type son_member_owner_account_id = get_account_id(son_member); - fc::optional son_member_obj = _remote_db->get_son_member_by_account(son_member_owner_account_id); + fc::optional son_member_obj = _remote_db->get_son_member_by_account(son_member_owner_account_id); if (!son_member_obj) FC_THROW("Account ${son_member} is not registered as a son_member", ("son_member", son_member)); if (approve) diff --git a/programs/js_operation_serializer/main.cpp b/programs/js_operation_serializer/main.cpp index 8994b36b..a921c0c3 100644 --- a/programs/js_operation_serializer/main.cpp +++ b/programs/js_operation_serializer/main.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include