From 4b0579b475c4efb75e0e054ae7791afb4217358c Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 21 Oct 2017 13:11:21 +0200 Subject: [PATCH] Fixed #429 --- libraries/chain/asset_evaluator.cpp | 12 +++++++++++- libraries/chain/hardfork.d/CORE_429.hf | 4 ++++ .../include/graphene/chain/asset_evaluator.hpp | 2 ++ tests/tests/fee_tests.cpp | 17 +++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 libraries/chain/hardfork.d/CORE_429.hf diff --git a/libraries/chain/asset_evaluator.cpp b/libraries/chain/asset_evaluator.cpp index 91da528d..8103e2b5 100644 --- a/libraries/chain/asset_evaluator.cpp +++ b/libraries/chain/asset_evaluator.cpp @@ -121,17 +121,27 @@ void_result asset_create_evaluator::do_evaluate( const asset_create_operation& o void asset_create_evaluator::pay_fee() { + fee_is_odd = core_fee_paid.value & 1; core_fee_paid -= core_fee_paid.value/2; generic_evaluator::pay_fee(); } object_id_type asset_create_evaluator::do_apply( const asset_create_operation& op ) { try { + bool hf_429 = fee_is_odd && db().head_block_time() > HARDFORK_CORE_429_TIME; + const asset_dynamic_data_object& dyn_asset = db().create( [&]( asset_dynamic_data_object& a ) { a.current_supply = 0; - a.fee_pool = core_fee_paid; //op.calculate_fee(db().current_fee_schedule()).value / 2; + a.fee_pool = core_fee_paid - (hf_429 ? 1 : 0); }); + if( fee_is_odd && !hf_429 ) + { + const auto& core_dd = db().get( asset_id_type() ).dynamic_data( db() ); + db().modify( core_dd, [=]( asset_dynamic_data_object& dd ) { + dd.current_supply++; + }); + } asset_bitasset_data_id_type bit_asset_id; if( op.bitasset_opts.valid() ) diff --git a/libraries/chain/hardfork.d/CORE_429.hf b/libraries/chain/hardfork.d/CORE_429.hf new file mode 100644 index 00000000..748f10f9 --- /dev/null +++ b/libraries/chain/hardfork.d/CORE_429.hf @@ -0,0 +1,4 @@ +// bitshares-core #429 rounding issue when creating assets +#ifndef HARDFORK_CORE_429_TIME +#define HARDFORK_CORE_429_TIME (fc::time_point_sec( 1511793600 )) +#endif diff --git a/libraries/chain/include/graphene/chain/asset_evaluator.hpp b/libraries/chain/include/graphene/chain/asset_evaluator.hpp index 26605a4f..27fb1aa2 100644 --- a/libraries/chain/include/graphene/chain/asset_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/asset_evaluator.hpp @@ -40,6 +40,8 @@ namespace graphene { namespace chain { * post the fee to fee_paying_account_stats.pending_fees */ virtual void pay_fee() override; + private: + bool fee_is_odd; }; class asset_issue_evaluator : public evaluator diff --git a/tests/tests/fee_tests.cpp b/tests/tests/fee_tests.cpp index f5545232..affa1bff 100644 --- a/tests/tests/fee_tests.cpp +++ b/tests/tests/fee_tests.cpp @@ -990,6 +990,23 @@ BOOST_AUTO_TEST_CASE( issue_429_test ) } verify_asset_supplies( db ); + + generate_blocks( HARDFORK_CORE_429_TIME + 10 ); + + { + signed_transaction tx; + asset_create_operation op; + op.issuer = alice_id; + op.symbol = "ALICE.ODDER"; + op.common_options.core_exchange_rate = asset( 1 ) / asset( 1, asset_id_type( 1 ) ); + op.fee = asset((fees_to_pay.long_symbol + fees_to_pay.price_per_kbyte) | 1); + tx.operations.push_back( op ); + set_expiration( db, tx ); + sign( tx, alice_private_key ); + PUSH_TX( db, tx ); + } + + verify_asset_supplies( db ); } catch( const fc::exception& e ) {