use std::sync::Arc; use jsonrpsee::RpcModule; use primitives::{ AccountId, Balance, Block, BlockNumber, Hash, Nonce, }; use sc_client_api::AuxStore; use grandpa::FinalityProofProvider; pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; use sp_api::ProvideRuntimeApi; use block_builder_api::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; use consensus_common::SelectChain; use babe_primitives::BabeApi; use sp_keystore::KeystorePtr; use tx_pool_api::TransactionPool; /// A type representing all RPC extensions. pub type RpcExtension = RpcModule<()>; /// Extra dependencies for BABE. pub struct BabeDeps { /// A handle to the BABE worker for issuing requests. pub babe_worker_handle: babe::BabeWorkerHandle, /// The keystore that manages the keys of the node. pub keystore: KeystorePtr, } /// Extra dependencies for GRANDPA. pub struct GrandpaDeps { /// Voting round info. pub shared_voter_state: grandpa::SharedVoterState, /// Authority set info. pub shared_authority_set: grandpa::SharedAuthoritySet, /// Receives notifications about justification events from GRANDPA, pub justification_stream: grandpa::GrandpaJustificationStream, /// Subscription manager to keep track of pubsub subscribers. pub subscription_executor: sc_rpc::SubscriptionTaskExecutor, /// Finality proof provider. pub finality_provider: Arc>, } /// Full client dependencies pub struct FullDeps { /// The client instance to use. pub client: Arc, /// Transaction pool instance. pub pool: Arc

, /// The [`SelectChain`] Strategy pub select_chain: SC, /// A copy of the chain spec. pub chain_spec: Box, /// Whether to deny unsafe calls. pub deny_unsafe: DenyUnsafe, /// BABE specific dependencies pub babe: BabeDeps, /// GRANDPA specific dependencies pub grandpa: GrandpaDeps, /// Backend used by the node. pub backend: Arc, } pub fn create_full_rpc( FullDeps { client, pool, select_chain, chain_spec, deny_unsafe, babe, grandpa, backend } : FullDeps, ) -> Result> where C: ProvideRuntimeApi + HeaderBackend + AuxStore + HeaderMetadata + Send + Sync + 'static, C::Api: frame_rpc_system::AccountNonceApi, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, C::Api: BlockBuilder, C::Api: BabeApi, P: TransactionPool + Sync + Send + 'static, SC: SelectChain + 'static, B: sc_client_api::Backend + Send + Sync + 'static, B::State: sc_client_api::StateBackend>, { use frame_rpc_system::{System, SystemApiServer}; use pallet_transaction_payment_rpc::{ TransactionPayment, TransactionPaymentApiServer, }; use babe_rpc::{Babe, BabeApiServer}; use grandpa_rpc::{Grandpa, GrandpaApiServer}; use sc_rpc_spec_v2::chain_spec::{ChainSpec, ChainSpecApiServer}; use sc_sync_state_rpc::{SyncState, SyncStateApiServer}; use substrate_state_trie_migration_rpc::{ StateMigration, StateMigrationApiServer, }; let mut io = RpcModule::new(()); let BabeDeps { babe_worker_handle, keystore } = babe; let GrandpaDeps { shared_voter_state, shared_authority_set, justification_stream, subscription_executor, finality_provider, } = grandpa; let chain_name = chain_spec.name().to_string(); let genesis_hash = client.hash(0).ok().flatten().expect("Genesis block exists; qed;"); let properties = chain_spec.properties(); io.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; io.merge(StateMigration::new(client.clone(), backend.clone(), deny_unsafe).into_rpc())?; io.merge(System::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?; io.merge(TransactionPayment::new(client.clone()).into_rpc())?; io.merge( Babe::new( client.clone(), babe_worker_handle.clone(), keystore, select_chain, deny_unsafe, ).into_rpc() )?; io.merge( Grandpa::new( subscription_executor, shared_authority_set.clone(), shared_voter_state, justification_stream, finality_provider, ).into_rpc(), )?; io.merge( SyncState::new( chain_spec, client.clone(), shared_authority_set, babe_worker_handle )?.into_rpc(), )?; Ok(io) }