swap.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #!/usr/bin/env python3
  2. """
  3. test.modtest_d.swap: swap unit tests for the MMGen suite
  4. """
  5. from mmgen.color import cyan
  6. from ..include.common import cfg, vmsg, make_burn_addr
  7. from mmgen.swap.proto.thorchain import SwapAsset
  8. class unit_tests:
  9. def asset(self, name, ut, desc='SwapAsset class'):
  10. for name, full_name, memo_name, chain, asset, direction in (
  11. ('BTC', 'BTC.BTC', 'b', 'BTC', None, 'recv'),
  12. ('LTC', 'LTC.LTC', 'l', 'LTC', None, 'recv'),
  13. ('BCH', 'BCH.BCH', 'c', 'BCH', None, 'recv'),
  14. ):
  15. a = SwapAsset(name, direction)
  16. vmsg(f' {a.name}')
  17. assert a.name == name
  18. assert a.full_name == full_name
  19. assert a.direction == direction
  20. assert a.asset == asset
  21. assert a.chain == chain
  22. assert a.memo_asset_name == memo_name
  23. return True
  24. def memo(self, name, ut, desc='Swap transaction memo'):
  25. from mmgen.protocol import init_proto
  26. from mmgen.amt import UniAmt
  27. from mmgen.swap.proto.thorchain import Memo
  28. for coin, addrtype, asset_name, token in (
  29. ('ltc', 'bech32', 'LTC', None),
  30. ('bch', 'compressed', 'BCH', None),
  31. ('eth', None, 'ETH', None),
  32. ):
  33. proto = init_proto(cfg, coin, tokensym=token, need_amt=True)
  34. addr = make_burn_addr(proto, addrtype)
  35. asset = SwapAsset(asset_name, 'recv')
  36. vmsg(f'\nTesting asset {cyan(asset_name)}:')
  37. for limit, limit_chk in (
  38. ('123.4567', 12340000000),
  39. ('1.234567', 123400000),
  40. ('0.01234567', 1234000),
  41. ('0.00012345', 12345),
  42. (None, 0),
  43. ):
  44. vmsg('\nTesting memo initialization:')
  45. m = Memo(proto, asset, addr, trade_limit=UniAmt(limit) if limit else None)
  46. vmsg(f'str(memo): {m}')
  47. vmsg(f'repr(memo): {m!r}')
  48. vmsg(f'limit: {limit}')
  49. p = Memo.parse(m)
  50. limit_dec = UniAmt(p.trade_limit, from_unit='satoshi')
  51. vmsg(f'limit_dec: {limit_dec.hl()}')
  52. vmsg('\nTesting memo parsing:')
  53. from pprint import pformat
  54. vmsg(pformat(p._asdict()))
  55. assert p.proto == 'THORChain'
  56. assert p.function == 'SWAP'
  57. assert p.chain == coin.upper()
  58. assert p.asset == token or coin.upper()
  59. assert p.address == addr.views[addr.view_pref]
  60. assert p.trade_limit == limit_chk
  61. assert p.stream_interval == 1
  62. assert p.stream_quantity == 0 # auto
  63. vmsg('\nTesting is_partial_memo():')
  64. for vec in (
  65. str(m),
  66. 'SWAP:xyz',
  67. '=:xyz',
  68. 's:xyz',
  69. 'a:xz',
  70. '+:xz',
  71. 'WITHDRAW:xz',
  72. 'LOAN+:xz:x:x',
  73. 'TRADE-:xz:x:x',
  74. 'BOND:xz',
  75. ):
  76. vmsg(f' pass: {vec}')
  77. assert Memo.is_partial_memo(vec.encode('ascii')), vec
  78. for vec in (
  79. '=',
  80. 'swap',
  81. 'swap:',
  82. 'swap:abc',
  83. 'SWAP:a',
  84. ):
  85. vmsg(f' fail: {vec}')
  86. assert not Memo.is_partial_memo(vec.encode('ascii')), vec
  87. vmsg('\nTesting error handling:')
  88. def bad(s):
  89. return lambda: Memo.parse(s)
  90. def bad10():
  91. coin = 'BTC'
  92. proto = init_proto(cfg, coin, need_amt=True)
  93. addr = make_burn_addr(proto, 'C')
  94. asset = SwapAsset(coin, 'send')
  95. Memo(proto, asset, addr)
  96. def bad11():
  97. SwapAsset('XYZ', 'send')
  98. def bad12():
  99. SwapAsset('DOGE', 'send')
  100. ut.process_bad_data((
  101. ('bad1', 'SwapMemoParseError', 'must contain', bad('x')),
  102. ('bad2', 'SwapMemoParseError', 'must contain', bad('y:z:x')),
  103. ('bad3', 'SwapMemoParseError', 'function abbrev', bad('z:l:foobar:0/1/0')),
  104. ('bad4', 'SwapAssetError', 'unrecognized', bad('=:x:foobar:0/1/0')),
  105. ('bad5', 'SwapMemoParseError', 'failed to parse', bad('=:l:foobar:n')),
  106. ('bad6', 'SwapMemoParseError', 'invalid specifier', bad('=:l:foobar:x/1/0')),
  107. ('bad7', 'SwapMemoParseError', 'extra', bad('=:l:foobar:0/1/0:x')),
  108. ('bad10', 'AssertionError', 'recv', bad10),
  109. ('bad11', 'SwapAssetError', 'unrecognized', bad11),
  110. ('bad12', 'SwapAssetError', 'unsupported', bad12),
  111. ), pfx='')
  112. return True