Skip to main content

r402_evm/
error.rs

1//! Shared EVM facilitator errors (`exact` and `upto`).
2
3use alloy_primitives::TxHash;
4use alloy_transport::TransportError;
5use r402_core::error::FacilitatorError;
6use r402_core::error::VerificationError;
7
8use crate::chain::MetaTransactionSendError;
9use crate::signature::StructuredSignatureFormatError;
10
11/// Errors specific to EIP-155 exact scheme operations.
12#[derive(Debug, thiserror::Error)]
13pub enum Eip155ExactError {
14    /// RPC transport error.
15    #[error(transparent)]
16    Transport(#[from] TransportError),
17    /// Pending transaction error.
18    #[error(transparent)]
19    PendingTransaction(#[from] alloy_provider::PendingTransactionError),
20    /// On-chain transaction was reverted.
21    #[error("Transaction {0} reverted")]
22    TransactionReverted(TxHash),
23    /// Contract call failed.
24    #[error("Contract call failed: {0}")]
25    ContractCall(String),
26    /// Payment verification failed.
27    #[error(transparent)]
28    PaymentVerification(#[from] VerificationError),
29}
30
31impl From<Eip155ExactError> for FacilitatorError {
32    fn from(value: Eip155ExactError) -> Self {
33        match value {
34            Eip155ExactError::Transport(_)
35            | Eip155ExactError::PendingTransaction(_)
36            | Eip155ExactError::TransactionReverted(_)
37            | Eip155ExactError::ContractCall(_) => Self::Onchain(value.to_string()),
38            Eip155ExactError::PaymentVerification(e) => Self::Verification(e),
39        }
40    }
41}
42
43impl From<StructuredSignatureFormatError> for Eip155ExactError {
44    fn from(e: StructuredSignatureFormatError) -> Self {
45        Self::PaymentVerification(VerificationError::InvalidSignature(e.to_string()))
46    }
47}
48
49impl From<MetaTransactionSendError> for Eip155ExactError {
50    fn from(e: MetaTransactionSendError) -> Self {
51        match e {
52            MetaTransactionSendError::Transport(e) => Self::Transport(e),
53            MetaTransactionSendError::PendingTransaction(e) => Self::PendingTransaction(e),
54            MetaTransactionSendError::Custom(e) => Self::ContractCall(e),
55        }
56    }
57}
58
59impl From<alloy_provider::MulticallError> for Eip155ExactError {
60    fn from(e: alloy_provider::MulticallError) -> Self {
61        match e {
62            alloy_provider::MulticallError::ValueTx
63            | alloy_provider::MulticallError::DecodeError(_)
64            | alloy_provider::MulticallError::NoReturnData
65            | alloy_provider::MulticallError::CallFailed(_) => {
66                Self::PaymentVerification(VerificationError::SimulationFailed(e.to_string()))
67            }
68            alloy_provider::MulticallError::TransportError(transport_error) => {
69                Self::Transport(transport_error)
70            }
71        }
72    }
73}
74
75impl From<alloy_contract::Error> for Eip155ExactError {
76    fn from(e: alloy_contract::Error) -> Self {
77        match e {
78            alloy_contract::Error::UnknownFunction(_)
79            | alloy_contract::Error::UnknownSelector(_)
80            | alloy_contract::Error::NotADeploymentTransaction
81            | alloy_contract::Error::ContractNotDeployed
82            | alloy_contract::Error::ZeroData(_, _)
83            | alloy_contract::Error::AbiError(_) => Self::ContractCall(e.to_string()),
84            alloy_contract::Error::TransportError(e) => Self::Transport(e),
85            alloy_contract::Error::PendingTransactionError(e) => Self::PendingTransaction(e),
86        }
87    }
88}