Browse Source

Version 0.9.6

MMGen 7 years ago
parent
commit
83e9899b38
69 changed files with 544 additions and 390 deletions
  1. 1 1
      README.md
  2. 1 1
      cmds/mmgen-addrgen
  3. 1 1
      cmds/mmgen-addrimport
  4. 1 1
      cmds/mmgen-autosign
  5. 1 1
      cmds/mmgen-keygen
  6. 1 1
      cmds/mmgen-passchg
  7. 1 1
      cmds/mmgen-passgen
  8. 1 1
      cmds/mmgen-regtest
  9. 1 1
      cmds/mmgen-split
  10. 1 1
      cmds/mmgen-tool
  11. 1 1
      cmds/mmgen-txbump
  12. 1 1
      cmds/mmgen-txcreate
  13. 1 1
      cmds/mmgen-txdo
  14. 1 1
      cmds/mmgen-txsend
  15. 1 1
      cmds/mmgen-txsign
  16. 1 1
      cmds/mmgen-walletchk
  17. 1 1
      cmds/mmgen-walletconv
  18. 1 1
      cmds/mmgen-walletgen
  19. 6 5
      doc/wiki/install-linux/Install-Bitcoind-from-Source-on-Debian-or-Ubuntu-Linux.md
  20. 3 3
      doc/wiki/install-linux/Install-MMGen-on-Debian-or-Ubuntu-Linux.md
  21. 95 64
      doc/wiki/install-mswin/Install-MMGen-and-Its-Dependencies-on-Microsoft-Windows.md
  22. 309 222
      doc/wiki/using-mmgen/Getting-Started-with-MMGen.md
  23. 1 1
      extmod/secp256k1mod.c
  24. 3 1
      mmgen/addr.py
  25. 1 1
      mmgen/altcoin.py
  26. 1 1
      mmgen/color.py
  27. 1 1
      mmgen/common.py
  28. 1 1
      mmgen/crypto.py
  29. 1 1
      mmgen/filename.py
  30. 7 8
      mmgen/globalvars.py
  31. 1 1
      mmgen/license.py
  32. 1 1
      mmgen/main.py
  33. 1 1
      mmgen/main_addrgen.py
  34. 1 1
      mmgen/main_addrimport.py
  35. 1 1
      mmgen/main_passgen.py
  36. 1 1
      mmgen/main_regtest.py
  37. 1 1
      mmgen/main_split.py
  38. 1 1
      mmgen/main_tool.py
  39. 1 1
      mmgen/main_txbump.py
  40. 1 1
      mmgen/main_txcreate.py
  41. 1 1
      mmgen/main_txdo.py
  42. 1 1
      mmgen/main_txsend.py
  43. 1 1
      mmgen/main_txsign.py
  44. 1 1
      mmgen/main_wallet.py
  45. 1 1
      mmgen/mn_electrum.py
  46. 1 1
      mmgen/mn_tirosh.py
  47. 3 3
      mmgen/obj.py
  48. 1 1
      mmgen/opts.py
  49. 2 2
      mmgen/protocol.py
  50. 15 13
      mmgen/regtest.py
  51. 1 1
      mmgen/rpc.py
  52. 1 1
      mmgen/seed.py
  53. 1 1
      mmgen/sha256.py
  54. 1 1
      mmgen/term.py
  55. 1 1
      mmgen/test.py
  56. 1 1
      mmgen/tool.py
  57. 1 1
      mmgen/tw.py
  58. 1 1
      mmgen/tx.py
  59. 1 1
      mmgen/txsign.py
  60. 1 1
      mmgen/util.py
  61. 26 7
      scripts/test-release.sh
  62. 1 1
      scripts/tx-btc2bch.py
  63. 1 1
      setup.py
  64. 1 1
      test/gentest.py
  65. 1 1
      test/mmgen_pexpect.py
  66. 1 1
      test/objtest.py
  67. 5 2
      test/scrambletest.py
  68. 13 3
      test/test.py
  69. 1 1
      test/tooltest.py

+ 1 - 1
README.md

@@ -109,7 +109,7 @@ future use in an address file, which addresses may safely be made public.
 
 > #### [Recovering your keys without the MMGen software][r]
 
-> #### [Forkcoin and Altcoin support (BCH,LTC,ETH,ETC,DASH,ZEC)][x]
+> #### [Forkcoin and Altcoin support (BCH,LTC,ETH,ETC,ZEC,XMR and 144 Bitcoin-derived alts)][x]
 
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 

+ 1 - 1
cmds/mmgen-addrgen

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-addrimport

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-autosign

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
cmds/mmgen-keygen

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-passchg

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-passgen

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-regtest

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-split

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-tool

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-txbump

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-txcreate

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-txdo

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-txsend

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-txsign

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-walletchk

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-walletconv

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 1 - 1
cmds/mmgen-walletgen

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software

+ 6 - 5
doc/wiki/install-linux/Install-Bitcoind-from-Source-on-Debian-or-Ubuntu-Linux.md

@@ -73,15 +73,16 @@ binaries are available for Bitcoin Core, Bitcoin ABC and Litecoin.  See the
 		$ cd src
 		$ sudo install -sv litecoind litecoin-cli /usr/local/bin
 
-> To simplify the starting and stopping of several daemons on the same machine,
-> download and use the node start and stop scripts from the MMGenLive project:
+Refer to [Run][02] on the binary installation page for instructions on running
+your coin daemon(s).
+
+Alternatively, you may download and use the node start and stop scripts from the
+MMGenLive project, which simplify starting and stopping multiple daemons on the
+same machine:
 
 		$ curl -O 'https://raw.githubusercontent.com/mmgen/MMGenLive/master/home.mmgen/bin/mmlive-node-{start,stop}'
 		$ sudo install -v mmlive-node-{start,stop} /usr/local/bin
 
-Refer to [Run][02] on the binary installation page for instructions on running
-your coin daemon(s).
-
 [01]: Install-Bitcoind
 [02]: Install-Bitcoind#a_r
 [bu]: https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md

+ 3 - 3
doc/wiki/install-linux/Install-MMGen-on-Debian-or-Ubuntu-Linux.md

@@ -2,11 +2,11 @@
 
 > Install required Debian/Ubuntu packages:
 
-		$ sudo apt-get install python-pip python-dev python-pexpect python-ecdsa python-scrypt libssl-dev git autoconf libtool wipe python-setuptools libgmp-dev
+		$ sudo apt-get install python-dev python-pexpect python-ecdsa python-scrypt libssl-dev git autoconf libtool wipe python-setuptools libgmp-dev python-crypto python-nacl python-pysha3 python-pip
 
-> Install the Python Cryptography Toolkit:
+> Install fast ed25519 Python package (optional, but recommended for Monero addresses):
 
-		$ sudo -H pip install pycrypto
+		$ sudo pip install ed25519ll
 
 > Install the secp256k1 library:
 

+ 95 - 64
doc/wiki/install-mswin/Install-MMGen-and-Its-Dependencies-on-Microsoft-Windows.md

@@ -8,8 +8,8 @@ the preferred way for all non-Linux users to run MMGen.***
 Enter your MSYS environment, create the directory `/build` and move to it.
 This is where you'll be unpacking and building archives:
 
-		$ mkdir /build
-		$ cd /build
+	$ mkdir /build
+	$ cd /build
 
 If the machine you're installing on is online, you can download the various
 tarballs and zipped archives you need from the Internet exactly as described in
@@ -27,11 +27,11 @@ archive would thus look something like this:
 
 Grab the v1.0.x [tarball][06] from openssl.org, unpack and build:
 
-		$ tar -xzf <path to openssl archive>/openssl-1.0.2j.tar.gz
-		$ cd openssl-1.0.2j
-		$ ./Configure mingw64 --openssldir=/usr
-		$ make
-		$ make install
+	$ tar -xzf <path to openssl archive>/openssl-1.0.2j.tar.gz
+	$ cd openssl-1.0.2j
+	$ ./Configure mingw64 --openssldir=/usr
+	$ make
+	$ make install
 
 ### 3. Build the Scrypt Python module:
 
@@ -39,90 +39,119 @@ The latest scrypt tarball available from [Python][07] at this writing
 (scrypt-0.8.0.tar.gz) has missing files and doesn't build, so grab the latest
 [zipfile][07z] from the scrypt source repository, unzip and build:
 
-		$ cd /build
-		$ unzip <path to scrypt archive>/91d194b6a6bd.zip
-		$ cd mhallin-py-scrypt-91d194b6a6bd
+	$ cd /build
+	$ unzip <path to scrypt archive>/91d194b6a6bd.zip
+	$ cd mhallin-py-scrypt-91d194b6a6bd
 
 Open the file `setup.py` in your text editor. Change the line reading
 
-		from setuptools import setup, Extension
+	from setuptools import setup, Extension
 
 to read
 
-		from distutils.core import setup, Extension
+	from distutils.core import setup, Extension
 
 Right before the line beginning with
 
