mmgen-wallet/test/tooltest2.py
The MMGen Project f9a483f34f
asyncio/aiohttp support
Asynchronous HTTP significantly speeds up operations involving multiple
JSON-RPC calls to the server, such as tracking wallet views for wallets
with a large number of outputs.

This patch adds base-level asyncio infrastructure plus aiohttp support to all
applicable MMGen commands.

The aiohttp package is not currently supported by MSYS2, so Windows users will
have to choose one of the other backends ('curl' is the default).

Tested on: Linux, Armbian, Windows; Python 3.6, 3.7, 3.8

New user features:

    - configurable RPC backends via the 'rpc_backend' option.  Supported
      options are 'aiohttp' (Linux-only), 'httplib', 'requests' and 'curl'

    - configurable RPC queue size via the 'aiohttp_rpc_queue_len' option

The patch also includes a rewrite/redesign of large parts of the MMGen code
base, most importantly:

    - rpc.py - full rewrite of RPC library, new RPCBackends class
    - main_addrimport.py - full rewrite
    - main_autosign.py - LED code now handled by new LEDControl class
    - eth/tw.py, eth/tx.py - reworked logic for resolving token symbols and
      addresses
    - eth/tx.py - separate classes for signed and unsigned transactions

Testing:

    # Set a backend (choose one):
    $ export MMGEN_RPC_BACKEND='aiohttp' # Linux-only
    $ export MMGEN_RPC_BACKEND='curl'    # Windows
    $ export MMGEN_RPC_BACKEND='httplib' # compare performance with 'aiohttp'

    # Bitcoin:
    $ test/unit_tests.py rpc btc
    $ test/test.py main regtest autosign

    # Ethereum:
    $ test/unit_tests.py rpc eth
    $ test/tooltest2.py --coin=eth --testnet=1 txview
    $ test/test.py --coin=eth ethdev

    # Monero wallet:
    $ test/unit_tests.py rpc xmr_wallet
    $ test/test-release.sh -F xmr
2020-05-10 14:07:54 +00:00

1010 lines
41 KiB
Python
Executable file

