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::Halt) => "anvil_zksync-halt",
84 Kind::AnvilZksync(AnvilZksyncCode::Revert) => "anvil_zksync-revert",
85 Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => "anvil_zksync-state",
86 Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => "anvil_zksync-tx_invalid",
87 Kind::Compiler(CompilerCode::LLVM_EVM) => "compiler-llvm+evm",
88 Kind::Compiler(CompilerCode::LLVM_Era) => "compiler-llvm+era",
89 Kind::Compiler(CompilerCode::Solc) => "compiler-solc",
90 Kind::Compiler(CompilerCode::SolcFork) => "compiler-solc+fork",
91 Kind::Compiler(CompilerCode::Zksolc) => "compiler-zksolc",
92 Kind::Compiler(CompilerCode::Zkvyper) => "compiler-zkvyper",
93 Kind::Core(CoreCode::API) => "core-api",
94 Kind::Core(CoreCode::EraVM) => "core-eravm",
95 Kind::Core(CoreCode::ExecutionPlatform) => "core-exec",
96 Kind::Core(CoreCode::Sequencer) => "core-seq",
97 Kind::Foundry(FoundryCode::FoundryUpstream) => "foundry-upstream",
98 Kind::Foundry(FoundryCode::FoundryZksync) => "foundry-zksync",
99 Kind::Hardhat(HardhatCode::HardhatUpstream) => "hardhat-upstream",
100 Kind::Hardhat(HardhatCode::HardhatZksync) => "hardhat-zksync",
101 }
102 .into()
103 }
104}
105impl NamedError for Identifier {
106 fn get_error_name(&self) -> String {
107 match self.kind {
108 Kind::AnvilZksync(AnvilZksyncCode::AnvilEnvironment) => {
109 crate::error::definitions::AnvilEnvironmentCode::from_repr(self.code)
110 .expect("Internal error")
111 .get_error_name()
112 }
113 Kind::AnvilZksync(AnvilZksyncCode::AnvilGeneric) => {
114 crate::error::definitions::AnvilGenericCode::from_repr(self.code)
115 .expect("Internal error")
116 .get_error_name()
117 }
118 Kind::AnvilZksync(AnvilZksyncCode::AnvilNode) => {
119 crate::error::definitions::AnvilNodeCode::from_repr(self.code)
120 .expect("Internal error")
121 .get_error_name()
122 }
123 Kind::AnvilZksync(AnvilZksyncCode::Halt) => {
124 crate::error::definitions::HaltCode::from_repr(self.code)
125 .expect("Internal error")
126 .get_error_name()
127 }
128 Kind::AnvilZksync(AnvilZksyncCode::Revert) => {
129 crate::error::definitions::RevertCode::from_repr(self.code)
130 .expect("Internal error")
131 .get_error_name()
132 }
133 Kind::AnvilZksync(AnvilZksyncCode::StateLoader) => {
134 crate::error::definitions::StateLoaderCode::from_repr(self.code)
135 .expect("Internal error")
136 .get_error_name()
137 }
138 Kind::AnvilZksync(AnvilZksyncCode::TransactionValidation) => {
139 crate::error::definitions::TransactionValidationCode::from_repr(self.code)
140 .expect("Internal error")
141 .get_error_name()
142 }
143 Kind::Compiler(CompilerCode::LLVM_EVM) => {
144 crate::error::definitions::LLVM_EVMCode::from_repr(self.code)
145 .expect("Internal error")
146 .get_error_name()
147 }
148 Kind::Compiler(CompilerCode::LLVM_Era) => {
149 crate::error::definitions::LLVM_EraCode::from_repr(self.code)
150 .expect("Internal error")
151 .get_error_name()
152 }
153 Kind::Compiler(CompilerCode::Solc) => {
154 crate::error::definitions::SolcCode::from_repr(self.code)
155 .expect("Internal error")
156 .get_error_name()
157 }
158 Kind::Compiler(CompilerCode::SolcFork) => {
159 crate::error::definitions::SolcForkCode::from_repr(self.code)
160 .expect("Internal error")
161 .get_error_name()
162 }
163 Kind::Compiler(CompilerCode::Zksolc) => {
164 crate::error::definitions::ZksolcCode::from_repr(self.code)
165 .expect("Internal error")
166 .get_error_name()
167 }
168 Kind::Compiler(CompilerCode::Zkvyper) => {
169 crate::error::definitions::ZkvyperCode::from_repr(self.code)
170 .expect("Internal error")
171 .get_error_name()
172 }
173 Kind::Core(CoreCode::API) => crate::error::definitions::APICode::from_repr(self.code)
174 .expect("Internal error")
175 .get_error_name(),
176 Kind::Core(CoreCode::EraVM) => {
177 crate::error::definitions::EraVMCode::from_repr(self.code)
178 .expect("Internal error")
179 .get_error_name()
180 }
181 Kind::Core(CoreCode::ExecutionPlatform) => {
182 crate::error::definitions::ExecutionPlatformCode::from_repr(self.code)
183 .expect("Internal error")
184 .get_error_name()
185 }
186 Kind::Core(CoreCode::Sequencer) => {
187 crate::error::definitions::SequencerCode::from_repr(self.code)
188 .expect("Internal error")
189 .get_error_name()
190 }
191 Kind::Foundry(FoundryCode::FoundryUpstream) => {
192 crate::error::definitions::FoundryUpstreamCode::from_repr(self.code)
193 .expect("Internal error")
194 .get_error_name()
195 }
196 Kind::Foundry(FoundryCode::FoundryZksync) => {
197 crate::error::definitions::FoundryZksyncCode::from_repr(self.code)
198 .expect("Internal error")
199 .get_error_name()
200 }
201 Kind::Hardhat(HardhatCode::HardhatUpstream) => {
202 crate::error::definitions::HardhatUpstreamCode::from_repr(self.code)
203 .expect("Internal error")
204 .get_error_name()
205 }
206 Kind::Hardhat(HardhatCode::HardhatZksync) => {
207 crate::error::definitions::HardhatZksyncCode::from_repr(self.code)
208 .expect("Internal error")
209 .get_error_name()
210 }
211 }
212 }
213}
214impl crate::documentation::Documented for Identifier {
215 type Documentation = &'static zksync_error_description::ErrorDocumentation;
216 fn get_documentation(
217 &self,
218 ) -> Result<Option<Self::Documentation>, crate::documentation::DocumentationError> {
219 use crate::documentation::model;
220 let repr = &self.get_identifier_repr();
221 match model.errors.get(repr) {
222 Some(metadata) => Ok(metadata.documentation.as_ref()),
223 None => Err(crate::documentation::DocumentationError::IncompleteModel(
224 format!("Can not fetch description for error {repr}."),
225 )),
226 }
227 }
228}