From 0e568395802fa9657886a529192e2bc51993359c Mon Sep 17 00:00:00 2001 From: Quang Le Date: Wed, 24 Jun 2026 14:29:20 +0700 Subject: [PATCH] fix: impl From ConsensusVersion for DataVersion --- crates/eth2api/src/spec/version.rs | 38 +++++++++++++++------------- crates/eth2api/src/validator_duty.rs | 27 ++++++++------------ 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/crates/eth2api/src/spec/version.rs b/crates/eth2api/src/spec/version.rs index eb873485..d5676772 100644 --- a/crates/eth2api/src/spec/version.rs +++ b/crates/eth2api/src/spec/version.rs @@ -80,23 +80,6 @@ impl DataVersion { _ => Err(VersionError::UnknownDataVersion), } } - - /// Maps to the equivalent beacon API - /// [`ConsensusVersion`](crate::ConsensusVersion). - // TODO: change to From<&ConsensusVersion> after PR #454 - pub const fn to_consensus_version(self) -> Result { - use crate::ConsensusVersion; - match self { - DataVersion::Phase0 => Ok(ConsensusVersion::Phase0), - DataVersion::Altair => Ok(ConsensusVersion::Altair), - DataVersion::Bellatrix => Ok(ConsensusVersion::Bellatrix), - DataVersion::Capella => Ok(ConsensusVersion::Capella), - DataVersion::Deneb => Ok(ConsensusVersion::Deneb), - DataVersion::Electra => Ok(ConsensusVersion::Electra), - DataVersion::Fulu => Ok(ConsensusVersion::Fulu), - DataVersion::Unknown => Err(VersionError::UnknownDataVersion), - } - } } impl fmt::Display for DataVersion { @@ -121,6 +104,25 @@ impl From<&ConsensusVersion> for DataVersion { } } +impl TryFrom<&DataVersion> for ConsensusVersion { + type Error = VersionError; + + /// Maps a data version onto the equivalent beacon-node `ConsensusVersion`. + /// Fallible: `DataVersion::Unknown` has no consensus-version equivalent. + fn try_from(version: &DataVersion) -> Result { + match version { + DataVersion::Phase0 => Ok(ConsensusVersion::Phase0), + DataVersion::Altair => Ok(ConsensusVersion::Altair), + DataVersion::Bellatrix => Ok(ConsensusVersion::Bellatrix), + DataVersion::Capella => Ok(ConsensusVersion::Capella), + DataVersion::Deneb => Ok(ConsensusVersion::Deneb), + DataVersion::Electra => Ok(ConsensusVersion::Electra), + DataVersion::Fulu => Ok(ConsensusVersion::Fulu), + DataVersion::Unknown => Err(VersionError::UnknownDataVersion), + } + } +} + /// Builder API version. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -331,7 +333,7 @@ mod tests { expected: Option, expected_err: Option, ) { - match (version.to_consensus_version(), expected, expected_err) { + match (ConsensusVersion::try_from(&version), expected, expected_err) { (Ok(actual), Some(expected), None) => assert_eq!(actual, expected), (Err(err), None, Some(expected_err)) => assert_eq!(err, expected_err), _ => panic!("unexpected conversion result"), diff --git a/crates/eth2api/src/validator_duty.rs b/crates/eth2api/src/validator_duty.rs index cc2977c0..c29b4ae4 100644 --- a/crates/eth2api/src/validator_duty.rs +++ b/crates/eth2api/src/validator_duty.rs @@ -90,12 +90,12 @@ impl EthBeaconNodeApiClient { &self, attestations: Vec, ) -> Result<()> { - let version = attestations + let data_version = attestations .first() .map(|attestation| attestation.version) - .unwrap_or(versioned::DataVersion::Phase0) - .to_consensus_version() - .map_err(error_message)?; + .unwrap_or(versioned::DataVersion::Phase0); + let version: crate::ConsensusVersion = + crate::ConsensusVersion::try_from(&data_version).map_err(error_message)?; let body = attestations_request_body(attestations)?; let request = crate::SubmitPoolAttestationsV2Request { header: crate::SubmitPoolAttestationsV2RequestHeader { @@ -127,10 +127,8 @@ impl EthBeaconNodeApiClient { &self, proposal: versioned::VersionedSignedProposal, ) -> Result<()> { - let version = proposal - .version - .to_consensus_version() - .map_err(error_message)?; + let version = + crate::ConsensusVersion::try_from(&proposal.version).map_err(error_message)?; let body = proposal_request_body(proposal)?; let request = crate::PublishBlockV2Request { query: crate::PublishBlockV2RequestQuery { @@ -157,10 +155,8 @@ impl EthBeaconNodeApiClient { &self, proposal: versioned::VersionedSignedBlindedProposal, ) -> Result<()> { - let version = proposal - .version - .to_consensus_version() - .map_err(error_message)?; + let version = + crate::ConsensusVersion::try_from(&proposal.version).map_err(error_message)?; let body = blinded_proposal_request_body(proposal)?; let request = crate::PublishBlindedBlockV2Request { query: crate::PublishBlindedBlockV2RequestQuery { @@ -233,12 +229,11 @@ impl EthBeaconNodeApiClient { &self, aggregate_and_proofs: Vec, ) -> Result<()> { - let version = aggregate_and_proofs + let data_version = aggregate_and_proofs .first() .map(|aggregate| aggregate.version) - .unwrap_or(versioned::DataVersion::Phase0) - .to_consensus_version() - .map_err(error_message)?; + .unwrap_or(versioned::DataVersion::Phase0); + let version = crate::ConsensusVersion::try_from(&data_version).map_err(error_message)?; let body = aggregate_and_proofs_request_body(aggregate_and_proofs)?; let request = crate::PublishAggregateAndProofsV2Request { header: crate::PublishAggregateAndProofsV2RequestHeader {