Browse Source

THORChainMemo.parse(): return `SwapAsset` instance in tuple

The MMGen Project 6 months ago
parent
commit
9e280bed37
4 changed files with 17 additions and 13 deletions
  1. 7 3
      mmgen/swap/asset.py
  2. 4 4
      mmgen/swap/proto/thorchain/memo.py
  3. 4 4
      mmgen/tx/completed.py
  4. 2 2
      test/modtest_d/swap.py

+ 7 - 3
mmgen/swap/asset.py

@@ -50,10 +50,10 @@ class SwapAsset:
 		return '\n'.join(gen_good()) + '\n'.join(gen_bad())
 
 	@classmethod
-	def get_full_name(cls, s):
+	def init_from_memo(cls, s):
 		for d in cls.assets_data.values():
 			if s in (d.abbr, d.full_name):
-				return d.full_name or f'{d.name}.{d.name}'
+				return cls(d.name or d.full_name, 'recv')
 		die('SwapAssetError', f'{s!r}: unrecognized asset name or abbreviation')
 
 	@property
@@ -86,7 +86,11 @@ class SwapAsset:
 
 	@property
 	def short_name(self):
-		return self.asset or self.chain
+		return self.data.name or self.data.full_name.split('.', 1)[1]
+
+	@property
+	def tokensym(self):
+		return None if self.data.name else self.data.full_name.split('.', 1)[1]
 
 	@property
 	def memo_asset_name(self):

+ 4 - 4
mmgen/swap/proto/thorchain/memo.py

@@ -72,11 +72,11 @@ class THORChainMemo:
 
 		function = get_id(cls.function_abbrevs, get_item('function'), 'function')
 
-		chain, asset = SwapAsset.get_full_name(get_item('asset')).split('.')
+		asset = SwapAsset.init_from_memo(get_item('asset'))
 
 		address = get_item('address')
 
-		if chain in SwapAsset.evm_chains:
+		if asset.chain in SwapAsset.evm_chains:
 			assert address.startswith('0x'), f'{address}: address does not start with ‘0x’'
 			assert len(address) == 42, f'{address}: address has incorrect length ({len(address)} != 42)'
 			address = address.removeprefix('0x')
@@ -104,9 +104,9 @@ class THORChainMemo:
 
 		ret = namedtuple(
 			'parsed_memo',
-			['proto', 'function', 'chain', 'asset', 'address', 'trade_limit', 'stream_interval', 'stream_quantity'])
+			['proto', 'function', 'asset', 'address', 'trade_limit', 'stream_interval', 'stream_quantity'])
 
-		return ret(proto_name, function, chain, asset, address, limit_int, int(interval), int(quantity))
+		return ret(proto_name, function, asset, address, limit_int, int(interval), int(quantity))
 
 	def __init__(self, swap_cfg, proto, asset, addr, *, trade_limit):
 

+ 4 - 4
mmgen/tx/completed.py

@@ -83,14 +83,14 @@ class Completed(Base):
 				from ..protocol import init_proto
 				text = memo_bytes.decode('ascii')
 				p = Memo.parse(text)
+				r = self.recv_asset
 				assert p.function == 'SWAP', f'‘{p.function}’: unsupported function in swap memo ‘{text}’'
-				aname = p.chain + (f'.{p.asset}' if p.asset != p.chain else '')
-				assert aname == self.recv_asset.name, f'invalid memo: {aname} != {self.recv_asset.name}'
+				assert p.asset.name == r.name, f'invalid memo: {p.asset.name} != {r.name}'
 				proto = init_proto(
 						self.cfg,
-						p.chain,
+						r.coin,
 						network = self.cfg.network,
-						tokensym = None if p.chain == p.asset else p.asset,
+						tokensym = r.tokensym,
 						need_amt = True)
 				if mmid := getattr(self, 'swap_recv_addr_mmid', None):
 					pass

+ 2 - 2
test/modtest_d/swap.py

@@ -123,8 +123,8 @@ class unit_tests:
 				vmsg(pformat(p._asdict()))
 				assert p.proto == 'THORChain'
 				assert p.function == 'SWAP'
-				assert p.chain == coin.upper()
-				assert p.asset == token or coin.upper()
+				assert p.asset.chain == coin.upper()
+				assert p.asset.coin == token or coin.upper()
 				assert p.address == addr.views[addr.view_pref]
 				assert p.trade_limit == limit_chk
 				assert p.stream_interval == si or swap_cfg.si.dfl, f'{p.stream_interval} != {swap_cfg.si.dfl}'