diff --git a/beacon_node/http_api/src/lib.rs b/beacon_node/http_api/src/lib.rs index 66c87efb8..da3bb595c 100644 --- a/beacon_node/http_api/src/lib.rs +++ b/beacon_node/http_api/src/lib.rs @@ -40,7 +40,7 @@ use tokio::sync::mpsc::UnboundedSender; use tokio_stream::{wrappers::BroadcastStream, StreamExt}; use types::{ Attestation, AttesterSlashing, BeaconStateError, CommitteeCache, ConfigAndPreset, Epoch, - EthSpec, ProposerSlashing, RelativeEpoch, SignedAggregateAndProof, SignedBeaconBlock, + EthSpec, ForkName, ProposerSlashing, RelativeEpoch, SignedAggregateAndProof, SignedBeaconBlock, SignedContributionAndProof, SignedVoluntaryExit, Slot, SyncCommitteeMessage, SyncContributionData, }; @@ -1366,7 +1366,7 @@ pub fn serve( ); /* - * config/fork_schedule + * config */ let config_path = eth1_v1.and(warp::path("config")); @@ -1378,9 +1378,11 @@ pub fn serve( .and(chain_filter.clone()) .and_then(|chain: Arc>| { blocking_json_task(move || { - StateId::head() - .fork(&chain) - .map(|fork| api_types::GenericResponse::from(vec![fork])) + let forks = ForkName::list_all() + .into_iter() + .filter_map(|fork_name| chain.spec.fork_for_name(fork_name)) + .collect::>(); + Ok(api_types::GenericResponse::from(forks)) }) }); diff --git a/beacon_node/http_api/src/state_id.rs b/beacon_node/http_api/src/state_id.rs index 8b52e4815..95c049d99 100644 --- a/beacon_node/http_api/src/state_id.rs +++ b/beacon_node/http_api/src/state_id.rs @@ -8,10 +8,6 @@ use types::{BeaconState, EthSpec, Fork, Hash256, Slot}; pub struct StateId(CoreStateId); impl StateId { - pub fn head() -> Self { - Self(CoreStateId::Head) - } - pub fn slot(slot: Slot) -> Self { Self(CoreStateId::Slot(slot)) } diff --git a/beacon_node/http_api/tests/tests.rs b/beacon_node/http_api/tests/tests.rs index 21e52b92b..87f3ef4f6 100644 --- a/beacon_node/http_api/tests/tests.rs +++ b/beacon_node/http_api/tests/tests.rs @@ -1190,7 +1190,10 @@ impl ApiTester { pub async fn test_get_config_fork_schedule(self) -> Self { let result = self.client.get_config_fork_schedule().await.unwrap().data; - let expected = vec![self.chain.head_info().unwrap().fork]; + let expected: Vec = ForkName::list_all() + .into_iter() + .filter_map(|fork| self.chain.spec.fork_for_name(fork)) + .collect(); assert_eq!(result, expected); diff --git a/consensus/types/src/chain_spec.rs b/consensus/types/src/chain_spec.rs index 14320f871..dfa8775b2 100644 --- a/consensus/types/src/chain_spec.rs +++ b/consensus/types/src/chain_spec.rs @@ -237,6 +237,19 @@ impl ChainSpec { } } + /// Returns a full `Fork` struct for a given `ForkName` or `None` if the fork does not yet have + /// an activation epoch. + pub fn fork_for_name(&self, fork_name: ForkName) -> Option { + let previous_fork_name = fork_name.previous_fork().unwrap_or(ForkName::Base); + let epoch = self.fork_epoch(fork_name)?; + + Some(Fork { + previous_version: self.fork_version_for_name(previous_fork_name), + current_version: self.fork_version_for_name(fork_name), + epoch, + }) + } + /// Get the domain number, unmodified by the fork. /// /// Spec v0.12.1