From 625b196c1007c6cd4ea54b6003c72d3f923cca66 Mon Sep 17 00:00:00 2001 From: Aryan Tikarya Date: Tue, 20 Jan 2026 12:57:08 +0530 Subject: [PATCH 1/6] Add EthTraceBlockV2 API support --- src/rpc/methods/eth.rs | 59 +++++++++++++++++++++++++++++------------- src/rpc/mod.rs | 1 + 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/rpc/methods/eth.rs b/src/rpc/methods/eth.rs index 721352189c68..66f545d51148 100644 --- a/src/rpc/methods/eth.rs +++ b/src/rpc/methods/eth.rs @@ -3612,20 +3612,40 @@ impl RpcMethod<1> for EthTraceBlock { ctx: Ctx, (block_param,): Self::Params, ) -> Result { - 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( - ctx: Ctx, - block_param: ExtBlockNumberOrHash, -) -> Result, 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 = make_bitflags!(ApiPaths::V2); + const PERMISSION: Permission = Permission::Read; + type Params = (ExtBlockNumberOrHash,); + type Ok = Vec; + async fn handle( + ctx: Ctx, + (block_param,): Self::Params, + ) -> Result { + 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(ctx: &Ctx, ts: &Tipset) -> Result, 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(); @@ -3687,14 +3707,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) } } diff --git a/src/rpc/mod.rs b/src/rpc/mod.rs index 7244acf2f659..2f99f3799079 100644 --- a/src/rpc/mod.rs +++ b/src/rpc/mod.rs @@ -144,6 +144,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); From d560b8cba224e0496f998cfb61c98d95f841411f Mon Sep 17 00:00:00 2001 From: Aryan Tikarya Date: Tue, 20 Jan 2026 18:05:28 +0530 Subject: [PATCH 2/6] add snasphot test --- src/tool/subcommands/api_cmd/api_compare_tests.rs | 6 ++++++ src/tool/subcommands/api_cmd/test_snapshots.txt | 1 + 2 files changed, 7 insertions(+) diff --git a/src/tool/subcommands/api_cmd/api_compare_tests.rs b/src/tool/subcommands/api_cmd/api_compare_tests.rs index 7460ae909972..a0f564e9e99b 100644 --- a/src/tool/subcommands/api_cmd/api_compare_tests.rs +++ b/src/tool/subcommands/api_cmd/api_compare_tests.rs @@ -2212,6 +2212,12 @@ fn eth_tests_with_tipset(store: &Arc, shared_tipset: &Tipset ),)) .unwrap(), ), + RpcTest::identity( + EthTraceBlockV2::request((ExtBlockNumberOrHash::from_block_number( + shared_tipset.epoch(), + ),)) + .unwrap(), + ), RpcTest::identity( EthTraceReplayBlockTransactions::request(( ExtBlockNumberOrHash::from_block_number(shared_tipset.epoch()), diff --git a/src/tool/subcommands/api_cmd/test_snapshots.txt b/src/tool/subcommands/api_cmd/test_snapshots.txt index 11e9634087a9..b0da9cd4af39 100644 --- a/src/tool/subcommands/api_cmd/test_snapshots.txt +++ b/src/tool/subcommands/api_cmd/test_snapshots.txt @@ -91,6 +91,7 @@ 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_ethtracefilter_1742371405673188.rpcsnap.json.zst filecoin_ethtracefilter_1742983898701553.rpcsnap.json.zst filecoin_ethtracefilter_1746449543820062.rpcsnap.json.zst From cdc6e0c53f0ec5010bc86eec8d2037942143fae3 Mon Sep 17 00:00:00 2001 From: Aryan Tikarya Date: Wed, 21 Jan 2026 00:47:00 +0530 Subject: [PATCH 3/6] add api description --- src/rpc/methods/eth.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rpc/methods/eth.rs b/src/rpc/methods/eth.rs index 66f545d51148..6abd07fc294d 100644 --- a/src/rpc/methods/eth.rs +++ b/src/rpc/methods/eth.rs @@ -3606,6 +3606,8 @@ impl RpcMethod<1> for EthTraceBlock { const PARAM_NAMES: [&'static str; 1] = ["blockParam"]; const API_PATHS: BitFlags = 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; async fn handle( @@ -3629,6 +3631,8 @@ impl RpcMethod<1> for EthTraceBlockV2 { const PARAM_NAMES: [&'static str; 1] = ["blockParam"]; const API_PATHS: BitFlags = 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; async fn handle( From 095e11203eb00b9f4ae4e15620ce789e1cc92960 Mon Sep 17 00:00:00 2001 From: Aryan Tikarya Date: Wed, 21 Jan 2026 10:17:29 +0530 Subject: [PATCH 4/6] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e10de8d2400f..c901c2cd619a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,8 @@ - [#6421](https://github.com/ChainSafe/forest/pull/6421) Add an environment variable `FOREST_RPC_BACKFILL_FULL_TIPSET_FROM_NETWORK` to enable backfilling full tipsets from network in a few RPC methods. +- [#6451](https://github.com/ChainSafe/forest/pull/6451) Implemented `Filecoin.EthTraceBlock` for API v2. + ### Changed - [#6368](https://github.com/ChainSafe/forest/pull/6368): Migrated build and development tooling from Makefile to `mise`. Contributors should install `mise` and use `mise run` commands instead of `make` commands. From 6862786807a5d2152e250c84c15c9cc9ef982d8b Mon Sep 17 00:00:00 2001 From: Aryan Tikarya Date: Thu, 22 Jan 2026 20:55:34 +0530 Subject: [PATCH 5/6] address comments --- .../subcommands/api_cmd/api_compare_tests.rs | 22 +++++++++++++++++++ .../subcommands/api_cmd/test_snapshots.txt | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/src/tool/subcommands/api_cmd/api_compare_tests.rs b/src/tool/subcommands/api_cmd/api_compare_tests.rs index a0f564e9e99b..11fe2fc63c9d 100644 --- a/src/tool/subcommands/api_cmd/api_compare_tests.rs +++ b/src/tool/subcommands/api_cmd/api_compare_tests.rs @@ -2218,6 +2218,28 @@ fn eth_tests_with_tipset(store: &Arc, shared_tipset: &Tipset ),)) .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()), diff --git a/src/tool/subcommands/api_cmd/test_snapshots.txt b/src/tool/subcommands/api_cmd/test_snapshots.txt index b0da9cd4af39..860c17daf5cf 100644 --- a/src/tool/subcommands/api_cmd/test_snapshots.txt +++ b/src/tool/subcommands/api_cmd/test_snapshots.txt @@ -92,6 +92,10 @@ 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 From 11a8143aaea300b26bac281202594cca62a06f20 Mon Sep 17 00:00:00 2001 From: Aryan Tikarya Date: Wed, 28 Jan 2026 15:19:15 +0530 Subject: [PATCH 6/6] Update CHANGELOG.md Co-authored-by: Shashank <99187193+sudo-shashank@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17ffa185d504..ecab5d124549 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,7 @@ - [#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. +- [#6451](https://github.com/ChainSafe/forest/pull/6451): Implemented `Filecoin.EthTraceBlock` for API v2. ### Changed