#!/usr/bin/env python3
#
# mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
# Copyright (C)2013-2020 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 Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
test/tooltest2.py: Simple tests for the 'mmgen-tool' utility
"""
# TODO: move all non-interactive 'mmgen-tool' tests in 'test.py' here
# TODO: move all(?) tests in 'tooltest.py' here (or duplicate them?)
import sys,os,time
from subprocess import run,PIPE
from decimal import Decimal
from include.tests_header import repo_root
from mmgen.common import *
from test.include.common import *
from mmgen.obj import is_wif,is_coin_addr
from mmgen.wallet import is_bip39_mnemonic,is_mmgen_mnemonic
from mmgen.addr import is_xmrseed
from mmgen.baseconv import *
NL = ('\n','\r\n')[g.platform=='win']
def is_str(s): return type(s) == str
def md5_hash(s):
from hashlib import md5
return md5(s.encode()).hexdigest()
def md5_hash_strip(s):
import re
s = re.sub('\x1b\[[;0-9]+?m','',s) # strip ANSI color sequences
s = s.replace(NL,'\n') # fix DOS newlines
return md5_hash(s.strip())
opts_data = {
'text': {
'desc': "Simple test suite for the 'mmgen-tool' utility",
'usage':'[options] [command]...',
'options': """
-h, --help Print this help message
-A, --tool-api Test the tool_api subsystem
-C, --coverage Produce code coverage info using trace module
-d, --die-on-missing Abort if no test data found for given command
--, --longhelp Print help message for long options (common options)
-l, --list-tests List the test groups in this test suite
-L, --list-tested-cmds Output the 'mmgen-tool' commands that are tested by this test suite
-n, --names Print command names instead of descriptions
-q, --quiet Produce quieter output
-s, --system Test scripts and modules installed on system rather than
those in the repo root
-t, --type= Specify coin type
-f, --fork Run commands via tool executable instead of importing tool module
-t, --traceback Run tool inside traceback script
-v, --verbose Produce more verbose output
""",
'notes': """
If no command is given, the whole suite of tests is run.
"""
}
}
sample_text_hexdump = (
'000000: 5468 6520 5469 6d65 7320 3033 2f4a 616e{n}' +
'000010: 2f32 3030 3920 4368 616e 6365 6c6c 6f72{n}' +
'000020: 206f 6e20 6272 696e 6b20 6f66 2073 6563{n}' +
'000030: 6f6e 6420 6261 696c 6f75 7420 666f 7220{n}' +
'000040: 6261 6e6b 73').format(n=NL)
kafile_opts = ['-p1','-Ptest/ref/keyaddrfile_password']
kafile_code = (
"\nopt.hash_preset = '1'" +
"\nopt.set_by_user = ['hash_preset']" +
"\nopt.use_old_ed25519 = None" +
"\nopt.passwd_file = 'test/ref/keyaddrfile_password'" )
from test.unit_tests_d.ut_bip39 import unit_test as bip39
tests = {
'Mnemonic': {
'hex2mn': [
( ['deadbeefdeadbeefdeadbeefdeadbeef','fmt=mmgen'],
'table cast forgive master funny gaze sadness ripple million paint moral match' ),
( ['deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'],
('swirl maybe anymore mix scale stray fog use approach page crime rhyme ' +
'class former strange window snap soon') ),
( ['deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'],
('swell type milk figure cheese phone fill black test bloom heard comfort ' +
'image terrible radio lesson own reply battle goal goodbye need laugh stream') ),
( ['ffffffffffffffffffffffffffffffff'],
'yellow yeah show bowl season spider cling defeat poison law shelter reflect' ),
( ['ffffffffffffffffffffffffffffffffffffffffffffffff'],
('yeah youth quit fail perhaps drum out person young click skin ' +
'weird inside silently perfectly together anyone memory') ),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
('wrote affection object cell opinion here laughter stare honest north cost begin ' +
'murder something yourself effort acid dot doubt game broke tell guilt innocent') ),
( ['0000000000000000000000000000000000000000000000000000000000000001'],
('able able able able able able able able able able able able ' +
'able able able able able able able able able able able about') ),
( ['e8164dda6d42bd1e261a3406b2038dcbddadbeefdeadbeefdeadbeefdeadbe0f','fmt=xmrseed'],
('viewpoint donuts ardent template unveil agile meant unafraid urgent athlete rustled mime azure ' +
'jaded hawk baby jagged haystack baby jagged haystack ramped oncoming point template') ),
] + [([a,'fmt=bip39'],b) for a,b in bip39.vectors],
'mn2hex': [
( ['table cast forgive master funny gaze sadness ripple million paint moral match','fmt=mmgen'],
'deadbeefdeadbeefdeadbeefdeadbeef' ),
( ['swirl maybe anymore mix scale stray fog use approach page crime rhyme ' +
'class former strange window snap soon'],
'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'),
( ['swell type milk figure cheese phone fill black test bloom heard comfort ' +
'image terrible radio lesson own reply battle goal goodbye need laugh stream'],
'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef' ),
( ['yellow yeah show bowl season spider cling defeat poison law shelter reflect'],
'ffffffffffffffffffffffffffffffff' ),
( ['yeah youth quit fail perhaps drum out person young click skin ' +
'weird inside silently perfectly together anyone memory'],
'ffffffffffffffffffffffffffffffffffffffffffffffff' ) ,
( ['wrote affection object cell opinion here laughter stare honest north cost begin ' +
'murder something yourself effort acid dot doubt game broke tell guilt innocent'],
'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'),
( ['able able able able able able able able able able able able ' +
'able able able able able able able able able able able about'],
'0000000000000000000000000000000000000000000000000000000000000001'),
( ['viewpoint donuts ardent template unveil agile meant unafraid urgent athlete ' +
'rustled mime azure jaded hawk baby jagged haystack baby jagged haystack ' +
'ramped oncoming point template','fmt=xmrseed'],
'e8164dda6d42bd1e261a3406b2038dcbddadbeefdeadbeefdeadbeefdeadbe0f'),
] + [([b,'fmt=bip39'],a) for a,b in bip39.vectors],
'mn_rand128': [
( [], is_mmgen_mnemonic, ['-r0']),
( ['fmt=mmgen'], is_mmgen_mnemonic, ['-r0']),
( ['fmt=bip39'], is_bip39_mnemonic, ['-r0']),
],
'mn_rand192': [
( ['fmt=mmgen'], is_mmgen_mnemonic, ['-r0']),
( ['fmt=bip39'], is_bip39_mnemonic, ['-r0']),
],
'mn_rand256': [
( ['fmt=mmgen'], is_mmgen_mnemonic, ['-r0']),
( ['fmt=bip39'], is_bip39_mnemonic, ['-r0']),
( ['fmt=xmrseed'], is_xmrseed, ['-r0']),
],
'mn_stats': [
( [], is_str ),
( ['fmt=mmgen'], is_str ),
( ['fmt=bip39'], is_str ),
( ['fmt=xmrseed'], is_str ),
],
'mn_printlist': [
( [], is_str ),
( ['fmt=mmgen'], is_str ),
( ['fmt=bip39'], is_str ),
( ['fmt=xmrseed','enum=true'], is_str ),
],
},
'Util': {
'hextob32': [
( ['deadbeef'], 'DPK3PXP' ),
( ['deadbeefdeadbeef'], 'N5LN657PK3PXP' ),
( ['ffffffffffffffff'], 'P777777777777' ),
( ['0000000000000000'], 'A' ),
( ['0000000000000000','pad=10'], 'AAAAAAAAAA' ),
( ['ff','pad=10'], 'AAAAAAAAH7' ),
],
'b32tohex': [
( ['DPK3PXP'], 'deadbeef' ),
( ['N5LN657PK3PXP'], 'deadbeefdeadbeef' ),
( ['P777777777777'], 'ffffffffffffffff' ),
( ['A','pad=16'], '0000000000000000' ),
( ['AAAAAAAAAA','pad=16'], '0000000000000000' ),
( ['AAAAAAAAH7','pad=2'], 'ff' ),
],
'hextob6d': [
( ['deadbeef'], '25255 24636 426' ),
( ['deadbeefdeadbeef'], '43263 51255 35545 36422 42642' ),
( ['ffffffffffffffff'], '46316 33121 21321 15553 55534' ),
( ['0000000000000000'], '1' ),
( ['0000000000000000','pad=10'], '11111 11111' ),
( ['ff','pad=10'], '11111 12214' ),
( ['ff'*16],
'34164 46464 12666 61652 46515 46546 53354 43666 45555 21414' ),
( ['ff'*24],
'24611 14114 33323 36422 24655 66552 32465 25661 21541 62342 '
'61351 63525 45161 35543 13654' ),
( ['ff'*32],
'21325 21653 31261 31341 45131 42346 54146 36252 11413 12253 '
'24246 31114 16424 56513 41632 24121 46151 43214 22425 65134' ),
],
'b6dtohex': [
( ['25255 24636 426'], 'deadbeef' ),
( ['43263 51255 35545 36422 42642'], 'deadbeefdeadbeef' ),
( ['46316 33121 21321 15553 55534'], 'ffffffffffffffff' ),
( ['1','pad=16'], '0000000000000000' ),
( ['11111 11111','pad=16'], '0000000000000000' ),
( ['11111 12214','pad=2'], 'ff' ),
( ['22222 22222'], 'b88733' ),
( ['66666 66666'], '039aa3ff' ),
( ['6'*50], {
'len': 34,
'value':'0260154fc36cbf42778f23ffffffffffff' # 130 bits
} ),
( ['6'*75], {
'len': 50,
'value':'03a92ef1c3432e71a7679561bb6817d7ffffffffffffffffff' # 194 bits
} ),
( ['6'*100], {
'len': 66,
'value':'05a4653ca673768565b41f775d6947d55cf3813d0fffffffffffffffffffffffff' # 259 bits
} ),
],
'hextob58chk': [
( ['deadbeef'], 'eFGDJPketnz' ),
( ['deadbeefdeadbeef'], '5CizhNNRPYpBjrbYX' ),
( ['ffffffffffffffff'], '5qCHTcgbQwprzjWrb' ),
( ['0000000000000000'], '111111114FCKVB' ),
( ['00'], '1Wh4bh' ),
( ['000000000000000000000000000000000000000000'], '1111111111111111111114oLvT2' ),
],
'b58chktohex': [
( ['eFGDJPketnz'], 'deadbeef' ),
( ['5CizhNNRPYpBjrbYX'], 'deadbeefdeadbeef' ),
( ['5qCHTcgbQwprzjWrb'], 'ffffffffffffffff' ),
( ['111111114FCKVB'], '0000000000000000' ),
( ['3QJmnh'], '' ),
( ['1111111111111111111114oLvT2'], '000000000000000000000000000000000000000000' ),
],
'bytestob58': [
( [b'\xde\xad\xbe\xef'], '6h8cQN' ),
( [b'\xde\xad\xbe\xef\xde\xad\xbe\xef'], 'eFGDJURJykA' ),
( [b'\xff\xff\xff\xff\xff\xff\xff\xff'], 'jpXCZedGfVQ' ),
( [b'\x00\x00\x00\x00\x00\x00\x00\x00'], '1' ),
( [b'\x00\x00\x00\x00\x00\x00\x00\x00','pad=10'], '1111111111' ),
( [b'\xff','pad=10'], '111111115Q' ),
],
'b58tobytes': [
( ['6h8cQN'], b'\xde\xad\xbe\xef' ),
( ['eFGDJURJykA'], b'\xde\xad\xbe\xef\xde\xad\xbe\xef' ),
( ['jpXCZedGfVQ'], b'\xff\xff\xff\xff\xff\xff\xff\xff' ),
( ['1','pad=8'], b'\x00\x00\x00\x00\x00\x00\x00\x00' ),
( ['1111111111','pad=8'], b'\x00\x00\x00\x00\x00\x00\x00\x00' ),
( ['111111115Q','pad=1'], b'\xff' ),
],
'hextob58': [
( ['deadbeef'], '6h8cQN' ),
( ['deadbeefdeadbeef'], 'eFGDJURJykA' ),
( ['ffffffffffffffff'], 'jpXCZedGfVQ' ),
( ['0000000000000000'], '1' ),
( ['0000000000000000','pad=10'], '1111111111' ),
( ['ff','pad=10'], '111111115Q' ),
],
'b58tohex': [
( ['6h8cQN'], 'deadbeef' ),
( ['eFGDJURJykA'], 'deadbeefdeadbeef' ),
( ['jpXCZedGfVQ'], 'ffffffffffffffff' ),
( ['1','pad=16'], '0000000000000000' ),
( ['1111111111','pad=16'], '0000000000000000' ),
( ['111111115Q','pad=2'], 'ff' ),
],
'bytespec': [
( ['1G'], str(1024*1024*1024) ),
( ['1234G'], str(1234*1024*1024*1024) ),
( ['1GB'], str(1000*1000*1000) ),
( ['1234GB'], str(1234*1000*1000*1000) ),
( ['1.234MB'], str(1234*1000) ),
( ['1.234567M'], str(int(Decimal('1.234567')*1024*1024)) ),
( ['1234'], str(1234) ),
],
'hash160': [ # TODO: check that hextob58chk(hash160) = pubhex2addr
( ['deadbeef'], 'f04df4c4b30d2b7ac6e1ed2445aeb12a9cb4d2ec' ),
( ['000000000000000000000000000000000000000000'], '2db95e704e2d9b0474acf76182f3f985b7064a8a' ),
( [''], 'b472a266d0bd89c13706a4132ccfb16f7c3b9fcb' ),
( ['ffffffffffffffff'], 'f86221f5a1fca059a865c0b7d374dfa9d5f3aeb4' ),
],
'hash256': [
( ['deadbeef'], 'e107944e77a688feae4c2d4db5951923812dd0f72026a11168104ee1b248f8a9' ),
( ['000000000000000000000000000000000000000000'], 'fd5181fcd097a334ab340569e5edcd09f702fef7994abab01f4b66e86b32ebbe' ),
( [''], '5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456' ),
( ['ffffffffffffffff'], '57b2d2c3455e0f76c61c5237ff04fc9fc0f3fe691e587ea9c951949e1a5e0fed' ),
],
'hexdump': [
( [sample_text.encode()], sample_text_hexdump ),
],
'unhexdump': [
( [sample_text_hexdump.encode()], sample_text.encode() ),
],
'hexlify': [
( [b'foobar'], '666f6f626172' ),
],
'unhexlify': [
( ['666f6f626172'], 'foobar' ),
],
'hexreverse': [
( ['deadbeefcafe'], 'fecaefbeadde' ),
],
'id6': [
( [sample_text.encode()], 'a6d72b' ),
],
'id8': [
( [sample_text.encode()], '687C09C2' ),
],
'str2id6': [
( ['74ev zjeq Zw2g DspF RKpE 7H'], '70413d' ), # checked
],
'randhex': [
( [], {'boolfunc':is_hex_str,'len':64}, ['-r0'] ),
( ['nbytes=16'], {'boolfunc':is_hex_str,'len':32}, ['-r0'] ),
( ['nbytes=6'], {'boolfunc':is_hex_str,'len':12}, ['-r0'] ),
],
'randb58': [
( [], {'boolfunc':is_b58_str}, ['-r0'] ),
( ['nbytes=16'], {'boolfunc':is_b58_str}, ['-r0'] ),
( ['nbytes=12','pad=0'], is_b58_str, ['-r0'] ),
],
},
'Wallet': {
'gen_key': [
( ['98831F3A:11','wallet=test/ref/98831F3A.mmwords'],
'5JKLcdYbhP6QQ4BXc9HtjfqJ79FFRXP2SZTKUyEuyXJo9QSFUkv'
),
( ['98831F3A:C:11','wallet=test/ref/98831F3A.mmwords'],
'L2LwXv94XTU2HjCbJPXCFuaHjrjucGipWPWUi1hkM5EykgektyqR'
),
( ['98831F3A:B:11','wallet=test/ref/98831F3A.mmwords'],
'L2K4Y9MWb5oUfKKZtwdgCm6FLZdUiWJDHjh9BYxpEvtfcXt4iM5g'
),
( ['98831F3A:S:11','wallet=test/ref/98831F3A.mmwords'],
'KwmkkfC9GghnJhnKoRXRn5KwGCgXrCmDw6Uv83NzE4kJS5axCR9A'
),
],
'gen_addr': [
( ['98831F3A:11','wallet=test/ref/98831F3A.mmwords'],
'12bYUGXS8SRArZneQDN9YEEYAtEa59Rykm'
),
( ['98831F3A:L:11','wallet=test/ref/98831F3A.mmwords'],
'12bYUGXS8SRArZneQDN9YEEYAtEa59Rykm'
),
( ['98831F3A:C:11','wallet=test/ref/98831F3A.mmwords'],
'1MPsZ7BY9qikqfPxqmrovE8gLDX2rYArZk'
),
( ['98831F3A:B:11','wallet=test/ref/98831F3A.mmwords'],
'bc1qxptlvmwaymaxa7pxkr2u5pn7c0508stcncv7ms'
),
( ['98831F3A:S:11','wallet=test/ref/98831F3A.mmwords'],
'3Eevao3DRVXnYym3tdrJDqS3Wc39PQzahn'
),
],
'get_subseed': [
( ['3s','wallet=test/ref/98831F3A.mmwords'], '4018EB17' ),
( ['200','wallet=test/ref/98831F3A.mmwords'], '2B05AE73' ),
],
'get_subseed_by_seed_id': [
( ['4018EB17','wallet=test/ref/98831F3A.mmwords'], '3S' ),
( ['2B05AE73','wallet=test/ref/98831F3A.mmwords'], None ),
( ['2B05AE73','wallet=test/ref/98831F3A.mmwords','last_idx=200'], '200L' ),
],
'list_subseeds': [
( ['1-5','wallet=test/ref/98831F3A.mmwords'],
(md5_hash_strip,'996c047e8543d5dde6f82efc3214a6a1')
),
],
'list_shares': [
( ['3','wallet=test/ref/98831F3A.bip39'],
(md5_hash_strip,'84e8bdaebf9c816a8a3bd2ebec5a2e12')
),
( ['3','id_str=default','wallet=test/ref/98831F3A.mmwords'],
(md5_hash_strip,'84e8bdaebf9c816a8a3bd2ebec5a2e12')
),
( ['3','id_str=foo','wallet=test/ref/98831F3A.bip39'],
(md5_hash_strip,'d2ac20823c4ea26f15234b5ca8df5d6f')
),
( ['3','id_str=foo','master_share=0','wallet=test/ref/98831F3A.mmwords'],
(md5_hash_strip,'d2ac20823c4ea26f15234b5ca8df5d6f')
),
( ['3','id_str=foo','master_share=5','wallet=test/ref/98831F3A.mmwords'],
(md5_hash_strip,'c4feedce40bb5959011ee4a996710832')
),
( ['3','id_str=βαρ','master_share=5','wallet=test/ref/98831F3A.mmwords'],
(md5_hash_strip,'f7d254798fe2e34b94b5f4ff312998db')
),
( ['4','id_str=βαρ','master_share=5','wallet=test/ref/98831F3A.bip39'],
(md5_hash_strip,'d3e479f55792181372a9f32a569c04e5')
),
],
},
'Coin': {
'addr2pubhash': {
'btc_mainnet': [
( ['12bYUGXS8SRArZneQDN9YEEYAtEa59Rykm'], '118089d66b4a5853765e94923abdd5de4616c6e5' ),
( ['3Eevao3DRVXnYym3tdrJDqS3Wc39PQzahn'], '8e34586186551f6320fa3eb2d238a9c61ab8264b' ),
( ['bc1qxptlvmwaymaxa7pxkr2u5pn7c0508stcncv7ms'], '3057f66ddd26fa6ef826b0d5ca067ec3e8f3c178' ),
],
},
'pubhash2addr': {
'btc_mainnet': [
( ['118089d66b4a5853765e94923abdd5de4616c6e5'], '12bYUGXS8SRArZneQDN9YEEYAtEa59Rykm',
None, 'opt.type="legacy"' ),
( ['8e34586186551f6320fa3eb2d238a9c61ab8264b'], '3Eevao3DRVXnYym3tdrJDqS3Wc39PQzahn',
['--type=segwit'], 'opt.type="segwit"' ),
( ['3057f66ddd26fa6ef826b0d5ca067ec3e8f3c178'], 'bc1qxptlvmwaymaxa7pxkr2u5pn7c0508stcncv7ms',
['--type=bech32'], 'opt.type="bech32"' ),
],
},
'addr2scriptpubkey': {
'btc_mainnet': [
( ['12bYUGXS8SRArZneQDN9YEEYAtEa59Rykm'], '76a914118089d66b4a5853765e94923abdd5de4616c6e588ac' ),
( ['3Eevao3DRVXnYym3tdrJDqS3Wc39PQzahn'], 'a9148e34586186551f6320fa3eb2d238a9c61ab8264b87' ),
( ['bc1qxptlvmwaymaxa7pxkr2u5pn7c0508stcncv7ms'], '00143057f66ddd26fa6ef826b0d5ca067ec3e8f3c178' ),
],
},
'scriptpubkey2addr': {
'btc_mainnet': [
( ['76a914118089d66b4a5853765e94923abdd5de4616c6e588ac'], '12bYUGXS8SRArZneQDN9YEEYAtEa59Rykm' ),
( ['a9148e34586186551f6320fa3eb2d238a9c61ab8264b87'], '3Eevao3DRVXnYym3tdrJDqS3Wc39PQzahn' ),
( ['00143057f66ddd26fa6ef826b0d5ca067ec3e8f3c178'], 'bc1qxptlvmwaymaxa7pxkr2u5pn7c0508stcncv7ms' ),
],
},
'hex2wif': {
'btc_mainnet': [
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'5HwzecKMWD82ppJK3qMKpC7ohXXAwcyAN5VgdJ9PLFaAzpBG4sX',
None, 'opt.type="legacy"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm',
['--type=compressed'], 'opt.type="compressed"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm',
['--type=segwit'], 'opt.type="segwit"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm',
['--type=bech32'], 'opt.type="bech32"' ),
],
},
'privhex2addr': {
'btc_mainnet': [
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'1C5VPtgq9xQ6AcTgMAR3J6GDrs72HC4pS1',
None, 'opt.type="legacy"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'1Kz9fVSUMshzPejpzW9D95kScgA3rY6QxF',
['--type=compressed'], 'opt.type="compressed"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'3AhjTiWHhVJAi1s5CfKMcLzYps12x3gZhg',
['--type=segwit'], 'opt.type="segwit"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'bc1q6pqnfwwakuuejpm9w52ds342f9d5u36v0qnz7c',
['--type=bech32'], 'opt.type="bech32"' ),
],
'eth_mainnet': [
( ['0000000000000000000000000000000000000000000000000000000000000001'],
'7e5f4552091a69125d5dfcb7b8c2659029395bdf'),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'b92702b3eefb3c2049aeb845b0335b283e11e9c6'),
( ['0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'ad30adc7451c1dace34c5d1f328f8a74a4947534'),
( ['00000000000000000000000000000000000000000000000000000000000000ff'],
'5044a80bd3eff58302e638018534bbda8896c48a'),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f'],
'8b10f977e27611516f186980d8161b25f8adca5e'),
( ['deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'],
'c96aaa54e2d44c299564da76e1cd3184a2386b8d'),
],
'xmr_mainnet': [
( ['0000000000000000000000000000000000000000000000000000000000000001'],
'42nsXK8WbVGTNayQ6Kjw5UdgqbQY5KCCufdxdCgF7NgTfjC69Mna7DJSYyie77hZTQ8H92G2HwgFhgEUYnDzrnLnQdF28r3'),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'49voQEbjouUQSDikRWKUt1PGbS47TBde4hiGyftN46CvTDd8LXCaimjHRGtofCJwY5Ed5QhYwc12P15AH5w7SxUAMCz1nr1'),
( ['0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'45Ee1yJSjXBKuf8aaihf6KgSRGtMBN6NNDtkd9fLJzHiK4ar4NyNxDk6afc7MTRoruAsg6J6792tCJazHqs1sjbv7LuEsLx'),
( ['00000000000000000000000000000000000000000000000000000000000000ff'],
'43aZyywWW4MYt2Az32XioQYirxyT8xeRBP84EBNA7Cra5SqQNmca6iD9pM487pcR9JAEiKrnw2QwvA5uWiFNokEzLJ5coZ9'),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f'],
'4AeR1owefiJGbrAdSKCbVL73ME4FGv2cpczjV2peqqkxagm5D4gBqAHJta6NpbtxyuRe3ywaTj6QCHD59savvPW69wfW9my'),
( ['deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'],
'41i7saPWA53EoHenmJVRt34dubPxsXwoWMnw8AdMyx4mTD1svf7qYzcVjxxRfteLNdYrAxWUMmiPegFW9EfoNgXx7vDMExv'),
],
'zec_mainnet': [
( ['0000000000000000000000000000000000000000000000000000000000000001'],
'zceQDpyNwek7dKqF5ZuFGj7YrNVxh7X1aPkrVxDLVxWSiZAFDEuy5C7XNV8VhyZ3ghTPQ61xjCGiyLT3wqpiN1Yi6mdmaCq',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'zcY1hqJ3P5ifjnWk1BcXpjrLG5XeJZUSPCiiVTF9LXrejxBzAsFWcNyr6PudwQHm8DnQpD8HEaM3dh8sB6cf91ciAa53YQ1',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'zcY1hqJ3P5ifjnWk1BcXpjrLG5XeJZUSPCiiVTF9LXrejxBzAsFWcNyr6PudwQHm8DnQpD8HEaM3dh8sB6cf91ciAa53YQ1',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['00000000000000000000000000000000000000000000000000000000000000ff'],
'zcck12KgVY34LJwVEDLN8sXhL787zmjKqPsP1uBYRHs75bL9sQu4P7wcc5ZJTjKsL376zaSpsYqGxK94JbiYcNoH8DkeGbN',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f'],
'zcJ9hEezG1Jeye5dciqiMDh6SXtYbUsircGmpVyhHWyzyxDVRRDs5Q8M7hG3c7nDcvd5Pw4u4wV9RAQmq5RCBZq5wVyMQV8',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'],
'zchFELwBxqsAubsLQ8yZgPCDDGukjXJssgCbiTPwFNmFwn9haLnDatzfhLdZzJT4PcU4o2yr92B52UFirUzEdF6ZYM2gBkM',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
],
},
'privhex2pubhex': {
'btc_mainnet': [
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'044281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e972757f3254c322eeaa3cb6bf97cc5ecf8d4387b0df2c0b1e6ee18fe3a6977a7d57a',
None, 'opt.type="legacy"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727',
['--type=compressed'], 'opt.type="compressed"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727',
['--type=segwit'], 'opt.type="segwit"' ),
( ['118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492'],
'024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727',
['--type=bech32'], 'opt.type="bech32"' ),
],
},
'pubhex2addr': {
'btc_mainnet': [
( ['044281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e972757f3254c322eeaa3cb6bf97cc5ecf8d4387b0df2c0b1e6ee18fe3a6977a7d57a'],
'1C5VPtgq9xQ6AcTgMAR3J6GDrs72HC4pS1',
None, 'opt.type="legacy"' ),
( ['024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727'],
'1Kz9fVSUMshzPejpzW9D95kScgA3rY6QxF',
['--type=compressed'], 'opt.type="compressed"' ),
( ['024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727'],
'3AhjTiWHhVJAi1s5CfKMcLzYps12x3gZhg',
['--type=segwit'], 'opt.type="segwit"' ),
( ['024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727'],
'bc1q6pqnfwwakuuejpm9w52ds342f9d5u36v0qnz7c',
['--type=bech32'], 'opt.type="bech32"' ),
],
},
'pubhex2redeem_script': {
'btc_mainnet': [
( ['024281a85c9ce87279e028410b851410d65136304cfbbbeaaa8e2e3931cf4e9727'],
'0014d04134b9ddb7399907657514d846aa495b4e474c',
['--type=segwit'], 'opt.type="segwit"' ),
],
},
'redeem_script2addr': {
'btc_mainnet': [
( ['0014d04134b9ddb7399907657514d846aa495b4e474c'],
'3AhjTiWHhVJAi1s5CfKMcLzYps12x3gZhg',
['--type=segwit'], 'opt.type="segwit"' ),
],
},
'randpair': {
'btc_mainnet': [ ( [], [is_wif,is_coin_addr], ['-r0'] ) ],
'btc_testnet': [ ( [], [is_wif,is_coin_addr], ['-r0'] ) ],
},
'randwif': {
'btc_mainnet': [ ( [], is_wif, ['-r0'] ) ],
'btc_testnet': [ ( [], is_wif, ['-r0'] ) ],
},
'wif2addr': {
'btc_mainnet': [
( ['5HwzecKMWD82ppJK3qMKpC7ohXXAwcyAN5VgdJ9PLFaAzpBG4sX'],
'1C5VPtgq9xQ6AcTgMAR3J6GDrs72HC4pS1', ['--type=legacy'], 'opt.type="legacy"' ),
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'1Kz9fVSUMshzPejpzW9D95kScgA3rY6QxF', ['--type=compressed'], 'opt.type="compressed"' ),
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'3AhjTiWHhVJAi1s5CfKMcLzYps12x3gZhg', ['--type=segwit'], 'opt.type="segwit"' ),
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'bc1q6pqnfwwakuuejpm9w52ds342f9d5u36v0qnz7c', ['--type=bech32'], 'opt.type="bech32"' ),
],
'eth_mainnet': [
( ['0000000000000000000000000000000000000000000000000000000000000001'],
'7e5f4552091a69125d5dfcb7b8c2659029395bdf'),
( ['000000000000000000000000000000014551231950b75fc4402da1732fc9bebe'],
'b92702b3eefb3c2049aeb845b0335b283e11e9c6'),
( ['0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
'ad30adc7451c1dace34c5d1f328f8a74a4947534'),
( ['00000000000000000000000000000000000000000000000000000000000000ff'],
'5044a80bd3eff58302e638018534bbda8896c48a'),
( ['000000000000000000000000000000014551231950b75fc4402da1732fc9bdce'],
'8b10f977e27611516f186980d8161b25f8adca5e'),
( ['deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'],
'c96aaa54e2d44c299564da76e1cd3184a2386b8d'),
],
'xmr_mainnet': [
( ['0000000000000000000000000000000000000000000000000000000000000001'],
'42nsXK8WbVGTNayQ6Kjw5UdgqbQY5KCCufdxdCgF7NgTfjC69Mna7DJSYyie77hZTQ8H92G2HwgFhgEUYnDzrnLnQdF28r3'),
( ['1c95988d7431ecd670cf7d73f45befc6feffffffffffffffffffffffffffff0f'],
'49voQEbjouUQSDikRWKUt1PGbS47TBde4hiGyftN46CvTDd8LXCaimjHRGtofCJwY5Ed5QhYwc12P15AH5w7SxUAMCz1nr1'),
( ['2c94988d7431ecd670cf7d73f45befc6feffffffffffffffffffffffffffff0f'],
'45Ee1yJSjXBKuf8aaihf6KgSRGtMBN6NNDtkd9fLJzHiK4ar4NyNxDk6afc7MTRoruAsg6J6792tCJazHqs1sjbv7LuEsLx'),
( ['1d95988d7431ecd670cf7d73f45befc6feffffffffffffffffffffffffffff0e'],
'43aZyywWW4MYt2Az32XioQYirxyT8xeRBP84EBNA7Cra5SqQNmca6iD9pM487pcR9JAEiKrnw2QwvA5uWiFNokEzLJ5coZ9'),
( ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f'],
'4AeR1owefiJGbrAdSKCbVL73ME4FGv2cpczjV2peqqkxagm5D4gBqAHJta6NpbtxyuRe3ywaTj6QCHD59savvPW69wfW9my'),
( ['e8164dda6d42bd1e261a3406b2038dcbddadbeefdeadbeefdeadbeefdeadbe0f'],
'41i7saPWA53EoHenmJVRt34dubPxsXwoWMnw8AdMyx4mTD1svf7qYzcVjxxRfteLNdYrAxWUMmiPegFW9EfoNgXx7vDMExv'),
],
'zec_mainnet': [
( ['SKxny894fJe2rmZjeuoE6GVfNkWoXfPp8337VrLLNWG56FjqVUYR'],
'zceQDpyNwek7dKqF5ZuFGj7YrNVxh7X1aPkrVxDLVxWSiZAFDEuy5C7XNV8VhyZ3ghTPQ61xjCGiyLT3wqpiN1Yi6mdmaCq',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['SKxv1peuQvMT4TvqPLqKy1px3oqLm98Evi948VU8N8VKcf7C2umc'],
'zcY1hqJ3P5ifjnWk1BcXpjrLG5XeJZUSPCiiVTF9LXrejxBzAsFWcNyr6PudwQHm8DnQpD8HEaM3dh8sB6cf91ciAa53YQ1',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['SKxv1peuQvMT4TvqPLqKy1px3oqLm98Evi948VU8N8VKcf7C2umc'],
'zcY1hqJ3P5ifjnWk1BcXpjrLG5XeJZUSPCiiVTF9LXrejxBzAsFWcNyr6PudwQHm8DnQpD8HEaM3dh8sB6cf91ciAa53YQ1',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['SKxny894fJe2rmZjeuoE6GVfNkWoXfPp8337VrLLNWG56kQw4qjm'],
'zcck12KgVY34LJwVEDLN8sXhL787zmjKqPsP1uBYRHs75bL9sQu4P7wcc5ZJTjKsL376zaSpsYqGxK94JbiYcNoH8DkeGbN',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['SKxv1peuQvMT4TvqPLqKy1px3oqLm98Evi948VU8N8VKcBwrLwiu'],
'zcJ9hEezG1Jeye5dciqiMDh6SXtYbUsircGmpVyhHWyzyxDVRRDs5Q8M7hG3c7nDcvd5Pw4u4wV9RAQmq5RCBZq5wVyMQV8',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
( ['SKxuS56e99jpCeD9mMQ5o63zoGPakNdM9HCvt4Vt2cypvRjCdvGJ'],
'zchFELwBxqsAubsLQ8yZgPCDDGukjXJssgCbiTPwFNmFwn9haLnDatzfhLdZzJT4PcU4o2yr92B52UFirUzEdF6ZYM2gBkM',
['--type=zcash_z'], 'opt.type="zcash_z"' ),
],
},
'wif2hex': {
'btc_mainnet': [
( ['5HwzecKMWD82ppJK3qMKpC7ohXXAwcyAN5VgdJ9PLFaAzpBG4sX'],
'118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492',
None, 'opt.type="legacy"' ),
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492',
['--type=compressed'], 'opt.type="compressed"' ),
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492',
['--type=segwit'], 'opt.type="segwit"' ),
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492',
['--type=bech32'], 'opt.type="bech32"' ),
],
},
'wif2redeem_script': {
'btc_mainnet': [
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
'0014d04134b9ddb7399907657514d846aa495b4e474c',
['--type=segwit'], 'opt.type="segwit"' ),
],
},
'wif2segwit_pair': {
'btc_mainnet': [
( ['KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm'],
('0014d04134b9ddb7399907657514d846aa495b4e474c','3AhjTiWHhVJAi1s5CfKMcLzYps12x3gZhg'),
['--type=segwit'], 'opt.type="segwit"' ),
],
},
},
# TODO: compressed address files are missing
# 'addrfile_compressed_chk':
# 'btc': ('A33C 4FDE F515 F5BC','6C48 AA57 2056 C8C8'),
# 'ltc': ('3FC0 8F03 C2D6 BD19','4C0A 49B6 2DD1 1BE0'),
'File': {
'addrfile_chksum': {
'btc_mainnet': [
( ['test/ref/98831F3A[1,31-33,500-501,1010-1011].addrs'],
'6FEF 6FB9 7B13 5D91'),
( ['test/ref/98831F3A-S[1,31-33,500-501,1010-1011].addrs'],
'06C1 9C87 F25C 4EE6'),
( ['test/ref/98831F3A-B[1,31-33,500-501,1010-1011].addrs'],
'9D2A D4B6 5117 F02E'),
],
'btc_testnet': [
( ['test/ref/98831F3A[1,31-33,500-501,1010-1011].testnet.addrs'],
'424E 4326 CFFE 5F51'),
( ['test/ref/98831F3A-S[1,31-33,500-501,1010-1011].testnet.addrs'],
'072C 8B07 2730 CB7A'),
( ['test/ref/98831F3A-B[1,31-33,500-501,1010-1011].testnet.addrs'],
'0527 9C39 6C1B E39A'),
],
'ltc_mainnet': [
( ['test/ref/litecoin/98831F3A-LTC[1,31-33,500-501,1010-1011].addrs'],
'AD52 C3FE 8924 AAF0'),
( ['test/ref/litecoin/98831F3A-LTC-S[1,31-33,500-501,1010-1011].addrs'],
'63DF E42A 0827 21C3'),
( ['test/ref/litecoin/98831F3A-LTC-B[1,31-33,500-501,1010-1011].addrs'],
'FF1C 7939 5967 AB82'),
],
'ltc_testnet': [
( ['test/ref/litecoin/98831F3A-LTC[1,31-33,500-501,1010-1011].testnet.addrs'],
'4EBE 2E85 E969 1B30'),
( ['test/ref/litecoin/98831F3A-LTC-S[1,31-33,500-501,1010-1011].testnet.addrs'],
'5DD1 D186 DBE1 59F2'),
( ['test/ref/litecoin/98831F3A-LTC-B[1,31-33,500-501,1010-1011].testnet.addrs'],
'ED3D 8AA4 BED4 0B40'),
],
'zec_mainnet': [
( ['test/ref/zcash/98831F3A-ZEC-C[1,31-33,500-501,1010-1011].addrs'],'903E 7225 DD86 6E01'),
( ['test/ref/zcash/98831F3A-ZEC-Z[1,31-33,500-501,1010-1011].addrs'], '9C7A 72DC 3D4A B3AF',
['--type=zcash_z'], 'opt.type = "zcash_z"' ),
],
'xmr_mainnet': [
( ['test/ref/monero/98831F3A-XMR-M[1,31-33,500-501,1010-1011].addrs'],'4369 0253 AC2C 0E38'), ],
'dash_mainnet': [
( ['test/ref/dash/98831F3A-DASH-C[1,31-33,500-501,1010-1011].addrs'],'FBC1 6B6A 0988 4403'), ],
'eth_mainnet': [
( ['test/ref/ethereum/98831F3A-ETH[1,31-33,500-501,1010-1011].addrs'],'E554 076E 7AF6 66A3'), ],
'etc_mainnet': [
( ['test/ref/ethereum_classic/98831F3A-ETC[1,31-33,500-501,1010-1011].addrs'],
'E97A D796 B495 E8BC'), ],
},
'keyaddrfile_chksum': {
'btc_mainnet': [
( ['test/ref/98831F3A[1,31-33,500-501,1010-1011].akeys.mmenc'],
'9F2D D781 1812 8BAD', kafile_opts, kafile_code ),
],
'btc_testnet': [
( ['test/ref/98831F3A[1,31-33,500-501,1010-1011].testnet.akeys.mmenc'],
'88CC 5120 9A91 22C2', kafile_opts, kafile_code ),
],
'ltc_mainnet': [
( ['test/ref/litecoin/98831F3A-LTC[1,31-33,500-501,1010-1011].akeys.mmenc'],
'B804 978A 8796 3ED4', kafile_opts, kafile_code ),
],
'ltc_testnet': [
( ['test/ref/litecoin/98831F3A-LTC[1,31-33,500-501,1010-1011].testnet.akeys.mmenc'],
'98B5 AC35 F334 0398', kafile_opts, kafile_code ),
],
'zec_mainnet': [
( ['test/ref/zcash/98831F3A-ZEC-C[1,31-33,500-501,1010-1011].akeys.mmenc'],
'F05A 5A5C 0C8E 2617', kafile_opts, kafile_code ),
( ['test/ref/zcash/98831F3A-ZEC-Z[1,31-33,500-501,1010-1011].akeys.mmenc'], '6B87 9B2D 0D8D 8D1E',
kafile_opts + ['--type=zcash_z'], kafile_code + '\nopt.type = "zcash_z"' ),
],
'xmr_mainnet': [
( ['test/ref/monero/98831F3A-XMR-M[1,31-33,500-501,1010-1011].akeys.mmenc'],
'E0D7 9612 3D67 404A', kafile_opts, kafile_code ), ],
'dash_mainnet': [
( ['test/ref/dash/98831F3A-DASH-C[1,31-33,500-501,1010-1011].akeys.mmenc'],
'E83D 2C63 FEA2 4142', kafile_opts, kafile_code ), ],
'eth_mainnet': [
( ['test/ref/ethereum/98831F3A-ETH[1,31-33,500-501,1010-1011].akeys.mmenc'],
'E400 70D9 0AE3 C7C2', kafile_opts, kafile_code ), ],
'etc_mainnet': [
( ['test/ref/ethereum_classic/98831F3A-ETC[1,31-33,500-501,1010-1011].akeys.mmenc'],
'EF49 967D BD6C FE45', kafile_opts, kafile_code ), ],
},
'passwdfile_chksum': {
'btc_mainnet': [
( ['test/ref/98831F3A-фубар@crypto.org-b58-20[1,4,1100].pws'],
'DDD9 44B0 CA28 183F', kafile_opts, kafile_code ), ],
},
'txview': {
'btc_mainnet': [ ( ['test/ref/0B8D5A[15.31789,14,tl=1320969600].rawtx'], None ), ],
'btc_testnet': [ ( ['test/ref/0C7115[15.86255,14,tl=1320969600].testnet.rawtx'], None ), ],
'bch_mainnet': [ ( ['test/ref/460D4D-BCH[10.19764,tl=1320969600].rawtx'], None ), ],
'bch_testnet': [ ( ['test/ref/359FD5-BCH[6.68868,tl=1320969600].testnet.rawtx'], None ), ],
'ltc_mainnet': [ ( ['test/ref/litecoin/AF3CDF-LTC[620.76194,1453,tl=1320969600].rawtx'], None ), ],
'ltc_testnet': [ ( ['test/ref/litecoin/A5A1E0-LTC[1454.64322,1453,tl=1320969600].testnet.rawtx'],
None ), ],
'eth_mainnet': [ ( ['test/ref/ethereum/88FEFD-ETH[23.45495,40000].rawtx'], None ), ],
'eth_testnet': [ ( [
'test/ref/ethereum/B472BD-ETH[23.45495,40000].testnet.rawtx',
'test/ref/ethereum/B472BD-ETH[23.45495,40000].testnet.sigtx'
], None ), ],
'mm1_mainnet': [ ( ['test/ref/ethereum/5881D2-MM1[1.23456,50000].rawtx'], None ), ],
'mm1_testnet': [ ( ['test/ref/ethereum/6BDB25-MM1[1.23456,50000].testnet.rawtx'], None ), ],
'etc_mainnet': [ ( ['test/ref/ethereum_classic/ED3848-ETC[1.2345,40000].rawtx'], None ), ],
},
},
}
coin_dependent_groups = ('Coin','File') # TODO: do this as attr of each group in tool.py
def run_test(gid,cmd_name):
data = tests[gid][cmd_name]
# behavior is like test.py: run coin-dependent tests only if g.testnet or g.coin != BTC
if gid in coin_dependent_groups:
k = '{}_{}net'.format((g.token.lower() if g.token else g.coin.lower()),('main','test')[g.testnet])
if k in data:
data = data[k]
m2 = ' ({})'.format(k)
else:
qmsg("-- no data for {} ({}) - skipping".format(cmd_name,k))
return
else:
if g.coin != 'BTC' or g.testnet: return
m2 = ''
m = '{} {}{}'.format(purple('Testing'), cmd_name if opt.names else docstring_head(tc[cmd_name]),m2)
msg_r(green(m)+'\n' if opt.verbose else m)
def fork_cmd(cmd_name,args,out,opts,exec_code):
cmd = list(tool_cmd) + (opts or []) + [cmd_name] + args
vmsg('{} {}'.format(green('Executing'),cyan(' '.join(cmd))))
cp = run(cmd,input=stdin_input or None,stdout=PIPE,stderr=PIPE)
try: cmd_out = cp.stdout.decode()
except: cmd_out = cp.stdout
if cp.stderr:
vmsg(cp.stderr.strip().decode())
if cp.returncode != 0:
import re
m = re.match(b"tool command returned '(None|False)'"+NL.encode(),cp.stderr)
if m:
return { b'None': None, b'False': False }[m.group(1)]
else:
ydie(1,'Spawned program exited with error: {}'.format(cp.stderr))
return cmd_out.strip()
def run_func(cmd_name,args,out,opts,exec_code):
vmsg('{}: {}{}'.format(purple('Running'),
' '.join([cmd_name]+[repr(e) for e in args]),
' '+exec_code if exec_code else '' ))
if exec_code: exec(exec_code)
aargs,kwargs = tool._process_args(cmd_name,args)
oq_save = opt.quiet
if not opt.verbose:
opt.quiet = True
if stdin_input:
fd0,fd1 = os.pipe()
if os.fork(): # parent
os.close(fd1)
stdin_save = os.dup(0)
os.dup2(fd0,0)
cmd_out = tc.call(cmd_name,*aargs,**kwargs)
os.dup2(stdin_save,0)
os.wait()
opt.quiet = oq_save
return cmd_out
else: # child
os.close(fd0)
os.write(fd1,stdin_input)
vmsg('Input: {!r}'.format(stdin_input))
sys.exit(0)
else:
ret = tc.call(cmd_name,*aargs,**kwargs)
opt.quiet = oq_save
return ret
def tool_api(cmd_name,args,out,opts,exec_code):
from mmgen.tool import tool_api
tool = tool_api()
if opts:
for o in opts:
if o.startswith('--type='):
tool.addrtype = o.split('=')[1]
pargs,kwargs = [],{}
for a in args:
if '=' in a:
a1,a2 = a.split('=')
kwargs[a1] = int(a2) if is_int(a2) else a2
else:
pargs.append(a)
return getattr(tool,cmd_name)(*pargs,**kwargs)
for d in data:
args,out,opts,exec_code = d + tuple([None] * (4-len(d)))
stdin_input = None
if args and type(args[0]) == bytes:
stdin_input = args[0]
args[0] = '-'
if opt.tool_api:
if args and args[0 ]== '-':
continue
cmd_out = tool_api(cmd_name,args,out,opts,exec_code)
elif opt.fork:
cmd_out = fork_cmd(cmd_name,args,out,opts,exec_code)
else:
if stdin_input and g.platform == 'win':
msg('Skipping for MSWin - no os.fork()')
continue
cmd_out = run_func(cmd_name,args,out,opts,exec_code)
try: vmsg('Output:\n{}\n'.format(cmd_out))
except: vmsg('Output:\n{}\n'.format(repr(cmd_out)))
def check_output(out,chk):
if isinstance(chk,str): chk = chk.encode()
if isinstance(out,int): out = str(out).encode()
if isinstance(out,str): out = out.encode()
err_fs = "Output ({!r}) doesn't match expected output ({!r})"
try: outd = out.decode()
except: outd = None
if type(chk).__name__ == 'function':
assert chk(outd),"{}({}) failed!".format(chk.__name__,outd)
elif type(chk) == dict:
for k,v in chk.items():
if k == 'boolfunc':
assert v(outd),"{}({}) failed!".format(v.__name__,outd)
elif k == 'value':
assert outd == v, err_fs.format(outd,v)
else:
outval = getattr(__builtins__,k)(out)
if outval != v:
die(1,"{}({}) returned {}, not {}!".format(k,out,outval,v))
elif chk is not None:
assert out == chk, err_fs.format(out,chk)
if type(out) == tuple and type(out[0]).__name__ == 'function':
func_out = out[0](cmd_out)
assert func_out == out[1],(
"{}({}) == {} failed!\nOutput: {}".format(out[0].__name__,cmd_out,out[1],func_out))
elif isinstance(out,(list,tuple)):
for co,o in zip(cmd_out.split(NL) if opt.fork else cmd_out,out):
check_output(co,o)
else:
check_output(cmd_out,out)
if not opt.verbose: msg_r('.')
if not opt.verbose:
msg('OK')
def docstring_head(obj):
return obj.__doc__.strip().split('\n')[0]
def do_group(gid):
qmsg(blue("Testing {}".format(
"command group '{}'".format(gid) if opt.names
else docstring_head(tc.classes['MMGenToolCmd'+gid]))))
for cname in tc.classes['MMGenToolCmd'+gid].user_commands:
if cname not in tests[gid]:
m = 'No test for command {!r} in group {!r}!'.format(cname,gid)
if opt.die_on_missing:
die(1,m+' Aborting')
else:
msg(m)
continue
run_test(gid,cname)
def do_cmd_in_group(cmd):
for gid in tests:
for cname in tests[gid]:
if cname == cmd:
run_test(gid,cname)
return True
return False
def list_tested_cmds():
for gid in tests:
Msg('\n'.join(tests[gid]))
sys.argv = [sys.argv[0]] + ['--skip-cfg-file'] + sys.argv[1:]
cmd_args = opts.init(opts_data,add_opts=['use_old_ed25519'])
if opt.tool_api:
del tests['Wallet']
del tests['File']
import mmgen.tool as tool
tc = tool.MMGenToolCmds
if opt.list_tests:
Msg('Available tests:')
for gid in tests:
Msg(' {:6} - {}'.format(gid,docstring_head(tc.classes['MMGenToolCmd'+gid])))
sys.exit(0)
if opt.list_tested_cmds:
list_tested_cmds()
sys.exit(0)
if opt.system:
tool_exec = 'mmgen-tool'
sys.path.pop(0)
else:
os.environ['PYTHONPATH'] = repo_root
tool_exec = os.path.relpath(os.path.join('cmds','mmgen-tool'))
if opt.fork:
tool_cmd = (tool_exec,'--skip-cfg-file')
passthru_args = ['coin','type','testnet','token']
tool_cmd += tuple(['--{}{}'.format(k.replace('_','-'),
'='+getattr(opt,k) if getattr(opt,k) != True else ''
) for k in passthru_args if getattr(opt,k)])
if opt.traceback:
tool_cmd = (os.path.join('scripts','traceback_run.py'),) + tool_cmd
if opt.coverage:
d,f = init_coverage()
tool_cmd = ('python3','-m','trace','--count','--coverdir='+d,'--file='+f) + tool_cmd
elif g.platform == 'win':
tool_cmd = ('python3',) + tool_cmd
else:
opt.usr_randchars = 0
start_time = int(time.time())
try:
if cmd_args:
for cmd in cmd_args:
if cmd in tests:
do_group(cmd)
else:
if not do_cmd_in_group(cmd):
die(1,"'{}': not a recognized test or test group".format(cmd))
else:
for garg in tests:
do_group(garg)
except KeyboardInterrupt:
die(1,green('\nExiting at user request'))
t = int(time.time()) - start_time
gmsg('All requested tests finished OK, elapsed time: {:02}:{:02}'.format(t//60,t%60))