Browse Source

Bech32: additional tests

MMGen 7 years ago
parent
commit
6f572cddde
7 changed files with 174 additions and 37 deletions
  1. 1 0
      mmgen/protocol.py
  2. 5 1
      mmgen/tool.py
  3. 1 0
      scripts/test-release.sh
  4. 1 0
      test/gentest.py
  5. 109 0
      test/ref/btcwallet-bech32.dump
  6. 3 3
      test/test.py
  7. 54 33
      test/tooltest.py

+ 1 - 0
mmgen/protocol.py

@@ -252,6 +252,7 @@ class LitecoinProtocol(BitcoinProtocol):
 						else os.path.join(g.home_dir,'.litecoin')
 	addr_ver_num   = { 'p2pkh': ('30','L'), 'p2sh':  ('32','M'), 'p2sh2':  ('05','3') } # 'p2sh' is new fmt
 	wif_ver_num    = { 'std': 'b0' }
+	mmtypes         = ('L','C','S')
 	secs_per_block = 150
 	rpc_port       = 9332
 	coin_amt       = LTCAmt

+ 5 - 1
mmgen/tool.py

@@ -273,7 +273,11 @@ def Wif2segwit_pair(wif):
 	Msg('{}\n{}'.format(rs,addr))
 
 def Pubhash2addr(pubhash):
-	Msg(g.proto.pubhash2addr(pubhash,at.addr_fmt=='p2sh'))
+	if opt.type == 'bech32':
+		ret = g.proto.pubhash2bech32addr(pubhash)
+	else:
+		ret = g.proto.pubhash2addr(pubhash,at.addr_fmt=='p2sh')
+	Msg(ret)
 
 def Addr2hexaddr(addr):     Msg(g.proto.verify_addr(addr,CoinAddr.hex_width,return_dict=True)['hex'])
 def Hash160(pubkeyhex):     Msg(hash160(pubkeyhex))

+ 1 - 0
scripts/test-release.sh