-		scrypt_module = Extension(
+	scrypt_module = Extension(
 
 add the following lines (with no indentation):
 
-		library_dirs = [r'c:\mingw64\x86_64-w4-mingw32\lib','/msys/lib']
-		includes = [r'c:\msys\include']
+	library_dirs = [r'c:\mingw64\x86_64-w4-mingw32\lib','/msys/lib']
+	includes = [r'c:\msys\include']
 
 Save `setup.py`, build and install:
 
-		$ python setup.py build --compiler=mingw32
-		$ python setup.py install
+	$ python setup.py build --compiler=mingw32
+	$ python setup.py install
 
 Now, to solve a problem with the interpreter not finding the scrypt extension
 module, we have to do this little fixup:
 
-		$ cd /mingw/opt/lib/python2.7/site-packages
-		$ unzip scrypt*.egg
+	$ cd /mingw/opt/lib/python2.7/site-packages
+	$ unzip scrypt*.egg
 
 ### 4. Build the pycrypto Python module:
 
 Download the latest pycrypto [tarball][02] from the Python website and unpack it:
 
-		$ cd /build
-		$ tar -xzf <path to pycrypto archive>/pycrypto-2.6.1.tar.gz
-		$ cd pycrypto-2.6.1
+	$ cd /build
+	$ tar -xzf <path to pycrypto archive>/pycrypto-2.6.1.tar.gz
+	$ cd pycrypto-2.6.1
 
 Open the file `setup.py` in your text editor. Remove *exactly* four spaces at
 the beginning of this line:
 
-		self.__remove_extensions(["CryptoPublicKey._fastmath"])
+	self.__remove_extensions(["CryptoPublicKey._fastmath"])
 
 to move it one level of indentation to the left.  Save the file and exit the
 editor.  Now build and install:
 
-		$ python setup.py build --compiler=mingw32
-		$ python setup.py install
+	$ python setup.py build --compiler=mingw32
+	$ python setup.py install
 
 ### 5. Install the ecdsa Python module:
 
 Grab the latest python-ecdsa [tarball][03], unpack and build:
 
-		$ cd /build
-		$ tar -xzf <path to ecdsa archive>/ecdsa-0.13.tar.gz
-		$ cd ecdsa-0.13
-		$ python setup.py install
+	$ cd /build
+	$ tar -xzf <path to ecdsa archive>/ecdsa-0.13.tar.gz
+	$ cd ecdsa-0.13
+	$ python setup.py install
 
-### 6. Install the colorama Python module:
+### 6. Install the ed25519ll Python module (required for Monero address generation):
+
+Grab the latest ed25519ll [tarball][43], unpack and build:
+
+	$ cd /build
+	$ tar -xzf <path to ed25519ll archive>/ed25519ll-0.6.tar.gz
+	$ cd ed25519ll-0.6
+
+Open the file `setup.py` in your text editor. Change the line reading
+
+	plat_name = get_platform().replace('-', '_')
+
+to read
+
+	plat_name = 'win64'
+
+Exit the editor and run:
+
+	$ python setup.py install
+
+### 7. Install the pysha3 Python module (required for Monero and Ethereum address generation):
+
+Grab the latest pysha3 [tarball][44], unpack and build:
+
+	$ cd /build
+	$ tar -xzf <path to pysha3 archive>/pysha3-1.0.2.tar.gz
+	$ cd pysha3-1.0.2
+	$ python setup.py install
+
+### 8. Install the colorama Python module:
 
 Grab the latest colorama [tarball][14], unpack and build:
 
-		$ cd /build
-		$ tar -xzf <path to colorama archive>/colorama-0.3.7.tar.gz
-		$ cd colorama-0.3.7
-		$ python setup.py install
+	$ cd /build
+	$ tar -xzf <path to colorama archive>/colorama-0.3.7.tar.gz
+	$ cd colorama-0.3.7
+	$ python setup.py install
 
-### 7. Install the pexpect Python module (needed for test suite):
+### 9. Install the pexpect Python module (needed for test suite):
 
 Grab the latest pexpect [tarball][15], unpack and build:
 
-		$ cd /build
-		$ tar -xzf <path to pexpect archive>/pexpect-4.2.1.tar.gz
-		$ cd pexpect-4.2.1
-		$ python setup.py install
+	$ cd /build
+	$ tar -xzf <path to pexpect archive>/pexpect-4.2.1.tar.gz
+	$ cd pexpect-4.2.1
+	$ python setup.py install
 
-### 8. Install sdelete utility (needed for secure wallet deletion):
+### 10. Install sdelete utility (needed for secure wallet deletion):
 
 Grab the latest SDelete [zip archive][16], unzip and copy `sdelete.exe` to
 your execution path (`c:\windows`, for example).
 
-### 9. Build libsecp256k1:
+### 11. Build libsecp256k1:
 
 Libsecp256k1 requires GNU autotools to build, and they're not included in the
 MinGW-64 distribution for some reason, so you'll have to retrieve and unpack
@@ -134,41 +163,41 @@ them yourself. You'll need these archives:
 
 Unpack them in your /mingw directory and fix up some filenames:
 
-		$ cd /mingw
-		$ tar -xzf <path to>/autoconf2.5-2.68-1-mingw32-bin.tar.lzma
-		$ tar -xzf <path to>/automake1.11-1.11.1-1-mingw32-bin.tar.lzma
-		$ tar -xzf <path to>/libtool-2.4-1-mingw32-bin.tar.lzma
-		$ cd bin
-		$ cp autoconf-* autoconf
-		$ cp automake-* automake
-		$ cp aclocal-* aclocal
-		$ cp autoreconf-* autoreconf
+	$ cd /mingw
+	$ tar -xzf <path to>/autoconf2.5-2.68-1-mingw32-bin.tar.lzma
+	$ tar -xzf <path to>/automake1.11-1.11.1-1-mingw32-bin.tar.lzma
+	$ tar -xzf <path to>/libtool-2.4-1-mingw32-bin.tar.lzma
+	$ cd bin
+	$ cp autoconf-* autoconf
+	$ cp automake-* automake
+	$ cp aclocal-* aclocal
+	$ cp autoreconf-* autoreconf
 
 Now get the latest libsecp256k1 [zip archive][11] from GitHub, unpack, build and
 install:
 
-		$ cd /build
-		$ unzip.exe <path to libsecp256k1 archive>/master.zip
-		$ cd secp256k1-master
-		$ ./autogen.sh
-		$ ./configure
-		$ make
-		$ make install
+	$ cd /build
+	$ unzip.exe <path to libsecp256k1 archive>/master.zip
+	$ cd secp256k1-master
+	$ ./autogen.sh
+	$ ./configure
+	$ make
+	$ make install
 
-### 10. Install MMGen:
+### 12. Install MMGen:
 
 Get the [zip archive][10] of the latest stable version from GitHub, unpack and install:
 
-		$ cd /build
-		$ unzip.exe <path to mmgen archive>/stable_mswin.zip
-		$ cd mmgen-stable_mswin
-		$ python setup.py build --compiler=mingw32
-		$ sudo ./setup.py install
+	$ cd /build
+	$ unzip.exe <path to mmgen archive>/stable_mswin.zip
+	$ cd mmgen-stable_mswin
+	$ python setup.py build --compiler=mingw32
+	$ sudo ./setup.py install
 
 After first installing and starting the [Bitcoin daemon][77], you may then run
 the MMGen test suite to make sure your installation's working:
 
-		$ test/test.py -s
+	$ test/test.py -s
 
 [02]: https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz#md5=55a61a054aa66812daf5161a0d5d7eda
 [03]: https://pypi.python.org/packages/f9/e5/99ebb176e47f150ac115ffeda5fedb6a3dbb3c00c74a59fd84ddf12f5857/ecdsa-0.13.tar.gz#md5=1f60eda9cb5c46722856db41a3ae6670
@@ -185,3 +214,5 @@ the MMGen test suite to make sure your installation's working:
 [32]: https://sourceforge.net/projects/mingw/files/MinGW/Extension/automake/automake1.11/automake1.11-1.11.1-1/automake1.11-1.11.1-1-mingw32-bin.tar.lzma
 [33]: https://sourceforge.net/projects/mingw/files/MinGW/Extension/libtool/libtool-2.4-1/libtool-2.4-1-mingw32-bin.tar.lzma
 [77]: Install-Bitcoind
+[43]: https://pypi.python.org/packages/8a/34/b27ee501205893cf7cc537b4e6553a557eaaca14c4755aa1eaa500afac57/ed25519ll-0.6.tar.gz#md5=35b3190ffefb631e7c5a45d96d768f80
+[44]: https://pypi.python.org/packages/73/bf/978d424ac6c9076d73b8fdc8ab8ad46f98af0c34669d736b1d83c758afee/pysha3-1.0.2.tar.gz#md5=59cd2db7a9988c1f3f6aee40145e0c96

+ 309 - 222
doc/wiki/using-mmgen/Getting-Started-with-MMGen.md

@@ -27,7 +27,10 @@
 	* <a href='#a_rbf_onl'>With an online (hot) wallet</a>
 	* <a href='#a_rbf_onf'>With an offline (cold storage) wallet</a>
 
-#### <a href='#a_alt'>Forkcoin and Altcoin support (BCH,LTC)</a>
+#### <a href='#a_alt'>Forkcoin and Altcoin support</a>
+* <a href='#a_bch'>Full support for Bcash (BCH) and Litecoin</a>
+* <a href='#a_es'>Enhanced key/address generation support for Zcash (ZEC) and Monero (XMR)</a>
+* <a href='#a_kg'>Key/address generation support for ETH, ETC and 144 Bitcoin-derived altcoins</a>
 
 ### <a name='a_i'>Preliminaries</a>
 
@@ -67,10 +70,10 @@ options on the command line.
 
 Sample MMGen command invocations:
 
-		$ mmgen-txcreate --help
-		$ mmgen-addrgen --verbose 1-10
-		$ mmgen-walletgen
-		$ mmgen-walletgen --quiet --seed-len 128
+	$ mmgen-txcreate --help
+	$ mmgen-addrgen --verbose 1-10
+	$ mmgen-walletgen
+	$ mmgen-walletgen --quiet --seed-len 128
 
 #### <a name='a_cf'>Configuration file</a>
 
@@ -118,9 +121,9 @@ source in all commands where a seed source is required.*
 
 On your offline computer, generate an MMGen wallet:
 
-		$ mmgen-walletgen
-		...
-		MMGen wallet written to file '/home/username/.mmgen/89ABCDEF-76543210[256,3].mmdat'
+	$ mmgen-walletgen
+	...
+	MMGen wallet written to file '/home/username/.mmgen/89ABCDEF-76543210[256,3].mmdat'
 
 ‘89ABCDEF’ is the Seed ID; ‘76543210’ is the Key ID. These are randomly
 generated, so your IDs will of course be different than these.
@@ -146,29 +149,31 @@ printed out on paper.
 Another highly recommended way to back up your wallet is to generate a mnemonic
 or seed file <a href='#a_ms'>as described below </a> and memorize it.  If you
 have an average or better memory, you'll find memorizing your mnemonic to be
-surprisingly easy.
+surprisingly easy. And the peace of mind that comes with knowing that your coins
+are recoverable **even if you lose all your physical backups** can't be
+overestimated.
 
 #### <a name='a_ga'>Generate addresses (offline computer)</a>
 
 Now generate ten Segwit addresses with your just-created wallet:
 
-		$ mmgen-addrgen --type=segwit 1-10
-		...
-		Addresses written to file '89ABCDEF-S[1-10].addrs'
-
-		$ cat '89ABCDEF-S[1-10].addrs'
-		89ABCDEF SEGWIT {
-		  1    36bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE
-		  2    3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc
-		  3    3HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N
-		  4    34Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s
-		  5    3PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7
-		  6    3FEqfEsSILwXPfMvVvVuUovzTaaST62Mnf
-		  7    3LTTzuhMqPLwQ4IGCwwugny6ZMtUQJSJ1
-		  8    3F9495H8EJLb54wirgZkVgI47SP7M2RQWv
-		  9    3JbrCyt7BdxRE9GX1N7GiEct8UnIjPmpYd
-		  10   3H7vVTk4ejUbQXw45I6g5qvPBSe9bsjDqh
-		}
+	$ mmgen-addrgen --type=segwit 1-10
+	...
+	Addresses written to file '89ABCDEF-S[1-10].addrs'
+
+	$ cat '89ABCDEF-S[1-10].addrs'
+	89ABCDEF SEGWIT {
+	  1    36bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE
+	  2    3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc
+	  3    3HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N
+	  4    34Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s
+	  5    3PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7
+	  6    3FEqfEsSILwXPfMvVvVuUovzTaaST62Mnf
+	  7    3LTTzuhMqPLwQ4IGCwwugny6ZMtUQJSJ1
+	  8    3F9495H8EJLb54wirgZkVgI47SP7M2RQWv
+	  9    3JbrCyt7BdxRE9GX1N7GiEct8UnIjPmpYd
+	  10   3H7vVTk4ejUbQXw45I6g5qvPBSe9bsjDqh
+	}
 
 Note that the address range ‘1-10’ specified on the command line is included in
 the resulting filename.
@@ -183,21 +188,21 @@ installations, and it's unlikely you'll wish to generate them.  Compressed
 addresses are the preferred choice for Bitcoin Cash (BCH) wallets, since Bitcoin
 Cash doesn't support Segwit.
 
-		# legacy uncompressed
-		$ mmgen-addrgen 1-10
-		...
-		$ cat '89ABCDEF[1-10].addrs'
-		89ABCDEF {
-		  1   12GiSWo9zIQgkCmjAaLIrbPwXhKry2jHhj
-		...
-
-		# compressed P2PKH
-		$ mmgen-addrgen --type=compressed 1-10
-		...
-		$ cat '89ABCDEF-C[1-10].addrs'
-		89ABCDEF COMPRESSED {
-		  1   13jbRxWjswXtaDzLBJDboMcIe6nLohFb9M
-		...
+	# legacy uncompressed
+	$ mmgen-addrgen 1-10
+	...
+	$ cat '89ABCDEF[1-10].addrs'
+	89ABCDEF {
+	  1   12GiSWo9zIQgkCmjAaLIrbPwXhKry2jHhj
+	...
+
+	# compressed P2PKH
+	$ mmgen-addrgen --type=compressed 1-10
+	...
+	$ cat '89ABCDEF-C[1-10].addrs'
+	89ABCDEF COMPRESSED {
+	  1   13jbRxWjswXtaDzLBJDboMcIe6nLohFb9M
+	...
 
 Note that for non-legacy address types the code letter is included in the
 filename.
@@ -215,27 +220,27 @@ provide the addresses with labels.  We’ll use the labels ‘Donations’, ‘S
 
 Make a copy of the address file
 
-		$ cp '89ABCDEF-S[1-10].addrs' my.addrs
+	$ cp '89ABCDEF-S[1-10].addrs' my.addrs
 
 and edit it using the text editor of your choice,
 
-		$ nano my.addrs
+	$ nano my.addrs
 
 adding labels to the addresses you’ve chosen to spend to:
 
-		# My first MMGen addresses
-		89ABCDEF SEGWIT {
-		  1    36bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE  Donations
-		  2    3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc  Storage 1
-		  3    3HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N  Storage 2
-		  4    34Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s  Storage 3
-		  5    3PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7
-		  6    3FEqfEsSILwXPfMvVvVuUovzTaaST62Mnf
-		  7    3LTTzuhMqPLwQ4IGCwwugny6ZMtUQJSJ1
-		  8    3F9495H8EJLb54wirgZkVgI47SP7M2RQWv
-		  9    3JbrCyt7BdxRE9GX1N7GiEct8UnIjPmpYd
-		  10   3H7vVTk4ejUbQXw45I6g5qvPBSe9bsjDqh
-		}
+	# My first MMGen addresses
+	89ABCDEF SEGWIT {
+	  1    36bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE  Donations
+	  2    3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc  Storage 1
+	  3    3HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N  Storage 2
+	  4    34Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s  Storage 3
+	  5    3PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7
+	  6    3FEqfEsSILwXPfMvVvVuUovzTaaST62Mnf
+	  7    3LTTzuhMqPLwQ4IGCwwugny6ZMtUQJSJ1
+	  8    3F9495H8EJLb54wirgZkVgI47SP7M2RQWv
+	  9    3JbrCyt7BdxRE9GX1N7GiEct8UnIjPmpYd
+	  10   3H7vVTk4ejUbQXw45I6g5qvPBSe9bsjDqh
+	}
 
 Any line beginning with ‘#’ is a comment.  Comments may be placed at the ends
 of lines as well.
@@ -249,22 +254,22 @@ existing 'wallet.dat' file out of harm’s way.  Start bitcoind and let it
 generate a new 'wallet.dat'; this you’ll use as your tracking wallet.  Import
 your ten addresses into the new tracking wallet with the command:
 
-		$ mmgen-addrimport --batch my.addrs
+	$ mmgen-addrimport --batch my.addrs
 
 These addresses will now be tracked: any BTC transferred to them will show up in
 your listing of address balances.  Balances can be viewed using `mmgen-tool
 listaddresses` (the `showempty` option requests the inclusion of addresses with
 empty balances).
 
-		$ mmgen-tool listaddresses showempty=1
-		MMGenID       ADDRESS                             COMMENT    BALANCE
-		89ABCDEF:S:1  36bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE  Donations    0
-		89ABCDEF:S:2  3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc  Storage 1    0
-		89ABCDEF:S:3  3HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N  Storage 2    0
-		89ABCDEF:S:4  34Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s  Storage 3    0
-		89ABCDEF:S:5  3PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7               0
-		...
-		TOTAL: 0 BTC
+	$ mmgen-tool listaddresses showempty=1
+	MMGenID       ADDRESS                             COMMENT    BALANCE
+	89ABCDEF:S:1  36bNmyYISiptuvJG3X7MPwiiS4HYvD7ksE  Donations    0
+	89ABCDEF:S:2  3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc  Storage 1    0
+	89ABCDEF:S:3  3HgYCsfqYzIg7LVVfDTp7gYJocJEiDAy6N  Storage 2    0
+	89ABCDEF:S:4  34Tu3z1tiexXDonNsFIkvzqutE5E3pTK8s  Storage 3    0
+	89ABCDEF:S:5  3PeI55vtp2bX2uKDkAAR2c6ekHNYe4Hcq7               0
+	...
+	TOTAL: 0 BTC
 
 *While not covered in this introduction, note that it’s also possible to [import
 ordinary Bitcoin addresses into your tracking wallet][01].  This allows you to
@@ -282,13 +287,13 @@ them over the Bitcoin network.  If you send 0.1, 0.2, 0.3 and 0.4 BTC
 respectively, your address listing will look like this after the transactions
 have confirmed:
 
-		$ mmgen-tool listaddresses
-		MMGenID       COMMENT    BALANCE
-		89ABCDEF:S:1  Donations    0.1
-		89ABCDEF:S:2  Storage 1    0.2
-		89ABCDEF:S:3  Storage 2    0.3
-		89ABCDEF:S:4  Storage 3    0.4
-		TOTAL: 1 BTC
+	$ mmgen-tool listaddresses
+	MMGenID       COMMENT    BALANCE
+	89ABCDEF:S:1  Donations    0.1
+	89ABCDEF:S:2  Storage 1    0.2
+	89ABCDEF:S:3  Storage 2    0.3
+	89ABCDEF:S:4  Storage 3    0.4
+	TOTAL: 1 BTC
 
 #### <a name='a_ct'>Create a transaction (online computer)</a>
 
@@ -303,7 +308,7 @@ To send 0.1 BTC to the a third-party address 3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,
 for example, and send the change back to yourself at address 89ABCDEF:S:5, you’d
 issue the following command:
 
-		$ mmgen-txcreate 3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:S:5
+	$ mmgen-txcreate 3AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:S:5
 
 'mmgen-txcreate' accepts either MMGen IDs or Bitcoin addresses as arguments.
 
@@ -314,7 +319,7 @@ from the MMGen ID.  Thus address ‘89ABCDEF:L:5’ may be expressed as
 To send 0.1 BTC to each of addresses 89ABCDEF:S:6 and 89ABCDEF:S:7 and return
 the change to 89ABCDEF:S:8, you’d do this:
 
-		$ mmgen-txcreate 89ABCDEF:S:6,0.1 89ABCDEF:S:7,0.1 89ABCDEF:S:8
+	$ mmgen-txcreate 89ABCDEF:S:6,0.1 89ABCDEF:S:7,0.1 89ABCDEF:S:8
 
 As you can see, each send address is followed by a comma and the amount.  The
 address with no amount is the change address.  All addresses belonging to your
@@ -330,20 +335,20 @@ criteria: transaction ID, address, amount and transaction age.  Your overall
 balance in BTC appears at the top of the screen.  In our example, the display
 will look something like this:
 
-		UNSPENT OUTPUTS (sort order: Age)  Total BTC: 1
-		 Num  TX id  Vout    Address                               Amt(BTC) Age(d)
-		 1)   e9742b16... 5  3L3kxmi.. 89ABCDEF:S:1    Donations       0.1    1
-		 2)   fa84d709... 6  3N4dSGj.. 89ABCDEF:S:2    Storage 1       0.2    1
-		 3)   8dde8ef5... 6  3M1fVDc.. 89ABCDEF:S:3    Storage 1       0.3    1
-		 4)   c76874c7... 0  3E8MFoC.. 89ABCDEF:S:4    Storage 3       0.4    1
+	UNSPENT OUTPUTS (sort order: Age)  Total BTC: 1
+	 Num  TX id  Vout    Address                               Amt(BTC) Age(d)
+	 1)   e9742b16... 5  3L3kxmi.. 89ABCDEF:S:1    Donations       0.1    1
+	 2)   fa84d709... 6  3N4dSGj.. 89ABCDEF:S:2    Storage 1       0.2    1
+	 3)   8dde8ef5... 6  3M1fVDc.. 89ABCDEF:S:3    Storage 1       0.3    1
+	 4)   c76874c7... 0  3E8MFoC.. 89ABCDEF:S:4    Storage 3       0.4    1
 
