rustywallet_export/
paper_wallet.rs1use 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
9pub 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}