From 8e6f953aa72eabbdad53937765e33c52c1a63c8b Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Mon, 1 May 2023 14:50:25 -0700 Subject: [PATCH] Expose valid (min, max) difficulty transition thresholds Once `U256` was made private, we lost the ability to check whether a valid difficulty transition was made in the chain, since `Target` no longer exposes any arithmetic operations. --- bitcoin/src/pow.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bitcoin/src/pow.rs b/bitcoin/src/pow.rs index 7feb8f3f..988a71ea 100644 --- a/bitcoin/src/pow.rs +++ b/bitcoin/src/pow.rs @@ -234,6 +234,20 @@ 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. + /// + /// 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 { Self(self.0 >> 2) } + + /// Computes the maximum valid [`Target`] threshold allowed for a block in which a difficulty + /// adjustment occurs. + /// + /// 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 { Self(self.0 << 2) } } do_impl!(Target);