diff --git a/CHANGELOG.md b/CHANGELOG.md
index 97fff86f534e..1719f009c10c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -41,7 +41,6 @@
- [#6014](https://github.com/ChainSafe/forest/pull/6014) Removed `unordered-graph-traversal` from `forest-tool benchmark`.
-
### Fixed
## Forest v0.29.0 "Fëanor"
diff --git a/src/lotus_json/actor_states/methods/mod.rs b/src/lotus_json/actor_states/methods/mod.rs
index 0e66dd969862..43f5957b5e8b 100644
--- a/src/lotus_json/actor_states/methods/mod.rs
+++ b/src/lotus_json/actor_states/methods/mod.rs
@@ -12,6 +12,7 @@ mod init_exec4_params;
mod init_exec_params;
mod miner_actor_params;
mod multisig_actor;
+mod paych_params;
mod power_actor;
mod reward_methods;
pub mod verified_reg_actor;
diff --git a/src/lotus_json/actor_states/methods/paych_params.rs b/src/lotus_json/actor_states/methods/paych_params.rs
new file mode 100644
index 000000000000..42901f7dc381
--- /dev/null
+++ b/src/lotus_json/actor_states/methods/paych_params.rs
@@ -0,0 +1,546 @@
+// Copyright 2019-2025 ChainSafe Systems
+// SPDX-License-Identifier: Apache-2.0, MIT
+
+use super::*;
+use crate::shim::address::Address;
+use crate::shim::clock::ChainEpoch;
+use crate::shim::econ::TokenAmount;
+use fvm_ipld_encoding::RawBytes;
+use paste::paste;
+use schemars::JsonSchema;
+use serde::{Deserialize, Serialize};
+
+#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)]
+#[serde(rename_all = "PascalCase")]
+pub struct ConstructorParamsLotusJson {
+ #[schemars(with = "LotusJson
")]
+ #[serde(with = "crate::lotus_json")]
+ pub from: Address,
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub to: Address,
+}
+
+#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)]
+#[serde(rename_all = "PascalCase")]
+pub struct ModVerifyParamsLotusJson {
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub actor: Address,
+ pub method: u64,
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub data: RawBytes,
+}
+
+#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)]
+#[serde(rename_all = "PascalCase")]
+pub struct MergeLotusJson {
+ pub lane: u64,
+ pub nonce: u64,
+}
+
+// Version-specific structs for different FVM versions to avoid conversion issues
+#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)]
+#[serde(rename_all = "PascalCase")]
+pub struct SignedVoucherV2LotusJson {
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub channel_addr: Address,
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub time_lock_min: ChainEpoch,
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub time_lock_max: ChainEpoch,
+ #[schemars(with = "LotusJson>")]
+ #[serde(with = "crate::lotus_json", rename = "SecretHash")]
+ pub secret_pre_image: Vec,
+ pub extra: Option,
+ pub lane: u64,
+ pub nonce: u64,
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub amount: TokenAmount,
+ #[schemars(with = "LotusJson")]
+ #[serde(with = "crate::lotus_json")]
+ pub min_settle_height: ChainEpoch,
+ // Lotus returns null (not []) when there are no merges; model as Option, so None means empty.
+ pub merges: Option>,
+ #[schemars(with = "LotusJson