From bba56817222cf3528ee81d0e1e008bb93b945a6c Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Thu, 18 Jun 2015 17:05:12 -0400 Subject: [PATCH] Resolve #31, at last I'm now satisfied with the testing. --- libraries/chain/account_object.cpp | 10 +++++++ libraries/chain/db_maint.cpp | 8 +++++ .../chain/include/graphene/chain/database.hpp | 8 ----- tests/common/database_fixture.cpp | 4 +-- tests/tests/fee_tests.cpp | 30 +++++++++++++++++-- 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/libraries/chain/account_object.cpp b/libraries/chain/account_object.cpp index 37f07785..b8de41de 100644 --- a/libraries/chain/account_object.cpp +++ b/libraries/chain/account_object.cpp @@ -78,6 +78,16 @@ void account_statistics_object::process_fees(const account_object& a, database& auto pay_out_fees = [&](const account_object& account, share_type core_fee_total, bool require_vesting) { + // Check the referrer and registrar -- if they're no longer members, pay up to the lifetime member instead. + if( account.referrer(d).is_basic_account(d.head_block_time()) ) + d.modify(account, [](account_object& a) { + a.referrer = a.lifetime_referrer; + }); + if( account.registrar(d).is_basic_account(d.head_block_time()) ) + d.modify(account, [](account_object& a) { + a.registrar = a.lifetime_referrer; + }); + share_type network_cut = cut_fee(core_fee_total, account.network_fee_percentage); assert( network_cut <= core_fee_total ); share_type burned = cut_fee(network_cut, props.parameters.burn_percent_of_fee); diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 89d8b1b9..5c019c4d 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -50,6 +50,14 @@ vector> database::sort_votable_objects( return refs; } +template +void database::perform_account_maintenance(std::tuple helpers) +{ + const auto& idx = get_index_type().indices(); + for( const account_object& a : idx ) + detail::for_each(helpers, a, detail::gen_seq()); +} + void database::pay_workers( share_type& budget ) { // ilog("Processing payroll! Available budget is ${b}", ("b", budget)); diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 36b906be..caa909b2 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -498,14 +498,6 @@ namespace graphene { namespace chain { (void)l; } } - template - void database::perform_account_maintenance(std::tuple helpers) - { - const auto& idx = get_index_type().indices(); - for( const account_object& a : idx ) - detail::for_each(helpers, a, detail::gen_seq()); - } - } } FC_REFLECT(graphene::chain::genesis_state_type::allocation_target_type, (name)(addr)(weight)) diff --git a/tests/common/database_fixture.cpp b/tests/common/database_fixture.cpp index 06b09106..a44a73b0 100644 --- a/tests/common/database_fixture.cpp +++ b/tests/common/database_fixture.cpp @@ -628,9 +628,9 @@ void database_fixture::update_feed_producers( const asset_object& mia, flat_set< op.asset_to_update = mia.id; op.issuer = mia.issuer; op.new_feed_producers = std::move(producers); - trx.operations.emplace_back( std::move(op) ); + trx.operations = {std::move(op)}; - for( auto& op : trx.operations ) op.visit( operation_set_fee( db.current_fee_schedule() ) ); + trx.visit(operation_set_fee(db.current_fee_schedule())); trx.validate(); db.push_transaction(trx, ~0); trx.operations.clear(); diff --git a/tests/tests/fee_tests.cpp b/tests/tests/fee_tests.cpp index b98c9930..aa24b0ef 100644 --- a/tests/tests/fee_tests.cpp +++ b/tests/tests/fee_tests.cpp @@ -95,13 +95,39 @@ BOOST_AUTO_TEST_CASE( cashback_test ) CustomRegisterActor(pleb, reggie, stud, 95); CustomRegisterActor(scud, stud, ann, 80); - generate_block(); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time, true); + generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); + enable_fees(10000); BOOST_CHECK_EQUAL(life_id(db).cashback_balance(db).balance.amount.value, 78000); BOOST_CHECK_EQUAL(reggie_id(db).cashback_balance(db).balance.amount.value, 34000); BOOST_CHECK_EQUAL(ann_id(db).cashback_balance(db).balance.amount.value, 40000); BOOST_CHECK_EQUAL(stud_id(db).cashback_balance(db).balance.amount.value, 8000); + + transfer(stud_id, scud_id, asset(500000)); + transfer(scud_id, pleb_id, asset(400000)); + transfer(pleb_id, dumy_id, asset(300000)); + transfer(dumy_id, reggie_id, asset(200000)); + + generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); + + BOOST_CHECK_EQUAL(life_id(db).cashback_balance(db).balance.amount.value, 87750); + BOOST_CHECK_EQUAL(reggie_id(db).cashback_balance(db).balance.amount.value, 35500); + BOOST_CHECK_EQUAL(ann_id(db).cashback_balance(db).balance.amount.value, 44000); + BOOST_CHECK_EQUAL(stud_id(db).cashback_balance(db).balance.amount.value, 24750); + + generate_blocks(ann_id(db).membership_expiration_date); + generate_block(); + enable_fees(10000); + + //ann's membership has expired, so scud's fee should go up to life instead. + transfer(scud_id, pleb_id, asset(10)); + + generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); + + BOOST_CHECK_EQUAL(life_id(db).cashback_balance(db).balance.amount.value, 94750); + BOOST_CHECK_EQUAL(reggie_id(db).cashback_balance(db).balance.amount.value, 35500); + BOOST_CHECK_EQUAL(ann_id(db).cashback_balance(db).balance.amount.value, 44000); + BOOST_CHECK_EQUAL(stud_id(db).cashback_balance(db).balance.amount.value, 25750); } FC_LOG_AND_RETHROW() } BOOST_AUTO_TEST_SUITE_END()