diff --git a/examples/electrum.rs b/examples/electrum.rs index 8ccbe130..1b63548c 100644 --- a/examples/electrum.rs +++ b/examples/electrum.rs @@ -88,7 +88,7 @@ fn main() -> Result<(), anyhow::Error> { tx_builder.add_recipient(address.script_pubkey(), SEND_AMOUNT); tx_builder.fee_rate(target_fee_rate); - let mut psbt = tx_builder.finish()?; + let mut psbt = tx_builder.finish()?.psbt; let finalized = wallet.sign(&mut psbt, SignOptions::default())?; assert!(finalized); let original_fee = psbt.fee_amount().unwrap(); @@ -123,7 +123,7 @@ fn main() -> Result<(), anyhow::Error> { let feerate = FeeRate::from_sat_per_vb(tx_feerate.to_sat_per_vb_ceil() + 1).unwrap(); let mut builder = wallet.build_fee_bump(txid).expect("failed to bump tx"); builder.fee_rate(feerate); - let mut bumped_psbt = builder.finish().unwrap(); + let mut bumped_psbt = builder.finish().unwrap().psbt; let finalize_btx = wallet.sign(&mut bumped_psbt, SignOptions::default())?; assert!(finalize_btx); let new_fee = bumped_psbt.fee_amount().unwrap(); diff --git a/examples/esplora_async.rs b/examples/esplora_async.rs index 6e19069c..2ebe478a 100644 --- a/examples/esplora_async.rs +++ b/examples/esplora_async.rs @@ -82,7 +82,7 @@ async fn main() -> Result<(), anyhow::Error> { tx_builder.add_recipient(address.script_pubkey(), SEND_AMOUNT); tx_builder.fee_rate(target_fee_rate); - let mut psbt = tx_builder.finish()?; + let mut psbt = tx_builder.finish()?.psbt; let finalized = wallet.sign(&mut psbt, SignOptions::default())?; assert!(finalized); let original_fee = psbt.fee_amount().unwrap(); @@ -116,7 +116,7 @@ async fn main() -> Result<(), anyhow::Error> { let feerate = FeeRate::from_sat_per_vb(tx_feerate.to_sat_per_vb_ceil() + 1).unwrap(); let mut builder = wallet.build_fee_bump(txid).expect("failed to bump tx"); builder.fee_rate(feerate); - let mut bumped_psbt = builder.finish().unwrap(); + let mut bumped_psbt = builder.finish().unwrap().psbt; let finalize_btx = wallet.sign(&mut bumped_psbt, SignOptions::default())?; assert!(finalize_btx); let new_fee = bumped_psbt.fee_amount().unwrap(); diff --git a/examples/esplora_blocking.rs b/examples/esplora_blocking.rs index 3131bec0..419f56ec 100644 --- a/examples/esplora_blocking.rs +++ b/examples/esplora_blocking.rs @@ -77,7 +77,7 @@ fn main() -> Result<(), anyhow::Error> { tx_builder.add_recipient(address.script_pubkey(), SEND_AMOUNT); tx_builder.fee_rate(target_fee_rate); - let mut psbt = tx_builder.finish()?; + let mut psbt = tx_builder.finish()?.psbt; let finalized = wallet.sign(&mut psbt, SignOptions::default())?; assert!(finalized); let original_fee = psbt.fee_amount().unwrap(); @@ -112,7 +112,7 @@ fn main() -> Result<(), anyhow::Error> { let feerate = FeeRate::from_sat_per_vb(tx_feerate.to_sat_per_vb_ceil() + 1).unwrap(); let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_rate(feerate); - let mut new_psbt = builder.finish().unwrap(); + let mut new_psbt = builder.finish().unwrap().psbt; let finalize_tx = wallet.sign(&mut new_psbt, SignOptions::default())?; assert!(finalize_tx); let new_fee = new_psbt.fee_amount().unwrap(); diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index 41be40ef..614df3e2 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -1363,7 +1363,7 @@ impl Wallet { coin_selection: Cs, params: TxParams, rng: &mut impl RngCore, - ) -> Result { + ) -> Result { let keychains: BTreeMap<_, _> = self.indexed_graph.index.keychains().collect(); let external_descriptor = keychains.get(&KeychainKind::External).expect("must exist"); let internal_descriptor = keychains.get(&KeychainKind::Internal); @@ -1679,7 +1679,7 @@ impl Wallet { } } - Ok(psbt) + Ok(tx_builder::BuilderResult { psbt, fee_rate }) } /// Bump the fee of a transaction previously created with this wallet. @@ -1707,8 +1707,8 @@ impl Wallet { /// .add_recipient(to_address.script_pubkey(), Amount::from_sat(50_000)); /// builder.finish()? /// }; - /// let _ = wallet.sign(&mut psbt, SignOptions::default())?; - /// let tx = psbt.clone().extract_tx().expect("tx"); + /// let _ = wallet.sign(&mut psbt.psbt, SignOptions::default())?; + /// let tx = psbt.psbt.clone().extract_tx().expect("tx"); /// // broadcast tx but it's taking too long to confirm so we want to bump the fee /// let mut psbt = { /// let mut builder = wallet.build_fee_bump(tx.compute_txid())?; @@ -1717,8 +1717,8 @@ impl Wallet { /// builder.finish()? /// }; /// - /// let _ = wallet.sign(&mut psbt, SignOptions::default())?; - /// let fee_bumped_tx = psbt.extract_tx(); + /// let _ = wallet.sign(&mut psbt.psbt, SignOptions::default())?; + /// let fee_bumped_tx = psbt.psbt.extract_tx(); /// // broadcast fee_bumped_tx to replace original /// # Ok::<(), anyhow::Error>(()) /// ``` @@ -1883,7 +1883,7 @@ impl Wallet { /// builder.add_recipient(to_address.script_pubkey(), Amount::from_sat(50_000)); /// builder.finish()? /// }; - /// let finalized = wallet.sign(&mut psbt, SignOptions::default())?; + /// let finalized = wallet.sign(&mut psbt.psbt, SignOptions::default())?; /// assert!(finalized, "we should have signed all the inputs"); /// # Ok::<(),anyhow::Error>(()) pub fn sign(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result { diff --git a/src/wallet/tx_builder.rs b/src/wallet/tx_builder.rs index 885e07a0..9de685f4 100644 --- a/src/wallet/tx_builder.rs +++ b/src/wallet/tx_builder.rs @@ -95,7 +95,7 @@ use crate::{KeychainKind, LocalOutput, Utxo, WeightedUtxo}; /// builder.finish()? /// }; /// -/// assert_eq!(psbt1.unsigned_tx.output[..2], psbt2.unsigned_tx.output[..2]); +/// assert_eq!(psbt1.psbt.unsigned_tx.output[..2], psbt2.psbt.unsigned_tx.output[..2]); /// # Ok::<(), anyhow::Error>(()) /// ``` /// @@ -759,7 +759,7 @@ impl TxBuilder<'_, Cs> { /// **WARNING**: To avoid change address reuse you must persist the changes resulting from one /// or more calls to this method before closing the wallet. See [`Wallet::reveal_next_address`]. #[cfg(feature = "std")] - pub fn finish(self) -> Result { + pub fn finish(self) -> Result { self.finish_with_aux_rand(&mut bitcoin::key::rand::thread_rng()) } @@ -773,11 +773,25 @@ impl TxBuilder<'_, Cs> { /// /// **WARNING**: To avoid change address reuse you must persist the changes resulting from one /// or more calls to this method before closing the wallet. See [`Wallet::reveal_next_address`]. - pub fn finish_with_aux_rand(self, rng: &mut impl RngCore) -> Result { + pub fn finish_with_aux_rand( + self, + rng: &mut impl RngCore, + ) -> Result { self.wallet.create_tx(self.coin_selection, self.params, rng) } } +/// Result of building a transaction. +/// +/// Contains the unsigned PSBT and the feerate that was used during construction. +#[derive(Debug, Clone)] +pub struct BuilderResult { + /// The constructed PSBT (unsigned transaction) + pub psbt: Psbt, + /// The feerate used for this transaction (sat/vB) + pub fee_rate: FeeRate, +} + #[derive(Debug)] /// Error returned from [`TxBuilder::add_utxo`] and [`TxBuilder::add_utxos`] pub enum AddUtxoError { @@ -1224,7 +1238,12 @@ mod test { .drain_wallet() .drain_to(recipient.script_pubkey()); let tx = builder.finish().unwrap(); - let output = tx.unsigned_tx.output.first().expect("must have one output"); + let output = tx + .psbt + .unsigned_tx + .output + .first() + .expect("must have one output"); assert_eq!(output.value, Amount::ONE_BTC * 6); } @@ -1237,7 +1256,12 @@ mod test { .drain_wallet() .drain_to(recipient.script_pubkey()); let tx = builder.finish().unwrap(); - let output = tx.unsigned_tx.output.first().expect("must have one output"); + let output = tx + .psbt + .unsigned_tx + .output + .first() + .expect("must have one output"); assert_eq!(output.value, Amount::ONE_BTC * 3); } @@ -1250,7 +1274,12 @@ mod test { .drain_wallet() .drain_to(recipient.script_pubkey()); let tx = builder.finish().unwrap(); - let output = tx.unsigned_tx.output.first().expect("must have one output"); + let output = tx + .psbt + .unsigned_tx + .output + .first() + .expect("must have one output"); assert_eq!(output.value, Amount::ONE_BTC); } } @@ -1286,7 +1315,7 @@ mod test { builder.fee_absolute(Amount::from_sat(1_000)); let psbt = builder.finish().unwrap(); - let tx = psbt.extract_tx().unwrap(); + let tx = psbt.psbt.extract_tx().unwrap(); let txid = tx.compute_txid(); let feerate = wallet.calculate_fee_rate(&tx).unwrap().to_sat_per_kwu(); insert_tx(&mut wallet, tx); diff --git a/tests/add_foreign_utxo.rs b/tests/add_foreign_utxo.rs index 1dd0a8c9..deae01b4 100644 --- a/tests/add_foreign_utxo.rs +++ b/tests/add_foreign_utxo.rs @@ -35,7 +35,7 @@ fn test_add_foreign_utxo() { .only_witness_utxo() .add_foreign_utxo(utxo.outpoint, psbt_input, foreign_utxo_satisfaction) .unwrap(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; wallet1.insert_txout(utxo.outpoint, utxo.txout); let fee = check_fee!(wallet1, psbt); let (sent, received) = @@ -109,7 +109,7 @@ fn test_calculate_fee_with_missing_foreign_utxo() { .only_witness_utxo() .add_foreign_utxo(utxo.outpoint, psbt_input, foreign_utxo_satisfaction) .unwrap(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let res = wallet1.calculate_fee(&tx); assert!( @@ -270,7 +270,7 @@ fn test_taproot_foreign_utxo() { .add_recipient(addr.script_pubkey(), Amount::from_sat(60_000)) .add_foreign_utxo(utxo.outpoint, psbt_input, foreign_utxo_satisfaction) .unwrap(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet1.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); wallet1.insert_txout(utxo.outpoint, utxo.txout); diff --git a/tests/build_fee_bump.rs b/tests/build_fee_bump.rs index 4a243dfa..7f3f5d45 100644 --- a/tests/build_fee_bump.rs +++ b/tests/build_fee_bump.rs @@ -23,12 +23,12 @@ fn test_bump_fee_irreplaceable_tx() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); builder.set_exact_sequence(Sequence(0xFFFFFFFE)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let txid = tx.compute_txid(); insert_tx(&mut wallet, tx); - wallet.build_fee_bump(txid).unwrap().finish().unwrap(); + wallet.build_fee_bump(txid).unwrap().finish().unwrap().psbt; } #[test] @@ -38,7 +38,7 @@ fn test_bump_fee_confirmed_tx() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let txid = tx.compute_txid(); @@ -51,7 +51,7 @@ fn test_bump_fee_confirmed_tx() { }; insert_anchor(&mut wallet, txid, anchor); - wallet.build_fee_bump(txid).unwrap().finish().unwrap(); + wallet.build_fee_bump(txid).unwrap().finish().unwrap().psbt; } #[test] @@ -61,7 +61,7 @@ fn test_bump_fee_low_fee_rate() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let feerate = psbt.fee_rate().unwrap(); let tx = psbt.extract_tx().expect("failed to extract tx"); @@ -90,7 +90,7 @@ fn test_bump_fee_low_abs() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let txid = tx.compute_txid(); @@ -98,7 +98,7 @@ fn test_bump_fee_low_abs() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_absolute(Amount::from_sat(10)); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -108,7 +108,7 @@ fn test_bump_fee_zero_abs() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let txid = tx.compute_txid(); @@ -116,7 +116,7 @@ fn test_bump_fee_zero_abs() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_absolute(Amount::ZERO); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -127,7 +127,7 @@ fn test_bump_fee_reduce_change() { .assume_checked(); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let original_sent_received = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let original_fee = check_fee!(wallet, psbt); @@ -139,7 +139,7 @@ fn test_bump_fee_reduce_change() { let feerate = FeeRate::from_sat_per_kwu(625); // 2.5 sat/vb let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_rate(feerate); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -171,7 +171,7 @@ fn test_bump_fee_reduce_change() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_absolute(Amount::from_sat(200)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -210,7 +210,7 @@ fn test_bump_fee_reduce_single_recipient() { .assume_checked(); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.clone().extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); let original_fee = check_fee!(wallet, psbt); @@ -227,7 +227,7 @@ fn test_bump_fee_reduce_single_recipient() { .drain_to(addr.script_pubkey()) // drain wallet output amount will be re-calculated with new fee rate .drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, _received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -250,7 +250,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() { .assume_checked(); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let original_fee = check_fee!(wallet, psbt); let tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); @@ -266,7 +266,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() { .drain_to(addr.script_pubkey()) // drain wallet output amount will be re-calculated with new fee rate .drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = &psbt.unsigned_tx; let (sent, _received) = wallet.sent_and_received(tx); let fee = check_fee!(wallet, psbt); @@ -316,7 +316,7 @@ fn test_bump_fee_drain_wallet() { }) .unwrap() .manually_selected_only(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); @@ -330,7 +330,7 @@ fn test_bump_fee_drain_wallet() { builder .drain_wallet() .fee_rate(FeeRate::from_sat_per_vb_unchecked(5)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, _received) = wallet.sent_and_received(&psbt.extract_tx().expect("failed to extract tx")); @@ -381,7 +381,7 @@ fn test_bump_fee_remove_output_manually_selected_only() { .add_utxo(outpoint) .unwrap() .manually_selected_only(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -392,7 +392,7 @@ fn test_bump_fee_remove_output_manually_selected_only() { builder .manually_selected_only() .fee_rate(FeeRate::from_sat_per_vb_unchecked(255)); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -423,7 +423,7 @@ fn test_bump_fee_add_input() { .assume_checked(); let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let original_details = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -431,7 +431,7 @@ fn test_bump_fee_add_input() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(50)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -470,7 +470,7 @@ fn test_bump_fee_absolute_add_input() { .assume_checked(); let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -478,7 +478,7 @@ fn test_bump_fee_absolute_add_input() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_absolute(Amount::from_sat(6_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -524,7 +524,7 @@ fn test_bump_fee_no_change_add_input_and_change() { .add_utxo(op) .unwrap() .manually_selected_only(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let original_sent_received = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let original_fee = check_fee!(wallet, psbt); @@ -537,7 +537,7 @@ fn test_bump_fee_no_change_add_input_and_change() { // the original output untouched. let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(50)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -582,7 +582,7 @@ fn test_bump_fee_force_add_input() { .assume_checked(); let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let mut tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -598,7 +598,7 @@ fn test_bump_fee_force_add_input() { .add_utxo(incoming_op) .unwrap() .fee_rate(FeeRate::from_sat_per_vb_unchecked(5)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -639,7 +639,7 @@ fn test_bump_fee_absolute_force_add_input() { .assume_checked(); let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let mut tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -657,7 +657,7 @@ fn test_bump_fee_absolute_force_add_input() { .add_utxo(incoming_op) .unwrap() .fee_absolute(Amount::from_sat(250)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -703,7 +703,7 @@ fn test_bump_fee_unconfirmed_inputs_only() { .assume_checked(); let mut builder = wallet.build_tx(); builder.drain_wallet().drain_to(addr.script_pubkey()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // Now we receive one transaction with 0 confirmations. We won't be able to use that for // fee bumping, as it's still unconfirmed! receive_output(&mut wallet, Amount::from_sat(25_000), ReceiveTo::Mempool(0)); @@ -716,7 +716,7 @@ fn test_bump_fee_unconfirmed_inputs_only() { insert_tx(&mut wallet, tx); let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(25)); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -735,7 +735,7 @@ fn test_bump_fee_unconfirmed_input() { receive_output(&mut wallet, Amount::from_sat(25_000), ReceiveTo::Mempool(0)); let mut builder = wallet.build_tx(); builder.drain_wallet().drain_to(addr.script_pubkey()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let mut tx = psbt.extract_tx().expect("failed to extract tx"); let txid = tx.compute_txid(); for txin in &mut tx.input { @@ -753,7 +753,7 @@ fn test_bump_fee_unconfirmed_input() { .drain_to(addr.script_pubkey()) // drain wallet output amount will be re-calculated with new fee rate .drain_wallet(); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -763,7 +763,7 @@ fn test_legacy_bump_fee_zero_abs() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let txid = tx.compute_txid(); @@ -771,7 +771,7 @@ fn test_legacy_bump_fee_zero_abs() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_absolute(Amount::ZERO); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -810,7 +810,7 @@ fn test_legacy_bump_fee_drain_wallet() { }) .unwrap() .manually_selected_only(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let original_sent_received = wallet.sent_and_received(&tx); @@ -824,7 +824,7 @@ fn test_legacy_bump_fee_drain_wallet() { builder .drain_wallet() .fee_rate(FeeRate::from_sat_per_vb_unchecked(5)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, _received) = wallet.sent_and_received(&psbt.extract_tx().expect("failed to extract tx")); @@ -859,7 +859,7 @@ fn test_legacy_bump_fee_add_input() { .assume_checked(); let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let original_details = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -867,7 +867,7 @@ fn test_legacy_bump_fee_add_input() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(50)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -906,7 +906,7 @@ fn test_legacy_bump_fee_absolute_add_input() { .assume_checked(); let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let tx = psbt.extract_tx().expect("failed to extract tx"); let (original_sent, _original_received) = wallet.sent_and_received(&tx); let txid = tx.compute_txid(); @@ -914,7 +914,7 @@ fn test_legacy_bump_fee_absolute_add_input() { let mut builder = wallet.build_fee_bump(txid).unwrap(); builder.fee_absolute(Amount::from_sat(6_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); let fee = check_fee!(wallet, psbt); @@ -973,7 +973,7 @@ fn test_bump_fee_pay_to_anchor_foreign_utxo() { .only_witness_utxo() .fee_rate(FeeRate::from_sat_per_vb_unchecked(2)) .drain_to(drain_spk.clone()); - let psbt = tx_builder.finish().unwrap(); + let psbt = tx_builder.finish().unwrap().psbt; let tx = psbt.unsigned_tx.clone(); assert!(tx.input.iter().any(|txin| txin.previous_output == outpoint)); let txid1 = tx.compute_txid(); @@ -988,7 +988,7 @@ fn test_bump_fee_pay_to_anchor_foreign_utxo() { .drain_to(drain_spk) .only_witness_utxo() .fee_rate(FeeRate::from_sat_per_vb_unchecked(5)); - let psbt = tx_builder.finish().unwrap(); + let psbt = tx_builder.finish().unwrap().psbt; let tx = &psbt.unsigned_tx; assert!(tx.input.iter().any(|txin| txin.previous_output == outpoint)); } diff --git a/tests/psbt.rs b/tests/psbt.rs index 08c4acc9..48ec5160 100644 --- a/tests/psbt.rs +++ b/tests/psbt.rs @@ -14,7 +14,7 @@ fn test_psbt_malformed_psbt_input_legacy() { let send_to = wallet.peek_address(KeychainKind::External, 0); let mut builder = wallet.build_tx(); builder.add_recipient(send_to.script_pubkey(), Amount::from_sat(10_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; psbt.inputs.push(psbt_bip.inputs[0].clone()); let options = SignOptions { trust_witness_utxo: true, @@ -31,7 +31,7 @@ fn test_psbt_malformed_psbt_input_segwit() { let send_to = wallet.peek_address(KeychainKind::External, 0); let mut builder = wallet.build_tx(); builder.add_recipient(send_to.script_pubkey(), Amount::from_sat(10_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; psbt.inputs.push(psbt_bip.inputs[1].clone()); let options = SignOptions { trust_witness_utxo: true, @@ -47,7 +47,7 @@ fn test_psbt_malformed_tx_input() { let send_to = wallet.peek_address(KeychainKind::External, 0); let mut builder = wallet.build_tx(); builder.add_recipient(send_to.script_pubkey(), Amount::from_sat(10_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; psbt.unsigned_tx.input.push(TxIn::default()); let options = SignOptions { trust_witness_utxo: true, @@ -63,7 +63,7 @@ fn test_psbt_sign_with_finalized() { let send_to = wallet.peek_address(KeychainKind::External, 0); let mut builder = wallet.build_tx(); builder.add_recipient(send_to.script_pubkey(), Amount::from_sat(10_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; // add a finalized input psbt.inputs.push(psbt_bip.inputs[0].clone()); @@ -85,7 +85,7 @@ fn test_psbt_fee_rate_with_witness_utxo() { let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); builder.fee_rate(expected_fee_rate); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let fee_amount = psbt.fee_amount(); assert!(fee_amount.is_some()); @@ -110,7 +110,7 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() { let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); builder.fee_rate(expected_fee_rate); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let fee_amount = psbt.fee_amount(); assert!(fee_amount.is_some()); let unfinalized_fee_rate = psbt.fee_rate().unwrap(); @@ -134,7 +134,7 @@ fn test_psbt_fee_rate_with_missing_txout() { let mut builder = wpkh_wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); builder.fee_rate(expected_fee_rate); - let mut wpkh_psbt = builder.finish().unwrap(); + let mut wpkh_psbt = builder.finish().unwrap().psbt; wpkh_psbt.inputs[0].witness_utxo = None; wpkh_psbt.inputs[0].non_witness_utxo = None; @@ -148,7 +148,7 @@ fn test_psbt_fee_rate_with_missing_txout() { let mut builder = pkh_wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); builder.fee_rate(expected_fee_rate); - let mut pkh_psbt = builder.finish().unwrap(); + let mut pkh_psbt = builder.finish().unwrap().psbt; pkh_psbt.inputs[0].non_witness_utxo = None; assert!(pkh_psbt.fee_amount().is_none()); @@ -177,7 +177,7 @@ fn test_psbt_multiple_internalkey_signers() { let send_to = wallet.peek_address(KeychainKind::External, 0); let mut builder = wallet.build_tx(); builder.drain_to(send_to.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let unsigned_tx = psbt.unsigned_tx.clone(); // Adds a signer for the wrong internal key, bdk should not use this key to sign diff --git a/tests/wallet.rs b/tests/wallet.rs index c779c0a4..92591b74 100644 --- a/tests/wallet.rs +++ b/tests/wallet.rs @@ -185,7 +185,7 @@ macro_rules! from_str { #[should_panic(expected = "NoRecipients")] fn test_create_tx_empty_recipients() { let (mut wallet, _) = get_funded_wallet_wpkh(); - wallet.build_tx().finish().unwrap(); + wallet.build_tx().finish().unwrap().psbt; } #[test] @@ -197,7 +197,7 @@ fn test_create_tx_manually_selected_empty_utxos() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .manually_selected_only(); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -230,7 +230,7 @@ fn test_create_tx_custom_version() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .version(42); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.version.0, 42); } @@ -242,7 +242,7 @@ fn test_create_tx_default_locktime_is_last_sync_height() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // Since we never synced the wallet we don't have a last_sync_height // we could use to try to prevent fee sniping. We default to 0. @@ -256,7 +256,7 @@ fn test_create_tx_fee_sniping_locktime_last_sync() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // If there's no current_height we're left with using the last sync height assert_eq!( @@ -271,7 +271,7 @@ fn test_create_tx_default_locktime_cltv() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.lock_time.to_consensus_u32(), 100_000); } @@ -282,7 +282,7 @@ fn test_create_tx_locktime_cltv_timestamp() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.lock_time.to_consensus_u32(), 1_734_230_218); @@ -300,7 +300,7 @@ fn test_create_tx_custom_locktime() { .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .current_height(630_001) .nlocktime(absolute::LockTime::from_height(630_000).unwrap()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // When we explicitly specify a nlocktime // we don't try any fee sniping prevention trick @@ -316,7 +316,7 @@ fn test_create_tx_custom_locktime_compatible_with_cltv() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .nlocktime(absolute::LockTime::from_height(630_000).unwrap()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.lock_time.to_consensus_u32(), 630_000); } @@ -343,7 +343,7 @@ fn test_create_tx_custom_csv() { builder .set_exact_sequence(Sequence(42)) .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // we allow setting a sequence higher than required assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(42)); } @@ -354,7 +354,7 @@ fn test_create_tx_no_rbf_csv() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(6)); } @@ -378,7 +378,7 @@ fn test_create_tx_with_default_rbf_csv() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // When CSV is enabled it takes precedence over the rbf value (unless forced by the user). // It will be set to the OP_CSV value, in this case 6 assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(6)); @@ -391,7 +391,7 @@ fn test_create_tx_no_rbf_cltv() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); builder.set_exact_sequence(Sequence(0xFFFFFFFE)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(0xFFFFFFFE)); } @@ -404,7 +404,7 @@ fn test_create_tx_custom_rbf_sequence() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .set_exact_sequence(Sequence(0xDEADBEEF)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(0xDEADBEEF)); } @@ -439,7 +439,7 @@ fn test_create_tx_default_sequence() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(0xFFFFFFFD)); } @@ -450,7 +450,7 @@ fn test_create_tx_drain_wallet_and_drain_to() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(psbt.unsigned_tx.output.len(), 1); @@ -472,7 +472,7 @@ fn test_create_tx_drain_wallet_and_drain_to_and_with_recipient() { .add_recipient(addr.script_pubkey(), Amount::from_sat(20_000)) .drain_to(drain_addr.script_pubkey()) .drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); let outputs = psbt.unsigned_tx.output; @@ -499,7 +499,7 @@ fn test_create_tx_drain_to_and_utxos() { .drain_to(addr.script_pubkey()) .add_utxos(&utxos) .unwrap(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(psbt.unsigned_tx.output.len(), 1); @@ -516,7 +516,7 @@ fn test_create_tx_drain_to_no_drain_wallet_no_utxos() { let drain_addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(drain_addr.script_pubkey()); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -525,7 +525,7 @@ fn test_create_tx_default_fee_rate() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_fee_rate!(psbt, fee, FeeRate::BROADCAST_MIN, @add_signature); @@ -539,7 +539,7 @@ fn test_create_tx_custom_fee_rate() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .fee_rate(FeeRate::from_sat_per_vb_unchecked(5)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_fee_rate!(psbt, fee, FeeRate::from_sat_per_vb_unchecked(5), @add_signature); @@ -553,7 +553,7 @@ fn test_legacy_create_tx_custom_fee_rate() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .fee_rate(FeeRate::from_sat_per_vb_unchecked(5)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_fee_rate_legacy!(psbt, fee, FeeRate::from_sat_per_vb_unchecked(5), @add_signature); @@ -568,7 +568,7 @@ fn test_create_tx_absolute_fee() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_absolute(Amount::from_sat(100)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(fee, Amount::from_sat(100)); @@ -588,7 +588,7 @@ fn test_legacy_create_tx_absolute_fee() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_absolute(Amount::from_sat(100)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(fee, Amount::from_sat(100)); @@ -608,7 +608,7 @@ fn test_create_tx_absolute_zero_fee() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_absolute(Amount::ZERO); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(fee, Amount::ZERO); @@ -628,7 +628,7 @@ fn test_legacy_create_tx_absolute_zero_fee() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_absolute(Amount::ZERO); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(fee, Amount::ZERO); @@ -649,7 +649,7 @@ fn test_create_tx_absolute_high_fee() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_absolute(Amount::from_sat(60_000)); - let _ = builder.finish().unwrap(); + let _ = builder.finish().unwrap().psbt; } #[test] @@ -662,7 +662,7 @@ fn test_legacy_create_tx_absolute_high_fee() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_absolute(Amount::from_sat(60_000)); - let _ = builder.finish().unwrap(); + let _ = builder.finish().unwrap().psbt; } #[test] @@ -676,7 +676,7 @@ fn test_create_tx_add_change() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .ordering(TxOrdering::Shuffle); - let psbt = builder.finish_with_aux_rand(&mut rng).unwrap(); + let psbt = builder.finish_with_aux_rand(&mut rng).unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(psbt.unsigned_tx.output.len(), 2); @@ -693,7 +693,7 @@ fn test_create_tx_skip_change_dust() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(49_800)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(psbt.unsigned_tx.output.len(), 1); @@ -712,7 +712,7 @@ fn test_create_tx_drain_to_dust_amount() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_rate(FeeRate::from_sat_per_vb_unchecked(454)); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -741,7 +741,7 @@ fn test_create_tx_ordering_respected() { .add_recipient(addr.script_pubkey(), Amount::from_sat(10_000)) .ordering(custom_bip69_ordering); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(psbt.unsigned_tx.output.len(), 3); @@ -759,7 +759,7 @@ fn test_create_tx_default_sighash() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.inputs[0].sighash_type, None); } @@ -770,7 +770,7 @@ fn test_legacy_create_tx_default_sighash() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.inputs[0].sighash_type, None); } @@ -783,7 +783,7 @@ fn test_create_tx_custom_sighash() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)) .sighash(EcdsaSighashType::Single.into()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!( psbt.inputs[0].sighash_type, @@ -799,7 +799,7 @@ fn test_legacy_create_tx_custom_sighash() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)) .sighash(EcdsaSighashType::Single.into()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!( psbt.inputs[0].sighash_type, @@ -816,7 +816,7 @@ fn test_create_tx_input_hd_keypaths() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.inputs[0].bip32_derivation.len(), 1); assert_eq!( @@ -838,7 +838,7 @@ fn test_create_tx_output_hd_keypaths() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.outputs[0].bip32_derivation.len(), 1); let expected_derivation_path = format!("m/44'/0'/0'/0/{}", addr.index); @@ -860,7 +860,7 @@ fn test_create_tx_set_redeem_script_p2sh() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!( psbt.inputs[0].redeem_script, @@ -883,7 +883,7 @@ fn test_create_tx_set_witness_script_p2wsh() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.inputs[0].redeem_script, None); assert_eq!( @@ -905,7 +905,7 @@ fn test_create_tx_set_redeem_witness_script_p2wsh_p2sh() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let script = ScriptBuf::from_hex( "21032b0558078bec38694a84933d659303e2575dae7e91685911454115bfd64487e3ac", @@ -923,7 +923,7 @@ fn test_create_tx_non_witness_utxo() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert!(psbt.inputs[0].non_witness_utxo.is_some()); assert!(psbt.inputs[0].witness_utxo.is_none()); @@ -939,7 +939,7 @@ fn test_create_tx_only_witness_utxo() { .drain_to(addr.script_pubkey()) .only_witness_utxo() .drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert!(psbt.inputs[0].non_witness_utxo.is_none()); assert!(psbt.inputs[0].witness_utxo.is_some()); @@ -952,7 +952,7 @@ fn test_create_tx_shwpkh_has_witness_utxo() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert!(psbt.inputs[0].witness_utxo.is_some()); } @@ -964,7 +964,7 @@ fn test_create_tx_both_non_witness_utxo_and_witness_utxo_default() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert!(psbt.inputs[0].non_witness_utxo.is_some()); assert!(psbt.inputs[0].witness_utxo.is_some()); @@ -1000,7 +1000,7 @@ fn test_create_tx_add_utxo() { .add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)) .add_utxo(OutPoint { txid, vout: 0 }) .unwrap(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let (sent, _received) = wallet.sent_and_received(&psbt.clone().extract_tx().expect("failed to extract tx")); @@ -1048,7 +1048,7 @@ fn test_create_tx_manually_selected_insufficient() { .add_utxo(OutPoint { txid, vout: 0 }) .unwrap() .manually_selected_only(); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -1061,7 +1061,7 @@ fn test_create_tx_policy_path_required() { .assume_checked(); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(10_000)); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -1097,7 +1097,7 @@ fn test_create_tx_policy_path_no_csv() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)) .policy_path(path, KeychainKind::External); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(0xFFFFFFFD)); } @@ -1118,7 +1118,7 @@ fn test_create_tx_policy_path_use_csv() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)) .policy_path(path, KeychainKind::External); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(144)); } @@ -1139,7 +1139,7 @@ fn test_create_tx_policy_path_ignored_subtree_with_csv() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(30_000)) .policy_path(path, KeychainKind::External); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.input[0].sequence, Sequence(0xFFFFFFFD)); } @@ -1153,7 +1153,7 @@ fn test_create_tx_global_xpubs_with_origin() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .add_global_xpubs(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let key = bip32::Xpub::from_str("tpubDCKxNyM3bLgbEX13Mcd8mYxbVg9ajDkWXMh29hMWBurKfVmBfWAM96QVP3zaUcN51HvkZ3ar4VwP82kC8JZhhux8vFQoJintSpVBwpFvyU3").unwrap(); let fingerprint = bip32::Fingerprint::from_hex("73756c7f").unwrap(); @@ -1305,7 +1305,7 @@ fn test_create_tx_global_xpubs_origin_missing() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .add_global_xpubs(); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -1317,7 +1317,7 @@ fn test_create_tx_global_xpubs_master_without_origin() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)) .add_global_xpubs(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let key = bip32::Xpub::from_str("tpubD6NzVbkrYhZ4Y55A58Gv9RSNF5hy84b5AJqYy7sCcjFrkcLpPre8kmgfit6kY1Zs3BLgeypTDBZJM222guPpdz7Cup5yzaMu62u7mYGbwFL").unwrap(); let fingerprint = bip32::Fingerprint::from_hex("997a323b").unwrap(); @@ -1352,7 +1352,7 @@ fn test_fee_amount_negative_drain_val() { .add_utxo(incoming_op) .unwrap() .fee_rate(fee_rate); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); assert_eq!(psbt.inputs.len(), 1); @@ -1365,7 +1365,7 @@ fn test_sign_single_xprv() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet.sign(&mut psbt, Default::default()).unwrap(); assert!(finalized); @@ -1380,7 +1380,7 @@ fn test_sign_single_xprv_with_master_fingerprint_and_path() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet.sign(&mut psbt, Default::default()).unwrap(); assert!(finalized); @@ -1395,7 +1395,7 @@ fn test_sign_single_xprv_bip44_path() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet.sign(&mut psbt, Default::default()).unwrap(); assert!(finalized); @@ -1410,7 +1410,7 @@ fn test_sign_single_xprv_sh_wpkh() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet.sign(&mut psbt, Default::default()).unwrap(); assert!(finalized); @@ -1426,7 +1426,7 @@ fn test_sign_single_wif() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet.sign(&mut psbt, Default::default()).unwrap(); assert!(finalized); @@ -1441,7 +1441,7 @@ fn test_sign_single_xprv_no_hd_keypaths() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; psbt.inputs[0].bip32_derivation.clear(); assert_eq!(psbt.inputs[0].bip32_derivation.len(), 0); @@ -1465,7 +1465,7 @@ fn test_include_output_redeem_witness_script() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)) .include_output_redeem_witness_script(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; // p2sh-p2wsh transaction should contain both witness and redeem scripts assert!(psbt @@ -1484,7 +1484,7 @@ fn test_signing_only_one_of_multiple_inputs() { builder .add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)) .include_output_redeem_witness_script(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; // add another input to the psbt that is at least passable. let dud_input = bitcoin::psbt::Input { @@ -1528,7 +1528,7 @@ fn test_try_finalize_sign_option() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet .sign( @@ -1562,7 +1562,7 @@ fn test_taproot_try_finalize_sign_option() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let finalized = wallet .sign( @@ -1614,7 +1614,7 @@ fn test_sign_nonstandard_sighash() { .drain_to(addr.script_pubkey()) .sighash(sighash.into()) .drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let result = wallet.sign(&mut psbt, Default::default()); assert!( @@ -1860,7 +1860,7 @@ fn test_sending_to_bip350_bech32m_address() { .assume_checked(); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(45_000)); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -1952,7 +1952,7 @@ fn test_taproot_psbt_populate_tap_key_origins() { let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!( psbt.inputs[0] @@ -1994,7 +1994,7 @@ fn test_taproot_psbt_populate_tap_key_origins_repeated_key() { .drain_to(addr.script_pubkey()) .drain_wallet() .policy_path(path, KeychainKind::External); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let mut input_key_origins = psbt.inputs[0] .tap_key_origins @@ -2054,7 +2054,7 @@ fn test_taproot_psbt_input_tap_tree() { let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; assert_eq!( psbt.inputs[0].tap_merkle_root, @@ -2096,7 +2096,7 @@ fn test_taproot_sign_missing_witness_utxo() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let witness_utxo = psbt.inputs[0].witness_utxo.take(); let result = wallet.sign( @@ -2136,7 +2136,7 @@ fn test_taproot_sign_using_non_witness_utxo() { let addr = wallet.next_unused_address(KeychainKind::External); let mut builder = wallet.build_tx(); builder.drain_to(addr.script_pubkey()).drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; psbt.inputs[0].witness_utxo = None; psbt.inputs[0].non_witness_utxo = @@ -2159,7 +2159,7 @@ fn test_spend_from_wallet(mut wallet: Wallet) { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; assert_eq!(psbt.unsigned_tx.version.0, 2); assert!( @@ -2184,7 +2184,7 @@ fn test_taproot_no_key_spend() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; assert!( wallet @@ -2219,7 +2219,7 @@ fn test_taproot_script_spend_sign_all_leaves() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; assert!( wallet @@ -2250,7 +2250,7 @@ fn test_taproot_script_spend_sign_include_some_leaves() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let mut script_leaves: Vec<_> = psbt.inputs[0] .tap_scripts .clone() @@ -2290,7 +2290,7 @@ fn test_taproot_script_spend_sign_exclude_some_leaves() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let mut script_leaves: Vec<_> = psbt.inputs[0] .tap_scripts .clone() @@ -2328,7 +2328,7 @@ fn test_taproot_script_spend_sign_no_leaves() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; wallet .sign( @@ -2351,7 +2351,7 @@ fn test_taproot_sign_derive_index_from_psbt() { let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(25_000)); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; // re-create the wallet with an empty db let wallet_empty = Wallet::create(get_test_tr_single_sig_xprv(), get_test_tr_single_sig()) @@ -2376,7 +2376,7 @@ fn test_taproot_sign_explicit_sighash_all() { .drain_to(addr.script_pubkey()) .sighash(TapSighashType::All.into()) .drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let result = wallet.sign(&mut psbt, Default::default()); assert!( @@ -2396,7 +2396,7 @@ fn test_taproot_sign_non_default_sighash() { .drain_to(addr.script_pubkey()) .sighash(sighash.into()) .drain_wallet(); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let witness_utxo = psbt.inputs[0].witness_utxo.take(); @@ -2578,7 +2578,7 @@ fn test_spend_coinbase() { builder .add_recipient(addr.script_pubkey(), balance.confirmed / 2) .current_height(maturity_time); - builder.finish().unwrap(); + builder.finish().unwrap().psbt; } #[test] @@ -2620,7 +2620,7 @@ fn test_fee_rate_sign_no_grinding_high_r() { .drain_wallet() .fee_rate(fee_rate) .add_data(&data); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); let (op_return_vout, _) = psbt .unsigned_tx @@ -2685,7 +2685,7 @@ fn test_fee_rate_sign_grinding_low_r() { .drain_to(addr.script_pubkey()) .drain_wallet() .fee_rate(fee_rate); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; let fee = check_fee!(wallet, psbt); wallet @@ -2774,7 +2774,7 @@ fn test_tx_cancellation() { let mut builder = $wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), Amount::from_sat(10_000)); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; psbt }}; @@ -2856,7 +2856,7 @@ fn single_descriptor_wallet_can_create_tx_and_receive_change() { .assume_checked(); let mut builder = wallet.build_tx(); builder.add_recipient(addr.script_pubkey(), amount); - let mut psbt = builder.finish().unwrap(); + let mut psbt = builder.finish().unwrap().psbt; assert!(wallet.sign(&mut psbt, SignOptions::default()).unwrap()); let tx = psbt.extract_tx().unwrap(); let _txid = tx.compute_txid(); @@ -3006,7 +3006,7 @@ fn test_tx_ordering_untouched_preserves_insertion_ordering() { .add_recipient(script_pubkey.clone(), Amount::from_sat(300)) .add_recipient(script_pubkey.clone(), Amount::from_sat(500)); - let tx = builder.finish().unwrap().unsigned_tx; + let tx = builder.finish().unwrap().psbt.unsigned_tx; let txins = tx .input .iter() diff --git a/tests/wallet_event.rs b/tests/wallet_event.rs index 3dfa688e..a4712c2c 100644 --- a/tests/wallet_event.rs +++ b/tests/wallet_event.rs @@ -77,7 +77,7 @@ fn test_tx_replaced_event() { .assume_checked(), Amount::from_sat(10_000), ); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let orig_tx = Arc::new(psbt.extract_tx().unwrap()); let orig_txid = orig_tx.compute_txid(); @@ -94,7 +94,7 @@ fn test_tx_replaced_event() { // create rbf tx let mut builder = wallet.build_fee_bump(orig_txid).unwrap(); builder.fee_rate(FeeRate::from_sat_per_vb(10).unwrap()); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let rbf_tx = Arc::new(psbt.extract_tx().unwrap()); let rbf_txid = rbf_tx.compute_txid(); @@ -128,7 +128,7 @@ fn test_tx_confirmed_event() { .assume_checked(), Amount::from_sat(10_000), ); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let new_tx = Arc::new(psbt.extract_tx().unwrap()); let new_txid = new_tx.compute_txid(); @@ -184,7 +184,7 @@ fn test_tx_confirmed_new_block_event() { .assume_checked(), Amount::from_sat(10_000), ); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let new_tx = Arc::new(psbt.extract_tx().unwrap()); let new_txid = new_tx.compute_txid(); @@ -267,7 +267,7 @@ fn test_tx_dropped_event() { .assume_checked(), Amount::from_sat(10_000), ); - let psbt = builder.finish().unwrap(); + let psbt = builder.finish().unwrap().psbt; let new_tx = Arc::new(psbt.extract_tx().unwrap()); let new_txid = new_tx.compute_txid();