|
|
@@ -17,8 +17,8 @@ import re, asyncio
|
|
|
|
|
|
from mmgen.color import blue, cyan, brown
|
|
|
|
|
|
-from ..include.common import imsg, silence, end_silence
|
|
|
-from .include.common import get_file_with_ext
|
|
|
+from ..include.common import imsg, silence, end_silence, strip_ansi_escapes
|
|
|
+from .include.common import get_file_with_ext, cleanup_env
|
|
|
|
|
|
from .xmrwallet import CmdTestXMRWallet
|
|
|
from .autosign import CmdTestAutosignThreaded
|
|
|
@@ -50,18 +50,19 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
|
|
|
|
|
|
cmd_group = (
|
|
|
('daemon_version', 'checking daemon version'),
|
|
|
- ('gen_kafile_miner', 'generating key-address file for Miner'),
|
|
|
- ('create_wallet_miner', 'creating Monero wallet for Miner'),
|
|
|
- ('mine_initial_coins', 'mining initial coins'),
|
|
|
('create_tmp_wallets', 'creating temporary online wallets for Alice'),
|
|
|
('new_account_alice', 'adding an account to Alice’s tmp wallet'),
|
|
|
('new_address_alice', 'adding an address to Alice’s tmp wallet'),
|
|
|
('new_address_alice_label', 'adding an address to Alice’s tmp wallet (with label)'),
|
|
|
('dump_tmp_wallets', 'dumping Alice’s tmp wallets'),
|
|
|
+ ('dump_tmp_wallets_json', 'dumping Alice’s tmp wallets to JSON format'),
|
|
|
('delete_tmp_wallets', 'deleting Alice’s tmp wallets'),
|
|
|
+ ('gen_kafile_miner', 'generating key-address file for Miner'),
|
|
|
+ ('create_wallet_miner', 'creating Monero wallet for Miner'),
|
|
|
+ ('mine_initial_coins', 'mining initial coins'),
|
|
|
('autosign_setup', 'autosign setup with Alice’s seed'),
|
|
|
('autosign_xmr_setup', 'autosign setup (creation of Monero signing wallets)'),
|
|
|
- ('create_watchonly_wallets', 'creating watch-only wallets from Alice’s wallet dumps'),
|
|
|
+ ('restore_watchonly_wallets', 'creating watch-only wallets from Alice’s wallet dumps'),
|
|
|
('delete_tmp_dump_files', 'deleting Alice’s dump files'),
|
|
|
('fund_alice1', 'sending funds to Alice (wallet #1)'),
|
|
|
('check_bal_alice1', 'mining, checking balance (wallet #1)'),
|
|
|
@@ -174,10 +175,13 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
|
|
|
def dump_tmp_wallets(self):
|
|
|
return self._dump_wallets(autosign=False)
|
|
|
|
|
|
+ def dump_tmp_wallets_json(self):
|
|
|
+ return self._dump_wallets(autosign=False, op='dump_json')
|
|
|
+
|
|
|
def dump_wallets(self):
|
|
|
return self._dump_wallets(autosign=True)
|
|
|
|
|
|
- def _dump_wallets(self, autosign):
|
|
|
+ def _dump_wallets(self, autosign, op='dump'):
|
|
|
data = self.users['alice']
|
|
|
self.insert_device_online()
|
|
|
t = self.spawn(
|
|
|
@@ -186,10 +190,14 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
|
|
|
+ (['--alice', '--compat'] if self.compat else [f'--wallet-dir={data.udir}'])
|
|
|
+ [f'--daemon=localhost:{data.md.rpc_port}']
|
|
|
+ (self.autosign_opts if autosign else [])
|
|
|
- + ['dump']
|
|
|
- + ([] if autosign else [get_file_with_ext(data.udir, 'akeys')]))
|
|
|
+ + [op]
|
|
|
+ + ([] if autosign else [get_file_with_ext(data.udir, 'akeys')]),
|
|
|
+ env = cleanup_env(self.cfg))
|
|
|
t.expect('2 wallets dumped')
|
|
|
- t.read()
|
|
|
+ res = t.read()
|
|
|
+ if op == 'dump_json':
|
|
|
+ import json
|
|
|
+ data = json.loads(re.sub('Stopping.*', '', strip_ansi_escapes(res)).strip())
|
|
|
self.remove_device_online()
|
|
|
return t
|
|
|
|
|
|
@@ -222,6 +230,8 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
|
|
|
async def fund_alice1(self):
|
|
|
return await self.fund_alice(wallet=1)
|
|
|
|
|
|
+ fund_alice1b = fund_alice1
|
|
|
+
|
|
|
async def check_bal_alice1(self):
|
|
|
return await self.check_bal_alice(wallet=1)
|
|
|
|
|
|
@@ -253,7 +263,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
|
|
|
self.remove_device()
|
|
|
return t
|
|
|
|
|
|
- def create_watchonly_wallets(self):
|
|
|
+ def restore_watchonly_wallets(self):
|
|
|
return self._create_wallets('restore')
|
|
|
|
|
|
def restore_wallets(self):
|
|
|
@@ -484,3 +494,60 @@ class CmdTestXMRAutosignNoCompat(CmdTestXMRAutosign):
|
|
|
Monero autosigning operations (non-xmrwallet compat mode)
|
|
|
"""
|
|
|
compat = False
|
|
|
+
|
|
|
+class CmdTestXMRCompat(CmdTestXMRAutosign):
|
|
|
+ """
|
|
|
+ Monero autosigning operations (compat mode)
|
|
|
+ """
|
|
|
+ menu_prompt = 'efresh balances:\b'
|
|
|
+
|
|
|
+ cmd_group = (
|
|
|
+ ('autosign_setup', 'autosign setup with Alice’s seed'),
|
|
|
+ ('autosign_xmr_setup', 'autosign setup (creation of Monero signing wallets)'),
|
|
|
+ ('create_watchonly_wallets', 'creating Alice’s watch-only wallets'),
|
|
|
+ ('gen_kafile_miner', 'generating key-address file for Miner'),
|
|
|
+ ('create_wallet_miner', 'creating Monero wallet for Miner'),
|
|
|
+ ('mine_initial_coins', 'mining initial coins'),
|
|
|
+ ('fund_alice1', 'sending funds to Alice (wallet #1)'),
|
|
|
+ ('mine_blocks', 'mining some blocks'),
|
|
|
+ ('alice_listaddresses', 'performing operations on Alice’s tracking wallets (listaddresses)'),
|
|
|
+ ('fund_alice1b', 'sending funds to Alice (wallet #1)'),
|
|
|
+ ('mine_blocks', 'mining some blocks'),
|
|
|
+ ('alice_twview', 'performing operations on Alice’s tracking wallets (twview)'),
|
|
|
+ )
|
|
|
+
|
|
|
+ def __init__(self, cfg, trunner, cfgs, spawn):
|
|
|
+ super().__init__(cfg, trunner, cfgs, spawn)
|
|
|
+ if trunner is None:
|
|
|
+ return
|
|
|
+ self.alice_opts = [
|
|
|
+ '--alice',
|
|
|
+ '--coin=xmr',
|
|
|
+ '--monero-wallet-rpc-password=passwOrd',
|
|
|
+ f'--monero-daemon=localhost:{self.users["alice"].md.rpc_port}']
|
|
|
+
|
|
|
+ def create_watchonly_wallets(self):
|
|
|
+ return self._create_wallets()
|
|
|
+
|
|
|
+ async def mine_blocks(self):
|
|
|
+ self.spawn(msg_only=True)
|
|
|
+ return await self.mine(10)
|
|
|
+
|
|
|
+ def alice_listaddresses(self):
|
|
|
+ return self._alice_twops('listaddresses', 2, 'y', r'Primary account.*1\.234567891234')
|
|
|
+
|
|
|
+ def alice_twview(self):
|
|
|
+ return self._alice_twops('twview', 1, 'n', r'New Label.*2\.469135782468')
|
|
|
+
|
|
|
+ def _alice_twops(self, op, addr_num, add_timestr_resp, expect_str):
|
|
|
+ self.insert_device_online()
|
|
|
+ t = self.spawn('mmgen-tool', self.alice_opts + self.autosign_opts + [op, 'interactive=1'])
|
|
|
+ t.expect(self.menu_prompt, 'l')
|
|
|
+ t.expect('main menu): ', str(addr_num))
|
|
|
+ t.expect(': ', 'New Label\n')
|
|
|
+ t.expect('(y/N): ', add_timestr_resp)
|
|
|
+ t.expect(self.menu_prompt, 'R')
|
|
|
+ t.expect(expect_str, regex=True)
|
|
|
+ t.expect(self.menu_prompt, 'q')
|
|
|
+ self.remove_device_online()
|
|
|
+ return t
|