From fe7c8d6ad14e86b5106a97d4faaa3e97656c0b3e Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 22 Mar 2018 19:01:56 +0100 Subject: [PATCH] Implemented item 1 --- libraries/chain/account_evaluator.cpp | 3 +++ libraries/chain/hardfork.d/999.hf | 4 ++++ .../include/graphene/chain/account_object.hpp | 4 +++- .../chain/include/graphene/chain/config.hpp | 2 +- .../graphene/chain/protocol/account.hpp | 20 ++++++++++++++++ libraries/chain/proposal_evaluator.cpp | 7 ++++++ libraries/chain/protocol/account.cpp | 23 +++++++++++++++++++ 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 libraries/chain/hardfork.d/999.hf diff --git a/libraries/chain/account_evaluator.cpp b/libraries/chain/account_evaluator.cpp index 51205ae5..a08e9031 100644 --- a/libraries/chain/account_evaluator.cpp +++ b/libraries/chain/account_evaluator.cpp @@ -108,6 +108,8 @@ void_result account_create_evaluator::do_evaluate( const account_create_operatio FC_ASSERT( !op.extensions.value.active_special_authority.valid() ); FC_ASSERT( !op.extensions.value.buyback_options.valid() ); } + if( d.head_block_time() < HARDFORK_999_TIME ) + FC_ASSERT( !op.extensions.value.affiliate_distributions.valid(), "Affiliate reward distributions not allowed yet" ); FC_ASSERT( fee_paying_account->is_lifetime_member(), "Only Lifetime members may register an account." ); FC_ASSERT( op.referrer(d).is_member(d.head_block_time()), "The referrer must be either a lifetime or annual subscriber." ); @@ -186,6 +188,7 @@ object_id_type account_create_evaluator::do_apply( const account_create_operatio obj.allowed_assets = o.extensions.value.buyback_options->markets; obj.allowed_assets->emplace( o.extensions.value.buyback_options->asset_to_buy ); } + obj.affiliate_distributions = o.extensions.value.affiliate_distributions; }); if( has_small_percent ) diff --git a/libraries/chain/hardfork.d/999.hf b/libraries/chain/hardfork.d/999.hf new file mode 100644 index 00000000..55b99fc1 --- /dev/null +++ b/libraries/chain/hardfork.d/999.hf @@ -0,0 +1,4 @@ +// Placeholder HF for affiliate reward system +#ifndef HARDFORK_999_TIME +#define HARDFORK_999_TIME (fc::time_point_sec( 1600000000 )) +#endif diff --git a/libraries/chain/include/graphene/chain/account_object.hpp b/libraries/chain/include/graphene/chain/account_object.hpp index 333168a8..51ba6748 100644 --- a/libraries/chain/include/graphene/chain/account_object.hpp +++ b/libraries/chain/include/graphene/chain/account_object.hpp @@ -227,6 +227,8 @@ namespace graphene { namespace chain { */ optional< flat_set > allowed_assets; + optional< affiliate_reward_distributions > affiliate_distributions; + bool has_special_authority()const { return (owner_special_authority.which() != special_authority::tag< no_special_authority >::value) @@ -446,7 +448,7 @@ FC_REFLECT_DERIVED( graphene::chain::account_object, (cashback_vb) (owner_special_authority)(active_special_authority) (top_n_control_flags) - (allowed_assets) + (allowed_assets)(affiliate_distributions) ) FC_REFLECT_DERIVED( graphene::chain::account_balance_object, diff --git a/libraries/chain/include/graphene/chain/config.hpp b/libraries/chain/include/graphene/chain/config.hpp index 5df38771..c8d7966f 100644 --- a/libraries/chain/include/graphene/chain/config.hpp +++ b/libraries/chain/include/graphene/chain/config.hpp @@ -151,7 +151,7 @@ #define GRAPHENE_RECENTLY_MISSED_COUNT_INCREMENT 4 #define GRAPHENE_RECENTLY_MISSED_COUNT_DECREMENT 3 -#define GRAPHENE_CURRENT_DB_VERSION "PPY1.11" +#define GRAPHENE_CURRENT_DB_VERSION "PPY_999" #define GRAPHENE_IRREVERSIBLE_THRESHOLD (70 * GRAPHENE_1_PERCENT) diff --git a/libraries/chain/include/graphene/chain/protocol/account.hpp b/libraries/chain/include/graphene/chain/protocol/account.hpp index 93dbb115..6d13a4d3 100644 --- a/libraries/chain/include/graphene/chain/protocol/account.hpp +++ b/libraries/chain/include/graphene/chain/protocol/account.hpp @@ -60,6 +60,21 @@ namespace graphene { namespace chain { void validate()const; }; + enum app_tag { + bookie = 0, + rps = 1 + }; + struct affiliate_reward_distribution + { + fc::flat_map _dist; + void validate()const; + }; + struct affiliate_reward_distributions + { + fc::flat_map _dists; + void validate()const; + }; + /** * @ingroup operations */ @@ -71,6 +86,7 @@ namespace graphene { namespace chain { optional< special_authority > owner_special_authority; optional< special_authority > active_special_authority; optional< buyback_account_options > buyback_options; + optional< affiliate_reward_distributions > affiliate_distributions; }; struct fee_parameters_type @@ -268,6 +284,10 @@ FC_REFLECT(graphene::chain::account_options, (memo_key)(voting_account)(num_witn FC_REFLECT_ENUM( graphene::chain::account_whitelist_operation::account_listing, (no_listing)(white_listed)(black_listed)(white_and_black_listed)) +FC_REFLECT_ENUM( graphene::chain::app_tag, (bookie)(rps) ) +FC_REFLECT( graphene::chain::affiliate_reward_distribution, (_dist) ); +FC_REFLECT( graphene::chain::affiliate_reward_distributions, (_dists) ); + FC_REFLECT(graphene::chain::account_create_operation::ext, (null_ext)(owner_special_authority)(active_special_authority)(buyback_options) ) FC_REFLECT( graphene::chain::account_create_operation, (fee)(registrar) diff --git a/libraries/chain/proposal_evaluator.cpp b/libraries/chain/proposal_evaluator.cpp index 2eada590..f3d057fb 100644 --- a/libraries/chain/proposal_evaluator.cpp +++ b/libraries/chain/proposal_evaluator.cpp @@ -25,8 +25,10 @@ #include #include #include +#include #include #include +#include #include @@ -120,6 +122,11 @@ struct proposal_operation_hardfork_visitor FC_ASSERT( block_time >= HARDFORK_1000_TIME, "event_update_status_operation not allowed yet!" ); } + void operator()(const graphene::chain::account_create_operation &aco) const { + if (block_time < HARDFORK_999_TIME) + FC_ASSERT( !aco.extensions.value.affiliate_distributions.valid(), "Affiliate reward distributions not allowed yet" ); + } + // loop and self visit in proposals void operator()(const proposal_create_operation &v) const { for (const op_wrapper &op : v.proposed_ops) diff --git a/libraries/chain/protocol/account.cpp b/libraries/chain/protocol/account.cpp index 3aed8fb3..cf592d5c 100644 --- a/libraries/chain/protocol/account.cpp +++ b/libraries/chain/protocol/account.cpp @@ -182,6 +182,27 @@ void account_options::validate() const "May not specify fewer witnesses or committee members than the number voted for."); } +void affiliate_reward_distribution::validate() const +{ + // sum of weights must equal 100% + uint32_t sum = 0; + for( const auto& share : _dist ) + { + FC_ASSERT( share.second > 0, "Must leave out affilates who receive 0%!" ); + FC_ASSERT( share.second <= GRAPHENE_100_PERCENT, "Can't pay out more than 100% per affiliate!" ); + sum += share.second; + FC_ASSERT( sum <= GRAPHENE_100_PERCENT, "Can't pay out more than 100% total!" ); + } + FC_ASSERT( sum == GRAPHENE_100_PERCENT, "Total affiliate distributions must cover 100%!" ); +} + +void affiliate_reward_distributions::validate() const +{ + FC_ASSERT( !_dists.empty(), "Empty affiliate reward distributions not allowed!" ); + for( const auto& dist: _dists ) + dist.second.validate(); +} + share_type account_create_operation::calculate_fee( const fee_parameters_type& k )const { auto core_fee_required = k.basic_fee; @@ -226,6 +247,8 @@ void account_create_operation::validate()const FC_ASSERT( m != extensions.value.buyback_options->asset_to_buy ); } } + if( extensions.value.affiliate_distributions.valid() ) + extensions.value.affiliate_distributions->validate(); }