diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index c5b2628d..8bd7a23c 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -209,6 +209,7 @@ struct get_impacted_account_visitor void operator()( const event_create_operation& op ) {} void operator()( const betting_market_group_create_operation& op ) {} void operator()( const betting_market_create_operation& op ) {} + void operator()( const bet_place_operation& op ) {} }; diff --git a/libraries/chain/betting_market_evaluator.cpp b/libraries/chain/betting_market_evaluator.cpp index 237a7819..9f4aafef 100644 --- a/libraries/chain/betting_market_evaluator.cpp +++ b/libraries/chain/betting_market_evaluator.cpp @@ -92,4 +92,26 @@ object_id_type betting_market_create_evaluator::do_apply(const betting_market_cr return new_betting_market.id; } FC_CAPTURE_AND_RETHROW( (op) ) } +void_result bet_place_evaluator::do_evaluate(const bet_place_operation& op) +{ try { + FC_ASSERT( db().find_object(op.bettor_id), "Invalid betting_market_group specified" ); + FC_ASSERT( db().find_object(op.betting_market_id), "Invalid betting_market specified" ); + + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + +object_id_type bet_place_evaluator::do_apply(const bet_place_operation& op) +{ try { + const bet_object& new_bet = + db().create( [&]( bet_object& bet_obj ) { + bet_obj.bettor_id = op.bettor_id; + bet_obj.betting_market_id = op.betting_market_id; + bet_obj.amount_to_bet = op.amount_to_bet; + bet_obj.amount_to_win = op.amount_to_win; + bet_obj.amount_reserved_for_fees = op.amount_reserved_for_fees; + bet_obj.back_or_lay = op.back_or_lay; + }); + return new_bet.id; +} FC_CAPTURE_AND_RETHROW( (op) ) } + } } // graphene::chain diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index ec4c2d60..dc926cb9 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -156,6 +156,9 @@ const uint8_t betting_market_group_object::type_id; const uint8_t betting_market_object::space_id; const uint8_t betting_market_object::type_id; +const uint8_t bet_object::space_id; +const uint8_t bet_object::type_id; + void database::initialize_evaluators() { @@ -207,6 +210,7 @@ void database::initialize_evaluators() register_evaluator(); register_evaluator(); register_evaluator(); + register_evaluator(); } void database::initialize_indexes() @@ -241,6 +245,7 @@ void database::initialize_indexes() add_index< primary_index >(); add_index< primary_index >(); add_index< primary_index >(); + add_index< primary_index >(); //Implementation object indexes add_index< primary_index >(); diff --git a/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp b/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp index eccef223..a8099655 100644 --- a/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp @@ -51,4 +51,13 @@ namespace graphene { namespace chain { betting_market_group_id_type group_id; }; + class bet_place_evaluator : public evaluator + { + public: + typedef bet_place_operation operation_type; + + void_result do_evaluate( const bet_place_operation& o ); + object_id_type do_apply( const bet_place_operation& o ); + }; + } } // graphene::chain diff --git a/libraries/chain/include/graphene/chain/betting_market_object.hpp b/libraries/chain/include/graphene/chain/betting_market_object.hpp index c8953e9a..a7357c4e 100644 --- a/libraries/chain/include/graphene/chain/betting_market_object.hpp +++ b/libraries/chain/include/graphene/chain/betting_market_object.hpp @@ -55,6 +55,25 @@ class betting_market_object : public graphene::db::abstract_object< betting_mark asset_id_type asset_id; }; +class bet_object : public graphene::db::abstract_object< bet_object > +{ + public: + static const uint8_t space_id = protocol_ids; + static const uint8_t type_id = bet_object_type; + + account_id_type bettor_id; + + betting_market_id_type betting_market_id; + + share_type amount_to_bet; + + share_type amount_to_win; + + share_type amount_reserved_for_fees; + + bet_type back_or_lay; +}; + typedef multi_index_container< betting_market_group_object, indexed_by< @@ -67,7 +86,15 @@ typedef multi_index_container< ordered_unique< tag, member< object, object_id_type, &object::id > > > > betting_market_object_multi_index_type; typedef generic_index betting_market_object_index; + +typedef multi_index_container< + bet_object, + indexed_by< + ordered_unique< tag, member< object, object_id_type, &object::id > > > > bet_object_multi_index_type; + +typedef generic_index bet_object_index; } } // graphene::chain FC_REFLECT_DERIVED( graphene::chain::betting_market_group_object, (graphene::db::object), (event_id)(options) ) FC_REFLECT_DERIVED( graphene::chain::betting_market_object, (graphene::db::object), (group_id)(payout_condition)(asset_id) ) +FC_REFLECT_DERIVED( graphene::chain::bet_object, (graphene::db::object), (bettor_id)(betting_market_id)(amount_to_bet)(amount_to_win)(amount_reserved_for_fees)(back_or_lay) ) diff --git a/libraries/chain/include/graphene/chain/protocol/betting_market.hpp b/libraries/chain/include/graphene/chain/protocol/betting_market.hpp index 1383766b..dd29a2ec 100644 --- a/libraries/chain/include/graphene/chain/protocol/betting_market.hpp +++ b/libraries/chain/include/graphene/chain/protocol/betting_market.hpp @@ -88,6 +88,32 @@ struct betting_market_create_operation : public base_operation void validate()const; }; +enum bet_type { back_bet, lay_bet }; +struct bet_place_operation : public base_operation +{ + struct fee_parameters_type { uint64_t fee = GRAPHENE_BLOCKCHAIN_PRECISION; }; + asset fee; + + account_id_type bettor_id; + + betting_market_id_type betting_market_id; + + share_type amount_to_bet; + + share_type amount_to_win; + + share_type amount_reserved_for_fees; + + bet_type back_or_lay; + + extensions_type extensions; + + account_id_type fee_payer()const { return bettor_id; } + void validate()const; +}; + + + } } FC_REFLECT_ENUM( graphene::chain::betting_market_type, (moneyline)(spread)(over_under)(BETTING_MARKET_TYPE_COUNT) ) @@ -104,3 +130,8 @@ FC_REFLECT( graphene::chain::betting_market_group_create_operation, FC_REFLECT( graphene::chain::betting_market_create_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::betting_market_create_operation, (fee)(group_id)(payout_condition)(asset_id)(extensions) ) + +FC_REFLECT_ENUM( graphene::chain::bet_type, (back_bet)(lay_bet) ) +FC_REFLECT( graphene::chain::bet_place_operation::fee_parameters_type, (fee) ) +FC_REFLECT( graphene::chain::bet_place_operation, + (fee)(bettor_id)(betting_market_id)(amount_to_bet)(amount_to_win)(amount_reserved_for_fees)(back_or_lay)(extensions) ) diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index 4b04a44f..b973c1ed 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -102,7 +102,8 @@ namespace graphene { namespace chain { event_group_create_operation, event_create_operation, betting_market_group_create_operation, - betting_market_create_operation + betting_market_create_operation, + bet_place_operation > operation; /// @} // operations group diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index 68b2a6dc..904324b8 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -140,6 +140,7 @@ namespace graphene { namespace chain { event_object_type, betting_market_group_object_type, betting_market_object_type, + bet_object_type, OBJECT_TYPE_COUNT ///< Sentry value which contains the number of different object types }; @@ -187,6 +188,7 @@ namespace graphene { namespace chain { class event_object; class betting_market_group_object; class betting_market_object; + class bet_object; typedef object_id< protocol_ids, account_object_type, account_object> account_id_type; typedef object_id< protocol_ids, asset_object_type, asset_object> asset_id_type; @@ -206,8 +208,9 @@ namespace graphene { namespace chain { typedef object_id< protocol_ids, competitor_object_type, competitor_object> competitor_id_type; typedef object_id< protocol_ids, event_group_object_type, event_group_object> event_group_id_type; typedef object_id< protocol_ids, event_object_type, event_object> event_id_type; - typedef object_id< protocol_ids, betting_market_group_object_type, betting_market_group_object> betting_market_group_id_type; - typedef object_id< protocol_ids, betting_market_object_type, betting_market_object> betting_market_id_type; + typedef object_id< protocol_ids, betting_market_group_object_type, betting_market_group_object> betting_market_group_id_type; + typedef object_id< protocol_ids, betting_market_object_type, betting_market_object> betting_market_id_type; + typedef object_id< protocol_ids, bet_object_type, bet_object> bet_id_type; // implementation types class global_property_object; @@ -366,6 +369,7 @@ FC_REFLECT_ENUM( graphene::chain::object_type, (event_object_type) (betting_market_group_object_type) (betting_market_object_type) + (bet_object_type) (OBJECT_TYPE_COUNT) ) FC_REFLECT_ENUM( graphene::chain::impl_object_type, @@ -410,6 +414,7 @@ FC_REFLECT_TYPENAME( graphene::chain::event_group_id_type ) FC_REFLECT_TYPENAME( graphene::chain::event_id_type ) FC_REFLECT_TYPENAME( graphene::chain::betting_market_group_id_type ) FC_REFLECT_TYPENAME( graphene::chain::betting_market_id_type ) +FC_REFLECT_TYPENAME( graphene::chain::bet_id_type ) FC_REFLECT_TYPENAME( graphene::chain::global_property_id_type ) FC_REFLECT_TYPENAME( graphene::chain::dynamic_global_property_id_type ) FC_REFLECT_TYPENAME( graphene::chain::asset_dynamic_data_id_type ) diff --git a/libraries/chain/protocol/betting_market.cpp b/libraries/chain/protocol/betting_market.cpp index 91cbaa08..69e13a40 100644 --- a/libraries/chain/protocol/betting_market.cpp +++ b/libraries/chain/protocol/betting_market.cpp @@ -35,6 +35,11 @@ void betting_market_create_operation::validate() const FC_ASSERT( fee.amount >= 0 ); } +void bet_place_operation::validate() const +{ + FC_ASSERT( fee.amount >= 0 ); +} + } } // graphene::chain