diff options
author | Jon Atack <jon@atack.com> | 2020-04-12 21:28:19 +0200 |
---|---|---|
committer | Jon Atack <jon@atack.com> | 2020-05-21 10:24:20 +0200 |
commit | 9f01849a498a70616506bdcda8ce6897aa29e664 (patch) | |
tree | 602e5eac2f64de7b5a84505c635355c778d07927 | |
parent | 743077544b5420246ef29e0b708c90e3a8dfeeb6 (diff) |
cli: create GetWalletBalances() to fetch multiwallet balances
-rw-r--r-- | src/bitcoin-cli.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index 3a9e93f51f..4d5b8f847b 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -452,6 +452,30 @@ static UniValue ConnectAndCallRPC(BaseRequestHandler* rh, const std::string& str return response; } +/** + * GetWalletBalances calls listwallets; if more than one wallet is loaded, it then + * fetches mine.trusted balances for each loaded wallet and pushes them to `result`. + * + * @param result Reference to UniValue object the wallet names and balances are pushed to. + */ +static void GetWalletBalances(UniValue& result) +{ + std::unique_ptr<BaseRequestHandler> rh{MakeUnique<DefaultRequestHandler>()}; + const UniValue listwallets = ConnectAndCallRPC(rh.get(), "listwallets", /* args=*/{}); + if (!find_value(listwallets, "error").isNull()) return; + const UniValue& wallets = find_value(listwallets, "result"); + if (wallets.size() <= 1) return; + + UniValue balances(UniValue::VOBJ); + for (const UniValue& wallet : wallets.getValues()) { + const std::string wallet_name = wallet.get_str(); + const UniValue getbalances = ConnectAndCallRPC(rh.get(), "getbalances", /* args=*/{}, wallet_name); + const UniValue& balance = find_value(getbalances, "result")["mine"]["trusted"]; + balances.pushKV(wallet_name, balance); + } + result.pushKV("balances", balances); +} + static int CommandLineRPC(int argc, char *argv[]) { std::string strPrint; |