diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index c38bd80b..9cc4285d 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -1,6 +1,6 @@ add_custom_target( build_hardfork_hpp - COMMAND cat-parts hardfork.d "${CMAKE_CURRENT_BINARY_DIR}/include/graphene/chain/hardfork.hpp" ) + COMMAND cat-parts "${CMAKE_CURRENT_SOURCE_DIR}/hardfork.d" "${CMAKE_CURRENT_BINARY_DIR}/include/graphene/chain/hardfork.hpp" ) set_source_files_properties( "${CMAKE_CURRENT_BINARY_DIR}/include/graphene/chain/hardfork.hpp" PROPERTIES GENERATED TRUE ) add_dependencies( build_hardfork_hpp cat-parts ) diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 239e93c6..745578e8 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -34,6 +34,7 @@ #include #include #include +#include namespace graphene { namespace chain { diff --git a/libraries/chain/evaluator.cpp b/libraries/chain/evaluator.cpp index b27d3960..a4127c25 100644 --- a/libraries/chain/evaluator.cpp +++ b/libraries/chain/evaluator.cpp @@ -118,4 +118,14 @@ database& generic_evaluator::db()const { return trx_state->db(); } _fba.accumulated_fba_fees += core_fee_paid; } ); } + + share_type generic_evaluator::calculate_fee_for_operation(const operation& op) const + { + return db().current_fee_schedule().calculate_fee( op ).amount; + } + void generic_evaluator::db_adjust_balance(const account_id_type& fee_payer, asset fee_from_account) + { + db().adjust_balance(fee_payer, fee_from_account); + } + } } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 1f563995..b73b8931 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #pragma once -#include #include #include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include @@ -45,6 +45,8 @@ namespace graphene { namespace chain { using graphene::db::abstract_object; using graphene::db::object; + class op_evaluator; + class transaction_evaluation_state; struct budget_record; diff --git a/libraries/chain/include/graphene/chain/evaluator.hpp b/libraries/chain/include/graphene/chain/evaluator.hpp index 64205b80..af90517e 100644 --- a/libraries/chain/include/graphene/chain/evaluator.hpp +++ b/libraries/chain/include/graphene/chain/evaluator.hpp @@ -102,6 +102,12 @@ namespace graphene { namespace chain { */ void pay_fba_fee( uint64_t fba_id ); + // the next two functions are helpers that allow template functions declared in this + // header to call db() without including database.hpp, which would + // cause a circular dependency + share_type calculate_fee_for_operation(const operation& op) const; + void db_adjust_balance(const account_id_type& fee_payer, asset fee_from_account); + asset fee_from_account; share_type core_fee_paid; const account_object* fee_paying_account = nullptr; @@ -143,10 +149,11 @@ namespace graphene { namespace chain { prepare_fee(op.fee_payer(), op.fee); if( !trx_state->skip_fee_schedule_check ) { - GRAPHENE_ASSERT( core_fee_paid >= db().current_fee_schedule().calculate_fee( op ).amount, + share_type required_fee = calculate_fee_for_operation(op); + GRAPHENE_ASSERT( core_fee_paid >= required_fee, insufficient_fee, "Insufficient Fee Paid", - ("core_fee_paid",core_fee_paid)("required",db().current_fee_schedule().calculate_fee( op ).amount) ); + ("core_fee_paid",core_fee_paid)("required", required_fee) ); } return eval->do_evaluate(op); @@ -162,7 +169,7 @@ namespace graphene { namespace chain { auto result = eval->do_apply(op); - db().adjust_balance(op.fee_payer(), -fee_from_account); + db_adjust_balance(op.fee_payer(), -fee_from_account); return result; } diff --git a/libraries/chain/include/graphene/chain/protocol/ext.hpp b/libraries/chain/include/graphene/chain/protocol/ext.hpp index fda4feee..7e8636f5 100644 --- a/libraries/chain/include/graphene/chain/protocol/ext.hpp +++ b/libraries/chain/include/graphene/chain/protocol/ext.hpp @@ -130,6 +130,7 @@ struct graphene_extension_unpack_visitor template< typename Stream, typename T > void operator>>( Stream& s, graphene::chain::extension& value ) { + value = graphene::chain::extension(); graphene_extension_unpack_visitor vtor( s, value.value ); fc::reflector::visit( vtor ); FC_ASSERT( vtor.count_left == 0 ); // unrecognized extension throws here @@ -168,6 +169,15 @@ struct graphene_extension_from_variant_visitor template< typename T > void from_variant( const fc::variant& var, graphene::chain::extension& value ) { + value = graphene::chain::extension(); + if( var.is_null() ) + return; + if( var.is_array() ) + { + FC_ASSERT( var.size() == 0 ); + return; + } + graphene_extension_from_variant_visitor vtor( var.get_object(), value.value ); fc::reflector::visit( vtor ); FC_ASSERT( vtor.count_left == 0 ); // unrecognized extension throws here diff --git a/libraries/chain/protocol/fee_schedule.cpp b/libraries/chain/protocol/fee_schedule.cpp index dfc87fb3..ab8f6532 100644 --- a/libraries/chain/protocol/fee_schedule.cpp +++ b/libraries/chain/protocol/fee_schedule.cpp @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#include #include #include diff --git a/programs/build_helpers/cat-parts.cpp b/programs/build_helpers/cat-parts.cpp index 0f06d2dc..13e692fe 100644 --- a/programs/build_helpers/cat-parts.cpp +++ b/programs/build_helpers/cat-parts.cpp @@ -62,6 +62,7 @@ int main( int argc, char** argv, char** envp ) } { + boost::filesystem::create_directories(opath.parent_path()); boost::filesystem::ofstream ofs(opath); ofs.write( new_data.c_str(), new_data.length() ); } diff --git a/tests/tests/fee_tests.cpp b/tests/tests/fee_tests.cpp index e6fd6748..984c6fce 100644 --- a/tests/tests/fee_tests.cpp +++ b/tests/tests/fee_tests.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include