From 136a4bddb2571a3db3994c2bf29f715ba66a70b8 Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Fri, 16 Apr 2021 10:45:11 +0200 Subject: [PATCH] Verify PSBT input satisfaction --- src/descriptor/policy.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/descriptor/policy.rs b/src/descriptor/policy.rs index aa8c11c6..de22fd3e 100644 --- a/src/descriptor/policy.rs +++ b/src/descriptor/policy.rs @@ -62,6 +62,7 @@ use super::checksum::get_checksum; use super::error::Error; use super::XKeyUtils; use bitcoin::util::psbt::PartiallySignedTransaction as PSBT; +use miniscript::psbt::PsbtInputSatisfier; /// Raw public key or extended key fingerprint #[derive(Debug, Clone, Default, Serialize)] @@ -817,9 +818,17 @@ impl ExtractPolicy for Miniscript csv: None, }, }; - if let BuildSatisfaction::PsbtTimelocks { current_height, .. } = build_sat { + if let BuildSatisfaction::PsbtTimelocks { + current_height, + psbt, + .. + } = build_sat + { let after = After::new(Some(current_height), false); - if Satisfier::::check_after(&after, *value) { + let after_sat = Satisfier::::check_after(&after, *value); + let inputs_sat = psbt_inputs_sat(psbt) + .all(|sat| Satisfier::::check_after(&sat, *value)); + if after_sat && inputs_sat { policy.satisfaction = policy.contribution.clone(); } } @@ -837,11 +846,14 @@ impl ExtractPolicy for Miniscript if let BuildSatisfaction::PsbtTimelocks { current_height, input_max_height, - .. + psbt, } = build_sat { let older = Older::new(Some(current_height), Some(input_max_height), false); - if Satisfier::::check_older(&older, *value) { + let older_sat = Satisfier::::check_older(&older, *value); + let inputs_sat = psbt_inputs_sat(psbt) + .all(|sat| Satisfier::::check_older(&sat, *value)); + if older_sat && inputs_sat { policy.satisfaction = policy.contribution.clone(); } } @@ -911,6 +923,10 @@ impl ExtractPolicy for Miniscript } } +fn psbt_inputs_sat(psbt: &PSBT) -> impl Iterator { + (0..psbt.inputs.len()).map(move |i| PsbtInputSatisfier::new(psbt, i)) +} + /// Options to build the satisfaction field in the policy #[derive(Debug, Clone, Copy)] pub enum BuildSatisfaction<'a> {