rustywallet_address/
lib.rs

1//! # rustywallet-address
2//!
3//! Cryptocurrency address generation and validation for Bitcoin and Ethereum.
4//!
5//! This crate provides type-safe APIs for generating and validating addresses
6//! from public keys, supporting multiple address formats:
7//!
8//! - **Bitcoin Legacy (P2PKH)** - Addresses starting with `1` (mainnet) or `m`/`n` (testnet)
9//! - **Bitcoin SegWit (P2WPKH)** - Addresses starting with `bc1q` (mainnet) or `tb1q` (testnet)
10//! - **Bitcoin Taproot (P2TR)** - Addresses starting with `bc1p` (mainnet) or `tb1p` (testnet)
11//! - **Ethereum** - Addresses starting with `0x` with EIP-55 checksum support
12//!
13//! ## Quick Start
14//!
15//! ```rust
16//! use rustywallet_keys::prelude::PrivateKey;
17//! use rustywallet_address::prelude::*;
18//!
19//! // Generate a random private key
20//! let private_key = PrivateKey::random();
21//!
22//! // Bitcoin addresses
23//! let public_key = private_key.public_key();
24//!
25//! // Legacy P2PKH address
26//! let p2pkh = P2PKHAddress::from_public_key(&public_key, Network::BitcoinMainnet).unwrap();
27//! println!("P2PKH: {}", p2pkh); // 1...
28//!
29//! // SegWit P2WPKH address
30//! let p2wpkh = P2WPKHAddress::from_public_key(&public_key, Network::BitcoinMainnet).unwrap();
31//! println!("P2WPKH: {}", p2wpkh); // bc1q...
32//!
33//! // Taproot P2TR address
34//! let p2tr = P2TRAddress::from_public_key(&public_key, Network::BitcoinMainnet).unwrap();
35//! println!("P2TR: {}", p2tr); // bc1p...
36//!
37//! // Ethereum address
38//! let eth_addr = EthereumAddress::from_public_key(&public_key).unwrap();
39//! println!("Ethereum: {}", eth_addr); // 0x...
40//! ```
41//!
42//! ## Address Validation
43//!
44//! ```rust
45//! use rustywallet_address::prelude::*;
46//!
47//! // Validate any address
48//! let result = Address::validate("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4");
49//! assert!(result.is_ok());
50//!
51//! // Validate specific types
52//! let result = P2WPKHAddress::validate("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4");
53//! assert!(result.is_ok());
54//!
55//! // Validate Ethereum checksum
56//! let result = EthereumAddress::validate_checksum("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed");
57//! assert!(result.is_ok());
58//! ```
59//!
60//! ## Address Type Detection
61//!
62//! ```rust
63//! use rustywallet_address::prelude::*;
64//!
65//! let addr: Address = "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4".parse().unwrap();
66//! assert!(addr.is_bitcoin());
67//!
68//! let addr: Address = "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed".parse().unwrap();
69//! assert!(addr.is_ethereum());
70//! ```
71
72pub mod address;
73pub mod bitcoin;
74pub mod encoding;
75pub mod error;
76pub mod ethereum;
77pub mod network;
78pub mod prelude;
79pub mod silent_payments;
80
81// Re-export main types at crate root
82pub use address::{Address, AddressFormat};
83pub use bitcoin::{BitcoinAddress, BitcoinAddressType, P2PKHAddress, P2TRAddress, P2WPKHAddress};
84pub use error::AddressError;
85pub use ethereum::EthereumAddress;
86pub use network::Network;
87pub use silent_payments::{SilentPaymentAddress, SilentPaymentDeriver, SilentPaymentLabel};
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92    use rustywallet_keys::private_key::PrivateKey;
93
94    #[test]
95    fn test_all_bitcoin_address_types() {
96        let pk = PrivateKey::random();
97        let pubkey = pk.public_key();
98
99        // P2PKH
100        let p2pkh = P2PKHAddress::from_public_key(&pubkey, Network::BitcoinMainnet).unwrap();
101        assert!(p2pkh.to_string().starts_with('1'));
102
103        // P2WPKH
104        let p2wpkh = P2WPKHAddress::from_public_key(&pubkey, Network::BitcoinMainnet).unwrap();
105        assert!(p2wpkh.to_string().starts_with("bc1q"));
106
107        // P2TR
108        let p2tr = P2TRAddress::from_public_key(&pubkey, Network::BitcoinMainnet).unwrap();
109        assert!(p2tr.to_string().starts_with("bc1p"));
110    }
111
112    #[test]
113    fn test_ethereum_address() {
114        let pk = PrivateKey::random();
115        let pubkey = pk.public_key();
116
117        let addr = EthereumAddress::from_public_key(&pubkey).unwrap();
118        let addr_str = addr.to_checksum_string();
119        assert!(addr_str.starts_with("0x"));
120        assert_eq!(addr_str.len(), 42);
121    }
122}