From fbe4961deb768b331c609f0257e2936b8680abd2 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 4 Mar 2024 10:30:37 +0000 Subject: [PATCH] =?UTF-8?q?TwCtl:=20add=20`no=5Frpc`=20arg;=20don=E2=80=99?= =?UTF-8?q?t=20require=20RPC=20to=20instantiate=20token=20TXs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mmgen/main_addrimport.py | 5 +---- mmgen/proto/btc/tw/ctl.py | 4 ++++ mmgen/proto/eth/tw/ctl.py | 14 +++++++++++--- mmgen/proto/eth/tw/rpc.py | 16 +++++----------- mmgen/tw/ctl.py | 11 +++++------ mmgen/tx/__init__.py | 2 +- test/cmdtest_py_d/ct_automount_eth.py | 2 +- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/mmgen/main_addrimport.py b/mmgen/main_addrimport.py index 1178a4b3..a604050e 100755 --- a/mmgen/main_addrimport.py +++ b/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' diff --git a/mmgen/proto/btc/tw/ctl.py b/mmgen/proto/btc/tw/ctl.py index 65d60168..a9aa8cfc 100755 --- a/mmgen/proto/btc/tw/ctl.py +++ b/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) diff --git a/mmgen/proto/eth/tw/ctl.py b/mmgen/proto/eth/tw/ctl.py index 5eb446e4..7572751a 100755 --- a/mmgen/proto/eth/tw/ctl.py +++ b/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) diff --git a/mmgen/proto/eth/tw/rpc.py b/mmgen/proto/eth/tw/rpc.py index 729b784d..f9439932 100755 --- a/mmgen/proto/eth/tw/rpc.py +++ b/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 diff --git a/mmgen/tw/ctl.py b/mmgen/tw/ctl.py index 6db090ff..ff39dd13 100755 --- a/mmgen/tw/ctl.py +++ b/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( diff --git a/mmgen/tx/__init__.py b/mmgen/tx/__init__.py index e33dd148..cf705c0c 100755 --- a/mmgen/tx/__init__.py +++ b/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) diff --git a/test/cmdtest_py_d/ct_automount_eth.py b/test/cmdtest_py_d/ct_automount_eth.py index b346d9e8..1d69e28d 100755 --- a/test/cmdtest_py_d/ct_automount_eth.py +++ b/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):