2745 : m_allow_mismatched_daemon_version(false)
2746 , m_refresh_progress_reporter(*this)
2747 , m_idle_run(true)
2748 , m_auto_refresh_enabled(false)
2749 , m_auto_refresh_refreshing(false)
2750 , m_in_manual_refresh(false)
2751 , m_current_subaddress_account(0)
2752{
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762 m_cmd_binder.set_handler("set_daemon",
2763 boost::bind(&simple_wallet::set_daemon, this, _1),
2764 tr(USAGE_SET_DAEMON),
2765 tr(
"Set another daemon to connect to."));
2766 m_cmd_binder.set_handler("save_bc",
2767 boost::bind(&simple_wallet::save_bc, this, _1),
2768 tr(
"Save the current blockchain data."));
2769 m_cmd_binder.set_handler("refresh",
2770 boost::bind(&simple_wallet::refresh, this, _1),
2771 tr(
"Synchronize the transactions and balance."));
2772 m_cmd_binder.set_handler("balance",
2773 boost::bind(&simple_wallet::show_balance, this, _1),
2774 tr(USAGE_SHOW_BALANCE),
2775 tr(
"Show the wallet's balance of the currently selected account."));
2776 m_cmd_binder.set_handler("incoming_transfers",
2777 boost::bind(&simple_wallet::show_incoming_transfers, this, _1),
2778 tr(USAGE_INCOMING_TRANSFERS),
2779 tr(
"Show the incoming transfers, all or filtered by availability and address index.\n\n"
2780 "Output format:\n"
2781 "Amount, Spent(\"T\"|\"F\"), \"frozen\"|\"locked\"|\"unlocked\", RingCT, Global Index, Transaction Hash, Address Index, [Public Key, Key Image] "));
2782 m_cmd_binder.set_handler("payments",
2783 boost::bind(&simple_wallet::show_payments, this, _1),
2785 tr(
"Show the payments for the given payment IDs."));
2786 m_cmd_binder.set_handler("bc_height",
2787 boost::bind(&simple_wallet::show_blockchain_height, this, _1),
2788 tr(
"Show the blockchain height."));
2789 m_cmd_binder.set_handler("transfer", boost::bind(&simple_wallet::transfer, this, _1),
2791 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 in the ring signature. 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)"));
2792 m_cmd_binder.set_handler("locked_transfer",
2793 boost::bind(&simple_wallet::locked_transfer, this, _1),
2794 tr(USAGE_LOCKED_TRANSFER),
2795 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 in the ring signature. 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)"));
2796 m_cmd_binder.set_handler("locked_sweep_all",
2797 boost::bind(&simple_wallet::locked_sweep_all, this, _1),
2798 tr(USAGE_LOCKED_SWEEP_ALL),
2799 tr(
"Send all unlocked balance to an address and lock it for <lockblocks> (max. 1000000). If the parameter \"index=<N1>[,<N2>,...]\" or \"index=all\" is specified, the wallet sweeps outputs received by those or all address indices, respectively. 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."));
2800 m_cmd_binder.set_handler("sweep_unmixable",
2801 boost::bind(&simple_wallet::sweep_unmixable, this, _1),
2802 tr(
"Send all unmixable outputs to yourself with ring_size 1"));
2803 m_cmd_binder.set_handler("sweep_all", boost::bind(&simple_wallet::sweep_all, this, _1),
2804 tr(USAGE_SWEEP_ALL),
2805 tr(
"Send all unlocked balance to an address. If the parameter \"index=<N1>[,<N2>,...]\" or \"index=all\" is specified, the wallet sweeps outputs received by those or all address indices, respectively. 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."));
2806 m_cmd_binder.set_handler("sweep_below",
2807 boost::bind(&simple_wallet::sweep_below, this, _1),
2808 tr(USAGE_SWEEP_BELOW),
2809 tr(
"Send all unlocked outputs below the threshold to an address."));
2810 m_cmd_binder.set_handler("sweep_single",
2811 boost::bind(&simple_wallet::sweep_single, this, _1),
2812 tr(USAGE_SWEEP_SINGLE),
2813 tr(
"Send a single output of the given key image to an address without change."));
2814
2815
2816
2817
2818
2819
2820 m_cmd_binder.set_handler("sign_transfer",
2821 boost::bind(&simple_wallet::sign_transfer, this, _1),
2822 tr(USAGE_SIGN_TRANSFER),
2823 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."));
2824 m_cmd_binder.set_handler("submit_transfer",
2825 boost::bind(&simple_wallet::submit_transfer, this, _1),
2826 tr(
"Submit a signed transaction from a file."));
2827 m_cmd_binder.set_handler("set_log",
2828 boost::bind(&simple_wallet::set_log, this, _1),
2830 tr(
"Change the current log detail (level must be <0-4>)."));
2831 m_cmd_binder.set_handler("account",
2832 boost::bind(&simple_wallet::account, this, _1),
2834 tr(
"If no arguments are specified, the wallet shows all the existing accounts along with their balances.\n"
2835 "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"
2836 "If the \"switch\" argument is specified, the wallet switches to the account specified by <index>.\n"
2837 "If the \"label\" argument is specified, the wallet sets the label of the account specified by <index> to the provided label text.\n"
2838 "If the \"tag\" argument is specified, a tag <tag_name> is assigned to the specified accounts <account_index_1>, <account_index_2>, ....\n"
2839 "If the \"untag\" argument is specified, the tags assigned to the specified accounts <account_index_1>, <account_index_2> ..., are removed.\n"
2840 "If the \"tag_description\" argument is specified, the tag <tag_name> is assigned an arbitrary text <description>."));
2841 m_cmd_binder.set_handler("address",
2842 boost::bind(&simple_wallet::print_address, this, _1),
2844 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."));
2845 m_cmd_binder.set_handler("integrated_address",
2846 boost::bind(&simple_wallet::print_integrated_address, this, _1),
2847 tr(USAGE_INTEGRATED_ADDRESS),
2848 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"));
2849 m_cmd_binder.set_handler("address_book",
2850 boost::bind(&simple_wallet::address_book, this, _1),
2851 tr(USAGE_ADDRESS_BOOK),
2852 tr(
"Print all entries in the address book, optionally adding/deleting an entry to/from it."));
2853 m_cmd_binder.set_handler("save",
2854 boost::bind(&simple_wallet::save, this, _1),
2855 tr(
"Save the wallet data."));
2856 m_cmd_binder.set_handler("save_watch_only",
2857 boost::bind(&simple_wallet::save_watch_only, this, _1),
2858 tr(
"Save a watch-only keys file."));
2859 m_cmd_binder.set_handler("viewkey",
2860 boost::bind(&simple_wallet::viewkey, this, _1),
2861 tr(
"Display the private view key."));
2862 m_cmd_binder.set_handler("spendkey",
2863 boost::bind(&simple_wallet::spendkey, this, _1),
2864 tr(
"Display the private spend key."));
2865 m_cmd_binder.set_handler("seed",
2866 boost::bind(&simple_wallet::seed, this, _1),
2867 tr(
"Display the Electrum-style mnemonic seed"));
2868 m_cmd_binder.set_handler("set",
2869 boost::bind(&simple_wallet::set_variable, this, _1),
2870 tr(USAGE_SET_VARIABLE),
2871 tr(
"Available options:\n "
2872 "seed language\n "
2873 " Set the wallet's seed language.\n "
2874 "always-confirm-transfers <1|0>\n "
2875 " Whether to confirm unsplit txes.\n "
2876 "print-ring-members <1|0>\n "
2877 " Whether to print detailed information about ring members during confirmation.\n "
2878 "store-tx-info <1|0>\n "
2879 " Whether to store outgoing tx info (destination address, payment ID, tx secret key) for future reference.\n "
2880 "default-ring-size <n>\n "
2881 " Set the default ring size (obsolete).\n "
2882 "auto-refresh <1|0>\n "
2883 " Whether to automatically synchronize new blocks from the daemon.\n "
2884 "refresh-type <full|optimize-coinbase|no-coinbase|default>\n "
2885 " Set the wallet's refresh behaviour.\n "
2886 "priority [0|1|2|3|4]\n "
2887 " Set the fee to default/unimportant/normal/elevated/priority.\n "
2888 "confirm-missing-payment-id <1|0> (obsolete)\n "
2889 "ask-password <0|1|2 (or never|action|decrypt)>\n "
2890 " action: ask the password before many actions such as transfer, etc\n "
2891 " decrypt: same as action, but keeps the spend key encrypted in memory when not needed\n "
2892 "unit <ETN|cent>\n "
2893 " Set the default Electroneum (sub-)unit.\n "
2894 "min-outputs-count [n]\n "
2895 " Try to keep at least that many outputs of value at least min-outputs-value.\n "
2896 "min-outputs-value [n]\n "
2897 " Try to keep at least min-outputs-count outputs of at least that value.\n "
2898 "merge-destinations <1|0>\n "
2899 " Whether to merge multiple payments to the same destination address.\n "
2900 "confirm-backlog <1|0>\n "
2901 " Whether to warn if there is transaction backlog.\n "
2902 "confirm-backlog-threshold [n]\n "
2903 " Set a threshold for confirm-backlog to only warn if the transaction backlog is greater than n blocks.\n "
2904 "refresh-from-block-height [n]\n "
2905 " Set the height before which to ignore blocks.\n "
2906 "auto-low-priority <1|0>\n "
2907 " Whether to automatically use the low priority fee level when it's safe to do so.\n "
2908 "segregate-pre-fork-outputs <1|0>\n "
2909 " Set this if you intend to spend outputs on both Electroneum AND a key reusing fork.\n "
2910 "key-reuse-mitigation2 <1|0>\n "
2911 " Set this if you are not sure whether you will spend on a key reusing Electroneum fork later.\n"
2912 "subaddress-lookahead <major>:<minor>\n "
2913 " Set the lookahead sizes for the subaddress hash table.\n "
2914 " Set this if you are not sure whether you will spend on a key reusing Electroneum fork later.\n "
2915 "segregation-height <n>\n "
2916 " Set to the height of a key reusing fork you want to use, 0 to use default."));
2917 m_cmd_binder.set_handler("encrypted_seed",
2918 boost::bind(&simple_wallet::encrypted_seed, this, _1),
2919 tr(
"Display the encrypted Electrum-style mnemonic seed."));
2920 m_cmd_binder.set_handler("rescan_spent",
2921 boost::bind(&simple_wallet::rescan_spent, this, _1),
2922 tr(
"Rescan the blockchain for spent outputs."));
2923 m_cmd_binder.set_handler("get_tx_key",
2924 boost::bind(&simple_wallet::get_tx_key, this, _1),
2925 tr(USAGE_GET_TX_KEY),
2926 tr(
"Get the transaction key (r) for a given <txid>."));
2927 m_cmd_binder.set_handler("set_tx_key",
2928 boost::bind(&simple_wallet::set_tx_key, this, _1),
2929 tr(USAGE_SET_TX_KEY),
2930 tr(
"Set the transaction key (r) for a given <txid> in case the tx was made by some other device or 3rd party wallet."));
2931 m_cmd_binder.set_handler("check_tx_key",
2932 boost::bind(&simple_wallet::check_tx_key, this, _1),
2933 tr(USAGE_CHECK_TX_KEY),
2934 tr(
"Check the amount going to <address> in <txid>."));
2935 m_cmd_binder.set_handler("get_tx_proof",
2936 boost::bind(&simple_wallet::get_tx_proof, this, _1),
2937 tr(USAGE_GET_TX_PROOF),
2938 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."));
2939 m_cmd_binder.set_handler("check_tx_proof",
2940 boost::bind(&simple_wallet::check_tx_proof, this, _1),
2941 tr(USAGE_CHECK_TX_PROOF),
2942 tr(
"Check the proof for funds going to <address> in <txid> with the challenge string <message> if any."));
2943 m_cmd_binder.set_handler("get_spend_proof",
2944 boost::bind(&simple_wallet::get_spend_proof, this, _1),
2945 tr(USAGE_GET_SPEND_PROOF),
2946 tr(
"Generate a signature proving that you generated <txid> using the spend secret key, optionally with a challenge string <message>."));
2947 m_cmd_binder.set_handler("check_spend_proof",
2948 boost::bind(&simple_wallet::check_spend_proof, this, _1),
2949 tr(USAGE_CHECK_SPEND_PROOF),
2950 tr(
"Check a signature proving that the signer generated <txid>, optionally with a challenge string <message>."));
2951 m_cmd_binder.set_handler("get_reserve_proof",
2952 boost::bind(&simple_wallet::get_reserve_proof, this, _1),
2953 tr(USAGE_GET_RESERVE_PROOF),
2954 tr(
"Generate a signature proving that you own at least this much, optionally with a challenge string <message>.\n"
2955 "If 'all' is specified, you prove the entire sum of all of your existing accounts' balances.\n"
2956 "Otherwise, you prove the reserve of the smallest possible amount above <amount> available in your current account."));
2957 m_cmd_binder.set_handler("check_reserve_proof",
2958 boost::bind(&simple_wallet::check_reserve_proof, this, _1),
2959 tr(USAGE_CHECK_RESERVE_PROOF),
2960 tr(
"Check a signature proving that the owner of <address> holds at least this much, optionally with a challenge string <message>."));
2961 m_cmd_binder.set_handler("show_transfers",
2962 boost::bind(&simple_wallet::show_transfers, this, _1),
2963 tr(USAGE_SHOW_TRANSFERS),
2964
2965 tr(
"Show the incoming/outgoing transfers within an optional height range.\n\n"
2966 "Output format:\n"
2967 "In or Coinbase: Block Number, \"block\"|\"in\", Time, Amount, Transaction Hash, Payment ID, Subaddress Index, \"-\", Note\n"
2968 "Out: Block Number, \"out\", Time, Amount*, Transaction Hash, Payment ID, Fee, Destinations, Input addresses**, \"-\", Note\n"
2969 "Pool: \"pool\", \"in\", Time, Amount, Transaction Hash, Payment Id, Subaddress Index, \"-\", Note, Double Spend Note\n"
2970 "Pending or Failed: \"failed\"|\"pending\", \"out\", Time, Amount*, Transaction Hash, Payment ID, Fee, Input addresses**, \"-\", Note\n\n"
2971 "* Excluding change and fee.\n"
2972 "** Set of address indices used as inputs in this transfer."));
2973 m_cmd_binder.set_handler("export_transfers",
2974 boost::bind(&simple_wallet::export_transfers, this, _1),
2975 tr(
"export_transfers [in|out|all|pending|failed|coinbase] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]] [output=<filepath>]"),
2976 tr(
"Export to CSV the incoming/outgoing transfers within an optional height range."));
2977 m_cmd_binder.set_handler("unspent_outputs",
2978 boost::bind(&simple_wallet::unspent_outputs, this, _1),
2979 tr(USAGE_UNSPENT_OUTPUTS),
2980 tr(
"Show the unspent outputs of a specified address within an optional amount range."));
2981 m_cmd_binder.set_handler("rescan_bc",
2982 boost::bind(&simple_wallet::rescan_blockchain, this, _1),
2983 tr(USAGE_RESCAN_BC),
2984 tr(
"Rescan the blockchain from scratch. If \"hard\" is specified, you will lose any information which can not be recovered from the blockchain itself."));
2985 m_cmd_binder.set_handler("set_tx_note",
2986 boost::bind(&simple_wallet::set_tx_note, this, _1),
2987 tr(USAGE_SET_TX_NOTE),
2988 tr(
"Set an arbitrary string note for a <txid>."));
2989 m_cmd_binder.set_handler("get_tx_note",
2990 boost::bind(&simple_wallet::get_tx_note, this, _1),
2991 tr(USAGE_GET_TX_NOTE),
2992 tr(
"Get a string note for a txid."));
2993 m_cmd_binder.set_handler("set_description",
2994 boost::bind(&simple_wallet::set_description, this, _1),
2995 tr(USAGE_SET_DESCRIPTION),
2996 tr(
"Set an arbitrary description for the wallet."));
2997 m_cmd_binder.set_handler("get_description",
2998 boost::bind(&simple_wallet::get_description, this, _1),
2999 tr(USAGE_GET_DESCRIPTION),
3000 tr(
"Get the description of the wallet."));
3001 m_cmd_binder.set_handler("status",
3002 boost::bind(&simple_wallet::status, this, _1),
3003 tr(
"Show the wallet's status."));
3004 m_cmd_binder.set_handler("wallet_info",
3005 boost::bind(&simple_wallet::wallet_info, this, _1),
3006 tr(
"Show the wallet's information."));
3007 m_cmd_binder.set_handler("sign",
3008 boost::bind(&simple_wallet::sign, this, _1),
3010 tr(
"Sign the contents of a file."));
3011 m_cmd_binder.set_handler("verify",
3012 boost::bind(&simple_wallet::verify, this, _1),
3014 tr(
"Verify a signature on the contents of a file."));
3015 m_cmd_binder.set_handler("export_key_images",
3016 boost::bind(&simple_wallet::export_key_images, this, _1),
3017 tr(USAGE_EXPORT_KEY_IMAGES),
3018 tr(
"Export a signed set of key images to a <filename>."));
3019 m_cmd_binder.set_handler("import_key_images",
3020 boost::bind(&simple_wallet::import_key_images, this, _1),
3021 tr(USAGE_IMPORT_KEY_IMAGES),
3022 tr(
"Import a signed key images list and verify their spent status."));
3023 m_cmd_binder.set_handler("hw_key_images_sync",
3024 boost::bind(&simple_wallet::hw_key_images_sync, this, _1),
3025 tr(USAGE_HW_KEY_IMAGES_SYNC),
3026 tr(
"Synchronizes key images with the hw wallet."));
3027 m_cmd_binder.set_handler("hw_reconnect",
3028 boost::bind(&simple_wallet::hw_reconnect, this, _1),
3029 tr(USAGE_HW_RECONNECT),
3030 tr(
"Attempts to reconnect HW wallet."));
3031 m_cmd_binder.set_handler("export_outputs",
3032 boost::bind(&simple_wallet::export_outputs, this, _1),
3033 tr(USAGE_EXPORT_OUTPUTS),
3034 tr(
"Export a set of outputs owned by this wallet."));
3035 m_cmd_binder.set_handler("import_outputs",
3036 boost::bind(&simple_wallet::import_outputs, this, _1),
3037 tr(USAGE_IMPORT_OUTPUTS),
3038 tr(
"Import a set of outputs owned by this wallet."));
3039 m_cmd_binder.set_handler("show_transfer",
3040 boost::bind(&simple_wallet::show_transfer, this, _1),
3041 tr(USAGE_SHOW_TRANSFER),
3042 tr(
"Show information about a transfer to/from this address."));
3043 m_cmd_binder.set_handler("password",
3044 boost::bind(&simple_wallet::change_password, this, _1),
3045 tr(
"Change the wallet's password."));
3046 m_cmd_binder.set_handler("payment_id",
3047 boost::bind(&simple_wallet::payment_id, this, _1),
3048 tr(USAGE_PAYMENT_ID),
3049 tr(
"Generate a new random full size payment id (obsolete). These will be unencrypted on the blockchain, see integrated_address for encrypted short payment ids."));
3050 m_cmd_binder.set_handler("fee",
3051 boost::bind(&simple_wallet::print_fee_info, this, _1),
3052 tr(
"Print the information about the current fee and transaction backlog."));
3053 m_cmd_binder.set_handler("prepare_multisig", boost::bind(&simple_wallet::prepare_multisig, this, _1),
3054 tr(
"Export data needed to create a multisig wallet"));
3055 m_cmd_binder.set_handler("make_multisig", boost::bind(&simple_wallet::make_multisig, this, _1),
3056 tr(USAGE_MAKE_MULTISIG),
3057 tr(
"Turn this wallet into a multisig wallet"));
3058 m_cmd_binder.set_handler("finalize_multisig",
3059 boost::bind(&simple_wallet::finalize_multisig, this, _1),
3060 tr(USAGE_FINALIZE_MULTISIG),
3061 tr(
"Turn this wallet into a multisig wallet, extra step for N-1/N wallets"));
3062 m_cmd_binder.set_handler("exchange_multisig_keys",
3063 boost::bind(&simple_wallet::exchange_multisig_keys, this, _1),
3064 tr(USAGE_EXCHANGE_MULTISIG_KEYS),
3065 tr(
"Performs extra multisig keys exchange rounds. Needed for arbitrary M/N multisig wallets"));
3066 m_cmd_binder.set_handler("export_multisig_info",
3067 boost::bind(&simple_wallet::export_multisig, this, _1),
3068 tr(USAGE_EXPORT_MULTISIG_INFO),
3069 tr(
"Export multisig info for other participants"));
3070 m_cmd_binder.set_handler("import_multisig_info",
3071 boost::bind(&simple_wallet::import_multisig, this, _1),
3072 tr(USAGE_IMPORT_MULTISIG_INFO),
3073 tr(
"Import multisig info from other participants"));
3074 m_cmd_binder.set_handler("sign_multisig",
3075 boost::bind(&simple_wallet::sign_multisig, this, _1),
3076 tr(USAGE_SIGN_MULTISIG),
3077 tr(
"Sign a multisig transaction from a file"));
3078 m_cmd_binder.set_handler("submit_multisig",
3079 boost::bind(&simple_wallet::submit_multisig, this, _1),
3080 tr(USAGE_SUBMIT_MULTISIG),
3081 tr(
"Submit a signed multisig transaction from a file"));
3082 m_cmd_binder.set_handler("export_raw_multisig_tx",
3083 boost::bind(&simple_wallet::export_raw_multisig, this, _1),
3084 tr(USAGE_EXPORT_RAW_MULTISIG_TX),
3085 tr(
"Export a signed multisig transaction to a file"));
3086 m_cmd_binder.set_handler("mms",
3087 boost::bind(&simple_wallet::mms, this, _1),
3089 tr(
"Interface with the MMS (Multisig Messaging System)\n"
3090 "<subcommand> is one of:\n"
3091 " init, info, signer, list, next, sync, transfer, delete, send, receive, export, note, show, set, help\n"
3092 " send_signer_config, start_auto_config, stop_auto_config, auto_config\n"
3093 "Get help about a subcommand with: help mms <subcommand>, or mms help <subcommand>"));
3094 m_cmd_binder.set_handler("mms init",
3095 boost::bind(&simple_wallet::mms, this, _1),
3097 tr(
"Initialize and configure the MMS for M/N = number of required signers/number of authorized signers multisig"));
3098 m_cmd_binder.set_handler("mms info",
3099 boost::bind(&simple_wallet::mms, this, _1),
3101 tr(
"Display current MMS configuration"));
3102 m_cmd_binder.set_handler("mms signer",
3103 boost::bind(&simple_wallet::mms, this, _1),
3104 tr(USAGE_MMS_SIGNER),
3105 tr(
"Set or modify authorized signer info (single-word label, transport address, Electroneum address), or list all signers"));
3106 m_cmd_binder.set_handler("mms list",
3107 boost::bind(&simple_wallet::mms, this, _1),
3109 tr(
"List all messages"));
3110 m_cmd_binder.set_handler("mms next",
3111 boost::bind(&simple_wallet::mms, this, _1),
3113 tr(
"Evaluate the next possible multisig-related action(s) according to wallet state, and execute or offer for choice\n"
3114 "By using 'sync' processing of waiting messages with multisig sync info can be forced regardless of wallet state"));
3115 m_cmd_binder.set_handler("mms sync",
3116 boost::bind(&simple_wallet::mms, this, _1),
3118 tr(
"Force generation of multisig sync info regardless of wallet state, to recover from special situations like \"stale data\" errors"));
3119 m_cmd_binder.set_handler("mms transfer",
3120 boost::bind(&simple_wallet::mms, this, _1),
3121 tr(USAGE_MMS_TRANSFER),
3122 tr(
"Initiate transfer with MMS support; arguments identical to normal 'transfer' command arguments, for info see there"));
3123 m_cmd_binder.set_handler("mms delete",
3124 boost::bind(&simple_wallet::mms, this, _1),
3125 tr(USAGE_MMS_DELETE),
3126 tr(
"Delete a single message by giving its id, or delete all messages by using 'all'"));
3127 m_cmd_binder.set_handler("mms send",
3128 boost::bind(&simple_wallet::mms, this, _1),
3130 tr(
"Send a single message by giving its id, or send all waiting messages"));
3131 m_cmd_binder.set_handler("mms receive",
3132 boost::bind(&simple_wallet::mms, this, _1),
3133 tr(USAGE_MMS_RECEIVE),
3134 tr(
"Check right away for new messages to receive"));
3135 m_cmd_binder.set_handler("mms export",
3136 boost::bind(&simple_wallet::mms, this, _1),
3137 tr(USAGE_MMS_EXPORT),
3138 tr(
"Write the content of a message to a file \"mms_message_content\""));
3139 m_cmd_binder.set_handler("mms note",
3140 boost::bind(&simple_wallet::mms, this, _1),
3142 tr(
"Send a one-line message to an authorized signer, identified by its label, or show any waiting unread notes"));
3143 m_cmd_binder.set_handler("mms show",
3144 boost::bind(&simple_wallet::mms, this, _1),
3146 tr(
"Show detailed info about a single message"));
3147 m_cmd_binder.set_handler("mms set",
3148 boost::bind(&simple_wallet::mms, this, _1),
3150 tr(
"Available options:\n "
3151 "auto-send <1|0>\n "
3152 " Whether to automatically send newly generated messages right away.\n "));
3153 m_cmd_binder.set_handler("mms send_message_config",
3154 boost::bind(&simple_wallet::mms, this, _1),
3155 tr(USAGE_MMS_SEND_SIGNER_CONFIG),
3156 tr(
"Send completed signer config to all other authorized signers"));
3157 m_cmd_binder.set_handler("mms start_auto_config",
3158 boost::bind(&simple_wallet::mms, this, _1),
3159 tr(USAGE_MMS_START_AUTO_CONFIG),
3160 tr(
"Start auto-config at the auto-config manager's wallet by issuing auto-config tokens and optionally set others' labels"));
3161 m_cmd_binder.set_handler("mms stop_auto_config",
3162 boost::bind(&simple_wallet::mms, this, _1),
3163 tr(USAGE_MMS_STOP_AUTO_CONFIG),
3164 tr(
"Delete any auto-config tokens and abort a auto-config process"));
3165 m_cmd_binder.set_handler("mms auto_config",
3166 boost::bind(&simple_wallet::mms, this, _1),
3167 tr(USAGE_MMS_AUTO_CONFIG),
3168 tr(
"Start auto-config by using the token received from the auto-config manager"));
3169 m_cmd_binder.set_handler("print_ring",
3170 boost::bind(&simple_wallet::print_ring, this, _1),
3171 tr(USAGE_PRINT_RING),
3172 tr(
"Print the ring(s) used to spend a given key image or transaction (if the ring size is > 1)\n\n"
3173 "Output format:\n"
3174 "Key Image, \"absolute\", list of rings"));
3175 m_cmd_binder.set_handler("set_ring",
3176 boost::bind(&simple_wallet::set_ring, this, _1),
3178 tr(
"Set the ring used for a given key image, so it can be reused in a fork"));
3179 m_cmd_binder.set_handler("unset_ring",
3180 boost::bind(&simple_wallet::unset_ring, this, _1),
3181 tr(USAGE_UNSET_RING),
3182 tr(
"Unsets the ring used for a given key image or transaction"));
3183 m_cmd_binder.set_handler("save_known_rings",
3184 boost::bind(&simple_wallet::save_known_rings, this, _1),
3185 tr(USAGE_SAVE_KNOWN_RINGS),
3186 tr(
"Save known rings to the shared rings database"));
3187 m_cmd_binder.set_handler("mark_output_spent",
3188 boost::bind(&simple_wallet::blackball, this, _1),
3189 tr(USAGE_MARK_OUTPUT_SPENT),
3190 tr(
"Mark output(s) as spent so they never get selected as fake outputs in a ring"));
3191 m_cmd_binder.set_handler("mark_output_unspent",
3192 boost::bind(&simple_wallet::unblackball, this, _1),
3193 tr(USAGE_MARK_OUTPUT_UNSPENT),
3194 tr(
"Marks an output as unspent so it may get selected as a fake output in a ring"));
3195 m_cmd_binder.set_handler("is_output_spent",
3196 boost::bind(&simple_wallet::blackballed, this, _1),
3197 tr(USAGE_IS_OUTPUT_SPENT),
3198 tr(
"Checks whether an output is marked as spent"));
3199 m_cmd_binder.set_handler("freeze",
3200 boost::bind(&simple_wallet::freeze, this, _1),
3202 tr(
"Freeze a single output by key image so it will not be used"));
3203 m_cmd_binder.set_handler("thaw",
3204 boost::bind(&simple_wallet::thaw, this, _1),
3206 tr(
"Thaw a single output by key image so it may be used again"));
3207 m_cmd_binder.set_handler("frozen",
3208 boost::bind(&simple_wallet::frozen, this, _1),
3210 tr(
"Checks whether a given output is currently frozen by key image"));
3211 m_cmd_binder.set_handler("net_stats",
3212 boost::bind(&simple_wallet::net_stats, this, _1),
3213 tr(USAGE_NET_STATS),
3214 tr(
"Prints simple network stats"));
3215 m_cmd_binder.set_handler("welcome",
3216 boost::bind(&simple_wallet::welcome, this, _1),
3218 tr(
"Prints basic info about Electroneum for first time users"));
3219 m_cmd_binder.set_handler("version",
3220 boost::bind(&simple_wallet::version, this, _1),
3222 tr(
"Returns version information"));
3223 m_cmd_binder.set_handler("help",
3224 boost::bind(&simple_wallet::help, this, _1),
3226 tr(
"Show the help section or the documentation about a <command>."));
3227}