zksync_error/
identifier.rs1use crate::error::domains::AnvilZksyncCode;
5use crate::error::domains::CompilerCode;
6use crate::error::domains::CoreCode;
7use crate::error::domains::FoundryCode;
8use crate::error::domains::HardhatCode;
9use crate::error::NamedError;
10use crate::kind::DomainCode;
11use crate::kind::Kind;
12#[derive(Clone, Debug, Eq, PartialEq, serde :: Deserialize, serde :: Serialize)]
13pub struct StructuredErrorCode {
14 pub domain_code: u32,
15 pub component_code: u32,
16 pub error_code: u32,
17}
18impl StructuredErrorCode {
19 pub fn encode(&self) -> u32 {
20 self.domain_code * 10000 + self.component_code * 1000 + self.error_code
21 }
22 pub fn decode(raw_code: u32) -> Self {
23 let error_code = raw_code % 1000;
24 let component_code = (raw_code / 1000) % 10;
25 let domain_code = (raw_code / 10000) % 10;
26 StructuredErrorCode {
27 domain_code,
28 component_code,
29 error_code,
30 }
31 }
32}
33#[derive(Clone, Debug, Eq, PartialEq, serde :: Deserialize, serde :: Serialize)]
34pub struct Identifier {
35 pub kind: Kind,
36 pub code: u32,
37}
38impl Identifier {
39 pub fn new(kind: Kind, code: u32) -> Self {
40 Self { kind, code }
41 }
42 pub fn encode(&self) -> u32 {
43 let domain_code: u32 = self.kind.domain_code();
44 let component_code: u32 = self.kind.component_code();
45 domain_code * 10000 + component_code * 1000 + self.code
46 }
47 pub fn decode(code: StructuredErrorCode) -> Option<Self> {
48 let StructuredErrorCode {
49 domain_code,
50 component_code,
51 error_code,
52 } = code;
53 let domain = DomainCode::from_repr(domain_code)?;
54 let kind: Kind = match domain {
55 DomainCode::AnvilZksync => {
56 Kind::AnvilZksync(AnvilZksyncCode::from_repr(component_code)?)
57 }
58 DomainCode::Compiler => Kind::Compiler(CompilerCode::from_repr(component_code)?),
59 DomainCode::Core => Kind::Core(CoreCode::from_repr(component_code)?),
60 DomainCode::Foundry => Kind::Foundry(FoundryCode::from_repr(component_code)?),
61 DomainCode::Hardhat => Kind::Hardhat(HardhatCode::from_repr(component_code)?),
62 };
63 Some(Identifier {
64 kind,
65 code: error_code,
66 })
67 }
68}
69pub trait Identifying {
70 fn get_identifier_repr(&self) -> String;
71}
72impl Identifying for Identifier {
73 fn get_identifier_repr(&self) -> String {
74 format!("[{}-{}]", self.kind.get_identifier_repr(), self.code)
75 }
76}
77impl Identifying for Kind {
78 fn get_identifier_repr(&self) -> String {
79 match self {
80 Kind::AnvilZksync(AnvilZksyncCode::AnvilEnvironment) => "anvil_zksync-env",
81 Kind::AnvilZksync(AnvilZksyncCode::AnvilGeneric) => "anvil_zksync-gen",
82 Kind::AnvilZksync(AnvilZksyncCode::AnvilNode) => "anvil_zksync-node",
83 Kind::AnvilZksync(AnvilZksyncCode::GasEstimation) => "anvil_zksync-gas_estim",
84 Kind::AnvilZksync(AnvilZksyncCode::Halt) => "anvil_zksync-halt",
85 Kind::AnvilZksync(AnvilZksyncCode::Revert) => "anvil_zksync-revert",
86 Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => "anvil_zksync-state",
87 Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => "anvil_zksync-tx_invalid",
88 Kind::Compiler(CompilerCode::LLVM_EVM) => "compiler-llvm+evm",
89 Kind::Compiler(CompilerCode::LLVM_Era) => "compiler-llvm+era",
90 Kind::Compiler(CompilerCode::Solc) => "compiler-solc",
91 Kind::Compiler(CompilerCode::SolcFork) => "compiler-solc+fork",
92 Kind::Compiler(CompilerCode::Zksolc) => "compiler-zksolc",
93 Kind::Compiler(CompilerCode::Zkvyper) => "compiler-zkvyper",
94 Kind::Core(CoreCode::API) => "core-api",
95 Kind::Core(CoreCode::EraVM) => "core-eravm",
96 Kind::Core(CoreCode::ExecutionPlatform) => "core-exec",
97 Kind::Core(CoreCode::Sequencer) => "core-seq",
98 Kind::Foundry(FoundryCode::FoundryUpstream) => "foundry-upstream",
99 Kind::Foundry(FoundryCode::FoundryZksync) => "foundry-zksync",
100 Kind::Hardhat(HardhatCode::HardhatUpstream) => "hardhat-upstream",
101 Kind::Hardhat(HardhatCode::HardhatZksync) => "hardhat-zksync",
102 }
103 .into()
104 }
105}
106impl NamedError for Identifier {
107 fn get_error_name(&self) -> String {
108 match self.kind {
109 Kind::AnvilZksync(AnvilZksyncCode::AnvilEnvironment) => {
110 crate::error::definitions::AnvilEnvironmentCode::from_repr(self.code)
111 .expect("Internal error")
112 .get_error_name()
113 }
114 Kind::AnvilZksync(AnvilZksyncCode::AnvilGeneric) => {
115 crate::error::definitions::AnvilGenericCode::from_repr(self.code)
116 .expect("Internal error")
117 .get_error_name()
118 }
119 Kind::AnvilZksync(AnvilZksyncCode::AnvilNode) => {
120 crate::error::definitions::AnvilNodeCode::from_repr(self.code)
121 .expect("Internal error")
122 .get_error_name()
123 }
124 Kind::AnvilZksync(AnvilZksyncCode::GasEstimation) => {
125 crate::error::definitions::GasEstimationCode::from_repr(self.code)
126 .expect("Internal error")
127 .get_error_name()
128 }
129 Kind::AnvilZksync(AnvilZksyncCode::Halt) => {
130 crate::error::definitions::HaltCode::from_repr(self.code)
131 .expect("Internal error")
132 .get_error_name()
133 }
134 Kind::AnvilZksync(AnvilZksyncCode::Revert) => {
135 crate::error::definitions::RevertCode::from_repr(self.code)
136 .expect("Internal error")
137 .get_error_name()
138 }
139 Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => {
140 crate::error::definitions::StateLoaderCode::from_repr(self.code)
141 .expect("Internal error")
142 .get_error_name()
143 }
144 Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => {
145 crate::error::definitions::TransactionValidationCode::from_repr(self.code)
146 .expect("Internal error")
147 .get_error_name()
148 }
149 Kind::Compiler(CompilerCode::LLVM_EVM) => {
150 crate::error::definitions::LLVM_EVMCode::from_repr(self.code)
151 .expect("Internal error")
152 .get_error_name()
153 }
154 Kind::Compiler(CompilerCode::LLVM_Era) => {
155 crate::error::definitions::LLVM_EraCode::from_repr(self.code)
156 .expect("Internal error")
157 .get_error_name()
158 }
159 Kind::Compiler(CompilerCode::Solc) => {
160 crate::error::definitions::SolcCode::from_repr(self.code)
161 .expect("Internal error")
162 .get_error_name()
163 }
164 Kind::Compiler(CompilerCode::SolcFork) => {
165 crate::error::definitions::SolcForkCode::from_repr(self.code)
166 .expect("Internal error")
167 .get_error_name()
168 }
169 Kind::Compiler(CompilerCode::Zksolc) => {
170 crate::error::definitions::ZksolcCode::from_repr(self.code)
171 .expect("Internal error")
172 .get_error_name()
173 }
174 Kind::Compiler(CompilerCode::Zkvyper) => {
175 crate::error::definitions::ZkvyperCode::from_repr(self.code)
176 .expect("Internal error")
177 .get_error_name()
178 }
179 Kind::Core(CoreCode::API) => crate::error::definitions::APICode::from_repr(self.code)
180 .expect("Internal error")
181 .get_error_name(),
182 Kind::Core(CoreCode::EraVM) => {
183 crate::error::definitions::EraVMCode::from_repr(self.code)
184 .expect("Internal error")
185 .get_error_name()
186 }
187 Kind::Core(CoreCode::ExecutionPlatform) => {
188 crate::error::definitions::ExecutionPlatformCode::from_repr(self.code)
189 .expect("Internal error")
190 .get_error_name()
191 }
192 Kind::Core(CoreCode::Sequencer) => {
193 crate::error::definitions::SequencerCode::from_repr(self.code)
194 .expect("Internal error")
195 .get_error_name()
196 }
197 Kind::Foundry(FoundryCode::FoundryUpstream) => {
198 crate::error::definitions::FoundryUpstreamCode::from_repr(self.code)
199 .expect("Internal error")
200 .get_error_name()
201 }
202 Kind::Foundry(FoundryCode::FoundryZksync) => {
203 crate::error::definitions::FoundryZksyncCode::from_repr(self.code)
204 .expect("Internal error")
205 .get_error_name()
206 }
207 Kind::Hardhat(HardhatCode::HardhatUpstream) => {
208 crate::error::definitions::HardhatUpstreamCode::from_repr(self.code)
209 .expect("Internal error")
210 .get_error_name()
211 }
212 Kind::Hardhat(HardhatCode::HardhatZksync) => {
213 crate::error::definitions::HardhatZksyncCode::from_repr(self.code)
214 .expect("Internal error")
215 .get_error_name()
216 }
217 }
218 }
219}
220impl crate::documentation::Documented for Identifier {
221 type Documentation = &'static zksync_error_description::ErrorDocumentation;
222 fn get_documentation(
223 &self,
224 ) -> Result<Option<Self::Documentation>, crate::documentation::DocumentationError> {
225 use crate::documentation::model;
226 let repr = &self.get_identifier_repr();
227 match model.errors.get(repr) {
228 Some(metadata) => Ok(metadata.documentation.as_ref()),
229 None => Err(crate::documentation::DocumentationError::IncompleteModel(
230 format!("Can not fetch description for error {repr}."),
231 )),
232 }
233 }
234}