);
}
+ #[test]
+ fn test_taproot_sign_using_non_witness_utxo() {
+ let (wallet, _, prev_txid) = get_funded_wallet(get_test_tr_single_sig());
+ let addr = wallet.get_address(New).unwrap();
+ let mut builder = wallet.build_tx();
+ builder.drain_to(addr.script_pubkey()).drain_wallet();
+ let (mut psbt, _) = builder.finish().unwrap();
+
+ psbt.inputs[0].witness_utxo = None;
+ psbt.inputs[0].non_witness_utxo = wallet.database().get_raw_tx(&prev_txid).unwrap();
+ assert!(
+ psbt.inputs[0].non_witness_utxo.is_some(),
+ "Previous tx should be present in the database"
+ );
+
+ let result = wallet.sign(&mut psbt, Default::default());
+ assert!(result.is_ok(), "Signing should have worked");
+ assert!(
+ result.unwrap(),
+ "Should finalize the input since we can produce signatures"
+ );
+ }
+
#[test]
fn test_taproot_foreign_utxo() {
let (wallet1, _, _) = get_funded_wallet(get_test_wpkh());
use super::utils::SecpCtx;
use crate::descriptor::{DescriptorMeta, XKeyUtils};
+use crate::psbt::PsbtUtils;
/// Identifier of a signer in the `SignersContainers`. Used as a key to find the right signer among
/// multiple of them
.unwrap_or_else(|| SchnorrSighashType::Default.into())
.schnorr_hash_ty()
.map_err(|_| SignerError::InvalidSighash)?;
- let witness_utxos = psbt
- .inputs
- .iter()
- .cloned()
- .map(|i| i.witness_utxo)
+ let witness_utxos = (0..psbt.inputs.len())
+ .map(|i| psbt.get_utxo_for(i))
.collect::<Vec<_>>();
let mut all_witness_utxos = vec![];