A modern, lightweight, descriptor-based wallet library written in Rust!
  • Rust 99.7%
  • Just 0.2%
  • Shell 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
merge-script 6fc68462e0
Merge bitcoindevkit/bdk_wallet#505: Deprecate wallet-owned signing APIs
3a3cd6f9c4 deprecate(wallet): wallet-owned signer and policy APIs (Noah Joeris)
6b7a8b2310 feat(wallet): add TxBuilder::set_condition (Noah Joeris)
70314480c6 refactor(wallet): migrate signing to caller-owned keys (Noah Joeris)

Pull request description:

  ### Description

  Partially addresses #70

  Deprecates wallet-owned signing APIs, migrating examples, tests, and documentation toward caller-owned keys using `bitcoin::Psbt::sign` and `Wallet::sign_with_signers`.

  Depends on:

  - https://github.com/rust-bitcoin/rust-miniscript/pull/872
  - https://github.com/rust-bitcoin/rust-miniscript/pull/867

  ### Notes to the reviewers

  - I migrated examples, docs and tests to use `bitcoin::Psbt::sign` where possible. And used `Wallet::sign_with_signers` if we need SignOptions.

  ### Changelog notice

  ```
  - Deprecated `Wallet::{add_signer, set_keymap, set_keymaps, get_signers, sign, policies}`, `CreateParams::keymap`, `LoadParams::{keymap, extract_keys}`, and `TxBuilder::policy_path` in favor of caller-owned keys with `bitcoin::Psbt::sign` / `Wallet::sign_with_signers`, and `TxBuilder::set_condition`.
  - Changed `FullyNodedExport::export_wallet` to not export secret keys anymore.
  - Added `TxBuilder::set_condition` as replacement for `TxBuilder::policy_path`.
  ```

  ### Before submitting

  - [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk_wallet/blob/master/CONTRIBUTING.md)
  - [ ] This PR breaks the existing API

ACKs for top commit:
  ValuedMammal:
    reACK 3a3cd6f9c4
  110CodingP:
    ACK 3a3cd6f

Tree-SHA512: 690039f597d2aab334f6ac8f4623a49c4df9470af8978adbdad8d2061f2fd2582122943e11cec2b5be21a296ef12f9d80113f99e1bf87876aa6b58805fe8ca76
2026-08-20 20:41:47 -04:00
.github chore(ci): add signed commits check to integration 2026-08-04 21:26:53 +05:30
ci chore(ci): add signed commits check to integration 2026-08-04 21:26:53 +05:30
docs/adr docs: Add ADR 0003_events.md 2026-02-05 18:51:58 -05:00
examples feat(wallet): add TxBuilder::set_condition 2026-08-18 15:41:22 +03:00
src deprecate(wallet): wallet-owned signer and policy APIs 2026-08-18 15:41:22 +03:00
static Add back old logo to static/bdk.svg 2021-12-22 21:38:54 -08:00
tests deprecate(wallet): wallet-owned signer and policy APIs 2026-08-18 15:41:22 +03:00
.gitignore build(ci): Wire unstable cfg into local and CI workflows 2026-07-22 09:53:07 -04:00
Cargo.toml refactor(persist_test_utils)!: Refactor WalletPersister suite + update deps 2026-07-27 00:09:20 -04:00
CHANGELOG.md feat(wallet,psbt): Add bdk-tx create_psbt API surface 2026-07-22 09:53:16 -04:00
clippy.toml clippy!: fix large enum variants 2026-01-09 10:53:34 -05:00
CONTRIBUTING.md docs: move PR checklist to contributing guide 2026-06-03 10:59:59 +03:00
DEVELOPMENT_CYCLE.md Update DEVELOPMENT_CYCLE.md to work with [patch.crates-io] 2022-08-31 07:43:03 -05:00
justfile build(ci): Wire unstable cfg into local and CI workflows 2026-07-22 09:53:07 -04:00
LICENSE docs: add License and Contributing sections to repo top-level README 2023-08-19 13:36:10 -05:00
LICENSE-APACHE docs: add License and Contributing sections to repo top-level README 2023-08-19 13:36:10 -05:00
LICENSE-MIT docs: add License and Contributing sections to repo top-level README 2023-08-19 13:36:10 -05:00
README.md Merge bitcoindevkit/bdk_wallet#505: Deprecate wallet-owned signing APIs 2026-08-20 20:41:47 -04:00
rust-toolchain.toml chore: bump rust-toolchain to 1.96.0 2026-07-06 10:28:22 -04:00
rustfmt.toml fmt: Adopt 2024 style edition 2026-07-23 12:21:18 -04:00
SECURITY.md chore(doc): add GH security advisory link on SECURITY.md 2026-08-05 17:00:13 -03:00

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.85.0+ Chat on Discord

