huff_neo_utils/
evm_version.rs1use std::cmp::PartialOrd;
2use std::fmt::Display;
3
4pub const EIP170_MAX_CODE_SIZE: usize = 0x6000;
6pub const EIP3860_MAX_INITCODE_SIZE: usize = 2 * EIP170_MAX_CODE_SIZE;
8pub const EIP7954_MAX_CODE_SIZE: usize = 0x10000;
10pub const EIP7954_MAX_INITCODE_SIZE: usize = 2 * EIP7954_MAX_CODE_SIZE;
12
13#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)]
18pub enum SupportedEVMVersions {
19 Paris,
21 Shanghai,
23 Cancun,
31 Prague,
35 #[default]
41 Osaka,
42 Amsterdam,
50}
51
52impl Display for SupportedEVMVersions {
54 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
55 let version_str = match self {
56 SupportedEVMVersions::Shanghai => "shanghai",
57 SupportedEVMVersions::Paris => "paris",
58 SupportedEVMVersions::Cancun => "cancun",
59 SupportedEVMVersions::Prague => "prague",
60 SupportedEVMVersions::Osaka => "osaka",
61 SupportedEVMVersions::Amsterdam => "amsterdam",
62 };
63 write!(f, "{}", version_str)
64 }
65}
66
67#[derive(Debug, Default, Clone, Copy)]
68pub struct EVMVersion {
70 version: SupportedEVMVersions,
71}
72
73impl EVMVersion {
74 pub fn new(version: SupportedEVMVersions) -> Self {
76 Self { version }
77 }
78
79 pub fn version(&self) -> &SupportedEVMVersions {
81 &self.version
82 }
83
84 pub fn has_push0(&self) -> bool {
86 self.version >= SupportedEVMVersions::Shanghai
87 }
88
89 pub fn has_prevrandao(&self) -> bool {
91 self.version >= SupportedEVMVersions::Paris
92 }
93
94 pub fn has_transient_storage(&self) -> bool {
96 self.version >= SupportedEVMVersions::Cancun
97 }
98
99 pub fn has_mcopy(&self) -> bool {
101 self.version >= SupportedEVMVersions::Cancun
102 }
103
104 pub fn has_blob_opcodes(&self) -> bool {
106 self.version >= SupportedEVMVersions::Cancun
107 }
108
109 pub fn has_clz(&self) -> bool {
111 self.version >= SupportedEVMVersions::Osaka
112 }
113
114 pub fn has_slotnum(&self) -> bool {
116 self.version >= SupportedEVMVersions::Amsterdam
117 }
118
119 pub fn has_stack_immediates(&self) -> bool {
121 self.version >= SupportedEVMVersions::Amsterdam
122 }
123
124 pub fn max_code_size(&self) -> usize {
128 if self.version >= SupportedEVMVersions::Amsterdam { EIP7954_MAX_CODE_SIZE } else { EIP170_MAX_CODE_SIZE }
129 }
130
131 pub fn max_initcode_size(&self) -> usize {
135 if self.version >= SupportedEVMVersions::Amsterdam { EIP7954_MAX_INITCODE_SIZE } else { EIP3860_MAX_INITCODE_SIZE }
136 }
137}
138
139impl From<Option<String>> for EVMVersion {
141 fn from(version: Option<String>) -> Self {
142 match version {
143 Some(version) => Self::from(version),
144 None => Self::default(),
145 }
146 }
147}
148
149impl From<String> for EVMVersion {
151 fn from(version: String) -> Self {
152 match version.as_str() {
153 "shanghai" => Self::new(SupportedEVMVersions::Shanghai),
154 "paris" => Self::new(SupportedEVMVersions::Paris),
155 "cancun" => Self::new(SupportedEVMVersions::Cancun),
156 "prague" => Self::new(SupportedEVMVersions::Prague),
157 "osaka" => Self::new(SupportedEVMVersions::Osaka),
158 "amsterdam" => Self::new(SupportedEVMVersions::Amsterdam),
159 _ => Self::default(),
160 }
161 }
162}
163
164impl Display for EVMVersion {
166 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
167 write!(f, "{}", self.version)
168 }
169}