rosetta_crypto/address/
mod.rs1use crate::bip32::DerivedPublicKey;
3use crate::PublicKey;
4
5mod bech32;
6mod eip55;
7mod ss58;
8
9pub use ss58::{Ss58AddressFormat, Ss58AddressFormatRegistry};
10
11#[derive(Clone, Copy, Debug, Eq, PartialEq)]
13pub enum AddressFormat {
14 Bech32(&'static str),
16 Eip55,
18 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#[derive(Clone, Debug, Eq, PartialEq)]
36pub struct Address {
37 format: AddressFormat,
38 address: String,
39}
40
41impl Address {
42 pub fn new(format: AddressFormat, address: String) -> Self {
44 Self { format, address }
45 }
46
47 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 pub fn format(&self) -> AddressFormat {
59 self.format
60 }
61
62 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 pub fn to_address(&self, format: AddressFormat) -> Address {
77 Address::from_public_key_bytes(format, &self.to_bytes())
78 }
79}
80
81impl DerivedPublicKey {
82 pub fn to_address(&self, format: AddressFormat) -> Address {
84 Address::from_public_key_bytes(format, &self.public_key().to_bytes())
85 }
86}