1#![warn(missing_docs)]
20
21use std::sync::Arc;
22
23use jsonrpsee::RpcModule;
24use pezkuwi_primitives::{AccountId, Balance, Block, BlockNumber, Hash, Nonce};
25use pezsc_client_api::AuxStore;
26use pezsc_consensus_beefy::communication::notification::{
27 BeefyBestBlockStream, BeefyVersionedFinalityProofStream,
28};
29use pezsc_consensus_grandpa::FinalityProofProvider;
30pub use pezsc_rpc::SubscriptionTaskExecutor;
31use pezsc_transaction_pool_api::TransactionPool;
32use pezsp_api::ProvideRuntimeApi;
33use pezsp_application_crypto::RuntimeAppPublic;
34use pezsp_block_builder::BlockBuilder;
35use pezsp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata};
36use pezsp_consensus::SelectChain;
37use pezsp_consensus_babe::BabeApi;
38use pezsp_consensus_beefy::AuthorityIdBound;
39use pezsp_keystore::KeystorePtr;
40
41pub type RpcExtension = RpcModule<()>;
43
44pub struct BabeDeps {
46 pub babe_worker_handle: pezsc_consensus_babe::BabeWorkerHandle<Block>,
48 pub keystore: KeystorePtr,
50}
51
52pub struct GrandpaDeps<B> {
54 pub shared_voter_state: pezsc_consensus_grandpa::SharedVoterState,
56 pub shared_authority_set: pezsc_consensus_grandpa::SharedAuthoritySet<Hash, BlockNumber>,
58 pub justification_stream: pezsc_consensus_grandpa::GrandpaJustificationStream<Block>,
60 pub subscription_executor: pezsc_rpc::SubscriptionTaskExecutor,
62 pub finality_provider: Arc<FinalityProofProvider<B, Block>>,
64}
65
66pub struct BeefyDeps<AuthorityId: AuthorityIdBound> {
68 pub beefy_finality_proof_stream: BeefyVersionedFinalityProofStream<Block, AuthorityId>,
70 pub beefy_best_block_stream: BeefyBestBlockStream<Block>,
72 pub subscription_executor: pezsc_rpc::SubscriptionTaskExecutor,
74}
75
76pub struct FullDeps<C, P, SC, B, AuthorityId: AuthorityIdBound> {
78 pub client: Arc<C>,
80 pub pool: Arc<P>,
82 pub select_chain: SC,
84 pub chain_spec: Box<dyn pezsc_chain_spec::ChainSpec>,
86 pub babe: BabeDeps,
88 pub grandpa: GrandpaDeps<B>,
90 pub beefy: BeefyDeps<AuthorityId>,
92 pub backend: Arc<B>,
94}
95
96pub fn create_full<C, P, SC, B, AuthorityId>(
98 FullDeps { client, pool, select_chain, chain_spec, babe, grandpa, beefy, backend }: FullDeps<
99 C,
100 P,
101 SC,
102 B,
103 AuthorityId,
104 >,
105) -> Result<RpcExtension, Box<dyn std::error::Error + Send + Sync>>
106where
107 C: ProvideRuntimeApi<Block>
108 + HeaderBackend<Block>
109 + AuxStore
110 + HeaderMetadata<Block, Error = BlockChainError>
111 + Send
112 + Sync
113 + 'static,
114 C::Api: bizinikiwi_frame_rpc_system::AccountNonceApi<Block, AccountId, Nonce>,
115 C::Api: pezmmr_rpc::MmrRuntimeApi<
116 Block,
117 <Block as pezsp_runtime::traits::Block>::Hash,
118 BlockNumber,
119 >,
120 C::Api: pezpallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,
121 C::Api: BabeApi<Block>,
122 C::Api: BlockBuilder<Block>,
123 P: TransactionPool + Sync + Send + 'static,
124 SC: SelectChain<Block> + 'static,
125 B: pezsc_client_api::Backend<Block> + Send + Sync + 'static,
126 B::State: pezsc_client_api::StateBackend<pezsp_runtime::traits::HashingFor<Block>>,
127 AuthorityId: AuthorityIdBound,
128 <AuthorityId as RuntimeAppPublic>::Signature: Send + Sync,
129{
130 use bizinikiwi_frame_rpc_system::{System, SystemApiServer};
131 use bizinikiwi_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer};
132 use pezmmr_rpc::{Mmr, MmrApiServer};
133 use pezpallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer};
134 use pezsc_consensus_babe_rpc::{Babe, BabeApiServer};
135 use pezsc_consensus_beefy_rpc::{Beefy, BeefyApiServer};
136 use pezsc_consensus_grandpa_rpc::{Grandpa, GrandpaApiServer};
137 use pezsc_sync_state_rpc::{SyncState, SyncStateApiServer};
138
139 let mut io = RpcModule::new(());
140 let BabeDeps { babe_worker_handle, keystore } = babe;
141 let GrandpaDeps {
142 shared_voter_state,
143 shared_authority_set,
144 justification_stream,
145 subscription_executor,
146 finality_provider,
147 } = grandpa;
148
149 io.merge(StateMigration::new(client.clone(), backend.clone()).into_rpc())?;
150 io.merge(System::new(client.clone(), pool.clone()).into_rpc())?;
151 io.merge(TransactionPayment::new(client.clone()).into_rpc())?;
152 io.merge(
153 Mmr::new(
154 client.clone(),
155 backend
156 .offchain_storage()
157 .ok_or("Backend doesn't provide the required offchain storage")?,
158 )
159 .into_rpc(),
160 )?;
161 io.merge(
162 Babe::new(client.clone(), babe_worker_handle.clone(), keystore, select_chain).into_rpc(),
163 )?;
164 io.merge(
165 Grandpa::new(
166 subscription_executor,
167 shared_authority_set.clone(),
168 shared_voter_state,
169 justification_stream,
170 finality_provider,
171 )
172 .into_rpc(),
173 )?;
174 io.merge(
175 SyncState::new(chain_spec, client, shared_authority_set, babe_worker_handle)?.into_rpc(),
176 )?;
177
178 io.merge(
179 Beefy::<Block, AuthorityId>::new(
180 beefy.beefy_finality_proof_stream,
181 beefy.beefy_best_block_stream,
182 beefy.subscription_executor,
183 )?
184 .into_rpc(),
185 )?;
186
187 Ok(io)
188}