]> Untitled Git - bdk/commitdiff
add try_finalize to SignOptions
authorKaFai Choi <kafai@river.com>
Sat, 4 Jun 2022 05:42:52 +0000 (12:42 +0700)
committerKaFai Choi <kafai@river.com>
Wed, 6 Jul 2022 10:13:19 +0000 (17:13 +0700)
CHANGELOG.md
src/wallet/mod.rs
src/wallet/signer.rs

index e89ad8ddc932b43ee345bc8a94cb5bc5e2f94ed0..aef08e111ff67694e51bfce5db1b4f05acd6d4c1 100644 (file)
@@ -22,7 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
   - Signing Taproot PSBTs (key spend and script spend)
   - Support for `tr()` descriptors in the `descriptor!()` macro
 - Add support for Bitcoin Core 23.0 when using the `rpc` blockchain
-- Add `remove_partial_sigs` to `SignOptions`
+- Add `remove_partial_sigs` and `try_finalize` to `SignOptions`
 
 ## [v0.18.0] - [v0.17.0]
 
index 5adcf831223632799ad31bc73d5d7b642b68572c..8e513b72168afc57d31cf97f09f0c1de79bf910b 100644 (file)
@@ -1050,7 +1050,11 @@ where
         }
 
         // attempt to finalize
-        self.finalize_psbt(psbt, sign_options)
+        if sign_options.try_finalize {
+            self.finalize_psbt(psbt, sign_options)
+        } else {
+            Ok(false)
+        }
     }
 
     /// Return the spending policies for the wallet's descriptor
@@ -3911,6 +3915,40 @@ pub(crate) mod test {
         }
     }
 
+    #[test]
+    fn test_try_finalize_sign_option() {
+        let (wallet, _, _) = get_funded_wallet("wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)");
+
+        for try_finalize in &[true, false] {
+            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().0;
+
+            let finalized = wallet
+                .sign(
+                    &mut psbt,
+                    SignOptions {
+                        try_finalize: *try_finalize,
+                        ..Default::default()
+                    },
+                )
+                .unwrap();
+
+            psbt.inputs.iter().for_each(|input| {
+                if *try_finalize {
+                    assert!(finalized);
+                    assert!(input.final_script_sig.is_some());
+                    assert!(input.final_script_witness.is_some());
+                } else {
+                    assert!(!finalized);
+                    assert!(input.final_script_sig.is_none());
+                    assert!(input.final_script_witness.is_none());
+                }
+            });
+        }
+    }
+
     #[test]
     fn test_sign_nonstandard_sighash() {
         let sighash = EcdsaSighashType::NonePlusAnyoneCanPay;
index 2267aae39b9e8964295e0ab67015843017405f9a..e93618da1080ec02e5f76a54fb2355a8093ca4ca 100644 (file)
@@ -671,6 +671,10 @@ pub struct SignOptions {
     ///
     /// Defaults to `true` which will remove partial_sigs after finalizing.
     pub remove_partial_sigs: bool,
+    /// Whether to try finalizing psbt input after the inputs are signed.
+    ///
+    /// Defaults to `true` which will try fianlizing psbt after inputs are signed.
+    pub try_finalize: bool,
 }
 
 #[allow(clippy::derivable_impls)]
@@ -681,6 +685,7 @@ impl Default for SignOptions {
             assume_height: None,
             allow_all_sighashes: false,
             remove_partial_sigs: true,
+            try_finalize: true,
         }
     }
 }