templar_proxy_oracle_kernel/proxy/circuit_breaker/rule/
cumulative_change.rs1#[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}