@@ -311,6 +311,7 @@ i_gen='Gentest'
 s_gen="The following tests will run '$gentest_py' on mainnet and testnet for all supported coins"
 t_gen=(
 	"$gentest_py -q 2 $REFDIR/btcwallet.dump"
+	"$gentest_py -q --type=bech32 2 $REFDIR/btcwallet-bech32.dump"
 	"$gentest_py -q 1:2 $gen_rounds"
 	"$gentest_py -q --type=segwit 1:2 $gen_rounds"
 	"$gentest_py -q --type=bech32 1:2 $gen_rounds"

+ 1 - 0
test/gentest.py

@@ -224,6 +224,7 @@ def dump_test():
 		except:
 			die(2,'\nInvalid {}net WIF address in dump file: {}'.format(('main','test')[g.testnet],wif))
 		b_addr = ag.to_addr(kg_a.to_pubhex(sec))
+		vmsg('\nwif: {}\naddr: {}\n'.format(wif,b_addr))
 		if a_addr != b_addr:
 			match_error(sec,wif,a_addr,b_addr,3,a)
 	qmsg(green(('\n','')[bool(opt.verbose)] + 'OK'))

+ 109 - 0
test/ref/btcwallet-bech32.dump

@@ -0,0 +1,109 @@
+# Wallet dump created by Bitcoin v0.16.0
+# * Created on 2018-03-05T17:00:47Z
+# * Best block at time of backup was 0 (000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f),
+#   mined on 2009-01-03T18:15:05Z
+
+# extended private masterkey: xprv9s21ZrQH143K2E1vJ8UzCcQc3nn7ACSCKvVn1eMFagn5bcpi5rQsAdNHzsoek1NDj5mzv6bLJQTV1uCFbJVEwhsyrhy25qg42JQBXg3Z7Dw
+
+KyWTCn5B7FzwD9xkFuVit5zjK2gT65nqBhqtZFttRSG3x3WEnGUM 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqp3gqvmdcnpk3zqmsqs7jrgt50w2d6u67hznvn hdkeypath=m/0'/0'/888'
+L1sBX4pyZRj2mMYkHGVSrY4AZdX6cdaB7PJxcMWjgZpo6aWwLs16 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqrgrczafwmxjqtwwkg6xd45ha0qs43dgv2c7w8 hdkeypath=m/0'/0'/319'
+L21i1EB3nT49w25YFBphAeV1WohgbUwKgqpxG2Mcqhs7hW8r3QDM 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqykw28cwsagekcpp5wm34mkuavz3yeh39cl3ld hdkeypath=m/0'/0'/545'
+KwHuXwJgdj9eSCBgtMeQFchwD1eZyjt2aVSn31HAXQyS9rGuN2sN 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq9r8j26vyug495cw4mjek3v37cjqnvvezg3lnr hdkeypath=m/0'/0'/675'
+L2q9rcJYdWetw7WkTD5xP9oh9iqDbeMevdw1w85z143TWu9V1HBq 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqxk25mad5zue8r0r9h6h9ahg5h60rg8h3qkr60 hdkeypath=m/0'/0'/694'
+Kx1BK1hoDvr2ypqz92wpZCXz6WG6dQyuHhQoAh9eMsdvRJyDyfmN 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq84lq3kdrkx0m3lmtvsaw34uyg9xkr259y8tgw hdkeypath=m/0'/0'/328'
+Kyr4BZBPTNqc4xmZ8GCaZB4SarDJCdiZNUCYbZT9yEsrfe18ZyKQ 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqg7z8uzgtw9z0d5f4hd5zfcc2kh3kwqr0gg9kf hdkeypath=m/0'/0'/535'
+L4At7umzDG6uCRhEugMMQbQy1fKGEvfbpy9bdhUzwRpmQHfAXTPf 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqfz4etlf6tjhxs9za7e47wlg2yjcv4dkke60yn hdkeypath=m/0'/1'/127'
+KzoZHRnz5Pzd4ASyAN266kWEZsFH3TLJVoTZrSnSVaJTDr7eqQ4u 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq20hlnuhrvu5r6an0p3sd7my44hnxadvymw3u3 hdkeypath=m/0'/0'/313'
+L1NpMJWUtVtNBBdw6wDxGHBUCBcm9WyqH3nMEJ7frMz8Z7AvNvTy 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqvemejtcxfypasga8na722mw5zrh0ej8vslq0u hdkeypath=m/0'/0'/823'
+KwpW4hP1yPkQGwwKw3KENarLRcWKxV5z3cvXrtPAUvBaX1CADJu1 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqwtg2e8hw5ez2gfmtkp5k0vvsd2636nezgd7cz hdkeypath=m/0'/0'/511'
+KzXyoZV7hMg79dTMsFPDs55W59ZfyCdGop3Hdov8h6U1mkeDVehJ 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqw0xlhaafj4qhq28zqz8kzy4h0r3g8xmeljdt3 hdkeypath=m/0'/0'/791'
+L3z6oA4g8LjeZohM5C2bWymVQn3Ur38y1cecD8aDdUnh1Rt79w4b 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqwmh7zzz95j9hwtxas3gtfuj6lh4q084sfrrm6 hdkeypath=m/0'/1'/25'
+L2CkEPfXQxKiKuLdBD9cW6FEGM3hFJV19VTZ5SmPD4HJfuudaryb 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqswte344gun53ggt3dmstuxl6pph67el33eqvv hdkeypath=m/0'/0'/666'
+L1ZzVyfoPg8TTrRiqF42pqJUYVTYJMCxVCgbGu1csoZxGrLhGpzS 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq3tckl70j3pf9lwhyzex0c76x4x979kma6dzmh hdkeypath=m/0'/0'/766'
+KwHgnn61SaNjbvnvBo71R8szs2C9sGytXevHmfzfy5PDs36iAiRs 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqj885hxk75cwvzc5ddmmtu38d7e6jmk00pkxcd hdkeypath=m/0'/0'/794'
+L4gHTef1ADBqjUyP9YxJcYNXahHSS5XV5tCmKcsBHLNeJru13TGj 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqj53s7ltrqk0xqnv82656lsahukr8sez08p0n2 hdkeypath=m/0'/0'/59'
+L3eZiBUbLKyf8kdguH99Eum5pjLhZgtgCWX75CMs39ErB4jNe7DM 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqnyg93da3pd75zlnk02sv9fz0wrvhc5ft5rghn hdkeypath=m/0'/0'/909'
+L5PWQ7kXy34EBJSaXDsoE5DLchgtriiGstpY4obUsb3ySqRkf1Ln 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqngry3p2d6v0g2z0nyzu807lg9rmsp58kd69fc hdkeypath=m/0'/0'/0'
+L34HTqbJcQxE1a4tWxzrahNyuntfc4ov4JgFeUBmcvyP2uKHs8BS 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq4puyc8kth0vj5pka93t4gw5lcjtnyzu82qlsu hdkeypath=m/0'/0'/590'
+L2vmEeAAue1bTG4ndKYUMDa4ZDMHStZa64TqUyX6dPP2egc7YWEf 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq4wrre3g8gle8wl26j024a79xj870fua8xmm0g hdkeypath=m/0'/0'/215'
+L5LCjVd5DiWbbXNzBSnC7Tvw6D2XgcMc2yVTJZL7hyP1SHE3THoA 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq46axh96hcwmk0jqv0c3yzjk27z4qxw9qnhd59 hdkeypath=m/0'/1'/123'
+KyvN52EN727SJD1EvrY5aXzswg7W3KytrFXjqzGAuvNzrNYtKeYu 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqhrc49asjczyrduzpmz5net90pq75gt9pv6faa hdkeypath=m/0'/0'/843'
+L5b8R2MrDgiBeHh5B5XPhexArARa8YCmyNh7nuZdX2LJRrKBqrW7 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqhyvyjkrlkck4gjgjvwjafs30y88muwxxlww79 hdkeypath=m/0'/0'/988'
+L1zBancKMMMccRqadcowbS53CjG6rT5eqaWVHfrUf4Z75H7YjbUc 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqh224zthptx8r5wzhurjartvxs5ewd4hm3dmrh hdkeypath=m/0'/0'/923'
+Kz2Eqz4qQM8nAVNBXVXvNf8UMVJL2A9GRSeyNy5QU9UHW28W9C4r 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqe4x09flnqvz4p8nvkv3eeq3u5kh76h7jq4ehe hdkeypath=m/0'/1'/109'
+L3EMCL9RspToyDoc98qsykXo8wyCE3b6iZfQVUieaY8onCxMghUz 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqmx2hgr8jad62w8z7xyc0rnu7c6nvf59npmh73 hdkeypath=m/0'/0'/946'
+L3tygoS8c88aFZeqqkkwDeHw6RJMcSS4fs5HUdDV96agSdtb9zi1 2018-03-05T16:59:40Z reserve=1 # addr=bc1qquyawrpvsva6e5ftx0w602gs9hqg8nwjxky5at hdkeypath=m/0'/0'/832'
+L3jHg3ekpkRN6cGV8Wyu6jq961uKWnByzwd8wghHJ3JiUoL9KTvA 2018-03-05T16:59:40Z reserve=1 # addr=bc1qquu5zdngf5ujfmgh9fy0px3pz5t6hew20xylty hdkeypath=m/0'/0'/154'
+L2jVuc6fWHsUo9S2PYEp6TkkcSMzYFmMTXLBthL3651uHpadV8tM 2018-03-05T16:59:40Z reserve=1 # addr=bc1qqagf53n9z2c5qdk2tfzuhpax5ppfaywwcvh48u hdkeypath=m/0'/0'/427'
+KxkJWD7cNWAq6aPi7YvmSRBveFoxR44m4imCUYTnJQ4yuA93qgVi 2018-03-05T16:59:40Z reserve=1 # addr=bc1qq76jcducsrg2hqgufrkn06mg55wvzxw22cqhpj hdkeypath=m/0'/0'/570'
+L4jgcwxj1s1RRXf3UPtsH8uNK3zWLyLad8YNQQCakH5Pv2RsRMYY 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpqtzpvptfuz0045t24h8tcfzkan6wc62ar2vjf hdkeypath=m/0'/0'/285'
+KxE124suFFaYa11NajqC3oRYAgboGE35DaqE5UtMNYdQcbBGdasV 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpqjah85k56z8545z3uakpfv7ergpx4239z262n hdkeypath=m/0'/0'/753'
+L2dwSX8zoQbNYJGjADEhfFowAiYMso1SzUQZ3FTMdZeBW6FoxG5d 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpz3vy576zwp4aqmccw2fl2wwhyu6rz05elryjx hdkeypath=m/0'/0'/56'
+L4GiN5EvuFPh9yAKV8JDX8BPUBbWtXoD49psbnekmhHtTJtea63L 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpze532kez0g3j4n8s5ayu4juvl8qn5pg6ewm6l hdkeypath=m/0'/1'/43'
+KxRRL1mYse1ySJNAHDR16sNrKAQzWrdE2K2qQqFKnKddWa7YS9Vs 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpz6wf2z902esruqtgz5lz944ncl0qg9dlqlzqp hdkeypath=m/0'/0'/767'
+KxvDTY6xQ18K3ZGq4RBAy66DCr3n7Bk9QC6iXfvL2M1hR6e53W5R 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpzah2g3e53udpfr2hechf99r362dt3lj9v94dq hdkeypath=m/0'/0'/684'
+L1Qf1XCwQgfGN13pssuM3j9Ds7ePyLFjZ35kbK9BsLVZsH9B6apo 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpr46nsmjsukvrmyfrfdwc2gz7zanzy4yrv6ygl hdkeypath=m/0'/1'/84'
+KyCUMn3QE61oe6cetw6zTJbK52BGnnPBm3SNJ2xNn9HB6UYKrjAE 2018-03-05T16:59:40Z reserve=1 # addr=bc1qprldy94rsz4ufpqvs3x06lzpfcyl59wddmwclf hdkeypath=m/0'/0'/959'
+KxwoViXXjjumNtRZLRfUqpUadiqz54dPjMP1xegqorrPcXeD1Fz8 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp93lx8ewuzk9nygxqkqvyjpe0gt9mz9ea7jqsk hdkeypath=m/0'/0'/408'
+Kwm8czowx4GEP9NyKG3WnkER8BuETJU51duN46E5xAQjpz2ixRrU 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp8naexmqq9ryj90sjtnneqgdesm3lp50fjjmv5 hdkeypath=m/0'/0'/914'
+L592QXSDgkaKe7pxvDFKkPXbBCiwvxTkyQn6aufKyqW4WU851Ntr 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpfda87xjh073adw305eqjt39xkysr26459mhd5 hdkeypath=m/0'/0'/620'
+L1uXXZC5SrsweJVDdFu48R8rQpp9dmjj76jtVC9e8Mnohti1XBzG 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpfk6cguq3mzcv7gzxhd844tr0tk9x27vuswxv7 hdkeypath=m/0'/0'/401'
+L59F1RwSTxRbyp5cd3Pvog2XoYmNUhQi7eAijRkhMZBmdgNu2BB1 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp2fv5gyz0f0rjtuq68ktvqx6wj7tzpr3azxu58 hdkeypath=m/0'/0'/262'
+L5NaLRQ9atywqUjkuFqajV468tytZKPqK2yAb5hzRiPJN5TBjhXg 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpdvklpsmtcyslz9srnu5zxge92wd9tz0fz45q9 hdkeypath=m/0'/0'/90'
+L2zcJjPSPNQD9NLXHrRJ6mSmBAU4AUN9CBotdsYZfwoFWhqFXm8w 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpwzp5y73dl823txuj6kzjxfufqx67xuxflsmkd hdkeypath=m/0'/0'/503'
+L2FNif6JWkaRGFajYLtswNd2Lsqe39hzd5UiLPrQRnidWBHuZz8T 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp02gw74r4yry2ctg0wn5l8k2lgydksxn64e8p0 hdkeypath=m/0'/0'/436'
+L4X9Kkxe6NPvRz6TVB2REyRJ7VKffJks9TxoJVmHVUdZw5KBRGY9 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpszas698p6arh8dydq07mlg5cpv0j3tmtnjw9f hdkeypath=m/0'/0'/1'
+L5CfKHQhz7XCQ3DF49vsCLSf9h4eZqXSDnJLjBKhpabE33FKhtxj 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp3c774jrc54fhqa9z2hk5l2ugzsnmt62qddte4 hdkeypath=m/0'/0'/476'
+L1PvQdYMXr9ifYN6AosYpCvHu2BKM4SsBKcsuLczVMwHxAXi4UKK 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp36zctn4wane7g2w43yqefaqxxej7faut3ykt0 hdkeypath=m/0'/0'/161'
+L4LYDHAJLjugrHmyq7aZKMiqgwuLbJUBGaXrVRgVNiVMbS7Q4TaQ 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpj0emewh8dlfykv7qlmgf4hwflugya8pd9zffz hdkeypath=m/0'/0'/757'
+L468MTvpVBGY31m67W7e6Nd5FGdwB14VUv3URRgjkCjgEfmmufEP 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpjs9zrd7ferkzpwgsghszz78dpcrrftyyl07m6 hdkeypath=m/0'/0'/385'
+Kz5ZUuuTSFv3t6sXqXbnQizXi1Y6AggXNu8Phzpqes353wncJYar 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpjs4gjxs4w56sx9spxm2njc6v2mpzxenfv644m hdkeypath=m/0'/0'/343'
+L1UbRCzxmEpmccpWPGMXgvSueupRgf4ycpj5TkuWfEMPQWh1QGFo 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpjegzmx2vd60jrx2dn0pd0wsg5munxy4lj2zl5 hdkeypath=m/0'/0'/346'
+L3t9ZogBWEKrjjRdC7MCd4zzCptM7AMRFbsvpsT9HmpJtmLAHmDZ 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp5ct6ux2fnnzfmnuwwl0sw5cuhddeatqg00fga hdkeypath=m/0'/0'/32'
+KwudSdDLdVS4ExhojDy1QDcEH4nRFi6WVYhZXaTGbEFoi8Cz8jPT 2018-03-05T16:59:40Z reserve=1 # addr=bc1qp42y506qcnteasg52j2zwmgu5efa39j89jzhwh hdkeypath=m/0'/0'/190'
+L3wi1sxb5fFhgVXA2JiNjFU7qmh8jhAfqxYUDkjxpyNsSEratgsH 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpk4qrkhx7g22rxt4vdlgczefl0hzh08yeumld4 hdkeypath=m/0'/0'/133'
+Kz5MV2oEe54nsqe2h9AxbFJax5CAYjsJhFwowCCfrBEFTSLCx9EH 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpedhst2yp48p39hvga302lk6gzcaepgsqck80j hdkeypath=m/0'/0'/737'
+L44RS8bJzRXqE5rpED8HbJzdBx1XfGqKwWdPhGzGaj9B8fkXrsnA 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpmapqjtrjrm9fumh243dcjdgrme5fh98hjdvnw hdkeypath=m/0'/0'/616'
+L1tLSdu3JjZYXNn3h2PpYndC1nQRDSgbWJZ9wpdx9LoNmqZ2akPe 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpayqa7kdxv43gl8ey5x8lwnffsw9muk9g8x860 hdkeypath=m/0'/0'/80'
+L2AzEVsZhdFg3br6XkZGt8hTX1ZXHJUEM9AtBB3x6NLY5rtHD3Pf 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpasjrv2tlf3kzjud293hwrmwch8drwy4kj0vzd hdkeypath=m/0'/0'/867'
+L5RSy2C3Z2xWhhXeGXfGpkHH4EdosXctEKPw4uhDBgVpqPHyzb3i 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpamczxwcmj0kxneje87ydtakrd6mj42nlrse9y hdkeypath=m/0'/0'/931'
+KzwQtmR1c6vVZHvj5SUxxx2sFVxHGKFwV6EmYBxR1yG21ifzunWj 2018-03-05T16:59:40Z reserve=1 # addr=bc1qplpszat256uyhhzjereddjez0qk6ghy7kqtg4a hdkeypath=m/0'/0'/526'
+Kx9a2RD9wVQAXVYRKhUQnrVUREkXhKDaZSKnz9JMoGes4A6YC5Yn 2018-03-05T16:59:40Z reserve=1 # addr=bc1qplrazmtn8x5x2eyj6c5v9x8y8336pw4vlg6kw2 hdkeypath=m/0'/0'/509'
+L4we8nfKFkZNBam6D7t63P3e7LrMLwRjpZ7Cjt3ZGDwWPb5pX6Vt 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpl4mfayagsew6qlgjfdgjsycx7sf2cwfntkf5l hdkeypath=m/0'/0'/970'
+KzL3ntoDHe48vgEGQ6mRGLePaLgQr48mp6waqQAs99K9MjJZVRqX 2018-03-05T16:59:40Z reserve=1 # addr=bc1qpluner5ay9p2lfrswwscz7r5jy2lxy0hg3alxx hdkeypath=m/0'/0'/848'
+Ky1drboQJbkFSaJzDXJ6bZiTxEQQHX8rx73Ph4wzFs3k6tmVWBYr 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzq6gg9esvq5drl5mtlumvyu46t996n0kxuyq0k hdkeypath=m/0'/0'/954'
+KyYRjfkDvdCGZxwVXH2N3pg7FKHBwet6jv6LsT4eTZ1FPuWqjpL1 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzpa0r4yuh0jwywvup50me6dvllp7dps69l7d9g hdkeypath=m/0'/0'/28'
+L3yQJ397woQWmYZuWPDHx84RcaGP2iTzkZ8FBB5P7NgaVCe264Vr 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzzdecf0gkuqrqatvly7zz4j43wwhqkmn3pzllr hdkeypath=m/0'/1'/111'
+L1nksP6jdcoHD9q7Eqxbq6SSoKbabFQyMXF2yaepGicRSh2qkCs6 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzrfvwmf4canzlrmdkljuqsgllhhqfjvqdsvl7t hdkeypath=m/0'/0'/266'
+KzspjV4xxP4ZueyzWhH9QjA17X26t7iCQPiUPRYxjH7FcEYoA97G 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzrdsjpq44zz7z2gx63anvlwwfxec099w7n73qz hdkeypath=m/0'/0'/917'
+Ky8b8tqEx6mLvvmromccVfvGB8fTuE11FKbVBU8WJEMTK99kZd3k 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzr7ptylg2reydsfx7e3pv3yryv6hjncjyzegx4 hdkeypath=m/0'/0'/788'
+KxHQs2imQZugSigx3WZj1HVMdSgj2uQZ52WgtQjpdzuKsnSJ6daV 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzyu4q32wjwerjt2numx7unrjw7hhlk4pv74dxm hdkeypath=m/0'/0'/160'
+L3eJiFTFrqtGYyCLV7pwSvR1wonCdKSa5b5Jnrc58jaW8iec4Z1R 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzxqk4l72k2gedx9jx0eydcvcru257psl3ddpw2 hdkeypath=m/0'/0'/588'
+L1L1cU6oiojuwWXcveVhW3wh2mcj3DhZYHtzw6Q11hPmzJD3Q5Lx 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzxy6hrvr2jg6w3ngy65k95wj9ywgjdjrsvulen hdkeypath=m/0'/0'/378'
+L3WP94FFjZ9Eg7DgrbmVvL5kMDNwacgHVNcgKSrwVXBQYeZztJZc 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzxx9gzt60x0m4cqccpqv9v9ya7ajdcv9snq5jm hdkeypath=m/0'/0'/829'
+KxRmaWfA76L6ok99Z8cfu6nLcog8KyWZKdRd2chH9YAENgeW9AMK 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz8pe4qt33ja40tsfnf3jtnawwsmmjp6pu0qyyq hdkeypath=m/0'/0'/84'
+L4AWqGUmu3Ab2zU2xNtS1n7wHuRyrjzSS2mSX9NQ2oE4gjADvp4M 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz8rnq3lrh83nljqajfd0fl4yq4m0dhcwwdskzf hdkeypath=m/0'/0'/841'
+L2ke9RZkB9KWatUNey4pUfbGNBg3qyvdC9YnH9sN1Tm33R7xLvfe 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzgfh93xm86m9rlsmkjffehlqhyzvhm66rlsp6n hdkeypath=m/0'/0'/374'
+L2apDq3XVGhYaBCubNXNgoCxDAgsZHhX5SCxh1HdLBJhhdapGZxU 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzgd7695z20qs25x5rh9znu5zufr4whsrh8ec6c hdkeypath=m/0'/0'/717'
+KwgVhYPVx5HbfY9uHM4ipdA3FHBWsfkrzpdXUPeXpsX4rdBk3mrL 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzgjectrrvvmev72cfdt6uqfql5gzssg3h286c9 hdkeypath=m/0'/0'/50'
+L1f8ysdwawiEK8ACVU9WbA9RgXWuKpqiZ1xt4XsV38YbBHg8ctm8 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzg5f2lrpers0a7hsddfvpmz25grzxug7efhg6e hdkeypath=m/0'/0'/525'
+KwYLBnkJ53HpZT9PHRf4bUJhzwC8JnJSTonzMxrEmhAgWrk6skk4 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzga3z9ejqfrrpcj9r0k5mrlu5rmnr8ekqggwp8 hdkeypath=m/0'/0'/221'
+L4aMkL5UKbucBoTsswSTZCrKbEcPn89KbMc1nP2FhLHT4nhJUS33 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzfeh2yt9th423u24k3htpq74d0frpz8p9jyz0s hdkeypath=m/0'/1'/36'
+L5CZdr4RwtjdAzVDY7qqznxps2EmW2T2AuUv7uHmjPHavuseJVhm 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz2x7jz7krhxmu4q8j85syfxhf25ala2emtz78p hdkeypath=m/0'/0'/626'
+L4yG4ftoEXWcQH2w9TSh6wMzN5twTQrTS4AasG5DKiGoZhgsGW8b 2018-03-05T16:59:40Z reserve=1 # addr=bc1qztvs4vu8a4trp9wfqdunvj6cehpwlg0teews4z hdkeypath=m/0'/0'/66'
+Kwq8oeRTMJuR4RwMVXAvJACydeJovwAEf9opEeoDCYMicCcUUCbg 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzway2udfewsz9cfmeypxvgdnjgptdvwrpww2va hdkeypath=m/0'/0'/751'
+KzjPNZC4F1Ksn6qcnMy5ypYuT2RvrBXh6L3qk8vawej1rKdtKFpu 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzsnmd95w4a83qmwht9qm73w4xulu07znexxx2k hdkeypath=m/0'/1'/29'
+KzNWGiombLc9go866A3sSGRtdsU1TSpeZbxNyHA3sa7bAXbvTFPk 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz3zn4qp3c5rv5gskme94jzztn7pjyxdwwyrg2y hdkeypath=m/0'/0'/838'
+KwrsiQv4svb82viqDQDrerfbQUsZyx8jM7PfkVZzVdVX2M6kjRAc 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzjy9wygr2z94qv0yzp9xdr3fwny5heh0h7k60w hdkeypath=m/0'/0'/591'
+L4DbRGykiPaT8298kmDLo3rQqyHmtJ1ZJiWuDXmqUZAdrZUYNkCJ 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzjfyj0ljhudl5w98xcv02ydzv6kjzxercwnx3z hdkeypath=m/0'/0'/347'
+L5RUT8xB3rzh1s41fa6wRnskULVF5MpiDrcVJgEug5ud8mJc8D1F 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzn3tcm7p8j37au68ajsa7pencrvkmtx9e6fagc hdkeypath=m/0'/0'/514'
+L1Q3isvNS45fGFWj6JVQ7q24peFDSafXiqJuZZPw8smd1LMCohfs 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzn7arptq59rr4z2qwlf5kzmnzpj9tvq9enjsc7 hdkeypath=m/0'/1'/144'
+Kxejtrx77wP5B9j1nJz1wjMMnwLGa9XZjifoD6gwb6YufRF37vpw 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz4jtg66ysrv4vzyxwmvwsl9clwvkcegjf90j4d hdkeypath=m/0'/0'/883'
+L1n9jYsRQF1R5adHijhNyWcQgPPovizr8oQfEhzwQ59RSZC7fVdb 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz45jn0l56dx8qp3hnge4nprdg90tm6922trr6f hdkeypath=m/0'/0'/821'
+L1upSitKPfbj74gupBVe7iB343UUE2NJCTEtymdHqRf2zd4KGcUV 2018-03-05T16:59:40Z reserve=1 # addr=bc1qz4cdmyl3czsu9937jnp2wt6atzge7jm7jpxc49 hdkeypath=m/0'/0'/492'
+L3oAMsZDkN6tWL2iBXWQPuPDmKMVnLYFDYUbAFkoUDVJV8yzV5CF 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzky9athff8teluwjg7gvqwadqpay6ggz4k9mhc hdkeypath=m/0'/0'/233'
+L2JZLfMEd8FgvZvaQTaxPicx9yVX6X2GUiMdGicfXdQHHcPa92Cu 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzkk0j0y9v5rdugugdnjuny0azw7en5mqt9zvu8 hdkeypath=m/0'/0'/306'
+KxtP4NCXGLspbMN5Wxw1RXZJiwe2LKxCFkbEQxo2NqJZ5t2CRS7L 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzhvp0pue0ddpdthh6zyckhh69hgprfsfs4lhfs hdkeypath=m/0'/0'/827'
+L19MAvFt16Cv5sBVDrj91GmPFcEyqWpumtwdPMyeQ6xnedWZaE4v 2018-03-05T16:59:40Z reserve=1 # addr=bc1qzhv4xdcyw9yw3uferekl05mcj3w3753m4vujmk hdkeypath=m/0'/0'/777'
+
+# End of dump

+ 3 - 3
test/test.py

@@ -168,8 +168,8 @@ rtFee = {
 }[coin_sel]
 rtBals = {
 	'btc': ('499.9999488','399.9998282','399.9998147','399.9996877','13.00000000','986.99933647','999.99933647'),
-	'bch': ('499.9999416','399.9999124','399.99989','399.9997616','276.22339397','723.77626763','999.99966160'),
-	'ltc': ('5499.9971','5399.994085','5399.993545','5399.987145','13.00000000','10986.93714500','10999.93714500'),
+	'bch': ('499.9999484','399.9999194','399.9998972','399.9997692','6.79000000','993.20966920','999.99966920'),
+	'ltc': ('5499.99744','5399.994425','5399.993885','5399.987525','6.79000000','10993.14752500','10999.93752500'),
 }[coin_sel]
 rtBobOp3 = {'btc':'S:2','bch':'L:3','ltc':'S:2'}[coin_sel]
 
@@ -2551,7 +2551,7 @@ class MMGenTestSuite(object):
 		amts = (a for a in (1.12345678,2.87654321,3.33443344,4.00990099,5.43214321))
 		outputs1 = ['{},{}'.format(a,amts.next()) for a in addrs]
 		sid = self.regtest_user_sid('bob')
-		l1,l2 = (':S',':B') if g.proto.cap('segwit') else (':L',':L')
+		l1,l2 = (':S',':B') if 'B' in g.proto.mmtypes else (':S',':S') if g.proto.cap('segwit') else (':L',':L')
 		outputs2 = [sid+':C:2,6.333', sid+':L:3,6.667',sid+l1+':4,0.123',sid+l2+':5']
 		return self.regtest_user_txdo(name,'bob',rtFee[5],outputs1+outputs2,'1-2')
 

+ 54 - 33
test/tooltest.py

@@ -84,24 +84,24 @@ cmd_data = OrderedDict([
 			'desc': 'Cryptocoin address/key commands',
 			'cmd_data': OrderedDict([
 				('Randwif',        ()),
-				('Randpair',       ()), # create 3 pairs: uncomp,comp,segwit
-				('Wif2addr',       ('Randpair','o3')),
-				('Wif2hex',        ('Randpair','o3')),
-
-				('Privhex2pubhex', ('Wif2hex','o3')),
-				('Pubhex2addr',    ('Privhex2pubhex','o3')),
-				('Hex2wif',        ('Wif2hex','io2')),
-				('Addr2hexaddr',   ('Randpair','o2'))] + # TODO: Hexaddr2addr
-				([],[
-					('Pubhash2addr',   ('Addr2hexaddr','io2'))
-				])[opt.type != 'zcash_z'] +
-				([],[
-					('Pubhex2redeem_script', ('Privhex2pubhex','o3')),
-					('Wif2redeem_script', ('Randpair','o3')),
-					('Wif2segwit_pair',   ('Randpair','o2')),
-					('Privhex2addr',   ('Wif2hex','o3')), # compare with output of Randpair
-					('Pipetest',       ('Randpair','o3'))
-				])[g.coin in ('BTC','LTC')]
+				('Randpair',       ()), # create 4 pairs: uncomp,comp,segwit,bech32
+				('Wif2addr',       ('Randpair','o4')),
+				('Wif2hex',        ('Randpair','o4')),
+
+				('Privhex2pubhex', ('Wif2hex','o3')),        # segwit only
+				('Pubhex2addr',    ('Privhex2pubhex','o3')), # segwit only
+				('Hex2wif',        ('Wif2hex','io2')),       # uncomp, comp
+				('Addr2hexaddr',   ('Randpair','o4'))] +     # uncomp, comp, bech32
+			([],[
+				('Pubhash2addr',   ('Addr2hexaddr','io4'))   # uncomp, comp, bech32
+			])[opt.type != 'zcash_z'] +
+			([],[
+				('Pubhex2redeem_script', ('Privhex2pubhex','o3')),
+				('Wif2redeem_script', ('Randpair','o3')),
+				('Wif2segwit_pair',   ('Randpair','o2')),
+				('Privhex2addr',   ('Wif2hex','o4')), # compare with output of Randpair
+				('Pipetest',       ('Randpair','o3'))
+			])[g.coin in ('BTC','LTC')]
 			)
 		}
 	),
