Browse Source

autosign, xmrwallet: minor fixes and cleanups throughout

The MMGen Project 1 year ago
parent
commit
85df7cdd76

+ 6 - 13
mmgen/autosign.py

@@ -39,6 +39,9 @@ class Signable:
 			self.parent = parent
 			self.parent = parent
 			self.cfg = parent.cfg
 			self.cfg = parent.cfg
 			self.dir = getattr(parent,self.dir_name)
 			self.dir = getattr(parent,self.dir_name)
+			self.long_desc = (
+				'non-Monero transaction' if self.desc == 'transaction' and 'XMR' in self.parent.coins else
+				self.desc)
 
 
 		@property
 		@property
 		def unsigned(self):
 		def unsigned(self):
@@ -267,9 +270,6 @@ class Autosign:
 
 
 		self.coins = cfg.coins.upper().split(',') if cfg.coins else []
 		self.coins = cfg.coins.upper().split(',') if cfg.coins else []
 
 
-		if cfg._args and cfg._args[0] == 'clean':
-			return
-
 		if cfg.xmrwallets and not 'XMR' in self.coins:
 		if cfg.xmrwallets and not 'XMR' in self.coins:
 			self.coins.append('XMR')
 			self.coins.append('XMR')
 
 
@@ -401,7 +401,7 @@ class Autosign:
 				target.print_bad_list(bad)
 				target.print_bad_list(bad)
 			return not bad
 			return not bad
 		else:
 		else:
-			msg(f'No unsigned {target.desc}s')
+			msg(f'No unsigned {target.long_desc}s')
 			await asyncio.sleep(0.5)
 			await asyncio.sleep(0.5)
 			return True
 			return True
 
 
@@ -579,16 +579,9 @@ class Autosign:
 		bmsg(f'{count} file{suf(count)} shredded')
 		bmsg(f'{count} file{suf(count)} shredded')
 
 
 	def get_insert_status(self):
 	def get_insert_status(self):
-		if self.cfg.no_insert_check:
-			return True
-		try:
-			self.dev_disk_path.stat()
-		except:
-			return False
-		else:
-			return True
+		return self.cfg.no_insert_check or self.dev_disk_path.exists()
 
 
-	async def do_loop(self):
+	async def main_loop(self):
 		if not self.cfg.stealth_led:
 		if not self.cfg.stealth_led:
 			self.led.set('standby')
 			self.led.set('standby')
 		testing_xmr = self.cfg.test_suite_xmr_autosign
 		testing_xmr = self.cfg.test_suite_xmr_autosign

+ 5 - 2
mmgen/led.py

@@ -117,8 +117,11 @@ class LEDControl:
 	@classmethod
 	@classmethod
 	def delete_dummy_control_files(cls):
 	def delete_dummy_control_files(cls):
 		db = cls.boards['dummy']
 		db = cls.boards['dummy']
-		os.unlink(db.status)
-		os.unlink(db.trigger)
+		for fn in (db.status, db.trigger):
+			try:
+				os.unlink(fn)
+			except Exception as e:
+				msg(str(e))
 
 
 	def noop(self,*args,**kwargs):
 	def noop(self,*args,**kwargs):
 		pass
 		pass

+ 2 - 1
mmgen/main_autosign.py

@@ -149,7 +149,7 @@ def main(do_loop):
 	async def do():
 	async def do():
 		await asi.check_daemons_running()
 		await asi.check_daemons_running()
 		if do_loop:
 		if do_loop:
-			await asi.do_loop()
+			await asi.main_loop()
 		else:
 		else:
 			ret = await asi.do_sign()
 			ret = await asi.do_sign()
 			asi.at_exit(not ret)
 			asi.at_exit(not ret)
