Crate bdk_wallet

Source
Expand description

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

Project Homepage | Documentation

§BDK Wallet

The bdk_wallet crate 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) which 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: Grabs blockchain data from Esplora for updating BDK structures.
  • bdk_electrum: Grabs blockchain data from Electrum for updating BDK structures.
  • bdk_bitcoind_rpc: Grabs blockchain data from Bitcoin Core for updating BDK structures.

Examples

§Persistence

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

Implementations

Example

use bdk_wallet::{bitcoin::Network, KeychainKind, ChangeSet, Wallet};

// Open or create a new file store for wallet data.
let mut db =
    bdk_file_store::Store::<ChangeSet>::open_or_create_new(b"magic_bytes", "/tmp/my_wallet.db")
        .expect("create store");

// Create a wallet with initial wallet data read from the file store.
let network = Network::Testnet;
let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)";
let change_descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/1/*)";
let wallet_opt = Wallet::load()
    .descriptor(KeychainKind::External, Some(descriptor))
    .descriptor(KeychainKind::Internal, Some(change_descriptor))
    .extract_keys()
    .check_network(network)
    .load_wallet(&mut db)
    .expect("wallet");
let mut wallet = match wallet_opt {
    Some(wallet) => wallet,
    None => Wallet::create(descriptor, change_descriptor)
        .network(network)
        .create_wallet(&mut db)
        .expect("wallet"),
};

// Get a new address to receive bitcoin.
let receive_address = wallet.reveal_next_address(KeychainKind::External);
// Persist staged wallet data changes to the file store.
wallet.persist(&mut db).expect("persist");
println!("Your new receive address is: {}", receive_address.address);

§Testing

§Unit testing

cargo 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.

Re-exports§

pub extern crate bitcoin;
pub extern crate bdk_chain as chain;
pub extern crate bdk_file_store as file_store;
pub extern crate miniscript;
pub extern crate serde;
pub extern crate serde_json;
pub use descriptor::template;
pub use descriptor::HdKeyPaths;
pub use signer;
pub use bdk_chain::rusqlite;

Modules§

coin_selection
Coin selection
descriptor
Descriptors
error
Errors that can be thrown by the Wallet
export
Wallet export
keys
Key formats
psbt
Additional functions on the rust-bitcoin Psbt structure.
rusqlite_impl
Support for persisting bdk_chain structures to SQLite using [rusqlite].
signer
Generalized signers
tx_builder
Transaction builder

Macros§

descriptor
Macro to write full descriptors with code
fragment
Macro to write descriptor fragments with code

Structs§

AddressInfo
A derived address and the index it was found at. For convenience this automatically derefs to Address
Balance
Balance, differentiated into various categories.
ChangeSet
A changeset for Wallet.
CreateParams
Parameters for Wallet::create or PersistedWallet::create.
LoadParams
Parameters for Wallet::load or PersistedWallet::load.
LocalOutput
An unspent output owned by a Wallet.
PersistedWallet
Represents a persisted wallet which persists into type P.
SignOptions
Options for a software signer
TxBuilder
A transaction builder
Update
An update to Wallet.
Wallet
A Bitcoin wallet
WeightedUtxo
A Utxo with its satisfaction_weight.

Enums§

AddForeignUtxoError
Error returned from TxBuilder::add_foreign_utxo.
AddUtxoError
Error returned from TxBuilder::add_utxo and TxBuilder::add_utxos
ApplyBlockError
An error that may occur when applying a block to Wallet.
ChangeSpendPolicy
Policy regarding the use of change outputs when creating a transaction
CreateWithPersistError
Error type for PersistedWallet::create.
FileStoreError
Error for [bdk_file_store]’s implementation of WalletPersister.
KeychainKind
Types of keychains
LoadError
The error type when loading a Wallet from a ChangeSet.
LoadMismatch
Represents a mismatch with what is loaded and what is expected from LoadParams.
LoadWithPersistError
Error type for PersistedWallet::load.
TxOrdering
Ordering of the transaction’s inputs and outputs
Utxo
An unspent transaction output (UTXO).

Traits§

AsyncWalletPersister
Async trait that persists PersistedWallet.
IsDust
Trait to check if a value is below the dust limit. We are performing dust value calculation for a given script public key using rust-bitcoin to keep it compatible with network dust rate
WalletPersister
Trait that persists PersistedWallet.

Functions§

version
Get the version of bdk_wallet at runtime.
wallet_name_from_descriptor
Deterministically generate a unique name given the descriptors defining the wallet

Type Aliases§

WalletTx
A CanonicalTx managed by a Wallet.