Simplewallet: Unify usage messages.

Help messages describe the commands usage. When users run the command
with wrong arguments, it usually helpfully offers the usage, too.
Unfortunately, these two usage messages were duplicated in the code and
started to get out of sync.

Fixing with constant strings.
This commit is contained in:
Tadeas Moravec 2018-11-24 10:43:34 +00:00
parent ed54ac8fdf
commit e6f026e530
No known key found for this signature in database
GPG Key ID: AE1066CC94FA7B49

View File

@ -111,6 +111,8 @@ typedef cryptonote::simple_wallet sw;
#define SCOPED_WALLET_UNLOCK() SCOPED_WALLET_UNLOCK_ON_BAD_PASSWORD(return true;) #define SCOPED_WALLET_UNLOCK() SCOPED_WALLET_UNLOCK_ON_BAD_PASSWORD(return true;)
#define PRINT_USAGE(usage_help) fail_msg_writer() << boost::format(tr("usage: %s")) % usage_help;
enum TransferType { enum TransferType {
Transfer, Transfer,
TransferLocked, TransferLocked,
@ -141,6 +143,93 @@ namespace
const command_line::arg_descriptor< std::vector<std::string> > arg_command = {"command", ""}; const command_line::arg_descriptor< std::vector<std::string> > arg_command = {"command", ""};
const char* USAGE_START_MINING("start_mining [<number_of_threads>] [bg_mining] [ignore_battery]");
const char* USAGE_SET_DAEMON("set_daemon <host>[:<port>] [trusted|untrusted]");
const char* USAGE_SHOW_BALANCE("balance [detail]");
const char* USAGE_INCOMING_TRANSFERS("incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]]");
const char* USAGE_PAYMENTS("payments <PID_1> [<PID_2> ... <PID_N>]");
const char* USAGE_PAYMENT_ID("payment_id");
const char* USAGE_TRANSFER("transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <address> <amount>) [<payment_id>]");
const char* USAGE_LOCKED_TRANSFER("locked_transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <addr> <amount>) <lockblocks> [<payment_id>]");
const char* USAGE_LOCKED_SWEEP_ALL("locked_sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> <lockblocks> [<payment_id>]");
const char* USAGE_SWEEP_ALL("sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] [outputs=<N>] <address> [<payment_id>]");
const char* USAGE_SWEEP_BELOW("sweep_below <amount_threshold> [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id>]");
const char* USAGE_SWEEP_SINGLE("sweep_single [<priority>] [<ring_size>] [outputs=<N>] <key_image> <address> [<payment_id>]");
const char* USAGE_DONATE("donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id>]");
const char* USAGE_SIGN_TRANSFER("sign_transfer [export_raw]");
const char* USAGE_SET_LOG("set_log <level>|{+,-,}<categories>");
const char* USAGE_ACCOUNT("account\n"
" account new <label text with white spaces allowed>\n"
" account switch <index> \n"
" account label <index> <label text with white spaces allowed>\n"
" account tag <tag_name> <account_index_1> [<account_index_2> ...]\n"
" account untag <account_index_1> [<account_index_2> ...]\n"
" account tag_description <tag_name> <description>");
const char* USAGE_ADDRESS("address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed>]");
const char* USAGE_INTEGRATED_ADDRESS("integrated_address [<payment_id> | <address>]");
const char* USAGE_ADDRESS_BOOK("address_book [(add ((<address> [pid <id>])|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)]");
const char* USAGE_SET_VARIABLE("set <option> [<value>]");
const char* USAGE_GET_TX_KEY("get_tx_key <txid>");
const char* USAGE_SET_TX_KEY("set_tx_key <txid> <tx_key>");
const char* USAGE_CHECK_TX_KEY("check_tx_key <txid> <txkey> <address>");
const char* USAGE_GET_TX_PROOF("get_tx_proof <txid> <address> [<message>]");
const char* USAGE_CHECK_TX_PROOF("check_tx_proof <txid> <address> <signature_file> [<message>]");
const char* USAGE_GET_SPEND_PROOF("get_spend_proof <txid> [<message>]");
const char* USAGE_CHECK_SPEND_PROOF("check_spend_proof <txid> <signature_file> [<message>]");
const char* USAGE_GET_RESERVE_PROOF("get_reserve_proof (all|<amount>) [<message>]");
const char* USAGE_CHECK_RESERVE_PROOF("check_reserve_proof <address> <signature_file> [<message>]");
const char* USAGE_SHOW_TRANSFERS("show_transfers [in|out|pending|failed|pool|coinbase] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]");
const char* USAGE_UNSPENT_OUTPUTS("unspent_outputs [index=<N1>[,<N2>,...]] [<min_amount> [<max_amount>]]");
const char* USAGE_RESCAN_BC("rescan_bc [hard]");
const char* USAGE_SET_TX_NOTE("set_tx_note <txid> [free text note]");
const char* USAGE_GET_TX_NOTE("get_tx_note <txid>");
const char* USAGE_GET_DESCRIPTION("get_description");
const char* USAGE_SET_DESCRIPTION("set_description [free text note]");
const char* USAGE_SIGN("sign <filename>");
const char* USAGE_VERIFY("verify <filename> <address> <signature>");
const char* USAGE_EXPORT_KEY_IMAGES("export_key_images <filename>");
const char* USAGE_IMPORT_KEY_IMAGES("import_key_images <filename>");
const char* USAGE_HW_KEY_IMAGES_SYNC("hw_key_images_sync");
const char* USAGE_HW_RECONNECT("hw_reconnect");
const char* USAGE_EXPORT_OUTPUTS("export_outputs <filename>");
const char* USAGE_IMPORT_OUTPUTS("import_outputs <filename>");
const char* USAGE_SHOW_TRANSFER("show_transfer <txid>");
const char* USAGE_MAKE_MULTISIG("make_multisig <threshold> <string1> [<string>...]");
const char* USAGE_FINALIZE_MULTISIG("finalize_multisig <string> [<string>...]");
const char* USAGE_EXCHANGE_MULTISIG_KEYS("exchange_multisig_keys <string> [<string>...]");
const char* USAGE_EXPORT_MULTISIG_INFO("export_multisig_info <filename>");
const char* USAGE_IMPORT_MULTISIG_INFO("import_multisig_info <filename> [<filename>...]");
const char* USAGE_SIGN_MULTISIG("sign_multisig <filename>");
const char* USAGE_SUBMIT_MULTISIG("submit_multisig <filename>");
const char* USAGE_EXPORT_RAW_MULTISIG_TX("export_raw_multisig_tx <filename>");
const char* USAGE_MMS("mms [<subcommand> [<subcommand_parameters>]]");
const char* USAGE_MMS_INIT("mms init <required_signers>/<authorized_signers> <own_label> <own_transport_address>");
const char* USAGE_MMS_INFO("mms info");
const char* USAGE_MMS_SIGNER("mms signer [<number> <label> [<transport_address> [<monero_address>]]]");
const char* USAGE_MMS_LIST("mms list");
const char* USAGE_MMS_NEXT("mms next [sync]");
const char* USAGE_MMS_SYNC("mms sync");
const char* USAGE_MMS_TRANSFER("mms transfer <transfer_command_arguments>");
const char* USAGE_MMS_DELETE("mms delete (<message_id> | all)");
const char* USAGE_MMS_SEND("mms send [<message_id>]");
const char* USAGE_MMS_RECEIVE("mms receive");
const char* USAGE_MMS_EXPORT("mms export <message_id>");
const char* USAGE_MMS_NOTE("mms note [<label> <text>]");
const char* USAGE_MMS_SHOW("mms show <message_id>");
const char* USAGE_MMS_SET("mms set <option_name> [<option_value>]");
const char* USAGE_MMS_SEND_SIGNER_CONFIG("mms send_signer_config");
const char* USAGE_MMS_START_AUTO_CONFIG("mms start_auto_config [<label> <label> ...]");
const char* USAGE_MMS_STOP_AUTO_CONFIG("mms stop_auto_config");
const char* USAGE_MMS_AUTO_CONFIG("mms auto_config <auto_config_token>");
const char* USAGE_PRINT_RING("print_ring <key_image> | <txid>");
const char* USAGE_SET_RING("set_ring <filename> | ( <key_image> absolute|relative <index> [<index>...] )");
const char* USAGE_SAVE_KNOWN_RINGS("save_known_rings");
const char* USAGE_MARK_OUTPUT_SPENT("mark_output_spent <amount>/<offset> | <filename> [add]");
const char* USAGE_MARK_OUTPUT_UNSPENT("mark_output_unspent <amount>/<offset>");
const char* USAGE_IS_OUTPUT_SPENT("is_output_spent <amount>/<offset>");
const char* USAGE_VERSION("version");
const char* USAGE_HELP("help [<command>]");
std::string input_line(const std::string& prompt) std::string input_line(const std::string& prompt)
{ {
#ifdef HAVE_READLINE #ifdef HAVE_READLINE
@ -774,7 +863,7 @@ bool simple_wallet::payment_id(const std::vector<std::string> &args/* = std::vec
crypto::hash payment_id; crypto::hash payment_id;
if (args.size() > 0) if (args.size() > 0)
{ {
fail_msg_writer() << tr("usage: payment_id"); PRINT_USAGE(USAGE_PAYMENT_ID);
return true; return true;
} }
payment_id = crypto::rand<crypto::hash>(); payment_id = crypto::rand<crypto::hash>();
@ -914,7 +1003,7 @@ bool simple_wallet::make_multisig_main(const std::vector<std::string> &args, boo
if (args.size() < 2) if (args.size() < 2)
{ {
fail_msg_writer() << tr("usage: make_multisig <threshold> <multisiginfo1> [<multisiginfo2>...]"); PRINT_USAGE(USAGE_MAKE_MULTISIG);
return false; return false;
} }
@ -1001,7 +1090,7 @@ bool simple_wallet::finalize_multisig(const std::vector<std::string> &args)
if (args.size() < 2) if (args.size() < 2)
{ {
fail_msg_writer() << tr("usage: finalize_multisig <multisiginfo1> [<multisiginfo2>...]"); PRINT_USAGE(USAGE_FINALIZE_MULTISIG);
return true; return true;
} }
@ -1055,7 +1144,7 @@ bool simple_wallet::exchange_multisig_keys_main(const std::vector<std::string> &
if (args.size() < 2) if (args.size() < 2)
{ {
fail_msg_writer() << tr("usage: exchange_multisig_keys <multisiginfo1> [<multisiginfo2>...]"); PRINT_USAGE(USAGE_EXCHANGE_MULTISIG_KEYS);
return false; return false;
} }
@ -1113,7 +1202,7 @@ bool simple_wallet::export_multisig_main(const std::vector<std::string> &args, b
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: export_multisig_info <filename>"); PRINT_USAGE(USAGE_EXPORT_MULTISIG_INFO);
return false; return false;
} }
@ -1179,7 +1268,7 @@ bool simple_wallet::import_multisig_main(const std::vector<std::string> &args, b
} }
if (args.size() < threshold - 1) if (args.size() < threshold - 1)
{ {
fail_msg_writer() << tr("usage: import_multisig_info <filename1> [<filename2>...] - one for each other participant"); PRINT_USAGE(USAGE_IMPORT_MULTISIG_INFO);
return false; return false;
} }
@ -1273,7 +1362,7 @@ bool simple_wallet::sign_multisig_main(const std::vector<std::string> &args, boo
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: sign_multisig <filename>"); PRINT_USAGE(USAGE_SIGN_MULTISIG);
return false; return false;
} }
@ -1389,7 +1478,7 @@ bool simple_wallet::submit_multisig_main(const std::vector<std::string> &args, b
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: submit_multisig <filename>"); PRINT_USAGE(USAGE_SUBMIT_MULTISIG);
return false; return false;
} }
@ -1470,7 +1559,7 @@ bool simple_wallet::export_raw_multisig(const std::vector<std::string> &args)
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: export_raw_multisig <filename>"); PRINT_USAGE(USAGE_EXPORT_RAW_MULTISIG_TX);
return true; return true;
} }
@ -1533,7 +1622,7 @@ bool simple_wallet::print_ring(const std::vector<std::string> &args)
crypto::hash txid; crypto::hash txid;
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: print_ring <key_image> | <txid>"); PRINT_USAGE(USAGE_PRINT_RING);
return true; return true;
} }
@ -1690,7 +1779,7 @@ bool simple_wallet::set_ring(const std::vector<std::string> &args)
if (args.size() < 3) if (args.size() < 3)
{ {
fail_msg_writer() << tr("usage: set_ring <filename> | ( <key_image> absolute|relative <index> [<index>...] )"); PRINT_USAGE(USAGE_SET_RING);
return true; return true;
} }
@ -1765,7 +1854,7 @@ bool simple_wallet::blackball(const std::vector<std::string> &args)
uint64_t amount = std::numeric_limits<uint64_t>::max(), offset, num_offsets; uint64_t amount = std::numeric_limits<uint64_t>::max(), offset, num_offsets;
if (args.size() == 0) if (args.size() == 0)
{ {
fail_msg_writer() << tr("usage: mark_output_spent <amount>/<offset> | <filename> [add]"); PRINT_USAGE(USAGE_MARK_OUTPUT_SPENT);
return true; return true;
} }
@ -1854,7 +1943,7 @@ bool simple_wallet::unblackball(const std::vector<std::string> &args)
std::pair<uint64_t, uint64_t> output; std::pair<uint64_t, uint64_t> output;
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: mark_output_unspent <amount>/<offset>"); PRINT_USAGE(USAGE_MARK_OUTPUT_UNSPENT);
return true; return true;
} }
@ -1881,7 +1970,7 @@ bool simple_wallet::blackballed(const std::vector<std::string> &args)
std::pair<uint64_t, uint64_t> output; std::pair<uint64_t, uint64_t> output;
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: is_output_spent <amount>/<offset>"); PRINT_USAGE(USAGE_IS_OUTPUT_SPENT);
return true; return true;
} }
@ -2456,14 +2545,14 @@ simple_wallet::simple_wallet()
{ {
m_cmd_binder.set_handler("start_mining", m_cmd_binder.set_handler("start_mining",
boost::bind(&simple_wallet::start_mining, this, _1), boost::bind(&simple_wallet::start_mining, this, _1),
tr("start_mining [<number_of_threads>] [bg_mining] [ignore_battery]"), tr(USAGE_START_MINING),
tr("Start mining in the daemon (bg_mining and ignore_battery are optional booleans).")); tr("Start mining in the daemon (bg_mining and ignore_battery are optional booleans)."));
m_cmd_binder.set_handler("stop_mining", m_cmd_binder.set_handler("stop_mining",
boost::bind(&simple_wallet::stop_mining, this, _1), boost::bind(&simple_wallet::stop_mining, this, _1),
tr("Stop mining in the daemon.")); tr("Stop mining in the daemon."));
m_cmd_binder.set_handler("set_daemon", m_cmd_binder.set_handler("set_daemon",
boost::bind(&simple_wallet::set_daemon, this, _1), boost::bind(&simple_wallet::set_daemon, this, _1),
tr("set_daemon <host>[:<port>] [trusted|untrusted]"), tr(USAGE_SET_DAEMON),
tr("Set another daemon to connect to.")); tr("Set another daemon to connect to."));
m_cmd_binder.set_handler("save_bc", m_cmd_binder.set_handler("save_bc",
boost::bind(&simple_wallet::save_bc, this, _1), boost::bind(&simple_wallet::save_bc, this, _1),
@ -2473,70 +2562,64 @@ simple_wallet::simple_wallet()
tr("Synchronize the transactions and balance.")); tr("Synchronize the transactions and balance."));
m_cmd_binder.set_handler("balance", m_cmd_binder.set_handler("balance",
boost::bind(&simple_wallet::show_balance, this, _1), boost::bind(&simple_wallet::show_balance, this, _1),
tr("balance [detail]"), tr(USAGE_SHOW_BALANCE),
tr("Show the wallet's balance of the currently selected account.")); tr("Show the wallet's balance of the currently selected account."));
m_cmd_binder.set_handler("incoming_transfers", m_cmd_binder.set_handler("incoming_transfers",
boost::bind(&simple_wallet::show_incoming_transfers, this, _1), boost::bind(&simple_wallet::show_incoming_transfers, this, _1),
tr("incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]]"), tr(USAGE_INCOMING_TRANSFERS),
tr("Show the incoming transfers, all or filtered by availability and address index.\n\n" tr("Show the incoming transfers, all or filtered by availability and address index.\n\n"
"Output format:\n" "Output format:\n"
"Amount, Spent(\"T\"|\"F\"), \"locked\"|\"unlocked\", RingCT, Global Index, Transaction Hash, Address Index, [Public Key, Key Image] ")); "Amount, Spent(\"T\"|\"F\"), \"locked\"|\"unlocked\", RingCT, Global Index, Transaction Hash, Address Index, [Public Key, Key Image] "));
m_cmd_binder.set_handler("payments", m_cmd_binder.set_handler("payments",
boost::bind(&simple_wallet::show_payments, this, _1), boost::bind(&simple_wallet::show_payments, this, _1),
tr("payments <PID_1> [<PID_2> ... <PID_N>]"), tr(USAGE_PAYMENTS),
tr("Show the payments for the given payment IDs.")); tr("Show the payments for the given payment IDs."));
m_cmd_binder.set_handler("bc_height", m_cmd_binder.set_handler("bc_height",
boost::bind(&simple_wallet::show_blockchain_height, this, _1), boost::bind(&simple_wallet::show_blockchain_height, this, _1),
tr("Show the blockchain height.")); tr("Show the blockchain height."));
m_cmd_binder.set_handler("transfer", boost::bind(&simple_wallet::transfer, this, _1), m_cmd_binder.set_handler("transfer", boost::bind(&simple_wallet::transfer, this, _1),
tr("transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <address> <amount>) [<payment_id>]"), tr(USAGE_TRANSFER),
tr("Transfer <amount> to <address>. If the parameter \"index=<N1>[,<N2>,...]\" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding URI_2 or <address_2> <amount_2> etcetera (before the payment ID, if it's included)")); tr("Transfer <amount> to <address>. If the parameter \"index=<N1>[,<N2>,...]\" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding URI_2 or <address_2> <amount_2> etcetera (before the payment ID, if it's included)"));
m_cmd_binder.set_handler("locked_transfer", m_cmd_binder.set_handler("locked_transfer",
boost::bind(&simple_wallet::locked_transfer, this, _1), boost::bind(&simple_wallet::locked_transfer, this, _1),
tr("locked_transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <addr> <amount>) <lockblocks> [<payment_id>]"), tr(USAGE_LOCKED_TRANSFER),
tr("Transfer <amount> to <address> and lock it for <lockblocks> (max. 1000000). If the parameter \"index=<N1>[,<N2>,...]\" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding URI_2 or <address_2> <amount_2> etcetera (before the payment ID, if it's included)")); tr("Transfer <amount> to <address> and lock it for <lockblocks> (max. 1000000). If the parameter \"index=<N1>[,<N2>,...]\" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding URI_2 or <address_2> <amount_2> etcetera (before the payment ID, if it's included)"));
m_cmd_binder.set_handler("locked_sweep_all", m_cmd_binder.set_handler("locked_sweep_all",
boost::bind(&simple_wallet::locked_sweep_all, this, _1), boost::bind(&simple_wallet::locked_sweep_all, this, _1),
tr("locked_sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> <lockblocks> [<payment_id>]"), tr(USAGE_LOCKED_SWEEP_ALL),
tr("Send all unlocked balance to an address and lock it for <lockblocks> (max. 1000000). If the parameter \"index<N1>[,<N2>,...]\" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used. <priority> is the priority of the sweep. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability.")); tr("Send all unlocked balance to an address and lock it for <lockblocks> (max. 1000000). If the parameter \"index<N1>[,<N2>,...]\" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used. <priority> is the priority of the sweep. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability."));
m_cmd_binder.set_handler("sweep_unmixable", m_cmd_binder.set_handler("sweep_unmixable",
boost::bind(&simple_wallet::sweep_unmixable, this, _1), boost::bind(&simple_wallet::sweep_unmixable, this, _1),
tr("Send all unmixable outputs to yourself with ring_size 1")); tr("Send all unmixable outputs to yourself with ring_size 1"));
m_cmd_binder.set_handler("sweep_all", boost::bind(&simple_wallet::sweep_all, this, _1), m_cmd_binder.set_handler("sweep_all", boost::bind(&simple_wallet::sweep_all, this, _1),
tr("sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] [outputs=<N>] <address> [<payment_id>]"), tr(USAGE_SWEEP_ALL),
tr("Send all unlocked balance to an address. If the parameter \"index<N1>[,<N2>,...]\" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used. If the parameter \"outputs=<N>\" is specified and N > 0, wallet splits the transaction into N even outputs.")); tr("Send all unlocked balance to an address. If the parameter \"index<N1>[,<N2>,...]\" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used. If the parameter \"outputs=<N>\" is specified and N > 0, wallet splits the transaction into N even outputs."));
m_cmd_binder.set_handler("sweep_below", m_cmd_binder.set_handler("sweep_below",
boost::bind(&simple_wallet::sweep_below, this, _1), boost::bind(&simple_wallet::sweep_below, this, _1),
tr("sweep_below <amount_threshold> [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id>]"), tr(USAGE_SWEEP_BELOW),
tr("Send all unlocked outputs below the threshold to an address.")); tr("Send all unlocked outputs below the threshold to an address."));
m_cmd_binder.set_handler("sweep_single", m_cmd_binder.set_handler("sweep_single",
boost::bind(&simple_wallet::sweep_single, this, _1), boost::bind(&simple_wallet::sweep_single, this, _1),
tr("sweep_single [<priority>] [<ring_size>] [outputs=<N>] <key_image> <address> [<payment_id>]"), tr(USAGE_SWEEP_SINGLE),
tr("Send a single output of the given key image to an address without change.")); tr("Send a single output of the given key image to an address without change."));
m_cmd_binder.set_handler("donate", m_cmd_binder.set_handler("donate",
boost::bind(&simple_wallet::donate, this, _1), boost::bind(&simple_wallet::donate, this, _1),
tr("donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id>]"), tr(USAGE_DONATE),
tr("Donate <amount> to the development team (donate.getmonero.org).")); tr("Donate <amount> to the development team (donate.getmonero.org)."));
m_cmd_binder.set_handler("sign_transfer", m_cmd_binder.set_handler("sign_transfer",
boost::bind(&simple_wallet::sign_transfer, this, _1), boost::bind(&simple_wallet::sign_transfer, this, _1),
tr("sign_transfer [export_raw]"), tr(USAGE_SIGN_TRANSFER),
tr("Sign a transaction from a file. If the parameter \"export_raw\" is specified, transaction raw hex data suitable for the daemon RPC /sendrawtransaction is exported.")); tr("Sign a transaction from a file. If the parameter \"export_raw\" is specified, transaction raw hex data suitable for the daemon RPC /sendrawtransaction is exported."));
m_cmd_binder.set_handler("submit_transfer", m_cmd_binder.set_handler("submit_transfer",
boost::bind(&simple_wallet::submit_transfer, this, _1), boost::bind(&simple_wallet::submit_transfer, this, _1),
tr("Submit a signed transaction from a file.")); tr("Submit a signed transaction from a file."));
m_cmd_binder.set_handler("set_log", m_cmd_binder.set_handler("set_log",
boost::bind(&simple_wallet::set_log, this, _1), boost::bind(&simple_wallet::set_log, this, _1),
tr("set_log <level>|{+,-,}<categories>"), tr(USAGE_SET_LOG),
tr("Change the current log detail (level must be <0-4>).")); tr("Change the current log detail (level must be <0-4>)."));
m_cmd_binder.set_handler("account", m_cmd_binder.set_handler("account",
boost::bind(&simple_wallet::account, this, _1), boost::bind(&simple_wallet::account, this, _1),
tr("account\n" tr(USAGE_ACCOUNT),
" account new <label text with white spaces allowed>\n"
" account switch <index> \n"
" account label <index> <label text with white spaces allowed>\n"
" account tag <tag_name> <account_index_1> [<account_index_2> ...]\n"
" account untag <account_index_1> [<account_index_2> ...]\n"
" account tag_description <tag_name> <description>"),
tr("If no arguments are specified, the wallet shows all the existing accounts along with their balances.\n" tr("If no arguments are specified, the wallet shows all the existing accounts along with their balances.\n"
"If the \"new\" argument is specified, the wallet creates a new account with its label initialized by the provided label text (which can be empty).\n" "If the \"new\" argument is specified, the wallet creates a new account with its label initialized by the provided label text (which can be empty).\n"
"If the \"switch\" argument is specified, the wallet switches to the account specified by <index>.\n" "If the \"switch\" argument is specified, the wallet switches to the account specified by <index>.\n"
@ -2546,15 +2629,15 @@ simple_wallet::simple_wallet()
"If the \"tag_description\" argument is specified, the tag <tag_name> is assigned an arbitrary text <description>.")); "If the \"tag_description\" argument is specified, the tag <tag_name> is assigned an arbitrary text <description>."));
m_cmd_binder.set_handler("address", m_cmd_binder.set_handler("address",
boost::bind(&simple_wallet::print_address, this, _1), boost::bind(&simple_wallet::print_address, this, _1),
tr("address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed>]"), tr(USAGE_ADDRESS),
tr("If no arguments are specified or <index> is specified, the wallet shows the default or specified address. If \"all\" is specified, the wallet shows all the existing addresses in the currently selected account. If \"new \" is specified, the wallet creates a new address with the provided label text (which can be empty). If \"label\" is specified, the wallet sets the label of the address specified by <index> to the provided label text.")); tr("If no arguments are specified or <index> is specified, the wallet shows the default or specified address. If \"all\" is specified, the wallet shows all the existing addresses in the currently selected account. If \"new \" is specified, the wallet creates a new address with the provided label text (which can be empty). If \"label\" is specified, the wallet sets the label of the address specified by <index> to the provided label text."));
m_cmd_binder.set_handler("integrated_address", m_cmd_binder.set_handler("integrated_address",
boost::bind(&simple_wallet::print_integrated_address, this, _1), boost::bind(&simple_wallet::print_integrated_address, this, _1),
tr("integrated_address [<payment_id> | <address>]"), tr(USAGE_INTEGRATED_ADDRESS),
tr("Encode a payment ID into an integrated address for the current wallet public address (no argument uses a random payment ID), or decode an integrated address to standard address and payment ID")); tr("Encode a payment ID into an integrated address for the current wallet public address (no argument uses a random payment ID), or decode an integrated address to standard address and payment ID"));
m_cmd_binder.set_handler("address_book", m_cmd_binder.set_handler("address_book",
boost::bind(&simple_wallet::address_book, this, _1), boost::bind(&simple_wallet::address_book, this, _1),
tr("address_book [(add ((<address> [pid <id>])|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)]"), tr(USAGE_ADDRESS_BOOK),
tr("Print all entries in the address book, optionally adding/deleting an entry to/from it.")); tr("Print all entries in the address book, optionally adding/deleting an entry to/from it."));
m_cmd_binder.set_handler("save", m_cmd_binder.set_handler("save",
boost::bind(&simple_wallet::save, this, _1), boost::bind(&simple_wallet::save, this, _1),
@ -2573,7 +2656,7 @@ simple_wallet::simple_wallet()
tr("Display the Electrum-style mnemonic seed")); tr("Display the Electrum-style mnemonic seed"));
m_cmd_binder.set_handler("set", m_cmd_binder.set_handler("set",
boost::bind(&simple_wallet::set_variable, this, _1), boost::bind(&simple_wallet::set_variable, this, _1),
tr("set <option> [<value>]"), tr(USAGE_SET_VARIABLE),
tr("Available options:\n " tr("Available options:\n "
"seed language\n " "seed language\n "
" Set the wallet's seed language.\n " " Set the wallet's seed language.\n "
@ -2626,45 +2709,45 @@ simple_wallet::simple_wallet()
tr("Rescan the blockchain for spent outputs.")); tr("Rescan the blockchain for spent outputs."));
m_cmd_binder.set_handler("get_tx_key", m_cmd_binder.set_handler("get_tx_key",
boost::bind(&simple_wallet::get_tx_key, this, _1), boost::bind(&simple_wallet::get_tx_key, this, _1),
tr("get_tx_key <txid>"), tr(USAGE_GET_TX_KEY),
tr("Get the transaction key (r) for a given <txid>.")); tr("Get the transaction key (r) for a given <txid>."));
m_cmd_binder.set_handler("set_tx_key", m_cmd_binder.set_handler("set_tx_key",
boost::bind(&simple_wallet::set_tx_key, this, _1), boost::bind(&simple_wallet::set_tx_key, this, _1),
tr("set_tx_key <txid> <tx_key>"), tr(USAGE_SET_TX_KEY),
tr("Set the transaction key (r) for a given <txid> in case the tx was made by some other device or 3rd party wallet.")); tr("Set the transaction key (r) for a given <txid> in case the tx was made by some other device or 3rd party wallet."));
m_cmd_binder.set_handler("check_tx_key", m_cmd_binder.set_handler("check_tx_key",
boost::bind(&simple_wallet::check_tx_key, this, _1), boost::bind(&simple_wallet::check_tx_key, this, _1),
tr("check_tx_key <txid> <txkey> <address>"), tr(USAGE_CHECK_TX_KEY),
tr("Check the amount going to <address> in <txid>.")); tr("Check the amount going to <address> in <txid>."));
m_cmd_binder.set_handler("get_tx_proof", m_cmd_binder.set_handler("get_tx_proof",
boost::bind(&simple_wallet::get_tx_proof, this, _1), boost::bind(&simple_wallet::get_tx_proof, this, _1),
tr("get_tx_proof <txid> <address> [<message>]"), tr(USAGE_GET_TX_PROOF),
tr("Generate a signature proving funds sent to <address> in <txid>, optionally with a challenge string <message>, using either the transaction secret key (when <address> is not your wallet's address) or the view secret key (otherwise), which does not disclose the secret key.")); tr("Generate a signature proving funds sent to <address> in <txid>, optionally with a challenge string <message>, using either the transaction secret key (when <address> is not your wallet's address) or the view secret key (otherwise), which does not disclose the secret key."));
m_cmd_binder.set_handler("check_tx_proof", m_cmd_binder.set_handler("check_tx_proof",
boost::bind(&simple_wallet::check_tx_proof, this, _1), boost::bind(&simple_wallet::check_tx_proof, this, _1),
tr("check_tx_proof <txid> <address> <signature_file> [<message>]"), tr(USAGE_CHECK_TX_PROOF),
tr("Check the proof for funds going to <address> in <txid> with the challenge string <message> if any.")); tr("Check the proof for funds going to <address> in <txid> with the challenge string <message> if any."));
m_cmd_binder.set_handler("get_spend_proof", m_cmd_binder.set_handler("get_spend_proof",
boost::bind(&simple_wallet::get_spend_proof, this, _1), boost::bind(&simple_wallet::get_spend_proof, this, _1),
tr("get_spend_proof <txid> [<message>]"), tr(USAGE_GET_SPEND_PROOF),
tr("Generate a signature proving that you generated <txid> using the spend secret key, optionally with a challenge string <message>.")); tr("Generate a signature proving that you generated <txid> using the spend secret key, optionally with a challenge string <message>."));
m_cmd_binder.set_handler("check_spend_proof", m_cmd_binder.set_handler("check_spend_proof",
boost::bind(&simple_wallet::check_spend_proof, this, _1), boost::bind(&simple_wallet::check_spend_proof, this, _1),
tr("check_spend_proof <txid> <signature_file> [<message>]"), tr(USAGE_CHECK_SPEND_PROOF),
tr("Check a signature proving that the signer generated <txid>, optionally with a challenge string <message>.")); tr("Check a signature proving that the signer generated <txid>, optionally with a challenge string <message>."));
m_cmd_binder.set_handler("get_reserve_proof", m_cmd_binder.set_handler("get_reserve_proof",
boost::bind(&simple_wallet::get_reserve_proof, this, _1), boost::bind(&simple_wallet::get_reserve_proof, this, _1),
tr("get_reserve_proof (all|<amount>) [<message>]"), tr(USAGE_GET_RESERVE_PROOF),
tr("Generate a signature proving that you own at least this much, optionally with a challenge string <message>.\n" tr("Generate a signature proving that you own at least this much, optionally with a challenge string <message>.\n"
"If 'all' is specified, you prove the entire sum of all of your existing accounts' balances.\n" "If 'all' is specified, you prove the entire sum of all of your existing accounts' balances.\n"
"Otherwise, you prove the reserve of the smallest possible amount above <amount> available in your current account.")); "Otherwise, you prove the reserve of the smallest possible amount above <amount> available in your current account."));
m_cmd_binder.set_handler("check_reserve_proof", m_cmd_binder.set_handler("check_reserve_proof",
boost::bind(&simple_wallet::check_reserve_proof, this, _1), boost::bind(&simple_wallet::check_reserve_proof, this, _1),
tr("check_reserve_proof <address> <signature_file> [<message>]"), tr(USAGE_CHECK_RESERVE_PROOF),
tr("Check a signature proving that the owner of <address> holds at least this much, optionally with a challenge string <message>.")); 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", m_cmd_binder.set_handler("show_transfers",
boost::bind(&simple_wallet::show_transfers, this, _1), boost::bind(&simple_wallet::show_transfers, this, _1),
tr("show_transfers [in|out|pending|failed|pool|coinbase] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]"), tr(USAGE_SHOW_TRANSFERS),
// Seemingly broken formatting to compensate for the backslash before the quotes. // Seemingly broken formatting to compensate for the backslash before the quotes.
tr("Show the incoming/outgoing transfers within an optional height range.\n\n" tr("Show the incoming/outgoing transfers within an optional height range.\n\n"
"Output format:\n" "Output format:\n"
@ -2680,26 +2763,27 @@ simple_wallet::simple_wallet()
tr("Export to CSV the incoming/outgoing transfers within an optional height range.")); tr("Export to CSV the incoming/outgoing transfers within an optional height range."));
m_cmd_binder.set_handler("unspent_outputs", m_cmd_binder.set_handler("unspent_outputs",
boost::bind(&simple_wallet::unspent_outputs, this, _1), boost::bind(&simple_wallet::unspent_outputs, this, _1),
tr("unspent_outputs [index=<N1>[,<N2>,...]] [<min_amount> [<max_amount>]]"), tr(USAGE_UNSPENT_OUTPUTS),
tr("Show the unspent outputs of a specified address within an optional amount range.")); tr("Show the unspent outputs of a specified address within an optional amount range."));
m_cmd_binder.set_handler("rescan_bc", m_cmd_binder.set_handler("rescan_bc",
boost::bind(&simple_wallet::rescan_blockchain, this, _1), boost::bind(&simple_wallet::rescan_blockchain, this, _1),
tr("rescan_bc [hard]"), tr(USAGE_RESCAN_BC),
tr("Rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself.")); tr("Rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself."));
m_cmd_binder.set_handler("set_tx_note", m_cmd_binder.set_handler("set_tx_note",
boost::bind(&simple_wallet::set_tx_note, this, _1), boost::bind(&simple_wallet::set_tx_note, this, _1),
tr("set_tx_note <txid> [free text note]"), tr(USAGE_SET_TX_NOTE),
tr("Set an arbitrary string note for a <txid>.")); tr("Set an arbitrary string note for a <txid>."));
m_cmd_binder.set_handler("get_tx_note", m_cmd_binder.set_handler("get_tx_note",
boost::bind(&simple_wallet::get_tx_note, this, _1), boost::bind(&simple_wallet::get_tx_note, this, _1),
tr("get_tx_note <txid>"), tr(USAGE_GET_TX_NOTE),
tr("Get a string note for a txid.")); tr("Get a string note for a txid."));
m_cmd_binder.set_handler("set_description", m_cmd_binder.set_handler("set_description",
boost::bind(&simple_wallet::set_description, this, _1), boost::bind(&simple_wallet::set_description, this, _1),
tr("set_description [free text note]"), tr(USAGE_SET_DESCRIPTION),
tr("Set an arbitrary description for the wallet.")); tr("Set an arbitrary description for the wallet."));
m_cmd_binder.set_handler("get_description", m_cmd_binder.set_handler("get_description",
boost::bind(&simple_wallet::get_description, this, _1), boost::bind(&simple_wallet::get_description, this, _1),
tr(USAGE_GET_DESCRIPTION),
tr("Get the description of the wallet.")); tr("Get the description of the wallet."));
m_cmd_binder.set_handler("status", m_cmd_binder.set_handler("status",
boost::bind(&simple_wallet::status, this, _1), boost::bind(&simple_wallet::status, this, _1),
@ -2709,45 +2793,46 @@ simple_wallet::simple_wallet()
tr("Show the wallet's information.")); tr("Show the wallet's information."));
m_cmd_binder.set_handler("sign", m_cmd_binder.set_handler("sign",
boost::bind(&simple_wallet::sign, this, _1), boost::bind(&simple_wallet::sign, this, _1),
tr("sign <file>"), tr(USAGE_SIGN),
tr("Sign the contents of a file.")); tr("Sign the contents of a file."));
m_cmd_binder.set_handler("verify", m_cmd_binder.set_handler("verify",
boost::bind(&simple_wallet::verify, this, _1), boost::bind(&simple_wallet::verify, this, _1),
tr("verify <filename> <address> <signature>"), tr(USAGE_VERIFY),
tr("Verify a signature on the contents of a file.")); tr("Verify a signature on the contents of a file."));
m_cmd_binder.set_handler("export_key_images", m_cmd_binder.set_handler("export_key_images",
boost::bind(&simple_wallet::export_key_images, this, _1), boost::bind(&simple_wallet::export_key_images, this, _1),
tr("export_key_images <file>"), tr(USAGE_EXPORT_KEY_IMAGES),
tr("Export a signed set of key images to a <file>.")); tr("Export a signed set of key images to a <filename>."));
m_cmd_binder.set_handler("import_key_images", m_cmd_binder.set_handler("import_key_images",
boost::bind(&simple_wallet::import_key_images, this, _1), boost::bind(&simple_wallet::import_key_images, this, _1),
tr("import_key_images <file>"), tr(USAGE_IMPORT_KEY_IMAGES),
tr("Import a signed key images list and verify their spent status.")); tr("Import a signed key images list and verify their spent status."));
m_cmd_binder.set_handler("hw_key_images_sync", m_cmd_binder.set_handler("hw_key_images_sync",
boost::bind(&simple_wallet::hw_key_images_sync, this, _1), boost::bind(&simple_wallet::hw_key_images_sync, this, _1),
tr("hw_key_images_sync"), tr(USAGE_HW_KEY_IMAGES_SYNC),
tr("Synchronizes key images with the hw wallet.")); tr("Synchronizes key images with the hw wallet."));
m_cmd_binder.set_handler("hw_reconnect", m_cmd_binder.set_handler("hw_reconnect",
boost::bind(&simple_wallet::hw_reconnect, this, _1), boost::bind(&simple_wallet::hw_reconnect, this, _1),
tr("hw_reconnect"), tr(USAGE_HW_RECONNECT),
tr("Attempts to reconnect HW wallet.")); tr("Attempts to reconnect HW wallet."));
m_cmd_binder.set_handler("export_outputs", m_cmd_binder.set_handler("export_outputs",
boost::bind(&simple_wallet::export_outputs, this, _1), boost::bind(&simple_wallet::export_outputs, this, _1),
tr("export_outputs <file>"), tr(USAGE_EXPORT_OUTPUTS),
tr("Export a set of outputs owned by this wallet.")); tr("Export a set of outputs owned by this wallet."));
m_cmd_binder.set_handler("import_outputs", m_cmd_binder.set_handler("import_outputs",
boost::bind(&simple_wallet::import_outputs, this, _1), boost::bind(&simple_wallet::import_outputs, this, _1),
tr("import_outputs <file>"), tr(USAGE_IMPORT_OUTPUTS),
tr("Import a set of outputs owned by this wallet.")); tr("Import a set of outputs owned by this wallet."));
m_cmd_binder.set_handler("show_transfer", m_cmd_binder.set_handler("show_transfer",
boost::bind(&simple_wallet::show_transfer, this, _1), boost::bind(&simple_wallet::show_transfer, this, _1),
tr("show_transfer <txid>"), tr(USAGE_SHOW_TRANSFER),
tr("Show information about a transfer to/from this address.")); tr("Show information about a transfer to/from this address."));
m_cmd_binder.set_handler("password", m_cmd_binder.set_handler("password",
boost::bind(&simple_wallet::change_password, this, _1), boost::bind(&simple_wallet::change_password, this, _1),
tr("Change the wallet's password.")); tr("Change the wallet's password."));
m_cmd_binder.set_handler("payment_id", m_cmd_binder.set_handler("payment_id",
boost::bind(&simple_wallet::payment_id, this, _1), boost::bind(&simple_wallet::payment_id, this, _1),
tr(USAGE_PAYMENT_ID),
tr("Generate a new random full size payment id. These will be unencrypted on the blockchain, see integrated_address for encrypted short payment ids.")); tr("Generate a new random full size payment id. These will be unencrypted on the blockchain, see integrated_address for encrypted short payment ids."));
m_cmd_binder.set_handler("fee", m_cmd_binder.set_handler("fee",
boost::bind(&simple_wallet::print_fee_info, this, _1), boost::bind(&simple_wallet::print_fee_info, this, _1),
@ -2755,39 +2840,39 @@ simple_wallet::simple_wallet()
m_cmd_binder.set_handler("prepare_multisig", boost::bind(&simple_wallet::prepare_multisig, this, _1), m_cmd_binder.set_handler("prepare_multisig", boost::bind(&simple_wallet::prepare_multisig, this, _1),
tr("Export data needed to create a multisig wallet")); tr("Export data needed to create a multisig wallet"));
m_cmd_binder.set_handler("make_multisig", boost::bind(&simple_wallet::make_multisig, this, _1), m_cmd_binder.set_handler("make_multisig", boost::bind(&simple_wallet::make_multisig, this, _1),
tr("make_multisig <threshold> <string1> [<string>...]"), tr(USAGE_MAKE_MULTISIG),
tr("Turn this wallet into a multisig wallet")); tr("Turn this wallet into a multisig wallet"));
m_cmd_binder.set_handler("finalize_multisig", m_cmd_binder.set_handler("finalize_multisig",
boost::bind(&simple_wallet::finalize_multisig, this, _1), boost::bind(&simple_wallet::finalize_multisig, this, _1),
tr("finalize_multisig <string> [<string>...]"), tr(USAGE_FINALIZE_MULTISIG),
tr("Turn this wallet into a multisig wallet, extra step for N-1/N wallets")); tr("Turn this wallet into a multisig wallet, extra step for N-1/N wallets"));
m_cmd_binder.set_handler("exchange_multisig_keys", m_cmd_binder.set_handler("exchange_multisig_keys",
boost::bind(&simple_wallet::exchange_multisig_keys, this, _1), boost::bind(&simple_wallet::exchange_multisig_keys, this, _1),
tr("exchange_multisig_keys <string> [<string>...]"), tr(USAGE_EXCHANGE_MULTISIG_KEYS),
tr("Performs extra multisig keys exchange rounds. Needed for arbitrary M/N multisig wallets")); tr("Performs extra multisig keys exchange rounds. Needed for arbitrary M/N multisig wallets"));
m_cmd_binder.set_handler("export_multisig_info", m_cmd_binder.set_handler("export_multisig_info",
boost::bind(&simple_wallet::export_multisig, this, _1), boost::bind(&simple_wallet::export_multisig, this, _1),
tr("export_multisig_info <filename>"), tr(USAGE_EXPORT_MULTISIG_INFO),
tr("Export multisig info for other participants")); tr("Export multisig info for other participants"));
m_cmd_binder.set_handler("import_multisig_info", m_cmd_binder.set_handler("import_multisig_info",
boost::bind(&simple_wallet::import_multisig, this, _1), boost::bind(&simple_wallet::import_multisig, this, _1),
tr("import_multisig_info <filename> [<filename>...]"), tr(USAGE_IMPORT_MULTISIG_INFO),
tr("Import multisig info from other participants")); tr("Import multisig info from other participants"));
m_cmd_binder.set_handler("sign_multisig", m_cmd_binder.set_handler("sign_multisig",
boost::bind(&simple_wallet::sign_multisig, this, _1), boost::bind(&simple_wallet::sign_multisig, this, _1),
tr("sign_multisig <filename>"), tr(USAGE_SIGN_MULTISIG),
tr("Sign a multisig transaction from a file")); tr("Sign a multisig transaction from a file"));
m_cmd_binder.set_handler("submit_multisig", m_cmd_binder.set_handler("submit_multisig",
boost::bind(&simple_wallet::submit_multisig, this, _1), boost::bind(&simple_wallet::submit_multisig, this, _1),
tr("submit_multisig <filename>"), tr(USAGE_SUBMIT_MULTISIG),
tr("Submit a signed multisig transaction from a file")); tr("Submit a signed multisig transaction from a file"));
m_cmd_binder.set_handler("export_raw_multisig_tx", m_cmd_binder.set_handler("export_raw_multisig_tx",
boost::bind(&simple_wallet::export_raw_multisig, this, _1), boost::bind(&simple_wallet::export_raw_multisig, this, _1),
tr("export_raw_multisig_tx <filename>"), tr(USAGE_EXPORT_RAW_MULTISIG_TX),
tr("Export a signed multisig transaction to a file")); tr("Export a signed multisig transaction to a file"));
m_cmd_binder.set_handler("mms", m_cmd_binder.set_handler("mms",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms [<subcommand> [<subcommand_parameters>]]"), tr(USAGE_MMS),
tr("Interface with the MMS (Multisig Messaging System)\n" tr("Interface with the MMS (Multisig Messaging System)\n"
"<subcommand> is one of:\n" "<subcommand> is one of:\n"
" init, info, signer, list, next, sync, transfer, delete, send, receive, export, note, show, set, help\n" " init, info, signer, list, next, sync, transfer, delete, send, receive, export, note, show, set, help\n"
@ -2795,112 +2880,112 @@ simple_wallet::simple_wallet()
"Get help about a subcommand with: help mms <subcommand>, or mms help <subcommand>")); "Get help about a subcommand with: help mms <subcommand>, or mms help <subcommand>"));
m_cmd_binder.set_handler("mms init", m_cmd_binder.set_handler("mms init",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms init <required_signers>/<authorized_signers> <own_label> <own_transport_address>"), tr(USAGE_MMS_INIT),
tr("Initialize and configure the MMS for M/N = number of required signers/number of authorized signers multisig")); tr("Initialize and configure the MMS for M/N = number of required signers/number of authorized signers multisig"));
m_cmd_binder.set_handler("mms info", m_cmd_binder.set_handler("mms info",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms info"), tr(USAGE_MMS_INFO),
tr("Display current MMS configuration")); tr("Display current MMS configuration"));
m_cmd_binder.set_handler("mms signer", m_cmd_binder.set_handler("mms signer",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms signer [<number> <label> [<transport_address> [<monero_address>]]]"), tr(USAGE_MMS_SIGNER),
tr("Set or modify authorized signer info (single-word label, transport address, Monero address), or list all signers")); tr("Set or modify authorized signer info (single-word label, transport address, Monero address), or list all signers"));
m_cmd_binder.set_handler("mms list", m_cmd_binder.set_handler("mms list",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms list"), tr(USAGE_MMS_LIST),
tr("List all messages")); tr("List all messages"));
m_cmd_binder.set_handler("mms next", m_cmd_binder.set_handler("mms next",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms next [sync]"), tr(USAGE_MMS_NEXT),
tr("Evaluate the next possible multisig-related action(s) according to wallet state, and execute or offer for choice\n" tr("Evaluate the next possible multisig-related action(s) according to wallet state, and execute or offer for choice\n"
"By using 'sync' processing of waiting messages with multisig sync info can be forced regardless of wallet state")); "By using 'sync' processing of waiting messages with multisig sync info can be forced regardless of wallet state"));
m_cmd_binder.set_handler("mms sync", m_cmd_binder.set_handler("mms sync",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms sync"), tr(USAGE_MMS_SYNC),
tr("Force generation of multisig sync info regardless of wallet state, to recover from special situations like \"stale data\" errors")); tr("Force generation of multisig sync info regardless of wallet state, to recover from special situations like \"stale data\" errors"));
m_cmd_binder.set_handler("mms transfer", m_cmd_binder.set_handler("mms transfer",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms transfer <transfer_command_arguments>"), tr(USAGE_MMS_TRANSFER),
tr("Initiate transfer with MMS support; arguments identical to normal 'transfer' command arguments, for info see there")); tr("Initiate transfer with MMS support; arguments identical to normal 'transfer' command arguments, for info see there"));
m_cmd_binder.set_handler("mms delete", m_cmd_binder.set_handler("mms delete",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms delete (<message_id> | all)"), tr(USAGE_MMS_DELETE),
tr("Delete a single message by giving its id, or delete all messages by using 'all'")); tr("Delete a single message by giving its id, or delete all messages by using 'all'"));
m_cmd_binder.set_handler("mms send", m_cmd_binder.set_handler("mms send",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms send [<message_id>]"), tr(USAGE_MMS_SEND),
tr("Send a single message by giving its id, or send all waiting messages")); tr("Send a single message by giving its id, or send all waiting messages"));
m_cmd_binder.set_handler("mms receive", m_cmd_binder.set_handler("mms receive",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms receive"), tr(USAGE_MMS_RECEIVE),
tr("Check right away for new messages to receive")); tr("Check right away for new messages to receive"));
m_cmd_binder.set_handler("mms export", m_cmd_binder.set_handler("mms export",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms export <message_id"), tr(USAGE_MMS_EXPORT),
tr("Write the content of a message to a file \"mms_message_content\"")); tr("Write the content of a message to a file \"mms_message_content\""));
m_cmd_binder.set_handler("mms note", m_cmd_binder.set_handler("mms note",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms note [<label> <text>]"), tr(USAGE_MMS_NOTE),
tr("Send a one-line message to an authorized signer, identified by its label, or show any waiting unread notes")); tr("Send a one-line message to an authorized signer, identified by its label, or show any waiting unread notes"));
m_cmd_binder.set_handler("mms show", m_cmd_binder.set_handler("mms show",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms show <message_id>"), tr(USAGE_MMS_SHOW),
tr("Show detailed info about a single message")); tr("Show detailed info about a single message"));
m_cmd_binder.set_handler("mms set", m_cmd_binder.set_handler("mms set",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms set <option_name> [<option_value>]"), tr(USAGE_MMS_SET),
tr("Available options:\n " tr("Available options:\n "
"auto-send <1|0>\n " "auto-send <1|0>\n "
" Whether to automatically send newly generated messages right away.\n ")); " Whether to automatically send newly generated messages right away.\n "));
m_cmd_binder.set_handler("mms send_message_config", m_cmd_binder.set_handler("mms send_message_config",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms send_signer_config"), tr(USAGE_MMS_SEND_SIGNER_CONFIG),
tr("Send completed signer config to all other authorized signers")); tr("Send completed signer config to all other authorized signers"));
m_cmd_binder.set_handler("mms start_auto_config", m_cmd_binder.set_handler("mms start_auto_config",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms start_auto_config [<label> <label> ...]"), tr(USAGE_MMS_START_AUTO_CONFIG),
tr("Start auto-config at the auto-config manager's wallet by issuing auto-config tokens and optionally set others' labels")); tr("Start auto-config at the auto-config manager's wallet by issuing auto-config tokens and optionally set others' labels"));
m_cmd_binder.set_handler("mms stop_auto_config", m_cmd_binder.set_handler("mms stop_auto_config",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms stop_auto_config"), tr(USAGE_MMS_STOP_AUTO_CONFIG),
tr("Delete any auto-config tokens and abort a auto-config process")); tr("Delete any auto-config tokens and abort a auto-config process"));
m_cmd_binder.set_handler("mms auto_config", m_cmd_binder.set_handler("mms auto_config",
boost::bind(&simple_wallet::mms, this, _1), boost::bind(&simple_wallet::mms, this, _1),
tr("mms auto_config <auto_config_token>"), tr(USAGE_MMS_AUTO_CONFIG),
tr("Start auto-config by using the token received from the auto-config manager")); tr("Start auto-config by using the token received from the auto-config manager"));
m_cmd_binder.set_handler("print_ring", m_cmd_binder.set_handler("print_ring",
boost::bind(&simple_wallet::print_ring, this, _1), boost::bind(&simple_wallet::print_ring, this, _1),
tr("print_ring <key_image> | <txid>"), tr(USAGE_PRINT_RING),
tr("Print the ring(s) used to spend a given key image or transaction (if the ring size is > 1)\n\n" tr("Print the ring(s) used to spend a given key image or transaction (if the ring size is > 1)\n\n"
"Output format:\n" "Output format:\n"
"Key Image, \"absolute\", list of rings")); "Key Image, \"absolute\", list of rings"));
m_cmd_binder.set_handler("set_ring", m_cmd_binder.set_handler("set_ring",
boost::bind(&simple_wallet::set_ring, this, _1), boost::bind(&simple_wallet::set_ring, this, _1),
tr("set_ring <filename> | ( <key_image> absolute|relative <index> [<index>...] )"), tr(USAGE_SET_RING),
tr("Set the ring used for a given key image, so it can be reused in a fork")); tr("Set the ring used for a given key image, so it can be reused in a fork"));
m_cmd_binder.set_handler("save_known_rings", m_cmd_binder.set_handler("save_known_rings",
boost::bind(&simple_wallet::save_known_rings, this, _1), boost::bind(&simple_wallet::save_known_rings, this, _1),
tr("save_known_rings"), tr(USAGE_SAVE_KNOWN_RINGS),
tr("Save known rings to the shared rings database")); tr("Save known rings to the shared rings database"));
m_cmd_binder.set_handler("mark_output_spent", m_cmd_binder.set_handler("mark_output_spent",
boost::bind(&simple_wallet::blackball, this, _1), boost::bind(&simple_wallet::blackball, this, _1),
tr("mark_output_spent <amount>/<offset> | <filename> [add]"), tr(USAGE_MARK_OUTPUT_SPENT),
tr("Mark output(s) as spent so they never get selected as fake outputs in a ring")); tr("Mark output(s) as spent so they never get selected as fake outputs in a ring"));
m_cmd_binder.set_handler("mark_output_unspent", m_cmd_binder.set_handler("mark_output_unspent",
boost::bind(&simple_wallet::unblackball, this, _1), boost::bind(&simple_wallet::unblackball, this, _1),
tr("mark_output_unspent <amount>/<offset>"), tr(USAGE_MARK_OUTPUT_UNSPENT),
tr("Marks an output as unspent so it may get selected as a fake output in a ring")); tr("Marks an output as unspent so it may get selected as a fake output in a ring"));
m_cmd_binder.set_handler("is_output_spent", m_cmd_binder.set_handler("is_output_spent",
boost::bind(&simple_wallet::blackballed, this, _1), boost::bind(&simple_wallet::blackballed, this, _1),
tr("is_output_spent <amount>/<offset>"), tr(USAGE_IS_OUTPUT_SPENT),
tr("Checks whether an output is marked as spent")); tr("Checks whether an output is marked as spent"));
m_cmd_binder.set_handler("version", m_cmd_binder.set_handler("version",
boost::bind(&simple_wallet::version, this, _1), boost::bind(&simple_wallet::version, this, _1),
tr("version"), tr(USAGE_VERSION),
tr("Returns version information")); tr("Returns version information"));
m_cmd_binder.set_handler("help", m_cmd_binder.set_handler("help",
boost::bind(&simple_wallet::help, this, _1), boost::bind(&simple_wallet::help, this, _1),
tr("help [<command>]"), tr(USAGE_HELP),
tr("Show the help section or the documentation about a <command>.")); tr("Show the help section or the documentation about a <command>."));
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
@ -3014,7 +3099,7 @@ bool simple_wallet::set_log(const std::vector<std::string> &args)
{ {
if(args.size() > 1) if(args.size() > 1)
{ {
fail_msg_writer() << tr("usage: set_log <log_level_number_0-4> | <categories>"); PRINT_USAGE(USAGE_SET_LOG);
return true; return true;
} }
if(!args.empty()) if(!args.empty())
@ -3024,7 +3109,7 @@ bool simple_wallet::set_log(const std::vector<std::string> &args)
{ {
if(4 < level) if(4 < level)
{ {
fail_msg_writer() << tr("wrong number range, use: set_log <log_level_number_0-4> | <categories>"); fail_msg_writer() << boost::format(tr("wrong number range, use: %s")) % USAGE_SET_LOG;
return true; return true;
} }
mlog_set_log_level(level); mlog_set_log_level(level);
@ -4320,7 +4405,7 @@ bool simple_wallet::start_mining(const std::vector<std::string>& args)
if (!ok) if (!ok)
{ {
fail_msg_writer() << tr("invalid arguments. Please use start_mining [<number_of_threads>] [do_bg_mining] [ignore_battery]"); PRINT_USAGE(USAGE_START_MINING);
return true; return true;
} }
@ -4362,7 +4447,7 @@ bool simple_wallet::set_daemon(const std::vector<std::string>& args)
if (args.size() < 1) if (args.size() < 1)
{ {
fail_msg_writer() << tr("missing daemon URL argument"); PRINT_USAGE(USAGE_SET_DAEMON);
return true; return true;
} }
@ -4707,7 +4792,7 @@ bool simple_wallet::show_balance(const std::vector<std::string>& args/* = std::v
{ {
if (args.size() > 1 || (args.size() == 1 && args[0] != "detail")) if (args.size() > 1 || (args.size() == 1 && args[0] != "detail"))
{ {
fail_msg_writer() << tr("usage: balance [detail]"); PRINT_USAGE(USAGE_SHOW_BALANCE);
return true; return true;
} }
LOCK_IDLE_SCOPE(); LOCK_IDLE_SCOPE();
@ -4719,7 +4804,7 @@ bool simple_wallet::show_incoming_transfers(const std::vector<std::string>& args
{ {
if (args.size() > 3) if (args.size() > 3)
{ {
fail_msg_writer() << tr("usage: incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]]"); PRINT_USAGE(USAGE_INCOMING_TRANSFERS);
return true; return true;
} }
auto local_args = args; auto local_args = args;
@ -4761,7 +4846,7 @@ bool simple_wallet::show_incoming_transfers(const std::vector<std::string>& args
if (local_args.size() > 0) if (local_args.size() > 0)
{ {
fail_msg_writer() << tr("usage: incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]]"); PRINT_USAGE(USAGE_INCOMING_TRANSFERS);
return true; return true;
} }
@ -4826,7 +4911,7 @@ bool simple_wallet::show_payments(const std::vector<std::string> &args)
{ {
if(args.empty()) if(args.empty())
{ {
fail_msg_writer() << tr("expected at least one payment ID"); PRINT_USAGE(USAGE_PAYMENTS);
return true; return true;
} }
@ -5659,7 +5744,14 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
{ {
auto print_usage = [below]() auto print_usage = [below]()
{ {
fail_msg_writer() << boost::format(tr("usage: %s [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] [outputs=<N>] <address> [<payment_id>]")) % (below ? "sweep_below" : "sweep_all"); if (below)
{
PRINT_USAGE(USAGE_SWEEP_BELOW);
}
else
{
PRINT_USAGE(USAGE_SWEEP_ALL);
}
}; };
if (args_.size() == 0) if (args_.size() == 0)
{ {
@ -6077,7 +6169,7 @@ bool simple_wallet::sweep_single(const std::vector<std::string> &args_)
if (local_args.size() != 2) if (local_args.size() != 2)
{ {
fail_msg_writer() << tr("usage: sweep_single [<priority>] [<ring_size>] [outputs=<N>] <key_image> <address> [<payment_id>]"); PRINT_USAGE(USAGE_SWEEP_SINGLE);
return true; return true;
} }
@ -6241,7 +6333,7 @@ bool simple_wallet::donate(const std::vector<std::string> &args_)
std::vector<std::string> local_args = args_; std::vector<std::string> local_args = args_;
if(local_args.empty() || local_args.size() > 5) if(local_args.empty() || local_args.size() > 5)
{ {
fail_msg_writer() << tr("usage: donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id>]"); PRINT_USAGE(USAGE_DONATE);
return true; return true;
} }
std::string amount_str; std::string amount_str;
@ -6454,7 +6546,7 @@ bool simple_wallet::sign_transfer(const std::vector<std::string> &args_)
} }
if (args_.size() > 1 || (args_.size() == 1 && args_[0] != "export_raw")) if (args_.size() > 1 || (args_.size() == 1 && args_[0] != "export_raw"))
{ {
fail_msg_writer() << tr("usage: sign_transfer [export_raw]"); PRINT_USAGE(USAGE_SIGN_TRANSFER);
return true; return true;
} }
@ -6544,7 +6636,7 @@ bool simple_wallet::get_tx_key(const std::vector<std::string> &args_)
return true; return true;
} }
if(local_args.size() != 1) { if(local_args.size() != 1) {
fail_msg_writer() << tr("usage: get_tx_key <txid>"); PRINT_USAGE(USAGE_GET_TX_KEY);
return true; return true;
} }
@ -6580,7 +6672,7 @@ bool simple_wallet::set_tx_key(const std::vector<std::string> &args_)
std::vector<std::string> local_args = args_; std::vector<std::string> local_args = args_;
if(local_args.size() != 2) { if(local_args.size() != 2) {
fail_msg_writer() << tr("usage: set_tx_key <txid> <tx_key>"); PRINT_USAGE(USAGE_SET_TX_KEY);
return true; return true;
} }
@ -6642,7 +6734,7 @@ bool simple_wallet::get_tx_proof(const std::vector<std::string> &args)
} }
if (args.size() != 2 && args.size() != 3) if (args.size() != 2 && args.size() != 3)
{ {
fail_msg_writer() << tr("usage: get_tx_proof <txid> <address> [<message>]"); PRINT_USAGE(USAGE_GET_TX_PROOF);
return true; return true;
} }
@ -6683,7 +6775,7 @@ bool simple_wallet::check_tx_key(const std::vector<std::string> &args_)
std::vector<std::string> local_args = args_; std::vector<std::string> local_args = args_;
if(local_args.size() != 3) { if(local_args.size() != 3) {
fail_msg_writer() << tr("usage: check_tx_key <txid> <txkey> <address>"); PRINT_USAGE(USAGE_CHECK_TX_KEY);
return true; return true;
} }
@ -6769,7 +6861,7 @@ bool simple_wallet::check_tx_key(const std::vector<std::string> &args_)
bool simple_wallet::check_tx_proof(const std::vector<std::string> &args) bool simple_wallet::check_tx_proof(const std::vector<std::string> &args)
{ {
if(args.size() != 3 && args.size() != 4) { if(args.size() != 3 && args.size() != 4) {
fail_msg_writer() << tr("usage: check_tx_proof <txid> <address> <signature_file> [<message>]"); PRINT_USAGE(USAGE_CHECK_TX_PROOF);
return true; return true;
} }
@ -6852,7 +6944,7 @@ bool simple_wallet::get_spend_proof(const std::vector<std::string> &args)
return true; return true;
} }
if(args.size() != 1 && args.size() != 2) { if(args.size() != 1 && args.size() != 2) {
fail_msg_writer() << tr("usage: get_spend_proof <txid> [<message>]"); PRINT_USAGE(USAGE_GET_SPEND_PROOF);
return true; return true;
} }
@ -6893,7 +6985,7 @@ bool simple_wallet::get_spend_proof(const std::vector<std::string> &args)
bool simple_wallet::check_spend_proof(const std::vector<std::string> &args) bool simple_wallet::check_spend_proof(const std::vector<std::string> &args)
{ {
if(args.size() != 2 && args.size() != 3) { if(args.size() != 2 && args.size() != 3) {
fail_msg_writer() << tr("usage: check_spend_proof <txid> <signature_file> [<message>]"); PRINT_USAGE(USAGE_CHECK_SPEND_PROOF);
return true; return true;
} }
@ -6936,7 +7028,7 @@ bool simple_wallet::get_reserve_proof(const std::vector<std::string> &args)
return true; return true;
} }
if(args.size() != 1 && args.size() != 2) { if(args.size() != 1 && args.size() != 2) {
fail_msg_writer() << tr("usage: get_reserve_proof (all|<amount>) [<message>]"); PRINT_USAGE(USAGE_GET_RESERVE_PROOF);
return true; return true;
} }
@ -6982,7 +7074,7 @@ bool simple_wallet::get_reserve_proof(const std::vector<std::string> &args)
bool simple_wallet::check_reserve_proof(const std::vector<std::string> &args) bool simple_wallet::check_reserve_proof(const std::vector<std::string> &args)
{ {
if(args.size() != 2 && args.size() != 3) { if(args.size() != 2 && args.size() != 3) {
fail_msg_writer() << tr("usage: check_reserve_proof <address> <signature_file> [<message>]"); PRINT_USAGE(USAGE_CHECK_RESERVE_PROOF);
return true; return true;
} }
@ -7419,7 +7511,7 @@ bool simple_wallet::unspent_outputs(const std::vector<std::string> &args_)
{ {
if(args_.size() > 3) if(args_.size() > 3)
{ {
fail_msg_writer() << tr("usage: unspent_outputs [index=<N1>[,<N2>,...]] [<min_amount> [<max_amount>]]"); PRINT_USAGE(USAGE_UNSPENT_OUTPUTS);
return true; return true;
} }
auto local_args = args_; auto local_args = args_;
@ -7560,7 +7652,7 @@ bool simple_wallet::rescan_blockchain(const std::vector<std::string> &args_)
{ {
if (args_[0] != "hard") if (args_[0] != "hard")
{ {
fail_msg_writer() << tr("usage: rescan_bc [hard]"); PRINT_USAGE(USAGE_RESCAN_BC);
return true; return true;
} }
hard = true; hard = true;
@ -7805,14 +7897,7 @@ bool simple_wallet::account(const std::vector<std::string> &args/* = std::vector
} }
else else
{ {
fail_msg_writer() << tr("usage:\n" PRINT_USAGE(USAGE_ACCOUNT);
" account\n"
" account new <label text with white spaces allowed>\n"
" account switch <index>\n"
" account label <index> <label text with white spaces allowed>\n"
" account tag <tag_name> <account_index_1> [<account_index_2> ...]\n"
" account untag <account_index_1> [<account_index_2> ...]\n"
" account tag_description <tag_name> <description>");
} }
return true; return true;
} }
@ -7967,7 +8052,7 @@ bool simple_wallet::print_address(const std::vector<std::string> &args/* = std::
} }
else else
{ {
fail_msg_writer() << tr("usage: address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed> ]"); PRINT_USAGE(USAGE_ADDRESS);
} }
return true; return true;
@ -7978,7 +8063,7 @@ bool simple_wallet::print_integrated_address(const std::vector<std::string> &arg
crypto::hash8 payment_id; crypto::hash8 payment_id;
if (args.size() > 1) if (args.size() > 1)
{ {
fail_msg_writer() << tr("usage: integrated_address [payment ID]"); PRINT_USAGE(USAGE_INTEGRATED_ADDRESS);
return true; return true;
} }
if (args.size() == 0) if (args.size() == 0)
@ -8030,7 +8115,7 @@ bool simple_wallet::address_book(const std::vector<std::string> &args/* = std::v
} }
else if (args.size() == 1 || (args[0] != "add" && args[0] != "delete")) else if (args.size() == 1 || (args[0] != "add" && args[0] != "delete"))
{ {
fail_msg_writer() << tr("usage: address_book [(add (<address> [pid <long or short payment id>])|<integrated address> [<description possibly with whitespaces>])|(delete <index>)]"); PRINT_USAGE(USAGE_ADDRESS_BOOK);
return true; return true;
} }
else if (args[0] == "add") else if (args[0] == "add")
@ -8105,7 +8190,7 @@ bool simple_wallet::set_tx_note(const std::vector<std::string> &args)
{ {
if (args.size() == 0) if (args.size() == 0)
{ {
fail_msg_writer() << tr("usage: set_tx_note [txid] free text note"); PRINT_USAGE(USAGE_SET_TX_NOTE);
return true; return true;
} }
@ -8133,7 +8218,7 @@ bool simple_wallet::get_tx_note(const std::vector<std::string> &args)
{ {
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: get_tx_note [txid]"); PRINT_USAGE(USAGE_GET_TX_NOTE);
return true; return true;
} }
@ -8174,7 +8259,7 @@ bool simple_wallet::get_description(const std::vector<std::string> &args)
{ {
if (args.size() != 0) if (args.size() != 0)
{ {
fail_msg_writer() << tr("usage: get_description"); PRINT_USAGE(USAGE_GET_DESCRIPTION);
return true; return true;
} }
@ -8247,7 +8332,7 @@ bool simple_wallet::sign(const std::vector<std::string> &args)
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: sign <filename>"); PRINT_USAGE(USAGE_SIGN);
return true; return true;
} }
if (m_wallet->watch_only()) if (m_wallet->watch_only())
@ -8281,7 +8366,7 @@ bool simple_wallet::verify(const std::vector<std::string> &args)
{ {
if (args.size() != 3) if (args.size() != 3)
{ {
fail_msg_writer() << tr("usage: verify <filename> <address> <signature>"); PRINT_USAGE(USAGE_VERIFY);
return true; return true;
} }
std::string filename = args[0]; std::string filename = args[0];
@ -8324,7 +8409,7 @@ bool simple_wallet::export_key_images(const std::vector<std::string> &args)
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: export_key_images <filename>"); PRINT_USAGE(USAGE_EXPORT_KEY_IMAGES);
return true; return true;
} }
if (m_wallet->watch_only()) if (m_wallet->watch_only())
@ -8373,7 +8458,7 @@ bool simple_wallet::import_key_images(const std::vector<std::string> &args)
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: import_key_images <filename>"); PRINT_USAGE(USAGE_IMPORT_KEY_IMAGES);
return true; return true;
} }
std::string filename = args[0]; std::string filename = args[0];
@ -8480,7 +8565,7 @@ bool simple_wallet::export_outputs(const std::vector<std::string> &args)
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: export_outputs <filename>"); PRINT_USAGE(USAGE_EXPORT_OUTPUTS);
return true; return true;
} }
@ -8520,7 +8605,7 @@ bool simple_wallet::import_outputs(const std::vector<std::string> &args)
} }
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: import_outputs <filename>"); PRINT_USAGE(USAGE_IMPORT_OUTPUTS);
return true; return true;
} }
std::string filename = args[0]; std::string filename = args[0];
@ -8552,7 +8637,7 @@ bool simple_wallet::show_transfer(const std::vector<std::string> &args)
{ {
if (args.size() != 1) if (args.size() != 1)
{ {
fail_msg_writer() << tr("usage: show_transfer <txid>"); PRINT_USAGE(USAGE_SHOW_TRANSFER);
return true; return true;
} }
@ -8784,7 +8869,7 @@ int main(int argc, char* argv[])
bool should_terminate = false; bool should_terminate = false;
std::tie(vm, should_terminate) = wallet_args::main( std::tie(vm, should_terminate) = wallet_args::main(
argc, argv, argc, argv,
"monero-wallet-cli [--wallet-file=<file>|--generate-new-wallet=<file>] [<COMMAND>]", "monero-wallet-cli [--wallet-file=<filename>|--generate-new-wallet=<filename>] [<COMMAND>]",
sw::tr("This is the command line monero wallet. It needs to connect to a monero\ndaemon to work correctly.\nWARNING: Do not reuse your Monero keys on another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy."), sw::tr("This is the command line monero wallet. It needs to connect to a monero\ndaemon to work correctly.\nWARNING: Do not reuse your Monero keys on another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy."),
desc_params, desc_params,
positional_options, positional_options,
@ -9843,6 +9928,7 @@ bool simple_wallet::mms(const std::vector<std::string> &args)
catch (const std::exception &e) catch (const std::exception &e)
{ {
fail_msg_writer() << tr("Error in MMS command: ") << e.what(); fail_msg_writer() << tr("Error in MMS command: ") << e.what();
PRINT_USAGE(USAGE_MMS);
return true; return true;
} }
return true; return true;