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//!
43//! ## Address Validation
44//!
45//! ```rust
46//! use rustywallet_address::prelude::*;
47//!
48//! // Validate any address
49//! let result = Address::validate("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4");
50//! assert!(result.is_ok());
51//!
52//! // Validate specific types
53//! let result = P2WPKHAddress::validate("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4");
54//! assert!(result.is_ok());
55//!
56//! // Validate Ethereum checksum
57//! let result = EthereumAddress::validate_checksum("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed");
58//! assert!(result.is_ok());
59//! ```
60//!
61//! ## Address Type Detection
62//!
63//! ```rust
64//! use rustywallet_address::prelude::*;
65//!
66//! let addr: Address = "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4".parse().unwrap();
67//! assert!(addr.is_bitcoin());
68//!
69//! let addr: Address = "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed".parse().unwrap();
70//! assert!(addr.is_ethereum());
71//! ```
72
73pub mod address;
74pub mod bitcoin;
75pub mod encoding;
76pub mod error;
77pub mod ethereum;
78pub mod network;
79pub mod prelude;
80pub mod silent_payments;
81
82// Re-export main types at crate root
83pub use address::{Address, AddressFormat};
84pub use bitcoin::{BitcoinAddress, BitcoinAddressType, P2PKHAddress, P2TRAddress, P2WPKHAddress};
85pub use error::AddressError;
86pub use ethereum::EthereumAddress;
87pub use network::Network;
88pub use silent_payments::{SilentPaymentAddress, SilentPaymentDeriver, SilentPaymentLabel};
89
90#[cfg(test)]
91mod tests {
92    use super::*;
93    use rustywallet_keys::private_key::PrivateKey;
94
95    #[test]
96    fn test_all_bitcoin_address_types() {
97        let pk = PrivateKey::random();
98        let pubkey = pk.public_key();
99
100        // P2PKH
101        let p2pkh = P2PKHAddress::from_public_key(&pubkey, Network::BitcoinMainnet).unwrap();
102        assert!(p2pkh.to_string().starts_with('1'));
103
104        // P2WPKH
105        let p2wpkh = P2WPKHAddress::from_public_key(&pubkey, Network::BitcoinMainnet).unwrap();
106        assert!(p2wpkh.to_string().starts_with("bc1q"));
107
108        // P2TR
109        let p2tr = P2TRAddress::from_public_key(&pubkey, Network::BitcoinMainnet).unwrap();
110        assert!(p2tr.to_string().starts_with("bc1p"));
111    }
112
113    #[test]
114    fn test_ethereum_address() {
115        let pk = PrivateKey::random();
116        let pubkey = pk.public_key();
117
118        let addr = EthereumAddress::from_public_key(&pubkey).unwrap();
119        let addr_str = addr.to_checksum_string();
120        assert!(addr_str.starts_with("0x"));
121        assert_eq!(addr_str.len(), 42);
122    }
123}