@@ -196,15 +196,17 @@ if opt.list_names:
 
 from mmgen.tx import is_wif,is_coin_addr
 
-msg_w = 35
+msg_w = 33
 def test_msg(m):
 	m2 = 'Testing {}'.format(m)
 	msg_r(green(m2+'\n') if opt.verbose else '{:{w}}'.format(m2,w=msg_w+8))
 
 maybe_compressed = ('','compressed')['C' in g.proto.mmtypes]
 maybe_segwit     = ('','segwit')['S' in g.proto.mmtypes]
+maybe_bech32     = ('','bech32')['B' in g.proto.mmtypes]
 maybe_type_compressed = ([],['--type=compressed'])['C' in g.proto.mmtypes]
 maybe_type_segwit     = ([],['--type=segwit'])['S' in g.proto.mmtypes]
+maybe_type_bech32     = ([],['--type=bech32'])['B' in g.proto.mmtypes]
 
 class MMGenToolTestSuite(object):
 
@@ -354,38 +356,57 @@ class MMGenToolTestSuite(object):
 			ret = self.run_cmd_out(name,add_opts=ao,Return=True,fn_idx=n+1)
 			ok_or_die(ret,is_wif,'WIF key')
 	def Randpair(self,name):
-		for n,k in enumerate(['',maybe_compressed,maybe_segwit]):
+		for n,k in enumerate(['',maybe_compressed,maybe_segwit,maybe_bech32]):
 			ao = ['--type='+k] if k else []
 			wif,addr = self.run_cmd_out(name,add_opts=ao,Return=True,fn_idx=n+1).split()
 			ok_or_die(wif,is_wif,'WIF key',skip_ok=True)
 			ok_or_die(addr,is_coin_addr,'Coin address')
