soroban_env_host/
ledger_info.rs

1use crate::xdr::{ContractDataDurability, LedgerKey};
2
3#[derive(Debug, Clone, Default, PartialEq, Eq)]
4pub struct LedgerInfo {
5    pub protocol_version: u32,
6    pub sequence_number: u32,
7    pub timestamp: u64,
8    pub network_id: [u8; 32],
9    pub base_reserve: u32,
10    pub min_temp_entry_ttl: u32,
11    pub min_persistent_entry_ttl: u32,
12    pub max_entry_ttl: u32,
13}
14
15impl LedgerInfo {
16    pub fn min_live_until_ledger_checked(&self, durability: ContractDataDurability) -> Option<u32> {
17        let min_live_until = match durability {
18            ContractDataDurability::Temporary => self.min_temp_entry_ttl,
19            ContractDataDurability::Persistent => self.min_persistent_entry_ttl,
20        };
21        self.sequence_number
22            .checked_add(min_live_until.saturating_sub(1))
23    }
24
25    pub fn max_live_until_ledger_checked(&self) -> Option<u32> {
26        self.sequence_number
27            // Entry can live for at most max_entry_live_until ledgers from
28            // now, counting the current one.
29            .checked_add(self.max_entry_ttl.saturating_sub(1))
30    }
31}
32
33pub fn get_key_durability(key: &LedgerKey) -> Option<ContractDataDurability> {
34    match &key {
35        LedgerKey::ContractData(d) => Some(d.durability),
36        LedgerKey::ContractCode(_) => Some(ContractDataDurability::Persistent),
37        _ => None,
38    }
39}