diff --git a/libraries/chain/db_bet.cpp b/libraries/chain/db_bet.cpp index dae5d866..e56756e6 100644 --- a/libraries/chain/db_bet.cpp +++ b/libraries/chain/db_bet.cpp @@ -7,6 +7,7 @@ #include #include +#include #include namespace graphene { namespace chain { @@ -276,9 +277,14 @@ void database::settle_betting_market_group(const betting_market_group_object& be dlog("removing betting market group ${id}", ("id", betting_market_group.id)); remove(betting_market_group); +} - if (event.get_status() == event_status::canceled || - event.get_status() == event_status::settled) { +void database::remove_completed_events() +{ + const auto& event_index = get_index_type().indices().get(); + auto canceled_events = boost::make_iterator_range(event_index.equal_range(event_status::canceled)); + auto settled_events = boost::make_iterator_range(event_index.equal_range(event_status::settled)); + for (const event_object& event : boost::join(canceled_events, settled_events)) { dlog("removing event ${id}", ("id", event.id)); remove(event); } diff --git a/libraries/chain/db_update.cpp b/libraries/chain/db_update.cpp index 900c8c0b..ad98837e 100644 --- a/libraries/chain/db_update.cpp +++ b/libraries/chain/db_update.cpp @@ -677,6 +677,7 @@ void process_settled_betting_markets(database& db, fc::time_point_sec current_bl void database::update_betting_markets(fc::time_point_sec current_block_time) { process_settled_betting_markets(*this, current_block_time); + remove_completed_events(); } } } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index ad3185db..02fe64f6 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -396,6 +396,7 @@ namespace graphene { namespace chain { void resolve_betting_market_group(const betting_market_group_object& betting_market_group, const std::map& resolutions); void settle_betting_market_group(const betting_market_group_object& betting_market_group); + void remove_completed_events(); /** * @brief Process a new bet * @param new_bet_object The new bet to process diff --git a/libraries/chain/include/graphene/chain/event_object.hpp b/libraries/chain/include/graphene/chain/event_object.hpp index 52fb9f53..2c38a33f 100644 --- a/libraries/chain/include/graphene/chain/event_object.hpp +++ b/libraries/chain/include/graphene/chain/event_object.hpp @@ -95,11 +95,13 @@ class event_object : public graphene::db::abstract_object< event_object > }; struct by_event_group_id; +struct by_event_status; typedef multi_index_container< event_object, indexed_by< ordered_unique< tag, member< object, object_id_type, &object::id > >, - ordered_non_unique< tag, member< event_object, event_group_id_type, &event_object::event_group_id > > > > event_object_multi_index_type; + ordered_non_unique< tag, member< event_object, event_group_id_type, &event_object::event_group_id > >, + ordered_non_unique< tag, const_mem_fun< event_object, event_status, &event_object::get_status > > > > event_object_multi_index_type; typedef generic_index event_object_index; diff --git a/tests/betting/betting_tests.cpp b/tests/betting/betting_tests.cpp index 1a3fcadd..85d82fda 100644 --- a/tests/betting/betting_tests.cpp +++ b/tests/betting/betting_tests.cpp @@ -731,6 +731,35 @@ BOOST_AUTO_TEST_CASE( chained_market_create_test ) } FC_LOG_AND_RETHROW() } +BOOST_AUTO_TEST_CASE( testnet_witness_block_production_error ) +{ + try + { + CREATE_ICE_HOCKEY_BETTING_MARKET(false, 0); + create_betting_market_group({{"en", "Unused"}}, capitals_vs_blackhawks.id, betting_market_rules.id, asset_id_type(), false, 0); + generate_blocks(1); + + BOOST_TEST_MESSAGE("setting the event in progress"); + update_event(capitals_vs_blackhawks.id, _status = event_status::in_progress); + generate_blocks(1); + BOOST_CHECK(capitals_vs_blackhawks.get_status() == event_status::in_progress); + BOOST_CHECK(moneyline_betting_markets.get_status() == betting_market_group_status::in_play); + + BOOST_TEST_MESSAGE("setting the event to finished"); + update_event(capitals_vs_blackhawks.id, _status = event_status::finished); + generate_blocks(1); + BOOST_CHECK(capitals_vs_blackhawks.get_status() == event_status::finished); + BOOST_CHECK(moneyline_betting_markets.get_status() == betting_market_group_status::closed); + BOOST_CHECK(capitals_win_market.get_status() == betting_market_status::unresolved); + BOOST_CHECK(blackhawks_win_market.get_status() == betting_market_status::unresolved); + //BOOST_CHECK(unused_betting_market_group.get_status() == betting_market_group_status::closed); + + BOOST_TEST_MESSAGE("setting the event to canceled"); + update_event(capitals_vs_blackhawks.id, _status = event_status::canceled); + generate_blocks(1); + } FC_LOG_AND_RETHROW() +} + BOOST_AUTO_TEST_SUITE_END()