-		Sort options: [t]xid, [a]mount, a[d]dress, [A]ge, [r]everse, [M]mgen addr
-		Display options: show [D]ays, [g]roup, show [m]mgen addr, r[e]draw screen
-		'q'=quit view, 'p'=print to file, 'v'=pager view, 'w'=wide view, 'l'=add label:
+	Sort options: [t]xid, [a]mount, a[d]dress, [A]ge, [r]everse, [M]mgen addr
+	Display options: show [D]ays, [g]roup, show [m]mgen addr, r[e]draw screen
+	'q'=quit view, 'p'=print to file, 'v'=pager view, 'w'=wide view, 'l'=add label:
 
 After quitting the menu with 'q', you’ll see the following prompt:
 
-		Enter a range or space-separated list of outputs to spend:
+	Enter a range or space-separated list of outputs to spend:
 
 Here you must choose unspent outputs of sufficient value to cover the send
 amount of 0.1 BTC, plus the transaction fee (for more on fees, see ‘Transaction
@@ -351,7 +356,7 @@ Fees’ under ‘Advanced Topics’ below).  Output #2 is worth 0.2 BTC, which i
 sufficient, so we’ll choose that.  After several more prompts and confirmations,
 your transaction will be saved:
 
-		Transaction written to file 'FEDCBA[0.1].rawtx'
+	Transaction written to file 'FEDCBA[0.1].rawtx'
 
 Note that the transaction filename consists of a unique MMGen Transaction ID
 plus the non-change spend amount.
