diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index c5b6d5056..230638b71 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -4238,7 +4238,7 @@ void nano::json_handler::unopened () { auto count (count_optional_impl ()); auto threshold (threshold_optional_impl ()); - nano::account start (1); // exclude burn account by default + nano::account start{ 1 }; // exclude burn account by default boost::optional account_text (request.get_optional ("account")); if (account_text.is_initialized ()) { @@ -4246,48 +4246,28 @@ void nano::json_handler::unopened () } if (!ec) { - auto transaction (node.store.tx_begin_read ()); - auto iterator (node.store.pending.begin (transaction, nano::pending_key (start, 0))); - auto end (node.store.pending.end ()); - nano::account current_account (start); - nano::uint128_t current_account_sum{ 0 }; + auto transaction = node.store.tx_begin_read (); + auto & ledger = node.ledger; boost::property_tree::ptree accounts; - while (iterator != end && accounts.size () < count) + for (auto iterator = ledger.receivable_upper_bound (transaction, start, 0), end = ledger.receivable_end (); iterator != end && accounts.size () < count;) { - nano::pending_key key (iterator->first); - nano::account account (key.account); - nano::pending_info info (iterator->second); - if (node.store.account.exists (transaction, account)) + auto const & [key, info] = *iterator; + nano::account account = key.account; + if (!node.store.account.exists (transaction, account)) { - if (account.number () == std::numeric_limits::max ()) + nano::uint128_t current_account_sum{ 0 }; + while (iterator != end) { - break; + auto const & [key, info] = *iterator; + current_account_sum += info.amount.number (); + ++iterator; } - // Skip existing accounts - iterator = node.store.pending.begin (transaction, nano::pending_key (account.number () + 1, 0)); - } - else - { - if (account != current_account) + if (current_account_sum >= threshold.number ()) { - if (current_account_sum > 0) - { - if (current_account_sum >= threshold.number ()) - { - accounts.put (current_account.to_account (), current_account_sum.convert_to ()); - } - current_account_sum = 0; - } - current_account = account; + accounts.put (account.to_account (), current_account_sum.convert_to ()); } - current_account_sum += info.amount.number (); - ++iterator; } - } - // last one after iterator reaches end - if (accounts.size () < count && current_account_sum > 0 && current_account_sum >= threshold.number ()) - { - accounts.put (current_account.to_account (), current_account_sum.convert_to ()); + iterator = ledger.receivable_upper_bound (transaction, account); } response_l.add_child ("accounts", accounts); }