rustywallet_export/
paper_wallet.rs

1//! Paper wallet export functions.
2
3use crate::error::{ExportError, Result};
4use crate::types::{AddressType, Network, PaperWallet};
5use crate::export_wif;
6use rustywallet_keys::prelude::PrivateKey;
7use rustywallet_address::{P2PKHAddress, P2WPKHAddress, P2TRAddress, Network as AddrNetwork};
8
9/// Generate paper wallet data from a private key.
10///
11/// # Example
12///
13/// ```rust
14/// use rustywallet_export::{to_paper_wallet, Network, AddressType};
15/// use rustywallet_keys::prelude::PrivateKey;
16///
17/// let key = PrivateKey::random();
18/// let paper = to_paper_wallet(&key, Network::Mainnet, AddressType::P2PKH).unwrap();
19///
20/// println!("Address: {}", paper.address);
21/// println!("WIF: {}", paper.wif);
22/// ```
23pub fn to_paper_wallet(
24    key: &PrivateKey,
25    network: Network,
26    address_type: AddressType,
27) -> Result<PaperWallet> {
28    let public_key = key.public_key();
29    
30    let addr_network = match network {
31        Network::Mainnet => AddrNetwork::BitcoinMainnet,
32        Network::Testnet => AddrNetwork::BitcoinTestnet,
33    };
34    
35    let address = match address_type {
36        AddressType::P2PKH => {
37            P2PKHAddress::from_public_key(&public_key, addr_network)
38                .map_err(|e| ExportError::AddressError(e.to_string()))?
39                .to_string()
40        }
41        AddressType::P2WPKH => {
42            P2WPKHAddress::from_public_key(&public_key, addr_network)
43                .map_err(|e| ExportError::AddressError(e.to_string()))?
44                .to_string()
45        }
46        AddressType::P2TR => {
47            P2TRAddress::from_public_key(&public_key, addr_network)
48                .map_err(|e| ExportError::AddressError(e.to_string()))?
49                .to_string()
50        }
51    };
52    
53    Ok(PaperWallet {
54        address,
55        wif: export_wif(key, network, true),
56        network: network.to_string(),
57        address_type: address_type.to_string(),
58    })
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64    
65    #[test]
66    fn test_paper_wallet_p2pkh() {
67        let key = PrivateKey::random();
68        let paper = to_paper_wallet(&key, Network::Mainnet, AddressType::P2PKH).unwrap();
69        
70        assert!(paper.address.starts_with('1'));
71        assert!(paper.wif.starts_with('K') || paper.wif.starts_with('L'));
72        assert_eq!(paper.network, "mainnet");
73        assert_eq!(paper.address_type, "p2pkh");
74    }
75    
76    #[test]
77    fn test_paper_wallet_p2wpkh() {
78        let key = PrivateKey::random();
79        let paper = to_paper_wallet(&key, Network::Mainnet, AddressType::P2WPKH).unwrap();
80        
81        assert!(paper.address.starts_with("bc1q"));
82    }
83    
84    #[test]
85    fn test_paper_wallet_p2tr() {
86        let key = PrivateKey::random();
87        let paper = to_paper_wallet(&key, Network::Mainnet, AddressType::P2TR).unwrap();
88        
89        assert!(paper.address.starts_with("bc1p"));
90    }
91    
92    #[test]
93    fn test_paper_wallet_testnet() {
94        let key = PrivateKey::random();
95        let paper = to_paper_wallet(&key, Network::Testnet, AddressType::P2PKH).unwrap();
96        
97        assert!(paper.address.starts_with('m') || paper.address.starts_with('n'));
98        assert!(paper.wif.starts_with('c'));
99    }
100}