gmsol_store/states/oracle/
time.rs

1use anchor_lang::prelude::*;
2
3use crate::{CoreError, CoreResult};
4
5use super::Oracle;
6
7/// Validate Oracle Time.
8pub trait ValidateOracleTime {
9    /// Oracle must be updated after this time.
10    fn oracle_updated_after(&self) -> CoreResult<Option<i64>>;
11
12    /// Oracle must be updated before this time.
13    fn oracle_updated_before(&self) -> CoreResult<Option<i64>>;
14
15    /// Oracle must be updated after this slot.
16    fn oracle_updated_after_slot(&self) -> CoreResult<Option<u64>>;
17}
18
19/// Extension trait for [`ValidateOracleTime`].
20pub trait ValidateOracleTimeExt: ValidateOracleTime {
21    /// Validate min oracle ts.
22    fn validate_min_oracle_ts(&self, oracle: &Oracle) -> CoreResult<()> {
23        let Some(after) = self.oracle_updated_after()? else {
24            return Ok(());
25        };
26        if oracle.min_oracle_ts < after {
27            msg!("oracle = {}, require >= {}", oracle.min_oracle_ts, after);
28            return Err(CoreError::OracleTimestampsAreSmallerThanRequired);
29        }
30        Ok(())
31    }
32
33    /// Validate max oracle ts.
34    fn validate_max_oracle_ts(&self, oracle: &Oracle) -> CoreResult<()> {
35        let Some(before) = self.oracle_updated_before()? else {
36            return Ok(());
37        };
38        if before < oracle.max_oracle_ts {
39            msg!("oracle = {}, require <= {}", oracle.max_oracle_ts, before);
40            return Err(CoreError::OracleTimestampsAreLargerThanRequired);
41        }
42        Ok(())
43    }
44
45    /// Validate min oracle updated slot.
46    fn validate_min_oracle_slot(&self, oracle: &Oracle) -> CoreResult<()> {
47        let Some(min_slot) = oracle.min_oracle_slot() else {
48            return Err(CoreError::OracleNotUpdated);
49        };
50        let Some(after) = self.oracle_updated_after_slot()? else {
51            return Ok(());
52        };
53        if min_slot < after {
54            msg!("oracle = {}, require >= {}", min_slot, after);
55            return Err(CoreError::InvalidOracleSlot);
56        }
57        Ok(())
58    }
59}
60
61impl<T: ValidateOracleTime> ValidateOracleTimeExt for T {}