operation_result database::apply_operation(transaction_evaluation_state& eval_state, const operation& op) { try { int i_which = op.which(); uint64_t u_which = uint64_t( i_which ); FC_ASSERT( i_which >= 0, "Negative operation tag in operation ${op}", ("op",op) ); FC_ASSERT( u_which < _operation_evaluators.size(), "No registered evaluator for operation ${op}", ("op",op) ); unique_ptr<op_evaluator>& eval = _operation_evaluators[ u_which ]; FC_ASSERT( eval, "No registered evaluator for operation ${op}", ("op",op) ); auto op_id = push_applied_operation( op ); auto result = eval->evaluate( eval_state, op, true ); set_applied_operation_result( op_id, result ); return result; } FC_CAPTURE_AND_RETHROW( (op) ) }
asset fee_schedule::calculate_fee( const operation& op, const price& core_exchange_rate )const { //idump( (op)(core_exchange_rate) ); fee_parameters params; params.set_which(op.which()); auto itr = parameters.find(params); if( itr != parameters.end() ) params = *itr; auto base_value = op.visit( calc_fee_visitor( params ) ); auto scaled = fc::uint128(base_value) * scale; scaled /= GRAPHENE_100_PERCENT; FC_ASSERT( scaled <= GRAPHENE_MAX_SHARE_SUPPLY ); auto result = asset( scaled.to_uint64(), 0 ) * core_exchange_rate; FC_ASSERT( result.amount <= GRAPHENE_MAX_SHARE_SUPPLY ); return result; }
operation_result database::apply_operation(transaction_evaluation_state& eval_state, const operation& op) { try { int i_which = op.which(); uint64_t u_which = uint64_t( i_which ); if( i_which < 0 ) assert( "Negative operation tag" && false ); if( u_which >= _operation_evaluators.size() ) assert( "No registered evaluator for this operation" && false ); unique_ptr<op_evaluator>& eval = _operation_evaluators[ u_which ]; if( !eval ) assert( "No registered evaluator for this operation" && false ); auto op_id = push_applied_operation( op ); auto result = eval->evaluate( eval_state, op, true ); set_applied_operation_result( op_id, result ); return result; } FC_CAPTURE_AND_RETHROW( (op) ) }
calc_fee_visitor( const fee_schedule& p, const operation& op ):param(p),current_op(op.which()){}