```text MMGEN-XMRWALLET: Perform various Monero wallet and transacting operations for addresses in an MMGen XMR key-address file USAGE: mmgen-xmrwallet [opts] create | sync | list | view | listview | dump | restore [xmr_keyaddrfile] [wallets] mmgen-xmrwallet [opts] label [xmr_keyaddrfile] LABEL_SPEC mmgen-xmrwallet [opts] new [xmr_keyaddrfile] NEW_ADDRESS_SPEC mmgen-xmrwallet [opts] transfer [xmr_keyaddrfile] TRANSFER_SPEC mmgen-xmrwallet [opts] sweep | sweep_all [xmr_keyaddrfile] SWEEP_SPEC mmgen-xmrwallet [opts] submit [TX_file] mmgen-xmrwallet [opts] relay mmgen-xmrwallet [opts] resubmit | abort (for use with --autosign only) mmgen-xmrwallet [opts] txview | txlist [TX_file] ... mmgen-xmrwallet [opts] export-outputs | export-outputs-sign | import-key-images [wallets] OPTIONS: -h, --help Print this help message --longhelp Print help message for long (global) options -a, --autosign Use appropriate outdir and other params for autosigning operations (implies --watch-only). When this option is in effect, filename argu- ments must be omitted, as files are located automatically. -f, --priority N Specify an integer priority ‘N’ for inclusion of a transaction in the blockchain (higher number means higher fee). Valid parameters: 1=low 2=normal 3=high 4=highest. If option is omitted, the default priority will be used -F, --full-address Print addresses in full instead of truncating -m, --autosign-mountpoint P Specify the autosign mountpoint (defaults to ‘/mnt/mmgen_autosign’, implies --autosign) -b, --rescan-blockchain Rescan the blockchain if wallet fails to sync -d, --outdir D Save transaction files to directory 'D' instead of the working directory -D, --daemon H:P Connect to the monerod at HOST:PORT -e, --skip-empty-accounts Skip display of empty accounts in wallets where applicable -E, --skip-empty-addresses Skip display of used empty addresses in wallets where applicable -k, --use-internal-keccak-module Force use of the internal keccak module -p, --hash-preset P Use scrypt hash preset 'P' for password hashing (default: '3') -P, --rescan-spent Perform a rescan of spent outputs. Used only with the ‘export-outputs-sign’ operation -R, --tx-relay-daemon H:P[:H:P] Relay transactions via a monerod specified by HOST:PORT[:PROXY_IP:PROXY_PORT] -r, --restore-height H Scan from height 'H' when creating wallets. Use special value ‘current’ to create empty wallet at current blockchain height. -R, --no-relay Save transaction to file instead of relaying -s, --no-start-wallet-daemon Don’t start the wallet daemon at startup -S, --no-stop-wallet-daemon Don’t stop the wallet daemon at exit -W, --watch-only Create or operate on watch-only wallets -w, --wallet-dir D Output or operate on wallets in directory 'D' instead of the working directory -U, --wallet-rpc-user user Wallet RPC username (currently: 'monero') -P, --wallet-rpc-password pass Wallet RPC password (currently: [scrubbed]) Many operations take an optional ‘wallets’ argument: one or more address indexes (expressed as a comma-separated list and/or hyphenated range) in the default or specified key-address file, each corresponding to a Monero wallet with the same index. If the argument is omitted, all wallets are operated upon. All operations except for ‘relay’ require a running Monero daemon (monerod). Unless --daemon is specified, the daemon is assumed to be listening on localhost at the default RPC port. If --tx-relay-daemon is specified, the monerod at HOST:PORT will be used to relay any created transactions. PROXY_IP:PROXY_PORT, if specified, may point to a SOCKS proxy, in which case HOST may be a Tor onion address. All communications use the RPC protocol via SSL (HTTPS) or Tor. RPC over plain HTTP is not supported. SUPPORTED OPERATIONS create - create wallets for all or specified addresses in key-address file sync - sync wallets for all or specified addresses in key-address file and display a summary of accounts and balances list - same as ‘sync’, but also list detailed address info for accounts view - display a summary of accounts and balances in offline mode. May be invoked without a running monerod listview - same as ‘view’, but also list detailed address info for accounts label - set a label for an address new - create a new account in a wallet, or a new address in an account transfer - transfer specified XMR amount from specified wallet:account to specified address sweep - sweep funds in specified wallet:account to new address in same account, or new or specified account in another wallet sweep_all - same as above, but sweep balances of all addresses in the account relay - relay a transaction from a transaction file created using ‘sweep’ or ‘transfer’ with the --no-relay option submit - submit an autosigned transaction to a wallet and the network resubmit - resubmit most recently submitted autosigned transaction (other actions are required: see Exporting Outputs below) abort - abort the current transaction created with --autosign. The transaction may be signed or unsigned txview - display detailed information about a transaction file or files txlist - same as above, but display terse information in tabular format dump - produce JSON dumps of wallet metadata (accounts, addresses and labels) for a list or range of wallets restore - same as ‘create’, but additionally restore wallet metadata from the corresponding JSON dump files created with ‘dump’ export-outputs - export outputs of watch-only wallets for import into their corresponding offline wallets export-outputs-sign - same as above, plus request offline wallet to create signed key images for import by ‘import-key-images’ import-key-images - import key images signed by offline wallets into their corresponding watch-only wallets ‘LABEL’ OPERATION NOTES This operation takes a LABEL_SPEC arg with the following format: WALLET:ACCOUNT:ADDRESS,"label text" where WALLET is a wallet number, ACCOUNT an account index, and ADDRESS an address index. ‘NEW’ OPERATION NOTES This operation takes a NEW_ADDRESS_SPEC arg with the following format: WALLET[:ACCOUNT][,"label text"] where WALLET is a wallet number and ACCOUNT an account index. If ACCOUNT is omitted, a new account will be created in the wallet. Otherwise a new address will be created in the specified account. An optional label text may be appended to the spec following a comma. ‘TRANSFER’ OPERATION NOTES The transfer operation takes a TRANSFER_SPEC arg with the following format: SOURCE:ACCOUNT:ADDRESS,AMOUNT where SOURCE is a wallet number, ACCOUNT the source account index, ADDRESS the destination Monero address and AMOUNT the XMR amount to be sent. ‘SWEEP’ AND ‘SWEEP_ALL’ OPERATION NOTES The sweep and sweep_all operations take a SWEEP_SPEC arg with the following format: SOURCE:ACCOUNT[,DEST[:ACCOUNT]] where SOURCE and DEST are wallet numbers and ACCOUNT account indices for the respective wallets. If DEST is omitted, a new address will be created in ACCOUNT of SOURCE, and funds from ACCOUNT of SOURCE will be swept into it. If DEST is included without its related ACCOUNT, funds from ACCOUNT of SOURCE will be swept into a newly created account in DEST, or the last existing account of DEST, if requested by the user. If both account indices are included, funds from ACCOUNT of SOURCE will be swept into ACCOUNT of DEST. The user is prompted before addresses are created or funds transferred. With ‘sweep’, if the source account has more than one address with a balance, the balance of a single randomly chosen address will be swept. To sweep the balances of all addresses in an account, use ‘sweep_all’. ‘SUBMIT’ AND ‘RELAY’ OPERATION NOTES By default, transactions are relayed to a monerod running on localhost at the default RPC port. To relay transactions to a remote or non-default monerod via optional SOCKS proxy, use the --tx-relay-daemon option described above. When ‘submit’ is used with --autosign, the transaction filename must be omitted. ‘DUMP’ AND ‘RESTORE’ OPERATION NOTES These commands produce and read JSON wallet dump files with the same filenames as their source wallets, plus a .dump extension. It’s highly advisable to make regular dumps of your Monero wallets and back up the dump files, which can be used to easily regenerate the wallets using the ‘restore’ operation, should the need arise. For watch-only autosigning wallets, creating the dumps is as easy as executing ‘mmgen-xmrwallet --autosign dump’ from your wallet directory. The dump files are formatted JSON and thus suitable for efficient incremental backup using git. ‘TXVIEW’ AND ‘TXLIST’ OPERATION NOTES Transactions are displayed in chronological order based on submit time or creation time. With --autosign, submitted transactions on the removable device are displayed. SECURITY WARNING If you have an existing MMGen Monero hot wallet setup, you’re strongly advised to migrate to offline autosigning to avoid further exposing your private keys on your network-connected machine. See OFFLINE AUTOSIGNING and ‘Replacing Existing Hot Wallets with Watch-Only Wallets’ below. EXAMPLES Note that the transacting examples in this section apply for a hot wallet setup, which is now deprecated. See OFFLINE AUTOSIGNING below. Generate an XMR key-address file with 5 addresses from your default wallet: $ mmgen-keygen --coin=xmr 1-5 Create 3 Monero wallets from the key-address file: $ mmgen-xmrwallet create *.akeys.mmenc 1-3 After updating the blockchain, sync wallets 1 and 2: $ mmgen-xmrwallet sync *.akeys.mmenc 1,2 Sweep all funds from account #0 of wallet 1 to a new address: $ mmgen-xmrwallet sweep *.akeys.mmenc 1:0 Same as above, but use a TX relay on the Tor network: $ mmgen-xmrwallet --tx-relay-daemon=abcdefghijklmnop.onion:127.0.0.1:9050 sweep *.akeys.mmenc 1:0 Sweep all funds from account #0 of wallet 1 to wallet 2: $ mmgen-xmrwallet sweep *.akeys.mmenc 1:0,2 Send 0.1 XMR from account #0 of wallet 2 to an external address: $ mmgen-xmrwallet transfer *.akeys.mmenc 2:0:,0.1 Sweep all funds from account #0 of wallet 2 to a new address, saving the transaction to a file: $ mmgen-xmrwallet --no-relay sweep *.akeys.mmenc 2:0 Relay the created sweep transaction via a host on the Tor network: $ mmgen-xmrwallet --tx-relay-daemon=abcdefghijklmnop.onion:127.0.0.1:9050 relay *XMR*.sigtx Create a new account in wallet 2: $ mmgen-xmrwallet new *.akeys.mmenc 2 Create a new address in account 1 of wallet 2, with label: $ mmgen-xmrwallet new *.akeys.mmenc 2:1,"from ABC exchange" View all the XMR transaction files in the current directory, sending output to pager: $ mmgen-xmrwallet --pager txview *XMR*.sigtx OFFLINE AUTOSIGNING Tutorial Master the basic concepts of the MMGen wallet system and the processes of wallet creation, conversion and backup described in the Getting Started guide. Optionally create a default MMGen wallet on your offline machine using ‘mmgen-walletgen’. If you choose not to do this, you’ll be prompted for a seed phrase at the start of each signing session. Familiarize yourself with the autosigning setup process as described in ‘mmgen-autosign --help’. Prepare your removable device and set up the mountpoints on your offline and online machines according to the instructions therein. Install ‘monero-wallet-rpc’ on your offline machine and the Monero CLI wallet and daemon binaries on your online machine. On the offline machine, insert the removable device and execute: $ mmgen-autosign --xmrwallets=1-2,7 setup This will create 3 Monero signing wallets with indexes 1, 2 and 7 and primary addresses matching your seed’s Monero addresses with the same indexes. (Note that these particular indexes are arbitrary, for purposes of illustration only. Feel free to choose your own list and/or range – or perhaps just the number ‘1’ if one wallet is all you require). These signing wallets are written to volatile memory and exist only for the duration of the signing session, just like the temporary MMGen signing wallet they’re generated from (see ‘mmgen-autosign --help’). A viewkey-address file for the 3 addresses will also be written to the removable device. The data in this file will be used to create and access watch-only wallets on your online machine that match the signing wallets you’ve just created. When the setup operation completes, extract the removable device and restart the autosign script in wait mode: $ mmgen-autosign --coins=xmr --stealth-led wait Your only further physical interaction with the offline signing machine now (assuming everything goes as planned) will be inserting and extracting the removable device on it. And this is the whole point of autosigning: to make cold signing as convenient as possible, almost like transacting with a hot wallet. If your signing machine is an SoC with MMGen Wallet LED support (see ‘mmgen-autosign --help’), a quickly flashing LED will indicate that signing is in progress, a slowly flashing LED an error condition, and no LED that the program is idle and waiting for device insertion. On your online machine, start monerod, wait until it’s fully synced with the network, insert the removable device and execute: $ mmgen-xmrwallet --autosign --restore-height=current create This will create 3 watch-only wallets matching your 3 offline signing wallets and write them to the current directory (an alternate wallet directory may be specified with the --wallet-dir option). Note that --restore-height=current is required to prevent a time-consuming full sync of the wallets from the Genesis block, a meaningless waste of time in this case since the wallets contain no funds. Also make note of the --autosign option, a requirement for ALL autosigning operations with ‘mmgen-xmrwallet’. Now list your newly created wallets: $ mmgen-xmrwallet --autosign list Note that you can also use the ‘sync’ operation here, which produces more abbreviated output than ‘list’. Send some XMR (preferably a tiny amount) to the primary address of wallet #7. Once the transaction has confirmed, invoke ‘sync’ or ‘list’ again to verify the funds have arrived. Since offline wallet #7 has no knowledge of the funds received by its online counterpart, we need to update its state. Export the outputs of watch-only wallet #7 as follows: $ mmgen-xmrwallet --autosign export-outputs 7 The outputs are now saved to the removable device and will be imported into offline wallet #7 when you sign your first transaction. Now you’re ready to begin transacting. Let’s start by sweeping your funds in wallet #7’s primary address (account 0) to a new address in the same account: $ mmgen-xmrwallet --autosign sweep 7:0 This operation creates an unsigned sweep transaction and saves it to the removable device. Now extract the removable device and insert it on the offline machine. Wait for the quick LED flashing to stop (or the blue ‘safe to extract’ message, in the absence of LED support), signalling that signing is complete. Note that the offline wallet has performed two operations in one go here: an import of wallet outputs from the previous step and the signing of your just-created sweep transaction. Extract the removable device, insert it on your online machine and submit the signed sweep transaction to the watch-only wallet, which will broadcast it to the network: $ mmgen-xmrwallet --autosign submit Note that you may also relay the transaction to a remote daemon, optionally via a Tor proxy, using the --tx-relay-daemon option documented above. Once your transaction has confirmed, invoke ‘list’ or ‘sync’ to view your wallets’ balances. Congratulations, you’ve performed your first autosigned Monero transaction! For other examples, consult the EXAMPLES section above, noting the following differences that apply to autosigning: 1) The --autosign option must always be included. 2) The key-address file argument must always be omitted. 3) The ‘relay’ operation is replaced by ‘submit’, with TX filename omitted. 4) Always remember to sign your transactions after a ‘sweep’ or ‘transfer’ operation. 5) Always remember to export a wallet’s outputs when it has received funds from an outside source. Exporting Outputs Exporting outputs from a watch-only wallet is generally required in only three cases: a) at the start of each signing session (after ‘mmgen-autosign setup’); b) after the wallet has received funds from an outside source or another wallet; and c) after performing a ‘resubmit’ operation. You might also need to do it, however, if an offline wallet is unable to sign a transaction due to missing outputs. At the start of a new signing session, you must export outputs from ALL wallets you intend to transact with. This is necessary because the offline signing wallets have just been created and know nothing about the state of their online counterparts. Export outputs from a wallet as follows (for all wallets, omit the index): $ mmgen-xmrwallet --autosign export-outputs Then insert the removable device on the offline machine. This will import the outputs into the corresponding signing wallet(s) (and optionally redo any failed transaction signing operation). Following a ‘resubmit’, use the ‘export-outputs-sign’ operation instead, and add the --rescan-spent option: $ mmgen-xmrwallet --autosign --rescan-spent export-outputs-sign Here the offline signing wallet(s) will also create signed key images. Insert the removable device on your online machine and import the signed key images into your online wallet as follows: $ mmgen-xmrwallet --autosign import-key-images Usually, this is all that is required. However, if your wallet continues to show an incorrect balance after the import operation, you’ll need to re-run ‘export-outputs-sign’ with the --rescan-blockchain option, followed by another offline signing and online key image import. Note that blockchain rescans can take a long time, so patience is required here. Replacing Existing Hot Wallets with Watch-Only Wallets If you have an existing MMGen Monero hot wallet setup, you can migrate to offline transaction signing by ‘cloning’ your existing hot wallets as watch-only ones via the ‘dump’ and ‘restore’ operations described below. For additional security, it’s also wise to create new watch-only wallets that have never had keys exposed on an online machine and gradually transfer all funds from your ‘cloned’ wallets to them. The creation of new wallets is explained in the Tutorial above. Start the cloning process by making dump files of your hot wallets’ metadata (accounts, subaddresses and labels). ‘cd’ to the wallet directory (or use --wallet-dir) and execute: $ mmgen-xmrwallet dump /path/to/key-address-file.akeys{.mmenc} If you’ve been transacting with the wallets, you know where their key-address file is along with its encryption password, if any. Supply an additional index range and/or list at the end of the command line if the key-address file contains more wallets than exist on disk or there are wallets you wish to ignore. Do a directory listing to verify that the dump files are present alongside their source wallet files ending with ‘MoneroWallet’. Then execute: $ mmgen-xmrwallet --watch-only restore /path/to/key-address-file.akeys{.mmenc} This will create watch-only wallets that “mirror” the old hot wallets and populate them with the metadata saved in the dump files. Note that watch-only wallet filenames end with ‘MoneroWatchOnlyWallet’. Your old hot wallets will be ignored from here on. Eventually, you’ll want to destroy them. Your new wallets must now be synced with the blockchain. Begin by starting monerod and synchronizing with the network. Mount ‘/mnt/mmgen_autosign’ and locate the file in the ‘xmr’ directory with the .vkeys extension, which contains the passwords you’ll need to log into the wallets. This is a plain text file viewable with ‘cat’, ‘less’ or your favorite text editor. Then log into each watch-only wallet in turn as follows: $ monero-wallet-cli --wallet Upon login, each wallet will begin syncing, a process which can take more than an hour depending on your hardware. Note, however, that the process is interruptible: you may exit ‘monero-wallet-cli’ at any point, log back in again and resume where you left off. Once your watch-only wallets are synced, you need to export their outputs: $ mmgen-xmrwallet --autosign export-outputs-sign Now insert the removable device on the offline machine and wait until the LED stops flashing (or ‘safe to extract’). The wallet outputs are now imported into the signing wallets and corresponding signed key images have been written to the removable device. Insert the removable device on your online machine and import the key images into your watch-only wallets: $ mmgen-xmrwallet --autosign import-key-images Congratulations, your watch-only wallets are now complete and you may begin transacting! First perform a ‘sync’ or ‘list’ to ensure that your balances are correct. Then you might try sweeping some funds as described in the Tutorial above. Once you’ve gained proficiency with the autosigning process and feel ready to delete your old hot wallets, make sure to do so securely using ‘shred’, ‘wipe’ or some other secure deletion utility. MMGEN v15.1.dev18 March 2025 MMGEN-XMRWALLET(1) ```