templar_proxy_oracle_kernel/proxy/circuit_breaker/rule/
cumulative_change.rs

1#[cfg(feature = "schemars")]
2use alloc::borrow::ToOwned;
3#[cfg(any(feature = "borsh", feature = "schemars"))]
4use alloc::string::ToString;
5use templar_primitives::Decimal;
6
7use crate::{
8    proxy::circuit_breaker::{
9        math::relative_abs_change_exceeds, CircuitBreakerRule, Observation, RingBuffer,
10    },
11    Price,
12};
13
14serialize! {
15    #[derive(Debug, Clone, PartialEq, Eq)]
16    pub struct CumulativeChange {
17        pub baseline: Price,
18        pub max_relative_change: Decimal,
19    }
20}
21
22impl CircuitBreakerRule for CumulativeChange {
23    fn should_trip(&self, history: &RingBuffer<Observation>) -> bool {
24        history.last().is_some_and(|observation| {
25            relative_abs_change_exceeds(
26                &self.baseline,
27                &observation.price,
28                self.max_relative_change,
29            )
30        })
31    }
32}