diff --git a/rai/core_test/block_store.cpp b/rai/core_test/block_store.cpp index 806e0297..8b548b8a 100644 --- a/rai/core_test/block_store.cpp +++ b/rai/core_test/block_store.cpp @@ -630,7 +630,7 @@ TEST (block_store, upgrade_v2_v3) rai::ledger ledger (store); rai::transaction transaction (store.environment, nullptr, true); ASSERT_TRUE (!init); - ASSERT_EQ (3, store.version_get (transaction)); + ASSERT_LT (2, store.version_get (transaction)); ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key1.pub)); ASSERT_EQ (0, ledger.weight (transaction, key2.pub)); rai::account_info info; @@ -659,6 +659,7 @@ TEST (block_store, upgrade_v3_v4) rai::ledger ledger (store); rai::transaction transaction (store.environment, nullptr, true); ASSERT_FALSE (init); + ASSERT_LT (3, store.version_get (transaction)); rai::pending_key key (key2.pub, key3.pub); rai::pending_info info; auto error (store.pending_get (transaction, key, info)); diff --git a/rai/core_test/ledger.cpp b/rai/core_test/ledger.cpp index 9c6c27dd..3f811ee7 100644 --- a/rai/core_test/ledger.cpp +++ b/rai/core_test/ledger.cpp @@ -109,6 +109,7 @@ TEST (ledger, process_send) ASSERT_EQ (rai::test_genesis_key.pub, return1.account); ASSERT_EQ (rai::genesis_amount - 50, return1.amount.number ()); ASSERT_EQ (50, ledger.account_balance (transaction, rai::test_genesis_key.pub)); + ASSERT_EQ (rai::genesis_amount - 50, ledger.account_pending (transaction, key2.pub)); rai::account_info info2; ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info2)); auto latest6 (store.block_get (transaction, info2.head)); @@ -127,6 +128,7 @@ TEST (ledger, process_send) ASSERT_EQ (rai::genesis_amount - 50, return2.amount.number ()); ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash2)); ASSERT_EQ (rai::genesis_amount - 50, ledger.account_balance (transaction, key2.pub)); + ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub)); ASSERT_EQ (50, ledger.weight (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (rai::genesis_amount - 50, ledger.weight (transaction, key2.pub)); rai::account_info info3; @@ -152,6 +154,7 @@ TEST (ledger, process_send) ASSERT_EQ (rai::test_genesis_key.pub, pending1.source); ASSERT_EQ (rai::genesis_amount - 50, pending1.amount.number ()); ASSERT_EQ (0, ledger.account_balance (transaction, key2.pub)); + ASSERT_EQ (rai::genesis_amount - 50, ledger.account_pending (transaction, key2.pub)); ASSERT_EQ (50, ledger.account_balance (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (50, ledger.weight (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (0, ledger.weight (transaction, key2.pub)); @@ -168,6 +171,7 @@ TEST (ledger, process_send) rai::pending_info pending2; ASSERT_TRUE (ledger.store.pending_get (transaction, rai::pending_key (key2.pub, hash1), pending2)); ASSERT_EQ (rai::genesis_amount, ledger.account_balance (transaction, rai::test_genesis_key.pub)); + ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub)); } TEST (ledger, process_receive) @@ -208,6 +212,7 @@ TEST (ledger, process_receive) ASSERT_EQ (25, return2.amount.number ()); ASSERT_EQ (hash4, ledger.latest (transaction, key2.pub)); ASSERT_EQ (25, ledger.account_balance (transaction, rai::test_genesis_key.pub)); + ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub)); ASSERT_EQ (rai::genesis_amount - 25, ledger.account_balance (transaction, key2.pub)); ASSERT_EQ (rai::genesis_amount - 25, ledger.weight (transaction, key3.pub)); ledger.rollback (transaction, hash4); @@ -215,6 +220,7 @@ TEST (ledger, process_receive) ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash2)); ASSERT_TRUE (store.frontier_get (transaction, hash4).is_zero ()); ASSERT_EQ (25, ledger.account_balance (transaction, rai::test_genesis_key.pub)); + ASSERT_EQ (25, ledger.account_pending (transaction, key2.pub)); ASSERT_EQ (rai::genesis_amount - 50, ledger.account_balance (transaction, key2.pub)); ASSERT_EQ (rai::genesis_amount - 50, ledger.weight (transaction, key3.pub)); ASSERT_EQ (hash2, ledger.latest (transaction, key2.pub)); diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index df401f7d..eaafc45a 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -79,6 +79,8 @@ TEST (rpc, account_balance) ASSERT_EQ (200, response.status); std::string balance_text (response.json.get ("balance")); ASSERT_EQ ("340282366920938463463374607431768211455", balance_text); + std::string pending_text (response.json.get ("pending")); + ASSERT_EQ ("0", pending_text); } TEST (rpc, account_create) @@ -1273,7 +1275,7 @@ TEST (rpc, version) ASSERT_EQ (200, response1.status); ASSERT_EQ ("1", response1.json.get ("rpc_version")); ASSERT_EQ (200, response1.status); - ASSERT_EQ ("2", response1.json.get ("store_version")); + ASSERT_EQ ("4", response1.json.get ("store_version")); ASSERT_EQ (boost::str (boost::format ("RaiBlocks %1%.%2%.%3%") % RAIBLOCKS_VERSION_MAJOR % RAIBLOCKS_VERSION_MINOR % RAIBLOCKS_VERSION_PATCH), response1.json.get ("node_vendor")); auto & headers (response1.headers); auto access_control (std::find_if (headers.begin (), headers.end (), [] (decltype (*headers.begin ()) & header_a) { return boost::iequals (header_a.first, "Access-Control-Allow-Origin"); })); diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 2a323192..7207755e 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1360,6 +1360,15 @@ rai::uint128_t rai::node::balance (rai::account const & account_a) return ledger.account_balance (transaction, account_a); } +std::pair rai::node::balance_pending (rai::account const & account_a) +{ + std::pair result; + rai::transaction transaction (store.environment, nullptr, false); + result.first = ledger.account_balance (transaction, account_a); + result.second = ledger.account_pending (transaction, account_a); + return result; +} + rai::uint128_t rai::node::weight (rai::account const & account_a) { rai::transaction transaction (store.environment, nullptr, false); diff --git a/rai/node/node.hpp b/rai/node/node.hpp index 2d84fc3b..4cbf140c 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -354,6 +354,7 @@ public: void keepalive_preconfigured (std::vector const &); rai::block_hash latest (rai::account const &); rai::uint128_t balance (rai::account const &); + std::pair balance_pending (rai::account const &); rai::uint128_t weight (rai::account const &); rai::account representative (rai::account const &); void ongoing_keepalive (); diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 502568e7..83121629 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -141,9 +141,10 @@ void rai::rpc_handler::account_balance () auto error (account.decode_account (account_text)); if (!error) { - auto balance (rpc.node.balance (account)); + auto balance (rpc.node.balance_pending (account)); boost::property_tree::ptree response_l; - response_l.put ("balance", balance.convert_to ()); + response_l.put ("balance", balance.first.convert_to ()); + response_l.put ("pending", balance.second.convert_to ()); rpc.send_response (response, response_l); } else diff --git a/rai/secure.cpp b/rai/secure.cpp index b7773606..fc36cc55 100644 --- a/rai/secure.cpp +++ b/rai/secure.cpp @@ -2725,6 +2725,18 @@ rai::uint128_t rai::ledger::account_balance (MDB_txn * transaction_a, rai::accou return result; } +rai::uint128_t rai::ledger::account_pending (MDB_txn * transaction_a, rai::account const & account_a) +{ + rai::uint128_t result (0); + rai::account end (account_a.number () + 1); + for (auto i (store.pending_begin (transaction_a, rai::pending_key (account_a, 0))), n (store.pending_begin (transaction_a, rai::pending_key (end, 0))); i != n; ++i) + { + rai::pending_info info (i->second); + result += info.amount.number (); + } + return result; +} + rai::process_return rai::ledger::process (MDB_txn * transaction_a, rai::block const & block_a) { ledger_processor processor (*this, transaction_a); diff --git a/rai/secure.hpp b/rai/secure.hpp index 5648e343..1ed7b7a9 100644 --- a/rai/secure.hpp +++ b/rai/secure.hpp @@ -469,6 +469,7 @@ public: rai::uint128_t amount (MDB_txn *, rai::block_hash const &); rai::uint128_t balance (MDB_txn *, rai::block_hash const &); rai::uint128_t account_balance (MDB_txn *, rai::account const &); + rai::uint128_t account_pending (MDB_txn *, rai::account const &); rai::uint128_t weight (MDB_txn *, rai::account const &); std::unique_ptr successor (MDB_txn *, rai::block_hash const &); std::unique_ptr forked_block (MDB_txn *, rai::block const &);