-	def Wif2addr(self,name,f1,f2,f3):
-		for n,f,k,m in ((1,f1,'',''),(2,f2,'',maybe_compressed),(3,f3,maybe_segwit,maybe_compressed)):
+	def Wif2addr(self,name,f1,f2,f3,f4):
+		for n,f,k,m in (
+			(1,f1,'',''),
+			(2,f2,'',maybe_compressed),
+			(3,f3,maybe_segwit,''),
+			(4,f4,maybe_bech32,'')
+			):
 			ao = ['--type='+k] if k else []
 			wif = read_from_file(f).split()[0]
 			self.run_cmd_out(name,wif,add_opts=ao,fn_idx=n,extra_msg=m)
-	def Wif2hex(self,name,f1,f2,f3):
-		for n,f,m in ((1,f1,''),(2,f2,maybe_compressed),(3,f3,'{} for {}'.format(maybe_compressed,maybe_segwit))):
+	def Wif2hex(self,name,f1,f2,f3,f4):
+		for n,f,m in (
+			(1,f1,''),
+			(2,f2,maybe_compressed),
+			(3,f3,'{} for {}'.format(maybe_compressed,maybe_segwit)),
+			(4,f4,'{} for {}'.format(maybe_compressed,maybe_bech32))
+			):
 			wif = read_from_file(f).split()[0]
 			self.run_cmd_out(name,wif,fn_idx=n,extra_msg=m)
