Skip to content
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@

- [#6469](https://github.com/ChainSafe/forest/pull/6469): Implemented `Filecoin.EthGetTransactionByBlockNumberAndIndex` for API v2.

- [#6451](https://github.com/ChainSafe/forest/pull/6451): Implemented `Filecoin.EthTraceBlock` for API v2.

### Changed

- [#6471](https://github.com/ChainSafe/forest/pull/6471): Moved `forest-tool state` subcommand to `forest-dev`.
Expand Down
63 changes: 45 additions & 18 deletions src/rpc/methods/eth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3669,26 +3669,50 @@ impl RpcMethod<1> for EthTraceBlock {
const PARAM_NAMES: [&'static str; 1] = ["blockParam"];
const API_PATHS: BitFlags<ApiPaths> = ApiPaths::all();
const PERMISSION: Permission = Permission::Read;
const DESCRIPTION: Option<&'static str> = Some("Returns traces created at given block.");

type Params = (ExtBlockNumberOrHash,);
type Ok = Vec<EthBlockTrace>;
async fn handle(
ctx: Ctx<impl Blockstore + Send + Sync + 'static>,
(block_param,): Self::Params,
) -> Result<Self::Ok, ServerError> {
trace_block(ctx, block_param).await
let ts = tipset_by_ext_block_number_or_hash(
ctx.chain_store(),
block_param,
ResolveNullTipset::TakeOlder,
)?;
eth_trace_block(&ctx, &ts).await
}
}

async fn trace_block<B: Blockstore + Send + Sync + 'static>(
ctx: Ctx<B>,
block_param: ExtBlockNumberOrHash,
) -> Result<Vec<EthBlockTrace>, ServerError> {
let ts = tipset_by_ext_block_number_or_hash(
ctx.chain_store(),
block_param,
ResolveNullTipset::TakeOlder,
)?;
let (state_root, trace) = ctx.state_manager.execution_trace(&ts)?;
pub enum EthTraceBlockV2 {}
impl RpcMethod<1> for EthTraceBlockV2 {
const NAME: &'static str = "Filecoin.EthTraceBlock";
const NAME_ALIAS: Option<&'static str> = Some("trace_block");
const N_REQUIRED_PARAMS: usize = 1;
const PARAM_NAMES: [&'static str; 1] = ["blockParam"];
const API_PATHS: BitFlags<ApiPaths> = make_bitflags!(ApiPaths::V2);
const PERMISSION: Permission = Permission::Read;
const DESCRIPTION: Option<&'static str> = Some("Returns traces created at given block.");

type Params = (ExtBlockNumberOrHash,);
type Ok = Vec<EthBlockTrace>;
async fn handle(
ctx: Ctx<impl Blockstore + Send + Sync + 'static>,
(block_param,): Self::Params,
) -> Result<Self::Ok, ServerError> {
let ts = tipset_by_block_number_or_hash_v2(&ctx, block_param, ResolveNullTipset::TakeOlder)
.await?;
eth_trace_block(&ctx, &ts).await
}
}

async fn eth_trace_block<DB>(ctx: &Ctx<DB>, ts: &Tipset) -> Result<Vec<EthBlockTrace>, ServerError>
where
DB: Blockstore + Send + Sync + 'static,
{
let (state_root, trace) = ctx.state_manager.execution_trace(ts)?;
let state = StateTree::new_from_root(ctx.store_owned(), &state_root)?;
let cid = ts.key().cid()?;
let block_hash: EthHash = cid.into();
Expand Down Expand Up @@ -3750,14 +3774,17 @@ impl RpcMethod<1> for EthTraceTransaction {
.await?
.ok_or(ServerError::internal_error("transaction not found", None))?;

let traces = trace_block(
ctx,
let ts = tipset_by_ext_block_number_or_hash(
ctx.chain_store(),
ExtBlockNumberOrHash::from_block_number(eth_txn.block_number.0 as i64),
)
.await?
.into_iter()
.filter(|trace| trace.transaction_hash == eth_hash)
.collect();
ResolveNullTipset::TakeOlder,
)?;

let traces = eth_trace_block(&ctx, &ts)
.await?
.into_iter()
.filter(|trace| trace.transaction_hash == eth_hash)
.collect();
Ok(traces)
}
}
Expand Down
1 change: 1 addition & 0 deletions src/rpc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ macro_rules! for_each_rpc_method {
$callback!($crate::rpc::eth::EthSubscribe);
$callback!($crate::rpc::eth::EthSyncing);
$callback!($crate::rpc::eth::EthTraceBlock);
$callback!($crate::rpc::eth::EthTraceBlockV2);
$callback!($crate::rpc::eth::EthTraceFilter);
$callback!($crate::rpc::eth::EthTraceTransaction);
$callback!($crate::rpc::eth::EthTraceReplayBlockTransactions);
Expand Down
28 changes: 28 additions & 0 deletions src/tool/subcommands/api_cmd/api_compare_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2270,6 +2270,34 @@ fn eth_tests_with_tipset<DB: Blockstore>(store: &Arc<DB>, shared_tipset: &Tipset
),))
.unwrap(),
),
RpcTest::identity(
EthTraceBlockV2::request((ExtBlockNumberOrHash::from_block_number(
shared_tipset.epoch(),
),))
.unwrap(),
),
RpcTest::basic(
EthTraceBlockV2::request((ExtBlockNumberOrHash::from_predefined(
ExtPredefined::Pending,
),))
.unwrap(),
),
RpcTest::basic(
EthTraceBlockV2::request((ExtBlockNumberOrHash::from_predefined(
ExtPredefined::Latest,
),))
.unwrap(),
),
RpcTest::basic(
EthTraceBlockV2::request((ExtBlockNumberOrHash::from_predefined(ExtPredefined::Safe),))
.unwrap(),
),
RpcTest::basic(
EthTraceBlockV2::request((ExtBlockNumberOrHash::from_predefined(
ExtPredefined::Finalized,
),))
.unwrap(),
),
RpcTest::identity(
EthTraceReplayBlockTransactions::request((
ExtBlockNumberOrHash::from_block_number(shared_tipset.epoch()),
Expand Down
5 changes: 5 additions & 0 deletions src/tool/subcommands/api_cmd/test_snapshots.txt
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ filecoin_ethnewfilter_1741781607617949.rpcsnap.json.zst
filecoin_ethnewpendingtransactionfilter_1741781890872902.rpcsnap.json.zst
filecoin_ethprotocolversion_1737446676698826.rpcsnap.json.zst
filecoin_ethtraceblock_1737446676736475.rpcsnap.json.zst
filecoin_ethtraceblock_1768911857430141.rpcsnap.json.zst
filecoin_ethtraceblock_v2_finalized_1769092405093534.rpcsnap.json.zst
filecoin_ethtraceblock_v2_latest_1769092400908495.rpcsnap.json.zst
filecoin_ethtraceblock_v2_pending_1769092400918744.rpcsnap.json.zst
filecoin_ethtraceblock_v2_safe_1769092401374979.rpcsnap.json.zst
filecoin_ethtracefilter_1742371405673188.rpcsnap.json.zst
filecoin_ethtracefilter_1742983898701553.rpcsnap.json.zst
filecoin_ethtracefilter_1746449543820062.rpcsnap.json.zst
Expand Down
Loading