Skip to content

Commit 4bddb0d

Browse files
notmandatoryrustaceanrob
authored andcommitted
feat(wallet): add back TxBuilder finish() and sort_tx() with thread_rng()
1 parent 45c0cae commit 4bddb0d

File tree

19 files changed

+245
-242
lines changed

19 files changed

+245
-242
lines changed

crates/esplora/src/blocking_ext.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::collections::BTreeSet;
22
use std::thread::JoinHandle;
3-
use std::usize;
43

54
use bdk_chain::collections::BTreeMap;
65
use bdk_chain::spk_client::{FullScanRequest, FullScanResult, SyncRequest, SyncResult};

crates/wallet/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ bip39 = { version = "2.0", optional = true }
2525

2626
[features]
2727
default = ["std"]
28-
std = ["bitcoin/std", "miniscript/std", "bdk_chain/std"]
28+
std = ["bitcoin/std", "bitcoin/rand-std", "miniscript/std", "bdk_chain/std"]
2929
compiler = ["miniscript/compiler"]
3030
all-keys = ["keys-bip39"]
3131
keys-bip39 = ["bip39"]

crates/wallet/README.md

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -70,30 +70,28 @@ To persist `Wallet` state data use a data store crate that reads and writes [`bd
7070
```rust,no_run
7171
use bdk_wallet::{bitcoin::Network, KeychainKind, wallet::{ChangeSet, Wallet}};
7272
73-
fn main() {
74-
// Open or create a new file store for wallet data.
75-
let mut db =
76-
bdk_file_store::Store::<ChangeSet>::open_or_create_new(b"magic_bytes", "/tmp/my_wallet.db")
77-
.expect("create store");
78-
79-
// Create a wallet with initial wallet data read from the file store.
80-
let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)";
81-
let change_descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/1/*)";
82-
let changeset = db.aggregate_changesets().expect("changeset loaded");
83-
let mut wallet =
84-
Wallet::new_or_load(descriptor, change_descriptor, changeset, Network::Testnet)
85-
.expect("create or load wallet");
86-
87-
// Get a new address to receive bitcoin.
88-
let receive_address = wallet.reveal_next_address(KeychainKind::External);
89-
// Persist staged wallet data changes to the file store.
90-
let staged_changeset = wallet.take_staged();
91-
if let Some(changeset) = staged_changeset {
92-
db.append_changeset(&changeset)
93-
.expect("must commit changes to database");
94-
}
95-
println!("Your new receive address is: {}", receive_address.address);
73+
// Open or create a new file store for wallet data.
74+
let mut db =
75+
bdk_file_store::Store::<ChangeSet>::open_or_create_new(b"magic_bytes", "/tmp/my_wallet.db")
76+
.expect("create store");
77+
78+
// Create a wallet with initial wallet data read from the file store.
79+
let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)";
80+
let change_descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/1/*)";
81+
let changeset = db.aggregate_changesets().expect("changeset loaded");
82+
let mut wallet =
83+
Wallet::new_or_load(descriptor, change_descriptor, changeset, Network::Testnet)
84+
.expect("create or load wallet");
85+
86+
// Get a new address to receive bitcoin.
87+
let receive_address = wallet.reveal_next_address(KeychainKind::External);
88+
// Persist staged wallet data changes to the file store.
89+
let staged_changeset = wallet.take_staged();
90+
if let Some(changeset) = staged_changeset {
91+
db.append_changeset(&changeset)
92+
.expect("must commit changes to database");
9693
}
94+
println!("Your new receive address is: {}", receive_address.address);
9795
```
9896

9997
<!-- ### Sync the balance of a descriptor -->
@@ -154,7 +152,6 @@ fn main() {
154152
<!-- use bitcoin::base64; -->
155153
<!-- use bdk_wallet::bitcoin::consensus::serialize; -->
156154
<!-- use bdk_wallet::bitcoin::Network; -->
157-
<!-- use rand::thread_rng(); -->
158155

159156
<!-- fn main() -> Result<(), bdk_wallet::Error> { -->
160157
<!-- let blockchain = ElectrumBlockchain::from(Client::new("ssl://electrum.blockstream.info:60002")?); -->
@@ -174,7 +171,7 @@ fn main() {
174171
<!-- .enable_rbf() -->
175172
<!-- .do_not_spend_change() -->
176173
<!-- .fee_rate(FeeRate::from_sat_per_vb(5.0)); -->
177-
<!-- builder.finish_with_aux_rand(&mut thread_rng())? -->
174+
<!-- builder.finish()? -->
178175
<!-- }; -->
179176

180177
<!-- println!("Transaction details: {:#?}", details); -->

crates/wallet/examples/mnemonic_to_descriptors.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use bdk_wallet::descriptor::IntoWalletDescriptor;
1515
use bdk_wallet::keys::bip39::{Language, Mnemonic, WordCount};
1616
use bdk_wallet::keys::{GeneratableKey, GeneratedKey};
1717
use bdk_wallet::miniscript::Tap;
18-
use rand::thread_rng;
1918
use std::str::FromStr;
2019

2120
/// This example demonstrates how to generate a mnemonic phrase
@@ -26,9 +25,8 @@ fn main() -> Result<(), anyhow::Error> {
2625
// In this example we are generating a 12 words mnemonic phrase
2726
// but it is also possible generate 15, 18, 21 and 24 words
2827
// using their respective `WordCount` variant.
29-
let mut rng = thread_rng();
3028
let mnemonic: GeneratedKey<_, Tap> =
31-
Mnemonic::generate((WordCount::Words12, Language::English), &mut rng)
29+
Mnemonic::generate((WordCount::Words12, Language::English))
3230
.map_err(|_| anyhow!("Mnemonic generation error"))?;
3331

3432
println!("Mnemonic phrase: {}", *mnemonic);

crates/wallet/src/keys/bip39.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,6 @@ mod test {
158158

159159
use bip39::{Language, Mnemonic};
160160

161-
use rand::thread_rng;
162-
163161
use crate::keys::{any_network, GeneratableKey, GeneratedKey};
164162

165163
use super::WordCount;
@@ -218,12 +216,12 @@ mod test {
218216

219217
#[test]
220218
fn test_keys_generate_bip39_random() {
221-
let mut rng = thread_rng();
222219
let generated_mnemonic: GeneratedKey<_, miniscript::Segwitv0> =
223-
Mnemonic::generate((WordCount::Words12, Language::English), &mut rng).unwrap();
220+
Mnemonic::generate((WordCount::Words12, Language::English)).unwrap();
224221
assert_eq!(generated_mnemonic.valid_networks, any_network());
222+
225223
let generated_mnemonic: GeneratedKey<_, miniscript::Segwitv0> =
226-
Mnemonic::generate((WordCount::Words24, Language::English), &mut rng).unwrap();
224+
Mnemonic::generate((WordCount::Words24, Language::English)).unwrap();
227225
assert_eq!(generated_mnemonic.valid_networks, any_network());
228226
}
229227
}

crates/wallet/src/keys/mod.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,18 @@ pub trait GeneratableKey<Ctx: ScriptContext>: Sized {
633633
entropy: Self::Entropy,
634634
) -> Result<GeneratedKey<Self, Ctx>, Self::Error>;
635635

636-
/// Generate a key given the options with a random entropy
637-
fn generate(
636+
/// Generate a key given the options with random entropy.
637+
///
638+
/// Uses the thread-local random number generator.
639+
#[cfg(feature = "std")]
640+
fn generate(options: Self::Options) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
641+
Self::generate_with_aux_rand(options, &mut bitcoin::key::rand::thread_rng())
642+
}
643+
644+
/// Generate a key given the options with random entropy.
645+
///
646+
/// Uses a provided random number generator (rng).
647+
fn generate_with_aux_rand(
638648
options: Self::Options,
639649
rng: &mut (impl CryptoRng + RngCore),
640650
) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
@@ -660,10 +670,20 @@ where
660670
}
661671

662672
/// Generate a key with the default options and a random entropy
663-
fn generate_default(
673+
///
674+
/// Uses the thread-local random number generator.
675+
#[cfg(feature = "std")]
676+
fn generate_default() -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
677+
Self::generate_with_aux_rand(Default::default(), &mut bitcoin::key::rand::thread_rng())
678+
}
679+
680+
/// Generate a key with the default options and a random entropy
681+
///
682+
/// Uses a provided random number generator (rng).
683+
fn generate_default_with_aux_rand(
664684
rng: &mut (impl CryptoRng + RngCore),
665685
) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
666-
Self::generate(Default::default(), rng)
686+
Self::generate_with_aux_rand(Default::default(), rng)
667687
}
668688
}
669689

crates/wallet/src/wallet/coin_selection.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
//! # use bdk_wallet::*;
3232
//! # use bdk_wallet::wallet::coin_selection::decide_change;
3333
//! # use anyhow::Error;
34-
//! # use rand::{thread_rng, RngCore};
35-
//!
3634
//! #[derive(Debug)]
3735
//! struct AlwaysSpendEverything;
3836
//!
@@ -94,7 +92,7 @@
9492
//! let psbt = {
9593
//! let mut builder = wallet.build_tx().coin_selection(AlwaysSpendEverything);
9694
//! builder.add_recipient(to_address.script_pubkey(), Amount::from_sat(50_000));
97-
//! builder.finish_with_aux_rand(&mut thread_rng())?
95+
//! builder.finish()?
9896
//! };
9997
//!
10098
//! // inspect, sign, broadcast, ...

crates/wallet/src/wallet/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ impl fmt::Display for MiniscriptPsbtError {
4444
impl std::error::Error for MiniscriptPsbtError {}
4545

4646
#[derive(Debug)]
47-
/// Error returned from [`TxBuilder::finish_with_aux_rand`]
47+
/// Error returned from [`TxBuilder::finish`]
4848
///
49-
/// [`TxBuilder::finish_with_aux_rand`]: crate::wallet::tx_builder::TxBuilder::finish_with_aux_rand
49+
/// [`TxBuilder::finish`]: crate::wallet::tx_builder::TxBuilder::finish
5050
pub enum CreateTxError {
5151
/// There was a problem with the descriptors passed in
5252
Descriptor(DescriptorError),

crates/wallet/src/wallet/mod.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,15 +1212,14 @@ impl Wallet {
12121212
/// # use bdk_wallet::wallet::ChangeSet;
12131213
/// # use bdk_wallet::wallet::error::CreateTxError;
12141214
/// # use anyhow::Error;
1215-
/// # use rand::thread_rng;
12161215
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
12171216
/// # let mut wallet = doctest_wallet!();
12181217
/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
12191218
/// let psbt = {
12201219
/// let mut builder = wallet.build_tx();
12211220
/// builder
12221221
/// .add_recipient(to_address.script_pubkey(), Amount::from_sat(50_000));
1223-
/// builder.finish_with_aux_rand(&mut thread_rng())?
1222+
/// builder.finish()?
12241223
/// };
12251224
///
12261225
/// // sign and broadcast ...
@@ -1577,7 +1576,6 @@ impl Wallet {
15771576
/// # use bdk_wallet::wallet::ChangeSet;
15781577
/// # use bdk_wallet::wallet::error::CreateTxError;
15791578
/// # use anyhow::Error;
1580-
/// # use rand::thread_rng;
15811579
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
15821580
/// # let mut wallet = doctest_wallet!();
15831581
/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
@@ -1586,7 +1584,7 @@ impl Wallet {
15861584
/// builder
15871585
/// .add_recipient(to_address.script_pubkey(), Amount::from_sat(50_000))
15881586
/// .enable_rbf();
1589-
/// builder.finish_with_aux_rand(&mut thread_rng())?
1587+
/// builder.finish()?
15901588
/// };
15911589
/// let _ = wallet.sign(&mut psbt, SignOptions::default())?;
15921590
/// let tx = psbt.clone().extract_tx().expect("tx");
@@ -1595,7 +1593,7 @@ impl Wallet {
15951593
/// let mut builder = wallet.build_fee_bump(tx.compute_txid())?;
15961594
/// builder
15971595
/// .fee_rate(FeeRate::from_sat_per_vb(5).expect("valid feerate"));
1598-
/// builder.finish_with_aux_rand(&mut thread_rng())?
1596+
/// builder.finish()?
15991597
/// };
16001598
///
16011599
/// let _ = wallet.sign(&mut psbt, SignOptions::default())?;
@@ -1755,14 +1753,13 @@ impl Wallet {
17551753
/// # use bdk_wallet::*;
17561754
/// # use bdk_wallet::wallet::ChangeSet;
17571755
/// # use bdk_wallet::wallet::error::CreateTxError;
1758-
/// # use rand::thread_rng;
17591756
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
17601757
/// # let mut wallet = doctest_wallet!();
17611758
/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
17621759
/// let mut psbt = {
17631760
/// let mut builder = wallet.build_tx();
17641761
/// builder.add_recipient(to_address.script_pubkey(), Amount::from_sat(50_000));
1765-
/// builder.finish_with_aux_rand(&mut thread_rng())?
1762+
/// builder.finish()?
17661763
/// };
17671764
/// let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
17681765
/// assert!(finalized, "we should have signed all the inputs");
@@ -1807,6 +1804,7 @@ impl Wallet {
18071804
{
18081805
signer.sign_transaction(psbt, &sign_options, &self.secp)?;
18091806
}
1807+
18101808
// attempt to finalize
18111809
if sign_options.try_finalize {
18121810
self.finalize_psbt(psbt, sign_options)

0 commit comments

Comments
 (0)