use radix_engine_interface::blueprints::consensus_manager::{
ConsensusManagerCompareCurrentTimeInputV2, ConsensusManagerGetCurrentTimeInputV2,
TimePrecision, CONSENSUS_MANAGER_COMPARE_CURRENT_TIME_IDENT,
CONSENSUS_MANAGER_GET_CURRENT_TIME_IDENT,
};
use radix_engine_interface::constants::CONSENSUS_MANAGER;
use radix_engine_interface::data::scrypto::{scrypto_decode, scrypto_encode};
use radix_engine_interface::time::*;
use sbor::rust::fmt::Debug;
use scrypto::engine::scrypto_env::ScryptoVmV1Api;
#[derive(Debug)]
pub struct Clock {}
impl Clock {
pub fn current_time_rounded_to_seconds() -> Instant {
Self::current_time(TimePrecision::Second)
}
pub fn current_time_rounded_to_minutes() -> Instant {
Self::current_time(TimePrecision::Minute)
}
pub fn current_time(precision: TimePrecision) -> Instant {
let rtn = ScryptoVmV1Api::object_call(
CONSENSUS_MANAGER.as_node_id(),
CONSENSUS_MANAGER_GET_CURRENT_TIME_IDENT,
scrypto_encode(&ConsensusManagerGetCurrentTimeInputV2 { precision }).unwrap(),
);
scrypto_decode(&rtn).unwrap()
}
pub fn current_time_is_strictly_before(instant: Instant, precision: TimePrecision) -> bool {
Self::current_time_comparison(instant, precision, TimeComparisonOperator::Lt)
}
pub fn current_time_is_at_or_before(instant: Instant, precision: TimePrecision) -> bool {
Self::current_time_comparison(instant, precision, TimeComparisonOperator::Lte)
}
pub fn current_time_is_strictly_after(instant: Instant, precision: TimePrecision) -> bool {
Self::current_time_comparison(instant, precision, TimeComparisonOperator::Gt)
}
pub fn current_time_is_at_or_after(instant: Instant, precision: TimePrecision) -> bool {
Self::current_time_comparison(instant, precision, TimeComparisonOperator::Gte)
}
pub fn current_time_comparison(
instant: Instant,
precision: TimePrecision,
operator: TimeComparisonOperator,
) -> bool {
let rtn = ScryptoVmV1Api::object_call(
CONSENSUS_MANAGER.as_node_id(),
CONSENSUS_MANAGER_COMPARE_CURRENT_TIME_IDENT,
scrypto_encode(&ConsensusManagerCompareCurrentTimeInputV2 {
instant,
precision,
operator,
})
.unwrap(),
);
scrypto_decode(&rtn).unwrap()
}
}