-
Notifications
You must be signed in to change notification settings - Fork 13
/
rpc.rs
131 lines (112 loc) · 4.81 KB
/
rpc.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright 2021 Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Cumulus is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Cumulus 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 General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
//! Parachain-specific RPCs implementation.
#![warn(missing_docs)]
use std::sync::Arc;
use parachain_runtime::Moment;
use parachains_common::{AccountId, Balance, Block, BlockNumber, Index as Nonce};
use sc_client_api::AuxStore;
pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor};
use sc_transaction_pool_api::TransactionPool;
use sp_api::ProvideRuntimeApi;
use sp_block_builder::BlockBuilder;
use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata};
/// A type representing all RPC extensions.
pub type RpcExtension = jsonrpsee::RpcModule<()>;
/// Full client dependencies
pub struct FullDeps<C, P, Backend> {
/// The client instance to use.
pub client: Arc<C>,
/// Transaction pool instance.
pub pool: Arc<P>,
/// backend instance used to access offchain storage (added by encointer).
pub backend: Arc<Backend>,
/// whether offchain-indexing is enabled (added by encointer).
pub offchain_indexing_enabled: bool,
/// Whether to deny unsafe calls
pub deny_unsafe: DenyUnsafe,
}
/// Instantiate all RPC extensions.
pub fn create_full<C, P, TBackend>(
deps: FullDeps<C, P, TBackend>,
) -> Result<RpcExtension, Box<dyn std::error::Error + Send + Sync>>
where
C: ProvideRuntimeApi<Block>
+ HeaderBackend<Block>
+ AuxStore
+ HeaderMetadata<Block, Error = BlockChainError>
+ Send
+ Sync
+ 'static,
C::Api: frame_rpc_system::AccountNonceApi<Block, AccountId, Nonce>,
C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,
C::Api: BlockBuilder<Block>,
P: TransactionPool + Sync + Send + 'static,
C::Api: pallet_encointer_ceremonies_rpc_runtime_api::CeremoniesApi<Block, AccountId, Moment>,
C::Api:
pallet_encointer_communities_rpc_runtime_api::CommunitiesApi<Block, AccountId, BlockNumber>,
C::Api: pallet_encointer_bazaar_rpc_runtime_api::BazaarApi<Block, AccountId>,
TBackend: sc_client_api::Backend<Block>, // added by encointer
<TBackend as sc_client_api::Backend<Block>>::OffchainStorage: 'static, // added by encointer
{
use frame_rpc_system::{System, SystemApiServer};
use pallet_encointer_bazaar_rpc::{BazaarApiServer, BazaarRpc};
use pallet_encointer_ceremonies_rpc::{CeremoniesApiServer, CeremoniesRpc};
use pallet_encointer_communities_rpc::{CommunitiesApiServer, CommunitiesRpc};
use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer};
let mut module = RpcExtension::new(());
let FullDeps { client, pool, backend, offchain_indexing_enabled, deny_unsafe } = deps;
module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?;
module.merge(TransactionPayment::new(client.clone()).into_rpc())?;
module.merge(BazaarRpc::new(client.clone()).into_rpc())?;
match backend.offchain_storage() {
Some(storage) => {
module.merge(
CommunitiesRpc::new(client.clone(), storage.clone(), offchain_indexing_enabled)
.into_rpc(),
)?;
module
.merge(CeremoniesRpc::new(client, storage, offchain_indexing_enabled).into_rpc())?;
},
None => log::warn!(
"Offchain caching disabled, due to lack of offchain storage support in backend. \n
Will not initialize custom RPCs for 'CommunitiesApi' and 'CeremoniesApi'"
),
};
Ok(module)
}
/// Instantiate reduced RPC extensions for launch runtime
pub fn create_launch_ext<C, P, TBackend>(
deps: FullDeps<C, P, TBackend>,
) -> Result<RpcExtension, Box<dyn std::error::Error + Send + Sync>>
where
C: ProvideRuntimeApi<Block>
+ HeaderBackend<Block>
+ AuxStore
+ HeaderMetadata<Block, Error = BlockChainError>
+ Send
+ Sync
+ 'static,
C::Api: frame_rpc_system::AccountNonceApi<Block, AccountId, Nonce>,
C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,
C::Api: BlockBuilder<Block>,
P: TransactionPool + Sync + Send + 'static,
{
use frame_rpc_system::{System, SystemApiServer};
use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer};
let mut module = RpcExtension::new(());
let FullDeps { client, pool, backend: _, offchain_indexing_enabled: _, deny_unsafe } = deps;
module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?;
module.merge(TransactionPayment::new(client).into_rpc())?;
Ok(module)
}