continue signing when finding already finalized inputs
This commit is contained in:
parent
7fdb98e147
commit
f6631e35b8
@ -99,4 +99,23 @@ mod test {
|
|||||||
};
|
};
|
||||||
let _ = wallet.sign(&mut psbt, options).unwrap();
|
let _ = wallet.sign(&mut psbt, options).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_psbt_sign_with_finalized() {
|
||||||
|
let psbt_bip: PSBT = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
||||||
|
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
||||||
|
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
||||||
|
let mut builder = wallet.build_tx();
|
||||||
|
builder.add_recipient(send_to.script_pubkey(), 10_000);
|
||||||
|
let (mut psbt, _) = builder.finish().unwrap();
|
||||||
|
|
||||||
|
// add a finalized input
|
||||||
|
psbt.inputs.push(psbt_bip.inputs[0].clone());
|
||||||
|
psbt.global
|
||||||
|
.unsigned_tx
|
||||||
|
.input
|
||||||
|
.push(psbt_bip.global.unsigned_tx.input[0].clone());
|
||||||
|
|
||||||
|
let _ = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -861,10 +861,14 @@ where
|
|||||||
// this helps us doing our job later
|
// this helps us doing our job later
|
||||||
self.add_input_hd_keypaths(psbt)?;
|
self.add_input_hd_keypaths(psbt)?;
|
||||||
|
|
||||||
// If we aren't allowed to use `witness_utxo`, ensure that every input has the
|
// If we aren't allowed to use `witness_utxo`, ensure that every input but finalized one
|
||||||
// `non_witness_utxo`
|
// has the `non_witness_utxo`
|
||||||
if !sign_options.trust_witness_utxo
|
if !sign_options.trust_witness_utxo
|
||||||
&& psbt.inputs.iter().any(|i| i.non_witness_utxo.is_none())
|
&& psbt
|
||||||
|
.inputs
|
||||||
|
.iter()
|
||||||
|
.filter(|i| i.final_script_witness.is_none() && i.final_script_sig.is_none())
|
||||||
|
.any(|i| i.non_witness_utxo.is_none())
|
||||||
{
|
{
|
||||||
return Err(Error::Signer(signer::SignerError::MissingNonWitnessUtxo));
|
return Err(Error::Signer(signer::SignerError::MissingNonWitnessUtxo));
|
||||||
}
|
}
|
||||||
|
@ -206,6 +206,12 @@ impl Signer for DescriptorXKey<ExtendedPrivKey> {
|
|||||||
return Err(SignerError::InputIndexOutOfRange);
|
return Err(SignerError::InputIndexOutOfRange);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if psbt.inputs[input_index].final_script_sig.is_some()
|
||||||
|
|| psbt.inputs[input_index].final_script_witness.is_some()
|
||||||
|
{
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let (public_key, full_path) = match psbt.inputs[input_index]
|
let (public_key, full_path) = match psbt.inputs[input_index]
|
||||||
.bip32_derivation
|
.bip32_derivation
|
||||||
.iter()
|
.iter()
|
||||||
@ -261,10 +267,16 @@ impl Signer for PrivateKey {
|
|||||||
secp: &SecpCtx,
|
secp: &SecpCtx,
|
||||||
) -> Result<(), SignerError> {
|
) -> Result<(), SignerError> {
|
||||||
let input_index = input_index.unwrap();
|
let input_index = input_index.unwrap();
|
||||||
if input_index >= psbt.inputs.len() {
|
if input_index >= psbt.inputs.len() || input_index >= psbt.global.unsigned_tx.input.len() {
|
||||||
return Err(SignerError::InputIndexOutOfRange);
|
return Err(SignerError::InputIndexOutOfRange);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if psbt.inputs[input_index].final_script_sig.is_some()
|
||||||
|
|| psbt.inputs[input_index].final_script_witness.is_some()
|
||||||
|
{
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let pubkey = self.public_key(&secp);
|
let pubkey = self.public_key(&secp);
|
||||||
if psbt.inputs[input_index].partial_sigs.contains_key(&pubkey) {
|
if psbt.inputs[input_index].partial_sigs.contains_key(&pubkey) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user