feat: add support for eam actor in state decode params API#5994
feat: add support for eam actor in state decode params API#5994akaladarshi merged 13 commits intomainfrom
Conversation
WalkthroughAdds LotusJson representations and HasLotusJson mappings for EAM actor params (v10–v16), registers EAM methods in the RPC method registry, exposes an EAM registry module, and adds StateDecodeParams tests and snapshots for EAM methods. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Client
participant RPC as RPC Server
participant Registry as MethodRegistry
participant EAM as EAM Registrar
participant LJ as LotusJson Mappings
Client->>RPC: Filecoin.StateDecodeParams(actor=EAM, method, payload, tipset)
RPC->>Registry: Resolve actor CID & version
Registry->>EAM: register_actor_methods(registry, cid, version)
Note right of EAM: Registers Constructor, Create, Create2, CreateExternal (v10–v16)
RPC->>LJ: Use HasLotusJson for vX to decode payload
LJ-->>RPC: Native params (Create/Create2/CreateExternal)
RPC-->>Client: JSON result (LotusJson)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes
Possibly related issues
Possibly related PRs
Suggested reviewers
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 💡 Knowledge Base configuration:
You can enable these sources in your CodeRabbit configuration. 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
✨ Finishing Touches🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (6)
src/rpc/registry/methods_reg.rs (2)
100-101: Register EAM methods in the global registry + add unit test coverageThe new match arm correctly dispatches
BuiltinActor::EAMtoeam::register_actor_methods(self, cid, version). To keep tests aligned with supported actors, extend thetest_supported_actor_methods_registeredlist to include EAM so we catch regressions in registration.Apply the diff:
@@ fn test_supported_actor_methods_registered() { - let supported_actors = vec![ + let supported_actors = vec![ BuiltinActor::Account, BuiltinActor::Miner, BuiltinActor::EVM, BuiltinActor::Cron, BuiltinActor::DataCap, + BuiltinActor::EAM, ];
115-150: Minor nit: avoid unnecessary.as_str()when emitting base64 JSON for empty-paramsIn the
register_actor_methods!macro’semptybranch,json!(BASE64_STANDARD.encode(bytes).as_str())can drop the.as_str()—json!acceptsStringdirectly. This avoids creating a temporary&str.- Ok(serde_json::json!(BASE64_STANDARD.encode(bytes).as_str())) + Ok(serde_json::json!(BASE64_STANDARD.encode(bytes)))src/tool/subcommands/api_cmd/api_compare_tests.rs (1)
1884-1925: EAM decode-params tests: coverage and minor polishThe four tests cover Constructor (empty), Create, Create2, and CreateExternal with v16 types. Two suggestions:
- Add a negative test with non-empty bytes for Constructor to ensure the “empty param” branch in the registry encodes raw bytes as base64 (matching Lotus behavior).
- Optionally add at least one v1X (e.g., v14) param serialization to exercise the version-dispatch in
actors/eam.rs, even if the tipset is v16; you can still feed params of other versions for decode parity checks where valid.Here’s a small add-on test for the Constructor non-empty-bytes case:
@@ fn eam_actor_state_decode_params_tests(tipset: &Tipset) -> anyhow::Result<Vec<RpcTest>> { - Ok(vec![ + Ok(vec![ RpcTest::identity(StateDecodeParams::request(( Address::ETHEREUM_ACCOUNT_MANAGER_ACTOR, fil_actor_eam_state::v16::Method::Constructor as u64, vec![], tipset.key().into(), ))?), + // Constructor with non-empty bytes: should return base64-encoded string + RpcTest::identity(StateDecodeParams::request(( + Address::ETHEREUM_ACCOUNT_MANAGER_ACTOR, + fil_actor_eam_state::v16::Method::Constructor as u64, + vec![0x82, 0x18, 0x2a, 0x44, 0x12, 0x34, 0x56, 0x78], + tipset.key().into(), + ))?), RpcTest::identity(StateDecodeParams::request(( Address::ETHEREUM_ACCOUNT_MANAGER_ACTOR, fil_actor_eam_state::v16::Method::Create as u64, to_vec(&create_params)?, tipset.key().into(), ))?),src/rpc/registry/actors/eam.rs (3)
5-5: Remove unused import to avoid warnings.
MethodNumis not used in this module.-use crate::shim::message::MethodNum;
8-25: Rename macro for clarity and consistency.The current name
register_eam_reg_version!is a bit stuttery. Considerregister_eam_for_version!, which matches intent and mirrors similar modules.-macro_rules! register_eam_reg_version { +macro_rules! register_eam_for_version { @@ - 10 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v10), - 11 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v11), - 12 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v12), - 13 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v13), - 14 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v14), - 15 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v15), - 16 => register_eam_reg_version!(registry, cid, fil_actor_eam_state::v16), + 10 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v10), + 11 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v11), + 12 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v12), + 13 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v13), + 14 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v14), + 15 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v15), + 16 => register_eam_for_version!(registry, cid, fil_actor_eam_state::v16),Also applies to: 29-36
27-38: Optional: log on unsupported versions to aid diagnostics.A tiny debug log helps during network upgrades and mismatched actor tables.
- _ => {} + _ => { + tracing::debug!("EAM: no registrations for unsupported state version {}", version); + }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (7)
src/lotus_json/actor_states/methods/eam_params.rs(1 hunks)src/lotus_json/actor_states/methods/mod.rs(1 hunks)src/rpc/registry/actors/eam.rs(1 hunks)src/rpc/registry/actors/mod.rs(1 hunks)src/rpc/registry/methods_reg.rs(2 hunks)src/tool/subcommands/api_cmd/api_compare_tests.rs(1 hunks)src/tool/subcommands/api_cmd/test_snapshots.txt(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
src/tool/subcommands/api_cmd/api_compare_tests.rs (2)
src/rpc/reflect/mod.rs (1)
request(250-260)src/blocks/tipset.rs (2)
key(336-339)key(530-533)
src/rpc/registry/methods_reg.rs (1)
src/rpc/registry/actors/eam.rs (1)
register_actor_methods(27-38)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
- GitHub Check: Build MacOS
- GitHub Check: cargo-publish-dry-run
- GitHub Check: Build Ubuntu
- GitHub Check: tests
- GitHub Check: tests-release
- GitHub Check: Build forest binaries on Linux AMD64
- GitHub Check: All lint checks
- GitHub Check: Analyze (rust)
- GitHub Check: Analyze (go)
🔇 Additional comments (10)
src/rpc/registry/actors/mod.rs (1)
7-7: Wiring EAM actor module is correctThe new
pub(crate) mod eam;is in line with how other actor modules are exposed. No issues.src/lotus_json/actor_states/methods/mod.rs (1)
9-9: EAMParams HasLotusJson impl coverage confirmedThe bottom of src/lotus_json/actor_states/methods/eam_params.rs invokes:
impl_eam_create_params!(16, 15, 14, 13, 12, 11, 10);impl_eam_create2_params!(16, 15, 14, 13, 12, 11, 10);impl_eam_create_external_params!(16, 15, 14, 13, 12, 11, 10);These macro calls generate
HasLotusJsonimplementations for CreateParams, Create2Params, and CreateExternalParams in versions v10 through v16. No missing impls were found—coverage across all required versions is complete.src/rpc/registry/methods_reg.rs (3)
76-79: Importedeammodule into registry — goodIncluding
eamalongside the other actor modules is necessary for dispatch below. Looks good.
65-73: Error message includes actor type and method — consistentThe
bail!message remains helpful and now covers EAM via the registry path above. No change requested.
75-104: Verify EAM CID→actor mapping for all supported versionsThe new
register_known_methodsdispatchesBuiltinActor::EAM, but I didn’t find any entries in the actor-registry mapping for EAM code CIDs. Without those, EAM methods will never be registered at runtime. Please double-check that:
- In
src/shim/machine/manifest.rs, all supported EAM versions (v10–v16) map from their code CIDs toBuiltinActor::EAM.- In the module where
ACTOR_REGISTRYis defined (e.g.src/rpc/registry/actors_reg.rsor its neighbor), the registry includes an entry for each of those CIDs, pairing it with(BuiltinActor::EAM, version).If any are missing, add lines such as:
// in ACTOR_REGISTRY + Cid("bafy…<v10-cid>") => (BuiltinActor::EAM, 10), + Cid("bafy…<v11-cid>") => (BuiltinActor::EAM, 11), … + Cid("bafy…<v16-cid>") => (BuiltinActor::EAM, 16),so that
register_known_methodswill invokeeam::register_actor_methodsfor every EAM version.src/tool/subcommands/api_cmd/test_snapshots.txt (1)
204-207: Snapshots for EAM decode-params validated
- Verified exactly four
StateDecodeParams::requesttests targetingAddress::ETHEREUM_ACCOUNT_MANAGER_ACTORinsrc/tool/subcommands/api_cmd/api_compare_tests.rs.- Confirmed each of the four new snapshot files appears exactly once in
src/tool/subcommands/api_cmd/test_snapshots.txt:
• filecoin_eam_statedecodeparams_1756139121347152.rpcsnap.json.zst
• filecoin_eam_statedecodeparams_1756139121347218.rpcsnap.json.zst
• filecoin_eam_statedecodeparams_1756139121347288.rpcsnap.json.zst
• filecoin_eam_statedecodeparams_1756139121347364.rpcsnap.json.zst- Ensured the list is sorted in ascending order and contains no duplicates, guaranteeing deterministic CI behavior.
All checks pass; no further action required.
src/tool/subcommands/api_cmd/api_compare_tests.rs (2)
1879-1882: Include EAM in state-decode-params test suite — goodAdding
eam_actor_state_decode_params_tests(tipset)?into the existing matrix ensures we validate both schema and Lotus parity for EAM params alongside other actors.
1884-1925: Params encoding choices look correct
- Create/Create2 use CBOR via
to_vec, matching how other actors’ params are handled.- CreateExternal uses the
CreateExternalParamsnewtype — correct for v16.No functional issues spotted.
src/lotus_json/actor_states/methods/eam_params.rs (2)
10-17: CreateParams mapping LGTM.
RawBytes+ base64 viacrate::lotus_jsonis consistent with other actors, and the snapshot looks correct.
112-119: CreateExternal mapping LGTM.Tuple newtype for
RawBytesis straightforward and matches the string snapshot form.Also applies to: 137-143
| pub struct EAMCreate2ParamsLotusJson { | ||
| #[schemars(with = "LotusJson<Vec<u8>>")] | ||
| #[serde(with = "crate::lotus_json")] | ||
| pub initcode: Vec<u8>, | ||
| pub salt: [u8; 32], | ||
| } |
There was a problem hiding this comment.
Fix Create2 LotusJson: base64 encoding for Salt, snapshot mismatch, and redundant/incorrect try_into.
- Salt is presented as a base64 string in the snapshots, but the struct field is
[u8; 32]withoutserde(with = "crate::lotus_json"), so deserialization would expect an array of numbers, not a string. - The snapshot’s expected
Selfusessalt: [0; 32]while the provided base64 decodes to 0..31, causing the snapshot to fail. try_into()on[u8; 32]to[u8; 32]is unnecessary and, as written, can be incorrect depending on trait impl expectations.
Recommend representing Salt in the LotusJson type as Vec<u8> (base64 via crate::lotus_json) and convert to [u8; 32] in from_lotus_json. Also fix the snapshot to reflect the actual bytes (0..31).
#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct EAMCreate2ParamsLotusJson {
#[schemars(with = "LotusJson<Vec<u8>>")]
#[serde(with = "crate::lotus_json")]
pub initcode: Vec<u8>,
- pub salt: [u8; 32],
+ #[schemars(with = "LotusJson<Vec<u8>>")]
+ #[serde(with = "crate::lotus_json")]
+ pub salt: Vec<u8>,
}
@@
fn snapshots() -> Vec<(serde_json::Value, Self)> {
vec![
(
json!({
"Initcode": "ESIzRFU=",
"Salt": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="
}),
Self {
initcode: hex::decode("1122334455").unwrap(),
- salt: [0; 32],
+ salt: [
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31
+ ],
},
),
]
}
@@
fn into_lotus_json(self) -> Self::LotusJson {
EAMCreate2ParamsLotusJson {
initcode: self.initcode,
- salt: self.salt,
+ salt: self.salt.to_vec(),
}
}
fn from_lotus_json(lotus_json: Self::LotusJson) -> Self {
Self {
- initcode: lotus_json.initcode.into(),
- salt: lotus_json.salt.try_into().unwrap_or_else(|_| [0; 32]),
+ initcode: lotus_json.initcode,
+ salt: <[u8; 32]>::try_from(lotus_json.salt).unwrap_or_else(|v: Vec<u8>| {
+ debug_assert_eq!(v.len(), 32, "EAM Create2 salt must be 32 bytes");
+ [0; 32]
+ }),
}
}Also applies to: 77-91, 93-105
🤖 Prompt for AI Agents
In src/lotus_json/actor_states/methods/eam_params.rs around lines 63-68 (and
similarly at 77-91, 93-105): the salt field is currently [u8;32] but snapshots
provide base64, and there are redundant/incorrect try_into usages; change the
struct to represent salt as a LotusJson base64-backed Vec<u8> (add
#[schemars(with = "LotusJson<Vec<u8>>")] and #[serde(with =
"crate::lotus_json")] on salt), then in from_lotus_json convert the Vec<u8> into
a [u8;32] by verifying length == 32 and copying into an array (return an error
if length mismatches) instead of using unnecessary try_into on an array; update
the snapshot expected salt bytes to the actual decoded sequence (0..31) so tests
align.
There was a problem hiding this comment.
Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!
There was a problem hiding this comment.
Refactored the snapshot test
f3d4d01
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (2)
src/lotus_json/actor_states/methods/eam_params.rs (2)
61-68: Create2 Salt must be base64 LotusJson, not a JSON number array; fix representation.Lotus RPC encodes byte arrays as base64 strings. The EAM Create2 Salt in snapshots is base64 (e.g., AAECAwQF…Hh8=), but here Salt is declared as [u8; 32] without lotus_json, which expects a JSON array of numbers and will not deserialize the RPC payload. This also diverges from the provided RPC snapshots. Represent Salt as a base64-backed Vec in the LotusJson type, and convert to [u8; 32] at the boundary.
Apply this diff to the LotusJson wrapper struct:
#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)] #[serde(rename_all = "PascalCase")] pub struct EAMCreate2ParamsLotusJson { #[schemars(with = "LotusJson<Vec<u8>>")] #[serde(with = "crate::lotus_json")] pub initcode: Vec<u8>, - pub salt: [u8; 32], + #[schemars(with = "LotusJson<Vec<u8>>")] + #[serde(with = "crate::lotus_json")] + pub salt: Vec<u8>, }
70-109: Create2: update snapshots and conversions; enforce 32-byte Salt.
- Snapshot should use base64 Salt to match Lotus RPC.
- into_lotus_json should emit Vec for Salt.
- from_lotus_json must validate length == 32 and convert Vec → [u8; 32] (fallback or assert on mismatch).
@@ #[cfg(test)] fn snapshots() -> Vec<(serde_json::Value, Self)> { vec![ ( json!({ "Initcode": "ESIzRFU=", - "Salt": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + "Salt": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=" }), Self { initcode: hex::decode("1122334455").unwrap(), - salt: [0; 32], + salt: [ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31 + ], }, ), ] } @@ fn into_lotus_json(self) -> Self::LotusJson { EAMCreate2ParamsLotusJson { initcode: self.initcode, - salt: self.salt, + salt: self.salt.to_vec(), } } fn from_lotus_json(lotus_json: Self::LotusJson) -> Self { - Self { - initcode: lotus_json.initcode, - salt: lotus_json.salt, - } + let salt_arr = <[u8; 32]>::try_from(lotus_json.salt).unwrap_or_else(|v: Vec<u8>| { + debug_assert_eq!(v.len(), 32, "EAM Create2 salt must be 32 bytes"); + [0; 32] + }); + Self { + initcode: lotus_json.initcode, + salt: salt_arr, + } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (1)
src/lotus_json/actor_states/methods/eam_params.rs(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
- GitHub Check: cargo-publish-dry-run
- GitHub Check: Build Ubuntu
- GitHub Check: Build MacOS
- GitHub Check: Build forest binaries on Linux AMD64
- GitHub Check: tests
- GitHub Check: All lint checks
- GitHub Check: tests-release
- GitHub Check: Analyze (go)
- GitHub Check: Analyze (rust)
🔇 Additional comments (4)
src/lotus_json/actor_states/methods/eam_params.rs (4)
10-17: CreateParams JSON mapping looks correct and aligned with Lotus JSON.Using RawBytes with crate::lotus_json for Initcode preserves base64 semantics; Nonce stays as a u64. Snapshot matches the expected decoded bytes.
19-59: CreateParams impl across v10–v16: conversions and snapshot LGTM.into_lotus_json/from_lotus_json are correct round-trips; test snapshot is representative.
112-119: CreateExternal newtype wrapper is correct.Wrapping RawBytes with crate::lotus_json produces the expected base64 string JSON. Snapshot matches.
120-148: CreateExternal impl across v10–v16: looks good.Round-trips are correct; snapshot is concise and representative.
| impl_eam_create_params!(16, 15, 14, 13, 12, 11, 10); | ||
| impl_eam_create2_params!(16, 15, 14, 13, 12, 11, 10); | ||
| impl_eam_create_external_params!(16, 15, 14, 13, 12, 11, 10); |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Confirm actor versions and broaden test coverage across versions.
EAM is implemented for v10–v16 here. Please confirm the fil_actor_eam_state crate actually exposes Create/Create2/CreateExternal for all these versions and that StateDecodeParams exercises at least one pre-v16 version to catch regressions.
Run the following to sanity-check snapshot presence and test references:
If you want, I can draft additional API compare tests parametrized over versions V10–V16 to ensure the decode path stays compatible.
🏁 Script executed:
#!/usr/bin/env bash
# 1) List EAM StateDecodeParams snapshots added by this PR
fd -a 'filecoin_eam_statedecodeparams_*.rpcsnap.json.zst'
# 2) Inspect API compare tests mention of EAM across versions
rg -n -C2 'EAM|BuiltinActor::EAM|StateDecodeParams' src/tool/subcommands/api_cmdLength of output: 40337
Add API tests for EAM StateDecodeParams on pre-v16 and include missing snapshots
The macro in src/lotus_json/actor_states/methods/eam_params.rs correctly generates handlers for v10 through v16, but:
- No new snapshot files matching
filecoin_eam_statedecodeparams_*.rpcsnap.json.zstwere added by this PR. - The existing API compare tests in
src/tool/subcommands/api_cmd/api_compare_tests.rsonly exercise
fil_actor_eam_state::v16::Method::{Constructor, Create, Create2, CreateExternal}.
To catch regressions in earlier versions (v10–v15), please:
- Add at least one API compare test for a representative pre-v16 version (e.g. v10) of the EAM actor. For example:
RpcTest::identity(StateDecodeParams::request(( Address::ETHEREUM_ACCOUNT_MANAGER_ACTOR, fil_actor_eam_state::v10::Method::Create as u64, tipset.key().into(), )))?,
- Generate and commit the corresponding snapshot (e.g.
filecoin_eam_statedecodeparams_v10.rpcsnap.json.zst) under the same fixtures directory. - (Optional) Parameterize the API compare tests over versions v10–v16 to streamline full coverage.
Let me know if you’d like help drafting the parametrized tests or snapshot commands.
There was a problem hiding this comment.
nit: It would be great to always keep versions in ascending order, rather than sometimes descending. Keeping this uniform makes reading code more easy.
There was a problem hiding this comment.
@elmattic Good catch! You're absolutely right - keeping version numbers in ascending order (10, 11, 12, 13, 14, 15, 16) would be much more readable and consistent.
The macro calls on lines 149-151 should be changed from:
impl_eam_create_params!(16, 15, 14, 13, 12, 11, 10);
impl_eam_create2_params!(16, 15, 14, 13, 12, 11, 10);
impl_eam_create_external_params!(16, 15, 14, 13, 12, 11, 10);To:
impl_eam_create_params!(10, 11, 12, 13, 14, 15, 16);
impl_eam_create2_params!(10, 11, 12, 13, 14, 15, 16);
impl_eam_create_external_params!(10, 11, 12, 13, 14, 15, 16);This makes it easier to scan and understand the version progression at a glance.
🐰✨
✏️ Learnings added
Learnt from: elmattic
PR: ChainSafe/forest#5994
File: src/lotus_json/actor_states/methods/eam_params.rs:150-152
Timestamp: 2025-09-02T14:01:57.720Z
Learning: In Forest codebase, version numbers should be listed in ascending order (10, 11, 12, 13, 14, 15, 16) rather than descending order for better readability and consistency.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
There was a problem hiding this comment.
Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!
…ctor-state-decode-param
…ctor-state-decode-param
Summary of changes
Changes introduced in this pull request:
Reference issue to close (if applicable)
Closes #5991
Other information and links
Change checklist
Summary by CodeRabbit
New Features
Tests