diff --git a/libraries/chain/event_group_evaluator.cpp b/libraries/chain/event_group_evaluator.cpp index 139613eb..ccae6786 100644 --- a/libraries/chain/event_group_evaluator.cpp +++ b/libraries/chain/event_group_evaluator.cpp @@ -63,7 +63,19 @@ object_id_type event_group_create_evaluator::do_apply(const event_group_create_o void_result event_group_update_evaluator::do_evaluate(const event_group_update_operation& op) { try { FC_ASSERT(trx_state->_is_proposed_trx); - FC_ASSERT(op.new_name.valid()); + FC_ASSERT(op.new_sport_id.valid() || op.new_name.valid()); + if( op.new_sport_id.valid() ) + { + object_id_type resolved_id = *op.new_sport_id; + if (is_relative(*op.new_sport_id)) + resolved_id = get_relative_id(*op.new_sport_id); + + FC_ASSERT(resolved_id.space() == sport_id_type::space_id && + resolved_id.type() == sport_id_type::type_id, "sport_id must refer to a sport_id_type"); + sport_id = resolved_id; + + FC_ASSERT( db().find_object(sport_id), "Invalid sport specified" ); + } return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } @@ -76,6 +88,8 @@ void_result event_group_update_evaluator::do_apply(const event_group_update_oper { if( op.new_name.valid() ) ego.name = *op.new_name; + if( op.new_sport_id.valid() ) + ego.sport_id = sport_id; }); return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } diff --git a/libraries/chain/include/graphene/chain/protocol/event_group.hpp b/libraries/chain/include/graphene/chain/protocol/event_group.hpp index 242f6432..450273bc 100644 --- a/libraries/chain/include/graphene/chain/protocol/event_group.hpp +++ b/libraries/chain/include/graphene/chain/protocol/event_group.hpp @@ -57,6 +57,12 @@ struct event_group_update_operation : public base_operation event_group_id_type event_group_id; + /** + * This can be a sport_id_type, or a + * relative object id that resolves to a sport_id_type + */ + optional new_sport_id; + optional new_name; extensions_type extensions; @@ -74,4 +80,4 @@ FC_REFLECT( graphene::chain::event_group_create_operation, FC_REFLECT( graphene::chain::event_group_update_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::event_group_update_operation, - (fee)(new_name)(event_group_id)(extensions) ) + (fee)(new_sport_id)(new_name)(event_group_id)(extensions) ) diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index 336a179c..6826550d 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -1600,6 +1600,7 @@ class wallet_api const string& proposing_account, fc::time_point_sec expiration_time, event_group_id_type event_group, + fc::optional sport_id, fc::optional name, bool broadcast = false); diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 2cc71efb..d4d705c9 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -5109,6 +5109,7 @@ signed_transaction wallet_api::propose_update_event_group( const string& proposing_account, fc::time_point_sec expiration_time, event_group_id_type event_group, + fc::optional sport_id, fc::optional name, bool broadcast /*= false*/) { @@ -5116,6 +5117,7 @@ signed_transaction wallet_api::propose_update_event_group( const chain_parameters& current_params = get_global_properties().parameters; event_group_update_operation event_group_update_op; + event_group_update_op.new_sport_id = sport_id; event_group_update_op.new_name = name; event_group_update_op.event_group_id = event_group; diff --git a/tests/betting/betting_tests.cpp b/tests/betting/betting_tests.cpp index 96d745c1..8a38546a 100644 --- a/tests/betting/betting_tests.cpp +++ b/tests/betting/betting_tests.cpp @@ -200,16 +200,72 @@ BOOST_AUTO_TEST_CASE(peerplays_event_group_update_test) { try { - ACTORS( (alice) ); + ACTORS( (alice)(bob) ); CREATE_ICE_HOCKEY_BETTING_MARKET(); - update_event_group(nhl.id, {{"en", "IBM"}, {"zh_Hans", "國家冰球聯"}, {"ja", "ナショナルホッケーリー"}}); \ transfer(account_id_type(), alice_id, asset(10000000)); + transfer(account_id_type(), bob_id, asset(10000000)); + place_bet(alice_id, capitals_win_market.id, bet_type::back, asset(1000000, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION, 1000000 / 50 /* chain defaults to 2% fees */); - BOOST_CHECK_EQUAL(get_balance(alice_id, asset_id_type()), 10000000 - 1000000 - 20000); + internationalized_string_type n = {{"en", "IBM"}, {"zh_Hans", "國家冰球聯"}, {"ja", "ナショナルホッケーリー"}}; + const sport_object& ice_on_hockey = create_sport({{"en", "Hockey on Ice"}, {"zh_Hans", "冰球"}, {"ja", "アイスホッケー"}}); \ + + fc::optional name = n; + + object_id_type object_id = ice_on_hockey.id; + fc::optional sport_id = object_id; + + update_event_group(nhl.id, fc::optional(), name); + update_event_group(nhl.id, sport_id, fc::optional()); + update_event_group(nhl.id, sport_id, name); + +#if 0 + // nothing to change + //GRAPHENE_REQUIRE_THROW(update_event_group(nhl.id, fc::optional(), fc::optional()), fc::assert_exception); + try + { + update_event_group(nhl.id, fc::optional(), fc::optional()); + FC_ASSERT(false, "expected error hasn't occured"); + } + catch (fc::exception& e) + { + edump((e.code())); + } + + // no sport object + //object_id = capitals_win_market.id; + //sport_id = object_id; + //GRAPHENE_REQUIRE_THROW(update_event_group(nhl.id, sport_id, name), fc::assert_exception); + + // sport object doesn't exist +#endif + + place_bet(bob_id, capitals_win_market.id, bet_type::lay, asset(1000000, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION, 1000000 / 50 /* chain defaults to 2% fees */); + + BOOST_CHECK_EQUAL(get_balance(alice_id, asset_id_type()), 10000000 - 1000000 - 20000); + BOOST_CHECK_EQUAL(get_balance(bob_id, asset_id_type()), 10000000 - 1000000 - 20000); + + // caps win + resolve_betting_market_group(moneyline_betting_markets.id, + {{capitals_win_market.id, betting_market_resolution_type::win}, + {blackhawks_win_market.id, betting_market_resolution_type::cancel}}); + + + uint16_t rake_fee_percentage = db.get_global_properties().parameters.betting_rake_fee_percentage; + uint32_t rake_value = (-1000000 + 2000000) * rake_fee_percentage / GRAPHENE_1_PERCENT / 100; + BOOST_TEST_MESSAGE("Rake value " + std::to_string(rake_value)); + BOOST_CHECK_EQUAL(get_balance(alice_id, asset_id_type()), 10000000 - 1000000 - 20000 + 2000000 - rake_value); + BOOST_CHECK_EQUAL(get_balance(bob_id, asset_id_type()), 10000000 - 1000000 - 20000); + + } + catch (fc::exception& e) + { + edump((e.to_detail_string())); + throw; + } + //} FC_LOG_AND_RETHROW() - } FC_LOG_AND_RETHROW() } diff --git a/tests/common/database_fixture.cpp b/tests/common/database_fixture.cpp index a4a4a3eb..cf029035 100644 --- a/tests/common/database_fixture.cpp +++ b/tests/common/database_fixture.cpp @@ -1227,10 +1227,11 @@ const event_group_object& database_fixture::create_event_group(internationalized } FC_CAPTURE_AND_RETHROW( (name) ) } -void database_fixture::update_event_group(event_group_id_type event_group_id, internationalized_string_type name) +void database_fixture::update_event_group(event_group_id_type event_group_id, fc::optional sport_id, fc::optional name) { try { event_group_update_operation event_group_update_op; event_group_update_op.new_name = name; + event_group_update_op.new_sport_id = sport_id; event_group_update_op.event_group_id = event_group_id; process_operation_by_witnesses(event_group_update_op); } FC_CAPTURE_AND_RETHROW( (name) ) } diff --git a/tests/common/database_fixture.hpp b/tests/common/database_fixture.hpp index ae320420..f86bb2df 100644 --- a/tests/common/database_fixture.hpp +++ b/tests/common/database_fixture.hpp @@ -288,7 +288,7 @@ struct database_fixture { const sport_object& create_sport(internationalized_string_type name); void update_sport(sport_id_type sport_id, internationalized_string_type name); const event_group_object& create_event_group(internationalized_string_type name, sport_id_type sport_id); - void update_event_group(event_group_id_type event_group_id, internationalized_string_type name); + void update_event_group(event_group_id_type event_group_id, fc::optional sport_id, fc::optional name); const event_object& create_event(internationalized_string_type name, internationalized_string_type season, event_group_id_type event_group_id); void update_event(event_id_type event_id, fc::optional name, fc::optional season); const betting_market_rules_object& create_betting_market_rules(internationalized_string_type name, internationalized_string_type description);