use jsonrpsee::{core::RpcResult, proc_macros::rpc}; use reth_primitives::{BlockId, Bytes, B256}; use reth_rpc_types::{ state::StateOverride, trace::{ filter::TraceFilter, opcode::{BlockOpcodeGas, TransactionOpcodeGas}, parity::*, }, BlockOverrides, Index, TransactionRequest, }; use std::collections::HashSet; /// Ethereum trace API #[cfg_attr(not(feature = "client"), rpc(server, namespace = "trace"))] #[cfg_attr(feature = "client", rpc(server, client, namespace = "trace"))] pub trait TraceApi { /// Executes the given call and returns a number of possible traces for it. #[method(name = "call")] async fn trace_call( &self, call: TransactionRequest, trace_types: HashSet, block_id: Option, state_overrides: Option, block_overrides: Option>, ) -> RpcResult; /// Performs multiple call traces on top of the same block. i.e. transaction n will be executed /// on top of a pending block with all n-1 transactions applied (traced) first. Allows to trace /// dependent transactions. #[method(name = "callMany")] async fn trace_call_many( &self, calls: Vec<(TransactionRequest, HashSet)>, block_id: Option, ) -> RpcResult>; /// Traces a call to `eth_sendRawTransaction` without making the call, returning the traces. /// /// Expects a raw transaction data #[method(name = "rawTransaction")] async fn trace_raw_transaction( &self, data: Bytes, trace_types: HashSet, block_id: Option, ) -> RpcResult; /// Replays all transactions in a block returning the requested traces for each transaction. #[method(name = "replayBlockTransactions")] async fn replay_block_transactions( &self, block_id: BlockId, trace_types: HashSet, ) -> RpcResult>>; /// Replays a transaction, returning the traces. #[method(name = "replayTransaction")] async fn replay_transaction( &self, transaction: B256, trace_types: HashSet, ) -> RpcResult; /// Returns traces created at given block. #[method(name = "block")] async fn trace_block( &self, block_id: BlockId, ) -> RpcResult>>; /// Returns traces matching given filter. /// /// This is similar to `eth_getLogs` but for traces. #[method(name = "filter")] async fn trace_filter(&self, filter: TraceFilter) -> RpcResult>; /// Returns transaction trace at given index. /// /// `indices` represent the index positions of the traces. /// /// Note: This expects a list of indices but only one is supported since this function returns a /// single [LocalizedTransactionTrace]. #[method(name = "get")] async fn trace_get( &self, hash: B256, indices: Vec, ) -> RpcResult>; /// Returns all traces of given transaction. #[method(name = "transaction")] async fn trace_transaction( &self, hash: B256, ) -> RpcResult>>; /// Returns all opcodes with their count and combined gas usage for the given transaction in no /// particular order. #[method(name = "transactionOpcodeGas")] async fn trace_transaction_opcode_gas( &self, tx_hash: B256, ) -> RpcResult>; /// Returns the opcodes of all transactions in the given block. /// /// This is the same as `trace_transactionOpcodeGas` but for all transactions in a block. #[method(name = "blockOpcodeGas")] async fn trace_block_opcode_gas(&self, block_id: BlockId) -> RpcResult>; }