Skip to content

Commit dbd0ee2

Browse files
committed
fix: intermittent error in wallet_mnemonic.py due to different order of descriptors
Descriptor with Coinbase private key can be in any position
1 parent a8f3f61 commit dbd0ee2

File tree

1 file changed

+32
-15
lines changed

1 file changed

+32
-15
lines changed

test/functional/wallet_mnemonicbits.py

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,26 @@ def set_test_params(self):
1717
def skip_test_if_missing_module(self):
1818
self.skip_if_no_wallet()
1919

20+
def get_mnemonic(self, node):
21+
if not self.options.descriptors:
22+
return node.dumphdinfo()["mnemonic"]
23+
24+
mnemonic = None
25+
descriptors = node.listdescriptors(True)['descriptors']
26+
for desc in descriptors:
27+
if desc['desc'][:4] == 'pkh(':
28+
pass
29+
if mnemonic is None:
30+
mnemonic = desc['mnemonic']
31+
else:
32+
assert_equal(mnemonic, desc['mnemonic'])
33+
elif desc['desc'][:6] == 'combo(':
34+
assert 'mnemonic' not in desc
35+
else:
36+
self.log.info(f"unknown type of descriptor: {desc['desc']}")
37+
assert False
38+
return mnemonic
39+
2040
def run_test(self):
2141
self.log.info("Test -mnemonicbits")
2242

@@ -25,33 +45,31 @@ def run_test(self):
2545
self.nodes[0].assert_start_raises_init_error(['-mnemonicbits=123'], "Error: Invalid '-mnemonicbits'. Allowed values: 128, 160, 192, 224, 256.")
2646
self.start_node(0)
2747

28-
mnemonic_pre = self.nodes[0].listdescriptors(True)['descriptors'][1]["mnemonic"] if self.options.descriptors else self.nodes[0].dumphdinfo()["mnemonic"]
48+
mnemonic_pre = self.get_mnemonic(self.nodes[0])
49+
2950

3051
self.nodes[0].encryptwallet('pass')
3152
self.nodes[0].walletpassphrase('pass', 100)
3253
if self.options.descriptors:
33-
assert "mnemonic" not in self.nodes[0].listdescriptors()['descriptors'][0]
34-
assert "mnemonic" in self.nodes[0].listdescriptors(True)['descriptors'][0]
35-
36-
descriptors = self.nodes[0].listdescriptors(True)['descriptors']
37-
assert_equal(descriptors[0]['mnemonic'], descriptors[1]['mnemonic'])
54+
for desc in self.nodes[0].listdescriptors()['descriptors']:
55+
assert "mnemonic" not in desc
3856

3957
mnemonic_count = 0
40-
found_in_encrypted = 0
58+
cb_count = 0
59+
descriptors = self.nodes[0].listdescriptors(True)['descriptors']
4160
for desc in descriptors:
4261
if 'mnemonic' not in desc:
4362
# skip imported coinbase private key
63+
cb_count += 1
4464
continue
4565
assert_equal(len(desc['mnemonic'].split()), 12)
4666
mnemonic_count += 1
47-
if desc['mnemonic'] == mnemonic_pre:
48-
found_in_encrypted += 1
49-
assert desc['active']
50-
# there should 5 descriptors in total
67+
assert desc['mnemonic'] == mnemonic_pre
68+
assert desc['active']
69+
# there should 3 descriptors in total
5170
# one of them imported private key for coinbase without mnemonic
52-
# encryption of descriptor wallet creates new private keys,
5371
# it should be 2 active and 2 inactive mnemonics
54-
assert_equal(found_in_encrypted, 2)
72+
assert_equal(mnemonic_count, 2)
5573
assert_equal(mnemonic_count, 2)
5674
assert_equal(len(descriptors), 3)
5775
else:
@@ -74,8 +92,7 @@ def run_test(self):
7492
if self.options.descriptors:
7593
self.nodes[0].createwallet("wallet_256", False, True, "", False, True) # blank Descriptors
7694
self.nodes[0].get_wallet_rpc("wallet_256").upgradetohd()
77-
# first descriptor is private key with no mnemonic for CbTx (see node.importprivkey), we use number#1 here instead
78-
assert_equal(len(self.nodes[0].get_wallet_rpc(self.default_wallet_name).listdescriptors(True)["descriptors"][1]["mnemonic"].split()), 12) # 12 words by default
95+
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc(self.default_wallet_name)).split()), 12) # 12 words by default
7996
assert_equal(len(self.nodes[0].get_wallet_rpc("wallet_160").listdescriptors(True)["descriptors"][0]["mnemonic"].split()), 15) # 15 words
8097
assert_equal(len(self.nodes[0].get_wallet_rpc("wallet_192").listdescriptors(True)["descriptors"][0]["mnemonic"].split()), 18) # 18 words
8198
assert_equal(len(self.nodes[0].get_wallet_rpc("wallet_224").listdescriptors(True)["descriptors"][0]["mnemonic"].split()), 21) # 21 words

0 commit comments

Comments
 (0)