From b8f0b5d67e3e9f25b024667e6024ce98aeb907ba Mon Sep 17 00:00:00 2001 From: gustavo <1gusredo@gmail.com> Date: Thu, 4 Dec 2025 15:43:42 +0000 Subject: [PATCH] fix(rpc): improve/preserve error messages for TransactionConversionError (#20057) --- crates/rpc/rpc-convert/src/transaction.rs | 15 ++++++++++----- crates/rpc/rpc-eth-api/src/helpers/transaction.rs | 6 ++++-- crates/rpc/rpc-eth-types/src/error/mod.rs | 12 +++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/crates/rpc/rpc-convert/src/transaction.rs b/crates/rpc/rpc-convert/src/transaction.rs index f07d96aeb5..1036e15199 100644 --- a/crates/rpc/rpc-convert/src/transaction.rs +++ b/crates/rpc/rpc-convert/src/transaction.rs @@ -16,7 +16,6 @@ use reth_primitives_traits::{ TxTy, }; use std::{convert::Infallible, error::Error, fmt::Debug, marker::PhantomData}; -use thiserror::Error; /// Input for [`RpcConvert::convert_receipts`]. #[derive(Debug, Clone)] @@ -484,10 +483,16 @@ where } /// Conversion into transaction RPC response failed. -#[derive(Debug, Clone, Error)] -#[error("Failed to convert transaction into RPC response: {0}")] -pub struct TransactionConversionError(String); +#[derive(Debug, thiserror::Error)] +pub enum TransactionConversionError { + /// Required fields are missing from the transaction request. + #[error("Failed to convert transaction into RPC response: {0}")] + FromTxReq(String), + /// Other conversion errors. + #[error("{0}")] + Other(String), +} /// Generic RPC response object converter for `Evm` and network `Network`. /// /// The main purpose of this struct is to provide an implementation of [`RpcConvert`] for generic @@ -826,7 +831,7 @@ where Ok(self .sim_tx_converter .convert_sim_tx(request) - .map_err(|e| TransactionConversionError(e.to_string()))?) + .map_err(|e| TransactionConversionError::FromTxReq(e.to_string()))?) } fn tx_env( diff --git a/crates/rpc/rpc-eth-api/src/helpers/transaction.rs b/crates/rpc/rpc-eth-api/src/helpers/transaction.rs index 6bff6c42e9..4256a55230 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/transaction.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/transaction.rs @@ -20,7 +20,7 @@ use futures::{Future, StreamExt}; use reth_chain_state::CanonStateSubscriptions; use reth_node_api::BlockBody; use reth_primitives_traits::{Recovered, RecoveredBlock, SignedTransaction, TxTy, WithEncoded}; -use reth_rpc_convert::{transaction::RpcConvert, RpcTxReq}; +use reth_rpc_convert::{transaction::RpcConvert, RpcTxReq, TransactionConversionError}; use reth_rpc_eth_types::{ utils::{binary_search, recover_raw_transaction}, EthApiError::{self, TransactionConfirmationTimeout}, @@ -433,7 +433,9 @@ pub trait EthTransactions: LoadTransaction { <::Pool as TransactionPool>::Transaction::try_from_consensus( transaction, ) - .map_err(|_| EthApiError::TransactionConversionError)?; + .map_err(|e| { + Self::Error::from_eth_err(TransactionConversionError::Other(e.to_string())) + })?; // submit the transaction to the pool with a `Local` origin let AddedTransactionOutcome { hash, .. } = self diff --git a/crates/rpc/rpc-eth-types/src/error/mod.rs b/crates/rpc/rpc-eth-types/src/error/mod.rs index 641bfbc84f..dd0fcd8647 100644 --- a/crates/rpc/rpc-eth-types/src/error/mod.rs +++ b/crates/rpc/rpc-eth-types/src/error/mod.rs @@ -164,8 +164,8 @@ pub enum EthApiError { #[error("Invalid bytecode: {0}")] InvalidBytecode(String), /// Error encountered when converting a transaction type - #[error("Transaction conversion error")] - TransactionConversionError, + #[error(transparent)] + TransactionConversionError(#[from] TransactionConversionError), /// Error thrown when tracing with a muxTracer fails #[error(transparent)] MuxTracerError(#[from] MuxError), @@ -273,7 +273,7 @@ impl From for jsonrpsee_types::error::ErrorObject<'static> { EthApiError::Signing(_) | EthApiError::BothStateAndStateDiffInOverride(_) | EthApiError::InvalidTracerConfig | - EthApiError::TransactionConversionError | + EthApiError::TransactionConversionError(_) | EthApiError::InvalidRewardPercentiles | EthApiError::InvalidBytecode(_) => invalid_params_rpc_err(error.to_string()), EthApiError::InvalidTransaction(err) => err.into(), @@ -336,12 +336,6 @@ impl From for jsonrpsee_types::error::ErrorObject<'static> { } } -impl From for EthApiError { - fn from(_: TransactionConversionError) -> Self { - Self::TransactionConversionError - } -} - impl From> for EthApiError where E: Into,