Scorum
delegate_sp_from_reg_pool_evaluator.cpp
Go to the documentation of this file.
2 
5 
8 
9 #include <fc/exception/exception.hpp>
10 
11 namespace scorum {
12 namespace chain {
14  data_service_factory_i& svc_factory,
15  account_service_i& account_svc,
18  dba::db_accessor<reg_pool_sp_delegation_object>& reg_pool_delegation_dba)
19  : evaluator_impl<data_service_factory_i, delegate_sp_from_reg_pool_evaluator>(svc_factory)
20  , _account_svc(account_svc)
21  , _reg_pool_dba(reg_pool_dba)
22  , _reg_committee_dba(reg_committee_dba)
23  , _reg_pool_delegation_dba(reg_pool_delegation_dba)
24 {
25 }
26 
28 {
30  _account_svc.check_account_existence(op.delegatee);
31 
32  FC_ASSERT(_reg_committee_dba.is_exists_by<by_account_name>(op.reg_committee_member),
33  "Account '${1}' is not committee member.", ("1", op.reg_committee_member));
34 
35  auto is_delegation_exists = _reg_pool_delegation_dba.is_exists_by<by_delegatee>(op.delegatee);
36  if (!is_delegation_exists)
37  {
38  FC_ASSERT(op.scorumpower.amount > 0, "Account has no delegated SP from registration pool");
39  FC_ASSERT(_reg_pool_dba.get().balance.amount >= op.scorumpower.amount, "Registration pool is exhausted.");
40 
42  _reg_pool_dba.update([&](registration_pool_object& pool) {
43  pool.balance -= op.scorumpower.amount;
44  pool.delegated += op.scorumpower.amount;
45  });
46 
47  _reg_pool_delegation_dba.create([&](reg_pool_sp_delegation_object& o) {
48  o.delegatee = op.delegatee;
49  o.sp = op.scorumpower;
50  });
51  }
52  else
53  {
54  const auto& delegation = _reg_pool_delegation_dba.get_by<by_delegatee>(op.delegatee);
55  auto extra_sp = op.scorumpower - delegation.sp;
56 
57  FC_ASSERT(_reg_pool_dba.get().balance.amount >= extra_sp.amount, "Registration pool is exhausted.");
58 
59  _account_svc.increase_received_scorumpower(op.delegatee, extra_sp);
60  _reg_pool_dba.update([&](registration_pool_object& pool) {
61  pool.balance -= extra_sp.amount;
62  pool.delegated += extra_sp.amount;
63  });
64 
65  if (op.scorumpower.amount > 0)
66  _reg_pool_delegation_dba.update(delegation, [&](reg_pool_sp_delegation_object& o) { o.sp += extra_sp; });
67  else
68  _reg_pool_delegation_dba.remove(delegation);
69  }
70 }
71 }
72 }
const object_type & create(modifier_type modifier)
const object_type & get_by(const Key &arg) const
bool is_exists_by(const Key &arg) const
const object_type & update(modifier_type modifier)
delegate_sp_from_reg_pool_evaluator(data_service_factory_i &, account_service_i &, dba::db_accessor< registration_pool_object > &, dba::db_accessor< registration_committee_member_object > &, dba::db_accessor< reg_pool_sp_delegation_object > &)
void do_apply(const protocol::delegate_sp_from_reg_pool_operation &op)
Definition: asset.cpp:15
virtual void check_account_existence(const account_name_type &, const optional< const char * > &context_type_name=optional< const char * >()) const =0
virtual void increase_received_scorumpower(account_name_type account_name, const asset &amount)=0
share_type amount
Definition: asset.hpp:31