diff --git a/libraries/chain/betting_market_group_object.cpp b/libraries/chain/betting_market_group_object.cpp index b980ae12..13f05055 100644 --- a/libraries/chain/betting_market_group_object.cpp +++ b/libraries/chain/betting_market_group_object.cpp @@ -292,12 +292,19 @@ namespace // +-------------------+------------------+---------------------+------------------------------+----------------------+ > {}; - template - void no_transition(Event const& e, Fsm& ,int state) + template + void no_transition(Event const& e, Fsm&, int state) { FC_THROW_EXCEPTION(graphene::chain::no_transition, "No transition"); } + template + void no_transition(canceled_event const& e, Fsm&, int state) + { + //ignore transitions from settled to canceled state + //and from canceled to canceled state + } + betting_market_group_object* betting_market_group_obj; betting_market_group_state_machine_(betting_market_group_object* betting_market_group_obj) : betting_market_group_obj(betting_market_group_obj) {} }; diff --git a/libraries/chain/betting_market_object.cpp b/libraries/chain/betting_market_object.cpp index f5cc9f6d..91f08441 100644 --- a/libraries/chain/betting_market_object.cpp +++ b/libraries/chain/betting_market_object.cpp @@ -223,11 +223,18 @@ namespace // +---------------------------+-----------------------------+----------------------------+---------------------+----------------------+ > {}; - template + template void no_transition(Event const& e, Fsm& ,int state) { FC_THROW_EXCEPTION(graphene::chain::no_transition, "No transition"); } + + template + void no_transition(canceled_event const& e, Fsm&, int state) + { + //ignore transitions from settled to canceled state + //and from canceled to canceled state + } betting_market_object* betting_market_obj; betting_market_state_machine_(betting_market_object* betting_market_obj) : betting_market_obj(betting_market_obj) {} diff --git a/libraries/chain/event_object.cpp b/libraries/chain/event_object.cpp index 753b4b43..69572f9e 100644 --- a/libraries/chain/event_object.cpp +++ b/libraries/chain/event_object.cpp @@ -316,10 +316,17 @@ namespace graphene { namespace chain { > {}; template - void no_transition(Event const& e, Fsm& ,int state) + void no_transition(Event const& e, Fsm&, int state) { FC_THROW_EXCEPTION(graphene::chain::no_transition, "No transition"); } + + template + void no_transition(canceled_event const& e, Fsm&, int state) + { + //ignore transitions from settled to canceled state + //and from canceled to canceled state + } event_object* event_obj; event_state_machine_(event_object* event_obj) : event_obj(event_obj) {} diff --git a/tests/betting/betting_tests.cpp b/tests/betting/betting_tests.cpp index de4e0d1a..4d35ea8b 100644 --- a/tests/betting/betting_tests.cpp +++ b/tests/betting/betting_tests.cpp @@ -1622,9 +1622,6 @@ BOOST_AUTO_TEST_CASE(event_group_delete_test) const auto& event_3 = create_event({{"en", "event 3"}}, {{"en", "2016-17"}}, nhl.id); const auto& market_group = create_betting_market_group({{"en", "market group 1"}}, event_1.id, betting_market_rules.id, asset_id_type(), false, 0); - const auto& market_1 = create_betting_market(market_group.id, {{"en", "market 1"}}); - const auto& market_2 = create_betting_market(market_group.id, {{"en", "market 2"}}); - //to make bets be not removed immediately update_betting_market_group_impl(market_group.id, fc::optional(), @@ -1632,8 +1629,42 @@ BOOST_AUTO_TEST_CASE(event_group_delete_test) betting_market_group_status::in_play, false); - const auto& bet_1_id = place_bet(alice_id, market_1.id, bet_type::back, asset(betAsset, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION); - const auto& bet_2_id = place_bet(bob_id, market_1.id, bet_type::lay, asset(betAsset, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION); + const auto& market_unresolved = create_betting_market(market_group.id, {{"en", "market unresolved"}}); + const auto& market_frozen = create_betting_market(market_group.id, {{"en", "market frozen"}}); + db.modify(market_frozen, [&](betting_market_object& market) + { + market.on_frozen_event(db); + }); + + const auto& market_closed = create_betting_market(market_group.id, {{"en", "market closed"}}); + db.modify(market_closed, [&](betting_market_object& market) + { + market.on_closed_event(db); + }); + + const auto& market_graded = create_betting_market(market_group.id, {{"en", "market graded"}}); + db.modify(market_graded, [&](betting_market_object& market) + { + market.on_closed_event(db); + market.on_graded_event(db, betting_market_resolution_type::win); + }); + + const auto& market_canceled = create_betting_market(market_group.id, {{"en", "market canceled"}}); + db.modify(market_canceled, [&](betting_market_object& market) + { + market.on_canceled_event(db); + }); + + const auto& market_settled = create_betting_market(market_group.id, {{"en", "market settled"}}); + db.modify(market_settled, [&](betting_market_object& market) + { + market.on_closed_event(db); + market.on_graded_event(db, betting_market_resolution_type::win); + market.on_settled_event(db); + }); + + const auto& bet_1_id = place_bet(alice_id, market_unresolved.id, bet_type::back, asset(betAsset, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION); + const auto& bet_2_id = place_bet(bob_id, market_unresolved.id, bet_type::lay, asset(betAsset, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION); delete_event_group(nhl.id); @@ -1646,8 +1677,12 @@ BOOST_AUTO_TEST_CASE(event_group_delete_test) BOOST_CHECK(betting_market_group_status::canceled == market_group.get_status()); - BOOST_CHECK(betting_market_status::canceled == market_1.get_status()); - BOOST_CHECK(betting_market_status::canceled == market_2.get_status()); + BOOST_CHECK(betting_market_status::canceled == market_unresolved.get_status()); + BOOST_CHECK(betting_market_status::canceled == market_frozen.get_status()); + BOOST_CHECK(betting_market_status::canceled == market_closed.get_status()); + BOOST_CHECK(betting_market_status::canceled == market_graded.get_status()); + BOOST_CHECK(betting_market_status::canceled == market_canceled.get_status()); + BOOST_CHECK(betting_market_status::settled == market_settled.get_status()); //settled market should not be canceled //check canceled bets and reverted balance changes const auto& bet_by_id = db.get_index_type().indices().get();