1
0
Fork 0
forked from lthn/blockchain

simplewallet's "list_outputs" command and wallet2::get_transfers_str() were improved to support assets

This commit is contained in:
sowle 2023-10-25 21:34:50 +02:00
parent e2da6a1f51
commit bdd9e83418
No known key found for this signature in database
GPG key ID: C07A24B2D89D49FC
3 changed files with 55 additions and 22 deletions

View file

@ -269,7 +269,8 @@ simple_wallet::simple_wallet()
m_cmd_binder.set_handler("incoming_counts", boost::bind(&simple_wallet::show_incoming_transfers_counts, this, ph::_1), "incoming_transfers counts");
m_cmd_binder.set_handler("list_recent_transfers", boost::bind(&simple_wallet::list_recent_transfers, this, ph::_1), "list_recent_transfers [offset] [count] - Show recent maximum 1000 transfers, offset default = 0, count default = 100 ");
m_cmd_binder.set_handler("export_recent_transfers", boost::bind(&simple_wallet::export_recent_transfers, this, ph::_1), "list_recent_transfers_tx - Write recent transfer in json to wallet_recent_transfers.txt");
m_cmd_binder.set_handler("list_outputs", boost::bind(&simple_wallet::list_outputs, this, ph::_1), "list_outputs [spent|unspent] - Lists all the outputs that have ever been sent to this wallet if called without arguments, otherwise it lists only the spent or unspent outputs");
m_cmd_binder.set_handler("list_outputs", boost::bind(&simple_wallet::list_outputs, this, ph::_1), "list_outputs [spent|unspent] [ticker=ZANO] [unknown] - Lists all the outputs. The result may be filtered by spent status, asset ticker or unknown asset ids.");
m_cmd_binder.set_handler("lo", boost::bind(&simple_wallet::list_outputs, this, ph::_1), "alias for list_outputs");
m_cmd_binder.set_handler("dump_transfers", boost::bind(&simple_wallet::dump_trunsfers, this, ph::_1), "dump_transfers - Write transfers in json to dump_transfers.txt");
m_cmd_binder.set_handler("dump_keyimages", boost::bind(&simple_wallet::dump_key_images, this, ph::_1), "dump_keyimages - Write key_images in json to dump_key_images.txt");
m_cmd_binder.set_handler("payments", boost::bind(&simple_wallet::show_payments, this, ph::_1), "payments <payment_id_1> [<payment_id_2> ... <payment_id_N>] - Show payments <payment_id_1>, ... <payment_id_N>");
@ -1775,28 +1776,36 @@ bool simple_wallet::save_watch_only(const std::vector<std::string> &args)
//----------------------------------------------------------------------------------------------------
bool simple_wallet::list_outputs(const std::vector<std::string> &args)
{
if (args.size() > 1)
{
fail_msg_writer() << "invalid syntax: one or none parameters are expected, " << args.size() << " was given";
return true;
}
bool include_spent = true, include_unspent = true, show_only_unknown = false;
std::string filter_asset_ticker{};
bool include_spent = true, include_unspent = true;
if (args.size() == 1)
{
if (args[0] == "unspent" || args[0] == "available")
include_spent = false;
else if (args[0] == "spent" || args[0] == "unavailable")
include_unspent = false;
bool arg_spent_flags = false, arg_unknown_assets = false, arg_ticker_filer = false;
auto process_arg = [&](const std::string& arg) -> bool {
if (!arg_spent_flags && (arg == "u" || arg == "unspent" || arg == "available"))
arg_spent_flags = true, include_spent = false;
else if (!arg_spent_flags && (arg == "s" || arg == "spent" || arg == "unavailable"))
arg_spent_flags = true, include_unspent = false;
else if (!arg_unknown_assets && (arg == "unknown"))
arg_unknown_assets = true, show_only_unknown = true;
else if (!arg_ticker_filer && (arg.find("ticker=") == 0 || arg.find("t=") == 0))
arg_ticker_filer = true, filter_asset_ticker = boost::erase_all_copy(boost::erase_all_copy(arg, "ticker="), "t=");
else
return false;
return true;
};
for(auto& arg : args)
{
if (!process_arg(arg))
{
fail_msg_writer() << "invalid parameter: " << args[0];
fail_msg_writer() << "invalid parameter: " << arg;
return true;
}
}
success_msg_writer() << "list of all the outputs that have ever been sent to this wallet:" << ENDL <<
m_wallet->get_transfers_str(include_spent, include_unspent);
success_msg_writer() << m_wallet->get_transfers_str(include_spent, include_unspent, show_only_unknown, filter_asset_ticker);
return true;
}
//----------------------------------------------------------------------------------------------------

View file

@ -3590,12 +3590,13 @@ bool wallet2::generate_utxo_defragmentation_transaction_if_needed(currency::tran
return true;
}
//----------------------------------------------------------------------------------------------------
std::string wallet2::get_transfers_str(bool include_spent /*= true*/, bool include_unspent /*= true*/) const
std::string wallet2::get_transfers_str(bool include_spent /*= true*/, bool include_unspent /*= true*/, bool show_only_unknown /*= false*/, const std::string& filter_asset_ticker /*= std::string{}*/) const
{
static const char* header = "index amount g_index flags block tx out# key image";
static const char* header = "index amount ticker g_index flags block tx out# asset id";
std::stringstream ss;
ss << header << ENDL;
size_t count = 0;
size_t unknown_assets_outs_count = 0;
for (size_t i = 0; i != m_transfers.size(); ++i)
{
const transfer_details& td = m_transfers[i];
@ -3603,21 +3604,44 @@ std::string wallet2::get_transfers_str(bool include_spent /*= true*/, bool inclu
if ((td.is_spent() && !include_spent) || (!td.is_spent() && !include_unspent))
continue;
bool native_coin = td.is_native_coin();
asset_descriptor_base adb{};
bool whitelisted = false;
if (get_asset_id_info(td.get_asset_id(), adb, whitelisted) == show_only_unknown)
{
if (!show_only_unknown)
++unknown_assets_outs_count;
continue;
}
if (!filter_asset_ticker.empty() && adb.ticker != filter_asset_ticker)
continue;
ss << std::right <<
std::setw(5) << i << " " <<
std::setw(21) << print_money(td.amount()) << " " <<
std::setw(21) << print_asset_money(td.m_amount, adb.decimal_point) << " " <<
std::setw(6) << std::left << (native_coin ? std::string(" ") : adb.ticker) << " " << std::right <<
std::setw(7) << td.m_global_output_index << " " <<
std::setw(2) << std::setfill('0') << td.m_flags << std::setfill(' ') << ":" <<
std::setw(5) << transfer_flags_to_str(td.m_flags) << " " <<
std::setw(7) << td.m_ptx_wallet_info->m_block_height << " " <<
get_transaction_hash(td.m_ptx_wallet_info->m_tx) << " " <<
std::setw(4) << td.m_internal_output_index << " " <<
td.m_key_image << ENDL;
std::setw(4) << td.m_internal_output_index << " ";
if (native_coin)
ss << " ";
else
ss << td.get_asset_id();
ss << ENDL;
++count;
}
ss << "printed " << count << " outputs of " << m_transfers.size() << " total" << ENDL;
if (unknown_assets_outs_count == 1)
ss << "(" << unknown_assets_outs_count << " output with unrecognized asset id is not shown, use 'list_outputs unknown' to see it)" << ENDL;
else if (unknown_assets_outs_count > 1)
ss << "(" << unknown_assets_outs_count << " outputs with unrecognized asset ids are not shown, use 'list_outputs unknown' to see them)" << ENDL;
return ss.str();
}
//----------------------------------------------------------------------------------------------------

View file

@ -833,7 +833,7 @@ namespace tools
bool fill_mining_context(mining_context& ctx);
void get_transfers(wallet2::transfer_container& incoming_transfers) const;
std::string get_transfers_str(bool include_spent = true, bool include_unspent = true) const;
std::string get_transfers_str(bool include_spent = true, bool include_unspent = true, bool show_only_unknown = false, const std::string& filter_asset_ticker = std::string{}) const;
std::string get_balance_str() const;
// Returns all payments by given id in unspecified order