2 unstable releases
0.2.0 | May 15, 2023 |
---|---|
0.1.0 | Apr 20, 2023 |
#5 in #walletd
Used in walletd
295KB
4.5K
SLoC
WalletD Bitcoin
This crate is part of the WalletD project.
lib.rs
:
WalletD Bitcoin
Provides a wallet implementation for Bitcoin including the ability to create a new wallet or import an existing wallet, check balances, and handle transactions. It supports a hierarchical deterministic (HD) wallet structure and provides the ability to search for previously used addresses associated with the wallet as well as the creation of new addresses. It also facilitates obtaining blockchain information.
Quickstart Guide
The [BitcoinWallet] struct is the main entry point to access walletD functionality for Bitcoin.
Import from Seed
Here's how you can access a bitcoin wallet based on a master [Seed]. The [Seed] can be derived from a [Mnemonic] using the Mnemonic::to_seed method.
use walletd_bitcoin::prelude::*;
use walletd_hd_key::prelude::*;
let master_seed = Seed::from_str("a2fd9c0522d84d52ee4c8533dc02d4b69b4df9b6255e1af20c9f1d4d691689f2a38637eb1ec778972bf845c32d5ae83c7536999b5666397ac32021b21e0accee")?;
let network_type = HDNetworkType::TestNet;
let master_hd_key = HDKey::new_master(master_seed, network_type)?;
let mut btc_wallet = BitcoinWallet::builder().master_hd_key(master_hd_key).build()?;
Default Derivation Path
Deriving a [BitcoinWallet] is simple and uses some default settings under the hood. When using [BitcoinWalletBuilder], the default settings set the [AddressType] as 'P2wpkh` and the corresponding default [HDPurpose] for the derivation path is set as HDPurpose::BIP49.
# use walletd_bitcoin::prelude::*;
# use walletd_hd_key::prelude::*;
use walletd_bitcoin::bitcoin;
# fn import_btc_hd_wallet() -> Result<(), walletd_bitcoin::Error> {
# let master_seed = Seed::from_str("a2fd9c0522d84d52ee4c8533dc02d4b69b4df9b6255e1af20c9f1d4d691689f2a38637eb1ec778972bf845c32d5ae83c7536999b5666397ac32021b21e0accee")?;
# let network_type = HDNetworkType::TestNet;
# let master_hd_key = HDKey::new_master(master_seed, network_type)?;
# let mut btc_wallet = BitcoinWallet::builder().master_hd_key(master_hd_key).build()?;
assert_eq!(btc_wallet.address_format(), bitcoin::AddressType::P2wpkh);
assert_eq!(btc_wallet.hd_path_builder()?.purpose, Some(HDPurpose::BIP84.to_shortform_num()));
# Ok(())
# }
Using Blockstream as Blockchain Connector
The [BitcoinWallet] struct can be used to access blockchain data through a [BlockchainConnector] such as [Blockstream]. The [Blockstream] instance can be used on its own to access blockchain data such as fee estimates. It can be affiliated with a [BitcoinWallet] to enable the [BitcoinWallet] to access blockchain data and send transactions.
let btc_client = Blockstream::new("https://blockstream.info/testnet/api")?;
let fee_estimates = btc_client.fee_estimates().await?;
println!("fee estimates: {:?}", fee_estimates);
btc_wallet.set_blockchain_client(btc_client);
Sync BitcoinWallet, Load BitcoinAddresses
The [BitcoinWallet] struct can be used to sync the wallet with the blockchain and load the associated [BitcoinAddress]es.
let btc_client = Blockstream::new("https://blockstream.info/testnet/api")?;
let fee_estimates = btc_client.fee_estimates().await?;
println!("fee estimates: {:?}", fee_estimates);
btc_wallet.set_blockchain_client(btc_client);
for addr in btc_wallet.associated_info() {
println!("address: {}, derivation path {}",
addr.address.public_address(), addr.hd_key().derivation_path().to_string());
}
println!("next receive address: {}", btc_wallet.receive_address()?);
println!("next change address: {}", btc_wallet.next_change_address()?.public_address());
let balance = btc_wallet.balance().await?;
println!(
"bitcoin wallet balance: {} BTC, ({} satoshi",
balance.btc(),
balance.satoshi()
);
Dependencies
~16–30MB
~436K SLoC