From 9a878654e2a1a8395fb1352f1943bffd61af80a9 Mon Sep 17 00:00:00 2001 From: Joseph Patchen Date: Sun, 28 Dec 2025 22:29:19 -0800 Subject: [PATCH 1/3] feat: added timing specs to api --- consensus/types/src/core/config_and_preset.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/consensus/types/src/core/config_and_preset.rs b/consensus/types/src/core/config_and_preset.rs index 08141c77311..495efa07a03 100644 --- a/consensus/types/src/core/config_and_preset.rs +++ b/consensus/types/src/core/config_and_preset.rs @@ -141,6 +141,13 @@ pub fn get_extra_fields(spec: &ChainSpec) -> HashMap { "compounding_withdrawal_prefix".to_uppercase() => u8_hex(spec.compounding_withdrawal_prefix_byte), "unset_deposit_requests_start_index".to_uppercase() => spec.unset_deposit_requests_start_index.to_string().into(), "full_exit_request_amount".to_uppercase() => spec.full_exit_request_amount.to_string().into(), + // Time parameters + "slot_duration_ms".to_uppercase() => spec.slot_duration_ms.to_string().into(), + "proposer_reorg_cutoff_bps".to_uppercase() => spec.proposer_reorg_cutoff_bps.to_string().into(), + "attestation_due_bps".to_uppercase() => spec.attestation_due_bps.to_string().into(), + "aggregate_due_bps".to_uppercase() => spec.aggregate_due_bps.to_string().into(), + "contribution_due_bps".to_uppercase() => spec.contribution_due_bps.to_string().into(), + "sync_message_due_bps".to_uppercase() => spec.sync_message_due_bps.to_string().into(), } } From deef3a87b385b3add51c68ffca05c86572b68229 Mon Sep 17 00:00:00 2001 From: Joseph Patchen Date: Sun, 28 Dec 2025 22:48:23 -0800 Subject: [PATCH 2/3] unit tests --- consensus/types/src/core/config_and_preset.rs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/consensus/types/src/core/config_and_preset.rs b/consensus/types/src/core/config_and_preset.rs index 495efa07a03..18bd05c9c65 100644 --- a/consensus/types/src/core/config_and_preset.rs +++ b/consensus/types/src/core/config_and_preset.rs @@ -190,4 +190,25 @@ mod test { serde_yaml::from_reader(reader).expect("error while deserializing"); assert_eq!(ConfigAndPreset::Gloas(from), yamlconfig); } + + // This is not exhaustive, but it can be extended as new fields are added to the spec. + #[test] + fn test_required_spec_fields_exist() { + let mainnet_spec = ChainSpec::mainnet(); + let config = ConfigAndPreset::from_chain_spec::(&mainnet_spec); + let json = serde_json::to_value(&config).expect("should serialize"); + let obj = json.as_object().expect("should be an object"); + let required_fields = [ + "SLOT_DURATION_MS", + "PROPOSER_REORG_CUTOFF_BPS", + "ATTESTATION_DUE_BPS", + "AGGREGATE_DUE_BPS", + "CONTRIBUTION_DUE_BPS", + "SYNC_MESSAGE_DUE_BPS", + ]; + for field in required_fields { + assert!(obj.contains_key(field), "Missing required field: {}", field); + } + } } + From 6f29af7cd8ba9c7e3ef5a2f702e52e44d34e7674 Mon Sep 17 00:00:00 2001 From: Joseph Patchen Date: Sun, 28 Dec 2025 23:11:42 -0800 Subject: [PATCH 3/3] nit: format --- consensus/types/src/core/config_and_preset.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/consensus/types/src/core/config_and_preset.rs b/consensus/types/src/core/config_and_preset.rs index 18bd05c9c65..4b83112ca78 100644 --- a/consensus/types/src/core/config_and_preset.rs +++ b/consensus/types/src/core/config_and_preset.rs @@ -211,4 +211,3 @@ mod test { } } } -