various changes and cleanups

This commit is contained in:
The MMGen Project 2026-10-23 17:01:32 +00:00
commit bac7b716c5
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
10 changed files with 42 additions and 31 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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