diff --git a/dash-spv/src/bloom/builder.rs b/dash-spv/src/bloom/builder.rs
deleted file mode 100644
index 9aaa11947..000000000
--- a/dash-spv/src/bloom/builder.rs
+++ /dev/null
@@ -1,140 +0,0 @@
-//! Bloom filter construction utilities
-
-use super::utils::{extract_pubkey_hash, outpoint_to_bytes};
-use crate::error::SpvError;
-use dashcore::address::Address;
-use dashcore::bloom::{BloomFilter, BloomFlags};
-use dashcore::OutPoint;
-
-/// Builder for constructing bloom filters from wallet state
-pub struct BloomFilterBuilder {
- /// Expected number of elements
- elements: u32,
- /// Desired false positive rate
- false_positive_rate: f64,
- /// Random tweak value
- tweak: u32,
- /// Update flags
- flags: BloomFlags,
- /// Addresses to include
- addresses: Vec
,
- /// Outpoints to include
- outpoints: Vec,
- /// Raw data elements to include
- data_elements: Vec>,
-}
-
-impl BloomFilterBuilder {
- /// Create a new bloom filter builder
- pub fn new() -> Self {
- Self {
- elements: 100,
- false_positive_rate: 0.001,
- tweak: rand::random::(),
- flags: BloomFlags::All,
- addresses: Vec::new(),
- outpoints: Vec::new(),
- data_elements: Vec::new(),
- }
- }
-
- /// Set the expected number of elements
- pub fn elements(mut self, elements: u32) -> Self {
- self.elements = elements;
- self
- }
-
- /// Set the false positive rate
- pub fn false_positive_rate(mut self, rate: f64) -> Self {
- self.false_positive_rate = rate;
- self
- }
-
- /// Set the tweak value
- pub fn tweak(mut self, tweak: u32) -> Self {
- self.tweak = tweak;
- self
- }
-
- /// Set the update flags
- pub fn flags(mut self, flags: BloomFlags) -> Self {
- self.flags = flags;
- self
- }
-
- /// Add an address to the filter
- pub fn add_address(mut self, address: Address) -> Self {
- self.addresses.push(address);
- self
- }
-
- /// Add multiple addresses
- pub fn add_addresses(mut self, addresses: impl IntoIterator- ) -> Self {
- self.addresses.extend(addresses);
- self
- }
-
- /// Add an outpoint to the filter
- pub fn add_outpoint(mut self, outpoint: OutPoint) -> Self {
- self.outpoints.push(outpoint);
- self
- }
-
- /// Add multiple outpoints
- pub fn add_outpoints(mut self, outpoints: impl IntoIterator
- ) -> Self {
- self.outpoints.extend(outpoints);
- self
- }
-
- /// Add raw data to the filter
- pub fn add_data(mut self, data: Vec) -> Self {
- self.data_elements.push(data);
- self
- }
-
- // Removed: from_wallet - wallet functionality is now handled externally
- // The wallet interface doesn't expose addresses and UTXOs directly
-
- /// Build the bloom filter
- pub fn build(self) -> Result {
- // Calculate actual elements
- let actual_elements =
- self.addresses.len() + self.outpoints.len() + self.data_elements.len();
- let elements = std::cmp::max(self.elements, actual_elements as u32);
-
- // Create filter
- let mut filter =
- BloomFilter::new(elements, self.false_positive_rate, self.tweak, self.flags).map_err(
- |e| SpvError::General(format!("Failed to create bloom filter: {:?}", e)),
- )?;
-
- // Add addresses
- for address in self.addresses {
- let script = address.script_pubkey();
- filter.insert(script.as_bytes());
-
- // For P2PKH, also add the pubkey hash
- if let Some(hash) = extract_pubkey_hash(&script) {
- filter.insert(&hash);
- }
- }
-
- // Add outpoints
- for outpoint in self.outpoints {
- filter.insert(&outpoint_to_bytes(&outpoint));
- }
-
- // Add raw data
- for data in self.data_elements {
- filter.insert(&data);
- }
-
- Ok(filter)
- }
-}
-
-impl Default for BloomFilterBuilder {
- fn default() -> Self {
- Self::new()
- }
-}
diff --git a/dash-spv/src/bloom/manager.rs b/dash-spv/src/bloom/manager.rs
deleted file mode 100644
index 145b4dc65..000000000
--- a/dash-spv/src/bloom/manager.rs
+++ /dev/null
@@ -1,317 +0,0 @@
-//! Bloom filter lifecycle management for SPV clients
-
-use super::utils::{extract_pubkey_hash, outpoint_to_bytes};
-use crate::error::SpvError;
-use dashcore::address::Address;
-use dashcore::bloom::{BloomFilter, BloomFlags};
-use dashcore::network::message_bloom::{FilterAdd, FilterLoad};
-use dashcore::transaction::Transaction;
-use dashcore::OutPoint;
-use std::sync::Arc;
-use tokio::sync::RwLock;
-
-/// Configuration for bloom filter behavior
-#[derive(Debug, Clone)]
-pub struct BloomFilterConfig {
- /// Expected number of elements
- pub elements: u32,
- /// Desired false positive rate (0.0 to 1.0)
- pub false_positive_rate: f64,
- /// Random value added to hash seeds
- pub tweak: u32,
- /// Update behavior flags
- pub flags: BloomFlags,
- /// Auto-recreate filter when false positive rate exceeds this threshold
- pub max_false_positive_rate: f64,
- /// Track performance statistics
- pub enable_stats: bool,
-}
-
-impl Default for BloomFilterConfig {
- fn default() -> Self {
- Self {
- elements: 100,
- false_positive_rate: 0.001,
- tweak: rand::random::(),
- flags: BloomFlags::All,
- max_false_positive_rate: 0.05,
- enable_stats: true,
- }
- }
-}
-
-/// Statistics for bloom filter performance
-#[derive(Debug, Clone, Default)]
-pub struct BloomFilterStats {
- /// Number of items added to the filter
- pub items_added: u64,
- /// Number of positive matches
- pub matches: u64,
- /// Number of queries performed
- pub queries: u64,
- /// Number of times filter was recreated
- pub recreations: u64,
- /// Current estimated false positive rate
- pub current_false_positive_rate: f64,
-}
-
-/// Manages bloom filter lifecycle for SPV client
-pub struct BloomFilterManager {
- /// Current bloom filter
- filter: Arc>>,
- /// Configuration
- config: BloomFilterConfig,
- /// Performance statistics
- stats: Arc>,
- /// Addresses being watched
- addresses: Arc>>,
- /// Outpoints being watched
- outpoints: Arc>>,
- /// Data elements being watched
- data_elements: Arc>>>,
-}
-
-impl BloomFilterManager {
- /// Create a new bloom filter manager
- pub fn new(config: BloomFilterConfig) -> Self {
- Self {
- filter: Arc::new(RwLock::new(None)),
- config,
- stats: Arc::new(RwLock::new(BloomFilterStats::default())),
- addresses: Arc::new(RwLock::new(Vec::new())),
- outpoints: Arc::new(RwLock::new(Vec::new())),
- data_elements: Arc::new(RwLock::new(Vec::new())),
- }
- }
-
- /// Initialize or recreate the bloom filter
- pub async fn create_filter(&self) -> Result {
- let addresses = self.addresses.read().await;
- let outpoints = self.outpoints.read().await;
- let data_elements = self.data_elements.read().await;
-
- // Calculate total elements
- let total_elements =
- addresses.len() as u32 + outpoints.len() as u32 + data_elements.len() as u32;
-
- let elements = std::cmp::max(self.config.elements, total_elements);
-
- // Create new filter
- let mut new_filter = BloomFilter::new(
- elements,
- self.config.false_positive_rate,
- self.config.tweak,
- self.config.flags,
- )
- .map_err(|e| SpvError::General(format!("Failed to create bloom filter: {:?}", e)))?;
-
- // Add all watched elements
- for address in addresses.iter() {
- self.add_address_to_filter(&mut new_filter, address)?;
- }
-
- for outpoint in outpoints.iter() {
- new_filter.insert(&outpoint_to_bytes(outpoint));
- }
-
- for data in data_elements.iter() {
- new_filter.insert(data);
- }
-
- // Update stats
- if self.config.enable_stats {
- let mut stats = self.stats.write().await;
- stats.recreations += 1;
- stats.items_added = total_elements as u64;
- stats.current_false_positive_rate =
- new_filter.estimate_false_positive_rate(total_elements);
- }
-
- // Store the new filter
- let filter_load = FilterLoad::from_bloom_filter(&new_filter);
- *self.filter.write().await = Some(new_filter);
-
- Ok(filter_load)
- }
-
- /// Add an address to the filter
- pub async fn add_address(&self, address: &Address) -> Result