1use 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#[derive(Debug, thiserror::Error)]
13pub enum Eip155ExactError {
14 #[error(transparent)]
16 Transport(#[from] TransportError),
17 #[error(transparent)]
19 PendingTransaction(#[from] alloy_provider::PendingTransactionError),
20 #[error("Transaction {0} reverted")]
22 TransactionReverted(TxHash),
23 #[error("Contract call failed: {0}")]
25 ContractCall(String),
26 #[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}