From c42a56d33296a6d5c69795342c0761b31937964d Mon Sep 17 00:00:00 2001 From: SynaptiCAD User Date: Wed, 22 Mar 2017 12:03:08 -0400 Subject: [PATCH] implement bet_cancel_operation --- libraries/app/impacted.cpp | 1 + libraries/chain/CMakeLists.txt | 1 + libraries/chain/betting_market_evaluator.cpp | 16 +++++++++++++ libraries/chain/database.cpp | 1 + libraries/chain/db_bet.cpp | 24 +++++++++++++++++++ .../chain/betting_market_evaluator.hpp | 9 +++++++ .../chain/include/graphene/chain/database.hpp | 3 +++ .../chain/protocol/betting_market.hpp | 19 +++++++++++++++ .../graphene/chain/protocol/operations.hpp | 3 ++- libraries/chain/protocol/betting_market.cpp | 6 +++++ libraries/fc | 2 +- 11 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 libraries/chain/db_bet.cpp diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index 8bd7a23c..67da8262 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -210,6 +210,7 @@ struct get_impacted_account_visitor void operator()( const betting_market_group_create_operation& op ) {} void operator()( const betting_market_create_operation& op ) {} void operator()( const bet_place_operation& op ) {} + void operator()( const bet_cancel_operation& op ) {} }; diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 602c26df..fde347d4 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -10,6 +10,7 @@ file(GLOB HEADERS "include/graphene/chain/*.hpp") if( GRAPHENE_DISABLE_UNITY_BUILD ) set( GRAPHENE_DB_FILES db_balance.cpp + db_bet.cpp db_block.cpp db_debug.cpp db_getter.cpp diff --git a/libraries/chain/betting_market_evaluator.cpp b/libraries/chain/betting_market_evaluator.cpp index fd5e6723..d988cb69 100644 --- a/libraries/chain/betting_market_evaluator.cpp +++ b/libraries/chain/betting_market_evaluator.cpp @@ -94,6 +94,7 @@ object_id_type betting_market_create_evaluator::do_apply(const betting_market_cr void_result bet_place_evaluator::do_evaluate(const bet_place_operation& op) { try { +<<<<<<< 46ef911f8ec2454ea00507dabc843a994b1fc842 const database& d = db(); _betting_market = &op.betting_market_id(d); @@ -139,4 +140,19 @@ object_id_type bet_place_evaluator::do_apply(const bet_place_operation& op) return new_bet.id; } FC_CAPTURE_AND_RETHROW( (op) ) } +void_result bet_cancel_evaluator::do_evaluate(const bet_cancel_operation& op) +{ try { + FC_ASSERT( db().find_object(op.bettor_id), "Invalid bettor account specified" ); + FC_ASSERT( db().find_object(op.bet_to_cancel), "Invalid bet specified" ); + + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + +void_result bet_cancel_evaluator::do_apply(const bet_cancel_operation& op) +{ try { + const bet_object& bet_to_cancel = op.bet_to_cancel( db() ); + db().cancel_bet(bet_to_cancel); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + } } // graphene::chain diff --git a/libraries/chain/database.cpp b/libraries/chain/database.cpp index aa9f6127..b698389a 100644 --- a/libraries/chain/database.cpp +++ b/libraries/chain/database.cpp @@ -23,6 +23,7 @@ */ #include #include "db_balance.cpp" +#include "db_bet.cpp" #include "db_block.cpp" #include "db_debug.cpp" #include "db_getter.cpp" diff --git a/libraries/chain/db_bet.cpp b/libraries/chain/db_bet.cpp new file mode 100644 index 00000000..57829d40 --- /dev/null +++ b/libraries/chain/db_bet.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +namespace graphene { namespace chain { + +void database::cancel_bet( const bet_object& bet, bool create_virtual_op ) +{ + share_type amount_to_refund = bet.amount_to_bet; + //TODO: update global statistics + adjust_balance(bet.bettor_id, amount_to_refund); //return unmatched stake + //TODO: do special fee accounting as required + if (create_virtual_op) + { + bet_cancel_operation vop; + vop.bettor_id = bet.bettor_id; + vop.bet_to_cancel = bet.id; + push_applied_operation(vop); + } + remove(bet); +} + +} } diff --git a/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp b/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp index ba9fb589..f9462f6e 100644 --- a/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp @@ -64,4 +64,13 @@ namespace graphene { namespace chain { const asset_object* _asset; }; + class bet_cancel_evaluator : public evaluator + { + public: + typedef bet_cancel_operation operation_type; + + void_result do_evaluate( const bet_cancel_operation& o ); + void_result do_apply( const bet_cancel_operation& o ); + }; + } } // graphene::chain diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index b73b8931..0c264e58 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -323,6 +323,9 @@ namespace graphene { namespace chain { void debug_dump(); + //////////////////// db_bet.cpp ////////////////////// + void cancel_bet(const bet_object& bet, bool create_virtual_op = true); + //////////////////// db_market.cpp //////////////////// /// @{ @group Market Helpers diff --git a/libraries/chain/include/graphene/chain/protocol/betting_market.hpp b/libraries/chain/include/graphene/chain/protocol/betting_market.hpp index 0b42b8db..4d1553c8 100644 --- a/libraries/chain/include/graphene/chain/protocol/betting_market.hpp +++ b/libraries/chain/include/graphene/chain/protocol/betting_market.hpp @@ -144,6 +144,22 @@ struct bet_place_operation : public base_operation void validate()const; }; +struct bet_cancel_operation : public base_operation +{ + struct fee_parameters_type { uint64_t fee = GRAPHENE_BLOCKCHAIN_PRECISION; }; + asset fee; + + /// the bettor who is cancelling the bet + account_id_type bettor_id; + /// the bet being canceled + bet_id_type bet_to_cancel; + + extensions_type extensions; + + account_id_type fee_payer()const { return bettor_id; } + void validate()const; +}; + } } @@ -174,3 +190,6 @@ FC_REFLECT_ENUM( graphene::chain::bet_type, (back)(lay) ) 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)(backer_multiplier)(amount_reserved_for_fees)(back_or_lay)(extensions) ) + +FC_REFLECT( graphene::chain::bet_cancel_operation::fee_parameters_type, (fee) ) +FC_REFLECT( graphene::chain::bet_cancel_operation, (bettor_id) (bet_to_cancel) (extensions) ) diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index b973c1ed..14fa20c1 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -103,7 +103,8 @@ namespace graphene { namespace chain { event_create_operation, betting_market_group_create_operation, betting_market_create_operation, - bet_place_operation + bet_place_operation, + bet_cancel_operation > operation; /// @} // operations group diff --git a/libraries/chain/protocol/betting_market.cpp b/libraries/chain/protocol/betting_market.cpp index bd6c4593..b0578c53 100644 --- a/libraries/chain/protocol/betting_market.cpp +++ b/libraries/chain/protocol/betting_market.cpp @@ -45,6 +45,12 @@ void bet_place_operation::validate() const FC_ASSERT( fee.amount >= 0 ); } +void bet_cancel_operation::validate() const +{ + FC_ASSERT( fee.amount >= 0 ); +} + + } } // graphene::chain diff --git a/libraries/fc b/libraries/fc index 9d408aa5..57d14c7d 160000 --- a/libraries/fc +++ b/libraries/fc @@ -1 +1 @@ -Subproject commit 9d408aa53267834542279490eac4c25878107967 +Subproject commit 57d14c7de849c567d753fc5cab5465d68602ff95