alloy_dyn_abi/ext/error.rs
1use crate::{DynSolError, Specifier};
2use alloc::vec::Vec;
3use alloy_json_abi::Error;
4use alloy_primitives::{keccak256, Selector};
5
6#[allow(unknown_lints, unnameable_types)]
7mod sealed {
8 pub trait Sealed {}
9 impl Sealed for alloy_json_abi::Error {}
10}
11use sealed::Sealed;
12
13impl Specifier<DynSolError> for Error {
14 fn resolve(&self) -> crate::Result<DynSolError> {
15 let signature = self.signature();
16 let selector = Selector::from_slice(&keccak256(signature)[0..4]);
17
18 let mut body = Vec::with_capacity(self.inputs.len());
19 for param in &self.inputs {
20 body.push(param.resolve()?);
21 }
22
23 Ok(DynSolError::new_unchecked(selector, crate::DynSolType::Tuple(body)))
24 }
25}
26
27/// Provides error encoding and decoding for the [`Error`] type.
28pub trait ErrorExt: Sealed {
29 /// Decode the error from the given data.
30 fn decode_error(&self, data: &[u8]) -> crate::Result<crate::DecodedError>;
31}
32
33impl ErrorExt for alloy_json_abi::Error {
34 fn decode_error(&self, data: &[u8]) -> crate::Result<crate::DecodedError> {
35 self.resolve()?.decode_error(data)
36 }
37}