# The Bitcoin Dev Kit

BDK

A modern, lightweight, descriptor-based wallet library written in Rust!

Crate Info MIT or Apache-2.0 Licensed CI Status API Docs Rustc Version 1.57.0+ Chat on Discord

Project Homepage | Documentation

## About The `bdk` libraries aims to provide well engineered and reviewed components for Bitcoin based applications. It is built upon the excellent [`rust-bitcoin`] and [`rust-miniscript`] crates. > ⚠ The Bitcoin Dev Kit developers are in the process of releasing a `v1.0` which is a fundamental re-write of how the library works. > See for some background on this project: https://bitcoindevkit.org/blog/road-to-bdk-1/ (ignore the timeline 😁) > For a release timeline see the [`BDK 1.0 project page`]. ## Architecture The project is split up into several crates in the `/crates` directory: - [`bdk`](./crates/bdk): Contains the central high level `Wallet` type that is built from the low-level mechanisms provided by the other components - [`chain`](./crates/chain): Tools for storing and indexing chain data - [`file_store`](./crates/file_store): A (experimental) persistence backend for storing chain data in a single file. - [`esplora`](./crates/esplora): Extends the [`esplora-client`] crate with methods to fetch chain data from an esplora HTTP server in the form that [`bdk_chain`] and `Wallet` can consume. - [`electrum`](./crates/electrum): Extends the [`electrum-client`] crate with methods to fetch chain data from an electrum server in the form that [`bdk_chain`] and `Wallet` can consume. Fully working examples of how to use these components are in `/example-crates`: - [`example_cli`](./example-crates/example_cli): Library used by the `example_*` crates. Provides utilities for syncing, showing the balance, generating addresses and creating transactions without using the bdk `Wallet`. - [`example_electrum`](./example-crates/example_electrum): A command line Bitcoin wallet application built on top of `example_cli` and the `electrum` crate. It shows the power of the bdk tools (`chain` + `file_store` + `electrum`), without depending on the main `bdk` library. - [`wallet_esplora_blocking`](./example-crates/wallet_esplora_blocking): Uses the `Wallet` to sync and spend using the Esplora blocking interface. - [`wallet_esplora_async`](./example-crates/wallet_esplora_async): Uses the `Wallet` to sync and spend using the Esplora asynchronous interface. - [`wallet_electrum`](./example-crates/wallet_electrum): Uses the `Wallet` to sync and spend using Electrum. [`BDK 1.0 project page`]: https://github.com/orgs/bitcoindevkit/projects/14 [`rust-miniscript`]: https://github.com/rust-bitcoin/rust-miniscript [`rust-bitcoin`]: https://github.com/rust-bitcoin/rust-bitcoin [`esplora-client`]: https://docs.rs/esplora-client/ [`electrum-client`]: https://docs.rs/electrum-client/ [`bdk_chain`]: https://docs.rs/bdk-chain/ ## Minimum Supported Rust Version (MSRV) This library should compile with any combination of features with Rust 1.57.0. To build with the MSRV you will need to pin dependencies as follows: ```shell # log 0.4.19 has MSRV 1.60.0+ cargo update -p log --precise "0.4.18" # tempfile 3.7.0 has MSRV 1.63.0+ cargo update -p tempfile --precise "3.6.0" # rustls 0.21.2 has MSRV 1.60.0+ cargo update -p rustls:0.21.7 --precise "0.21.1" # rustls 0.20.9 has MSRV 1.60.0+ cargo update -p rustls:0.20.9 --precise "0.20.8" # tokio 1.30 has MSRV 1.63.0+ cargo update -p tokio:1.32.0 --precise "1.29.1" # flate2 1.0.27 has MSRV 1.63.0+ cargo update -p flate2:1.0.27 --precise "1.0.26" # reqwest 0.11.19 has MSRV 1.63.0+ cargo update -p reqwest --precise "0.11.18" # h2 0.3.21 has MSRV 1.63.0+ cargo update -p h2 --precise "0.3.20" # rustls-webpki has MSRV 1.60.0+ cargo update -p rustls-webpki --precise "0.100.1" ``` ## License Licensed under either of * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or ) * MIT license ([LICENSE-MIT](LICENSE-MIT) or ) at your option. ### Contribution 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.