diff --git a/Cargo.lock b/Cargo.lock index 22ab7e3d9a7e..fd7732320f8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2691,6 +2691,20 @@ dependencies = [ "serde", ] +[[package]] +name = "fil_actor_ethaccount_state" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b86efe58d250676a39c6a62f95ac77e1366eb5f00647217660d34b86e2551cf" +dependencies = [ + "fvm_ipld_encoding", + "fvm_shared 3.13.2", + "fvm_shared 4.7.3", + "num-derive", + "num-traits", + "serde", +] + [[package]] name = "fil_actor_evm_state" version = "23.0.1" @@ -3163,6 +3177,7 @@ dependencies = [ "fil_actor_cron_state", "fil_actor_datacap_state", "fil_actor_eam_state", + "fil_actor_ethaccount_state", "fil_actor_evm_state", "fil_actor_init_state", "fil_actor_market_state", diff --git a/Cargo.toml b/Cargo.toml index de7a3235bd1e..2df0f9a2d221 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,6 +72,7 @@ fil_actor_account_state = { version = "23" } fil_actor_cron_state = { version = "23" } fil_actor_datacap_state = { version = "23" } fil_actor_eam_state = { version = "23" } +fil_actor_ethaccount_state = { version = "23" } fil_actor_evm_state = { version = "23" } fil_actor_init_state = { version = "23" } fil_actor_market_state = { version = "23" } diff --git a/src/rpc/registry/actors/eth_account.rs b/src/rpc/registry/actors/eth_account.rs new file mode 100644 index 000000000000..86749e8c5acb --- /dev/null +++ b/src/rpc/registry/actors/eth_account.rs @@ -0,0 +1,28 @@ +// Copyright 2019-2025 ChainSafe Systems +// SPDX-License-Identifier: Apache-2.0, MIT + +use crate::rpc::registry::methods_reg::{MethodRegistry, register_actor_methods}; +use crate::shim::message::MethodNum; +use cid::Cid; + +macro_rules! register_eth_account_reg_version { + ($registry:expr, $code_cid:expr, $state_version:path) => {{ + use $state_version::*; + + // Constructor has no parameters + register_actor_methods!($registry, $code_cid, [(Method::Constructor, empty),]); + }}; +} + +pub(crate) fn register_actor_methods(registry: &mut MethodRegistry, cid: Cid, version: u64) { + match version { + 10 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v10), + 11 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v11), + 12 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v12), + 13 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v13), + 14 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v14), + 15 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v15), + 16 => register_eth_account_reg_version!(registry, cid, fil_actor_ethaccount_state::v16), + _ => {} + } +} diff --git a/src/rpc/registry/actors/mod.rs b/src/rpc/registry/actors/mod.rs index 4935fe4b8a51..74b9506ee84a 100644 --- a/src/rpc/registry/actors/mod.rs +++ b/src/rpc/registry/actors/mod.rs @@ -4,6 +4,7 @@ pub(crate) mod account; pub(crate) mod cron; pub(crate) mod datacap; +pub(crate) mod eth_account; pub(crate) mod evm; pub(crate) mod init; pub(crate) mod miner; diff --git a/src/rpc/registry/methods_reg.rs b/src/rpc/registry/methods_reg.rs index 4aa6d6c0f1d5..ffe2a41f5349 100644 --- a/src/rpc/registry/methods_reg.rs +++ b/src/rpc/registry/methods_reg.rs @@ -74,7 +74,8 @@ impl MethodRegistry { fn register_known_methods(&mut self) { use crate::rpc::registry::actors::{ - account, cron, datacap, evm, init, miner, multisig, power, reward, system, verified_reg, + account, cron, datacap, eth_account, evm, init, miner, multisig, power, reward, system, + verified_reg, }; for (&cid, &(actor_type, version)) in ACTOR_REGISTRY.iter() { @@ -96,6 +97,7 @@ impl MethodRegistry { BuiltinActor::VerifiedRegistry => { verified_reg::register_actor_methods(self, cid, version) } + BuiltinActor::EthAccount => eth_account::register_actor_methods(self, cid, version), _ => {} } } diff --git a/src/tool/subcommands/api_cmd/api_compare_tests.rs b/src/tool/subcommands/api_cmd/api_compare_tests.rs index 5e03f9257e68..9adf193387b7 100644 --- a/src/tool/subcommands/api_cmd/api_compare_tests.rs +++ b/src/tool/subcommands/api_cmd/api_compare_tests.rs @@ -1883,6 +1883,13 @@ fn state_decode_params_api_tests(tipset: &Tipset) -> anyhow::Result vec![], tipset.key().into(), ))?), + RpcTest::identity(StateDecodeParams::request(( + Address::new_delegated(Address::ETHEREUM_ACCOUNT_MANAGER_ACTOR.id()?, &[0; 20]) + .unwrap(), + fil_actor_ethaccount_state::v16::Method::Constructor as u64, + vec![], + tipset.key().into(), + ))?), ]; tests.extend(miner_actor_state_decode_params_tests(tipset)?); diff --git a/src/tool/subcommands/api_cmd/test_snapshots.txt b/src/tool/subcommands/api_cmd/test_snapshots.txt index c5046217acc9..6930a7a2e8b6 100644 --- a/src/tool/subcommands/api_cmd/test_snapshots.txt +++ b/src/tool/subcommands/api_cmd/test_snapshots.txt @@ -203,6 +203,7 @@ filecoin_verified_reg_statedecodeparams_1754401651147022.rpcsnap.json.zst filecoin_verified_reg_statedecodeparams_1754401651147091.rpcsnap.json.zst filecoin_verified_reg_statedecodeparams_1754401651147157.rpcsnap.json.zst filecoin_verified_reg_statedecodeparams_1754401651147231.rpcsnap.json.zst +filecoin_ethaccount_statedecodeparams_1756186350854913.rpcsnap.json.zst filecoin_statereplay_1743504051038215.rpcsnap.json.zst filecoin_statesearchmsg_1741784596636715.rpcsnap.json.zst filecoin_statesearchmsglimited_1741784596704876.rpcsnap.json.zst