gmsol_store/states/oracle/
time.rs1use anchor_lang::prelude::*;
2
3use crate::{CoreError, CoreResult};
4
5use super::Oracle;
6
7pub trait ValidateOracleTime {
9 fn oracle_updated_after(&self) -> CoreResult<Option<i64>>;
11
12 fn oracle_updated_before(&self) -> CoreResult<Option<i64>>;
14
15 fn oracle_updated_after_slot(&self) -> CoreResult<Option<u64>>;
17}
18
19pub trait ValidateOracleTimeExt: ValidateOracleTime {
21 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 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 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 {}