Skip to content

Commit dbe7673

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 c83e1db commit dbe7673

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

test/functional/wallet_mnemonicbits.py

+31-13
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,32 @@ 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
assert not desc['active']
4463
# skip imported coinbase private key
64+
cb_count += 1
4565
continue
4666
assert_equal(len(desc['mnemonic'].split()), 12)
4767
mnemonic_count += 1
48-
if desc['mnemonic'] == mnemonic_pre:
49-
found_in_encrypted += 1
50-
assert desc['active']
68+
assert desc['mnemonic'] == mnemonic_pre
69+
assert desc['active']
5170
# there should 3 descriptors in total
5271
# one of them is inactive imported private key for coinbase. It has no mnemonic without mnemonic
5372
# two other should be active and have mnemonic
54-
assert_equal(found_in_encrypted, 2)
73+
assert_equal(mnemonic_count, 2)
5574
assert_equal(mnemonic_count, 2)
5675
assert_equal(len(descriptors), 3)
5776
else:
@@ -74,8 +93,7 @@ def run_test(self):
7493
if self.options.descriptors:
7594
self.nodes[0].createwallet("wallet_256", False, True, "", False, True) # blank Descriptors
7695
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
96+
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc(self.default_wallet_name)).split()), 12) # 12 words by default
7997
assert_equal(len(self.nodes[0].get_wallet_rpc("wallet_160").listdescriptors(True)["descriptors"][0]["mnemonic"].split()), 15) # 15 words
8098
assert_equal(len(self.nodes[0].get_wallet_rpc("wallet_192").listdescriptors(True)["descriptors"][0]["mnemonic"].split()), 18) # 18 words
8199
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)