mavryk_smart_rollup_encoding/
smart_rollup.rs

1// SPDX-FileCopyrightText: 2023 TriliTech <contact@trili.tech>
2// SPDX-FileCopyrightText: 2022 Nomadic Labs <contact@nomadic-labs.com>
3// SPDX-FileCopyrightText: 2023 TriliTech <contact@trili.tech>
4//
5// SPDX-License-Identifier: MIT
6
7//! Hash of Layer1 smart rollup addresses.
8
9use 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/// Smart rollup address
19#[derive(Debug, Clone, PartialEq, Eq, HasEncoding, BinWriter, NomReader)]
20pub struct SmartRollupAddress {
21    /// Address hash
22    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    /// Conversion from base58-encoding string (with sr1 prefix).
33    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    /// Conversion to base58-encoding string (with sr1 prefix).
45    pub fn to_b58check(&self) -> String {
46        self.hash.to_base58_check()
47    }
48
49    /// Instantiate new SmartRollupAddress
50    pub fn new(hash: SmartRollupHash) -> Self {
51        Self { hash }
52    }
53
54    /// Returns internal `hash`
55    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}