Scorum
process_witness_reward_in_sp_migration.cpp
Go to the documentation of this file.
2 
7 
9 
10 namespace scorum {
11 namespace chain {
12 namespace database_ns {
13 
20 
22 {
23  debug_log(ctx.get_block_info(), "process_witness_reward_in_sp_migration BEGIN");
24 
25  dynamic_global_property_service_i& dprops_service = ctx.services().dynamic_global_property_service();
26 
27  if (dprops_service.head_block_time() < SCORUM_WITNESS_REWARD_MIGRATION_DATE)
28  {
29  return;
30  }
31 
32  witness_reward_in_sp_migration_service_i& witness_reward_in_sp_migration_service
33  = ctx.services().witness_reward_in_sp_migration_service();
34 
35  if (!witness_reward_in_sp_migration_service.is_exists())
36  {
37  return;
38  }
39 
40  blocks_story_service_i& blocks_story_service = ctx.services().blocks_story_service();
41 
42  using recipients_type = std::map<account_name_type, share_type>;
43  uint32_t block_num = dprops_service.get().head_block_number;
44  share_type total_payment = witness_reward_in_sp_migration_service.get().balance;
45  recipients_type witnesses;
46  while (block_num > old_reward_alg_switch_reward_block_num && total_payment > share_type())
47  {
48  optional<signed_block> b = blocks_story_service.fetch_block_by_number(block_num--);
49  if (b.valid())
50  {
51  signed_block block = *b;
52 
53  share_type payment = std::min(migrate_deferred_payment, total_payment);
54  total_payment -= payment;
55 
56  witnesses[block.witness] += payment;
57  }
58  }
59 
61  {
62  wlog("Migration rest is not enough. ${n} blocks left",
63  ("n", block_num - old_reward_alg_switch_reward_block_num));
64  }
65  if (total_payment > 0)
66  {
67  wlog("Migration rest is too large. Left ${r}", ("r", asset(total_payment, SP_SYMBOL)));
68  }
69 
70  for (const auto& witness_reward : witnesses)
71  {
72  charge_witness_reward(ctx, witness_reward.first, witness_reward.second);
73  }
74 
75  witness_reward_in_sp_migration_service.update(
76  [=](witness_reward_in_sp_migration_object& obj) { obj.balance = total_payment; });
77 
78  if (total_payment == share_type())
79  {
80  witness_reward_in_sp_migration_service.remove();
81  }
82 
83  debug_log(ctx.get_block_info(), "process_witness_reward_in_sp_migration END");
84 }
85 
87 {
88  dynamic_global_property_service_i& dprops_service = ctx.services().dynamic_global_property_service();
89 
90  if (dprops_service.head_block_time() > SCORUM_WITNESS_REWARD_MIGRATION_DATE)
91  {
92  return;
93  }
94 
95  if (witness_reward.symbol() == SP_SYMBOL)
96  {
97  dynamic_global_property_service_i& dgp_service = ctx.services().dynamic_global_property_service();
98 
100  && witness_reward.amount == new_reward_to_migrate)
101  {
102  witness_reward_in_sp_migration_service_i& witness_reward_in_sp_migration_service
103  = ctx.services().witness_reward_in_sp_migration_service();
104 
105  witness_reward.amount -= migrate_deferred_payment;
106 
107  witness_reward_in_sp_migration_service.update(
109  }
110  }
111 }
112 
113 void process_witness_reward_in_sp_migration::charge_witness_reward(block_task_context& ctx,
114  const account_name_type& witness,
115  const share_type& reward)
116 {
117  data_service_factory_i& services = ctx.services();
118  account_service_i& account_service = services.account_service();
119 
120  const auto& account = account_service.get_account(witness);
121 
122  account_service.create_scorumpower(account, asset(reward, SCORUM_SYMBOL));
123 
124  if (reward.value != 0)
126 }
127 }
128 }
129 }
data_service_factory_i & services() const
Definition: block_tasks.hpp:25
virtual void push_virtual_operation(const operation &op)
Definition: block_tasks.cpp:22
#define SP_SYMBOL
Definition: config.hpp:104
#define SCORUM_SYMBOL
Definition: config.hpp:102
#define debug_log(CTX, FORMAT,...)
Definition: debug_log.hpp:3
fc::safe< share_value_type > share_type
Definition: types.hpp:73
fc::fixed_string_16 account_name_type
Definition: types.hpp:62
Definition: asset.cpp:15
virtual const asset create_scorumpower(const account_object &to_account, const asset &scorum)=0
virtual const account_object & get_account(const account_name_type &) const =0
virtual bool is_exists() const =0
virtual void update(const modifier_type &modifier)=0
virtual const object_type & get() const =0
virtual optional< signed_block > fetch_block_by_number(uint32_t num) const =0
virtual fc::time_point_sec head_block_time() const =0
asset_symbol_type symbol() const
Definition: asset.hpp:32
share_type amount
Definition: asset.hpp:31