The generated root key fingerprints can be used in descriptor origins instead of parent_fingerprint()/stale hardcoded values, so [fingerprint/path]xpub metadata matches the generated keys.
Suggestion:
<details>
<summary>diff</summary>
diff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py
index affeb5ade9..9a4eba3d53 100755
--- a/test/functional/wallet_importdescriptors.py
+++ b/test/functional/wallet_importdescriptors.py
@@ -586,6 +586,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):
change_derivation_path = "84h/1h/0h"
extended_key_1 = ExtendedPrivateKey.generate()
xprv1 = extended_key_1.to_string()
+ xprv1_fingerprint = extended_key_1._fingerprint().hex()
acc_xpub1_key = extended_key_1.derive_path(derivation_path).pubkey()
acc_xpub1 = acc_xpub1_key.to_string()
chg_xpub1_key = extended_key_1.derive_path(change_derivation_path).pubkey()
@@ -593,6 +594,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):
extended_key_2 = ExtendedPrivateKey.generate()
xprv2 = extended_key_2.to_string()
+ xprv2_fingerprint = extended_key_2._fingerprint().hex()
acc_xprv2 = extended_key_2.derive_path(derivation_path).to_string()
acc_xpub2_key = extended_key_2.derive_path(derivation_path).pubkey()
acc_xpub2 = acc_xpub2_key.to_string()
@@ -601,6 +603,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):
extended_key_3 = ExtendedPrivateKey.generate()
xprv3 = extended_key_3.to_string()
+ xprv3_fingerprint = extended_key_3._fingerprint().hex()
acc_xpub3_key = extended_key_3.derive_path(derivation_path).pubkey()
acc_xpub3 = acc_xpub3_key.to_string()
chg_xpub3_key = extended_key_3.derive_path(change_derivation_path).pubkey()
@@ -644,14 +647,14 @@ class ImportDescriptorsTest(BitcoinTestFramework):
wmulti_pub = self.nodes[1].get_wallet_rpc("wmulti_pub")
assert_equal(wmulti_pub.getwalletinfo()['keypoolsize'], 0)
- self.test_importdesc({"desc": descsum_create(f"wsh(multi(2,[{acc_xpub1_key.parent_fingerprint()}/{derivation_path}]{acc_xpub1}/*,[{acc_xpub2_key.parent_fingerprint()}/{derivation_path}]{acc_xpub2}/*,[{acc_xpub3_key.parent_fingerprint()}/{derivation_path}]{acc_xpub3}/*))"),
+ self.test_importdesc({"desc": descsum_create(f"wsh(multi(2,[{xprv1_fingerprint}/{derivation_path}]{acc_xpub1}/*,[{xprv2_fingerprint}/{derivation_path}]{acc_xpub2}/*,[{xprv3_fingerprint}/{derivation_path}]{acc_xpub3}/*))"),
"active": True,
"range": 1000,
"next_index": 0,
"timestamp": "now"},
success=True,
wallet=wmulti_pub)
- self.test_importdesc({"desc": descsum_create(f"wsh(multi(2,[{chg_xpub1_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub1}/*,[{chg_xpub2_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub2}/*,[{chg_xpub3_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub3}/*))"),
+ self.test_importdesc({"desc": descsum_create(f"wsh(multi(2,[{xprv1_fingerprint}/{change_derivation_path}]{chg_xpub1}/*,[{xprv2_fingerprint}/{change_derivation_path}]{chg_xpub2}/*,[{xprv3_fingerprint}/{change_derivation_path}]{chg_xpub3}/*))"),
"active": True,
"internal" : True,
"range": 1000,
@@ -687,14 +690,14 @@ class ImportDescriptorsTest(BitcoinTestFramework):
wmulti_priv1 = self.nodes[1].get_wallet_rpc("wmulti_priv1")
res = wmulti_priv1.importdescriptors([
{
- "desc": descsum_create(f"wsh(multi(2,{xprv1}/{derivation_path}/*,[{acc_xpub2_key.parent_fingerprint()}/{derivation_path}]{acc_xpub2}/*,[{acc_xpub3_key.parent_fingerprint()}/{derivation_path}]{acc_xpub3}/*))"),
+ "desc": descsum_create(f"wsh(multi(2,{xprv1}/{derivation_path}/*,[{xprv2_fingerprint}/{derivation_path}]{acc_xpub2}/*,[{xprv3_fingerprint}/{derivation_path}]{acc_xpub3}/*))"),
"active": True,
"range": 1000,
"next_index": 0,
"timestamp": "now"
},
{
- "desc": descsum_create(f"wsh(multi(2,{xprv1}/{change_derivation_path}/*,[{chg_xpub2_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub2}/*,[{chg_xpub3_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub3}/*))"),
+ "desc": descsum_create(f"wsh(multi(2,{xprv1}/{change_derivation_path}/*,[{xprv2_fingerprint}/{change_derivation_path}]{chg_xpub2}/*,[{xprv3_fingerprint}/{change_derivation_path}]{chg_xpub3}/*))"),
"active": True,
"internal" : True,
"range": 1000,
@@ -710,14 +713,14 @@ class ImportDescriptorsTest(BitcoinTestFramework):
wmulti_priv2 = self.nodes[1].get_wallet_rpc('wmulti_priv2')
res = wmulti_priv2.importdescriptors([
{
- "desc": descsum_create(f"wsh(multi(2,[{acc_xpub1_key.parent_fingerprint()}/{derivation_path}]{acc_xpub1}/*,{xprv2}/{derivation_path}/*,[{acc_xpub3_key.parent_fingerprint()}/{derivation_path}]{acc_xpub3}/*))"),
+ "desc": descsum_create(f"wsh(multi(2,[{xprv1_fingerprint}/{derivation_path}]{acc_xpub1}/*,{xprv2}/{derivation_path}/*,[{xprv3_fingerprint}/{derivation_path}]{acc_xpub3}/*))"),
"active": True,
"range": 1000,
"next_index": 0,
"timestamp": "now"
},
{
- "desc": descsum_create(f"wsh(multi(2,[{chg_xpub1_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub1}/*,{xprv2}/{change_derivation_path}/*,[{chg_xpub3_key.parent_fingerprint()}/{change_derivation_path}]{chg_xpub3}/*))"),
+ "desc": descsum_create(f"wsh(multi(2,[{xprv1_fingerprint}/{change_derivation_path}]{chg_xpub1}/*,{xprv2}/{change_derivation_path}/*,[{xprv3_fingerprint}/{change_derivation_path}]{chg_xpub3}/*))"),
"active": True,
"internal" : True,
"range": 1000,
@@ -807,7 +810,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):
wmulti_priv3 = self.nodes[1].get_wallet_rpc("wmulti_priv3")
res = wmulti_priv3.importdescriptors([
{
- "desc": descsum_create("wsh(multi(2," + xprv1 + "/84h/0h/0h/*,[59b09cd6/84h/0h/0h]" + acc_xpub2 + "/*,[e81a0532/84h/0h/0h]" + acc_xpub3 + "/*))"),
+ "desc": descsum_create(f"wsh(multi(2,{xprv1}/{derivation_path}/*,[{xprv2_fingerprint}/{derivation_path}]{acc_xpub2}/*,[{xprv3_fingerprint}/{derivation_path}]{acc_xpub3}/*))"),
"active": True,
"range": 1000,
"next_index": 0,
@@ -816,7 +819,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):
assert_equal(res[0]['success'], True)
res = wmulti_priv3.importdescriptors([
{
- "desc": descsum_create("wsh(multi(2," + xprv1 + "/84h/0h/0h/*,[59b09cd6/84h/0h/0h]" + acc_xprv2 + "/*,[e81a0532/84h/0h/0h]" + acc_xpub3 + "/*))"),
+ "desc": descsum_create(f"wsh(multi(2,{xprv1}/{derivation_path}/*,[{xprv2_fingerprint}/{derivation_path}]{acc_xprv2}/*,[{xprv3_fingerprint}/{derivation_path}]{acc_xpub3}/*))"),
"active": True,
"range": 1000,
"next_index": 0,
</details>