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}