From bac7b716c5bd6817c40a653c701099eb76ae2745 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Fri, 23 Oct 2026 17:01:32 +0000 Subject: [PATCH] various changes and cleanups --- mmgen/autosign/signable.py | 13 ++++++++----- mmgen/main_txsend.py | 3 ++- mmgen/proto/xmr/tx/completed.py | 4 ++-- mmgen/proto/xmr/tx/online.py | 10 ++++++---- mmgen/proto/xmr/tx/unsigned.py | 5 +++-- mmgen/tx/file.py | 2 -- mmgen/xmrwallet/file/tx.py | 6 ++---- test/cmdtest_d/misc.py | 24 ++++++++++++++---------- test/cmdtest_d/xmr_autosign.py | 3 +++ test/cmdtest_d/xmrswap.py | 3 ++- 10 files changed, 42 insertions(+), 31 deletions(-) diff --git a/mmgen/autosign/signable.py b/mmgen/autosign/signable.py index a14378fe..16d0ba4b 100644 --- a/mmgen/autosign/signable.py +++ b/mmgen/autosign/signable.py @@ -254,18 +254,21 @@ class Signable: subext = 'subtx' async def sign(self, f, compat_call=False): + tx = await self.do_sign(f, compat_call=compat_call) + tx.write(ask_write=False) + return tx + + async def do_sign(self, f, compat_call=False): from .. import xmrwallet from ..xmrwallet.file.tx import MoneroMMGenTX - tx1 = MoneroMMGenTX.Completed(self.parent.xmrwallet_cfg, f) + tx = MoneroMMGenTX.Completed(self.parent.xmrwallet_cfg, f) m = xmrwallet.op( 'sign', self.parent.xmrwallet_cfg, infile = str(self.parent.wallet_files[0]), # MMGen wallet file - wallets = str(tx1.src_wallet_idx), + wallets = str(tx.src_wallet_idx), compat_call = compat_call) - tx2 = await m.main(f, restart_daemon=self.need_daemon_restart(m, tx1.src_wallet_idx)) - tx2.write(ask_write=False) - return tx2 + return await m.main(f, restart_daemon=self.need_daemon_restart(m, tx.src_wallet_idx)) class xmr_compat_transaction(xmr_transaction): desc = 'Monero compat transaction' diff --git a/mmgen/main_txsend.py b/mmgen/main_txsend.py index 83309f3b..2295067a 100644 --- a/mmgen/main_txsend.py +++ b/mmgen/main_txsend.py @@ -186,7 +186,8 @@ async def process_tx(tx): if not cfg.yes: tx.info.view_with_prompt('View transaction details?') - if tx.add_comment() and not cfg.autosign: # edits existing comment, returns true if changed + # edits existing comment, returns true if changed: + if tx.add_comment() and not cfg.autosign: tx.file.write(ask_write_default_yes=True) return await tx.send(txcfg, asi, batch=batch) diff --git a/mmgen/proto/xmr/tx/completed.py b/mmgen/proto/xmr/tx/completed.py index 1b873c63..b971d933 100644 --- a/mmgen/proto/xmr/tx/completed.py +++ b/mmgen/proto/xmr/tx/completed.py @@ -28,8 +28,8 @@ class Completed(Base): @cached_property def compat_tx(self): - from pathlib import Path from ....xmrwallet.file.tx import MoneroMMGenTX + from pathlib import Path return MoneroMMGenTX.View(self.cfg, Path(self.filename)) # View = Completed with silent open @cached_property @@ -45,5 +45,5 @@ class Completed(Base): from ....tx.info import TxInfo class info_cls(TxInfo): def format(info_self, *args, **kwargs): - return self.compat_tx.get_info(full_address=True) + return self.compat_tx.get_info(full_address=True, indent=' ', is_swap=self.is_swap) return info_cls(self.cfg, self) diff --git a/mmgen/proto/xmr/tx/online.py b/mmgen/proto/xmr/tx/online.py index b7a4d761..6aef9e15 100644 --- a/mmgen/proto/xmr/tx/online.py +++ b/mmgen/proto/xmr/tx/online.py @@ -48,12 +48,14 @@ class OnlineSigned(Completed): await op.restart_wallet_daemon() return int(not await op.main()) -class Sent(OnlineSigned): - desc = 'sent transaction' - class AutomountOnlineSigned(OnlineSigned): desc = 'signed automount transaction' + ext = 'asigtx' -class AutomountSent(AutomountOnlineSigned): +class Sent(OnlineSigned): + desc = 'sent transaction' + ext = 'asubtx' + +class AutomountSent(OnlineSigned): desc = 'sent automount transaction' ext = 'asubtx' diff --git a/mmgen/proto/xmr/tx/unsigned.py b/mmgen/proto/xmr/tx/unsigned.py index 469f2ffc..87a854c4 100644 --- a/mmgen/proto/xmr/tx/unsigned.py +++ b/mmgen/proto/xmr/tx/unsigned.py @@ -13,8 +13,9 @@ proto.xmr.tx.unsigned: Monero unsigned transaction class from .completed import Completed class Unsigned(Completed): - pass + desc = 'unsigned transaction' + ext = 'rawtx' -class AutomountUnsigned(Unsigned): +class AutomountUnsigned(Completed): desc = 'unsigned automount transaction' ext = 'arawtx' diff --git a/mmgen/tx/file.py b/mmgen/tx/file.py index 480138ad..d400474c 100644 --- a/mmgen/tx/file.py +++ b/mmgen/tx/file.py @@ -133,8 +133,6 @@ class MMGenTxFile(MMGenObject): tx.parse_txfile_serialized_data() # Ethereum RLP or JSON data - assert tx.proto.coin_amt(data['send_amt']) == tx.send_amt, f'{data["send_amt"]} != {tx.send_amt}' - def parse_data_legacy(self, data, get_proto_only): tx = self.tx tx.file_format = 'legacy' diff --git a/mmgen/xmrwallet/file/tx.py b/mmgen/xmrwallet/file/tx.py index 5266d73d..94cc4dc8 100644 --- a/mmgen/xmrwallet/file/tx.py +++ b/mmgen/xmrwallet/file/tx.py @@ -96,7 +96,7 @@ class MoneroMMGenTX: d.dest_address.hl(0), x = '->') - def get_info(self, *, indent='', addr_col_w=None, full_address=False): + def get_info(self, *, indent='', addr_col_w=None, full_address=False, is_swap=False): d = self.data pmt_id = d.dest_address.parsed.payment_id fs = '\n'.join(list_gen( @@ -111,7 +111,7 @@ class MoneroMMGenTX: [' Amount: {m} XMR'], [' Priority: {F}', d.priority], [' Fee: {n} XMR'], - [' Dest: {o}'], + [' {dest} {{o}}'.format(dest='Vault:' if is_swap else 'Dest: ')], [' Size: {Z} bytes', d.signed_txset], [' Payment ID: {P}', pmt_id])) @@ -157,10 +157,8 @@ class MoneroMMGenTX: b = self.data.amount, c = '' if self.data.network == 'mainnet' else f'.{self.data.network}', d = self.ext) - if self.cfg.autosign: fn = getattr(get_autosign_obj(self.cfg), self.tx_dir) / fn - from ...fileutil import write_data_to_file write_data_to_file( cfg = self.cfg, diff --git a/test/cmdtest_d/misc.py b/test/cmdtest_d/misc.py index d6a83ea3..be4cd13c 100644 --- a/test/cmdtest_d/misc.py +++ b/test/cmdtest_d/misc.py @@ -105,7 +105,10 @@ class CmdTestMisc(CmdTestBase): def bch_txview_cashaddr2(self): return self._bch_txview(1, 1, '[1HpynST7vkLn8yNtdrqPfeghexZk4sdB3W]') - def xmr_txview(self, tdir='test/ref/monero', ext='asubtx'): + def xmr_txview(self): + return self._xmr_txview(tdir='test/ref/monero', ext='tx') + + def _xmr_txview(self, tdir, ext): if self.cfg.no_altcoin: return 'skip' files = get_file_with_ext(tdir, ext, no_dot=True, delete=False, return_list=True) @@ -113,25 +116,26 @@ class CmdTestMisc(CmdTestBase): t.read() return t - def xmrwallet_txview(self, op='txview'): + def xmrwallet_txlist(self): + return self._xmrwallet_txview(op='txlist', search_pat='3EBD06-.*D94583-.*8BFA29-') + + def xmrwallet_txview(self): + return self._xmrwallet_txview(search_list=('Amount: 0.74 XMR', 'Dest: 56VQ9M6k')) + + def _xmrwallet_txview(self, tdir='test/ref/monero', op='txview', search_list=None, search_pat=None): if self.cfg.no_altcoin: return 'skip' - files = get_file_with_ext('test/ref/monero', 'tx', no_dot=True, delete=False, return_list=True) + files = get_file_with_ext(tdir, 'tx', no_dot=True, delete=False, return_list=True) t = self.spawn('mmgen-xmrwallet', [op] + files) res = t.read(strip_color=True) match op: case 'txview': - for s in ( - 'Amount: 0.74 XMR', - 'Dest: 56VQ9M6k'): + for s in search_list: assert s in res, f'{s} not in {res}' case 'txlist': - assert re.search('3EBD06-.*D94583-.*8BFA29-', res, re.DOTALL) + assert re.search(search_pat, res, re.DOTALL), f'pattern {search_pat} not found' return t - def xmrwallet_txlist(self): - return self.xmrwallet_txview(op='txlist') - def examples_bip_hd(self): if self.cfg.no_altcoin: return 'skip' diff --git a/test/cmdtest_d/xmr_autosign.py b/test/cmdtest_d/xmr_autosign.py index 203e1318..0ac47444 100644 --- a/test/cmdtest_d/xmr_autosign.py +++ b/test/cmdtest_d/xmr_autosign.py @@ -895,6 +895,7 @@ class CmdTestXMRCompat(CmdTestXMRAutosign): + add_opts + args, exit_val = exit_val) + if exit_val: pass elif '--abort' in opts: @@ -913,8 +914,10 @@ class CmdTestXMRCompat(CmdTestXMRAutosign): t.expect('(y/N): ', 'y') # save? elif op == 'txsend' and not '--status' in opts: t.expect('(y/N): ', 'y') # view? + if expect_str: t.expect(expect_str, regex=True) + t.read() # required! self.remove_device_online() return t diff --git a/test/cmdtest_d/xmrswap.py b/test/cmdtest_d/xmrswap.py index c752e5aa..89b3a456 100644 --- a/test/cmdtest_d/xmrswap.py +++ b/test/cmdtest_d/xmrswap.py @@ -113,12 +113,13 @@ class CmdTestXMRSwapMethods: 'expect_pats': expect_pats}, output_args = args) - def _swaptxsend_refnum(self, expect_pat, *, add_opts=[], is_xmr=False): + def _swaptxsend_refnum(self, expect_pat, *, add_opts=[], is_xmr=False, no_wait=False): return self._user_txsend( 'bob', add_opts = ['--monero-wallet-rpc-password=abc'] + add_opts, expect_pat = expect_pat, is_xmr = is_xmr, + no_wait = no_wait, need_rbf = True) class CmdTestXMRSwap(CmdTestXMRSwapMethods, CmdTestSwap):