@@ -364,9 +369,9 @@ and change addresses.  This feature will be appreciated by privacy-conscious use
 Now transfer the the raw transaction file to your offline computer and sign it
 using your default wallet:
 
-		$ mmgen-txsign FEDCBA[0.1].rawtx
-		...
-		Signed transaction written to file 'FEDCBA[0.1].sigtx'
+	$ mmgen-txsign FEDCBA[0.1].rawtx
+	...
+	Signed transaction written to file 'FEDCBA[0.1].sigtx'
 
 Note that the signed transaction file has a new extension, '.sigtx'.
 
@@ -377,9 +382,9 @@ network.  Start bitcoind if it's not already running, and make sure your
 blockchain is fully synced.  Then copy the signed transaction file to your
 online computer and issue the command:
 
-		$ mmgen-txsend FEDCBA[0.1].sigtx
-		...
-		Transaction sent: abcd1234....
+	$ mmgen-txsend FEDCBA[0.1].sigtx
+	...
+	Transaction sent: abcd1234....
 
 Like all MMGen commands, 'mmgen-txsend' is interactive, so you’ll be prompted
 before the transaction is actually broadcast.  If the send was successful, a
@@ -389,13 +394,13 @@ in our case).
 Once the transaction is broadcast to the network and confirmed, your address
 listing should look something like this:
 
-		$ mmgen-tool listaddresses minconf=1
-		MMGenID       COMMENT    BALANCE
-		89ABCDEF:S:1  Donations    0.1
-		89ABCDEF:S:3  Storage 2    0.3
-		89ABCDEF:S:4  Storage 3    0.4
-		89ABCDEF:S:5  Storage 1    0.0999
-		TOTAL: 0.8999 BTC
+	$ mmgen-tool listaddresses minconf=1
+	MMGenID       COMMENT    BALANCE
+	89ABCDEF:S:1  Donations    0.1
+	89ABCDEF:S:3  Storage 2    0.3
+	89ABCDEF:S:4  Storage 3    0.4
+	89ABCDEF:S:5  Storage 1    0.0999
+	TOTAL: 0.8999 BTC
 
 Since you’ve sent 0.1 BTC to a third party, your balance has declined by 0.1 BTC
 plus the tx fee of 0.0001 BTC.  To verify that your transaction’s received its
@@ -410,14 +415,14 @@ of MMGen’s more advanced features, continue reading.
 
 Using your default wallet from the exercises above, generate a mnemonic:
 
-		$ mmgen-walletconv -o words
-		...
-		Mnemonic data written to file '89ABCDEF.mmwords'
+	$ mmgen-walletconv -o words
+	...
+	Mnemonic data written to file '89ABCDEF.mmwords'
 
-		$ cat 89ABCDEF.mmwords
-		pleasure tumble spider laughter many stumble secret bother after search
-		float absent path strong curtain savior worst suspend bright touch away
-		dirty measure thorn
+	$ cat 89ABCDEF.mmwords
+	pleasure tumble spider laughter many stumble secret bother after search
+	float absent path strong curtain savior worst suspend bright touch away
+	dirty measure thorn
 
 Since our seed is 256 bits long, the mnemonic contains 24 words.  128-bit and
 192-bit seeds generate shorter mnemonics of 12 and 18 words, respectively.
@@ -435,21 +440,21 @@ The mnemonic is a complete representation of your seed and may be used anywhere
 where you’d use an MMGen wallet.  You can generate addresses with it just as you
 do with a wallet:
 
-		$ mmgen-addrgen --type=segwit 89ABCDEF.mmwords 1-10
-		...
-		Address data written to file '89ABCDEF-S[1-10].addrs'
+	$ mmgen-addrgen --type=segwit 89ABCDEF.mmwords 1-10
+	...
+	Address data written to file '89ABCDEF-S[1-10].addrs'
 
 You can use it to sign transactions:
 
-		$ mmgen-txsign FEDCBA[0.1].rawtx 89ABCDEF.mmwords
-		...
-		Signed transaction written to file 'FEDCBA[0.1].sigtx'
+	$ mmgen-txsign FEDCBA[0.1].rawtx 89ABCDEF.mmwords
+	...
+	Signed transaction written to file 'FEDCBA[0.1].sigtx'
 
 The mnemonic can also be used to regenerate a lost wallet:
 
-		$ mmgen-walletconv 89ABCDEF.mmwords
-		...
-		MMGen wallet written to file '89ABCDEF-01234567[256,3].mmdat'
+	$ mmgen-walletconv 89ABCDEF.mmwords
+	...
+	MMGen wallet written to file '89ABCDEF-01234567[256,3].mmdat'
 
 Note that the regenerated wallet has a different Key ID but of course the same
 Seed ID.
@@ -458,50 +463,50 @@ An alternative to mnemonics, seed files provide yet another way of representing
 your seed.  They bear the extension '.mmseed' and are generated exactly the same
 way as mnemonic files:
 
-		$ mmgen-walletconv -o seed
-		...
-		Seed data written to file '89ABCDEF.mmseed'
+	$ mmgen-walletconv -o seed
+	...
+	Seed data written to file '89ABCDEF.mmseed'
 
 They can be used just like mnemonics to regenerate a wallet:
 
