]> Untitled Git - bdk/commitdiff
Make wallet methods take &mut psbt
authorLLFourn <lloyd.fourn@gmail.com>
Tue, 27 Apr 2021 23:53:03 +0000 (09:53 +1000)
committerLLFourn <lloyd.fourn@gmail.com>
Wed, 28 Apr 2021 05:34:25 +0000 (15:34 +1000)
Rather than consuming it because that is unergonomic.

CHANGELOG.md
Cargo.toml
README.md
src/lib.rs
src/wallet/mod.rs
testutils-macros/src/lib.rs

index 4e223c9204f30f2d55082dfc6ce654eefb0d7b19..fecd885ec1988d14470dc600266a8234547f8739 100644 (file)
@@ -13,6 +13,10 @@ Removed `fill_satisfaction` method in favor of enum parameter in `extract_policy
 #### Added
 Timelocks are considered (optionally) in building the `satisfaction` field
 
+### Wallet
+
+- Changed `Wallet::{sign, finalize_psbt}` now take a `&mut psbt` rather than consuming it.
+
 ## [v0.6.0] - [v0.5.1]
 
 ### Misc
index a413ae74a3e493e19cde073e29145807f020a3f4..dabfd62bc608d3cce34b6e223f540682f501b050 100644 (file)
@@ -60,7 +60,7 @@ test-md-docs = ["electrum"]
 
 [dev-dependencies]
 bdk-testutils = "0.4"
-bdk-testutils-macros = "0.5"
+bdk-testutils-macros = { path = "testutils-macros"}
 serial_test = "0.4"
 lazy_static = "1.4"
 env_logger = "0.7"
index 4e21b3554cc876521f2c9a24a949f53ec0b291f3..fac0608e9ba22e49719c7993c7ff82357c63d4c0 100644 (file)
--- a/README.md
+++ b/README.md
@@ -143,9 +143,9 @@ fn main() -> Result<(), bdk::Error> {
     )?;
 
     let psbt = "...";
-    let psbt = deserialize(&base64::decode(psbt).unwrap())?;
+    let mut psbt = deserialize(&base64::decode(psbt).unwrap())?;
 
-    let (signed_psbt, finalized) = wallet.sign(psbt, None)?;
+    let finalized = wallet.sign(&mut psbt, None)?;
 
     Ok(())
 }
@@ -166,4 +166,4 @@ at your option.
 
 Unless you explicitly state otherwise, any contribution intentionally submitted
 for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
-dual licensed as above, without any additional terms or conditions.
\ No newline at end of file
+dual licensed as above, without any additional terms or conditions.
index 0819db5f759d60a53700b7747c4c251f74ef6cc0..917d6a8f6f0094b06a792d6d535f8b1d17b9a8fa 100644 (file)
 //!     )?;
 //!
 //!     let psbt = "...";
-//!     let psbt = deserialize(&base64::decode(psbt).unwrap())?;
+//!     let mut psbt = deserialize(&base64::decode(psbt).unwrap())?;
 //!
-//!     let (signed_psbt, finalized) = wallet.sign(psbt, None)?;
+//!     let finalized = wallet.sign(&mut psbt, None)?;
 //!
 //!     Ok(())
 //! }
index 55949cda522113a2bfb2f9563d92ba313a4813b9..6ae397a6de2a5fe7233ff62241e35fe67d8cdf72 100644 (file)
@@ -699,24 +699,24 @@ where
     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
     /// # let wallet = doctest_wallet!();
     /// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
-    /// let (psbt, _) = {
+    /// let (mut psbt, _) = {
     ///     let mut builder = wallet.build_tx();
     ///     builder
     ///         .add_recipient(to_address.script_pubkey(), 50_000)
     ///         .enable_rbf();
     ///     builder.finish()?
     /// };
-    /// let (psbt, _) = wallet.sign(psbt, None)?;
+    /// let _ = wallet.sign(&mut psbt, None)?;
     /// let tx = psbt.extract_tx();
     /// // broadcast tx but it's taking too long to confirm so we want to bump the fee
-    /// let (psbt, _) =  {
+    /// let (mut psbt, _) =  {
     ///     let mut builder = wallet.build_fee_bump(tx.txid())?;
     ///     builder
     ///         .fee_rate(FeeRate::from_sat_per_vb(5.0));
     ///     builder.finish()?
     /// };
     ///
-    /// let (psbt, _) = wallet.sign(psbt, None)?;
+    /// let _ = wallet.sign(&mut psbt, None)?;
     /// let fee_bumped_tx = psbt.extract_tx();
     /// // broadcast fee_bumped_tx to replace original
     /// # Ok::<(), bdk::Error>(())
@@ -843,17 +843,17 @@ where
     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
     /// # let wallet = doctest_wallet!();
     /// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
-    /// let (psbt, _) = {
+    /// let (mut psbt, _) = {
     ///     let mut builder = wallet.build_tx();
     ///     builder.add_recipient(to_address.script_pubkey(), 50_000);
     ///     builder.finish()?
     /// };
-    /// let (signed_psbt, finalized) = wallet.sign(psbt, None)?;
+    /// let  finalized = wallet.sign(&mut psbt, None)?;
     /// assert!(finalized, "we should have signed all the inputs");
     /// # Ok::<(), bdk::Error>(())
-    pub fn sign(&self, mut psbt: PSBT, assume_height: Option<u32>) -> Result<(PSBT, bool), Error> {
+    pub fn sign(&self, psbt: &mut PSBT, assume_height: Option<u32>) -> Result<bool, Error> {
         // this helps us doing our job later
-        self.add_input_hd_keypaths(&mut psbt)?;
+        self.add_input_hd_keypaths(psbt)?;
 
         for signer in self
             .signers
@@ -862,10 +862,10 @@ where
             .chain(self.change_signers.signers().iter())
         {
             if signer.sign_whole_tx() {
-                signer.sign(&mut psbt, None, &self.secp)?;
+                signer.sign(psbt, None, &self.secp)?;
             } else {
                 for index in 0..psbt.inputs.len() {
-                    signer.sign(&mut psbt, Some(index), &self.secp)?;
+                    signer.sign(psbt, Some(index), &self.secp)?;
                 }
             }
         }
@@ -909,9 +909,9 @@ where
     /// Try to finalize a PSBT
     pub fn finalize_psbt(
         &self,
-        mut psbt: PSBT,
+        psbt: &mut PSBT,
         assume_height: Option<u32>,
-    ) -> Result<(PSBT, bool), Error> {
+    ) -> Result<bool, Error> {
         let tx = &psbt.global.unsigned_tx;
         let mut finished = true;
 
@@ -984,7 +984,7 @@ where
             }
         }
 
-        Ok((psbt, finished))
+        Ok(finished)
     }
 
     /// Return the secp256k1 context used for all signing operations
@@ -2423,7 +2423,7 @@ mod test {
             .add_recipient(addr.script_pubkey(), 60_000)
             .add_foreign_utxo(utxo.outpoint, psbt_input, foreign_utxo_satisfaction)
             .unwrap();
-        let (psbt, details) = builder.finish().unwrap();
+        let (mut psbt, details) = builder.finish().unwrap();
 
         assert_eq!(
             details.sent - details.received,
@@ -2440,14 +2440,14 @@ mod test {
             "foreign_utxo should be in there"
         );
 
-        let (psbt, finished) = wallet1.sign(psbt, None).unwrap();
+        let finished = wallet1.sign(&mut psbt, None).unwrap();
 
         assert!(
             !finished,
             "only one of the inputs should have been signed so far"
         );
 
-        let (_, finished) = wallet2.sign(psbt, None).unwrap();
+        let finished = wallet2.sign(&mut psbt, None).unwrap();
         assert!(finished, "all the inputs should have been signed now");
     }
 
@@ -3466,12 +3466,12 @@ mod test {
         builder
             .set_single_recipient(addr.script_pubkey())
             .drain_wallet();
-        let (psbt, _) = builder.finish().unwrap();
+        let (mut psbt, _) = builder.finish().unwrap();
 
-        let (signed_psbt, finalized) = wallet.sign(psbt, None).unwrap();
+        let finalized = wallet.sign(&mut psbt, None).unwrap();
         assert_eq!(finalized, true);
 
-        let extracted = signed_psbt.extract_tx();
+        let extracted = psbt.extract_tx();
         assert_eq!(extracted.input[0].witness.len(), 2);
     }
 
@@ -3483,12 +3483,12 @@ mod test {
         builder
             .set_single_recipient(addr.script_pubkey())
             .drain_wallet();
-        let (psbt, _) = builder.finish().unwrap();
+        let (mut psbt, _) = builder.finish().unwrap();
 
-        let (signed_psbt, finalized) = wallet.sign(psbt, None).unwrap();
+        let finalized = wallet.sign(&mut psbt, None).unwrap();
         assert_eq!(finalized, true);
 
-        let extracted = signed_psbt.extract_tx();
+        let extracted = psbt.extract_tx();
         assert_eq!(extracted.input[0].witness.len(), 2);
     }
 
@@ -3500,12 +3500,12 @@ mod test {
         builder
             .set_single_recipient(addr.script_pubkey())
             .drain_wallet();
-        let (psbt, _) = builder.finish().unwrap();
+        let (mut psbt, _) = builder.finish().unwrap();
 
-        let (signed_psbt, finalized) = wallet.sign(psbt, None).unwrap();
+        let finalized = wallet.sign(&mut psbt, None).unwrap();
         assert_eq!(finalized, true);
 
-        let extracted = signed_psbt.extract_tx();
+        let extracted = psbt.extract_tx();
         assert_eq!(extracted.input[0].witness.len(), 2);
     }
 
@@ -3517,12 +3517,12 @@ mod test {
         builder
             .set_single_recipient(addr.script_pubkey())
             .drain_wallet();
-        let (psbt, _) = builder.finish().unwrap();
+        let (mut psbt, _) = builder.finish().unwrap();
 
-        let (signed_psbt, finalized) = wallet.sign(psbt, None).unwrap();
+        let finalized = wallet.sign(&mut psbt, None).unwrap();
         assert_eq!(finalized, true);
 
-        let extracted = signed_psbt.extract_tx();
+        let extracted = psbt.extract_tx();
         assert_eq!(extracted.input[0].witness.len(), 2);
     }
 
@@ -3535,12 +3535,12 @@ mod test {
         builder
             .set_single_recipient(addr.script_pubkey())
             .drain_wallet();
-        let (psbt, _) = builder.finish().unwrap();
+        let (mut psbt, _) = builder.finish().unwrap();
 
-        let (signed_psbt, finalized) = wallet.sign(psbt, None).unwrap();
+        let finalized = wallet.sign(&mut psbt, None).unwrap();
         assert_eq!(finalized, true);
 
-        let extracted = signed_psbt.extract_tx();
+        let extracted = psbt.extract_tx();
         assert_eq!(extracted.input[0].witness.len(), 2);
     }
 
@@ -3557,10 +3557,10 @@ mod test {
         psbt.inputs[0].bip32_derivation.clear();
         assert_eq!(psbt.inputs[0].bip32_derivation.len(), 0);
 
-        let (signed_psbt, finalized) = wallet.sign(psbt, None).unwrap();
+        let finalized = wallet.sign(&mut psbt, None).unwrap();
         assert_eq!(finalized, true);
 
-        let extracted = signed_psbt.extract_tx();
+        let extracted = psbt.extract_tx();
         assert_eq!(extracted.input[0].witness.len(), 2);
     }
 
@@ -3606,7 +3606,7 @@ mod test {
 
         psbt.inputs.push(dud_input);
         psbt.global.unsigned_tx.input.push(bitcoin::TxIn::default());
-        let (psbt, is_final) = wallet.sign(psbt, None).unwrap();
+        let is_final = wallet.sign(&mut psbt, None).unwrap();
         assert!(
             !is_final,
             "shouldn't be final since we can't sign one of the inputs"
index 44c74e12c0da2de3ac4cea7e9b21a4bdb7100484..2d42db14cc3ed5ea7565be871c6405fc922f5390 100644 (file)
@@ -297,8 +297,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_tx();
                     builder.add_recipient(node_addr.script_pubkey(), 25_000);
-                    let (psbt, details) = builder.finish().unwrap();
-                    let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                    let (mut psbt, details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     let tx = psbt.extract_tx();
                     println!("{}", bitcoin::consensus::encode::serialize_hex(&tx));
@@ -326,8 +326,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_tx();
                     builder.add_recipient(node_addr.script_pubkey(), 25_000);
-                    let (psbt, details) = builder.finish().unwrap();
-                    let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                    let (mut psbt, details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     let sent_txid = wallet.broadcast(psbt.extract_tx()).unwrap();
 
@@ -367,8 +367,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
                     for _ in 0..5 {
                         let mut builder = wallet.build_tx();
                         builder.add_recipient(node_addr.script_pubkey(), 5_000);
-                        let (psbt, details) = builder.finish().unwrap();
-                        let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                        let (mut psbt, details) = builder.finish().unwrap();
+                        let finalized = wallet.sign(&mut psbt, None).unwrap();
                         assert!(finalized, "Cannot finalize transaction");
                         wallet.broadcast(psbt.extract_tx()).unwrap();
 
@@ -401,8 +401,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_tx();
                     builder.add_recipient(node_addr.script_pubkey().clone(), 5_000).enable_rbf();
-                    let (psbt, details) = builder.finish().unwrap();
-                    let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                    let (mut psbt, details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -411,8 +411,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_fee_bump(details.txid).unwrap();
                     builder.fee_rate(FeeRate::from_sat_per_vb(2.1));
-                    let (new_psbt, new_details) = builder.finish().unwrap();
-                    let (new_psbt, finalized) = wallet.sign(new_psbt, None).unwrap();
+                    let (mut new_psbt, new_details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut new_psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(new_psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -437,8 +437,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_tx();
                     builder.add_recipient(node_addr.script_pubkey().clone(), 49_000).enable_rbf();
-                    let (psbt, details) = builder.finish().unwrap();
-                    let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                    let (mut psbt, details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -447,8 +447,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_fee_bump(details.txid).unwrap();
                     builder.fee_rate(FeeRate::from_sat_per_vb(5.0));
-                    let (new_psbt, new_details) = builder.finish().unwrap();
-                    let (new_psbt, finalized) = wallet.sign(new_psbt, None).unwrap();
+                    let (mut new_psbt, new_details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut new_psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(new_psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -473,8 +473,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_tx();
                     builder.add_recipient(node_addr.script_pubkey().clone(), 49_000).enable_rbf();
-                    let (psbt, details) = builder.finish().unwrap();
-                    let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                    let (mut psbt, details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -483,8 +483,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_fee_bump(details.txid).unwrap();
                     builder.fee_rate(FeeRate::from_sat_per_vb(10.0));
-                    let (new_psbt, new_details) = builder.finish().unwrap();
-                    let (new_psbt, finalized) = wallet.sign(new_psbt, None).unwrap();
+                    let (mut new_psbt, new_details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut new_psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(new_psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -507,8 +507,8 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_tx();
                     builder.add_recipient(node_addr.script_pubkey().clone(), 49_000).enable_rbf();
-                    let (psbt, details) = builder.finish().unwrap();
-                    let (psbt, finalized) = wallet.sign(psbt, None).unwrap();
+                    let (mut psbt, details) = builder.finish().unwrap();
+                    let finalized = wallet.sign(&mut psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();
@@ -517,10 +517,10 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
 
                     let mut builder = wallet.build_fee_bump(details.txid).unwrap();
                     builder.fee_rate(FeeRate::from_sat_per_vb(123.0));
-                    let (new_psbt, new_details) = builder.finish().unwrap();
+                    let (mut new_psbt, new_details) = builder.finish().unwrap();
                     println!("{:#?}", new_details);
 
-                    let (new_psbt, finalized) = wallet.sign(new_psbt, None).unwrap();
+                    let finalized = wallet.sign(&mut new_psbt, None).unwrap();
                     assert!(finalized, "Cannot finalize transaction");
                     wallet.broadcast(new_psbt.extract_tx()).unwrap();
                     wallet.sync(noop_progress(), None).unwrap();