From 59c64efb5a85082aea3570931af648d3c3c674bf Mon Sep 17 00:00:00 2001 From: Roman Olearski Date: Sat, 26 Nov 2016 16:03:33 +0100 Subject: [PATCH] solution ...issues/#10 avoid generating dividend_payout virtual operations for zero-size payouts --- libraries/chain/db_maint.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index d83b68e0..2cb012e1 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -964,9 +964,10 @@ void schedule_pending_dividend_balances(database& db, } for (const auto& pending_payout : pending_payout_balance_index.indices()) - dlog("Pending payout: ${account_name} -> ${amount}", - ("account_name", pending_payout.owner(db).name) - ("amount", asset(pending_payout.pending_balance, pending_payout.dividend_payout_asset_type))); + if (pending_payout.pending_balance.value) + dlog("Pending payout: ${account_name} -> ${amount}", + ("account_name", pending_payout.owner(db).name) + ("amount", asset(pending_payout.pending_balance, pending_payout.dividend_payout_asset_type))); dlog("Remaining balance not paid out: ${amount}", ("amount", asset(remaining_amount_to_distribute, payout_asset_type))); @@ -1118,7 +1119,7 @@ void process_dividend_assets(database& db) { const pending_dividend_payout_balance_for_holder_object& pending_balance_object = *pending_balance_object_iter; - if (last_holder_account_id && *last_holder_account_id != pending_balance_object.owner) + if (last_holder_account_id && *last_holder_account_id != pending_balance_object.owner && payouts_for_this_holder.size()) { // we've moved on to a new account, generate the dividend payment virtual op for the previous one db.push_applied_operation(asset_dividend_distribution_operation(dividend_holder_asset_obj.id, @@ -1130,14 +1131,15 @@ void process_dividend_assets(database& db) } - if (is_authorized_asset(db, pending_balance_object.owner(db), pending_balance_object.dividend_payout_asset_type(db)) && + if (pending_balance_object.pending_balance.value && + is_authorized_asset(db, pending_balance_object.owner(db), pending_balance_object.dividend_payout_asset_type(db)) && is_asset_approved_for_distribution_account(pending_balance_object.dividend_payout_asset_type)) { dlog("Processing payout of ${asset} to account ${account}", ("asset", asset(pending_balance_object.pending_balance, pending_balance_object.dividend_payout_asset_type)) ("account", pending_balance_object.owner(db).name)); - db.adjust_balance(pending_balance_object.owner, + db.adjust_balance(pending_balance_object.owner, asset(pending_balance_object.pending_balance, pending_balance_object.dividend_payout_asset_type)); payouts_for_this_holder.insert(asset(pending_balance_object.pending_balance, @@ -1153,7 +1155,7 @@ void process_dividend_assets(database& db) ++pending_balance_object_iter; } // we will always be left with the last holder's data, generate the virtual op for it now. - if (last_holder_account_id) + if (last_holder_account_id && payouts_for_this_holder.size()) { // we've moved on to a new account, generate the dividend payment virtual op for the previous one db.push_applied_operation(asset_dividend_distribution_operation(dividend_holder_asset_obj.id,