-		$ mmgen-walletconv 89ABCDEF.mmseed
-		...
-		MMGen wallet written to file '89ABCDEF-23456701[256,3].mmdat'
+	$ mmgen-walletconv 89ABCDEF.mmseed
+	...
+	MMGen wallet written to file '89ABCDEF-23456701[256,3].mmdat'
 
 Here’s a sample seed file for a 256-bit seed:
 
-		$ cat 8B7392ED.mmseed
-		f4c84b C5ZT wWpT Jsoi wRVw 2dm9 Aftd WLb8 FggQ eC8h Szjd da9L
+	$ cat 8B7392ED.mmseed
+	f4c84b C5ZT wWpT Jsoi wRVw 2dm9 Aftd WLb8 FggQ eC8h Szjd da9L
 
 And for a 128-bit seed:
 
-		$ cat 8E0DFB78.mmseed
-		0fe02f XnyC NfPH piuW dQ2d nM47 VU
+	$ cat 8E0DFB78.mmseed
+	0fe02f XnyC NfPH piuW dQ2d nM47 VU
 
 As you can see, seed files are short enough to be easily written out by hand or
 memorized.  And their built-in checksum makes it easy to test your memory using
 a simple Unix shell command:
 
-		$ echo -n XnyC NfPH piuW dQ2d nM47 VU | tr -d ' '| sha256sum | cut -c 1-6
-		0fe02f
+	$ echo -n XnyC NfPH piuW dQ2d nM47 VU | tr -d ' '| sha256sum | cut -c 1-6
+	0fe02f
 
 Or you can do the same thing with 'mmgen-tool':
 
-		$ mmgen-tool str2id6 'XnyC NfPH piuW dQ2d nM47 VU'
-		0fe02f
+	$ mmgen-tool str2id6 'XnyC NfPH piuW dQ2d nM47 VU'
+	0fe02f
 
 Beginning with version 0.9.0, MMGen also supports seed files in hexadecimal
 (hexseed) format.  Hexseed files are identical to seed files but encoded in
 hexadecimal rather than base 58.  They bear the extension '.mmhex':
 
-		$ cat FE3C6545.mmhex
-		afc3fe 456d 7f5f 1c4b fe3b c916 b875 60ae 6a3e
+	$ cat FE3C6545.mmhex
+	afc3fe 456d 7f5f 1c4b fe3b c916 b875 60ae 6a3e
 
 You can easily check that a hexseed is correct by generating its Seed ID with
 standard command-line tools:
 
-		$ echo 456d 7f5f 1c4b fe3b c916 b875 60ae 6a3e | tr -d ' ' | xxd -r -p | sha256sum -b | xxd -r -p | sha256sum -b | cut -c 1-8
-		fe3c6545
+	$ echo 456d 7f5f 1c4b fe3b c916 b875 60ae 6a3e | tr -d ' ' | xxd -r -p | sha256sum -b | xxd -r -p | sha256sum -b | cut -c 1-8
+	fe3c6545
 
 Mnemonics and hexseeds can be used to generate keys even without the MMGen
 software, using basic command-line utilities, as explained in [this
@@ -513,12 +518,12 @@ All MMGen commands that take mnemonic, seed or hexseed data may receive the data
 from a prompt instead of a file.  Just omit the file name and specify the input
 format:
 
-		$ mmgen-addrgen -i words 1-10
-		...
-		Choose a mnemonic length: 1) 12 words, 2) 18 words, 3) 24 words: 1
-		Mnemonic length of 12 words chosen. OK? (Y/n): y
-		Enter your 12-word mnemonic, hitting RETURN or SPACE after each word:
-		Enter word #1:
+	$ mmgen-addrgen -i words 1-10
+	...
+	Choose a mnemonic length: 1) 12 words, 2) 18 words, 3) 24 words: 1
+	Mnemonic length of 12 words chosen. OK? (Y/n): y
+	Enter your 12-word mnemonic, hitting RETURN or SPACE after each word:
+	Enter word #1:
 
 MMGen prompts you for each of the mnemonic's words individually, checking it for
 validity and reprompting if necessary.  What you type is not displayed on the
@@ -557,28 +562,28 @@ If you plan to store your incognito wallet in an insecure location such as cloud
 storage, you’re advised to use a strong scrypt (hash) preset and a strong
 password.  These can be changed using the 'mmgen-passchg' utility:
 
-		$ mmgen-passchg -p 5 89ABCDEF-01234567[256,3].mmdat
-		...
-		Hash preset of wallet: '3'
-		Enter old passphrase for MMGen wallet: <old weak passphrase>
-		...
-		Hash preset changed to '5'
-		Enter new passphrase for MMGen wallet: <new strong passphrase>
-		...
-		MMGen wallet written to file '89ABCDEF-87654321[256,5].mmdat'
+	$ mmgen-passchg -p 5 89ABCDEF-01234567[256,3].mmdat
+	...
+	Hash preset of wallet: '3'
+	Enter old passphrase for MMGen wallet: <old weak passphrase>
+	...
+	Hash preset changed to '5'
+	Enter new passphrase for MMGen wallet: <new strong passphrase>
+	...
+	MMGen wallet written to file '89ABCDEF-87654321[256,5].mmdat'
 
 The scrypt preset is the numeral in the wallet filename following the seed
 length.  As you can see, it’s now changed to '5'.  Now export your new toughened
 wallet to incognito format, using the `-k` option to leave the passphrase
 unchanged:
 
