Browse Source

TwCtl: add `no_rpc` arg; don’t require RPC to instantiate token TXs

The MMGen Project 1 year ago
parent
commit
fbe4961deb

+ 1 - 4
mmgen/main_addrimport.py

@@ -149,13 +149,10 @@ async def main():
 	if cfg.token or cfg.token_addr:
 		msg(f'Importing for token {twctl.token.hl()} ({twctl.token.hlc(proto.tokensym)})')
 
-	from .rpc import rpc_init
-	twctl.rpc = await rpc_init(cfg,proto)
-
 	for k,v in addrimport_msgs.items():
 		addrimport_msgs[k] = fmt(v,indent='  ',strip_char='\t').rstrip()
 
-	al,infile = parse_cmd_args(twctl.rpc,cfg._args)
+	al, infile = parse_cmd_args(twctl.rpc, cfg._args)
 
 	cfg._util.qmsg(
 		f'OK. {al.num_addrs} addresses'

+ 4 - 0
mmgen/proto/btc/tw/ctl.py

@@ -124,3 +124,7 @@ class BitcoinTwCtl(TwCtl):
 			msg('Address has no balance' if len(coin_addrs) == 1 else
 				'Addresses have no balances' )
 			return True
+
+	async def get_addr_label_pairs(self, twmmid):
+		from .rpc import TwRPC
+		return await TwRPC(proto=self.proto, rpc=self.rpc, twctl=self).get_addr_label_pairs(twmmid)

+ 11 - 3
mmgen/proto/eth/tw/ctl.py

@@ -22,7 +22,8 @@ proto.eth.tw.ctl: Ethereum tracking wallet control class
 
 from ....util import msg,ymsg,die
 from ....tw.ctl import TwCtl,write_mode
-from ....addr import is_coin_addr,is_mmgen_id
+from ....tw.shared import TwLabel
+from ....addr import is_coin_addr,is_mmgen_id,CoinAddr
 from ..contract import Token,ResolvedToken
 
 class EthereumTwCtl(TwCtl):
@@ -165,6 +166,13 @@ class EthereumTwCtl(TwCtl):
 	def mmid_ordered_dict(self):
 		return dict((x['mmid'],{'addr':x['addr'],'comment':x['comment']}) for x in self.sorted_list)
 
+	async def get_addr_label_pairs(self,twmmid):
+		ret = [(
+				TwLabel(self.proto, mmid + ' ' + d['comment']),
+				CoinAddr(self.proto, d['addr'])
+			) for mmid, d in self.mmid_ordered_dict.items()]
+		return [e for e in ret if e[0].mmid == twmmid] or None
+
 class EthereumTokenTwCtl(EthereumTwCtl):
 
 	desc = 'Ethereum token tracking wallet'
@@ -172,9 +180,9 @@ class EthereumTokenTwCtl(EthereumTwCtl):
 	symbol = None
 	cur_eth_balances = {}
 
-	async def __init__(self,cfg,proto,mode='r',token_addr=None):
+	async def __init__(self, cfg, proto, mode='r', token_addr=None, no_rpc=False):
 
-		await super().__init__(cfg,proto,mode=mode)
+		await super().__init__(cfg, proto, mode=mode, no_rpc=no_rpc)
 
 		for v in self.data['tokens'].values():
 			self.conv_types(v)

+ 5 - 11
mmgen/proto/eth/tw/rpc.py

@@ -18,17 +18,11 @@ from ....tw.rpc import TwRPC
 
 class EthereumTwRPC(TwRPC):
 
-	async def get_addr_label_pairs(self,twmmid=None):
-
-		ret = [(
-				TwLabel( self.proto, mmid + ' ' + d['comment'] ),
-				CoinAddr( self.proto, d['addr'] )
-			) for mmid,d in self.twctl.mmid_ordered_dict.items() ]
-
-		if twmmid:
-			ret = [e for e in ret if e[0].mmid == twmmid]
-
-		return ret or None
+	async def get_addr_label_pairs(self):
+		return [(
+				TwLabel(self.proto, mmid + ' ' + d['comment']),
+				CoinAddr(self.proto, d['addr'])
+			) for mmid, d in self.twctl.mmid_ordered_dict.items()] or None
 
 class EthereumTokenTwRPC(EthereumTwRPC):
 	pass

+ 5 - 6
mmgen/tw/ctl.py

@@ -61,6 +61,7 @@ class TwCtl(MMGenObject,metaclass=AsyncInit):
 			proto,
 			mode              = 'r',
 			token_addr        = None,
+			no_rpc            = False,
 			rpc_ignore_wallet = False):
 
 		assert mode in ('r','w','i'), f"{mode!r}: wallet mode must be 'r','w' or 'i'"
@@ -68,9 +69,9 @@ class TwCtl(MMGenObject,metaclass=AsyncInit):
 			self.importing = True
 			mode = 'w'
 
-		# TODO: create on demand - only certain ops require RPC
 		self.cfg = cfg
-		self.rpc = await rpc_init( cfg, proto, ignore_wallet=rpc_ignore_wallet )
+		if not no_rpc:
+			self.rpc = await rpc_init(cfg, proto, ignore_wallet=rpc_ignore_wallet)
 		self.proto = proto
 		self.mode = mode
 		self.desc = self.base_desc = f'{self.proto.name} tracking wallet'
@@ -226,8 +227,7 @@ class TwCtl(MMGenObject,metaclass=AsyncInit):
 			msg(f'{addrspec!r}: invalid address for this network')
 			return None
 
-		from .rpc import TwRPC
-		pairs = await TwRPC(proto=self.proto,rpc=self.rpc,twctl=self).get_addr_label_pairs(twmmid)
+		pairs = await self.get_addr_label_pairs(twmmid)
 
 		if not pairs:
 			msg(f'MMGen address {twmmid!r} not found in tracking wallet')
@@ -277,8 +277,7 @@ class TwCtl(MMGenObject,metaclass=AsyncInit):
 
 		if await self.set_label(res.coinaddr,lbl):
 			# redundant paranoia step:
-			from .rpc import TwRPC
-			pairs = await TwRPC(proto=self.proto,rpc=self.rpc,twctl=self).get_addr_label_pairs(res.twmmid)
+			pairs = await self.get_addr_label_pairs(res.twmmid)
 			assert pairs[0][0].comment == comment, f'{pairs[0][0].comment!r} != {comment!r}'
 			if not silent:
 				desc = '{} address {} in tracking wallet'.format(

+ 1 - 1
mmgen/tx/__init__.py

@@ -82,7 +82,7 @@ async def _get_obj_async(_clsname, _modname, **kwargs):
 			'Sent',
 			'AutomountSent'):
 		from ..tw.ctl import TwCtl
-		kwargs['twctl'] = await TwCtl(kwargs['cfg'], proto)
+		kwargs['twctl'] = await TwCtl(kwargs['cfg'], proto, no_rpc=True)
 
 	return _base_proto_subclass(clsname, modname, proto)(**kwargs)
 

+ 1 - 1
test/cmdtest_py_d/ct_automount_eth.py

@@ -48,8 +48,8 @@ class CmdTestAutosignETH(CmdTestAutosignThreaded, CmdTestEthdev):
 		('send_token_tx',          'sending a token transaction'),
 		('token_bal2',             f'the {cfg.coin} balance and token balance'),
 		('autosign_kill_thread',   'stopping autosign wait loop'),
-		('txview',                 'viewing transactions'),
 		('stop',                   'stopping daemon'),
+		('txview',                 'viewing transactions'),
 	)
 
 	def __init__(self, trunner, cfgs, spawn):