domain_service/
providers.rs

1use crate::rpc::FullDeps;
2use crate::FullClient;
3use domain_runtime_primitives::{Balance, Nonce};
4use jsonrpsee::RpcModule;
5use parity_scale_codec::{Decode, Encode};
6use sc_client_api::{AuxStore, Backend, BlockBackend, StorageProvider};
7use sc_consensus::BlockImport;
8use sc_rpc::SubscriptionTaskExecutor;
9use sc_rpc_server::SubscriptionIdProvider;
10use sc_transaction_pool::ChainApi;
11use sc_transaction_pool_api::TransactionPool;
12use serde::de::DeserializeOwned;
13use sp_api::{ApiExt, ConstructRuntimeApi, Core, ProvideRuntimeApi};
14use sp_block_builder::BlockBuilder;
15use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata};
16use sp_core::traits::SpawnEssentialNamed;
17use sp_runtime::traits::Block as BlockT;
18use std::error::Error;
19use std::fmt::{Debug, Display};
20use std::sync::Arc;
21use substrate_frame_rpc_system::AccountNonceApi;
22
23pub trait BlockImportProvider<Block: BlockT, Client>
24where
25    Client: ProvideRuntimeApi<Block>,
26{
27    type BI: BlockImport<Block, Error = sp_consensus::Error> + Send + Sync + 'static;
28    fn block_import(&self, client: Arc<Client>) -> Self::BI;
29}
30
31#[derive(Clone, Default)]
32pub struct DefaultProvider;
33
34impl<Block, RuntimeApi> BlockImportProvider<Block, FullClient<Block, RuntimeApi>>
35    for DefaultProvider
36where
37    Block: BlockT,
38    RuntimeApi: ConstructRuntimeApi<Block, FullClient<Block, RuntimeApi>> + Send + Sync + 'static,
39    RuntimeApi::RuntimeApi: ApiExt<Block> + Core<Block>,
40{
41    type BI = Arc<FullClient<Block, RuntimeApi>>;
42
43    fn block_import(&self, client: Arc<FullClient<Block, RuntimeApi>>) -> Self::BI {
44        client
45    }
46}
47
48/// Provides adding custom ID to the RPC module.
49pub trait RpcProvider<Block, Client, TxPool, CA, BE, AccountId, CIDP>
50where
51    Block: BlockT,
52    Client: ProvideRuntimeApi<Block> + StorageProvider<Block, BE>,
53    Client::Api: AccountNonceApi<Block, AccountId, Nonce>,
54    TxPool: TransactionPool<Block = Block> + Sync + Send + 'static,
55    CA: ChainApi<Block = Block> + 'static,
56    BE: Backend<Block> + 'static,
57    AccountId: DeserializeOwned + Encode + Debug + Decode + Display + Clone + Sync + Send + 'static,
58{
59    type Deps: Clone;
60
61    #[expect(clippy::result_large_err, reason = "Comes from Substrate")]
62    fn deps(
63        &self,
64        full_deps: FullDeps<Block, Client, TxPool, CA, BE, CIDP>,
65    ) -> Result<Self::Deps, sc_service::Error>;
66
67    fn rpc_id(&self) -> Option<Box<dyn SubscriptionIdProvider>>;
68
69    fn rpc_builder<SE>(
70        &self,
71        deps: Self::Deps,
72        subscription_task_executor: SubscriptionTaskExecutor,
73        essential_task_spawner: SE,
74    ) -> Result<RpcModule<()>, Box<dyn Error + Send + Sync>>
75    where
76        SE: SpawnEssentialNamed + Clone;
77}
78
79impl<Block, Client, BE, TxPool, CA, AccountId, CIDP>
80    RpcProvider<Block, Client, TxPool, CA, BE, AccountId, CIDP> for DefaultProvider
81where
82    Block: BlockT,
83    Client: ProvideRuntimeApi<Block>
84        + BlockBackend<Block>
85        + HeaderBackend<Block>
86        + AuxStore
87        + HeaderMetadata<Block, Error = BlockChainError>
88        + StorageProvider<Block, BE>
89        + Send
90        + Sync
91        + 'static,
92    Client::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>
93        + AccountNonceApi<Block, AccountId, Nonce>
94        + BlockBuilder<Block>,
95    TxPool: TransactionPool<Block = Block> + Sync + Send + 'static,
96    CA: ChainApi<Block = Block> + 'static,
97    BE: Backend<Block> + 'static,
98    AccountId: DeserializeOwned + Encode + Debug + Decode + Display + Clone + Sync + Send + 'static,
99    CIDP: Clone,
100{
101    type Deps = FullDeps<Block, Client, TxPool, CA, BE, CIDP>;
102
103    fn deps(
104        &self,
105        full_deps: FullDeps<Block, Client, TxPool, CA, BE, CIDP>,
106    ) -> Result<Self::Deps, sc_service::Error> {
107        Ok(full_deps)
108    }
109
110    fn rpc_id(&self) -> Option<Box<dyn SubscriptionIdProvider>> {
111        None
112    }
113
114    fn rpc_builder<SE>(
115        &self,
116        deps: Self::Deps,
117        _subscription_task_executor: SubscriptionTaskExecutor,
118        _essential_task_spawner: SE,
119    ) -> Result<RpcModule<()>, Box<dyn Error + Send + Sync>>
120    where
121        SE: SpawnEssentialNamed + Clone,
122    {
123        crate::rpc::create_full::<_, _, _, _, AccountId, BE, CIDP>(deps)
124    }
125}