22aa534d7648e5808414ea3adfcfb702572bd6c9 feat: use `Amount` on `TxBuilder::add_recipient` (Leonardo Lima) d5c0e7200cba0c3b4d3e3fbea168cd07ee6c1d2c feat: use `Amount` on `spk_txout_index` and related (Leonardo Lima) 8a33d98db977a07e130ad57fa9c658a5c90d4a4b feat: update `wallet::Balance` to use `bitcoin::Amount` (Leonardo Lima) Pull request description: fixes #823 <!-- You can erase any parts of this template not applicable to your Pull Request. --> ### Description It's being used on `Balance`, and throughout the code, an `u64` represents the amount, which relies on the user to infer its sats, not millisats, or any other representation. It updates the usage of `u64` on `Balance`, and other APIs: - `TxParams::add_recipient` - `KeyChainTxOutIndex::sent_and_received`, `KeyChainTxOutIndex::net_value` - `SpkTxOutIndex::sent_and_received`, `SpkTxOutIndex::net_value` <!-- Describe the purpose of this PR, what's being adding and/or fixed --> ### Notes to the reviewers <!-- In this section you can include notes directed to the reviewers, like explaining why some parts of the PR were done in a specific way --> It updates some of the APIs to expect the `bitcoin::Amount`, but it does not update internal usage of u64, such as `TxParams` still expects and uses `u64`, please see the PR comments for related discussion. ### Changelog notice <!-- Notice the release manager should include in the release tag message changelog --> <!-- See https://keepachangelog.com/en/1.0.0/ for examples --> - Changed the `keychain::Balance` struct fields to use `Amount` instead of `u64`. - Changed the `add_recipient` method on `TxBuilder` implementation to expect `bitcoin::Amount`. - Changed the `sent_and_received`, and `net_value` methods on `KeyChainTxOutIndex` to expect `bitcoin::Amount`. - Changed the `sent_and_received`, and `net_value` methods on `SpkTxOutIndex` to expect `bitcoin::Amount`. ### Checklists #### All Submissions: * [x] I've signed all my commits * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md) * [x] I ran `cargo fmt` and `cargo clippy` before committing #### New Features: * [x] I've added tests for the new feature * [x] I've added docs for the new feature #### Bugfixes: * [x] This pull request breaks the existing API * [ ] I've added tests to reproduce the issue which are now passing * [x] I'm linking the issue being fixed by this PR ACKs for top commit: evanlinjin: ACK 22aa534d7648e5808414ea3adfcfb702572bd6c9 Tree-SHA512: c4e8198d96c0d66cc3d2e4149e8a56bb7565b9cd49ff42113eaebd24b1d7bfeecd7124db0b06524b78b8891ee1bde1546705b80afad408f48495cf3c02446d02
BDK

A modern, lightweight, descriptor-based wallet library written in Rust!
Project Homepage | Documentation
bdk
The bdk
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
example-crates/wallet_esplora_async
example-crates/wallet_esplora_blocking
example-crates/wallet_electrum
example-crates/wallet_rpc
Persistence
To persist the Wallet
on disk, it must be constructed with a PersistBackend
implementation.
Implementations
bdk_file_store
: A simple flat-file implementation ofPersistBackend
.
Example
use bdk::{bitcoin::Network, wallet::{ChangeSet, Wallet}};
fn main() {
// Create a new file `Store`.
let db = bdk_file_store::Store::<ChangeSet>::open_or_create_new(b"magic_bytes", "path/to/my_wallet.db").expect("create store");
let descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfSbKK1sKMLmC7EAk438btHQrSdu3jGGQa6PA71nvH5nkDexhLteJqkM4dQmWF9g/84'/1'/0'/0/*)";
let mut wallet = Wallet::new_or_load(descriptor, None, db, Network::Testnet).expect("create or load wallet");
// Insert a single `TxOut` at `OutPoint` into the wallet.
let _ = wallet.insert_txout(outpoint, txout);
wallet.commit().expect("must write to database");
}
Testing
Unit testing
cargo test
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
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.