|
|
|
@ -2318,7 +2318,7 @@ simple_wallet::simple_wallet()
|
|
|
|
|
tr("Check a signature proving that the owner of <address> holds at least this much, optionally with a challenge string <message>."));
|
|
|
|
|
m_cmd_binder.set_handler("show_transfers",
|
|
|
|
|
boost::bind(&simple_wallet::show_transfers, this, _1),
|
|
|
|
|
tr("show_transfers [in|out|pending|failed|pool] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]"),
|
|
|
|
|
tr("show_transfers [in|out|pending|failed|pool|coinbase] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]"),
|
|
|
|
|
tr("Show the incoming/outgoing transfers within an optional height range."));
|
|
|
|
|
m_cmd_binder.set_handler("unspent_outputs",
|
|
|
|
|
boost::bind(&simple_wallet::unspent_outputs, this, _1),
|
|
|
|
@ -6199,12 +6199,13 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
|
|
|
|
|
bool pending = true;
|
|
|
|
|
bool failed = true;
|
|
|
|
|
bool pool = true;
|
|
|
|
|
bool coinbase = true;
|
|
|
|
|
uint64_t min_height = 0;
|
|
|
|
|
uint64_t max_height = (uint64_t)-1;
|
|
|
|
|
boost::optional<uint32_t> subaddr_index;
|
|
|
|
|
|
|
|
|
|
if(local_args.size() > 4) {
|
|
|
|
|
fail_msg_writer() << tr("usage: show_transfers [in|out|all|pending|failed] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]");
|
|
|
|
|
fail_msg_writer() << tr("usage: show_transfers [in|out|all|pending|failed|coinbase] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -6217,19 +6218,24 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
else if (local_args[0] == "out" || local_args[0] == "outgoing") {
|
|
|
|
|
in = pool = false;
|
|
|
|
|
in = pool = coinbase = false;
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
else if (local_args[0] == "pending") {
|
|
|
|
|
in = out = failed = false;
|
|
|
|
|
in = out = failed = coinbase = false;
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
else if (local_args[0] == "failed") {
|
|
|
|
|
in = out = pending = pool = false;
|
|
|
|
|
in = out = pending = pool = coinbase = false;
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
else if (local_args[0] == "pool") {
|
|
|
|
|
in = out = pending = failed = false;
|
|
|
|
|
in = out = pending = failed = coinbase = false;
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
else if (local_args[0] == "coinbase") {
|
|
|
|
|
in = out = pending = failed = pool = false;
|
|
|
|
|
coinbase = true;
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
else if (local_args[0] == "all" || local_args[0] == "both") {
|
|
|
|
@ -6270,20 +6276,23 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
|
|
|
|
|
local_args.erase(local_args.begin());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::multimap<uint64_t, std::pair<bool,std::string>> output;
|
|
|
|
|
std::multimap<uint64_t, std::tuple<epee::console_colors, std::string, std::string>> output;
|
|
|
|
|
|
|
|
|
|
PAUSE_READLINE();
|
|
|
|
|
|
|
|
|
|
if (in) {
|
|
|
|
|
if (in || coinbase) {
|
|
|
|
|
std::list<std::pair<crypto::hash, tools::wallet2::payment_details>> payments;
|
|
|
|
|
m_wallet->get_payments(payments, min_height, max_height, m_current_subaddress_account, subaddr_indices);
|
|
|
|
|
for (std::list<std::pair<crypto::hash, tools::wallet2::payment_details>>::const_iterator i = payments.begin(); i != payments.end(); ++i) {
|
|
|
|
|
const tools::wallet2::payment_details &pd = i->second;
|
|
|
|
|
if (!pd.m_coinbase && !in)
|
|
|
|
|
continue;
|
|
|
|
|
std::string payment_id = string_tools::pod_to_hex(i->first);
|
|
|
|
|
if (payment_id.substr(16).find_first_not_of('0') == std::string::npos)
|
|
|
|
|
payment_id = payment_id.substr(0,16);
|
|
|
|
|
std::string note = m_wallet->get_tx_note(pd.m_tx_hash);
|
|
|
|
|
output.insert(std::make_pair(pd.m_block_height, std::make_pair(true, (boost::format("%25.25s %20.20s %s %s %d %s %s") % get_human_readable_timestamp(pd.m_timestamp) % print_money(pd.m_amount) % string_tools::pod_to_hex(pd.m_tx_hash) % payment_id % pd.m_subaddr_index.minor % "-" % note).str())));
|
|
|
|
|
const std::string type = pd.m_coinbase ? tr("block") : tr("in");
|
|
|
|
|
output.insert(std::make_pair(pd.m_block_height, std::make_tuple(epee::console_color_green, type, (boost::format("%25.25s %20.20s %s %s %d %s %s") % get_human_readable_timestamp(pd.m_timestamp) % print_money(pd.m_amount) % string_tools::pod_to_hex(pd.m_tx_hash) % payment_id % pd.m_subaddr_index.minor % "-" % note).str())));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -6316,15 +6325,15 @@ bool simple_wallet::show_transfers(const std::vector<std::string> &args_)
|
|
|
|
|
if (payment_id.substr(16).find_first_not_of('0') == std::string::npos)
|
|
|
|
|
payment_id = payment_id.substr(0,16);
|
|
|
|
|
std::string note = m_wallet->get_tx_note(i->first);
|
|
|
|
|
output.insert(std::make_pair(pd.m_block_height, std::make_pair(false, (boost::format("%25.25s %20.20s %s %s %14.14s %s %s - %s") % get_human_readable_timestamp(pd.m_timestamp) % print_money(pd.m_amount_in - change - fee) % string_tools::pod_to_hex(i->first) % payment_id % print_money(fee) % dests % print_subaddr_indices(pd.m_subaddr_indices) % note).str())));
|
|
|
|
|
output.insert(std::make_pair(pd.m_block_height, std::make_tuple(epee::console_color_magenta, tr("out"), (boost::format("%25.25s %20.20s %s %s %14.14s %s %s - %s") % get_human_readable_timestamp(pd.m_timestamp) % print_money(pd.m_amount_in - change - fee) % string_tools::pod_to_hex(i->first) % payment_id % print_money(fee) % dests % print_subaddr_indices(pd.m_subaddr_indices) % note).str())));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// print in and out sorted by height
|
|
|
|
|
for (std::map<uint64_t, std::pair<bool, std::string>>::const_iterator i = output.begin(); i != output.end(); ++i) {
|
|
|
|
|
message_writer(i->second.first ? console_color_green : console_color_magenta, false) <<
|
|
|
|
|
for (std::multimap<uint64_t, std::tuple<epee::console_colors, std::string, std::string>>::const_iterator i = output.begin(); i != output.end(); ++i) {
|
|
|
|
|
message_writer(std::get<0>(i->second), false) <<
|
|
|
|
|
boost::format("%8.8llu %6.6s %s") %
|
|
|
|
|
((unsigned long long)i->first) % (i->second.first ? tr("in") : tr("out")) % i->second.second;
|
|
|
|
|
((unsigned long long)i->first) % std::get<1>(i->second) % std::get<2>(i->second);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pool) {
|
|
|
|
|