Scorum
betting_resolver.cpp
Go to the documentation of this file.
2 
5 
10 
11 namespace scorum {
12 namespace chain {
15  dba::db_accessor<matched_bet_object>& matched_bet_dba,
18  : _account_svc(account_svc)
19  , _virt_op_emitter(virt_op_emitter)
20  , _matched_bet_dba(matched_bet_dba)
21  , _game_dba(game_dba)
22  , _dprop_dba(dprop_dba)
23 {
24 }
25 
26 void update(fc::flat_map<uuid_type, bet_resolved_operation>& results,
27  const bet_data& bet,
28  asset income,
29  uuid_type game_uuid,
30  bet_resolve_kind kind)
31 {
32  if (results.count(bet.uuid) == 0)
33  {
34  results.insert(std::make_pair(bet.uuid, bet_resolved_operation(game_uuid, bet.better, bet.uuid, income, kind)));
35  }
36  else
37  {
38  results[bet.uuid].income += income;
39  }
40 }
41 
43 {
44  explicit resolver_results(uuid_type game_uuid)
45  : _game_uuid(game_uuid)
46  {
47  }
48 
49  void post(const bet_data& bet, asset income, bet_resolve_kind kind)
50  {
51  if (_results.count(bet.uuid) == 0)
52  {
53  _results.insert(
54  std::make_pair(bet.uuid, bet_resolved_operation(_game_uuid, bet.better, bet.uuid, income, kind)));
55  }
56  else
57  {
58  _results[bet.uuid].income += income;
59  }
60  }
61 
63  account_service_i& _account_svc,
65  {
66  for (auto& bet : _results)
67  {
68  _emitter.push_virtual_operation(bet.second);
69 
70  _account_svc.increase_balance(bet.second.better, bet.second.income);
71 
72  _dprop_dba.update([&](dynamic_global_property_object& o) { //
73  o.betting_stats.matched_bets_volume -= bet.second.income;
74  });
75  }
76  }
77 
78 private:
79  uuid_type _game_uuid;
80 
81  fc::flat_map<uuid_type, bet_resolved_operation> _results;
82 };
83 
84 void betting_resolver::resolve_matched_bets(uuid_type game_uuid, const fc::flat_set<wincase_type>& results) const
85 {
86  auto matched_bets = _matched_bet_dba.get_range_by<by_game_uuid_market>(game_uuid);
87 
88  resolver_results resolver(game_uuid);
89 
90  for (const matched_bet_object& bet : matched_bets)
91  {
92  auto fst_won = results.find(bet.bet1_data.wincase) != results.end();
93  auto snd_won = results.find(bet.bet2_data.wincase) != results.end();
94 
95  auto income = bet.bet1_data.stake + bet.bet2_data.stake;
96 
97  if (fst_won)
98  {
99  resolver.post(bet.bet1_data, income, bet_resolve_kind::win);
100  }
101  else if (snd_won)
102  {
103  resolver.post(bet.bet2_data, income, bet_resolve_kind::win);
104  }
105  else
106  {
107  resolver.post(bet.bet1_data, bet.bet1_data.stake, bet_resolve_kind::draw);
108  resolver.post(bet.bet2_data, bet.bet2_data.stake, bet_resolve_kind::draw);
109  }
110  }
111 
112  resolver.apply(_virt_op_emitter, _account_svc, _dprop_dba);
113  _matched_bet_dba.remove_all(matched_bets);
114 }
115 }
116 }
void resolve_matched_bets(uuid_type game_uuid, const fc::flat_set< protocol::wincase_type > &results) const override
betting_resolver(account_service_i &, database_virtual_operations_emmiter_i &, dba::db_accessor< matched_bet_object > &, dba::db_accessor< game_object > &, dba::db_accessor< dynamic_global_property_object > &)
const object_type & update(modifier_type modifier)
betting_total_stats betting_stats
this section display information about betting totals
void update(fc::flat_map< uuid_type, bet_resolved_operation > &results, const bet_data &bet, asset income, uuid_type game_uuid, bet_resolve_kind kind)
Definition: asset.cpp:15
boost::uuids::uuid uuid_type
Definition: types.hpp:53
virtual void increase_balance(const account_object &account, const asset &amount)=0
account_name_type better
Definition: bet_objects.hpp:29
virtual void push_virtual_operation(const operation &op)=0
resolver_results(uuid_type game_uuid)
void apply(database_virtual_operations_emmiter_i &_emitter, account_service_i &_account_svc, dba::db_accessor< dynamic_global_property_object > &_dprop_dba)
void post(const bet_data &bet, asset income, bet_resolve_kind kind)