-	def Privhex2addr(self,name,f1,f2,f3):
-		keys = [read_from_file(f).rstrip() for f in (f1,f2,f3)]
-		for n,k in enumerate(('',maybe_compressed,maybe_segwit)):
+	def Privhex2addr(self,name,f1,f2,f3,f4):
+		keys = [read_from_file(f).rstrip() for f in (f1,f2,f3,f4)]
+		for n,k in enumerate(('',maybe_compressed,maybe_segwit,maybe_bech32)):
 			ao = ['--type='+k] if k else []
 			ret = self.run_cmd(name,[keys[n]],add_opts=ao).rstrip()
 			iaddr = read_from_tmpfile(cfg,'Randpair{}.out'.format(n+1)).split()[-1]
+			vmsg('Out: {}'.format(ret))
 			cmp_or_die(iaddr,ret)
 	def Hex2wif(self,name,f1,f2,f3,f4):
 		for n,fi,fo,k in ((1,f1,f2,''),(2,f3,f4,maybe_compressed)):
 			ao = ['--type='+k] if k else []
 			ret = self.run_cmd_chk(name,fi,fo,add_opts=ao)
-	def Addr2hexaddr(self,name,f1,f2):
-		for n,f,m in ((1,f1,''),(2,f2,'from {}'.format(maybe_compressed))):
+	def Addr2hexaddr(self,name,f1,f2,f3,f4):
+		for n,f,m,ao in (
+			(1,f1,'',[]),
+			(2,f2,'from {}'.format(maybe_compressed),[]),
+			(4,f4,'',maybe_type_bech32),
+			):
 			addr = read_from_file(f).split()[-1]
-			self.run_cmd_out(name,addr,fn_idx=n,extra_msg=m)
-	def Pubhash2addr(self,name,f1,f2,f3,f4):
-		for n,fi,fo,m in ((1,f1,f2,''),(2,f3,f4,'from {}'.format(maybe_compressed))):
-			self.run_cmd_chk(name,fi,fo,extra_msg=m)
+			self.run_cmd_out(name,addr,fn_idx=n,add_opts=ao,extra_msg=m)
+	def Pubhash2addr(self,name,f1,f2,f3,f4,f5,f6,f7,f8):
+		for n,fi,fo,m,ao in (
+			(1,f1,f2,'',[]),
+			(2,f3,f4,'from {}'.format(maybe_compressed),[]),
+			(4,f7,f8,'',maybe_type_bech32)
+			):
+			self.run_cmd_chk(name,fi,fo,add_opts=ao,extra_msg=m)
 	def Privhex2pubhex(self,name,f1,f2,f3): # from Hex2wif
 		addr = read_from_file(f3).strip()
 		self.run_cmd_out(name,addr,add_opts=maybe_type_compressed,fn_idx=3) # what about uncompressed?