Skip to content

Commit

Permalink
feat(wallet): Add infallible Wallet get_address(), get_internal_addre…
Browse files Browse the repository at this point in the history
…ss functions

refactor!(wallet)!: rename fallible Wallet try_get_address(), try_get_internal_address functions
  • Loading branch information
notmandatory committed Nov 16, 2023
1 parent 9e7d99e commit 77f9977
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 7 deletions.
41 changes: 37 additions & 4 deletions crates/bdk/src/wallet/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,29 @@ impl Wallet {
}
}

impl<D> Wallet<D>
where
D: PersistBackend<ChangeSet, WriteError = core::convert::Infallible>,
{
/// 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()
}
}

/// The error type when constructing a fresh [`Wallet`].
///
/// Methods [`new`] and [`new_with_genesis_hash`] may return this error.
Expand Down Expand Up @@ -611,27 +634,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
2 changes: 1 addition & 1 deletion example-crates/wallet_electrum/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ fn main() -> Result<(), anyhow::Error> {
Network::Testnet,
)?;

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

let balance = wallet.get_balance();
Expand Down
2 changes: 1 addition & 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,7 @@ async fn main() -> Result<(), anyhow::Error> {
Network::Testnet,
)?;

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

let balance = wallet.get_balance();
Expand Down
2 changes: 1 addition & 1 deletion example-crates/wallet_esplora_blocking/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ fn main() -> Result<(), anyhow::Error> {
Network::Testnet,
)?;

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

let balance = wallet.get_balance();
Expand Down

0 comments on commit 77f9977

Please sign in to comment.