Skip to main content

revive_common/
evm_version.rs

1//! The EVM version.
2
3use serde::Deserialize;
4use serde::Serialize;
5
6/// The EVM version.
7#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
8#[serde(rename_all = "camelCase")]
9pub enum EVMVersion {
10    /// The corresponding EVM version.
11    #[serde(rename = "homestead")]
12    Homestead,
13    /// The corresponding EVM version.
14    #[serde(rename = "tangerineWhistle")]
15    TangerineWhistle,
16    /// The corresponding EVM version.
17    #[serde(rename = "spuriousDragon")]
18    SpuriousDragon,
19    /// The corresponding EVM version.
20    #[serde(rename = "byzantium")]
21    Byzantium,
22    /// The corresponding EVM version.
23    #[serde(rename = "constantinople")]
24    Constantinople,
25    /// The corresponding EVM version.
26    #[serde(rename = "petersburg")]
27    Petersburg,
28    /// The corresponding EVM version.
29    #[serde(rename = "istanbul")]
30    Istanbul,
31    /// The corresponding EVM version.
32    #[serde(rename = "berlin")]
33    Berlin,
34    /// The corresponding EVM version.
35    #[serde(rename = "london")]
36    London,
37    /// The corresponding EVM version.
38    #[serde(rename = "paris")]
39    Paris,
40    /// The corresponding EVM version.
41    #[serde(rename = "shanghai")]
42    Shanghai,
43    /// The corresponding EVM version.
44    #[serde(rename = "cancun")]
45    Cancun,
46    /// The corresponding EVM version.
47    #[serde(rename = "prague")]
48    Prague,
49    /// The corresponding EVM version.
50    #[serde(rename = "osaka")]
51    Osaka,
52    /// The corresponding EVM version.
53    #[serde(rename = "amsterdam")]
54    Amsterdam,
55}
56
57impl TryFrom<&str> for EVMVersion {
58    type Error = anyhow::Error;
59
60    fn try_from(value: &str) -> Result<Self, Self::Error> {
61        Ok(match value {
62            "homestead" => Self::Homestead,
63            "tangerineWhistle" => Self::TangerineWhistle,
64            "spuriousDragon" => Self::SpuriousDragon,
65            "byzantium" => Self::Byzantium,
66            "constantinople" => Self::Constantinople,
67            "petersburg" => Self::Petersburg,
68            "istanbul" => Self::Istanbul,
69            "berlin" => Self::Berlin,
70            "london" => Self::London,
71            "paris" => Self::Paris,
72            "shanghai" => Self::Shanghai,
73            "cancun" => Self::Cancun,
74            "prague" => Self::Prague,
75            "osaka" => Self::Osaka,
76            "amsterdam" => Self::Amsterdam,
77            _ => anyhow::bail!("Invalid EVM version: {}", value),
78        })
79    }
80}
81
82impl std::fmt::Display for EVMVersion {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        match self {
85            Self::Homestead => write!(f, "homestead"),
86            Self::TangerineWhistle => write!(f, "tangerineWhistle"),
87            Self::SpuriousDragon => write!(f, "spuriousDragon"),
88            Self::Byzantium => write!(f, "byzantium"),
89            Self::Constantinople => write!(f, "constantinople"),
90            Self::Petersburg => write!(f, "petersburg"),
91            Self::Istanbul => write!(f, "istanbul"),
92            Self::Berlin => write!(f, "berlin"),
93            Self::London => write!(f, "london"),
94            Self::Paris => write!(f, "paris"),
95            Self::Shanghai => write!(f, "shanghai"),
96            Self::Cancun => write!(f, "cancun"),
97            Self::Prague => write!(f, "prague"),
98            Self::Osaka => write!(f, "osaka"),
99            Self::Amsterdam => write!(f, "amsterdam"),
100        }
101    }
102}