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

This commit is contained in:
The MMGen Project 2024-03-04 10:30:37 +00:00
commit fbe4961deb
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
7 changed files with 28 additions and 26 deletions

View file

@ -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'

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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(

View file

@ -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)

View file

@ -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):