Skip to content
Snippets Groups Projects
rpc.rs 3.52 KiB
Newer Older
// Copyright 2021 Axiom-Team
//
// This file is part of Substrate-Libre-Currency.
//
// Substrate-Libre-Currency is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// Substrate-Libre-Currency is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>.

Dan Forbes's avatar
Dan Forbes committed
//! A collection of node-specific RPC methods.
//! Substrate provides the `sc-rpc` crate, which defines the core RPC layer
//! used by Substrate nodes. This file extends those RPC definitions with
//! capabilities that are specific to this project's runtime configuration.

#![warn(missing_docs)]

Pascal Engélibert's avatar
Pascal Engélibert committed
pub use sc_rpc_api::DenyUnsafe;

use common_runtime::Block;
use common_runtime::{AccountId, Balance, Index};
use sc_consensus_manual_seal::rpc::{ManualSeal, ManualSealApi};
use sc_transaction_pool_api::TransactionPool;
Dan Forbes's avatar
Dan Forbes committed
use sp_api::ProvideRuntimeApi;
use sp_block_builder::BlockBuilder;
Pascal Engélibert's avatar
Pascal Engélibert committed
use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata};
use std::sync::Arc;
Dan Forbes's avatar
Dan Forbes committed

/// Full client dependencies.
pub struct FullDeps<C, P> {
Pascal Engélibert's avatar
Pascal Engélibert committed
    /// The client instance to use.
    pub client: Arc<C>,
    /// Transaction pool instance.
    pub pool: Arc<P>,
    /// Whether to deny unsafe calls
    pub deny_unsafe: DenyUnsafe,
    /// Manual seal command sink
    pub command_sink_opt: Option<
        futures::channel::mpsc::Sender<sc_consensus_manual_seal::EngineCommand<sp_core::H256>>,
    >,
Dan Forbes's avatar
Dan Forbes committed
}

/// Instantiate all full RPC extensions.
pub fn create_full<C, P>(
    deps: FullDeps<C, P>,
) -> Result<jsonrpc_core::IoHandler<sc_rpc_api::Metadata>, Box<dyn std::error::Error + Send + Sync>>
Pascal Engélibert's avatar
Pascal Engélibert committed
where
    C: ProvideRuntimeApi<Block>,
    C: HeaderBackend<Block> + HeaderMetadata<Block, Error = BlockChainError> + 'static,
    C: Send + Sync + 'static,
    C::Api: substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>,
    C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,
    C::Api: BlockBuilder<Block>,
    P: TransactionPool + 'static,
Pascal Engélibert's avatar
Pascal Engélibert committed
    use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi};
    use substrate_frame_rpc_system::{FullSystem, SystemApi};
Pascal Engélibert's avatar
Pascal Engélibert committed
    let mut io = jsonrpc_core::IoHandler::default();
    let FullDeps {
        client,
        pool,
        deny_unsafe,
        command_sink_opt,
Pascal Engélibert's avatar
Pascal Engélibert committed
    } = deps;
Pascal Engélibert's avatar
Pascal Engélibert committed
    io.extend_with(SystemApi::to_delegate(FullSystem::new(
        client.clone(),
        pool,
        deny_unsafe,
    )));
Pascal Engélibert's avatar
Pascal Engélibert committed
    io.extend_with(TransactionPaymentApi::to_delegate(TransactionPayment::new(
Éloïs's avatar
Éloïs committed
        client,
Pascal Engélibert's avatar
Pascal Engélibert committed
    )));
    if let Some(command_sink) = command_sink_opt {
        io.extend_with(
            // We provide the rpc handler with the sending end of the channel to allow the rpc
            // send EngineCommands to the background block authorship task.
            ManualSealApi::to_delegate(ManualSeal::new(command_sink)),
        );
    };

Pascal Engélibert's avatar
Pascal Engélibert committed
    // Extend this RPC with a custom API by using the following syntax.
    // `YourRpcStruct` should have a reference to a client, which is needed
    // to call into the runtime.
    // `io.extend_with(YourRpcTrait::to_delegate(YourRpcStruct::new(ReferenceToClient, ...)));`