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}