From 46ef911f8ec2454ea00507dabc843a994b1fc842 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Tue, 21 Mar 2017 19:47:57 -0400 Subject: [PATCH] Add more checks when placing bets --- libraries/chain/betting_market_evaluator.cpp | 15 ++++++++++++--- .../graphene/chain/betting_market_evaluator.hpp | 4 ++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/libraries/chain/betting_market_evaluator.cpp b/libraries/chain/betting_market_evaluator.cpp index 0087d63a..fd5e6723 100644 --- a/libraries/chain/betting_market_evaluator.cpp +++ b/libraries/chain/betting_market_evaluator.cpp @@ -94,10 +94,15 @@ 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 { - 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" ); + const database& d = db(); - const chain_parameters& current_params = db().get_global_properties().parameters; + _betting_market = &op.betting_market_id(d); + _betting_market_group = &_betting_market->group_id(d); + _asset = &_betting_market->asset_id(d); + + FC_ASSERT( is_authorized_asset( d, *fee_paying_account, *_asset ) ); + + const chain_parameters& current_params = d.get_global_properties().parameters; FC_ASSERT( op.backer_multiplier >= current_params.min_bet_multiplier && op.backer_multiplier <= current_params.max_bet_multiplier, "Bet odds are outside the blockchain's limits" ); @@ -113,6 +118,10 @@ void_result bet_place_evaluator::do_evaluate(const bet_place_operation& op) FC_ASSERT(op.backer_multiplier % allowed_increment == 0, "Bet odds must be a multiple of ${allowed_increment}", ("allowed_increment", allowed_increment)); } + share_type stake_plus_fees = op.amount_to_bet + op.amount_reserved_for_fees; + FC_ASSERT( d.get_balance( *fee_paying_account, *_asset ).amount >= stake_plus_fees, "insufficient balance", + ("balance", d.get_balance(*fee_paying_account, *_asset))("stake_plus_fees", stake_plus_fees) ); + return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } diff --git a/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp b/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp index a8099655..ba9fb589 100644 --- a/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/betting_market_evaluator.hpp @@ -58,6 +58,10 @@ namespace graphene { namespace chain { void_result do_evaluate( const bet_place_operation& o ); object_id_type do_apply( const bet_place_operation& o ); + private: + const betting_market_group_object* _betting_market_group; + const betting_market_object* _betting_market; + const asset_object* _asset; }; } } // graphene::chain