rosetta_crypto/address/
mod.rs

1//! Support for various blockchain address formats.
2use crate::bip32::DerivedPublicKey;
3use crate::PublicKey;
4
5mod bech32;
6mod eip55;
7mod ss58;
8
9pub use ss58::{Ss58AddressFormat, Ss58AddressFormatRegistry};
10
11/// Address format.
12#[derive(Clone, Copy, Debug, Eq, PartialEq)]
13pub enum AddressFormat {
14    /// bech32
15    Bech32(&'static str),
16    /// eip55
17    Eip55,
18    /// ss58
19    Ss58(Ss58AddressFormat),
20}
21
22impl From<Ss58AddressFormat> for AddressFormat {
23    fn from(format: Ss58AddressFormat) -> Self {
24        Self::Ss58(format)
25    }
26}
27
28impl From<Ss58AddressFormatRegistry> for AddressFormat {
29    fn from(format: Ss58AddressFormatRegistry) -> Self {
30        Self::Ss58(format.into())
31    }
32}
33
34/// Address.
35#[derive(Clone, Debug, Eq, PartialEq)]
36pub struct Address {
37    format: AddressFormat,
38    address: String,
39}
40
41impl Address {
42    /// Creates a new address.
43    pub fn new(format: AddressFormat, address: String) -> Self {
44        Self { format, address }
45    }
46
47    /// Formats the public key as an address.
48    pub fn from_public_key_bytes(format: AddressFormat, public_key: &[u8]) -> Self {
49        let address = match format {
50            AddressFormat::Bech32(hrp) => bech32::bech32_encode(hrp, public_key),
51            AddressFormat::Eip55 => eip55::eip55_encode(public_key),
52            AddressFormat::Ss58(format) => ss58::ss58_encode(format, public_key),
53        };
54        Self::new(format, address)
55    }
56
57    /// Returns the format of the address.
58    pub fn format(&self) -> AddressFormat {
59        self.format
60    }
61
62    /// Returns the address.
63    pub fn address(&self) -> &str {
64        &self.address
65    }
66}
67
68impl From<Address> for String {
69    fn from(address: Address) -> Self {
70        address.address
71    }
72}
73
74impl PublicKey {
75    /// Returns the address of a public key.
76    pub fn to_address(&self, format: AddressFormat) -> Address {
77        Address::from_public_key_bytes(format, &self.to_bytes())
78    }
79}
80
81impl DerivedPublicKey {
82    /// Returns the address of a public key.
83    pub fn to_address(&self, format: AddressFormat) -> Address {
84        Address::from_public_key_bytes(format, &self.public_key().to_bytes())
85    }
86}