13 static const std::string matching_fix = R
"([
15 "84911b2d-91d9-4375-80c3-8ccbc078e992",
17 "87e01c87-facd-4c68-93da-4e2dd4e1f546",
18 "26e1f127-5d27-4c40-b551-f36e8e2a1ad2",
19 "be0a2d8c-c525-42a2-a537-a7eab03aa319"
23 "c2dd413d-59a5-4bc8-b9f8-4efefb848cc7",
25 "c4193c3e-3ad9-4aa9-a2d5-df2637b23d32",
26 "2da620fc-40bf-41b3-950b-89d509adf7cf"
30 "8256c36f-7399-4c01-967a-888f3730ec02",
32 "d0934027-e040-4f25-9202-c3e45b00bdd2"
36 "b4d3a62a-3ed2-48ee-8880-b23e6af9954b",
38 "bddff0ce-2e45-4f75-a9a6-dfbca27acd61"
42 "f45e1c57-64f4-4d18-a6f4-898df5a06b74",
44 "d26688cc-4d7b-49fa-801a-b6a3173ab0d3"
48 "11d1cd20-5809-481a-b07e-2017ecc5e5f8",
50 "d26688cc-4d7b-49fa-801a-b6a3173ab0d3"
54 "ba75d8ec-f800-414d-a9e1-8d90a6f443b7",
56 "d458ba6c-61b4-4cca-889d-8f10398bf232",
57 "d26688cc-4d7b-49fa-801a-b6a3173ab0d3"
61 "bcda6311-9b6f-43ab-b834-ff04d90f31ea",
63 "10dc5d25-d690-4429-971f-8a7c1d0eec8f"
67 "7fc9e455-dd36-46b9-8534-8b230fa5c8b9",
69 "10dc5d25-d690-4429-971f-8a7c1d0eec8f"
73 "de35cb6b-fa81-4f4a-a0ae-86566162b744",
75 "ffb58868-1a17-471d-bf2c-e22c56111480",
76 "605312d9-3c72-4552-8134-8e25974cbccd"
80 "d522f55f-db34-4be9-920d-4b82b8b7c635",
82 "10121a46-8178-478b-a80d-e265dc183560",
83 "54cc0f28-0bc1-429b-ac98-3c543b64e3cd"
87 "a1a1f581-c614-440f-a599-b6f0cc3f997d",
89 "cd6ea2db-6a39-449f-9d1d-ab994cdc491d",
90 "3eedea83-ccef-4797-8519-18bbd9c893fd"
94 "29fba9fc-edf7-4a3e-ba97-4429196e7e6c",
96 "c549c186-b3b2-4280-9e4b-4d5d029830ac",
97 "f1990e32-0bfa-46c9-9bb6-ef14c3ce6bf3"
101 "dcfe2858-9599-4606-840b-25219d87816d",
103 "491f5618-14eb-4d61-91e6-090b247e0be0",
104 "e15738c5-036c-4376-881d-6f35ce8fee50"
108 "a58fc953-7e7e-4d54-a0c1-a2a21f7d2f96",
110 "8a938b00-819a-45b9-a3e3-913f5b12b42c",
111 "299396a3-6f29-4cb5-b13f-09ad4bbce295"
115 "8765a564-daaf-4971-b265-f43e6188b7aa",
117 "24494b24-407d-4c40-a742-9d2fadab55a5",
118 "9bbc2474-bbf1-4a3a-93e2-28e484d6899e"
122 "72437504-9062-4730-974b-1ebcc66fd4e3",
124 "b660383c-9fd3-4f03-a1ac-c80ebb6e0826",
125 "d6a616f5-803b-4c4a-8fb4-27873f95a2c2"
129 "5aed38ca-8a81-40de-890e-863cf27c0aee",
131 "c55e1f47-1e6d-44ec-9b37-12df4f6605ea",
132 "2d88eb1c-bf49-482f-a3fa-11d324b24c27"
136 "a34d64cd-6a7f-4447-89d3-46dd8b60f012",
138 "76031c54-0856-4af5-8680-169ef19c4845",
139 "e381cdff-7e4f-4aaf-b2a7-606b5eac2718"
143 "c7540a6f-4dd9-4d1c-8693-e009116c55e7",
145 "0460535a-7284-4dee-802b-1e3e634ee688"
149 "ef23721e-1134-4d07-be02-1cd3b6880f83",
151 "0460535a-7284-4dee-802b-1e3e634ee688"
155 "10976313-8081-4023-818f-30d9e6ffedc9",
157 "0460535a-7284-4dee-802b-1e3e634ee688"
161 "fe30cb81-0e8f-4ed5-b260-38c9e44a4725",
163 "0460535a-7284-4dee-802b-1e3e634ee688"
167 "9effbf85-ab41-468a-8c4a-991ea23a8a50",
169 "0460535a-7284-4dee-802b-1e3e634ee688"
173 "3568f452-47d9-456c-b085-c8ba83603016",
175 "d249b968-9359-42d8-a4aa-13af57bd6bae",
176 "25a10696-58f2-4884-96d0-19ac235c04c8"
180 "bb1374e9-d014-4245-b2cd-e1ee0a0ca36b",
182 "0460535a-7284-4dee-802b-1e3e634ee688"
186 "d8ca2fcc-f6d0-4a06-b8d8-257424878b69",
188 "0460535a-7284-4dee-802b-1e3e634ee688"
192 "4de53ab4-eb14-4d5b-a02b-774c8d93c209",
194 "0460535a-7284-4dee-802b-1e3e634ee688"
198 "f59e6dc1-1d41-451e-8239-f9aaee629111",
200 "5c29e81d-4fd9-4f20-ba3b-03ab01d3c70f"
213 : _virt_op_emitter(emitter)
214 , _pending_bet_dba(pending_bet_dba)
215 , _matched_bet_dba(matched_bet_dba)
216 , _dprop_dba(dprop_dba)
242 template <
typename T>
245 std::vector<std::reference_wrapper<const pending_bet_object>> bets_to_cancel;
247 for (
const auto& bet_ref : pending_bets)
256 if (
matched.bet1_matched.amount > 0 &&
matched.bet2_matched.amount > 0)
258 const auto matched_bet_id
278 matched.bet2_matched, matched_bet_id));
283 bets_to_cancel.emplace_back(bet1);
288 bets_to_cancel.emplace_back(bet2);
293 return bets_to_cancel;
311 : _pending_bet_dba(pending_bet_dba)
312 , _dprop_dba(dprop_dba)
314 , _impl(std::make_unique<
matcher>(virt_op_emitter, pending_bet_dba, matched_bet_dba, dprop_dba))
316 dlog(
"${0}", (
"0", fc::json::to_string(_bets_matching_fix)));
325 if (_bets_matching_fix.find(bet2.
data.
uuid) != _bets_matching_fix.end())
327 dlog(
"fix matching in block ${0}", (
"0", _dprop_dba.get().head_block_number));
328 dlog(
"fix matching for bet ${0}", (
"0", bet2.
data.
uuid));
330 std::vector<std::reference_wrapper<const pending_bet_object>> bets;
332 for (
auto uuid : _bets_matching_fix.at(bet2.
data.
uuid))
334 bets.push_back(_pending_bet_dba.get_by<by_uuid>(uuid));
335 dlog(
"+ ${0}", (
"0", uuid));
338 return _impl->match(bet2, bets);
342 auto bets = _pending_bet_dba.get_range_by<by_game_uuid_wincase_asc>(key);
343 return _impl->match(bet2, bets);
346 FC_CAPTURE_LOG_AND_RETHROW((bet2))
353 fc::time_point_sec head_block_time)
358 return matched_bet_dba
betting_matcher(database_virtual_operations_emmiter_i &, dba::db_accessor< pending_bet_object > &, dba::db_accessor< matched_bet_object > &, dba::db_accessor< dynamic_global_property_object > &)
std::vector< std::reference_wrapper< const pending_bet_object > > match(const pending_bet_object &bet2) override
~betting_matcher() override
const object_type & create(modifier_type modifier)
Maintains global state information.
betting_total_stats betting_stats
this section display information about betting totals
fc::time_point_sec created
wincase_type get_wincase() const
uuid_type get_uuid() const
odds_fraction_type inverted() const
std::map< scorum::uuid_type, std::vector< scorum::uuid_type > > matching_fix_list
matched_stake_type calculate_matched_stake(const asset &bet1_stake, const asset &bet2_stake, const odds &bet1_odds, const odds &bet2_odds)
int64_t create_matched_bet(dba::db_accessor< matched_bet_object > &matched_bet_dba, const pending_bet_object &bet1, const pending_bet_object &bet2, const matched_stake_type &matched, fc::time_point_sec head_block_time)
wincase_type create_opposite(const wincase_type &wincase)
virtual ~betting_matcher_i()
asset pending_bets_volume
asset matched_bets_volume
virtual void push_virtual_operation(const operation &op)=0
std::vector< std::reference_wrapper< const pending_bet_object > > match(const pending_bet_object &bet2, T &pending_bets)
const pending_bet_object & get_bet(std::reference_wrapper< const pending_bet_object > ref)
matcher(database_virtual_operations_emmiter_i &emitter, dba::db_accessor< pending_bet_object > &pending_bet_dba, dba::db_accessor< matched_bet_object > &matched_bet_dba, dba::db_accessor< dynamic_global_property_object > &dprop_dba)
bool can_be_matched(const pending_bet_object &bet)
const pending_bet_object & get_bet(const pending_bet_object &bet)
bool is_bets_matched(const pending_bet_object &bet1, const pending_bet_object &bet2) const