Table of Contents
- Table of Contents
- Introduction
- Ethereum (ETH), Ethereum Classic (ETC) and ERC20 Tokens
- Bitcoin Cash Node (BCH) and Litecoin (LTC)
- Monero (XMR)
- THORChain (RUNE)
- Asset swaps via THORChain
- Key/address generation for Zcash (ZEC)
- Key/address generation for 144 Bitcoin-derived altcoins
- Introduction
- Ethereum (ETH), Ethereum Classic (ETC) and ERC20 Tokens
- Install the Ethereum dependencies
- Install and run Reth, Geth or Parity
- Transacting and other basic operations
- Creating and deploying ERC20 tokens
- Bitcoin Cash Node (BCH) and Litecoin (LTC)
- Monero (XMR)
- Wallet creation and transacting via the compatibility layer
- Wallet creation and transacting via mmgen-xmrwallet (deprecated)
- THORChain (RUNE)
- Asset swaps via THORChain
- Key/address generation for Zcash (ZEC)
- Key/address generation for 144 Bitcoin-derived altcoins
Table of Contents
Introduction
Ethereum (ETH), Ethereum Classic (ETC) and ERC20 Tokens
- Install the Ethereum dependencies
- Install and run Reth, Geth or Parity
- Transacting and other basic operations
- Creating and deploying ERC20 tokens
Bitcoin Cash Node (BCH) and Litecoin (LTC)
Monero (XMR)
THORChain (RUNE)
Asset swaps via THORChain
Key/address generation for Zcash (ZEC)
Key/address generation for 144 Bitcoin-derived altcoins
Introduction
Depending on your setup, the instructions on this page may apply to your offline machine, your online machine, or both. If you’re confused as to which, please familiarize yourself with the basics of MMGen Wallet by reading the Getting Started guide.
Ethereum (ETH), Ethereum Classic (ETC) and ERC20 Tokens
MMGen Wallet supports all operations for Ethereum, Ethereum Classic and ERC20
tokens. In addition, ERC20 token creation and deployment are supported via the
create-token.py script.
Install the Ethereum dependencies
Skip this step for MSYS2 or if your Python version is 3.13 or greater.
From the MMGen Wallet repository root, type:
$ python3 -m pip install -r keccak-requirements.txt
Install and run Reth, Geth or Parity
MMGen Wallet uses Rust Ethereum (Reth) or Go-Ethereum (Geth) to communicate with the Ethereum network, with Reth now being preferred by the MMGen Project.
Installation and usage instructions for Reth can be found here and prebuilt binaries here.
Information for Geth can be found at its homepage or Github repo.
On Arch Linux systems, Geth is a package and may be installed with pacman. On
RISC-V platforms, for which no prebuilt binaries are available, Geth must be
built from source, preferably using the most recent version of Go.
Note that the Ethereum daemon is not used for transaction signing, so you needn’t install it on your offline machine.
For Reth, the following command-line options are required, among others:
--http --http.api=eth,rpc,web3,txpool
For Geth, the following command-line options are required, among others:
--http --http.api=eth,web3,txpool --http.port=8745
Geth has dropped support for Ethereum Classic, however transacting ETC is
still supported by the legacy Parity daemon. Invoke Parity with
--chain=classic --jsonrpc-port=8645.
If you’re running Parity on a different machine from MMGen Wallet, add the following options to the command line:
--jsonrpc-hosts=all --jsonrpc-interface=<daemon IP address>
To run Parity offline, use --mode=offline, otherwise --mode=active.
Parity’s light client mode, which queries other nodes on the network for
blockchain data, is supported. Add the --light option to the Parity command
line and read the applicable note in the Transacting section below.
Other command-line options will certainly be required. Invoke your daemon with
the --help option for more complete information.
Transacting and other basic operations
Basic operations with ETH, ETC and ERC20 tokens work as described in the Getting Started guide, with some differences. Please note the following:
- Don’t forget to invoke relevant commands with
--coin=ethor--coin=etc. - Use the
--tokenoption with the token symbol as parameter for all token operations. When importing addresses for a new token into your tracking wallet, use the--token-addroption with the token address instead. - Addresses and other hexadecimal values are given without the leading
0x. - Fees are expressed in Gas price, e.g.
12Gfor 12 Gwei or1000Mfor 1000 Mwei. This works at both the command line and interactive prompt. - When using Parity in light client mode, the
--cached-balancesoption will greatly speed up operations of themmgen-txcreate,mmgen-txdoandmmgen-tool twviewcommands by reducing network queries to a minimum. If your account balances have changed, they may be refreshed interactively within the TRACKED ACCOUNTS menu. Cached balances are stored persistently in your tracking wallet. - Note that sending transactions with your Ethereum node can easily deanonymize
you by linking the transaction with your IP address (running a Reth node
over Tor or Tor+VPN is theoretically possible, but problematic in practice).
As a solution to this problem, MMGen Wallet supports broadcasting transactions
via the etherscan.io website with the
--tx-proxyoption. Sending is done using the site’s public web form, so no registration or API key is required. For anonymity, the connection can be routed via Tor or I2P using the--proxyoption. Seemmgen-txsend --helpfor details.
Transacting example:
Note: All addresses and filenames in the examples to follow are bogus and must be replaced with real ones.
Generate some ETH addresses with your default wallet:
$ mmgen-addrgen --coin=eth 1-5
Create an EOS token tracking wallet and import the addresses into it:
$ mmgen-addrimport --coin=eth --token-addr=86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0 ABCDABCD-ETH[1-5].addrs
Unlike the case with BTC and derivatives, ETH and ETC tracking wallets are
created and managed by MMGen Wallet itself and located under the MMGen data
directory. Token tracking wallets are located inside their underlying coin’s
tracking-wallet.json file. Address (account) balances are retrieved directly
from the blockchain. Tracking wallet views are separate for each token.
Now send 10+ EOS from an exchange or another wallet to address ABCDABCD:E:1.
Then create a TX sending 10 EOS to third-party address aabbccdd..., with
change to ABCDABCD:E:2:
$ mmgen-txcreate --coin=eth --token=eos aabbccddaabbccddaabbccddaabbccddaabbccdd,10 ABCDABCD:E:2
On your offline machine, sign the TX:
$ mmgen-txsign --coin=eth --token=eos ABC123-EOS[10,50000].rawtx
You can also set up and use autosigning on the offline machine.
On your online machine, send the TX:
$ mmgen-txsend --coin=eth --token=eos ABC123-EOS[10,50000].sigtx
View your EOS tracking wallet:
$ mmgen-tool --coin=eth --token=eos twview
To transact ETH instead of EOS, omit the --token and --token-addr arguments.
Creating and deploying ERC20 tokens
Install the Solidity compiler
To deploy Ethereum contracts with MMGen Wallet, you need version 0.8.26 or
newer of the Solidity compiler (solc) installed on your system. Static binary
builds are available from the Solidity Github repository. For other ways
to install solc on your platform, refer to the Solidity documentation.
Create and deploy a token
Note: All addresses and filenames in the examples to follow are bogus. You must replace them with real ones.
Create a token 'MFT' with default parameters, owned by ddeeff... (ABCDABCD:E:1):
# Do this in the MMGen Wallet repository root:
$ scripts/create-token.py --coin=ETH --symbol=MFT --name='My First Token' ddEEFFDdEEFfddEeffDDEefFdDeeFFDDEeFFddEe
Deploy the token on the ETH blockchain:
$ mmgen-txdo --coin=eth --tx-gas=200000 --contract-data=SafeMath.bin
$ mmgen-txdo --coin=eth --tx-gas=250000 --contract-data=Owned.bin
$ mmgen-txdo --coin=eth --tx-gas=1100000 --contract-data=Token.bin
...
Token address: abcd1234abcd1234abcd1234abcd1234abcd1234
These Gas amounts seem to work for these three contracts, but feel free to experiment. Make sure you understand the difference between Gas amount and Gas price!
Create an MFT token tracking wallet and import your ETH addresses into it:
$ mmgen-addrimport --coin=eth --token-addr=abcd1234abcd1234abcd1234abcd1234abcd1234 ABCDABCD-ETH[1-5].addrs
View your MFT tracking wallet:
$ mmgen-tool --coin=eth --token=mft twview
Other token parameters can be customized too. Type scripts/create-token.py --help
for details.
Bitcoin Cash Node (BCH) and Litecoin (LTC)
Bitcoin Cash Node (BCH) and Litecoin are fully supported by MMGen Wallet.
To transact BCH or Litecoin, first make sure the Bitcoin Cash Node or Litecoin daemons are properly installed (source)(binaries), running and synced.
On RISC-V platforms, Bitcoin Cash Node must be compiled from source, as no precompiled binaries are available.
MMGen Wallet requires that the bitcoin-bchn daemon be listening on non-standard
RPC port 8432. If your daemon version is >= 0.16.2, you must use the
--usecashaddr=0 option.
Then just add the --coin=bch or --coin=ltc option to applicable MMGen Wallet
commands. It’s that simple!
Monero (XMR)
Monero is fully supported by MMGen Wallet.
Make sure that Monerod is installed and running on your online machine and
that monero-wallet-rpc is installed to your executable path on both online and
offline machines.
Install the Python XMR requirements:
Skip this step for MSYS2, as these requirements were already installed by pacman.
Skip ‘keccak-requirements.txt’ if your Python version is 3.13 or greater.
$ python3 -m pip install -r keccak-requirements.txt # see above
$ python3 -m pip install -r xmr-requirements.txt
Wallet creation and transacting via the compatibility layer
This is now the preferred way to transact XMR, replacing the deprecated
mmgen-xmrwallet command for most operations. Everything works as described
in the Getting Started guide, with the following differences:
- Manual transacting is not supported, only version 2 autosigning.
- XMR compatibility mode must be enabled. Use
--xmrwallet-compatfor online commands, or setxmrwallet_compattotruein your config file. - The
mmgen-addrgenscript is not used. Instead, addresses are created automatically whenmmgen-autosign setupis run with the--xmrwalletsoption. Typemmgen-autosign --helpfor more information. - After autosign setup,
mmgen-addrimport --coin=xmris run on the online machine with no arguments. This creates the watch-only wallet or wallets that together comprise the user’s tracking wallet. For watch-only wallets that already exist, no action is performed. mmgen-txcreatesupports both sweep transactions and send to external address (seemmgen-txcreate --coin=xmr --help)- Tracking wallet views are account-based.
- New accounts and addresses may be added to the tracking wallet via
mmgen-tool --coin=xmr listaddresses. - The
mmgen-xmrwalletscript may be used to list and view sent transactions on the removable device. Typemmgen-xmrwallet --helpfor details. - Compatibility mode is not available for Windows. Windows users must use
mmgen-xmrwalletin non-automount (v1) mode to transact Monero.
Wallet creation and transacting via mmgen-xmrwallet (deprecated)
Monero support includes automated wallet creation/syncing and transacting via
the mmgen-xmrwallet command.
The following instructions are applicable for a hot wallet setup. To learn
how to cold sign transactions using MMGen Wallet’s autosign feature, first
familiarize yourself with the basic concepts here and then consult the OFFLINE
AUTOSIGNING tutorial on the mmgen-xmrwallet help screen.
To generate five Monero key/address pairs from your default wallet, invoke the following, making sure to answer ‘y’ at the Encrypt prompt:
$ mmgen-keygen --coin=xmr 1-5
In addition to spend and view keys, the resulting key/address file also includes a wallet password for each address (the double SHA256 hash of the spend key, truncated to 16 bytes).
Now create a Monero wallet for each address in the file by invoking the following command:
$ mmgen-xmrwallet create *XMR*.akeys.mmenc
Each wallet will be uniquely named using the address index and encrypted with the address’ unique wallet password. No user interaction is required during the creation process. By default, wallets are synced to the current block height, as they’re assumed to be empty, but this behavior can be overridden:
$ mmgen-xmrwallet --restore-height=123456 create *XMR*.akeys.mmenc
To keep your wallets in sync as the Monero blockchain grows, use the sync
subcommand:
$ mmgen-xmrwallet sync *XMR*.akeys.mmenc
No user interaction is required here either, which is very helpful when you have multiple wallets requiring long sync times.
To learn how to transact using your wallets, continue on to the
mmgen-xmrwallet help screen.
THORChain (RUNE)
Install the RUNE requirements:
$ python3 -m pip install -r rune-requirements.txt
Transacting RUNE with MMGen Wallet is similar to transacting BTC as described in
the Getting Started guide. Just add the --coin=rune option to all
relevant commands. With mmgen-autosign, add rune to the list of coins in
the --coins parameter.
Note that MMGen Wallet’s RUNE support requires no locally running node; instead,
balances are fetched and transactions sent via a public node at ninerealms.com.
As this can compromise your privacy, it’s recommended to proxy all
communications via Tor or I2P: refer to the helpscreens of mmgen-txcreate,
mmgen-swaptxcreate and mmgen-txsend for more information.
Asset swaps via THORChain
Install the RUNE requirements as shown above.
21 assets (as of this writing) may be swapped directly within MMGen Wallet via
THORChain. Swapping assets is just like normal transacting, except transactions
are created using mmgen-swaptxcreate instead of mmgen-txcreate. Note that
coin daemons for both the send and receive assets must be running and synced
before carrying out a swap. Depending on your setup, communication with two
daemons simultaneously may require the use of coin-specific options (see
mmgen-swaptxcreate --longhelp). For usage information, examples, and a list
of supported assets, invoke mmgen-swaptxcreate --help.
Key/address generation for Zcash (ZEC)
MMGen Wallet supports generation of Zcash z-addresses.
Generate ten Zcash z-address key/address pairs from your default wallet:
$ mmgen-keygen --coin=zec --type=zcash_z 1-10
The addresses’ view keys are included in the output file as well.
NOTE: Since your key/address file will probably be used on an online computer,
you should encrypt it with a good password when prompted to do so. The file can
decrypted as required using the mmgen-tool decrypt command. If you choose a
non-standard Scrypt hash preset, take care to remember it.
To generate Zcash t-addresses, just omit the --type argument:
$ mmgen-keygen --coin=zec 1-10
Key/address generation for 144 Bitcoin-derived altcoins
To generate key/address pairs for these coins, just specify the coin’s symbol
with the --coin argument:
# For DASH:
$ mmgen-keygen --coin=dash 1-10
# For Emercoin:
$ mmgen-keygen --coin=emc 1-10
For compressed public keys, add the --type=compressed option:
$ mmgen-keygen --coin=dash --type=compressed 1-10
If it’s just the addresses you want, then use mmgen-addrgen instead:
$ mmgen-addrgen --coin=dash --type=compressed 1-10
Regarding encryption of key/address files, see the note for Zcash above.
Here’s a complete list of supported altcoins as of this writing:
2give,42,611,ac,acoin,alf,anc,apex,arco,arg,aur,bcf,blk,bmc,bqc,bsty,btcd,
btq,bucks,cann,cash,cat,cbx,ccn,cdn,chc,clam,con,cpc,crps,csh,dash,dcr,dfc,
dgb,dgc,doge,doged,dope,dvc,efl,emc,emd,enrg,esp,fai,fc2,fibre,fjc,flo,flt,
fst,ftc,gcr,good,grc,gun,ham,html5,hyp,icash,infx,inpay,ipc,jbs,judge,lana,
lat,ldoge,lmc,ltc,mars,mcar,mec,mint,mobi,mona,moon,mrs,mue,mxt,myr,myriad,
mzc,neos,neva,nka,nlg,nmc,nto,nvc,ok,omc,omni,onion,onx,part,pink,pivx,pkb,
pnd,pot,ppc,ptc,pxc,qrk,rain,rbt,rby,rdd,ric,sdc,sib,smly,song,spr,start,
sys,taj,tit,tpc,trc,ttc,tx,uno,via,vpn,vtc,wash,wdc,wisc,wkc,wsx,xcn,xgb,
xmg,xpm,xpoke,xred,xst,xvc,zet,zlq,zoom,zrc,bch,etc,eth,ltc,xmr,zec
Note that support for most of these coins is EXPERIMENTAL. Many of them have received only minimal testing, or no testing at all. At startup you’ll be informed of the level of your selected coin’s support reliability as deemed by the MMGen Project.
The MMGen Wallet Wiki
Download/Install
Using MMGen Wallet
Homepage:
Clearnet |
I2P |
Onion
Code Repository:
Clearnet |
I2P |
Onion
Code Repository Mirrors:
Github |
Gitlab |
Codeberg
IRC:
#mmgen-wallet (OFTC | postman.i2p) |
E-Mail:
Tuta |
Proton
Accounts:
Twitter |
Bitcointalk |
Dread |
Reddit |
Keybase
PGP Signing Key: [5C84 CB45 AEE2 250F 31A6 A570 3F8B 1861 E32B 7DA2][5]
Donate:
⊙ BTC: bc1qxmymxf8p5ckvlxkmkwgw8ap5t2xuaffmrpexap
⊙ BCH: 15TLdmi5NYLdqmtCqczUs5pBPkJDXRs83w
⊙ XMR: 8B14zb8wgLuKDdse5p8f3aKpFqRdB4i4xj83b7BHYABHMvHifWxiDXeKRELnaxL5FySfeRRS5girgUvgy8fQKsYMEzPUJ8h