Added canceling of bets for market.

This commit is contained in:
Apr Team 2018-05-15 15:49:06 +03:00 committed by Fabian Schuh
parent 88adfb6661
commit 0b974a6ddb
3 changed files with 41 additions and 0 deletions

View file

@ -195,6 +195,7 @@ namespace
void on_entry(const canceled_event& event, betting_market_state_machine_& fsm) { void on_entry(const canceled_event& event, betting_market_state_machine_& fsm) {
dlog("betting market ${id} -> canceled", ("id", fsm.betting_market_obj->id)); dlog("betting market ${id} -> canceled", ("id", fsm.betting_market_obj->id));
fsm.betting_market_obj->resolution = betting_market_resolution_type::cancel; fsm.betting_market_obj->resolution = betting_market_resolution_type::cancel;
fsm.betting_market_obj->cancel_all_bets(event.db);
} }
}; };
@ -375,6 +376,18 @@ void betting_market_object::cancel_all_unmatched_bets(database& db) const
db.cancel_bet(*old_book_itr, true); db.cancel_bet(*old_book_itr, true);
} }
} }
void betting_market_object::cancel_all_bets(database& db) const
{
const auto& bets_by_market_id = db.get_index_type<bet_object_index>().indices().get<by_betting_market_id>();
auto bet_it = bets_by_market_id.lower_bound(id);
auto bet_it_end = bets_by_market_id.upper_bound(id);
for (; bet_it != bet_it_end; ++bet_it)
{
db.cancel_bet(*bet_it, true);
}
}
void betting_market_object::pack_impl(std::ostream& stream) const void betting_market_object::pack_impl(std::ostream& stream) const
{ {

View file

@ -154,6 +154,7 @@ class betting_market_object : public graphene::db::abstract_object< betting_mark
betting_market_status get_status() const; betting_market_status get_status() const;
void cancel_all_unmatched_bets(database& db) const; void cancel_all_unmatched_bets(database& db) const;
void cancel_all_bets(database& db) const;
// serialization functions: // serialization functions:
// for serializing to raw, go through a temporary sstream object to avoid // for serializing to raw, go through a temporary sstream object to avoid
@ -585,12 +586,14 @@ struct compare_bet_by_bettor_then_odds {
}; };
struct by_odds {}; struct by_odds {};
struct by_betting_market_id {};
struct by_bettor_and_odds {}; struct by_bettor_and_odds {};
typedef multi_index_container< typedef multi_index_container<
bet_object, bet_object,
indexed_by< indexed_by<
ordered_unique< tag<by_id>, member< object, object_id_type, &object::id > >, ordered_unique< tag<by_id>, member< object, object_id_type, &object::id > >,
ordered_unique< tag<by_odds>, identity<bet_object>, compare_bet_by_odds >, ordered_unique< tag<by_odds>, identity<bet_object>, compare_bet_by_odds >,
ordered_non_unique< tag<by_betting_market_id>, member<bet_object, betting_market_id_type, &bet_object::betting_market_id> >,
ordered_unique< tag<by_bettor_and_odds>, identity<bet_object>, compare_bet_by_bettor_then_odds > > > bet_object_multi_index_type; ordered_unique< tag<by_bettor_and_odds>, identity<bet_object>, compare_bet_by_bettor_then_odds > > > bet_object_multi_index_type;
typedef generic_index<bet_object, bet_object_multi_index_type> bet_object_index; typedef generic_index<bet_object, bet_object_multi_index_type> bet_object_index;

View file

@ -1591,8 +1591,15 @@ BOOST_AUTO_TEST_CASE(event_group_delete_test)
{ {
try try
{ {
ACTORS( (alice)(bob) )
CREATE_ICE_HOCKEY_BETTING_MARKET(false, 0); CREATE_ICE_HOCKEY_BETTING_MARKET(false, 0);
const int initialAccountAsset = 10000000;
const int betAsset = 1000000;
transfer(account_id_type(), alice_id, asset(initialAccountAsset));
transfer(account_id_type(), bob_id, asset(initialAccountAsset));
const auto& event_1 = create_event({{"en", "event 1"}}, {{"en", "2016-17"}}, nhl.id); const auto& event_1 = create_event({{"en", "event 1"}}, {{"en", "2016-17"}}, nhl.id);
const auto& event_2 = create_event({{"en", "event 2"}}, {{"en", "2016-17"}}, nhl.id); const auto& event_2 = create_event({{"en", "event 2"}}, {{"en", "2016-17"}}, nhl.id);
const auto& event_3 = create_event({{"en", "event 3"}}, {{"en", "2016-17"}}, nhl.id); const auto& event_3 = create_event({{"en", "event 3"}}, {{"en", "2016-17"}}, nhl.id);
@ -1601,6 +1608,16 @@ BOOST_AUTO_TEST_CASE(event_group_delete_test)
const auto& market_1 = create_betting_market(market_group.id, {{"en", "market 1"}}); 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"}}); 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<internationalized_string_type>(),
fc::optional<object_id_type>(),
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);
delete_event_group(nhl.id); delete_event_group(nhl.id);
const auto& event_group_by_id = db.get_index_type<event_group_object_index>().indices().get<by_id>(); const auto& event_group_by_id = db.get_index_type<event_group_object_index>().indices().get<by_id>();
@ -1614,6 +1631,14 @@ BOOST_AUTO_TEST_CASE(event_group_delete_test)
BOOST_CHECK(betting_market_status::canceled == market_1.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_2.get_status());
//check canceled bets and reverted balance changes
const auto& bet_by_id = db.get_index_type<bet_object_index>().indices().get<by_id>();
BOOST_CHECK(bet_by_id.end() == bet_by_id.find(bet_1_id));
BOOST_CHECK(bet_by_id.end() == bet_by_id.find(bet_2_id));
BOOST_CHECK_EQUAL(get_balance(alice_id, asset_id_type()), initialAccountAsset);
BOOST_CHECK_EQUAL(get_balance(bob_id, asset_id_type()), initialAccountAsset);
} FC_LOG_AND_RETHROW() } FC_LOG_AND_RETHROW()
} }