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
48pub 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}