From 153a815b5b5ec140ccc98589265afc54f9df09a8 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 19 Oct 2026 09:06:13 +0000 Subject: [PATCH] XMR: support regtest for cmdtest.py --- mmgen/cfg.py | 3 +-- mmgen/daemon.py | 4 +++- mmgen/proto/xmr/daemon.py | 12 +++++++----- mmgen/proto/xmr/params.py | 5 ++++- test/cmdtest_d/autosign.py | 2 +- test/cmdtest_d/xmr_autosign.py | 9 +++++---- test/cmdtest_d/xmrwallet.py | 19 ++++++++----------- 7 files changed, 29 insertions(+), 25 deletions(-) diff --git a/mmgen/cfg.py b/mmgen/cfg.py index 91855fec..b046c2a6 100644 --- a/mmgen/cfg.py +++ b/mmgen/cfg.py @@ -493,8 +493,7 @@ class Config(Lockable): self.coin = self.coin.upper() self.token = self.token.upper() if self.token else None if self.test_user or self.regtest: - if self.coin != 'XMR': - self.network = 'regtest' + self.network = 'regtest' if not self.test_suite: # could be set in environment self._use_cfg_file = False else: diff --git a/mmgen/daemon.py b/mmgen/daemon.py index 5708df80..35552320 100644 --- a/mmgen/daemon.py +++ b/mmgen/daemon.py @@ -281,6 +281,7 @@ class CoinDaemon(Daemon): testnet_dir = 'testnet' rpc_user = None rpc_password = None + disable_regtest_p2p = True _cd = namedtuple('coins_data', ['daemon_ids']) coins = { @@ -429,7 +430,8 @@ class CoinDaemon(Daemon): (self.dfl_rpc_port + self.port_shift)) self.p2p_port = ( - None if self.dfl_p2p_port is None or self.network == 'regtest' else + None if self.dfl_p2p_port is None + or (self.network == 'regtest' and self.disable_regtest_p2p) else (self.dfl_p2p_port + self.port_shift)) fn_stem = f'{self.id}-{self.network}-daemon-{self.bind_port}' diff --git a/mmgen/proto/xmr/daemon.py b/mmgen/proto/xmr/daemon.py index cbb73532..d5753ea0 100644 --- a/mmgen/proto/xmr/daemon.py +++ b/mmgen/proto/xmr/daemon.py @@ -18,17 +18,18 @@ from ...daemon import CoinDaemon, RPCDaemon, _nw, _dd class monero_daemon(CoinDaemon): daemon_data = _dd('Monero', 18005001, '0.18.5.1-release') - networks = ('mainnet', 'testnet') + networks = ('mainnet', 'testnet', 'regtest') exec_fn = 'monerod' testnet_dir = 'stagenet' new_console_mswin = True - rpc_ports = _nw(18081, 38081, None) # testnet is stagenet + rpc_ports = _nw(18081, 28081, 38081) # testnet is stagenet cfg_file = 'bitmonero.conf' datadirs = { 'linux': [gc.home_dir, '.bitmonero'], 'darwin': [gc.home_dir, '.bitmonero'], 'win32': ['/', 'c', 'ProgramData', 'bitmonero']} use_pidfile = gc.platform == 'linux' + disable_regtest_p2p = False @property def dfl_p2p_port(self): @@ -51,7 +52,8 @@ class monero_daemon(CoinDaemon): ['--no-zmq'], [f'--p2p-bind-port={self.p2p_port}', self.p2p_port], [f'--rpc-bind-port={self.rpc_port}'], - ['--stagenet', self.network == 'testnet']) + ['--stagenet', self.network == 'testnet'], + ['--p2p-bind-ip=127.0.0.1', '--fixed-difficulty=1', '--regtest', self.network == 'regtest']) self.coind_args = list_gen( ['--hide-my-port'], @@ -77,8 +79,8 @@ class MoneroWalletDaemon(RPCDaemon): exec_fn = 'monero-wallet-rpc' coin = 'XMR' new_console_mswin = True - networks = ('mainnet', 'testnet') - rpc_ports = _nw(13131, 13141, None) # testnet is non-standard + networks = ('mainnet', 'testnet', 'regtest') + rpc_ports = _nw(13131, 13141, 13151) # testnet is non-standard use_pidfile = gc.platform == 'linux' _reset_ok = ('debug', 'wait', 'pids', 'force_kill') diff --git a/mmgen/proto/xmr/params.py b/mmgen/proto/xmr/params.py index c2ee96e6..bf18663f 100644 --- a/mmgen/proto/xmr/params.py +++ b/mmgen/proto/xmr/params.py @@ -24,7 +24,7 @@ class MoneroViewKey(HexStr): class mainnet(CoinProtocol.RPC, CoinProtocol.DummyWIF, CoinProtocol.Base): mod_clsname = 'Monero' - network_names = _nw('mainnet', 'stagenet', None) + network_names = _nw('mainnet', 'stagenet', 'regtest') base_proto = 'Monero' base_proto_coin = 'XMR' base_coin = 'XMR' @@ -89,3 +89,6 @@ class mainnet(CoinProtocol.RPC, CoinProtocol.DummyWIF, CoinProtocol.Base): class testnet(mainnet): # use stagenet for testnet # testnet is {'35', '3f', '36'} addr_ver_info = {'18': 'monero', '24': 'monero_sub', '19': 'monero_integrated'} + +class regtest(mainnet): + pass diff --git a/test/cmdtest_d/autosign.py b/test/cmdtest_d/autosign.py index 88e86034..e84427f0 100644 --- a/test/cmdtest_d/autosign.py +++ b/test/cmdtest_d/autosign.py @@ -616,7 +616,7 @@ class CmdTestAutosignThreaded(CmdTestAutosignBase): (opts or self.opts) + add_opts # ensure that changes to online cfg file don’t affect autosign: - + [f'--data-dir={autosign_data_dir}'] + + [f'--data-dir={autosign_data_dir}', '--regtest=1'] + ['--full-summary', 'wait'], direct_exec = True, no_passthru_opts = True, diff --git a/test/cmdtest_d/xmr_autosign.py b/test/cmdtest_d/xmr_autosign.py index 06a204f2..374a9ced 100644 --- a/test/cmdtest_d/xmr_autosign.py +++ b/test/cmdtest_d/xmr_autosign.py @@ -118,7 +118,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded): self.burn_addr = make_burn_addr(cfg) self.autosign_opts = ['--autosign'] # mmgen-xmrwallet opts - self.autosign_setup_opts = [f'--xmrwallets={self.users[self.user].kal_range}'] + self.autosign_setup_opts = ['--regtest=1', f'--xmrwallets={self.users[self.user].kal_range}'] def create_tmp_wallets(self): self.spawn(msg_only=True) @@ -511,7 +511,7 @@ class CmdTestXMRCompat(CmdTestXMRAutosign): """ menu_prompt = 'efresh balances:\b' listaddresses_menu_prompt = 'efresh bals:\b' - extra_daemons = ['ltc'] + extra_daemons = ['ltc_rt'] cmd_group = ( ('autosign_setup', 'autosign setup with user’s seed'), @@ -592,10 +592,11 @@ class CmdTestXMRCompat(CmdTestXMRAutosign): data = self.users[self.user] self.user_dump_file = os.path.join( data.wd.wallet_dir, - f'{data.sid}-2-MoneroWatchOnlyWallet.dump') + f'{data.sid}-2-MoneroWatchOnlyWallet.regtest.dump') self.user_daemon_opts = [ f'--monero-daemon=localhost:{data.md.rpc_port}', - '--monero-wallet-rpc-password=abc'] + '--monero-wallet-rpc-password=abc', + '--regtest=1'] self.user_opts = [f'--{self.user}', '--coin=xmr'] + self.user_daemon_opts def addrimport_user(self): diff --git a/test/cmdtest_d/xmrwallet.py b/test/cmdtest_d/xmrwallet.py index 8e919e03..f7fbc6c5 100644 --- a/test/cmdtest_d/xmrwallet.py +++ b/test/cmdtest_d/xmrwallet.py @@ -120,8 +120,8 @@ class CmdTestXMRWallet(CmdTestBase): return from mmgen.protocol import init_proto - self.proto = init_proto(cfg, 'XMR', network='mainnet') - self.extra_opts = ['--wallet-rpc-password=abc'] + self.proto = init_proto(cfg, 'XMR', network='regtest') + self.extra_opts = ['--regtest=1', '--wallet-rpc-password=abc'] self.init_users() self.init_daemon_args() @@ -217,6 +217,7 @@ class CmdTestXMRWallet(CmdTestBase): daemon = wd, test_connection = False) + network_suf = '.regtest' kafile_suf, fn_stem = ( ('.vkeys', 'MoneroWatchOnlyWallet') if autosign else ('.akeys', 'MoneroWallet')) @@ -229,9 +230,9 @@ class CmdTestXMRWallet(CmdTestBase): udir = udir, twdir = wd.wallet_dir, kal_range = kal_range, - kafile = str(udir / f'{sid}-XMR-M[{kal_range}]{kafile_suf}'), - walletfile_fs = str(wd.wallet_dir / f'{sid}-{{}}-{fn_stem}'), - addrfile_fs = str(wd.wallet_dir / f'{sid}-{{}}-{fn_stem}.address.txt'), + kafile = str(udir / f'{sid}-XMR-M[{kal_range}]{network_suf}{kafile_suf}'), + walletfile_fs = str(wd.wallet_dir / f'{sid}-{{}}-{fn_stem}{network_suf}'), + addrfile_fs = str(wd.wallet_dir / f'{sid}-{{}}-{fn_stem}{network_suf}.address.txt'), md = md, md_rpc = md_rpc, wd = wd, @@ -239,14 +240,10 @@ class CmdTestXMRWallet(CmdTestBase): add_coind_args = add_coind_args) def init_daemon_args(self): - common_args = ['--p2p-bind-ip=127.0.0.1', '--fixed-difficulty=1', '--regtest'] # --rpc-ssl-allow-any-cert for u in self.users: other_ports = [self.users[u2].md.p2p_port for u2 in self.users if u2 != u] node_args = [f'--add-exclusive-node=127.0.0.1:{p}' for p in other_ports if p] - self.users[u].md.usr_coind_args = ( - common_args - + node_args - + self.users[u].add_coind_args) + self.users[u].md.usr_coind_args = node_args + self.users[u].add_coind_args # cmd_group methods @@ -264,7 +261,7 @@ class CmdTestXMRWallet(CmdTestBase): run(['mkdir', '-p', str(data.udir)]) t = self.spawn( 'mmgen-keygen', - ['--quiet', '--accept-defaults', '--coin=xmr', f'--outdir={data.udir}'] + ['--quiet', '--accept-defaults', '--coin=xmr', '--regtest=1', f'--outdir={data.udir}'] + add_opts + [data.mmwords, data.kal_range], extra_desc = f'({capfirst(user)})')