aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorwillcl-ark <will@256k1.dev>2024-06-28 12:45:47 +0100
committerwillcl-ark <will@256k1.dev>2024-07-03 09:16:17 +0100
commit7e36dca657c66bc70b04d5b850e5a335aecfb902 (patch)
tree93a8a195ef3cd222d6d90f921ac361d671685fba /test
parent39cea21ec51b9838669c38fefa14f25c36ae7096 (diff)
test: add test for modififed walletprocesspsbt calls
This test checks that we can successfully process PSBTs and opt out of finalization. Previously trying to call `walletprocesspsbt` would attempt to auto-finalize (as a convenience), and would not permit opt-out of finalization, instead aborting via `CHECK_NONFATAL`.
Diffstat (limited to 'test')
-rwxr-xr-xtest/functional/rpc_psbt.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py
index 6ee7e56886..7d4b6655a4 100755
--- a/test/functional/rpc_psbt.py
+++ b/test/functional/rpc_psbt.py
@@ -68,6 +68,28 @@ class PSBTTest(BitcoinTestFramework):
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
+ def test_psbt_incomplete_after_invalid_modification(self):
+ self.log.info("Check that PSBT is correctly marked as incomplete after invalid modification")
+ node = self.nodes[2]
+ wallet = node.get_wallet_rpc(self.default_wallet_name)
+ address = wallet.getnewaddress()
+ wallet.sendtoaddress(address=address, amount=1.0)
+ self.generate(node, nblocks=1, sync_fun=lambda: self.sync_all(self.nodes[:2]))
+
+ utxos = wallet.listunspent(addresses=[address])
+ psbt = wallet.createpsbt([{"txid": utxos[0]["txid"], "vout": utxos[0]["vout"]}], [{wallet.getnewaddress(): 0.9999}])
+ signed_psbt = wallet.walletprocesspsbt(psbt)["psbt"]
+
+ # Modify the raw transaction by changing the output address, so the signature is no longer valid
+ signed_psbt_obj = PSBT.from_base64(signed_psbt)
+ substitute_addr = wallet.getnewaddress()
+ raw = wallet.createrawtransaction([{"txid": utxos[0]["txid"], "vout": utxos[0]["vout"]}], [{substitute_addr: 0.9999}])
+ signed_psbt_obj.g.map[PSBT_GLOBAL_UNSIGNED_TX] = bytes.fromhex(raw)
+
+ # Check that the walletprocesspsbt call succeeds but also recognizes that the transaction is not complete
+ signed_psbt_incomplete = wallet.walletprocesspsbt(signed_psbt_obj.to_base64(), finalize=False)
+ assert signed_psbt_incomplete["complete"] is False
+
def test_utxo_conversion(self):
self.log.info("Check that non-witness UTXOs are removed for segwit v1+ inputs")
mining_node = self.nodes[2]
@@ -589,6 +611,7 @@ class PSBTTest(BitcoinTestFramework):
if self.options.descriptors:
self.test_utxo_conversion()
+ self.test_psbt_incomplete_after_invalid_modification()
self.test_input_confs_control()