-		$ mmgen-walletconv -k -o incog 89ABCDEF-87654321[256,5].mmdat
-		...
-		Reusing passphrase at user request
-		...
-		New Incog Wallet ID: ECA86420
-		...
-		Incognito data written to file '89ABCDEF-87654321-ECA86420[256,5].mmincog'
+	$ mmgen-walletconv -k -o incog 89ABCDEF-87654321[256,5].mmdat
+	...
+	Reusing passphrase at user request
+	...
+	New Incog Wallet ID: ECA86420
+	...
+	Incognito data written to file '89ABCDEF-87654321-ECA86420[256,5].mmincog'
 
 Incog wallets have a special identifier, the Incog ID, which can be used to
 locate the wallet data if you’ve forgotten where you hid it (see the example
@@ -587,15 +592,15 @@ should be kept secret.
 
 Incog wallets can also be output to hexadecimal format:
 
-		$ mmgen-walletconv -k -o incox 89ABCDEF-87654321[256,5].mmdat
-		...
-		Hex incognito data written to file '89ABCDEF-87654321-CA86420E[256,5].mmincox'
+	$ mmgen-walletconv -k -o incox 89ABCDEF-87654321[256,5].mmdat
+	...
+	Hex incognito data written to file '89ABCDEF-87654321-CA86420E[256,5].mmincox'
 
-		$ cat 89ABCDEF-87654321-1EE402F4[256,5].mmincox
-		6772 edb2 10cf ad0d c7dd 484b cc7e 42e9
-		4fe6 e07a 1ce2 da02 6da7 94e4 c068 57a8
-		3706 c5ce 56e0 7590 e677 6c6e 750a d057
-		b43a 21f9 82c7 6bd1 fe96 bad9 2d54 c4c0
+	$ cat 89ABCDEF-87654321-1EE402F4[256,5].mmincox
+	6772 edb2 10cf ad0d c7dd 484b cc7e 42e9
+	4fe6 e07a 1ce2 da02 6da7 94e4 c068 57a8
+	3706 c5ce 56e0 7590 e677 6c6e 750a d057
+	b43a 21f9 82c7 6bd1 fe96 bad9 2d54 c4c0
 
 Note that the Incog ID is different here: it’s generated from an init vector,
 which is a different random number each time, making the incog data as a whole
@@ -608,14 +613,14 @@ the wrong hands.
 Your incognito wallet (whether hex or binary) can be used just like any other
 MMGen wallet, mnemonic or seed file to generate addresses and sign transactions:
 
-		$ mmgen-addrgen --type=segwit 89ABCDEF-87654321-CA86420E[256,5].mmincox 101-110
-		...
-		Generated 10 addresses
-		Addresses written to file '89ABCDEF-S[101-110].addrs'
+	$ mmgen-addrgen --type=segwit 89ABCDEF-87654321-CA86420E[256,5].mmincox 101-110
+	...
+	Generated 10 addresses
+	Addresses written to file '89ABCDEF-S[101-110].addrs'
 
-		$ mmgen-txsign FABCDE[0.3].rawtx 89ABCDEF-87654321-CA86420E[256,5].mmincox
-		...
-		Signed transaction written to file FABCDE[0.3].sigtx
+	$ mmgen-txsign FABCDE[0.3].rawtx 89ABCDEF-87654321-CA86420E[256,5].mmincox
+	...
+	Signed transaction written to file FABCDE[0.3].sigtx
 
 ##### <a name='a_hi'>Hidden incognito wallets</a>
 
@@ -624,14 +629,14 @@ a specified offset in a file or partition in a single convenient operation, with
 the random file being created automatically if necessary.  Here’s how you’d
 create a 1GB file 'random.dat' and hide a wallet in it at offset 123456789:
 
-		$ mmgen-walletconv -k -o hincog -J random.dat,123456789 89ABCDEF-87654321[256,5].mmdat
-		...
-		New Incog Wallet ID: ED1F2ACB
-		...
-		Requested file 'random.dat' does not exist.  Create? (Y/n): Y
-		Enter file size: 1G
-		...
-		Data written to file 'random.dat' at offset 123456789
+	$ mmgen-walletconv -k -o hincog -J random.dat,123456789 89ABCDEF-87654321[256,5].mmdat
+	...
+	New Incog Wallet ID: ED1F2ACB
+	...
+	Requested file 'random.dat' does not exist.  Create? (Y/n): Y
+	Enter file size: 1G
+	...
+	Data written to file 'random.dat' at offset 123456789
 
 Your ‘random’ file can now be uploaded to a cloud storage service, for example,
 or some other location on the Net, preferably non-public one (in a real-life
@@ -642,9 +647,9 @@ Now let’s say at some point in the future you download this file to recover
 your wallet and realize you’ve forgotten the offset where the data is hidden.
 If you’ve saved your Incog ID, you’re in luck:
 
-		$ mmgen-tool find_incog_data random.dat ED1F2ACB
-		...
-		Incog data for ID ED1F2ACB found at offset 123456789
+	$ mmgen-tool find_incog_data random.dat ED1F2ACB
+	...
+	Incog data for ID ED1F2ACB found at offset 123456789
 
 The search process can be slow, so patience is required.  In addition, on
 large files ‘false positives’ are a distinct possibility, in which case you’ll
@@ -654,13 +659,13 @@ real offset.
 Hidden incog wallets are nearly as convenient to use as ordinary ones.
 Generating ten addresses with your hidden incog data is as easy as this:
 
-		$ mmgen-addrgen -H random.dat,123456789 101-110
+	$ mmgen-addrgen -H random.dat,123456789 101-110
 
 Transaction signing uses the same syntax:
 
-		$ mmgen-txsign -H random.dat,123456789 ABCDEF[0.1].rawtx
-		...
-		Signed transaction written to file 'ABCDEF[0.1].sigtx'
+	$ mmgen-txsign -H random.dat,123456789 ABCDEF[0.1].rawtx
+	...
+	Signed transaction written to file 'ABCDEF[0.1].sigtx'
 
 ### <a name='a_at'>Advanced Topics</a>
 
@@ -692,9 +697,9 @@ well as addresses, thus functioning as a hot wallet for a range of addresses.
 Assuming your hot address range begins at 1001, you could start by creating a
 key-address file for a hundred hot addresses like this:
 
-		$ mmgen-keygen --type=segwit 1001-1100
-		...
-		Secret keys written to file '89ABCDEF-S[1001-1100].akeys.mmenc'
+	$ mmgen-keygen --type=segwit 1001-1100
+	...
+	Secret keys written to file '89ABCDEF-S[1001-1100].akeys.mmenc'
 
 `mmgen-keygen` prompts you for a password to encrypt the key-address file with.
 This is a wise precaution, as it provides at least some security for keys that
@@ -703,14 +708,14 @@ will be stored on an online machine.
 Now copy the key-address file to your online machine and import the addresses
 into your tracking wallet:
 
-		$ mmgen-addrimport --batch --keyaddr-file '89ABCDEF-S[1001-1100].akeys.mmenc'
+	$ mmgen-addrimport --batch --keyaddr-file '89ABCDEF-S[1001-1100].akeys.mmenc'
 
 After funding your hot wallet by spending into some addresses in this range you
 can do quickie transactions with these funds using the `mmgen-txdo` command:
 
-		$ mmgen-txdo -M '89ABCDEF-S[1001-1100].akeys.mmenc' 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:S:1010
-		...
-		Transaction sent: dcea1357....
+	$ mmgen-txdo -M '89ABCDEF-S[1001-1100].akeys.mmenc' 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:S:1010
+	...
+	Transaction sent: dcea1357....
 
 The `--mmgen-keys-from-file` or `-M` option is required when using a key-address
 file in place of a default wallet.  Note that your change address
@@ -721,7 +726,7 @@ Using `mmgen-txdo` with a default online hot wallet is even simpler.  For a hot
 wallet with Seed ID 0FDE89AB, for instance, creating and sending a transaction
 would look like this:
 
-		$ mmgen-txdo 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 0FDE89AB:S:10
+	$ mmgen-txdo 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 0FDE89AB:S:10
 
 
 #### <a name='a_fee'>Transaction Fees</a>
@@ -773,11 +778,11 @@ incrementally increasing fees will created online and then signed offline.
 Create, sign and send a BIP 125 replaceable transaction with a fee of 50
 satoshis per byte:
 
-		$ mmgen-txdo --rbf --tx-fee 50s 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 0FDE89AB:S:5
-		...
-		Signed transaction written to file 'FEDCBB[0.1,50].sigtx'
-		...
-		Transaction sent: dcba4321....
+	$ mmgen-txdo --rbf --tx-fee 50s 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 0FDE89AB:S:5
+	...
+	Signed transaction written to file 'FEDCBB[0.1,50].sigtx'
+	...
+	Transaction sent: dcba4321....
 
 Here you've sent 0.1 BTC to a third-party address and the change back to
 yourself at address #5 of your default hot wallet with Seed ID 0FDE89AB.
@@ -788,11 +793,11 @@ of the fee in the filename identifies the transaction as replaceable.
 If the transaction fails to confirm in your desired timeframe, then create, sign
 and send a replacement transaction with a higher fee, say 100 satoshis per byte:
 
-		$ mmgen-txbump --send --tx-fee 100s --output-to-reduce c 'FEDCBB[0.1,50].sigtx'
-		...
-		Signed transaction written to file 'DAE123[0.1,100].sigtx'
-		...
-		Transaction sent: eef01357....
+	$ mmgen-txbump --send --tx-fee 100s --output-to-reduce c 'FEDCBB[0.1,50].sigtx'
+	...
+	Signed transaction written to file 'DAE123[0.1,100].sigtx'
+	...
+	Transaction sent: eef01357....
 
 The `--send` switch instructs `mmgen-txbump` to sign and send the transaction
 after creating it.  The `--output-to-reduce` switch with an argument of 'c'
@@ -815,44 +820,48 @@ you'll need to supply it on the command line as a parameter to the `-M` option.
 To achieve the same result as in the above example using a cold wallet, just
 create the initial transaction with `mmgen-txcreate` instead of `mmgen-txdo`:
 
-		$ mmgen-txcreate --rbf --tx-fee 50s 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:S:5
-		...
-		Transaction written to file 'FEDCBC[0.1,50].rawtx'
+	$ mmgen-txcreate --rbf --tx-fee 50s 1AmkUxrfy5dMrfmeYwTxLxfIswUCcpeysc,0.1 89ABCDEF:S:5
+	...
+	Transaction written to file 'FEDCBC[0.1,50].rawtx'
 
 Now create a series of transactions with incrementally increasing fees for
 offline signing:
 
-		$ mmgen-txbump --tx-fee 100s --output-to-reduce c 'FEDCBC[0.1,50].rawtx'
-		$ mmgen-txbump --tx-fee 150s --output-to-reduce c 'FEDCBC[0.1,50].rawtx'
-		$ mmgen-txbump --tx-fee 200s --output-to-reduce c 'FEDCBC[0.1,50].rawtx'
+	$ mmgen-txbump --tx-fee 100s --output-to-reduce c 'FEDCBC[0.1,50].rawtx'
+	$ mmgen-txbump --tx-fee 150s --output-to-reduce c 'FEDCBC[0.1,50].rawtx'
+	$ mmgen-txbump --tx-fee 200s --output-to-reduce c 'FEDCBC[0.1,50].rawtx'
 
 To speed things up, add the `--yes` switch to make `mmgen-txbump` completely
 non-interactive.
 
 The result will be four raw transaction files with increasing fees, like this:
 
-		FEDCBC[0.1,50].rawtx
-		3EBB00[0.1,100].rawtx
-		124FFF[0.1,150].rawtx
-		73DABB[0.1,200].rawtx
+	FEDCBC[0.1,50].rawtx
+	3EBB00[0.1,100].rawtx
+	124FFF[0.1,150].rawtx
+	73DABB[0.1,200].rawtx
 
 Copy the files to an empty folder, transfer the folder to your offline machine and batch sign them:
 
-		$ mmgen-txsign -d my_folder --yes my_folder/*.rawtx
+	$ mmgen-txsign -d my_folder --yes my_folder/*.rawtx
 
 Then copy the signed transaction files back to your online machine and broadcast
 them in turn until you get a confirmation:
 
-		$ mmgen-txsend FEDCBC[0.1,50].sigtx   # ...if this doesn't confirm, then
-		$ mmgen-txsend 3EBB00[0.1,100].sigtx  # ...if this doesn't confirm, then
-		$ mmgen-txsend 124FFF[0.1,150].sigtx  # ...if this doesn't confirm, then
-		$ mmgen-txsend 73DABB[0.1,200].sigtx
+	$ mmgen-txsend FEDCBC[0.1,50].sigtx   # ...if this doesn't confirm, then
+	$ mmgen-txsend 3EBB00[0.1,100].sigtx  # ...if this doesn't confirm, then
+	$ mmgen-txsend 124FFF[0.1,150].sigtx  # ...if this doesn't confirm, then
+	$ mmgen-txsend 73DABB[0.1,200].sigtx
 
-### <a name='a_alt'>Forkcoin and Altcoin support (BCH,LTC)</a>
+### <a name='a_alt'>Forkcoin and Altcoin support</a>
 
-To use MMGen with Bitcoin Cash (BCH) or Litecoin (LTC), first make sure the
-Bitcoin ABC or Litecoin daemon is properly installed
-([source][si])([binaries][bi]), [running][p8] and synced.
+#### <a name='a_bch'>Full support for Bcash (BCH) and Litecoin</a>
+
+Bcash and Litecoin are fully supported by MMGen, on the same level as Bitcoin.
+
+To use MMGen with Bcash or Litecoin, first make sure the respective Bitcoin ABC
+and Litecoin daemons are properly installed ([source][si])([binaries][bi]),
+[running][p8] and synced.
 
 MMGen requires that the bitcoin-abc daemon be listening on non-standard
 [RPC port 8442][p8].
@@ -860,6 +869,84 @@ MMGen requires that the bitcoin-abc daemon be listening on non-standard
 Then just add the `--coin=bch` or `--coin=ltc` option to all your MMGen
 commands.  It's that simple!
 
+#### <a name='a_es'>Enhanced key/address generation support for Zcash (ZEC) and Monero (XMR)</a>
+
+MMGen's enhanced key/address generation support for Zcash and Monero includes
+**Zcash z-addresses** and automated Monero wallet creation.
+
+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 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
+
+Generate ten Monero address pairs from your default wallet:
+
+	$ mmgen-keygen --coin=xmr 1-10
+
+In addition to spend and view keys, Monero key/address files also include a
+wallet password for each address (the password is the double Sha256 of the spend
+key, truncated to 16 bytes).  This allows you to easily generate wallets for
+each address by running the following command
+
+	$ monero-wallet-cli --generate-from-spend-key MyMoneroWallet
+
+and pasting in the key and password data when prompted.  Monerod must be
+running and `monero-wallet-cli` be located in your executable path.
+
+This process is completely automated by the `mmgen-tool` utility:
+
+	$ mmgen-tool keyaddrlist2monerowallet *XMR*.akeys.mmenc
+
+This will generate Monero wallets for each key/address pair in the key/address
+file and encrypt them with their respective passwords.  No user interaction is
+required.  By default, wallets are synced to the current block height, as
+they're assumed to be empty.  This behavior can be overridden:
+
+	$ mmgen-tool keyaddrlist2monerowallet *XMR*.akeys.mmenc blockheight=123456
+
+#### <a name='a_kg'>Key/address generation support for ETH, ETC and 144 Bitcoin-derived altcoins</a>
+
+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
+
+If it's just the addresses you want, then use `mmgen-addrgen` instead:
+
+	$ mmgen-addrgen --coin=dash 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 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.
+
 [01]: https://github.com/mmgen/mmgen/wiki/Tracking-and-spending-ordinary-Bitcoin-addresses
 [02]: https://tpfaucet.appspot.com
 [03]: Recovering-Your-Keys-Without-the-MMGen-Software

+ 1 - 1
extmod/secp256k1mod.c

@@ -1,6 +1,6 @@
 /*
   mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-  Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+  Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 
   This program is free software: you can redistribute it and/or modify it under
   the terms of the GNU General Public License as published by the Free Software

+ 3 - 1
mmgen/addr.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -92,6 +92,8 @@ class AddrGeneratorZcashZ(AddrGenerator):
 	def to_addr(self,pubhex): # pubhex is really privhex
 		key = pubhex.decode('hex')
 		assert len(key) == 32,'{}: incorrect privkey length'.format(len(key))
+		if g.platform == 'win':
+			ydie(1,'Zcash z-addresses not supported on Windows platform')
 		from nacl.bindings import crypto_scalarmult_base
 		p2 = crypto_scalarmult_base(self.zhash256(key,1))
 		from mmgen.protocol import _b58chk_encode

+ 1 - 1
mmgen/altcoin.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/color.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/common.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/crypto.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/filename.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 7 - 8
mmgen/globalvars.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -38,16 +38,16 @@ class g(object):
 
 	# Constants:
 
-	version      = '0.9.599'
-	release_date = 'December 2017'
+	version      = '0.9.6'
+	release_date = 'January 2018'
 
 	proj_name = 'MMGen'
 	proj_url  = 'https://github.com/mmgen/mmgen'
 	prog_name = os.path.basename(sys.argv[0])
 	author    = 'The MMGen Project'
 	email     = '<mmgen@tuta.io>'
-	Cdates    = '2013-2017'
-	keywords  = 'Bitcoin, BTC, cryptocurrency, wallet, cold storage, offline, online, spending, open-source, command-line, Python, Linux, Bitcoin Core, bitcoind, hd, deterministic, hierarchical, secure, anonymous, Electrum, seed, mnemonic, brainwallet, Scrypt, utility, script, scriptable, blockchain, raw, transaction, permissionless, console, terminal, curses, ansi, color, tmux, remote, client, daemon, RPC, json, entropy, xterm, rxvt, PowerShell, MSYS, MinGW, mswin, Armbian, Raspbian, Raspberry Pi, Orange Pi, BCash, BCH, Litecoin, LTC, altcoin, ZEC, Zcash, DASH, ETH, Ethereum, Classic, SHA256Compress'
+	Cdates    = '2013-2018'
+	keywords  = 'Bitcoin, BTC, cryptocurrency, wallet, cold storage, offline, online, spending, open-source, command-line, Python, Linux, Bitcoin Core, bitcoind, hd, deterministic, hierarchical, secure, anonymous, Electrum, seed, mnemonic, brainwallet, Scrypt, utility, script, scriptable, blockchain, raw, transaction, permissionless, console, terminal, curses, ansi, color, tmux, remote, client, daemon, RPC, json, entropy, xterm, rxvt, PowerShell, MSYS, MinGW, mswin, Armbian, Raspbian, Raspberry Pi, Orange Pi, BCash, BCH, Litecoin, LTC, altcoin, ZEC, Zcash, DASH, Dashpay, ETH, Ethereum, Classic, SHA256Compress, XMR, Monero, EMC, Emercoin'
 	max_int   = 0xffffffff
 	stdin_tty = bool(sys.stdin.isatty() or os.getenv('MMGEN_TEST_SUITE'))
 	http_timeout = 60
@@ -169,9 +169,8 @@ class g(object):
 	key_generator  = 2 # secp256k1 is default
 
 	hash_presets = {
-#   Scrypt params:
-#   ID    N   p  r
-# N is a power of two
+	#   Scrypt params:
+	#   ID    N   p  r (N is an exponent of two)
 		'1': [12, 8, 1],
 		'2': [13, 8, 4],
 		'3': [14, 8, 8],

+ 1 - 1
mmgen/license.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_addrgen.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_addrimport.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_passgen.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_regtest.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_split.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_tool.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_txbump.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_txcreate.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_txdo.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_txsend.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_txsign.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/main_wallet.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/mn_electrum.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/mn_tirosh.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 3 - 3
mmgen/obj.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -364,7 +364,7 @@ class CoinAddr(str,Hilite,InitErrors,MMGenObject):
 		cls.arg_chk(cls,on_fail)
 		from mmgen.globalvars import g
 		try:
-			assert set(s) <= set(ascii_letters+digits),'contains non-ascii characters'
+			assert set(s) <= set(ascii_letters+digits),'contains non-alphanumeric characters'
 			me = str.__new__(cls,s)
 			va = g.proto.verify_addr(s,hex_width=cls.hex_width,return_dict=True)
 			assert va,'failed verification'
@@ -479,7 +479,7 @@ class TwMMGenID(str,Hilite,InitErrors,MMGenObject):
 				from mmgen.globalvars import g
 				assert s.split(':',1)[0] == g.proto.base_coin.lower(),(
 					"not a string beginning with the prefix '{}:'".format(g.proto.base_coin.lower()))
-				assert set(s[4:]) <= set(ascii_letters+digits),'contains non-ascii characters'
+				assert set(s[4:]) <= set(ascii_letters+digits),'contains non-alphanumeric characters'
 				assert len(s) > 4,'not more that four characters long'
 				ret,sort_key,idtype = str(s),'z_'+s,'non-mmgen'
 			except Exception as f:

+ 1 - 1
mmgen/opts.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 2 - 2
mmgen/protocol.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # MMGen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -382,7 +382,7 @@ class CoinProtocol(MMGenObject):
 		'eth': (EthereumProtocol,EthereumTestnetProtocol,2),
 		'etc': (EthereumClassicProtocol,EthereumClassicTestnetProtocol,2),
 		'zec': (ZcashProtocol,ZcashTestnetProtocol,2),
-		'xmr': (MoneroProtocol,MoneroTestnetProtocol,2)
+		'xmr': (MoneroProtocol,MoneroTestnetProtocol,None)
 	}
 	def __new__(cls,coin,testnet):
 		coin = coin.lower()

+ 15 - 13
mmgen/regtest.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -34,21 +34,23 @@ rpc_password = 'hodltothemoon'
 tr_wallet = lambda user: os.path.join(daemon_dir,'wallet.dat.'+user)
 
 common_args = lambda: (
-	'-rpcuser={}'.format(rpc_user),
-	'-rpcpassword={}'.format(rpc_password),
-	'-rpcport={}'.format(rpc_port),
-	'-regtest',
-	'-datadir={}'.format(data_dir))
+	'--rpcuser={}'.format(rpc_user),
+	'--rpcpassword={}'.format(rpc_password),
+	'--rpcport={}'.format(rpc_port),
+	'--regtest',
+	'--datadir={}'.format(data_dir))
 
 def start_daemon(user,quiet=False,daemon=True,reindex=False):
+	# requires Bitcoin ABC version >= 0.16.2
+	add_args = ((),('--usecashaddr=0',))[g.proto.daemon_name=='bitcoind-abc']
 	cmd = (
 		g.proto.daemon_name,
-		'-listen=0',
-		'-keypool=1',
-		'-wallet={}'.format(os.path.basename(tr_wallet(user)))
-	) + common_args()
-	if daemon: cmd += ('-daemon',)
-	if reindex: cmd += ('-reindex',)
+		'--listen=0',
+		'--keypool=1',
+		'--wallet={}'.format(os.path.basename(tr_wallet(user)))
+	) + add_args + common_args()
+	if daemon: cmd += ('--daemon',)
+	if reindex: cmd += ('--reindex',)
 	if not g.debug or quiet: vmsg('{}'.format(' '.join(cmd)))
 	p = subprocess.Popen(cmd,stdout=PIPE,stderr=PIPE)
 	err = process_output(p,silent=False)[1]
@@ -239,7 +241,7 @@ def get_current_user_win(quiet=False):
 	return None
 
 def get_current_user_unix(quiet=False):
-	p = start_cmd('pgrep','-af','{}.*-rpcport={}.*'.format(g.proto.daemon_name,rpc_port))
+	p = start_cmd('pgrep','-af','{}.*--rpcport={}.*'.format(g.proto.daemon_name,rpc_port))
 	cmdline = p.stdout.read()
 	if not cmdline: return None
 	for k in ('miner','bob','alice'):

+ 1 - 1
mmgen/rpc.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/seed.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/sha256.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/term.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/test.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/tool.py

@@ -2,7 +2,7 @@
 # -*- coding: UTF-8 -*-
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/tw.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/tx.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/txsign.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
mmgen/util.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 26 - 7
scripts/test-release.sh

@@ -107,7 +107,8 @@ s_alts='The following tests will test generation operations for all supported al
 ROUNDS=100
 ROUNDS_LOW=20
 ROUNDS_SPEC=500
-t_alts=(
+if [ "$MINGW" ]; then
+	t_alts=(
 	'test/scrambletest.py'
 	'test/test.py -n altcoin_ref'
 	"test/gentest.py --coin=btc 2 $ROUNDS"
@@ -118,8 +119,21 @@ t_alts=(
 	"test/gentest.py --coin=ltc --type=segwit 2 $ROUNDS"
 	"test/gentest.py --coin=zec 2 $ROUNDS"
 	"test/gentest.py --coin=etc 2 $ROUNDS"
-	"test/gentest.py --coin=eth 2 $ROUNDS"
+	"test/gentest.py --coin=eth 2 $ROUNDS")
+else
+	t_alts=(
+	'test/scrambletest.py'
+	'test/test.py -n altcoin_ref'
+	"test/gentest.py --coin=btc 2 $ROUNDS"
+	"test/gentest.py --coin=btc --type=compressed 2 $ROUNDS"
+	"test/gentest.py --coin=btc --type=segwit 2 $ROUNDS"
+	"test/gentest.py --coin=ltc 2 $ROUNDS"
+	"test/gentest.py --coin=ltc --type=compressed 2 $ROUNDS"
+	"test/gentest.py --coin=ltc --type=segwit 2 $ROUNDS"
+	"test/gentest.py --coin=zec 2 $ROUNDS"
 	"test/gentest.py --coin=zec --type=zcash_z 2 $ROUNDS_SPEC"
+	"test/gentest.py --coin=etc 2 $ROUNDS"
+	"test/gentest.py --coin=eth 2 $ROUNDS"
 
 	"test/gentest.py --coin=btc 2:ext $ROUNDS"
 	"test/gentest.py --coin=btc --type=compressed 2:ext $ROUNDS"
@@ -136,7 +150,7 @@ t_alts=(
 	"test/gentest.py --all 2:pyethereum $ROUNDS_LOW"
 	"test/gentest.py --all 2:keyconv $ROUNDS_LOW"
 	"test/gentest.py --all 2:zcash_mini $ROUNDS_LOW")
-
+fi
 f_alts='Gen-only altcoin tests completed'
 
 i_monero='Monero'
@@ -144,8 +158,9 @@ s_monero='Testing generation and wallet creation operations for Monero'
 s_monero='The monerod (mainnet) daemon must be running for the following tests'
 ROUNDS=1000
 t_monero=(
-'cmds/mmgen-keygen --accept-defaults --outdir $TMPDIR --coin=xmr test/ref/98831F3A.mmwords 3,99,2,22-29,101-109'
-'cmds/mmgen-tool -q --accept-defaults --outdir $TMPDIR keyaddrlist2monerowallet $TMPDIR/988*XMR*akeys')
+'python cmds/mmgen-keygen --accept-defaults --outdir $TMPDIR --coin=xmr test/ref/98831F3A.mmwords 3,99,2,22-29,101-109'
+'python cmds/mmgen-tool -q --accept-defaults --outdir $TMPDIR keyaddrlist2monerowallet $TMPDIR/988*XMR*akeys')
+[ "$MINGW" ] && t_monero=("$t_monero")
 f_monero='Monero tests completed'
 
 i_misc_ni='Miscellaneous operations (non-interactive)'
@@ -243,8 +258,12 @@ t_tool=(
 	'test/tooltest.py --coin=dash cryptocoin'
 	'test/tooltest.py --coin=doge cryptocoin'
 	'test/tooltest.py --coin=emc cryptocoin'
-	'test/tooltest.py --coin=zec cryptocoin'
-	'test/tooltest.py --coin=zec --type=zcash_z cryptocoin')
+	'test/tooltest.py --coin=zec cryptocoin')
+
+[ "$MINGW" ] || {
+	t_tool_len=${#t_tool[*]}
+	t_tool[$t_tool_len]='test/tooltest.py --coin=zec --type=zcash_z cryptocoin'
+}
 f_tool='tooltest tests completed'
 
 i_gen='Gentest'

+ 1 - 1
scripts/tx-btc2bch.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
setup.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
test/gentest.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
test/mmgen_pexpect.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: UTF-8 -*-
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 1 - 1
test/objtest.py

@@ -2,7 +2,7 @@
 # -*- coding: UTF-8 -*-
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

+ 5 - 2
test/scrambletest.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -74,12 +74,15 @@ test_data = OrderedDict([
 
 def run_tests():
 	for test in test_data:
+		if test == 'zec_zcash_z' and g.platform == 'win':
+			msg("Skipping 'zec_zcash_z' test for Windows platform")
+			continue
 		try:    coin,mmtype = test.split('_',1)
 		except: coin,mmtype = test,None
 		cmd_name = 'cmds/mmgen-addrgen'
 		wf = 'test/ref/98831F3A.mmwords'
 		type_arg = ['--type='+mmtype] if mmtype else []
-		cmd = [cmd_name,'-qS','--coin='+coin] + type_arg + [wf,'1']
+		cmd = ['python',cmd_name,'-qS','--coin='+coin] + type_arg + [wf,'1']
 		vmsg(green('Executing: {}'.format(' '.join(cmd))))
 		msg_r('Testing: --coin {:4} {:22}'.format(coin.upper(),type_arg[0] if type_arg else ''))
 		p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

+ 13 - 3
test/test.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: UTF-8 -*-
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -1251,6 +1251,15 @@ def clean(usr_dirs=[]):
 			die(1,'%s: invalid directory number' % d)
 	cleandir(os.path.join('test','data_dir'))
 
+def skip_for_win():
+	if g.platform == 'win':
+		import traceback
+		f = traceback.extract_stack()[-2][-2]
+		msg("Skipping test '{}': not supported on Windows platform".format(f))
+		return True
+	else:
+		return False
+
 class MMGenTestSuite(object):
 
 	def __init__(self):
@@ -1897,8 +1906,7 @@ class MMGenTestSuite(object):
 
 	# Miscellaneous tests
 	def autosign(self,name): # tests everything except device detection, mount/unmount
-		if g.platform == 'win':
-			msg('Skipping {} (not supported)'.format(name)); return
+		if skip_for_win(): return
 		fdata = (('btc',''),('bch',''),('ltc','litecoin'))
 		tfns = [cfgs['8']['ref_tx_file'][c].format('') for c,d in fdata]
 		tfs = [os.path.join(ref_dir,d[1],fn) for d,fn in zip(fdata,tfns)]
@@ -2070,6 +2078,7 @@ class MMGenTestSuite(object):
 		self.ref_addrfile_chk(name,ftype='addr',coin='ZEC',subdir='zcash',pfx='-ZEC-C')
 
 	def ref_addrfile_chk_zec_z(self,name):
+		if skip_for_win(): return
 		self.ref_addrfile_chk(name,ftype='addr',coin='ZEC',subdir='zcash',pfx='-ZEC-Z',
 								mmtype='z',add_args=['mmtype=zcash_z'])
 
@@ -2089,6 +2098,7 @@ class MMGenTestSuite(object):
 		self.ref_addrfile_chk(name,ftype='keyaddr',coin='ZEC',subdir='zcash',pfx='-ZEC-C')
 
 	def ref_keyaddrfile_chk_zec_z(self,name):
+		if skip_for_win(): return
 		self.ref_addrfile_chk(name,ftype='keyaddr',coin='ZEC',subdir='zcash',pfx='-ZEC-Z',
 								mmtype='z',add_args=['mmtype=zcash_z'])
 

+ 1 - 1
test/tooltest.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #
 # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2017 Philemon <mmgen-py@yandex.com>
+# Copyright (C)2013-2018 The MMGen Project <mmgen@tuta.io>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by