diff --git a/libraries/chain/account_evaluator.cpp b/libraries/chain/account_evaluator.cpp index d26b621c..bcbaa06f 100644 --- a/libraries/chain/account_evaluator.cpp +++ b/libraries/chain/account_evaluator.cpp @@ -20,10 +20,13 @@ */ #include + +#include #include #include +#include #include -#include + #include namespace graphene { namespace chain { @@ -95,6 +98,26 @@ void_result account_create_evaluator::do_evaluate( const account_create_operatio object_id_type account_create_evaluator::do_apply( const account_create_operation& o ) { try { + + uint16_t referrer_percent = o.referrer_percent; + bool has_small_percent = ( + (db().head_block_time() <= HARDFORK_453_TIME) + && (o.referrer != o.registrar ) + && (o.referrer_percent != 0 ) + && (o.referrer_percent <= 0x100) + ); + + if( has_small_percent ) + { + if( referrer_percent >= 100 ) + { + wlog( "between 100% and 0x100%: ${o}", ("o", o) ); + } + referrer_percent = referrer_percent*100; + if( referrer_percent > GRAPHENE_100_PERCENT ) + referrer_percent = GRAPHENE_100_PERCENT; + } + const auto& new_acnt_object = db().create( [&]( account_object& obj ){ obj.registrar = o.registrar; obj.referrer = o.referrer; @@ -103,7 +126,7 @@ object_id_type account_create_evaluator::do_apply( const account_create_operatio auto& params = db().get_global_properties().parameters; obj.network_fee_percentage = params.network_percent_of_fee; obj.lifetime_referrer_fee_percentage = params.lifetime_referrer_percent_of_fee; - obj.referrer_rewards_percentage = o.referrer_percent; + obj.referrer_rewards_percentage = referrer_percent; obj.name = o.name; obj.owner = o.owner; @@ -112,6 +135,15 @@ object_id_type account_create_evaluator::do_apply( const account_create_operatio obj.statistics = db().create([&](account_statistics_object& s){s.owner = obj.id;}).id; }); + if( has_small_percent ) + { + wlog( "Account affected by #453 registered in block ${n}: ${na} reg=${reg} ref=${ref}:${refp} ltr=${ltr}:${ltrp}", + ("n", db().head_block_num()) ("na", new_acnt_object.id) + ("reg", o.registrar) ("ref", o.referrer) ("ltr", new_acnt_object.lifetime_referrer) + ("refp", new_acnt_object.referrer_rewards_percentage) ("ltrp", new_acnt_object.lifetime_referrer_fee_percentage) ); + wlog( "Affected account object is ${o}", ("o", new_acnt_object) ); + } + const auto& dynamic_properties = db().get_dynamic_global_properties(); db().modify(dynamic_properties, [](dynamic_global_property_object& p) { ++p.accounts_registered_this_interval; diff --git a/libraries/chain/include/graphene/chain/hardfork.hpp b/libraries/chain/include/graphene/chain/hardfork.hpp index 1eb263f6..04144216 100644 --- a/libraries/chain/include/graphene/chain/hardfork.hpp +++ b/libraries/chain/include/graphene/chain/hardfork.hpp @@ -32,3 +32,7 @@ // #445 Refund create order fees on cancel // 2015-12-02 17:00:00 UTC / 12:00:00 EST #define HARDFORK_445_TIME (fc::time_point_sec( 1449075600 )) + +// #453 Hardfork to retroactively correct referral percentages +// 2015-12-02 17:00:00 UTC / 12:00:00 EST +#define HARDFORK_453_TIME (fc::time_point_sec( 1449075600 ))