mavryk_smart_rollup_encoding/
smart_rollup.rs1use std::fmt::Display;
10
11use mavryk_data_encoding::enc::BinWriter;
12use mavryk_data_encoding::encoding::HasEncoding;
13use mavryk_data_encoding::nom::NomReader;
14
15use crypto::base58::{FromBase58Check, FromBase58CheckError};
16use crypto::hash::{HashType, SmartRollupHash};
17
18#[derive(Debug, Clone, PartialEq, Eq, HasEncoding, BinWriter, NomReader)]
20pub struct SmartRollupAddress {
21 hash: SmartRollupHash,
23}
24
25impl Display for SmartRollupAddress {
26 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27 write!(f, "{}", self.hash)
28 }
29}
30
31impl SmartRollupAddress {
32 pub fn from_b58check(data: &str) -> Result<Self, FromBase58CheckError> {
34 let bytes = data.from_base58check()?;
35
36 if bytes.starts_with(HashType::SmartRollupHash.base58check_prefix()) {
37 let hash = SmartRollupHash::from_base58_check(data)?;
38 Ok(SmartRollupAddress { hash })
39 } else {
40 Err(FromBase58CheckError::InvalidBase58)
41 }
42 }
43
44 pub fn to_b58check(&self) -> String {
46 self.hash.to_base58_check()
47 }
48
49 pub fn new(hash: SmartRollupHash) -> Self {
51 Self { hash }
52 }
53
54 pub fn hash(&self) -> &SmartRollupHash {
56 &self.hash
57 }
58}
59
60#[cfg(test)]
61mod test {
62 use super::*;
63
64 #[test]
65 fn sr1_b58check() {
66 let sr1 = "sr1UNDWPUYVeomgG15wn5jSw689EJ4RNnVQa";
67
68 let smart_rollup_address = SmartRollupAddress::from_b58check(sr1);
69
70 assert!(smart_rollup_address.is_ok());
71
72 let sr1_from_smart_rollup_address = smart_rollup_address.unwrap().to_b58check();
73
74 assert_eq!(sr1, &sr1_from_smart_rollup_address);
75 }
76
77 #[test]
78 fn sr1_encoding() {
79 let sr1 = "sr1UXY5i5Z1sF8xd8ZUyzur827MAaFWREzvj";
80
81 let smart_rollup_address =
82 SmartRollupAddress::from_b58check(sr1).expect("expected valid sr1 hash");
83
84 let mut bin = Vec::new();
85 smart_rollup_address
86 .bin_write(&mut bin)
87 .expect("serialization should work");
88
89 let (remaining_input, deserde_sr1) = SmartRollupAddress::nom_read(bin.as_slice())
90 .expect("deserialization should work");
91
92 assert!(remaining_input.is_empty());
93 assert_eq!(smart_rollup_address, deserde_sr1);
94 }
95}