From d048a8d94d901a216dd4d9c6358ee43127bf6039 Mon Sep 17 00:00:00 2001 From: Shashank Date: Thu, 18 Dec 2025 12:53:21 +0530 Subject: [PATCH 1/2] fix eth_get_filter_logs --- .../subcommands/api_cmd/stateful_tests.rs | 73 ++++++++++++------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/src/tool/subcommands/api_cmd/stateful_tests.rs b/src/tool/subcommands/api_cmd/stateful_tests.rs index 874df6a47977..b91caf81c551 100644 --- a/src/tool/subcommands/api_cmd/stateful_tests.rs +++ b/src/tool/subcommands/api_cmd/stateful_tests.rs @@ -1,6 +1,8 @@ // Copyright 2019-2025 ChainSafe Systems // SPDX-License-Identifier: Apache-2.0, MIT use crate::eth::EVMMethod; +use crate::message::SignedMessage; +use crate::networks::calibnet::ETH_CHAIN_ID; use crate::rpc::eth::EthUint64; use crate::rpc::eth::types::*; use crate::rpc::types::ApiTipsetKey; @@ -310,6 +312,46 @@ async fn wait_pending_message(client: &rpc::Client, message_cid: Cid) -> anyhow: } } +async fn invoke_contract(client: &rpc::Client, tx: &TestTransaction) -> anyhow::Result { + let encoded_params = cbor4ii::serde::to_vec( + Vec::with_capacity(tx.payload.len()), + &Value::Bytes(tx.payload.clone()), + ) + .context("failed to encode params")?; + let nonce = client.call(MpoolGetNonce::request((tx.from,))?).await?; + let message = Message { + to: tx.to, + from: tx.from, + sequence: nonce, + method_num: EVMMethod::InvokeContract as u64, + params: encoded_params.into(), + ..Default::default() + }; + let unsigned_msg = client + .call(GasEstimateMessageGas::request(( + message, + None, + ApiTipsetKey(None), + ))?) + .await?; + + let eth_tx_args = crate::eth::EthEip1559TxArgsBuilder::default() + .chain_id(ETH_CHAIN_ID) + .unsigned_message(&unsigned_msg.message)? + .build() + .map_err(|e| anyhow::anyhow!("Failed to build EIP-1559 transaction: {}", e))?; + let eth_tx = crate::eth::EthTx::Eip1559(Box::new(eth_tx_args)); + let data = eth_tx.rlp_unsigned_message(ETH_CHAIN_ID)?; + + let sig = client.call(WalletSign::request((tx.from, data))?).await?; + let smsg = SignedMessage::new_unchecked(unsigned_msg.message, sig); + let cid = smsg.cid(); + + client.call(MpoolPush::request((smsg,))?).await?; + + Ok(cid) +} + fn create_eth_new_filter_test() -> RpcTestScenario { RpcTestScenario::basic(|client| async move { const BLOCK_RANGE: u64 = 200; @@ -534,51 +576,28 @@ fn eth_get_filter_logs(tx: TestTransaction) -> RpcTestScenario { const BLOCK_RANGE: u64 = 1; let tipset = client.call(ChainHead::request(())?).await?; - - let encoded = cbor4ii::serde::to_vec( - Vec::with_capacity(tx.payload.len()), - &Value::Bytes(tx.payload.clone()), - ) - .context("failed to encode params")?; - - let message = Message { - to: tx.to, - from: tx.from, - method_num: EVMMethod::InvokeContract as u64, - params: encoded.into(), - ..Default::default() - }; - - let smsg = client - .call(MpoolPushMessage::request((message, None))?) - .await?; - + let cid = invoke_contract(&client, &tx).await?; let lookup = client .call( - StateWaitMsg::request((smsg.cid(), 0, tipset.epoch(), false))? + StateWaitMsg::request((cid, 0, tipset.epoch(), false))? .with_timeout(Duration::from_secs(300)), ) .await?; - let block_num = EthUint64(lookup.height as u64); let topics = EthTopicSpec(vec![EthHashList::Single(Some(tx.topic))]); - let filter_spec = EthFilterSpec { from_block: Some(format!("0x{:x}", block_num.0.saturating_sub(BLOCK_RANGE))), - to_block: Some(block_num.to_hex_string()), topics: Some(topics), ..Default::default() }; let filter_id = client.call(EthNewFilter::request((filter_spec,))?).await?; - let filter_result = as_logs( client .call(EthGetFilterLogs::request((filter_id.clone(),))?) .await?, ); - let result = if let EthFilterResult::Logs(logs) = filter_result { anyhow::ensure!(!logs.is_empty()); Ok(()) @@ -648,9 +667,7 @@ pub(super) async fn create_tests(tx: TestTransaction) -> Vec { EthUninstallFilter ), with_methods!( - eth_get_filter_logs(tx.clone()) - .name("eth_getFilterLogs works") - .ignore("https://github.com/ChainSafe/forest/issues/5917"), + eth_get_filter_logs(tx.clone()).name("eth_getFilterLogs works"), EthNewFilter, EthGetFilterLogs, EthUninstallFilter From 48529651b0d9bb474b2236a893ec4a3dc9f79fa0 Mon Sep 17 00:00:00 2001 From: Shashank Date: Thu, 18 Dec 2025 17:10:28 +0530 Subject: [PATCH 2/2] lint fix --- src/tool/subcommands/api_cmd/stateful_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tool/subcommands/api_cmd/stateful_tests.rs b/src/tool/subcommands/api_cmd/stateful_tests.rs index c8282726a17b..ebbdf549ef71 100644 --- a/src/tool/subcommands/api_cmd/stateful_tests.rs +++ b/src/tool/subcommands/api_cmd/stateful_tests.rs @@ -84,7 +84,7 @@ impl RpcTestScenario { self } - fn ignore(mut self, msg: &'static str) -> Self { + fn _ignore(mut self, msg: &'static str) -> Self { self.ignore = Some(msg); self }