aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstoffu <stoffu@protonmail.ch>2019-02-18 11:59:14 +0900
committerstoffu <stoffu@protonmail.ch>2019-02-20 14:23:36 +0900
commit3d2772a0d62e858997af5d42efbdc42db4ecbed2 (patch)
treeb304686e9d96b21a1327b1efde34bd6362c7f685
parentMerge pull request #4988 (diff)
downloadmonero-3d2772a0d62e858997af5d42efbdc42db4ecbed2.tar.xz
wallet-rpc: get balance for all accounts and subaddresses
-rw-r--r--src/wallet/wallet_rpc_server.cpp64
-rw-r--r--src/wallet/wallet_rpc_server_commands_defs.h6
2 files changed, 49 insertions, 21 deletions
diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp
index c87c2fca6..d783c0c41 100644
--- a/src/wallet/wallet_rpc_server.cpp
+++ b/src/wallet/wallet_rpc_server.cpp
@@ -337,30 +337,54 @@ namespace tools
if (!m_wallet) return not_open(er);
try
{
- res.balance = m_wallet->balance(req.account_index);
- res.unlocked_balance = m_wallet->unlocked_balance(req.account_index);
+ res.balance = req.all_accounts ? m_wallet->balance_all() : m_wallet->balance(req.account_index);
+ res.unlocked_balance = req.all_accounts ? m_wallet->unlocked_balance_all() : m_wallet->unlocked_balance(req.account_index);
res.multisig_import_needed = m_wallet->multisig() && m_wallet->has_multisig_partial_key_images();
- std::map<uint32_t, uint64_t> balance_per_subaddress = m_wallet->balance_per_subaddress(req.account_index);
- std::map<uint32_t, uint64_t> unlocked_balance_per_subaddress = m_wallet->unlocked_balance_per_subaddress(req.account_index);
- std::vector<tools::wallet2::transfer_details> transfers;
- m_wallet->get_transfers(transfers);
- std::set<uint32_t> address_indices = req.address_indices;
- if (address_indices.empty())
+ std::map<uint32_t, std::map<uint32_t, uint64_t>> balance_per_subaddress_per_account;
+ std::map<uint32_t, std::map<uint32_t, uint64_t>> unlocked_balance_per_subaddress_per_account;
+ if (req.all_accounts)
{
- for (const auto& i : balance_per_subaddress)
- address_indices.insert(i.first);
+ for (uint32_t account_index = 0; account_index < m_wallet->get_num_subaddress_accounts(); ++account_index)
+ {
+ balance_per_subaddress_per_account[account_index] = m_wallet->balance_per_subaddress(account_index);
+ unlocked_balance_per_subaddress_per_account[account_index] = m_wallet->unlocked_balance_per_subaddress(account_index);
+ }
}
- for (uint32_t i : address_indices)
+ else
{
- wallet_rpc::COMMAND_RPC_GET_BALANCE::per_subaddress_info info;
- info.address_index = i;
- cryptonote::subaddress_index index = {req.account_index, info.address_index};
- info.address = m_wallet->get_subaddress_as_str(index);
- info.balance = balance_per_subaddress[i];
- info.unlocked_balance = unlocked_balance_per_subaddress[i];
- info.label = m_wallet->get_subaddress_label(index);
- info.num_unspent_outputs = std::count_if(transfers.begin(), transfers.end(), [&](const tools::wallet2::transfer_details& td) { return !td.m_spent && td.m_subaddr_index == index; });
- res.per_subaddress.push_back(info);
+ balance_per_subaddress_per_account[req.account_index] = m_wallet->balance_per_subaddress(req.account_index);
+ unlocked_balance_per_subaddress_per_account[req.account_index] = m_wallet->unlocked_balance_per_subaddress(req.account_index);
+ }
+ std::vector<tools::wallet2::transfer_details> transfers;
+ m_wallet->get_transfers(transfers);
+ for (const auto& p : balance_per_subaddress_per_account)
+ {
+ uint32_t account_index = p.first;
+ std::map<uint32_t, uint64_t> balance_per_subaddress = p.second;
+ std::map<uint32_t, uint64_t> unlocked_balance_per_subaddress = unlocked_balance_per_subaddress_per_account[account_index];
+ std::set<uint32_t> address_indices;
+ if (!req.all_accounts && !req.address_indices.empty())
+ {
+ address_indices = req.address_indices;
+ }
+ else
+ {
+ for (const auto& i : balance_per_subaddress)
+ address_indices.insert(i.first);
+ }
+ for (uint32_t i : address_indices)
+ {
+ wallet_rpc::COMMAND_RPC_GET_BALANCE::per_subaddress_info info;
+ info.account_index = account_index;
+ info.address_index = i;
+ cryptonote::subaddress_index index = {info.account_index, info.address_index};
+ info.address = m_wallet->get_subaddress_as_str(index);
+ info.balance = balance_per_subaddress[i];
+ info.unlocked_balance = unlocked_balance_per_subaddress[i];
+ info.label = m_wallet->get_subaddress_label(index);
+ info.num_unspent_outputs = std::count_if(transfers.begin(), transfers.end(), [&](const tools::wallet2::transfer_details& td) { return !td.m_spent && td.m_subaddr_index == index; });
+ res.per_subaddress.emplace_back(std::move(info));
+ }
}
}
catch (const std::exception& e)
diff --git a/src/wallet/wallet_rpc_server_commands_defs.h b/src/wallet/wallet_rpc_server_commands_defs.h
index f0c1a4e9d..324856d44 100644
--- a/src/wallet/wallet_rpc_server_commands_defs.h
+++ b/src/wallet/wallet_rpc_server_commands_defs.h
@@ -47,7 +47,7 @@
// advance which version they will stop working with
// Don't go over 32767 for any of these
#define WALLET_RPC_VERSION_MAJOR 1
-#define WALLET_RPC_VERSION_MINOR 7
+#define WALLET_RPC_VERSION_MINOR 8
#define MAKE_WALLET_RPC_VERSION(major,minor) (((major)<<16)|(minor))
#define WALLET_RPC_VERSION MAKE_WALLET_RPC_VERSION(WALLET_RPC_VERSION_MAJOR, WALLET_RPC_VERSION_MINOR)
namespace tools
@@ -63,14 +63,17 @@ namespace wallet_rpc
{
uint32_t account_index;
std::set<uint32_t> address_indices;
+ bool all_accounts;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(account_index)
KV_SERIALIZE(address_indices)
+ KV_SERIALIZE_OPT(all_accounts, false);
END_KV_SERIALIZE_MAP()
};
struct per_subaddress_info
{
+ uint32_t account_index;
uint32_t address_index;
std::string address;
uint64_t balance;
@@ -79,6 +82,7 @@ namespace wallet_rpc
uint64_t num_unspent_outputs;
BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(account_index)
KV_SERIALIZE(address_index)
KV_SERIALIZE(address)
KV_SERIALIZE(balance)