Implemented item 1

This commit is contained in:
Peter Conrad 2018-03-22 19:01:56 +01:00 committed by Fabian Schuh
parent 10fa56a018
commit fe7c8d6ad1
No known key found for this signature in database
GPG key ID: F2538A4B282D6238
7 changed files with 61 additions and 2 deletions

View file

@ -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 )

View file

@ -0,0 +1,4 @@
// Placeholder HF for affiliate reward system
#ifndef HARDFORK_999_TIME
#define HARDFORK_999_TIME (fc::time_point_sec( 1600000000 ))
#endif

View file

@ -227,6 +227,8 @@ namespace graphene { namespace chain {
*/
optional< flat_set<asset_id_type> > 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,

View file

@ -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)

View file

@ -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<account_id_type,uint16_t> _dist;
void validate()const;
};
struct affiliate_reward_distributions
{
fc::flat_map<app_tag,affiliate_reward_distribution> _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)

View file

@ -25,8 +25,10 @@
#include <graphene/chain/proposal_evaluator.hpp>
#include <graphene/chain/proposal_object.hpp>
#include <graphene/chain/account_object.hpp>
#include <graphene/chain/protocol/account.hpp>
#include <graphene/chain/protocol/fee_schedule.hpp>
#include <graphene/chain/exceptions.hpp>
#include <graphene/chain/hardfork.hpp>
#include <fc/smart_ref_impl.hpp>
@ -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)

View file

@ -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();
}