rustywallet_recovery/
lib.rs

1//! # rustywallet-recovery
2//!
3//! Wallet recovery tools for Bitcoin - scan blockchain for funds from mnemonic or xpub.
4//!
5//! ## Features
6//!
7//! - **Mnemonic Recovery**: Scan all standard derivation paths from a seed phrase
8//! - **Extended Key Recovery**: Scan from xpub or xprv
9//! - **Multi-Path Support**: BIP44, BIP49, BIP84, BIP86 (Legacy, SegWit, Native SegWit, Taproot)
10//! - **Gap Limit**: Configurable gap limit for address scanning
11//! - **UTXO Discovery**: Find all unspent outputs for spending
12//! - **Progress Reporting**: Callback for scan progress updates
13//!
14//! ## Example
15//!
16//! ```ignore
17//! use rustywallet_recovery::{RecoveryScanner, RecoveryConfig, ElectrumBackend};
18//!
19//! #[tokio::main]
20//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
21//!     // Create backend
22//!     let backend = ElectrumBackend::mainnet().await?;
23//!
24//!     // Configure scan
25//!     let config = RecoveryConfig::new()
26//!         .with_gap_limit(20);
27//!
28//!     // Create scanner from mnemonic
29//!     let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
30//!     let scanner = RecoveryScanner::from_mnemonic(mnemonic, None, backend, config)?;
31//!
32//!     // Run scan
33//!     let result = scanner.scan().await?;
34//!
35//!     println!("Total balance: {} sats", result.total_balance);
36//!     println!("Addresses found: {}", result.addresses.len());
37//!     println!("UTXOs found: {}", result.utxos.len());
38//!     Ok(())
39//! }
40//! ```
41//!
42//! ## Quick Scan
43//!
44//! ```ignore
45//! use rustywallet_recovery::{RecoveryScanner, RecoveryConfig, ElectrumBackend, ScanPath};
46//!
47//! #[tokio::main]
48//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
49//!     // Quick scan with smaller gap limit
50//!     let config = RecoveryConfig::quick()
51//!         .with_scan_paths(vec![ScanPath::Bip84]); // Only native segwit
52//!
53//!     let backend = ElectrumBackend::mainnet().await?;
54//!     let scanner = RecoveryScanner::from_mnemonic(
55//!         "your mnemonic here...",
56//!         None,
57//!         backend,
58//!         config
59//!     )?;
60//!
61//!     let result = scanner.scan().await?;
62//!     println!("{}", result.summary());
63//!     Ok(())
64//! }
65//! ```
66
67pub mod backend;
68pub mod config;
69pub mod error;
70pub mod result;
71pub mod scanner;
72
73// Re-exports
74pub use backend::{AddressBalance, Backend, ElectrumBackend};
75pub use config::{RecoveryConfig, ScanPath};
76pub use error::RecoveryError;
77pub use result::{FoundAddress, FoundUtxo, RecoveryResult, ScanStats};
78pub use scanner::{ProgressCallback, RecoveryScanner, ScanProgress};
79
80#[cfg(test)]
81mod tests {
82    use super::*;
83
84    #[test]
85    fn test_config_defaults() {
86        let config = RecoveryConfig::default();
87        assert_eq!(config.gap_limit, 20);
88        assert_eq!(config.scan_paths.len(), 4);
89    }
90
91    #[test]
92    fn test_scan_path_all() {
93        let paths = ScanPath::all();
94        assert_eq!(paths.len(), 4);
95        assert!(paths.contains(&ScanPath::Bip44));
96        assert!(paths.contains(&ScanPath::Bip84));
97    }
98}