25 : _account_registration_bonus_service(services.account_registration_bonus_service())
26 , _dprops_service(services.dynamic_global_property_service())
37 asset per_reg = calculate_amount_by_schedule(pool);
38 FC_ASSERT(per_reg.
amount > 0,
"Invalid schedule. Zero bonus return.");
41 per_reg = take_actually_amount(pool, per_reg);
43 FC_ASSERT(per_reg.
amount > 0,
"Nothing to allocate.");
62 FC_ASSERT(bonus.
amount > 0,
"No bonus to register.");
64 _account_registration_bonus_service.
create([&](account_registration_bonus_object& a) {
65 a.account = new_account;
67 a.expires = _dprops_service.
head_block_time() + SCORUM_EXPIRATON_FOR_REGISTRATION_BONUS.to_seconds();
82 uint64_t item_users_limit = (*it).users;
84 if (allocated_rest >= item_users_limit)
86 allocated_rest -= item_users_limit;
101 using schedule_item_type = registration_pool_object::schedule_item;
102 const schedule_item_type& current_item = (*it);
103 return (pool.
maximum_bonus * scorum::utils::make_fraction(current_item.bonus_percent, 100));
106 asset take_actually_amount(
const registration_pool_object& pool,
const asset& balance)
108 FC_ASSERT(balance.amount > 0,
"Invalid balance.");
112 if (pool.balance.amount > 0 && balance <= pool.balance)
124 void check_bandwidth(
const registration_pool_object& pool,
126 uint32_t pass_blocks,
127 const asset& allocated_cash)
131 FC_ASSERT(allocated_cash <= (pool.maximum_bonus
132 * scorum::utils::make_fraction(
134 "Committee member '${1}' reaches cash limit.", (
"1", member_name));
137 void validate_bandwidth(
const registration_pool_object& pool,
139 const registration_committee_member_object& member,
142 const dynamic_global_property_object& dprops = _dprops_service.
get();
145 uint32_t last_allocated_block = member.last_allocated_block;
146 FC_ASSERT(last_allocated_block <= head_block_num);
148 uint32_t pass_blocks = 0;
149 if (last_allocated_block > 0)
151 pass_blocks = head_block_num - last_allocated_block;
154 last_allocated_block = head_block_num;
157 uint32_t per_n_block_remain = member.per_n_block_remain;
158 if (pass_blocks > per_n_block_remain)
160 per_n_block_remain = 0;
162 else if (pass_blocks > 0)
164 per_n_block_remain -= pass_blocks;
168 asset allocated_cash = member.already_allocated_cash;
169 if (per_n_block_remain > 0)
171 allocated_cash += amount;
172 already_allocated_cash = allocated_cash;
177 already_allocated_cash = amount;
181 check_bandwidth(pool, member_name, pass_blocks, allocated_cash);
183 auto modifier = [=](registration_committee_member_object& m) {
184 m.last_allocated_block = last_allocated_block;
185 m.per_n_block_remain = per_n_block_remain;
186 m.already_allocated_cash = already_allocated_cash;
192 account_registration_bonus_service_i& _account_registration_bonus_service;
193 dynamic_global_property_service_i& _dprops_service;
206 , _hardfork_svc(services.hardfork_property_service())
216 _impl->_account_service.check_account_existence(o.
creator);
224 FC_ASSERT(_impl->_registration_committee_service.is_exists(o.
creator),
"Account '${1}' is not committee member.",
236 FC_ASSERT(_impl->_registration_pool_service.is_exists(),
"Registration pool is not initialized.");
238 FC_ASSERT(_impl->_registration_pool_service.get().balance.amount > 0,
"Registration pool is exhausted.");
251 data_service_factory_i& services,
const account_object& beneficiary)
252 : _services(services)
253 , _beneficiary(beneficiary)
uint32_t head_block_number
Current head block number.
data_service_factory_i & services() const
give_bonus_from_registration_pool_task_context(data_service_factory_i &services, const account_object &beneficiary)
const account_object & beneficiary() const
void on_apply(give_bonus_from_registration_pool_task_context &ctx)
registration_pool_evaluator_impl(data_service_factory_i &services)
account_service_i & _account_service
registration_pool_service_i & _registration_pool_service
registration_committee_service_i & _registration_committee_service
asset allocate_cash(const account_name_type &committee_member=account_name_type())
void register_account_bonus(const account_name_type &new_account, const asset &bonus)
void do_apply(const operation_type &op)
registration_pool_evaluator(data_service_factory_i &services)
virtual ~registration_pool_evaluator()
fc::shared_vector< schedule_item > schedule_items
uint64_t already_allocated_count
#define SCORUM_REGISTRATION_BONUS_LIMIT_PER_MEMBER_N_BLOCK
#define SCORUM_REGISTRATION_BONUS_LIMIT_PER_MEMBER_PER_N_BLOCK
fc::safe< share_value_type > share_type
fc::fixed_string_16 account_name_type
virtual const asset create_scorumpower(const account_object &to_account, const asset &scorum)=0
virtual void check_account_existence(const account_name_type &, const optional< const char * > &context_type_name=optional< const char * >()) const =0
virtual const object_type & get() const =0
virtual const object_type & create(const modifier_type &modifier)=0
virtual fc::time_point_sec head_block_time() const =0
virtual bool has_hardfork(uint32_t hardfork) const =0
virtual const registration_committee_member_object & get_member(const account_name_type &) const =0
virtual void update_member_info(const registration_committee_member_object &, const member_info_modifier_type &modifier)=0
virtual void decrease_balance(const asset &amount)=0
virtual void increase_already_allocated_count()=0
Creates new account by registration committee.
account_name_type new_account_name
std::string json_metadata
account_name_type creator
account_authority_map account_auths