mithril_aggregator/dependency_injection/builder/enablers/
epoch.rs

1use std::sync::Arc;
2use tokio::sync::RwLock;
3
4use mithril_protocol_config::{
5    http::HttpMithrilNetworkConfigurationProvider, interface::MithrilNetworkConfigurationProvider,
6};
7
8use crate::dependency_injection::{DependenciesBuilder, EpochServiceWrapper, Result};
9use crate::get_dependency;
10use crate::services::{
11    EpochServiceDependencies, LocalMithrilNetworkConfigurationProvider, MithrilEpochService,
12};
13
14impl DependenciesBuilder {
15    async fn build_epoch_service(&mut self) -> Result<EpochServiceWrapper> {
16        let verification_key_store = self.get_verification_key_store().await?;
17        let epoch_settings_storer = self.get_epoch_settings_store().await?;
18        let chain_observer = self.get_chain_observer().await?;
19        let era_checker = self.get_era_checker().await?;
20        let stake_store = self.get_stake_store().await?;
21        let allowed_discriminants = self
22            .configuration
23            .compute_allowed_signed_entity_types_discriminants()?;
24
25        let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(
26            EpochServiceDependencies::new(
27                self.get_mithril_network_configuration_provider().await?,
28                epoch_settings_storer,
29                verification_key_store,
30                chain_observer,
31                era_checker,
32                stake_store,
33            ),
34            allowed_discriminants,
35            self.root_logger(),
36        )));
37
38        Ok(epoch_service)
39    }
40
41    /// [EpochService][crate::services::EpochService] service
42    pub async fn get_epoch_service(&mut self) -> Result<EpochServiceWrapper> {
43        get_dependency!(self.epoch_service)
44    }
45
46    async fn build_mithril_network_configuration_provider(
47        &mut self,
48    ) -> Result<Arc<dyn MithrilNetworkConfigurationProvider>> {
49        let network_configuration_provider: Arc<dyn MithrilNetworkConfigurationProvider> =
50            if self.configuration.is_follower_aggregator() {
51                Arc::new(HttpMithrilNetworkConfigurationProvider::new(
52                    self.get_leader_aggregator_client().await?,
53                ))
54            } else {
55                Arc::new(LocalMithrilNetworkConfigurationProvider::new(
56                    self.configuration
57                        .get_leader_aggregator_epoch_settings_configuration()?,
58                    self.configuration
59                        .compute_allowed_signed_entity_types_discriminants()?,
60                    self.get_epoch_settings_store().await?,
61                ))
62            };
63
64        Ok(network_configuration_provider)
65    }
66
67    /// [MithrilNetworkConfigurationProvider][mithril_protocol_config::interface::MithrilNetworkConfigurationProvider] service
68    pub async fn get_mithril_network_configuration_provider(
69        &mut self,
70    ) -> Result<Arc<dyn MithrilNetworkConfigurationProvider>> {
71        get_dependency!(self.mithril_network_configuration_provider)
72    }
73}