|
|
|
@ -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)
|
|
|
|
|