Enable signing taproot transactions with only non_witness_utxos
Some wallets may only specify the `non_witness_utxo` for a PSBT input. If that's the case, BDK should still be able to sign. This was pointed out in the discussion of #734
This commit is contained in:
parent
dfeb08fa00
commit
5e9965fca7
@ -4964,6 +4964,29 @@ pub(crate) mod test {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[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]
|
#[test]
|
||||||
fn test_taproot_foreign_utxo() {
|
fn test_taproot_foreign_utxo() {
|
||||||
let (wallet1, _, _) = get_funded_wallet(get_test_wpkh());
|
let (wallet1, _, _) = get_funded_wallet(get_test_wpkh());
|
||||||
|
@ -103,6 +103,7 @@ use miniscript::{Legacy, MiniscriptKey, Segwitv0, Tap};
|
|||||||
|
|
||||||
use super::utils::SecpCtx;
|
use super::utils::SecpCtx;
|
||||||
use crate::descriptor::{DescriptorMeta, XKeyUtils};
|
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
|
/// Identifier of a signer in the `SignersContainers`. Used as a key to find the right signer among
|
||||||
/// multiple of them
|
/// multiple of them
|
||||||
@ -921,11 +922,8 @@ impl ComputeSighash for Tap {
|
|||||||
.unwrap_or_else(|| SchnorrSighashType::Default.into())
|
.unwrap_or_else(|| SchnorrSighashType::Default.into())
|
||||||
.schnorr_hash_ty()
|
.schnorr_hash_ty()
|
||||||
.map_err(|_| SignerError::InvalidSighash)?;
|
.map_err(|_| SignerError::InvalidSighash)?;
|
||||||
let witness_utxos = psbt
|
let witness_utxos = (0..psbt.inputs.len())
|
||||||
.inputs
|
.map(|i| psbt.get_utxo_for(i))
|
||||||
.iter()
|
|
||||||
.cloned()
|
|
||||||
.map(|i| i.witness_utxo)
|
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let mut all_witness_utxos = vec![];
|
let mut all_witness_utxos = vec![];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user