Skip to content

Commit 0de30ed

Browse files
committed
tests: Test Taproot PSBT signing with keys in other descriptor
Test that the same keys included in other descriptors will still be able to sign a PSBT that requires those keys.
1 parent 6efcdf6 commit 0de30ed

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

test/functional/wallet_taproot.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,10 @@ def do_test_psbt(self, comment, pattern, privmap, treefn, keys_pay, keys_change)
317317
wallet_uuid = uuid.uuid4().hex
318318
self.nodes[0].createwallet(wallet_name=f"psbt_online_{wallet_uuid}", descriptors=True, disable_private_keys=True, blank=True)
319319
self.nodes[1].createwallet(wallet_name=f"psbt_offline_{wallet_uuid}", descriptors=True, blank=True)
320+
self.nodes[1].createwallet(f"key_only_wallet_{wallet_uuid}", descriptors=True, blank=True)
320321
psbt_online = self.nodes[0].get_wallet_rpc(f"psbt_online_{wallet_uuid}")
321322
psbt_offline = self.nodes[1].get_wallet_rpc(f"psbt_offline_{wallet_uuid}")
323+
key_only_wallet = self.nodes[1].get_wallet_rpc(f"key_only_wallet_{wallet_uuid}")
322324

323325
desc_pay = self.make_desc(pattern, privmap, keys_pay, False)
324326
desc_change = self.make_desc(pattern, privmap, keys_change, False)
@@ -334,6 +336,9 @@ def do_test_psbt(self, comment, pattern, privmap, treefn, keys_pay, keys_change)
334336
assert(result[0]['success'])
335337
result = psbt_offline.importdescriptors([{"desc": desc_change, "active": True, "timestamp": "now", "internal": True}])
336338
assert(result[0]['success'])
339+
for key in keys_pay + keys_change:
340+
result = key_only_wallet.importdescriptors([{"desc": descsum_create(f"wpkh({key['xprv']}/*)"), "timestamp":"now"}])
341+
assert(result[0]["success"])
337342
address_type = "bech32m" if "tr" in pattern else "bech32"
338343
for i in range(4):
339344
addr_g = psbt_online.getnewaddress(address_type=address_type)
@@ -349,20 +354,25 @@ def do_test_psbt(self, comment, pattern, privmap, treefn, keys_pay, keys_change)
349354
# Increase fee_rate to compensate for the wallet's inability to estimate fees for script path spends.
350355
psbt = psbt_online.walletcreatefundedpsbt([], [{self.boring.getnewaddress(): Decimal(ret_amnt) / 100000000}], None, {"subtractFeeFromOutputs":[0], "fee_rate": 200, "change_type": address_type})['psbt']
351356
res = psbt_offline.walletprocesspsbt(psbt=psbt, finalize=False)
357+
for wallet in [psbt_offline, key_only_wallet]:
358+
res = wallet.walletprocesspsbt(psbt=psbt, finalize=False)
359+
360+
decoded = wallet.decodepsbt(res["psbt"])
361+
if pattern.startswith("tr("):
362+
for psbtin in decoded["inputs"]:
363+
assert "non_witness_utxo" not in psbtin
364+
assert "witness_utxo" in psbtin
365+
assert "taproot_internal_key" in psbtin
366+
assert "taproot_bip32_derivs" in psbtin
367+
assert "taproot_key_path_sig" in psbtin or "taproot_script_path_sigs" in psbtin
368+
if "taproot_script_path_sigs" in psbtin:
369+
assert "taproot_merkle_root" in psbtin
370+
assert "taproot_scripts" in psbtin
371+
372+
rawtx = self.nodes[0].finalizepsbt(res['psbt'])['hex']
373+
res = self.nodes[0].testmempoolaccept([rawtx])
374+
assert res[0]["allowed"]
352375

353-
decoded = psbt_offline.decodepsbt(res["psbt"])
354-
if pattern.startswith("tr("):
355-
for psbtin in decoded["inputs"]:
356-
assert "non_witness_utxo" not in psbtin
357-
assert "witness_utxo" in psbtin
358-
assert "taproot_internal_key" in psbtin
359-
assert "taproot_bip32_derivs" in psbtin
360-
assert "taproot_key_path_sig" in psbtin or "taproot_script_path_sigs" in psbtin
361-
if "taproot_script_path_sigs" in psbtin:
362-
assert "taproot_merkle_root" in psbtin
363-
assert "taproot_scripts" in psbtin
364-
365-
rawtx = self.nodes[0].finalizepsbt(res['psbt'])['hex']
366376
txid = self.nodes[0].sendrawtransaction(rawtx)
367377
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
368378
assert(psbt_online.gettransaction(txid)['confirmations'] > 0)

0 commit comments

Comments
 (0)