1#![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 AMSTERDAM,
81}
82
83impl SpecId {
84 #[inline]
86 pub fn try_from_u8(spec_id: u8) -> Option<Self> {
87 Self::try_from(spec_id).ok()
88 }
89
90 #[inline]
92 pub const fn is_enabled_in(self, other: Self) -> bool {
93 self as u8 >= other as u8
94 }
95}
96
97pub mod name {
99 pub const FRONTIER: &str = "Frontier";
101 pub const FRONTIER_THAWING: &str = "Frontier Thawing";
103 pub const HOMESTEAD: &str = "Homestead";
105 pub const DAO_FORK: &str = "DAO Fork";
107 pub const TANGERINE: &str = "Tangerine";
109 pub const SPURIOUS_DRAGON: &str = "Spurious";
111 pub const BYZANTIUM: &str = "Byzantium";
113 pub const CONSTANTINOPLE: &str = "Constantinople";
115 pub const PETERSBURG: &str = "Petersburg";
117 pub const ISTANBUL: &str = "Istanbul";
119 pub const MUIR_GLACIER: &str = "MuirGlacier";
121 pub const BERLIN: &str = "Berlin";
123 pub const LONDON: &str = "London";
125 pub const ARROW_GLACIER: &str = "Arrow Glacier";
127 pub const GRAY_GLACIER: &str = "Gray Glacier";
129 pub const MERGE: &str = "Merge";
131 pub const SHANGHAI: &str = "Shanghai";
133 pub const CANCUN: &str = "Cancun";
135 pub const PRAGUE: &str = "Prague";
137 pub const OSAKA: &str = "Osaka";
139 pub const AMSTERDAM: &str = "Amsterdam";
141 pub const LATEST: &str = "Latest";
143}
144
145#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
147pub struct UnknownHardfork;
148
149impl FromStr for SpecId {
150 type Err = UnknownHardfork;
151
152 fn from_str(s: &str) -> Result<Self, Self::Err> {
153 match s {
154 name::FRONTIER => Ok(Self::FRONTIER),
155 name::FRONTIER_THAWING => Ok(Self::FRONTIER_THAWING),
156 name::HOMESTEAD => Ok(Self::HOMESTEAD),
157 name::DAO_FORK => Ok(Self::DAO_FORK),
158 name::TANGERINE => Ok(Self::TANGERINE),
159 name::SPURIOUS_DRAGON => Ok(Self::SPURIOUS_DRAGON),
160 name::BYZANTIUM => Ok(Self::BYZANTIUM),
161 name::CONSTANTINOPLE => Ok(Self::CONSTANTINOPLE),
162 name::PETERSBURG => Ok(Self::PETERSBURG),
163 name::ISTANBUL => Ok(Self::ISTANBUL),
164 name::MUIR_GLACIER => Ok(Self::MUIR_GLACIER),
165 name::BERLIN => Ok(Self::BERLIN),
166 name::LONDON => Ok(Self::LONDON),
167 name::ARROW_GLACIER => Ok(Self::ARROW_GLACIER),
168 name::GRAY_GLACIER => Ok(Self::GRAY_GLACIER),
169 name::MERGE => Ok(Self::MERGE),
170 name::SHANGHAI => Ok(Self::SHANGHAI),
171 name::CANCUN => Ok(Self::CANCUN),
172 name::PRAGUE => Ok(Self::PRAGUE),
173 name::OSAKA => Ok(Self::OSAKA),
174 name::AMSTERDAM => Ok(Self::AMSTERDAM),
175 _ => Err(UnknownHardfork),
176 }
177 }
178}
179
180impl From<SpecId> for &'static str {
181 fn from(spec_id: SpecId) -> Self {
182 match spec_id {
183 SpecId::FRONTIER => name::FRONTIER,
184 SpecId::FRONTIER_THAWING => name::FRONTIER_THAWING,
185 SpecId::HOMESTEAD => name::HOMESTEAD,
186 SpecId::DAO_FORK => name::DAO_FORK,
187 SpecId::TANGERINE => name::TANGERINE,
188 SpecId::SPURIOUS_DRAGON => name::SPURIOUS_DRAGON,
189 SpecId::BYZANTIUM => name::BYZANTIUM,
190 SpecId::CONSTANTINOPLE => name::CONSTANTINOPLE,
191 SpecId::PETERSBURG => name::PETERSBURG,
192 SpecId::ISTANBUL => name::ISTANBUL,
193 SpecId::MUIR_GLACIER => name::MUIR_GLACIER,
194 SpecId::BERLIN => name::BERLIN,
195 SpecId::LONDON => name::LONDON,
196 SpecId::ARROW_GLACIER => name::ARROW_GLACIER,
197 SpecId::GRAY_GLACIER => name::GRAY_GLACIER,
198 SpecId::MERGE => name::MERGE,
199 SpecId::SHANGHAI => name::SHANGHAI,
200 SpecId::CANCUN => name::CANCUN,
201 SpecId::PRAGUE => name::PRAGUE,
202 SpecId::OSAKA => name::OSAKA,
203 SpecId::AMSTERDAM => name::AMSTERDAM,
204 }
205 }
206}
207
208impl core::fmt::Display for SpecId {
209 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
210 write!(f, "{}", <&'static str>::from(*self))
211 }
212}