@@ -188,6 +188,7 @@ if cmd_args:
 		if cfg.xmrwallets and keypress_confirm( cfg, '\nContinue with Monero setup?', default_yes=True ):
 		if cfg.xmrwallets and keypress_confirm( cfg, '\nContinue with Monero setup?', default_yes=True ):
 			msg('')
 			msg('')
 			asi.xmr_setup()
 			asi.xmr_setup()
+		asi.do_umount()
 	elif cmd == 'wait':
 	elif cmd == 'wait':
 		main(do_loop=True)
 		main(do_loop=True)
 	elif cmd == 'clean':
 	elif cmd == 'clean':

+ 2 - 2
mmgen/main_xmrwallet.py

@@ -66,11 +66,11 @@ opts_data = {
 -d, --outdir=D                   Save transaction files to directory 'D'
 -d, --outdir=D                   Save transaction files to directory 'D'
                                  instead of the working directory
                                  instead of the working directory
 -D, --daemon=H:P                 Connect to the monerod at {D}
 -D, --daemon=H:P                 Connect to the monerod at {D}
--R, --tx-relay-daemon=H:P[:H:P]  Relay transactions via a monerod specified by
-                                 {R}
 -k, --use-internal-keccak-module Force use of the internal keccak module
 -k, --use-internal-keccak-module Force use of the internal keccak module
 -p, --hash-preset=P              Use scrypt hash preset 'P' for password
 -p, --hash-preset=P              Use scrypt hash preset 'P' for password
                                  hashing (default: '{gc.dfl_hash_preset}')
                                  hashing (default: '{gc.dfl_hash_preset}')
+-R, --tx-relay-daemon=H:P[:H:P]  Relay transactions via a monerod specified by
+                                 {R}
 -r, --restore-height=H           Scan from height 'H' when creating wallets.
 -r, --restore-height=H           Scan from height 'H' when creating wallets.
                                  Use special value ‘current’ to create empty
                                  Use special value ‘current’ to create empty
                                  wallet at current blockchain height.
                                  wallet at current blockchain height.

+ 12 - 5
test/cmdtest.py

@@ -95,7 +95,7 @@ else:
 
 
 from mmgen.cfg import Config,gc
 from mmgen.cfg import Config,gc
 from mmgen.color import red,yellow,green,blue,cyan,gray,nocolor,init_color
 from mmgen.color import red,yellow,green,blue,cyan,gray,nocolor,init_color
-from mmgen.util import Msg,bmsg,die,suf,make_timestr,async_run
+from mmgen.util import msg,Msg,bmsg,die,suf,make_timestr,async_run
 
 
 from test.include.common import (
 from test.include.common import (
 	set_globals,
 	set_globals,
@@ -222,6 +222,8 @@ type(cfg)._reset_ok += (
 	'resuming',
 	'resuming',
 	'skipping_deps' )
 	'skipping_deps' )
 
 
+logging = cfg.log or os.getenv('MMGEN_EXEC_WRAPPER')
+
 cfg.resuming = any(k in po.user_opts for k in ('resume','resume_after'))
 cfg.resuming = any(k in po.user_opts for k in ('resume','resume_after'))
 cfg.skipping_deps = cfg.resuming or 'skip_deps' in po.user_opts
 cfg.skipping_deps = cfg.resuming or 'skip_deps' in po.user_opts
 
 
@@ -547,7 +549,7 @@ class CmdTestRunner:
 	'cmdtest.py test runner'
 	'cmdtest.py test runner'
 
 
 	def __del__(self):
 	def __del__(self):
-		if cfg.log:
+		if logging:
 			self.log_fd.close()
 			self.log_fd.close()
 
 
 	def __init__(self,data_dir,trash_dir):
 	def __init__(self,data_dir,trash_dir):
@@ -562,7 +564,7 @@ class CmdTestRunner:
 		self.resume_cmd = None
 		self.resume_cmd = None
 		self.deps_only = None
 		self.deps_only = None
 
 
-		if cfg.log:
+		if logging:
 			self.log_fd = open(cmdtest_py_log_fn,'a')
 			self.log_fd = open(cmdtest_py_log_fn,'a')
 			self.log_fd.write(f'\nLog started: {make_timestr()} UTC\n')
 			self.log_fd.write(f'\nLog started: {make_timestr()} UTC\n')
 			omsg(f'INFO → Logging to file {cmdtest_py_log_fn!r}')
 			omsg(f'INFO → Logging to file {cmdtest_py_log_fn!r}')
@@ -630,10 +632,15 @@ class CmdTestRunner:
 			self.tg.extra_spawn_args +
 			self.tg.extra_spawn_args +
 			args )
 			args )
 
 
