Skip to content

Commit

Permalink
test: add test for descriptorprocesspsbt RPC
Browse files Browse the repository at this point in the history
  • Loading branch information
ishaanam committed May 6, 2023
1 parent fb2a3a7 commit 1bce12a
Showing 1 changed file with 46 additions and 1 deletion.
47 changes: 46 additions & 1 deletion test/functional/rpc_psbt.py
Expand Up @@ -42,7 +42,10 @@
find_vout_for_address,
random_bytes,
)
from test_framework.wallet_util import bytes_to_wif
from test_framework.wallet_util import (
bytes_to_wif,
get_generate_key
)

import json
import os
Expand Down Expand Up @@ -944,6 +947,48 @@ def test_psbt_input_keys(psbt_input, keys):
self.log.info("Test we don't crash when making a 0-value funded transaction at 0 fee without forcing an input selection")
assert_raises_rpc_error(-4, "Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input", self.nodes[0].walletcreatefundedpsbt, [], [{"data": "deadbeef"}], 0, {"fee_rate": "0"})

self.log.info("Test descriptorprocesspsbt updates and signs a psbt with descriptors")

self.generate(self.nodes[2], 1)

# Disable the wallet for node 2 since `descriptorprocesspsbt` does not use the wallet
self.restart_node(2, extra_args=["-disablewallet"])
self.connect_nodes(0, 2)
self.connect_nodes(1, 2)

key_info = get_generate_key()
key = key_info.privkey
address = key_info.p2wpkh_addr

descriptor = descsum_create(f"wpkh({key})")

txid = self.nodes[0].sendtoaddress(address, 1)
self.sync_all()
vout = find_output(self.nodes[0], txid, 1)

psbt = self.nodes[2].createpsbt([{"txid": txid, "vout": vout}], {self.nodes[0].getnewaddress(): 0.99999})
decoded = self.nodes[2].decodepsbt(psbt)
test_psbt_input_keys(decoded['inputs'][0], [])

# Test that even if the wrong descriptor is given, `witness_utxo` and `non_witness_utxo`
# are still added to the psbt
alt_descriptor = descsum_create(f"wpkh({get_generate_key().privkey})")
alt_psbt = self.nodes[2].descriptorprocesspsbt(psbt=psbt, descriptors=[alt_descriptor], sighashtype="ALL")["psbt"]
decoded = self.nodes[2].decodepsbt(alt_psbt)
test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo', 'non_witness_utxo'])

# Test that the psbt is not finalized and does not have bip32_derivs unless specified
psbt = self.nodes[2].descriptorprocesspsbt(psbt=psbt, descriptors=[descriptor], sighashtype="ALL", bip32derivs=True, finalize=False)["psbt"]
decoded = self.nodes[2].decodepsbt(psbt)
test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo', 'non_witness_utxo', 'partial_signatures', 'bip32_derivs'])

psbt = self.nodes[2].descriptorprocesspsbt(psbt=psbt, descriptors=[descriptor], sighashtype="ALL", bip32derivs=False, finalize=True)["psbt"]
decoded = self.nodes[2].decodepsbt(psbt)
test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo', 'non_witness_utxo', 'final_scriptwitness'])

# Broadcast transaction
rawtx = self.nodes[2].finalizepsbt(psbt)["hex"]
self.nodes[2].sendrawtransaction(rawtx)

if __name__ == '__main__':
PSBTTest().main()

0 comments on commit 1bce12a

Please sign in to comment.