generate_bitcoin_paper_wallet/
address.rs

1//! Bitcoin Addresses
2
3use crate::private_key::PrivateKey;
4use bitcoin::network::constants::Network;
5use bitcoin::secp256k1;
6use bitcoin::secp256k1::{Error, Secp256k1, SecretKey};
7use bitcoin::Address as Addr;
8use bitcoin::PublicKey;
9use std::convert::TryFrom;
10
11/// Wrapper to bitcoin::Address to implement TryFrom
12pub struct Address(pub Addr);
13
14impl TryFrom<PrivateKey> for Address {
15    type Error = Error;
16
17    /// Attempts to convert a PrivateKey to a bitcoin p2pkh Address
18    fn try_from(private_key: PrivateKey) -> Result<Address, Error> {
19        let secp = Secp256k1::new();
20        let public_key = PublicKey {
21            compressed: false,
22            key: secp256k1::PublicKey::from_secret_key(
23                &secp,
24                &SecretKey::from_slice(&private_key.0[..])?,
25            ),
26        };
27
28        Ok(Address(Addr::p2pkh(&public_key, Network::Bitcoin)))
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35    #[test]
36    fn generates_a_public_key() {
37        let private_key = PrivateKey([
38            0x0C, 0x28, 0xFC, 0xA3, 0x86, 0xC7, 0xA2, 0x27, 0x60, 0x0B, 0x2F, 0xE5, 0x0B, 0x7C,
39            0xAE, 0x11, 0xEC, 0x86, 0xD3, 0xBF, 0x1F, 0xBE, 0x47, 0x1B, 0xE8, 0x98, 0x27, 0xE1,
40            0x9D, 0x72, 0xAA, 0x1D,
41        ]);
42
43        let address = Address::try_from(private_key).unwrap();
44
45        assert_eq!(
46            "1GAehh7TsJAHuUAeKZcXf5CnwuGuGgyX2S",
47            format!("{}", address.0)
48        );
49    }
50}