-		qargs = ['{q}{}{q}'.format( a, q = "'" if ' ' in a else '' ) for a in args]
+		try:
+			qargs = ['{q}{}{q}'.format( a, q = "'" if ' ' in a else '' ) for a in args]
+		except:
+			msg(f'args: {args}')
+			raise
+
 		cmd_disp = ' '.join(qargs).replace('\\','/') # for mingw
 		cmd_disp = ' '.join(qargs).replace('\\','/') # for mingw
 
 
-		if cfg.log:
+		if logging:
 			self.log_fd.write('[{}][{}:{}] {}\n'.format(
 			self.log_fd.write('[{}][{}:{}] {}\n'.format(
 				proto.coin.lower(),
 				proto.coin.lower(),
 				self.tg.group_name,
 				self.tg.group_name,

+ 40 - 29
test/cmdtest_py_d/ct_autosign.py

@@ -122,10 +122,10 @@ class CmdTestAutosignBase(CmdTestBase):
 		)
 		)
 		self.mountpoint = self.asi.mountpoint
 		self.mountpoint = self.asi.mountpoint
 
 
-		if self.simulate and not cfg.exact_output:
+		if self.simulate_led and not cfg.exact_output:
 			die(1,red('This command must be run with --exact-output enabled!'))
 			die(1,red('This command must be run with --exact-output enabled!'))
 
 
-		if self.simulate or not self.live:
+		if self.simulate_led or not self.live:
 			LEDControl.create_dummy_control_files()
 			LEDControl.create_dummy_control_files()
 			self.spawn_env['MMGEN_TEST_SUITE_AUTOSIGN_LED_SIMULATE'] = '1'
 			self.spawn_env['MMGEN_TEST_SUITE_AUTOSIGN_LED_SIMULATE'] = '1'
 
 
@@ -133,7 +133,7 @@ class CmdTestAutosignBase(CmdTestBase):
 
 
 		if self.live:
 		if self.live:
 			check_mountpoint(self.asi)
 			check_mountpoint(self.asi)
-			init_led(self.simulate)
+			init_led(self.simulate_led)
 		else:
 		else:
 			self.asi.tx_dir.mkdir(parents=True,exist_ok=True) # creates mountpoint
 			self.asi.tx_dir.mkdir(parents=True,exist_ok=True) # creates mountpoint
 			self.wallet_dir.mkdir(parents=True,exist_ok=True)
 			self.wallet_dir.mkdir(parents=True,exist_ok=True)
@@ -163,7 +163,7 @@ class CmdTestAutosignBase(CmdTestBase):
 	def __del__(self):
 	def __del__(self):
 		if sys.platform == 'win32' or self.tr is None:
 		if sys.platform == 'win32' or self.tr is None:
 			return
 			return
-		if self.simulate or not self.live:
+		if self.simulate_led or not self.live:
 			LEDControl.delete_dummy_control_files()
 			LEDControl.delete_dummy_control_files()
 
 
 	def start_daemons(self):
 	def start_daemons(self):
@@ -244,29 +244,34 @@ class CmdTestAutosignBase(CmdTestBase):
 
 
 		assert op in ('copy','set_count','remove_signed')
 		assert op in ('copy','set_count','remove_signed')
 
 
-		fdata = [e for e in filedir_map if e[0] in (txfile_coins or self.txfile_coins)]
-
 		from .ct_ref import CmdTestRef
 		from .ct_ref import CmdTestRef
-		tfns  = [CmdTestRef.sources['ref_tx_file'][c][1] for c,d in fdata] + \
-				[CmdTestRef.sources['ref_tx_file'][c][0] for c,d in fdata] + \
-				['25EFA3[2.34].testnet.rawtx'] # TX with 2 non-MMGen outputs
-		self.tx_count = len([fn for fn in tfns if fn])
+		def gen():
+			d = CmdTestRef.sources['ref_tx_file']
+			dirmap = [e for e in filedir_map if e[0] in (txfile_coins or self.txfile_coins)]
+			for coin,coindir in dirmap:
+				for network in (0,1):
+					fn = d[coin][network]
+					if fn:
+						yield (coindir,fn)
+
+		data = list(gen()) + [('','25EFA3[2.34].testnet.rawtx')] # TX with 2 non-MMGen outputs
+
+		self.tx_count = len(data)
 		if op == 'set_count':
 		if op == 'set_count':
 			return
 			return
-		tfs = [joinpath(ref_dir,d[1],fn) for d,fn in zip(fdata+fdata+[('btc','')],tfns)]
-
-		for f,fn in zip(tfs,tfns):
-			if fn: # use empty fn to skip file
-				if cfg.debug_utf8:
-					ext = '.testnet.rawtx' if fn.endswith('.testnet.rawtx') else '.rawtx'
-					fn = fn[:-len(ext)] + '-α' + ext
-				target = joinpath(self.mountpoint,'tx',fn)
-				if not op == 'remove_signed':
-					shutil.copyfile(f,target)
-				try:
-					os.unlink(target.replace('.rawtx','.sigtx'))
-				except:
-					pass
+
+		for coindir,fn in data:
+			src = joinpath(ref_dir,coindir,fn)
+			if cfg.debug_utf8:
+				ext = '.testnet.rawtx' if fn.endswith('.testnet.rawtx') else '.rawtx'
+				fn = fn[:-len(ext)] + '-α' + ext
+			target = joinpath(self.asi.mountpoint,'tx',fn)
+			if not op == 'remove_signed':
+				shutil.copyfile(src,target)
+			try:
+				os.unlink(target.replace('.rawtx','.sigtx'))
+			except:
+				pass
 
 
 		return 'ok'
 		return 'ok'
 
 
@@ -276,6 +281,9 @@ class CmdTestAutosignBase(CmdTestBase):
 	def remove_bad_txfiles(self):
 	def remove_bad_txfiles(self):
 		return self.bad_txfiles('remove')
 		return self.bad_txfiles('remove')
 
 
+	create_bad_txfiles2 = create_bad_txfiles
+	remove_bad_txfiles2 = remove_bad_txfiles
+
 	def bad_txfiles(self,op):
 	def bad_txfiles(self,op):
 		if self.live:
 		if self.live:
 			do_mount(self.mountpoint)
 			do_mount(self.mountpoint)
@@ -367,13 +375,16 @@ class CmdTestAutosignBase(CmdTestBase):
 		imsg('')
 		imsg('')
 		return t
 		return t
 
 
+	def insert_device(self):
+		self.asi.dev_disk_path.touch()
+
 class CmdTestAutosign(CmdTestAutosignBase):
 class CmdTestAutosign(CmdTestAutosignBase):
 	'autosigning transactions for all supported coins'
 	'autosigning transactions for all supported coins'
 	coins        = ['btc','bch','ltc','eth']
 	coins        = ['btc','bch','ltc','eth']
 	daemon_coins = ['btc','bch','ltc']
 	daemon_coins = ['btc','bch','ltc']
 	txfile_coins = ['btc','bch','ltc','eth','mm1','etc']
 	txfile_coins = ['btc','bch','ltc','eth','mm1','etc']
 	live         = False
 	live         = False
-	simulate     = False
+	simulate_led = False
 	bad_tx_count = 0
 	bad_tx_count = 0
 	cmd_group = (
 	cmd_group = (
 		('start_daemons',            'starting daemons'),
 		('start_daemons',            'starting daemons'),
@@ -395,12 +406,12 @@ class CmdTestAutosign(CmdTestAutosignBase):
 		('copy_msgfiles',            'copying message files'),
 		('copy_msgfiles',            'copying message files'),
 		('sign_quiet_msg',           'signing transactions and messages (--quiet)'),
 		('sign_quiet_msg',           'signing transactions and messages (--quiet)'),
 		('remove_signed_txfiles',    'removing signed transaction files'),
 		('remove_signed_txfiles',    'removing signed transaction files'),
-		('create_bad_txfiles',       'creating bad transaction files'),
+		('create_bad_txfiles2',      'creating bad transaction files'),
 		('remove_signed_msgfiles',   'removing signed message files'),
 		('remove_signed_msgfiles',   'removing signed message files'),
 		('create_invalid_msgfile',   'creating invalid message file'),
 		('create_invalid_msgfile',   'creating invalid message file'),
 		('sign_full_summary_msg',    'signing transactions and messages (--full-summary)'),
 		('sign_full_summary_msg',    'signing transactions and messages (--full-summary)'),
 		('remove_invalid_msgfile',   'removing invalid message file'),
 		('remove_invalid_msgfile',   'removing invalid message file'),
-		('remove_bad_txfiles',       'removing bad transaction files'),
+		('remove_bad_txfiles2',      'removing bad transaction files'),
 		('sign_no_unsigned_msg',     'signing transactions and messages (nothing to sign)'),
 		('sign_no_unsigned_msg',     'signing transactions and messages (nothing to sign)'),
 		('stop_daemons',             'stopping daemons'),
 		('stop_daemons',             'stopping daemons'),
 	)
 	)
@@ -507,10 +518,10 @@ class CmdTestAutosignLive(CmdTestAutosignBTC):
 		imsg(purple('\nKilling wait loop!'))
 		imsg(purple('\nKilling wait loop!'))
 		t.kill(2) # 2 = SIGINT
 		t.kill(2) # 2 = SIGINT
 		t.req_exit_val = 1
 		t.req_exit_val = 1
-		if self.simulate and led_opts:
+		if self.simulate_led and led_opts:
 			t.expect("Stopping LED")
 			t.expect("Stopping LED")
 		return t
 		return t
 
 
 class CmdTestAutosignLiveSimulate(CmdTestAutosignLive):
 class CmdTestAutosignLiveSimulate(CmdTestAutosignLive):
 	'live autosigning BTC transactions with simulated LED support'
 	'live autosigning BTC transactions with simulated LED support'
-	simulate = True
+	simulate_led = True

+ 18 - 17
test/cmdtest_py_d/ct_xmr_autosign.py

@@ -58,7 +58,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 	daemon_coins = []
 	daemon_coins = []
 	txfile_coins = []
 	txfile_coins = []
 	live         = False
 	live         = False
-	simulate     = False
+	simulate_led = False
 	bad_tx_count = 0
 	bad_tx_count = 0
 	tx_relay_user = 'miner'
 	tx_relay_user = 'miner'
 	no_insert_check = False
 	no_insert_check = False
@@ -108,8 +108,8 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 
 
 	def __init__(self,trunner,cfgs,spawn):
 	def __init__(self,trunner,cfgs,spawn):
 
 
-		CmdTestXMRWallet.__init__(self,trunner,cfgs,spawn)
 		CmdTestAutosignBase.__init__(self,trunner,cfgs,spawn)
 		CmdTestAutosignBase.__init__(self,trunner,cfgs,spawn)
+		CmdTestXMRWallet.__init__(self,trunner,cfgs,spawn)
 
 
 		if trunner is None:
 		if trunner is None:
 			return
 			return
@@ -221,9 +221,6 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 	def fund_alice2(self):
 	def fund_alice2(self):
 		return self.fund_alice(wallet=2)
 		return self.fund_alice(wallet=2)
 
 
-	def insert_device(self):
-		self.asi.dev_disk_path.touch()
-
 	def autosign_setup(self):
 	def autosign_setup(self):
 		self.insert_device()
 		self.insert_device()
 		Path(self.autosign_xmr_dir).mkdir(parents=True,exist_ok=True)
 		Path(self.autosign_xmr_dir).mkdir(parents=True,exist_ok=True)
@@ -240,7 +237,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 		if self.asi.dev_disk_path.exists():
 		if self.asi.dev_disk_path.exists():
 			self.asi.dev_disk_path.unlink()
 			self.asi.dev_disk_path.unlink()
 		def run():
 		def run():
-			t = self.spawn('mmgen-autosign', self.opts + ['wait'], direct_exec=True )
+			t = self.spawn('mmgen-autosign', self.opts + ['wait'], direct_exec=True)
 			self.write_to_tmpfile('autosign_thread_pid',str(t.ep.pid))
 			self.write_to_tmpfile('autosign_thread_pid',str(t.ep.pid))
 		import threading
 		import threading
 		threading.Thread( target=run, name='Autosign wait loop' ).start()
 		threading.Thread( target=run, name='Autosign wait loop' ).start()
@@ -263,7 +260,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 		return self.create_wallets( 'alice', op='restore' )
 		return self.create_wallets( 'alice', op='restore' )
 
 
 	def restore_wallets(self):
 	def restore_wallets(self):
-		return self.create_wallets( 'alice', op='restore' )
+		return self.create_watchonly_wallets()
 
 
 	def _create_transfer_tx(self,amt):
 	def _create_transfer_tx(self,amt):
 		t = self.do_op('transfer','alice',f'1:0:{self.burn_addr},{amt}',no_relay=True,do_ret=True)
 		t = self.do_op('transfer','alice',f'1:0:{self.burn_addr},{amt}',no_relay=True,do_ret=True)
@@ -279,6 +276,15 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 		get_file_with_ext(self.asi.xmr_tx_dir,'sigtx',delete_all=True)
 		get_file_with_ext(self.asi.xmr_tx_dir,'sigtx',delete_all=True)
 		return self._create_transfer_tx('0.257')
 		return self._create_transfer_tx('0.257')
 
 
+	def _wait_signed(self,dtype):
+		oqmsg_r(gray(f'→ offline wallet{"s" if dtype.endswith("s") else ""} signing {dtype}'))
+		while True:
+			oqmsg_r(gray('.'))
+			if not self.asi.dev_disk_path.exists():
+				break
+			time.sleep(0.5)
+		oqmsg(gray('done'))
+
 	def _xmr_autosign_op(
 	def _xmr_autosign_op(
 			self,
 			self,
 			op,
 			op,
@@ -289,13 +295,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 			add_opts    = [],
 			add_opts    = [],
 			wait_signed = False):
 			wait_signed = False):
 		if wait_signed:
 		if wait_signed:
-			oqmsg_r(gray(f'→ offline wallet{"s" if dtype.endswith("s") else ""} signing {dtype}'))
-			while True:
-				oqmsg_r(gray('.'))
-				if not self.asi.dev_disk_path.exists():
-					break
-				time.sleep(0.5)
-			oqmsg(gray('done'))
+			self._wait_signed(dtype)
 		data = self.users['alice']
 		data = self.users['alice']
 		args = (
 		args = (
 			self.extra_opts
 			self.extra_opts
@@ -380,11 +380,12 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 		return self._export_outputs('1-2')
 		return self._export_outputs('1-2')
 
 
 	def _import_key_images(self,wallet_arg):
 	def _import_key_images(self,wallet_arg):
-		return self._xmr_autosign_op(
+		t = self._xmr_autosign_op(
 			op    = 'import-key-images',
 			op    = 'import-key-images',
 			wallet_arg = wallet_arg,
 			wallet_arg = wallet_arg,
 			dtype = 'wallet outputs',
 			dtype = 'wallet outputs',
 			wait_signed = True )
 			wait_signed = True )
+		return t
 
 
 	def import_key_images1(self):
 	def import_key_images1(self):
 		return self._import_key_images(None)
 		return self._import_key_images(None)
@@ -448,7 +449,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 		self.create_fake_tx_files()
 		self.create_fake_tx_files()
 		before = '\n'.join(self._gen_listing())
 		before = '\n'.join(self._gen_listing())
 
 
-		t = self.spawn( 'mmgen-autosign', [f'--mountpoint={self.mountpoint}','clean'] )
+		t = self.spawn('mmgen-autosign', self.opts + ['clean'])
 		out = t.read()
 		out = t.read()
 
 
 		after = '\n'.join(self._gen_listing())
 		after = '\n'.join(self._gen_listing())
@@ -482,7 +483,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet,CmdTestAutosignBase):
 
 
 	def check_tx_dirs(self):
 	def check_tx_dirs(self):
 		before = '\n'.join(self._gen_listing())
 		before = '\n'.join(self._gen_listing())
-		t = self.spawn( 'mmgen-autosign', [f'--mountpoint={self.mountpoint}','clean'] )
+		t = self.spawn('mmgen-autosign', self.opts + ['clean'])
 		t.read()
 		t.read()
 		after = '\n'.join(self._gen_listing())
 		after = '\n'.join(self._gen_listing())
 		imsg(f'\nBefore cleaning:\n{before}')
 		imsg(f'\nBefore cleaning:\n{before}')

+ 12 - 14
test/cmdtest_py_d/ct_xmrwallet.py

@@ -124,11 +124,9 @@ class CmdTestXMRWallet(CmdTestBase):
 		from mmgen.protocol import init_proto
 		from mmgen.protocol import init_proto
 		self.proto = init_proto( cfg, 'XMR', network='mainnet' )
 		self.proto = init_proto( cfg, 'XMR', network='mainnet' )
 		self.extra_opts = ['--wallet-rpc-password=passw0rd']
 		self.extra_opts = ['--wallet-rpc-password=passw0rd']
-		self.autosign_mountpoint = os.path.join(self.tmpdir,'mmgen_autosign')
 		self.autosign_xmr_dir = os.path.join(self.tmpdir,'mmgen_autosign','xmr')
 		self.autosign_xmr_dir = os.path.join(self.tmpdir,'mmgen_autosign','xmr')
 		self.init_users()
 		self.init_users()
 		self.init_daemon_args()
 		self.init_daemon_args()
-		self.autosign_opts = []
 
 
 		for v in self.users.values():
 		for v in self.users.values():
 			run(['mkdir','-p',v.udir])
 			run(['mkdir','-p',v.udir])
@@ -340,9 +338,7 @@ class CmdTestXMRWallet(CmdTestBase):
 
 
 	def gen_kafiles(self):
 	def gen_kafiles(self):
 		for user,data in self.users.items():
 		for user,data in self.users.items():
-			if not data.kal_range:
-				continue
-			if data.autosign:
+			if data.autosign or not data.kal_range:
 				continue
 				continue
 			run(['mkdir','-p',data.udir])
 			run(['mkdir','-p',data.udir])
 			run(f'rm -f {data.kafile}',shell=True)
 			run(f'rm -f {data.kafile}',shell=True)
@@ -394,12 +390,12 @@ class CmdTestXMRWallet(CmdTestBase):
 		data = self.users['alice']
 		data = self.users['alice']
 		t = self.spawn(
 		t = self.spawn(
 			'mmgen-xmrwallet',
 			'mmgen-xmrwallet',
-			self.extra_opts +
-			[f'--wallet-dir={data.udir}'] +
-			[f'--daemon=localhost:{data.md.rpc_port}'] +
-			(['--no-start-wallet-daemon'] if cfg in ('continue','stop') else []) +
-			(['--no-stop-wallet-daemon'] if cfg in ('start','continue') else []) +
-			['new', (kafile or data.kafile), spec] )
+			self.extra_opts
+			+ [f'--wallet-dir={data.udir}']
+			+ [f'--daemon=localhost:{data.md.rpc_port}']
+			+ (['--no-start-wallet-daemon'] if cfg in ('continue','stop') else [])
+			+ (['--no-stop-wallet-daemon'] if cfg in ('start','continue') else [])
+			+ ['new', (kafile or data.kafile), spec])
 		t.expect(expect, 'y', regex=True)
 		t.expect(expect, 'y', regex=True)
 		return t
 		return t
 
 
@@ -467,7 +463,9 @@ class CmdTestXMRWallet(CmdTestBase):
 		cmd_opts = [f'--wallet-dir={data.udir}', f'--daemon=localhost:{data.md.rpc_port}']
 		cmd_opts = [f'--wallet-dir={data.udir}', f'--daemon=localhost:{data.md.rpc_port}']
 		t = self.spawn(
 		t = self.spawn(
 			'mmgen-xmrwallet',
 			'mmgen-xmrwallet',
-			self.extra_opts + cmd_opts + ['label', data.kafile, label_spec]
+			self.extra_opts
+			+ cmd_opts
+			+ ['label', data.kafile, label_spec]
 		)
 		)
 		t.expect('(y/N): ','y')
 		t.expect('(y/N): ','y')
 		t.expect(f'Label successfully {expect}')
 		t.expect(f'Label successfully {expect}')
@@ -492,7 +490,7 @@ class CmdTestXMRWallet(CmdTestBase):
 			'mmgen-xmrwallet',
 			'mmgen-xmrwallet',
 			self.extra_opts
 			self.extra_opts
 			+ cmd_opts
 			+ cmd_opts
-			+ self.autosign_opts
+			+ (self.autosign_opts if data.autosign else [])
 			+ add_opts
 			+ add_opts
 			+ [op]
 			+ [op]
 			+ ([] if data.autosign else [data.kafile])
 			+ ([] if data.autosign else [data.kafile])
@@ -536,7 +534,6 @@ class CmdTestXMRWallet(CmdTestBase):
 			[f'--daemon=localhost:{data.md.rpc_port}'],
 			[f'--daemon=localhost:{data.md.rpc_port}'],
 			[f'--tx-relay-daemon={tx_relay_parm}', tx_relay_parm],
 			[f'--tx-relay-daemon={tx_relay_parm}', tx_relay_parm],
 			['--no-relay', no_relay and not data.autosign],
 			['--no-relay', no_relay and not data.autosign],
-			[f'--autosign-mountpoint={self.autosign_mountpoint}', data.autosign],
 		)
 		)
 		add_desc = (', ' + add_desc) if add_desc else ''
 		add_desc = (', ' + add_desc) if add_desc else ''
 
 
@@ -544,6 +541,7 @@ class CmdTestXMRWallet(CmdTestBase):
 			'mmgen-xmrwallet',
 			'mmgen-xmrwallet',
 			self.extra_opts
 			self.extra_opts
 			+ cmd_opts
 			+ cmd_opts
+			+ (self.autosign_opts if data.autosign else [])
 			+ [op]
 			+ [op]
 			+ ([] if data.autosign else [data.kafile])
 			+ ([] if data.autosign else [data.kafile])
 			+ [arg2],
 			+ [arg2],