Release v0.4.0
A new release of BDK is out: the v0.4.0
(opens new window) release brings updated dependencies, more sanity checks and an overhauled API to build transactions.
You can find the full v0.4.0 changelog (opens new window) on GitHub.
# What's new in v0.4.0
Below are some highlights of the new improved APIs coming with this release:
# A new API to build transaction
The star of this release is the new API designed and implemented by @llfourn (opens new window) that brings much more flexibility to the way we create transactions: originally the process of making a transaction involved the creation of a TxBuilder
which was used
to configure how the wallet should build the transaction. Things like which outputs to create, what nLockTime
to use, which UTXOs to spend, and much more.
Once fully configured, this builder was then given to the Wallet
itself in a Wallet::create_tx()
or Wallet::bump_fee()
call: the Wallet
would try to follow the instructions given by the builder, but in
case of conflicting or straight-up wrong options it would have to fail and force the user to start over.
The new API maintains the concept of a builder, but it changes the way it's created so that it always contains a reference to the main Wallet
instance. What this means is that most checks can now be performed right
when something is added to the builder, not at the end, allowing the user to recover from errors instead of having to start over.
This also opens the door to even more improvements and additions, such as a way to spend foreign utxos (opens new window) in a transaction, or even a way to bump the fees of multiple transactions at once (opens new window) by batching them together, which saves a bit of space and money.
let send_to = wallet.get_new_address()?;
let (psbt, details) = {
let mut builder = wallet.build_tx();
builder
.add_recipient(send_to.script_pubkey(), 50_000)
.enable_rbf()
.do_not_spend_change()
.fee_rate(FeeRate::from_sat_per_vb(5.0));
builder.finish()?
};
# Upgraded dependencies
This release also brings many updates to our dependencies, including:
bitcoin
tov0.26
miniscript
tov5.1
electrum-client
tov0.6
tokio
tov1
reqwest
tov0.11
cc
to>= v1.0.64
# Compact Filters example
Thanks to the upgrade to bitcoin v0.26
all the issues related to new networking messages in the P2P Bitcoin network have been fixed, which means that we can finally use our (experimental) compact filters Blockchain
with
standard Bitcoin Core 0.21 full nodes.
The following example has also been added to the repository and can be run with cargo run --features=compact_filters --example compact_filters_balance
.
/// This will return wallet balance using compact filters
/// Requires a synced local bitcoin node 0.21 running on testnet with blockfilterindex=1 and peerblockfilters=1
fn main() -> Result<(), CompactFiltersError> {
env_logger::init();
info!("start");
let num_threads = 4;
let mempool = Arc::new(Mempool::default());
let peers = (0..num_threads)
.map(|_| Peer::connect("localhost:18333", Arc::clone(&mempool), Network::Testnet))
.collect::<Result<_, _>>()?;
let blockchain = CompactFiltersBlockchain::new(peers, "./wallet-filters", Some(500_000))?;
info!("done {:?}", blockchain);
let descriptor = "wpkh(tpubD6NzVbkrYhZ4X2yy78HWrr1M9NT8dKeWfzNiQqDdMqqa9UmmGztGGz6TaLFGsLfdft5iu32gxq1T4eMNxExNNWzVCpf9Y6JZi5TnqoC9wJq/*)";
let database = MemoryDatabase::default();
let wallet =
Arc::new(Wallet::new(descriptor, None, Network::Testnet, database, blockchain).unwrap());
wallet.sync(noop_progress(), None).unwrap();
info!("balance: {}", wallet.get_balance()?);
Ok(())
}
# Contributors
A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.
Since the v0.3.0
release around a month ago, we've had 59
new commits made by 8
different contributors for a total of 2463
additions and 1991
deletions. Here's the full diff (opens new window).
A special thanks to the new contributor for this release:
- @luckysori (opens new window) - Lucas Soriano