Project Homepage | Documentation

About

The bdk_wallet project provides a high level descriptor based wallet API for building Bitcoin applications.

Architecture

bdk_wallet contains the central high level Wallet type that is built from the other low-level components.

Core BDK crates that bdk_wallet depends on are found in the bdk repository. This works by leveraging the functionality in rust-bitcoin and rust-miniscript.

BDK Wallet

The bdk_wallet provides the Wallet type which is a simple, high-level interface built from the low-level components of bdk_chain. Wallet is a good starting point for many simple applications as well as a good demonstration of how to use the other mechanisms to construct a wallet. It has two keychains (external and internal) that are defined by miniscript descriptors and uses them to generate addresses. When you give it chain data it also uses the descriptors to find transaction outputs owned by them. From there, you can create and sign transactions.

For details about the API of Wallet see the module-level documentation.

Blockchain data

In order to get blockchain data for Wallet to consume, you should configure a client from an available chain source. Typically you make a request to the chain source and get a response that the Wallet can use to update its view of the chain.

Blockchain Data Sources

  • bdk_esplora: Gets blockchain data from Esplora for updating BDK structures.
  • bdk_electrum: Gets blockchain data from Electrum for updating BDK structures.
  • bdk_bitcoind_rpc: Gets blockchain data from Bitcoin Core for updating BDK structures.

Examples

Persistence

To persist Wallet state use a data storage crate that reads and writes ChangeSet.

Implementations

  • bdk_file_store: Stores wallet changes in a simple flat file.
  • rusqlite: Stores wallet changes in a SQLite database.

Example

use bdk_wallet::rusqlite;
use bdk_wallet::{KeychainKind, Wallet};

// Open or create a new SQLite database for wallet data.
let db_path = "my_wallet.sqlite";
let mut conn = rusqlite::Connection::open(db_path)?;

let network = bitcoin::Network::Testnet;
let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)";
let change_descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/1/*)";

let mut wallet = match Wallet::load()
    .descriptor(KeychainKind::External, Some(descriptor))
    .descriptor(KeychainKind::Internal, Some(change_descriptor))
    .check_network(network)
    .load_wallet(&mut conn)?
{
    Some(wallet) => wallet,
    None => Wallet::create(descriptor, change_descriptor)
        .network(network)
        .create_wallet(&mut conn)?,
};

// Get a new address to receive bitcoin!
let address_info = wallet.reveal_next_address(KeychainKind::External);

// Persist new wallet state to database.
wallet.persist(&mut conn)?;

println!("Next receive address: {}", address_info.address);
Ok::<_, anyhow::Error>(())

Security Policy

To report a security issue, please refer to the security policy.

Minimum Supported Rust Version (MSRV)

The libraries in this repository maintain a MSRV of 1.85.0.

To build with the MSRV of 1.85.0 you may need to pin dependencies by running the pin-msrv.sh script.

Just

This project has a justfile for easy command running. You must have just installed.

To see a list of available recipes: just -l

Testing

Unit testing

just test

License

Licensed under either of

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.