From 7cecff6c07bd2f8a87a6dd4c82ea49d5f665f63f Mon Sep 17 00:00:00 2001 From: hopinheimer Date: Sat, 21 Feb 2026 13:02:57 -0500 Subject: [PATCH 1/2] fork-aware ssz decode --- .../types/src/attestation/attestation.rs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/consensus/types/src/attestation/attestation.rs b/consensus/types/src/attestation/attestation.rs index 693b5889f53..8e072696dab 100644 --- a/consensus/types/src/attestation/attestation.rs +++ b/consensus/types/src/attestation/attestation.rs @@ -19,7 +19,7 @@ use crate::{ IndexedAttestationElectra, }, core::{ChainSpec, Domain, EthSpec, Hash256, SignedRoot, Slot, SlotData}, - fork::{Fork, ForkName}, + fork::{Fork, ForkName, ForkVersionDecode}, test_utils::TestRandom, }; @@ -582,6 +582,26 @@ impl<'de, E: EthSpec> ContextDeserialize<'de, ForkName> for Attestation { } } +impl Attestation { + /// SSZ decode with explicit fork variant. + pub fn from_ssz_bytes_for_fork( + bytes: &[u8], + fork_name: ForkName, + ) -> Result { + if fork_name.electra_enabled() { + ssz::Decode::from_ssz_bytes(bytes).map(Self::Electra) + } else { + ssz::Decode::from_ssz_bytes(bytes).map(Self::Base) + } + } +} + +impl ForkVersionDecode for Attestation { + fn from_ssz_bytes_by_fork(bytes: &[u8], fork_name: ForkName) -> Result { + Self::from_ssz_bytes_for_fork(bytes, fork_name) + } +} + /* impl<'de, E: EthSpec> ContextDeserialize<'de, ForkName> for Vec> { fn context_deserialize( From 52f28a9d8cf5aa4f62b6fc8c9ca0792b09cbf17d Mon Sep 17 00:00:00 2001 From: hopinheimer Date: Sat, 21 Feb 2026 13:24:51 -0500 Subject: [PATCH 2/2] cleanup --- .../types/src/attestation/attestation.rs | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/consensus/types/src/attestation/attestation.rs b/consensus/types/src/attestation/attestation.rs index 8e072696dab..868615c0513 100644 --- a/consensus/types/src/attestation/attestation.rs +++ b/consensus/types/src/attestation/attestation.rs @@ -261,6 +261,17 @@ impl Attestation { Self::Electra(attn) => attn.get_aggregation_bits(), } } + + pub fn from_ssz_bytes_for_fork( + bytes: &[u8], + fork_name: ForkName, + ) -> Result { + if fork_name.electra_enabled() { + ssz::Decode::from_ssz_bytes(bytes).map(Self::Electra) + } else { + ssz::Decode::from_ssz_bytes(bytes).map(Self::Base) + } + } } impl AttestationRef<'_, E> { @@ -582,20 +593,6 @@ impl<'de, E: EthSpec> ContextDeserialize<'de, ForkName> for Attestation { } } -impl Attestation { - /// SSZ decode with explicit fork variant. - pub fn from_ssz_bytes_for_fork( - bytes: &[u8], - fork_name: ForkName, - ) -> Result { - if fork_name.electra_enabled() { - ssz::Decode::from_ssz_bytes(bytes).map(Self::Electra) - } else { - ssz::Decode::from_ssz_bytes(bytes).map(Self::Base) - } - } -} - impl ForkVersionDecode for Attestation { fn from_ssz_bytes_by_fork(bytes: &[u8], fork_name: ForkName) -> Result { Self::from_ssz_bytes_for_fork(bytes, fork_name)