fee_tests.cpp: Make sure validation actually enforces nonzero fees
This commit is contained in:
parent
dffd010e8a
commit
96fb8f60c2
3 changed files with 45 additions and 1 deletions
|
|
@ -16,6 +16,7 @@
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <graphene/chain/exceptions.hpp>
|
||||||
#include <graphene/chain/protocol/operations.hpp>
|
#include <graphene/chain/protocol/operations.hpp>
|
||||||
|
|
||||||
namespace graphene { namespace chain {
|
namespace graphene { namespace chain {
|
||||||
|
|
@ -190,7 +191,8 @@ namespace graphene { namespace chain {
|
||||||
const auto& op = o.get<typename DerivedEvaluator::operation_type>();
|
const auto& op = o.get<typename DerivedEvaluator::operation_type>();
|
||||||
|
|
||||||
prepare_fee(op.fee_payer(), op.fee);
|
prepare_fee(op.fee_payer(), op.fee);
|
||||||
FC_ASSERT( core_fee_paid >= db().current_fee_schedule().calculate_fee( op ).amount,
|
GRAPHENE_ASSERT( core_fee_paid >= db().current_fee_schedule().calculate_fee( op ).amount,
|
||||||
|
insufficient_fee,
|
||||||
"Insufficient Fee Paid",
|
"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",db().current_fee_schedule().calculate_fee( op ).amount) );
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,7 @@ namespace graphene { namespace chain {
|
||||||
FC_DECLARE_DERIVED_EXCEPTION( tx_irrelevant_sig, graphene::chain::transaction_exception, 3030004, "irrelevant signature included" )
|
FC_DECLARE_DERIVED_EXCEPTION( tx_irrelevant_sig, graphene::chain::transaction_exception, 3030004, "irrelevant signature included" )
|
||||||
FC_DECLARE_DERIVED_EXCEPTION( tx_duplicate_sig, graphene::chain::transaction_exception, 3030005, "duplicate signature included" )
|
FC_DECLARE_DERIVED_EXCEPTION( tx_duplicate_sig, graphene::chain::transaction_exception, 3030005, "duplicate signature included" )
|
||||||
FC_DECLARE_DERIVED_EXCEPTION( invalid_committee_approval, graphene::chain::transaction_exception, 3030006, "committee account cannot directly approve transaction" )
|
FC_DECLARE_DERIVED_EXCEPTION( invalid_committee_approval, graphene::chain::transaction_exception, 3030006, "committee account cannot directly approve transaction" )
|
||||||
|
FC_DECLARE_DERIVED_EXCEPTION( insufficient_fee, graphene::chain::transaction_exception, 3030007, "insufficient fee" )
|
||||||
|
|
||||||
FC_DECLARE_DERIVED_EXCEPTION( invalid_pts_address, graphene::chain::utility_exception, 3060001, "invalid pts address" )
|
FC_DECLARE_DERIVED_EXCEPTION( invalid_pts_address, graphene::chain::utility_exception, 3060001, "invalid pts address" )
|
||||||
FC_DECLARE_DERIVED_EXCEPTION( insufficient_feeds, graphene::chain::chain_exception, 37006, "insufficient feeds" )
|
FC_DECLARE_DERIVED_EXCEPTION( insufficient_feeds, graphene::chain::chain_exception, 37006, "insufficient feeds" )
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,50 @@
|
||||||
#include "../common/database_fixture.hpp"
|
#include "../common/database_fixture.hpp"
|
||||||
|
|
||||||
using namespace graphene::chain;
|
using namespace graphene::chain;
|
||||||
|
using namespace graphene::chain::test;
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_SUITE( fee_tests, database_fixture )
|
BOOST_FIXTURE_TEST_SUITE( fee_tests, database_fixture )
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( nonzero_fee_test )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ACTORS((alice)(bob));
|
||||||
|
|
||||||
|
const share_type prec = asset::scaled_precision( asset_id_type()(db).precision );
|
||||||
|
|
||||||
|
// Return number of core shares (times precision)
|
||||||
|
auto _core = [&]( int64_t x ) -> asset
|
||||||
|
{ return asset( x*prec ); };
|
||||||
|
|
||||||
|
transfer( committee_account, alice_id, _core(1000000) );
|
||||||
|
|
||||||
|
// make sure the database requires our fee to be nonzero
|
||||||
|
enable_fees();
|
||||||
|
|
||||||
|
signed_transaction tx;
|
||||||
|
transfer_operation xfer_op;
|
||||||
|
xfer_op.from = alice_id;
|
||||||
|
xfer_op.to = bob_id;
|
||||||
|
xfer_op.amount = _core(1000);
|
||||||
|
xfer_op.fee = _core(0);
|
||||||
|
tx.operations.push_back( xfer_op );
|
||||||
|
set_expiration( db, tx );
|
||||||
|
sign( tx, alice_private_key );
|
||||||
|
GRAPHENE_REQUIRE_THROW( PUSH_TX( db, tx ), insufficient_fee );
|
||||||
|
}
|
||||||
|
catch( const fc::exception& e )
|
||||||
|
{
|
||||||
|
edump((e.to_detail_string()));
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////
|
||||||
|
// cashback_test infrastructure //
|
||||||
|
///////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#define CHECK_BALANCE( actor_name, amount ) \
|
#define CHECK_BALANCE( actor_name, amount ) \
|
||||||
BOOST_CHECK_EQUAL( get_balance( actor_name ## _id, asset_id_type() ), amount )
|
BOOST_CHECK_EQUAL( get_balance( actor_name ## _id, asset_id_type() ), amount )
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue