mithril_aggregator/dependency_injection/builder/protocol/
signables.rs

1use std::sync::Arc;
2
3use mithril_cardano_node_chain::chain_importer::CardanoChainDataImporter;
4use mithril_cardano_node_internal_database::signable_builder::{
5    CardanoDatabaseSignableBuilder, CardanoImmutableFilesFullSignableBuilder,
6};
7use mithril_common::crypto_helper::MKTreeStoreInMemory;
8use mithril_common::signable_builder::{
9    CardanoBlocksTransactionsSignableBuilder, CardanoStakeDistributionSignableBuilder,
10    CardanoTransactionsSignableBuilder, MithrilSignableBuilderService,
11    MithrilStakeDistributionSignableBuilder, SignableBuilderService,
12    SignableBuilderServiceDependencies, SignableSeedBuilder,
13};
14
15use crate::dependency_injection::{DependenciesBuilder, Result};
16use crate::get_dependency;
17use crate::services::{AggregatorChainDataImporter, AggregatorSignableSeedBuilder};
18
19impl DependenciesBuilder {
20    async fn build_signable_builder_service(&mut self) -> Result<Arc<dyn SignableBuilderService>> {
21        let seed_signable_builder = self.get_signable_seed_builder().await?;
22        let mithril_stake_distribution_builder =
23            Arc::new(MithrilStakeDistributionSignableBuilder::default());
24        let immutable_signable_builder = Arc::new(CardanoImmutableFilesFullSignableBuilder::new(
25            self.get_immutable_digester().await?,
26            &self.configuration.db_directory(),
27            self.root_logger(),
28        ));
29        let transaction_importer = self.get_chain_data_importer().await?;
30        let block_range_root_retriever = self.get_chain_data_repository().await?;
31        let cardano_transactions_builder = Arc::new(CardanoTransactionsSignableBuilder::<
32            MKTreeStoreInMemory,
33        >::new(
34            transaction_importer.clone(),
35            block_range_root_retriever.clone(),
36        ));
37        let cardano_blocks_transactions_builder =
38            Arc::new(CardanoBlocksTransactionsSignableBuilder::<
39                MKTreeStoreInMemory,
40            >::new(
41                transaction_importer, block_range_root_retriever
42            ));
43        let cardano_stake_distribution_builder = Arc::new(
44            CardanoStakeDistributionSignableBuilder::new(self.get_stake_store().await?),
45        );
46        let cardano_database_signable_builder = Arc::new(CardanoDatabaseSignableBuilder::new(
47            self.get_immutable_digester().await?,
48            &self.configuration.db_directory(),
49            self.root_logger(),
50        ));
51        let signable_builders_dependencies = SignableBuilderServiceDependencies::new(
52            mithril_stake_distribution_builder,
53            immutable_signable_builder,
54            cardano_transactions_builder,
55            cardano_blocks_transactions_builder,
56            cardano_stake_distribution_builder,
57            cardano_database_signable_builder,
58        );
59        let signable_builder_service = Arc::new(MithrilSignableBuilderService::new(
60            seed_signable_builder,
61            signable_builders_dependencies,
62            self.root_logger(),
63        ));
64
65        Ok(signable_builder_service)
66    }
67
68    /// [SignableBuilderService] service
69    pub async fn get_signable_builder_service(
70        &mut self,
71    ) -> Result<Arc<dyn SignableBuilderService>> {
72        get_dependency!(self.signable_builder_service)
73    }
74
75    async fn build_signable_seed_builder(&mut self) -> Result<Arc<dyn SignableSeedBuilder>> {
76        let signable_seed_builder_service = Arc::new(AggregatorSignableSeedBuilder::new(
77            self.get_epoch_service().await?,
78        ));
79
80        Ok(signable_seed_builder_service)
81    }
82
83    /// [SignableSeedBuilder] service
84    pub async fn get_signable_seed_builder(&mut self) -> Result<Arc<dyn SignableSeedBuilder>> {
85        get_dependency!(self.signable_seed_builder)
86    }
87
88    async fn build_chain_data_importer(&mut self) -> Result<Arc<AggregatorChainDataImporter>> {
89        let chain_data_importer = Arc::new(CardanoChainDataImporter::new(
90            self.get_block_scanner().await?,
91            self.get_chain_data_repository().await?,
92            self.root_logger(),
93        ));
94
95        Ok(Arc::new(AggregatorChainDataImporter::new(
96            chain_data_importer,
97        )))
98    }
99
100    /// Get the [AggregatorChainDataImporter] instance
101    pub async fn get_chain_data_importer(&mut self) -> Result<Arc<AggregatorChainDataImporter>> {
102        get_dependency!(self.chain_data_importer)
103    }
104}