Skip to content

Commit

Permalink
Add fallible Wallet try_get_address(), try_get_internal_address funct…
Browse files Browse the repository at this point in the history
…ions when a PersistBackend is used
  • Loading branch information
notmandatory committed Jul 8, 2023
1 parent d99e4a5 commit cc4ba36
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 7 deletions.
36 changes: 32 additions & 4 deletions crates/bdk/src/wallet/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,24 @@ impl Wallet {
NewError::Persist(_) => unreachable!("no persistence so it can't fail"),
})
}

/// Infallibly return a derived address using the external descriptor, see [`AddressIndex`] for
/// available address index selection strategies. If none of the keys in the descriptor are derivable
/// (i.e. does not end with /*) then the same address will always be returned for any [`AddressIndex`].
pub fn get_address(&mut self, address_index: AddressIndex) -> AddressInfo {
self.try_get_address(address_index).unwrap()
}

/// Infallibly return a derived address using the internal (change) descriptor.
///
/// If the wallet doesn't have an internal descriptor it will use the external descriptor.
///
/// see [`AddressIndex`] for available address index selection strategies. If none of the keys
/// in the descriptor are derivable (i.e. does not end with /*) then the same address will always
/// be returned for any [`AddressIndex`].
pub fn get_internal_address(&mut self, address_index: AddressIndex) -> AddressInfo {
self.try_get_internal_address(address_index).unwrap()
}
}

#[derive(Debug)]
Expand Down Expand Up @@ -330,27 +348,37 @@ impl<D> Wallet<D> {
/// Return a derived address using the external descriptor, see [`AddressIndex`] for
/// available address index selection strategies. If none of the keys in the descriptor are derivable
/// (i.e. does not end with /*) then the same address will always be returned for any [`AddressIndex`].
pub fn get_address(&mut self, address_index: AddressIndex) -> AddressInfo
///
/// A `PersistBackend<ChangeSet>::WriteError` will result if unable to persist the new address
/// to the `PersistBackend`.
pub fn try_get_address(
&mut self,
address_index: AddressIndex,
) -> Result<AddressInfo, D::WriteError>
where
D: PersistBackend<ChangeSet>,
{
self._get_address(KeychainKind::External, address_index)
.expect("persistence backend must not fail")
}

/// Return a derived address using the internal (change) descriptor.
///
/// If the wallet doesn't have an internal descriptor it will use the external descriptor.
///
/// A `PersistBackend<ChangeSet>::WriteError` will result if unable to persist the new address
/// to the `PersistBackend`.
///
/// see [`AddressIndex`] for available address index selection strategies. If none of the keys
/// in the descriptor are derivable (i.e. does not end with /*) then the same address will always
/// be returned for any [`AddressIndex`].
pub fn get_internal_address(&mut self, address_index: AddressIndex) -> AddressInfo
pub fn try_get_internal_address(
&mut self,
address_index: AddressIndex,
) -> Result<AddressInfo, D::WriteError>
where
D: PersistBackend<ChangeSet>,
{
self._get_address(KeychainKind::Internal, address_index)
.expect("persistence backend must not fail")
}

/// Return a derived address using the specified `keychain` (external/internal).
Expand Down
4 changes: 3 additions & 1 deletion example-crates/wallet_electrum/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
Network::Testnet,
)?;

let address = wallet.get_address(bdk::wallet::AddressIndex::New);
let address = wallet
.try_get_address(bdk::wallet::AddressIndex::New)
.expect("new_address");
println!("Generated Address: {}", address);

let balance = wallet.get_balance();
Expand Down
4 changes: 3 additions & 1 deletion example-crates/wallet_esplora/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
Network::Testnet,
)?;

let address = wallet.get_address(AddressIndex::New);
let address = wallet
.try_get_address(AddressIndex::New)
.expect("new address");
println!("Generated Address: {}", address);

let balance = wallet.get_balance();
Expand Down
4 changes: 3 additions & 1 deletion example-crates/wallet_esplora_async/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Network::Testnet,
)?;

let address = wallet.get_address(AddressIndex::New);
let address = wallet
.try_get_address(AddressIndex::New)
.expect("new address");
println!("Generated Address: {}", address);

let balance = wallet.get_balance();
Expand Down

0 comments on commit cc4ba36

Please sign in to comment.