tool_api_test.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
  4. # Copyright (C)2013-2023 The MMGen Project <mmgen@tuta.io>
  5. """
  6. test.misc.tool_api_test: test the MMGen suite tool API
  7. """
  8. import sys,os
  9. from mmgen.common import *
  10. from mmgen.key import PrivKey
  11. from mmgen.addr import CoinAddr
  12. keys = [
  13. '118089d66b4a5853765e94923abdd5de4616c6e5118089d66b4a5853765e9492',
  14. 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
  15. ]
  16. def check_equal(a,b):
  17. assert a == b, f'{a} != {b}'
  18. def msg(*args,**kwargs):
  19. print(*args,**kwargs,file=sys.stdout)
  20. def init_coin(t,coinsym,network,addrtype):
  21. t.init_coin(coinsym,network)
  22. t.addrtype = addrtype
  23. check_equal(type(t.addrtype).__name__,'MMGenAddrType')
  24. msg(f'\n{t.coin} {t.proto.network.capitalize()} {t.addrtype.name.upper()} ({t.addrtype})')
  25. def test_randpair(t):
  26. wif,addr = t.randpair()
  27. wif_chk = PrivKey(proto=t.proto,wif=wif).wif
  28. check_equal(wif,wif_chk)
  29. msg('\n === randwif ===')
  30. msg(' wif:',wif)
  31. msg(' addr:',CoinAddr(proto=t.proto,addr=addr))
  32. def test_wif2addr(t,wif_chk,addr_chk,key_idx):
  33. key_bytes = bytes.fromhex(keys[key_idx])
  34. wif = PrivKey(
  35. proto = t.proto,
  36. s = key_bytes,
  37. compressed = t.addrtype.compressed,
  38. pubkey_type = t.addrtype.pubkey_type ).wif
  39. addr = t.wif2addr(wif)
  40. msg('\n === wif2addr ===')
  41. msg(' wif:',PrivKey(proto=t.proto,wif=wif).wif)
  42. msg(' addr:',CoinAddr(proto=t.proto,addr=addr))
  43. addr_ph = t.privhex2addr(key_bytes.hex())
  44. check_equal(addr,addr_ph)
  45. check_equal(wif,wif_chk)
  46. check_equal(addr,addr_chk)
  47. def test_triplet(tool,coin,network,addrtype,key_idx,wif_chk,addr_chk):
  48. init_coin(tool,coin,network,addrtype)
  49. test_randpair(tool)
  50. test_wif2addr(tool,wif_chk,addr_chk,key_idx)
  51. def run_test():
  52. from mmgen.tool.api import tool_api
  53. tool = tool_api()
  54. tool.coins
  55. tool.print_addrtypes()
  56. tool.usr_randchars # getter
  57. tool.usr_randchars = 0 # setter
  58. check_equal(tool.usr_randchars,0)
  59. check_equal(f'{tool.coin} {tool.proto.cls_name} {tool.addrtype}', 'BTC mainnet L' )
  60. # test vectors from tooltest2.py:
  61. test_triplet(tool,'btc','mainnet','L',0,
  62. '5HwzecKMWD82ppJK3qMKpC7ohXXAwcyAN5VgdJ9PLFaAzpBG4sX',
  63. '1C5VPtgq9xQ6AcTgMAR3J6GDrs72HC4pS1' )
  64. test_triplet(tool,'btc','mainnet','C',0,
  65. 'KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm',
  66. '1Kz9fVSUMshzPejpzW9D95kScgA3rY6QxF' )
  67. test_triplet(tool,'btc','mainnet','segwit',0,
  68. 'KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm',
  69. '3AhjTiWHhVJAi1s5CfKMcLzYps12x3gZhg' )
  70. test_triplet(tool,'btc','mainnet','B',0,
  71. 'KwojSzt1VvW343mQfWQi3J537siAt5ktL2qbuCg1ZyKR8BLQ6UJm',
  72. 'bc1q6pqnfwwakuuejpm9w52ds342f9d5u36v0qnz7c' )
  73. if not 'no_altcoin' in sys.argv:
  74. test_triplet(tool,'ltc','regtest','bech32',1,
  75. 'cV3ZRqf8PhyfiFwtJfkvGu2qmBsazE1wXoA2A16S3nixb3BTvvVx',
  76. 'rltc1qvmqas4maw7lg9clqu6kqu9zq9cluvllnz4kj9y' )
  77. test_triplet(tool,'xmr','mainnet','M',1,
  78. 'e8164dda6d42bd1e261a3406b2038dcbddadbeefdeadbeefdeadbeefdeadbe0f',
  79. '41i7saPWA53EoHenmJVRt34dubPxsXwoWMnw8AdMyx4mTD1svf7qYzcVjxxRfteLNdYrAxWUMmiPegFW9EfoNgXx7vDMExv' ),
  80. test_triplet(tool,'etc','mainnet','E',1,
  81. 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
  82. 'c96aaa54e2d44c299564da76e1cd3184a2386b8d' ),
  83. test_triplet(tool,'zec','mainnet','Z',1,
  84. 'SKxuS56e99jpCeD9mMQ5o63zoGPakNdM9HCvt4Vt2cypvRjCdvGJ',
  85. 'zchFELwBxqsAubsLQ8yZgPCDDGukjXJssgCbiTPwFNmFwn9haLnDatzfhLdZzJT4PcU4o2yr92B52UFirUzEdF6ZYM2gBkM' )
  86. run_test()