tezos_smart_rollup_host/
metadata.rs

1// SPDX-FileCopyrightText: 2023 TriliTech <contact@trili.tech>
2// SPDX-FileCopyrightText: 2023 Marigold <contact@marigold.dev>
3//
4// SPDX-License-Identifier: MIT
5
6//! Rollup Metadata: `sr1..` address & origination level.
7#[cfg(feature = "crypto")]
8use tezos_crypto_rs::hash::SmartRollupHash;
9
10/// Size of raw rollup address - [`SmartRollupHash`].
11pub const RAW_ROLLUP_ADDRESS_SIZE: usize = 20;
12
13/// Size of raw metadata: 20 (rollup address) + 4 (origination level).
14pub const METADATA_SIZE: usize = RAW_ROLLUP_ADDRESS_SIZE + core::mem::size_of::<i32>();
15
16/// Type returned from [`reveal_metadata`].
17///
18/// The raw structure is 24 bytes (20-byte rollup address followed
19/// by 4-byte origination level (i32 big-endian) )
20///
21/// [`reveal_metadata`]: tezos_smart_rollup_host::runtime::Runtime::reveal_metadata.
22#[derive(Clone, Debug, PartialEq, Eq)]
23pub struct RollupMetadata {
24    /// Rollup address
25    pub raw_rollup_address: [u8; RAW_ROLLUP_ADDRESS_SIZE],
26    /// Origination level
27    pub origination_level: u32,
28}
29
30impl RollupMetadata {
31    /// The address of the smart rollup.
32    #[cfg(feature = "crypto")]
33    pub fn address(&self) -> SmartRollupHash {
34        SmartRollupHash(self.raw_rollup_address.to_vec())
35    }
36}
37
38impl From<[u8; METADATA_SIZE]> for RollupMetadata {
39    fn from(value: [u8; METADATA_SIZE]) -> Self {
40        let (address, origination_level) = value.split_at(20);
41        let rollup_address: [u8; RAW_ROLLUP_ADDRESS_SIZE] = address.try_into().unwrap();
42        let origination_level: [u8; core::mem::size_of::<i32>()] =
43            origination_level.try_into().unwrap();
44        // Origination level is guaranteed to be positive
45        let origination_level = i32::from_be_bytes(origination_level) as u32;
46        RollupMetadata {
47            raw_rollup_address: rollup_address,
48            origination_level,
49        }
50    }
51}
52
53impl From<RollupMetadata> for [u8; METADATA_SIZE] {
54    fn from(value: RollupMetadata) -> [u8; METADATA_SIZE] {
55        let mut data = [0; METADATA_SIZE];
56        data[..20].copy_from_slice(&value.raw_rollup_address);
57        data[20..METADATA_SIZE]
58            .copy_from_slice(&i32::to_be_bytes(value.origination_level as i32));
59        data
60    }
61}