Bitcoin Wallet
WalletD features the ability to create and work with Bitcoin wallets. In this section, we'll guide you on how to use WalletD to handle Bitcoin wallets.
Imports needed for this section
use walletd_bitcoin::bitcoin;
use walletd::walletd_bitcoin::prelude::*;
use walletd::walletd_hd_key::prelude::*;
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 to_seed
method.
Example
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 BIP84.
Example
assert_eq!(btc_wallet.address_format(), bitcoin::AddressType::P2wpkh);
assert_eq!(btc_wallet.hd_path_builder().purpose, Some(HDPurpose::BIP84.to_shortform_num()));
Using Blockstream
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.
Example
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
The BitcoinWallet
struct can be used to sync the wallet with the blockchain and load the associated BitcoinAddresses.
Example
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()
);