xmrwallet: uopt -> self.cfg

This commit is contained in:
The MMGen Project 2023-04-18 18:35:54 +00:00
commit 6cf89a85e4
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
2 changed files with 47 additions and 59 deletions

View file

@ -26,7 +26,11 @@ from collections import namedtuple
import mmgen.opts as opts
from .cfg import gc,Config
from .util import ymsg,die,async_run
from .xmrwallet import xmrwallet_uarg_info,MoneroWalletOps
from .xmrwallet import (
MoneroWalletOps,
xmrwallet_uarg_info,
xmrwallet_uargs,
)
opts_data = {
'text': {
@ -255,31 +259,9 @@ elif op in ('new','transfer','sweep','label'):
cfg._opts.usage()
spec = cmd_args[0]
ua = namedtuple('uargs',[ 'op', 'infile', 'wallets', 'spec' ])
uo = namedtuple('uopts',[
'daemon',
'tx_relay_daemon',
'restore_height',
'rescan_blockchain',
'no_start_wallet_daemon',
'no_stop_wallet_daemon',
'no_relay',
'wallet_dir',
])
uargs = ua( op, infile, wallets, spec )
uopts = uo(
cfg.daemon or '',
cfg.tx_relay_daemon or '',
cfg.restore_height or 0,
cfg.rescan_blockchain,
cfg.no_start_wallet_daemon,
cfg.no_stop_wallet_daemon,
cfg.no_relay,
cfg.wallet_dir,
)
m = getattr(MoneroWalletOps,op)(cfg,uargs,uopts)
m = getattr(MoneroWalletOps,op)(
cfg,
xmrwallet_uargs(op, infile, wallets, spec))
try:
if async_run(m.main()):

View file

@ -50,6 +50,13 @@ from .proto.xmr.rpc import MoneroRPCClient,MoneroWalletRPCClient
from .proto.xmr.daemon import MoneroWalletDaemon
from .ui import keypress_confirm
xmrwallet_uargs = namedtuple('xmrwallet_uargs',[
'op',
'infile',
'wallets',
'spec',
])
xmrwallet_uarg_info = (
lambda e,hp: {
'daemon': e('HOST:PORT', hp),
@ -284,7 +291,7 @@ class MoneroWalletOps:
opts = ('wallet_dir',)
def __init__(self,cfg,uarg_tuple,uopt_tuple):
def __init__(self,cfg,uarg_tuple):
def gen_classes():
for cls in type(self).__mro__:
@ -299,10 +306,9 @@ class MoneroWalletOps:
if not hasattr(self,'stem'):
self.stem = self.name
global uarg, uopt, uarg_info, fmt_amt, hl_amt
global uarg, uarg_info, fmt_amt, hl_amt
uarg = uarg_tuple
uopt = uopt_tuple
uarg_info = xmrwallet_uarg_info
def fmt_amt(amt):
@ -321,7 +327,7 @@ class MoneroWalletOps:
def check_uopts(self):
def check_pat_opt(name):
val = getattr(uopt,name)
val = getattr(self.cfg,name)
if not re.fullmatch( uarg_info[name].pat, val, re.ASCII ):
die(1,'{!r}: invalid value for --{}: it must have format {!r}'.format(
val,
@ -329,21 +335,21 @@ class MoneroWalletOps:
uarg_info[name].annot
))
for opt in uopt._asdict():
if getattr(uopt,opt) and not opt in self.opts:
for attr in self.cfg.__dict__:
if attr in MoneroWalletOps.opts and not attr in self.opts:
die(1,'Option --{} not supported for {!r} operation'.format(
opt.replace('_','-'),
attr.replace('_','-'),
uarg.op
))
for opt in MoneroWalletOps.pat_opts:
if getattr(uopt,opt):
if getattr(self.cfg,opt,None):
check_pat_opt(opt)
def display_tx_relay_info(self,indent=''):
m = re.fullmatch(
uarg_info['tx_relay_daemon'].pat,
uopt.tx_relay_daemon,
self.cfg.tx_relay_daemon,
re.ASCII )
msg(fmt(f"""
TX relay info:
@ -368,7 +374,7 @@ class MoneroWalletOps:
)
wallet_exists = True
def __init__(self,cfg,uarg_tuple,uopt_tuple):
def __init__(self,cfg,uarg_tuple):
def wallet_exists(fn):
try: os.stat(fn)
@ -384,7 +390,7 @@ class MoneroWalletOps:
elif not exists and self.wallet_exists:
die(1,f'Wallet {fn!r} not found!')
super().__init__(cfg,uarg_tuple,uopt_tuple)
super().__init__(cfg,uarg_tuple)
self.kal = KeyAddrList(
cfg = cfg,
@ -399,9 +405,9 @@ class MoneroWalletOps:
self.wd = MoneroWalletDaemon(
cfg = self.cfg,
proto = self.proto,
wallet_dir = uopt.wallet_dir or '.',
wallet_dir = self.cfg.wallet_dir or '.',
test_suite = self.cfg.test_suite,
daemon_addr = uopt.daemon or None,
daemon_addr = self.cfg.daemon or None,
)
self.c = MoneroWalletRPCClient(
@ -410,7 +416,7 @@ class MoneroWalletOps:
test_connection = False,
)
if not uopt.no_start_wallet_daemon:
if not self.cfg.no_start_wallet_daemon:
async_run(self.c.restart_daemon())
def create_addr_data(self):
@ -423,12 +429,12 @@ class MoneroWalletOps:
self.addr_data = self.kal.data
async def stop_wallet_daemon(self):
if not uopt.no_stop_wallet_daemon:
if not self.cfg.no_stop_wallet_daemon:
await self.c.stop_daemon()
def get_wallet_fn(self,d):
return os.path.join(
uopt.wallet_dir or '.','{}-{}-MoneroWallet{}'.format(
self.cfg.wallet_dir or '.','{}-{}-MoneroWallet{}'.format(
self.kal.al_id.sid,
d.idx,
f'.{self.cfg.network}' if self.cfg.network != 'mainnet' else ''))
@ -649,8 +655,8 @@ class MoneroWalletOps:
opts = ('restore_height',)
def check_uopts(self):
if int(uopt.restore_height) < 0:
die(1,f"{uopt.restore_height}: invalid value for --restore-height (less than zero)")
if int(self.cfg.restore_height or 0) < 0:
die(1,f'{self.cfg.restore_height}: invalid value for --restore-height (less than zero)')
async def process_wallet(self,d,fn,last):
msg_r('') # for pexpect
@ -661,7 +667,7 @@ class MoneroWalletOps:
filename = os.path.basename(fn),
password = d.wallet_passwd,
seed = xmrseed().fromhex(d.sec.wif,tostr=True),
restore_height = uopt.restore_height,
restore_height = self.cfg.restore_height,
language = 'English' )
pp_msg(ret) if self.cfg.debug else msg(' Address: {}'.format( ret['address'] ))
@ -671,11 +677,11 @@ class MoneroWalletOps:
name = 'sync'
opts = ('rescan_blockchain',)
def __init__(self,cfg,uarg_tuple,uopt_tuple):
def __init__(self,cfg,uarg_tuple):
super().__init__(cfg,uarg_tuple,uopt_tuple)
super().__init__(cfg,uarg_tuple)
host,port = uopt.daemon.split(':') if uopt.daemon else ('localhost',self.wd.daemon_port)
host,port = self.cfg.daemon.split(':') if self.cfg.daemon else ('localhost',self.wd.daemon_port)
from .daemon import CoinDaemon
self.dc = MoneroRPCClient(
@ -725,7 +731,7 @@ class MoneroWalletOps:
if wallet_height >= chain_height:
break
ymsg(f' Wallet failed to sync (wallet height [{wallet_height}] < chain height [{chain_height}])')
if i or not uopt.rescan_blockchain:
if i or not self.cfg.rescan_blockchain:
break
msg_r(' Rescanning blockchain, please be patient...')
self.c.call('rescan_blockchain')
@ -853,13 +859,13 @@ class MoneroWalletOps:
m = re.fullmatch(
uarg_info['tx_relay_daemon'].pat,
uopt.tx_relay_daemon,
self.cfg.tx_relay_daemon,
re.ASCII )
wd2 = MoneroWalletDaemon(
cfg = self.cfg,
proto = self.proto,
wallet_dir = uopt.wallet_dir or '.',
wallet_dir = self.cfg.wallet_dir or '.',
test_suite = self.cfg.test_suite,
daemon_addr = m[1],
proxy = m[2] )
@ -934,18 +940,18 @@ class MoneroWalletOps:
msg('\n' + new_tx.get_info(indent=' '))
if uopt.tx_relay_daemon:
if self.cfg.tx_relay_daemon:
self.display_tx_relay_info(indent=' ')
msg('Saving TX data to file')
new_tx.write(delete_metadata=True)
if uopt.no_relay:
if self.cfg.no_relay:
return True
if keypress_confirm( self.cfg, f'Relay {self.name} transaction?' ):
w_desc = 'source'
if uopt.tx_relay_daemon:
if self.cfg.tx_relay_daemon:
await h.stop_wallet('source')
msg('')
self.init_tx_relay_daemon()
@ -988,7 +994,7 @@ class MoneroWalletOps:
h.print_addrs(accts_data,self.account)
# wallet must be left open: otherwise the 'stop_wallet' RPC call used to stop the daemon will fail
if uopt.no_stop_wallet_daemon:
if self.cfg.no_stop_wallet_daemon:
h.close_wallet('Monero')
msg('')
@ -1052,11 +1058,11 @@ class MoneroWalletOps:
name = 'relay'
opts = ('tx_relay_daemon',)
def __init__(self,cfg,uarg_tuple,uopt_tuple):
def __init__(self,cfg,uarg_tuple):
super().__init__(cfg,uarg_tuple,uopt_tuple)
super().__init__(cfg,uarg_tuple)
if uopt.tx_relay_daemon:
if self.cfg.tx_relay_daemon:
m = re.fullmatch(
uarg_info['tx_relay_daemon'].pat,
self.cfg.tx_relay_daemon,
@ -1086,7 +1092,7 @@ class MoneroWalletOps:
async def main(self):
msg('\n' + self.tx.get_info())
if uopt.tx_relay_daemon:
if self.cfg.tx_relay_daemon:
self.display_tx_relay_info()
if keypress_confirm( self.cfg, 'Relay transaction?' ):