client/rpc/impls/cfx/
trace.rs

1// Copyright 2020 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4
5use crate::{
6    common::delegate_convert::into_jsonrpc_result,
7    rpc::{
8        traits::trace::Trace,
9        types::{
10            EpochNumber as RpcEpochNumber, LocalizedBlockTrace, LocalizedTrace,
11            TraceFilter as RpcTraceFilter,
12        },
13    },
14};
15use cfx_addr::Network;
16use cfx_rpc_cfx_impl::TraceHandler as CfxTraceHandler;
17use cfx_rpc_eth_types::trace::EpochTrace;
18use cfx_rpc_utils::error::jsonrpc_error_helpers::error_object_owned_to_jsonrpc_error;
19use cfx_types::H256;
20
21use cfxcore::SharedConsensusGraph;
22use jsonrpc_core::Result as JsonRpcResult;
23
24#[derive(Clone)]
25pub struct TraceHandler {
26    pub(crate) inner: CfxTraceHandler,
27}
28
29impl TraceHandler {
30    pub fn new(network: Network, consensus: SharedConsensusGraph) -> Self {
31        TraceHandler {
32            inner: CfxTraceHandler::new(network, consensus),
33        }
34    }
35}
36
37impl Trace for TraceHandler {
38    fn block_traces(
39        &self, block_hash: H256,
40    ) -> JsonRpcResult<Option<LocalizedBlockTrace>> {
41        into_jsonrpc_result(self.inner.block_traces_impl(block_hash))
42    }
43
44    fn filter_traces(
45        &self, filter: RpcTraceFilter,
46    ) -> JsonRpcResult<Option<Vec<LocalizedTrace>>> {
47        let primitive_filter = filter
48            .into_primitive()
49            .map_err(error_object_owned_to_jsonrpc_error)?;
50        into_jsonrpc_result(self.inner.filter_traces_impl(primitive_filter))
51    }
52
53    fn transaction_traces(
54        &self, tx_hash: H256,
55    ) -> JsonRpcResult<Option<Vec<LocalizedTrace>>> {
56        into_jsonrpc_result(Ok(self.inner.transaction_trace_impl(&tx_hash)))
57    }
58
59    fn epoch_traces(
60        &self, epoch: RpcEpochNumber,
61    ) -> JsonRpcResult<Option<EpochTrace>> {
62        into_jsonrpc_result(self.inner.epoch_trace_impl(epoch.into_primitive()))
63    }
64}