diff --git a/bitcoin/src/pow.rs b/bitcoin/src/pow.rs index 7feb8f3fca..e0e2375f3f 100644 --- a/bitcoin/src/pow.rs +++ b/bitcoin/src/pow.rs @@ -234,6 +234,34 @@ impl Target { /// [`difficulty`]: Target::difficulty #[cfg_attr(all(test, mutate), mutate)] pub fn difficulty_float(&self) -> f64 { TARGET_MAX_F64 / self.0.to_f64() } + + /// Computes the minimum valid [`Target`] threshold allowed for a block in which a difficulty + /// adjustment occurs. Note that the result is bounded by [`Target::MAX`]. + /// + /// The difficulty can only decrease or increase by a factor of 4 max on each difficulty + /// adjustment period. + pub fn min_difficulty_transition_threshold(&self) -> Self { + let min = Self(self.0 >> 2); + if min > Self::MAX { + Self::MAX + } else { + min + } + } + + /// Computes the maximum valid [`Target`] threshold allowed for a block in which a difficulty + /// adjustment occurs. Note that the result is bounded by [`Target::MAX`]. + /// + /// The difficulty can only decrease or increase by a factor of 4 max on each difficulty + /// adjustment period. + pub fn max_difficulty_transition_threshold(&self) -> Self { + let max = Self(self.0 << 2); + if max > Self::MAX { + Self::MAX + } else { + max + } + } } do_impl!(Target);