From 853d4ee29eabe9aca229f9ed84fc5b47acb25c1b Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 20 Apr 2023 17:07:34 +0000 Subject: [PATCH] autosign,xmrwallet: minor fixes and cleanups --- mmgen/autosign.py | 23 ++++++++++++++++------- mmgen/main_xmrwallet.py | 8 +++++--- mmgen/xmrwallet.py | 13 ++++++++----- test/test_py_d/ts_xmrwallet.py | 11 +++++------ 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/mmgen/autosign.py b/mmgen/autosign.py index 1b38a298..a9d228fc 100755 --- a/mmgen/autosign.py +++ b/mmgen/autosign.py @@ -37,13 +37,19 @@ class Signable: @property def unsigned(self): - if not hasattr(self,'_unsigned'): + return self._unprocessed( '_unsigned', self.rawext, self.sigext ) + + def _unprocessed(self,attrname,rawext,sigext): + if not hasattr(self,attrname): dirlist = tuple(os.scandir(self.dir)) names = tuple(f.name for f in dirlist) - self._unsigned = tuple(f for f in dirlist - if f.name.endswith('.'+self.rawext) - and f.name[:-len(self.rawext)]+self.sigext not in names) - return self._unsigned + setattr( + self, + attrname, + tuple(f for f in dirlist + if f.name.endswith('.' + rawext) + and f.name[:-len(rawext)] + sigext not in names) ) + return getattr(self,attrname) def print_bad_list(self,bad_files): msg('\n{a}\n{b}'.format( @@ -186,7 +192,10 @@ class Autosign: cfg.outdir = self.tx_dir cfg.passwd_file = self.keyfile - if 'coin' in cfg._uopts and not any(k in cfg._uopts for k in ('help','longhelp')): + if any(k in cfg._uopts for k in ('help','longhelp')): + return + + if 'coin' in cfg._uopts: die(1,'--coin option not supported with this command. Use --coins instead') self.coins = cfg.coins.upper().split(',') if cfg.coins else [] @@ -260,7 +269,7 @@ class Autosign: def do_umount(self): if os.path.ismount(self.mountpoint): run( ['sync'], check=True ) - msg(f'Unmounting {self.mountpoint}') + msg(f'Unmounting {self.mountpoint!r}') run( ['umount',self.mountpoint], check=True ) def decrypt_wallets(self): diff --git a/mmgen/main_xmrwallet.py b/mmgen/main_xmrwallet.py index 9d298e35..d6df41bd 100755 --- a/mmgen/main_xmrwallet.py +++ b/mmgen/main_xmrwallet.py @@ -238,12 +238,11 @@ if len(cmd_args) < 2: op = cmd_args.pop(0) infile = cmd_args.pop(0) +wallets = spec = None if op not in MoneroWalletOps.ops: die(1,f'{op!r}: unrecognized operation') -wallets = spec = '' - if op == 'relay': if len(cmd_args) != 0: cfg._opts.usage() @@ -268,5 +267,8 @@ try: m.post_main() except KeyboardInterrupt: ymsg('\nUser interrupt') -finally: + +try: async_run(m.stop_wallet_daemon()) +except Exception as e: + ymsg(f'Unable to stop wallet daemon: {type(e).__name__}: {e}') diff --git a/mmgen/xmrwallet.py b/mmgen/xmrwallet.py index cd5ecb57..a79f5d7c 100755 --- a/mmgen/xmrwallet.py +++ b/mmgen/xmrwallet.py @@ -127,13 +127,14 @@ class MoneroMMGenFile: @property def full_chksum(self): - return self.make_chksum(self.full_chksum_fields) + return self.make_chksum(self.full_chksum_fields) if self.full_chksum_fields else None def check_checksums(self,d_wrap): for k in ('base_chksum','full_chksum'): a = getattr(self,k) - b = d_wrap[k] - assert a == b, f'{k} mismatch: {a} != {b}' + if a is not None: + b = d_wrap[k] + assert a == b, f'{k} mismatch: {a} != {b}' def make_wrapped_data(self,in_data): return json.dumps( @@ -144,6 +145,7 @@ class MoneroMMGenFile: } }, cls = json_encoder, + indent = 4, ) def extract_data_from_file(self,cfg,fn): @@ -155,7 +157,6 @@ class MoneroMMGenTX: data_label = 'MoneroMMGenTX' base_chksum_fields = ('op','create_time','network','seed_id','source','dest','amount') - full_chksum_fields = ('op','create_time','network','seed_id','source','dest','amount','fee','blob') xmrwallet_tx_data = namedtuple('xmrwallet_tx_data',[ 'op', 'create_time', @@ -171,6 +172,7 @@ class MoneroMMGenTX: 'blob', 'metadata', ]) + full_chksum_fields = set(xmrwallet_tx_data._fields) - {'metadata'} def __init__(self): self.name = type(self).__name__ @@ -277,11 +279,12 @@ class MoneroMMGenTX: ) class NewSigned(New): - desc = 'signed transaction data' + desc = 'signed transaction' ext = 'sigtx' signed = True class Completed(Base): + desc = 'transaction' def __init__(self,cfg,fn): diff --git a/test/test_py_d/ts_xmrwallet.py b/test/test_py_d/ts_xmrwallet.py index 72158dd5..4cba2a5e 100755 --- a/test/test_py_d/ts_xmrwallet.py +++ b/test/test_py_d/ts_xmrwallet.py @@ -493,8 +493,8 @@ class TestSuiteXMRWallet(TestSuiteBase): amt = XMRAmt(strip_ansi_escapes(t.expect_getend('Amount: ')).replace('XMR','').strip()) dtype = 'signed' - t.expect(f'Save {dtype} transaction data? (y/N): ','y') - t.written_to_file(f'{dtype.capitalize()} transaction data') + t.expect(f'Save {dtype} transaction? (y/N): ','y') + t.written_to_file(f'{dtype.capitalize()} transaction') if not no_relay: t.expect(f'Relay {op} transaction? (y/N): ','y') @@ -544,20 +544,19 @@ class TestSuiteXMRWallet(TestSuiteBase): def transfer_to_miner_create2(self): return self.transfer_to_miner_create('0.0012') - def relay_tx(self,relay_opt=None,add_desc=None): + def relay_tx(self,relay_opt,add_desc=None): user = 'alice' data = self.users[user] - fn = get_file_with_ext(data.udir,'sigtx') add_desc = (', ' + add_desc) if add_desc else '' t = self.spawn( 'mmgen-xmrwallet', self.extra_opts - + ([relay_opt] if relay_opt else []) - + [ 'relay', fn ], + + [ relay_opt, 'relay', get_file_with_ext(data.udir,'sigtx') ], extra_desc = f'(relaying TX, {capfirst(user)}{add_desc})' ) t.expect('Relay transaction? ','y') t.read() t.ok() + return t async def transfer_to_miner_send1(self): self.relay_tx(f'--tx-relay-daemon={self.tx_relay_daemon_proxy_parm}',add_desc='via proxy')