diff --git a/Cargo.toml b/Cargo.toml index b931976f..d2278984 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,8 +103,6 @@ lazy_static = "1.4" env_logger = "0.7" electrsd = "0.20" -[[example]] -name = "address_validator" [[example]] name = "compact_filters_balance" required-features = ["compact_filters"] diff --git a/examples/address_validator.rs b/examples/address_validator.rs deleted file mode 100644 index 26c36dfe..00000000 --- a/examples/address_validator.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Bitcoin Dev Kit -// Written in 2020 by Alekos Filini -// -// Copyright (c) 2020-2021 Bitcoin Dev Kit Developers -// -// This file is licensed under the Apache License, Version 2.0 or the MIT license -// , at your option. -// You may not use this file except in accordance with one or both of these -// licenses. - -use std::sync::Arc; - -use bdk::bitcoin; -use bdk::database::MemoryDatabase; -use bdk::descriptor::HdKeyPaths; -#[allow(deprecated)] -use bdk::wallet::address_validator::{AddressValidator, AddressValidatorError}; -use bdk::KeychainKind; -use bdk::Wallet; - -use bdk::wallet::AddressIndex::New; -use bitcoin::hashes::hex::FromHex; -use bitcoin::util::bip32::Fingerprint; -use bitcoin::{Network, Script}; - -#[derive(Debug)] -struct DummyValidator; -#[allow(deprecated)] -impl AddressValidator for DummyValidator { - fn validate( - &self, - keychain: KeychainKind, - hd_keypaths: &HdKeyPaths, - script: &Script, - ) -> Result<(), AddressValidatorError> { - let (_, path) = hd_keypaths - .values() - .find(|(fing, _)| fing == &Fingerprint::from_hex("bc123c3e").unwrap()) - .ok_or(AddressValidatorError::InvalidScript)?; - - println!( - "Validating `{:?}` {} address, script: {}", - keychain, path, script - ); - - Ok(()) - } -} - -fn main() -> Result<(), bdk::Error> { - let descriptor = "sh(and_v(v:pk(tpubDDpWvmUrPZrhSPmUzCMBHffvC3HyMAPnWDSAQNBTnj1iZeJa7BZQEttFiP4DS4GCcXQHezdXhn86Hj6LHX5EDstXPWrMaSneRWM8yUf6NFd/*),after(630000)))"; - let mut wallet = Wallet::new(descriptor, None, Network::Regtest, MemoryDatabase::new())?; - - #[allow(deprecated)] - wallet.add_address_validator(Arc::new(DummyValidator)); - - wallet.get_address(New)?; - wallet.get_address(New)?; - wallet.get_address(New)?; - - Ok(()) -} diff --git a/src/error.rs b/src/error.rs index c3f9ea15..66b5cf8b 100644 --- a/src/error.rs +++ b/src/error.rs @@ -12,7 +12,7 @@ use std::fmt; use crate::bitcoin::Network; -use crate::{descriptor, wallet, wallet::address_validator}; +use crate::{descriptor, wallet}; use bitcoin::{OutPoint, Txid}; /// Errors that can be thrown by the [`Wallet`](crate::wallet::Wallet) @@ -99,8 +99,6 @@ pub enum Error { /// Error related to the parsing and usage of descriptors Descriptor(crate::descriptor::error::Error), - /// Error that can be returned to fail the validation of an address - AddressValidator(crate::wallet::address_validator::AddressValidatorError), /// Encoding error Encode(bitcoin::consensus::encode::Error), /// Miniscript error @@ -181,7 +179,6 @@ macro_rules! impl_error { } impl_error!(descriptor::error::Error, Descriptor); -impl_error!(address_validator::AddressValidatorError, AddressValidator); impl_error!(descriptor::policy::PolicyError, InvalidPolicyPathError); impl_error!(wallet::signer::SignerError, Signer); diff --git a/src/lib.rs b/src/lib.rs index 92d6aa5b..1a644ebd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -273,7 +273,6 @@ pub use descriptor::template; pub use descriptor::HdKeyPaths; pub use error::Error; pub use types::*; -pub use wallet::address_validator; pub use wallet::signer; pub use wallet::signer::SignOptions; pub use wallet::tx_builder::TxBuilder; diff --git a/src/wallet/address_validator.rs b/src/wallet/address_validator.rs deleted file mode 100644 index eaac582c..00000000 --- a/src/wallet/address_validator.rs +++ /dev/null @@ -1,158 +0,0 @@ -// Bitcoin Dev Kit -// Written in 2020 by Alekos Filini -// -// Copyright (c) 2020-2021 Bitcoin Dev Kit Developers -// -// This file is licensed under the Apache License, Version 2.0 or the MIT license -// , at your option. -// You may not use this file except in accordance with one or both of these -// licenses. - -//! Address validation callbacks -//! -//! The typical usage of those callbacks is for displaying the newly-generated address on a -//! hardware wallet, so that the user can cross-check its correctness. -//! -//! More generally speaking though, these callbacks can also be used to "do something" every time -//! an address is generated, without necessarily checking or validating it. -//! -//! An address validator can be attached to a [`Wallet`](super::Wallet) by using the -//! [`Wallet::add_address_validator`](super::Wallet::add_address_validator) method, and -//! whenever a new address is generated (either explicitly by the user with -//! [`Wallet::get_address`](super::Wallet::get_address) or internally to create a change -//! address) all the attached validators will be polled, in sequence. All of them must complete -//! successfully to continue. -//! -//! ## Example -//! -//! ``` -//! # use std::sync::Arc; -//! # use bitcoin::*; -//! # use bdk::address_validator::*; -//! # use bdk::database::*; -//! # use bdk::*; -//! # use bdk::wallet::AddressIndex::New; -//! #[derive(Debug)] -//! struct PrintAddressAndContinue; -//! -//! impl AddressValidator for PrintAddressAndContinue { -//! fn validate( -//! &self, -//! keychain: KeychainKind, -//! hd_keypaths: &HdKeyPaths, -//! script: &Script -//! ) -> Result<(), AddressValidatorError> { -//! let address = Address::from_script(script, Network::Testnet) -//! .as_ref() -//! .map(Address::to_string) -//! .unwrap_or(script.to_string()); -//! println!("New address of type {:?}: {}", keychain, address); -//! println!("HD keypaths: {:#?}", hd_keypaths); -//! -//! Ok(()) -//! } -//! } -//! -//! let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)"; -//! let mut wallet = Wallet::new(descriptor, None, Network::Testnet, MemoryDatabase::default())?; -//! wallet.add_address_validator(Arc::new(PrintAddressAndContinue)); -//! -//! let address = wallet.get_address(New)?; -//! println!("Address: {}", address); -//! # Ok::<(), bdk::Error>(()) -//! ``` - -use std::fmt; - -use bitcoin::Script; - -use crate::descriptor::HdKeyPaths; -use crate::types::KeychainKind; - -/// Errors that can be returned to fail the validation of an address -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum AddressValidatorError { - /// User rejected the address - UserRejected, - /// Network connection error - ConnectionError, - /// Network request timeout error - TimeoutError, - /// Invalid script - InvalidScript, - /// A custom error message - Message(String), -} - -impl fmt::Display for AddressValidatorError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl std::error::Error for AddressValidatorError {} - -/// Trait to build address validators -/// -/// All the address validators attached to a wallet with [`Wallet::add_address_validator`](super::Wallet::add_address_validator) will be polled -/// every time an address (external or internal) is generated by the wallet. Errors returned in the -/// validator will be propagated up to the original caller that triggered the address generation. -/// -/// For a usage example see [this module](crate::address_validator)'s documentation. -#[deprecated = "AddressValidator was rarely used. Address validation can occur outside of BDK"] -pub trait AddressValidator: Send + Sync + fmt::Debug { - /// Validate or inspect an address - fn validate( - &self, - keychain: KeychainKind, - hd_keypaths: &HdKeyPaths, - script: &Script, - ) -> Result<(), AddressValidatorError>; -} - -#[cfg(test)] -mod test { - use std::sync::Arc; - - use super::*; - use crate::wallet::AddressIndex::New; - use crate::wallet::{get_funded_wallet, test::get_test_wpkh}; - - #[derive(Debug)] - struct TestValidator; - #[allow(deprecated)] - impl AddressValidator for TestValidator { - fn validate( - &self, - _keychain: KeychainKind, - _hd_keypaths: &HdKeyPaths, - _script: &bitcoin::Script, - ) -> Result<(), AddressValidatorError> { - Err(AddressValidatorError::InvalidScript) - } - } - - #[test] - #[should_panic(expected = "InvalidScript")] - fn test_address_validator_external() { - let (mut wallet, _, _) = get_funded_wallet(get_test_wpkh()); - #[allow(deprecated)] - wallet.add_address_validator(Arc::new(TestValidator)); - - wallet.get_address(New).unwrap(); - } - - #[test] - #[should_panic(expected = "InvalidScript")] - fn test_address_validator_internal() { - let (mut wallet, descriptors, _) = get_funded_wallet(get_test_wpkh()); - #[allow(deprecated)] - wallet.add_address_validator(Arc::new(TestValidator)); - - let addr = crate::testutils!(@external descriptors, 10); - let mut builder = wallet.build_tx(); - builder.add_recipient(addr.script_pubkey(), 25_000); - builder.finish().unwrap(); - } -} diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index d804fd21..06b79d00 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -37,7 +37,6 @@ use miniscript::ToPublicKey; #[allow(unused_imports)] use log::{debug, error, info, trace}; -pub mod address_validator; pub mod coin_selection; pub mod export; pub mod signer; @@ -54,8 +53,6 @@ pub mod hardwaresigner; pub use utils::IsDust; -#[allow(deprecated)] -use address_validator::AddressValidator; use coin_selection::DefaultCoinSelectionAlgorithm; use signer::{SignOptions, SignerOrdering, SignersContainer, TransactionSigner}; use tx_builder::{BumpFee, CreateTx, FeePolicy, TxBuilder, TxParams}; @@ -100,9 +97,6 @@ pub struct Wallet { signers: Arc, change_signers: Arc, - #[allow(deprecated)] - address_validators: Vec>, - network: Network, database: RefCell, @@ -236,7 +230,6 @@ where change_descriptor, signers, change_signers, - address_validators: Vec::new(), network, database: RefCell::new(database), secp, @@ -552,24 +545,6 @@ where } } - /// Add an address validator - /// - /// See [the `address_validator` module](address_validator) for an example. - #[deprecated] - #[allow(deprecated)] - pub fn add_address_validator(&mut self, validator: Arc) { - self.address_validators.push(validator); - } - - /// Get the address validators - /// - /// See [the `address_validator` module](address_validator). - #[deprecated] - #[allow(deprecated)] - pub fn get_address_validators(&self) -> &[Arc] { - &self.address_validators - } - /// Start building a transaction. /// /// This returns a blank [`TxBuilder`] from which you can specify the parameters for the transaction. @@ -1348,16 +1323,6 @@ where self.cache_addresses(keychain, index, CACHE_ADDR_BATCH_SIZE)?; } - let derived_descriptor = descriptor.as_derived(index, &self.secp); - - let hd_keypaths = derived_descriptor.get_hd_keypaths(&self.secp); - let script = derived_descriptor.script_pubkey(); - - for validator in &self.address_validators { - #[allow(deprecated)] - validator.validate(keychain, &hd_keypaths, &script)?; - } - Ok(index) }