revm_primitives/
hardfork.rs1#![allow(non_camel_case_types)]
2#![allow(missing_docs)]
4
5use core::str::FromStr;
6pub use num_enum::TryFromPrimitive;
7pub use std::string::{String, ToString};
8pub use SpecId::*;
9
10#[repr(u8)]
14#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16pub enum SpecId {
17 FRONTIER = 0,
20 FRONTIER_THAWING,
23 HOMESTEAD,
26 DAO_FORK,
29 TANGERINE,
32 SPURIOUS_DRAGON,
35 BYZANTIUM,
38 CONSTANTINOPLE,
41 PETERSBURG,
44 ISTANBUL,
47 MUIR_GLACIER,
50 BERLIN,
53 LONDON,
56 ARROW_GLACIER,
59 GRAY_GLACIER,
62 MERGE,
65 SHANGHAI,
68 CANCUN,
71 #[default]
74 PRAGUE,
75 OSAKA,
78}
79
80impl SpecId {
81 #[inline]
83 pub fn try_from_u8(spec_id: u8) -> Option<Self> {
84 Self::try_from(spec_id).ok()
85 }
86
87 #[inline]
89 pub const fn is_enabled_in(self, other: Self) -> bool {
90 self as u8 >= other as u8
91 }
92}
93
94pub mod name {
96 pub const FRONTIER: &str = "Frontier";
98 pub const FRONTIER_THAWING: &str = "Frontier Thawing";
100 pub const HOMESTEAD: &str = "Homestead";
102 pub const DAO_FORK: &str = "DAO Fork";
104 pub const TANGERINE: &str = "Tangerine";
106 pub const SPURIOUS_DRAGON: &str = "Spurious";
108 pub const BYZANTIUM: &str = "Byzantium";
110 pub const CONSTANTINOPLE: &str = "Constantinople";
112 pub const PETERSBURG: &str = "Petersburg";
114 pub const ISTANBUL: &str = "Istanbul";
116 pub const MUIR_GLACIER: &str = "MuirGlacier";
118 pub const BERLIN: &str = "Berlin";
120 pub const LONDON: &str = "London";
122 pub const ARROW_GLACIER: &str = "Arrow Glacier";
124 pub const GRAY_GLACIER: &str = "Gray Glacier";
126 pub const MERGE: &str = "Merge";
128 pub const SHANGHAI: &str = "Shanghai";
130 pub const CANCUN: &str = "Cancun";
132 pub const PRAGUE: &str = "Prague";
134 pub const OSAKA: &str = "PragueEOF";
136 pub const LATEST: &str = "Latest";
138}
139
140#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
142pub struct UnknownHardfork;
143
144impl FromStr for SpecId {
145 type Err = UnknownHardfork;
146
147 fn from_str(s: &str) -> Result<Self, Self::Err> {
148 match s {
149 name::FRONTIER => Ok(Self::FRONTIER),
150 name::FRONTIER_THAWING => Ok(Self::FRONTIER_THAWING),
151 name::HOMESTEAD => Ok(Self::HOMESTEAD),
152 name::DAO_FORK => Ok(Self::DAO_FORK),
153 name::TANGERINE => Ok(Self::TANGERINE),
154 name::SPURIOUS_DRAGON => Ok(Self::SPURIOUS_DRAGON),
155 name::BYZANTIUM => Ok(Self::BYZANTIUM),
156 name::CONSTANTINOPLE => Ok(Self::CONSTANTINOPLE),
157 name::PETERSBURG => Ok(Self::PETERSBURG),
158 name::ISTANBUL => Ok(Self::ISTANBUL),
159 name::MUIR_GLACIER => Ok(Self::MUIR_GLACIER),
160 name::BERLIN => Ok(Self::BERLIN),
161 name::LONDON => Ok(Self::LONDON),
162 name::ARROW_GLACIER => Ok(Self::ARROW_GLACIER),
163 name::GRAY_GLACIER => Ok(Self::GRAY_GLACIER),
164 name::MERGE => Ok(Self::MERGE),
165 name::SHANGHAI => Ok(Self::SHANGHAI),
166 name::CANCUN => Ok(Self::CANCUN),
167 name::PRAGUE => Ok(Self::PRAGUE),
168 name::OSAKA => Ok(Self::OSAKA),
169 _ => Err(UnknownHardfork),
170 }
171 }
172}
173
174impl From<SpecId> for &'static str {
175 fn from(spec_id: SpecId) -> Self {
176 match spec_id {
177 SpecId::FRONTIER => name::FRONTIER,
178 SpecId::FRONTIER_THAWING => name::FRONTIER_THAWING,
179 SpecId::HOMESTEAD => name::HOMESTEAD,
180 SpecId::DAO_FORK => name::DAO_FORK,
181 SpecId::TANGERINE => name::TANGERINE,
182 SpecId::SPURIOUS_DRAGON => name::SPURIOUS_DRAGON,
183 SpecId::BYZANTIUM => name::BYZANTIUM,
184 SpecId::CONSTANTINOPLE => name::CONSTANTINOPLE,
185 SpecId::PETERSBURG => name::PETERSBURG,
186 SpecId::ISTANBUL => name::ISTANBUL,
187 SpecId::MUIR_GLACIER => name::MUIR_GLACIER,
188 SpecId::BERLIN => name::BERLIN,
189 SpecId::LONDON => name::LONDON,
190 SpecId::ARROW_GLACIER => name::ARROW_GLACIER,
191 SpecId::GRAY_GLACIER => name::GRAY_GLACIER,
192 SpecId::MERGE => name::MERGE,
193 SpecId::SHANGHAI => name::SHANGHAI,
194 SpecId::CANCUN => name::CANCUN,
195 SpecId::PRAGUE => name::PRAGUE,
196 SpecId::OSAKA => name::OSAKA,
197 }
198 }
199}
200
201impl core::fmt::Display for SpecId {
202 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
203 write!(f, "{}", <&'static str>::from(*self))
204 }
205}