tempo_chainspec/
hardfork.rs1use alloy_hardforks::hardfork;
34use reth_chainspec::{EthereumHardforks, ForkCondition};
35use reth_ethereum::evm::revm::primitives::hardfork::SpecId;
36
37hardfork!(
38 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
40 #[derive(Default)]
41 TempoHardfork {
42 Adagio,
44 Moderato,
46 #[default]
48 Allegretto,
49 AllegroModerato,
51 }
52);
53
54impl TempoHardfork {
55 #[inline]
57 pub fn is_moderato(self) -> bool {
58 self >= Self::Moderato
59 }
60
61 pub fn is_allegretto(self) -> bool {
63 self >= Self::Allegretto
64 }
65
66 pub fn is_allegro_moderato(self) -> bool {
68 self >= Self::AllegroModerato
69 }
70}
71
72pub trait TempoHardforks: EthereumHardforks {
74 fn tempo_fork_activation(&self, fork: TempoHardfork) -> ForkCondition;
76
77 fn is_adagio_active_at_timestamp(&self, timestamp: u64) -> bool {
79 self.tempo_fork_activation(TempoHardfork::Adagio)
80 .active_at_timestamp(timestamp)
81 }
82
83 fn is_moderato_active_at_timestamp(&self, timestamp: u64) -> bool {
85 self.tempo_fork_activation(TempoHardfork::Moderato)
86 .active_at_timestamp(timestamp)
87 }
88
89 fn is_allegretto_active_at_timestamp(&self, timestamp: u64) -> bool {
91 self.tempo_fork_activation(TempoHardfork::Allegretto)
92 .active_at_timestamp(timestamp)
93 }
94
95 fn is_allegro_moderato_active_at_timestamp(&self, timestamp: u64) -> bool {
97 self.tempo_fork_activation(TempoHardfork::AllegroModerato)
98 .active_at_timestamp(timestamp)
99 }
100
101 fn tempo_hardfork_at(&self, timestamp: u64) -> TempoHardfork {
103 if self.is_allegro_moderato_active_at_timestamp(timestamp) {
104 TempoHardfork::AllegroModerato
105 } else if self.is_allegretto_active_at_timestamp(timestamp) {
106 TempoHardfork::Allegretto
107 } else if self.is_moderato_active_at_timestamp(timestamp) {
108 TempoHardfork::Moderato
109 } else {
110 TempoHardfork::Adagio
111 }
112 }
113}
114
115impl From<TempoHardfork> for SpecId {
116 fn from(value: TempoHardfork) -> Self {
117 match value {
118 TempoHardfork::Adagio => Self::OSAKA,
119 TempoHardfork::Moderato => Self::OSAKA,
120 TempoHardfork::Allegretto => Self::OSAKA,
121 TempoHardfork::AllegroModerato => Self::OSAKA,
122 }
123 }
124}
125
126impl From<SpecId> for TempoHardfork {
127 fn from(spec: SpecId) -> Self {
133 if spec.is_enabled_in(SpecId::from(Self::AllegroModerato)) {
134 Self::AllegroModerato
135 } else if spec.is_enabled_in(SpecId::from(Self::Allegretto)) {
136 Self::Allegretto
137 } else if spec.is_enabled_in(SpecId::from(Self::Moderato)) {
138 Self::Moderato
139 } else {
140 Self::Adagio
141 }
142 }
143}
144
145#[cfg(test)]
146mod tests {
147 use super::*;
148 use reth_chainspec::Hardfork;
149
150 #[test]
151 fn test_adagio_hardfork_name() {
152 let fork = TempoHardfork::Adagio;
153 assert_eq!(fork.name(), "Adagio");
154 }
155
156 #[test]
157 fn test_hardfork_trait_implementation() {
158 let fork = TempoHardfork::Adagio;
159 let _name: &str = Hardfork::name(&fork);
161 }
162
163 #[test]
164 #[cfg(feature = "serde")]
165 fn test_tempo_hardfork_serde() {
166 let fork = TempoHardfork::Adagio;
167
168 let json = serde_json::to_string(&fork).unwrap();
170 assert_eq!(json, "\"Adagio\"");
171
172 let deserialized: TempoHardfork = serde_json::from_str(&json).unwrap();
174 assert_eq!(deserialized, fork);
175 }
176
177 #[test]
178 fn test_is_moderato() {
179 assert!(!TempoHardfork::Adagio.is_moderato());
180 assert!(TempoHardfork::Moderato.is_moderato());
181 assert!(TempoHardfork::Allegretto.is_moderato());
182 assert!(TempoHardfork::AllegroModerato.is_moderato());
183 }
184
185 #[test]
186 fn test_is_allegretto() {
187 assert!(!TempoHardfork::Adagio.is_allegretto());
188 assert!(!TempoHardfork::Moderato.is_allegretto());
189
190 assert!(TempoHardfork::Allegretto.is_allegretto());
191 assert!(TempoHardfork::AllegroModerato.is_allegretto());
192
193 assert!(TempoHardfork::Allegretto.is_moderato());
194 }
195
196 #[test]
197 fn test_is_allegro_moderato() {
198 assert!(!TempoHardfork::Adagio.is_allegro_moderato());
199 assert!(!TempoHardfork::Moderato.is_allegro_moderato());
200 assert!(!TempoHardfork::Allegretto.is_allegro_moderato());
201
202 assert!(TempoHardfork::AllegroModerato.is_allegro_moderato());
203
204 assert!(TempoHardfork::AllegroModerato.is_allegretto());
205 assert!(TempoHardfork::AllegroModerato.is_moderato());
206 }
207}