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()
);