/// [`TxBuilder`]: crate::TxBuilder
pub fn build_tx(&mut self) -> TxBuilder<'_, DefaultCoinSelectionAlgorithm> {
TxBuilder {
- wallet: alloc::rc::Rc::new(core::cell::RefCell::new(self)),
+ wallet: self,
params: TxParams::default(),
coin_selection: DefaultCoinSelectionAlgorithm::default(),
}
};
Ok(TxBuilder {
- wallet: alloc::rc::Rc::new(core::cell::RefCell::new(self)),
+ wallet: self,
params,
coin_selection: DefaultCoinSelectionAlgorithm::default(),
})
//! # Ok::<(), anyhow::Error>(())
//! ```
-use alloc::{boxed::Box, rc::Rc, string::String, vec::Vec};
-use core::cell::RefCell;
+use alloc::{boxed::Box, string::String, vec::Vec};
use core::fmt;
use alloc::sync::Arc;
/// [`coin_selection`]: Self::coin_selection
#[derive(Debug)]
pub struct TxBuilder<'a, Cs> {
- pub(crate) wallet: Rc<RefCell<&'a mut Wallet>>,
+ pub(crate) wallet: &'a mut Wallet,
pub(crate) params: TxParams,
pub(crate) coin_selection: Cs,
}
}
}
-impl<'a, Cs: Clone> Clone for TxBuilder<'a, Cs> {
- fn clone(&self) -> Self {
- TxBuilder {
- wallet: self.wallet.clone(),
- params: self.params.clone(),
- coin_selection: self.coin_selection.clone(),
- }
- }
-}
-
// Methods supported for any CoinSelectionAlgorithm.
impl<'a, Cs> TxBuilder<'a, Cs> {
/// Set a custom fee rate.
/// the "utxos" and the "unspendable" list, it will be spent.
pub fn add_utxos(&mut self, outpoints: &[OutPoint]) -> Result<&mut Self, AddUtxoError> {
{
- let wallet = self.wallet.borrow();
+ let wallet = &mut self.wallet;
let utxos = outpoints
.iter()
.map(|outpoint| {
/// **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<Psbt, CreateTxError> {
- self.wallet
- .borrow_mut()
- .create_tx(self.coin_selection, self.params, rng)
+ self.wallet.create_tx(self.coin_selection, self.params, rng)
}
}
#[cfg(feature = "std")]
impl std::error::Error for AddForeignUtxoError {}
-type TxSort<T> = dyn Fn(&T, &T) -> core::cmp::Ordering;
+type TxSort<T> = dyn (Fn(&T, &T) -> core::cmp::Ordering) + Send + Sync;
/// Ordering of the transaction's inputs and outputs
#[derive(Clone, Default)]
.max_weight_to_satisfy()
.unwrap();
- let mut builder = wallet1.build_tx();
- builder.add_recipient(addr.script_pubkey(), Amount::from_sat(60_000));
-
{
- let mut builder = builder.clone();
+ let mut builder = wallet1.build_tx();
+ builder.add_recipient(addr.script_pubkey(), Amount::from_sat(60_000));
+
let psbt_input = psbt::Input {
witness_utxo: Some(utxo2.txout.clone()),
..Default::default()
}
{
- let mut builder = builder.clone();
+ let mut builder = wallet1.build_tx();
+ builder.add_recipient(addr.script_pubkey(), Amount::from_sat(60_000));
+
let psbt_input = psbt::Input {
witness_utxo: Some(utxo2.txout.clone()),
..Default::default()
}
{
- let mut builder = builder.clone();
+ let mut builder = wallet1.build_tx();
+ builder.add_recipient(addr.script_pubkey(), Amount::from_sat(60_000));
+
let tx2 = wallet2.get_tx(txid2).unwrap().tx_node.tx;
let psbt_input = psbt::Input {
non_witness_utxo: Some(tx2.as_ref().clone()),
.collect();
assert_eq!([None, Some(2000), Some(1000)], conf_heights.as_slice());
}
+
+#[test]
+fn test_tx_builder_is_send_safe() {
+ let (mut wallet, _txid) = get_funded_wallet_wpkh();
+ let _box: Box<dyn Send + Sync> = Box::new(wallet.build_tx());
+}