use crate::{env::internal, unwrap::UnwrapInfallible, BytesN, Env, TryIntoVal};
#[derive(Clone)]
pub struct Ledger(Env);
impl Ledger {
#[inline(always)]
pub(crate) fn env(&self) -> &Env {
&self.0
}
#[inline(always)]
pub(crate) fn new(env: &Env) -> Ledger {
Ledger(env.clone())
}
#[deprecated(note = "Protocol version won't be available in the future")]
pub fn protocol_version(&self) -> u32 {
internal::Env::get_ledger_version(self.env())
.unwrap_infallible()
.into()
}
pub fn sequence(&self) -> u32 {
internal::Env::get_ledger_sequence(self.env())
.unwrap_infallible()
.into()
}
#[doc(hidden)]
pub fn max_live_until_ledger(&self) -> u32 {
internal::Env::get_max_live_until_ledger(self.env())
.unwrap_infallible()
.into()
}
pub fn timestamp(&self) -> u64 {
internal::Env::get_ledger_timestamp(self.env())
.unwrap_infallible()
.try_into_val(self.env())
.unwrap()
}
pub fn network_id(&self) -> BytesN<32> {
let env = self.env();
let bin_obj = internal::Env::get_ledger_network_id(env).unwrap_infallible();
unsafe { BytesN::<32>::unchecked_new(env.clone(), bin_obj) }
}
}
#[cfg(any(test, feature = "testutils"))]
use crate::testutils;
#[cfg(any(test, feature = "testutils"))]
#[cfg_attr(feature = "docs", doc(cfg(feature = "testutils")))]
impl testutils::Ledger for Ledger {
fn set(&self, li: testutils::LedgerInfo) {
let env = self.env();
env.host().set_ledger_info(li).unwrap();
}
fn set_protocol_version(&self, protocol_version: u32) {
self.with_mut(|ledger_info| {
ledger_info.protocol_version = protocol_version;
});
}
fn set_sequence_number(&self, sequence_number: u32) {
self.with_mut(|ledger_info| {
ledger_info.sequence_number = sequence_number;
});
}
fn set_timestamp(&self, timestamp: u64) {
self.with_mut(|ledger_info| {
ledger_info.timestamp = timestamp;
});
}
fn set_network_id(&self, network_id: [u8; 32]) {
self.with_mut(|ledger_info| {
ledger_info.network_id = network_id;
});
}
fn set_base_reserve(&self, base_reserve: u32) {
self.with_mut(|ledger_info| {
ledger_info.base_reserve = base_reserve;
});
}
fn set_min_temp_entry_ttl(&self, min_temp_entry_ttl: u32) {
self.with_mut(|ledger_info| {
ledger_info.min_temp_entry_ttl = min_temp_entry_ttl;
});
}
fn set_min_persistent_entry_ttl(&self, min_persistent_entry_ttl: u32) {
self.with_mut(|ledger_info| {
ledger_info.min_persistent_entry_ttl = min_persistent_entry_ttl;
});
}
fn set_max_entry_ttl(&self, max_entry_ttl: u32) {
self.with_mut(|ledger_info| {
ledger_info.max_entry_ttl = max_entry_ttl.saturating_add(1);
});
}
fn get(&self) -> testutils::LedgerInfo {
let env = self.env();
env.host().with_ledger_info(|li| Ok(li.clone())).unwrap()
}
fn with_mut<F>(&self, f: F)
where
F: FnMut(&mut internal::LedgerInfo),
{
let env = self.env();
env.host().with_mut_ledger_info(f).unwrap();
}
}