difftreelog
build upgrade frontier
in: master
4 files changed
node/src/rpc.rsdiffbeforeafterboth1//! A collection of node-specific RPC methods.2//! Substrate provides the `sc-rpc` crate, which defines the core RPC layer3//! used by Substrate nodes. This file extends those RPC definitions with4//! capabilities that are specific to this project's runtime configuration.56use std::sync::Arc;78use std::collections::BTreeMap;9use fc_rpc_core::types::{PendingTransactions, FilterPool};10use nft_runtime::{Hash, AccountId, Index, opaque::Block, BlockNumber, Balance};11use sp_api::ProvideRuntimeApi;12use sp_blockchain::{Error as BlockChainError, HeaderMetadata, HeaderBackend};13use sc_client_api::{14 backend::{StorageProvider, Backend, StateBackend, AuxStore},15 client::BlockchainEvents16};17use sc_rpc::SubscriptionTaskExecutor;18use sp_runtime::traits::BlakeTwo256;19use sp_block_builder::BlockBuilder;20use sc_rpc_api::DenyUnsafe;21use sp_transaction_pool::TransactionPool;22use sc_network::NetworkService;23use jsonrpc_pubsub::manager::SubscriptionManager;24use pallet_ethereum::EthereumStorageSchema;25use fc_rpc::{StorageOverride, SchemaV1Override};2627/// Light client extra dependencies.28pub struct LightDeps<C, F, P> {29 /// The client instance to use.30 pub client: Arc<C>,31 /// Transaction pool instance.32 pub pool: Arc<P>,33 /// Remote access to the blockchain (async).34 pub remote_blockchain: Arc<dyn sc_client_api::light::RemoteBlockchain<Block>>,35 /// Fetcher instance.36 pub fetcher: Arc<F>,37}3839/// Full client dependencies.40pub struct FullDeps<C, P> {41 /// The client instance to use.42 pub client: Arc<C>,43 /// Transaction pool instance.44 pub pool: Arc<P>,45 /// Whether to deny unsafe calls46 pub deny_unsafe: DenyUnsafe,47 /// The Node authority flag48 pub is_authority: bool,49 /// Whether to enable dev signer50 pub enable_dev_signer: bool,51 /// Network service52 pub network: Arc<NetworkService<Block, Hash>>,53 /// Ethereum pending transactions.54 pub pending_transactions: PendingTransactions,55 /// EthFilterApi pool.56 pub filter_pool: Option<FilterPool>,57 /// Backend.58 pub backend: Arc<fc_db::Backend<Block>>,59}6061/// Instantiate all full RPC extensions.62pub fn create_full<C, P, BE>(63 deps: FullDeps<C, P>,64 subscription_task_executor: SubscriptionTaskExecutor65) -> jsonrpc_core::IoHandler<sc_rpc::Metadata> where66 BE: Backend<Block> + 'static,67 BE::State: StateBackend<BlakeTwo256>,68 C: ProvideRuntimeApi<Block> + StorageProvider<Block, BE> + AuxStore,69 C: BlockchainEvents<Block>,70 C: HeaderBackend<Block> + HeaderMetadata<Block, Error=BlockChainError>,71 C: Send + Sync + 'static,72 C::Api: substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>,73 C::Api: BlockBuilder<Block>,74 C::Api: pallet_contracts_rpc::ContractsRuntimeApi<Block, AccountId, Balance, BlockNumber>,75 C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,76 C::Api: fp_rpc::EthereumRuntimeRPCApi<Block>,77 P: TransactionPool<Block=Block> + 'static,78{79 use substrate_frame_rpc_system::{FullSystem, SystemApi};80 use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi};81 use fc_rpc::{82 EthApi, EthApiServer, EthFilterApi, EthFilterApiServer, NetApi, NetApiServer,83 EthPubSubApi, EthPubSubApiServer, Web3Api, Web3ApiServer, EthDevSigner, EthSigner,84 HexEncodedIdProvider,85 };8687 let mut io = jsonrpc_core::IoHandler::default();88 let FullDeps {89 client,90 pool,91 deny_unsafe,92 is_authority,93 network,94 pending_transactions,95 filter_pool,96 backend,97 enable_dev_signer,98 } = deps;99100 io.extend_with(101 SystemApi::to_delegate(FullSystem::new(client.clone(), pool.clone(), deny_unsafe))102 );103104 io.extend_with(105 TransactionPaymentApi::to_delegate(TransactionPayment::new(client.clone()))106 );107108 io.extend_with(109 pallet_contracts_rpc::ContractsApi::to_delegate(pallet_contracts_rpc::Contracts::new(client.clone()))110 );111112 let mut signers = Vec::new();113 if enable_dev_signer {114 signers.push(Box::new(EthDevSigner::new()) as Box<dyn EthSigner>);115 }116 let mut overrides = BTreeMap::new();117 overrides.insert(118 EthereumStorageSchema::V1,119 Box::new(SchemaV1Override::new(client.clone())) as Box<dyn StorageOverride<_> + Send + Sync>120 );121 io.extend_with(122 EthApiServer::to_delegate(EthApi::new(123 client.clone(),124 pool.clone(),125 nft_runtime::TransactionConverter,126 network.clone(),127 pending_transactions.clone(),128 signers,129 overrides,130 backend,131 is_authority,132 ))133 );134135 if let Some(filter_pool) = filter_pool {136 io.extend_with(137 EthFilterApiServer::to_delegate(EthFilterApi::new(138 client.clone(),139 filter_pool.clone(),140 500 as usize, // max stored filters141 ))142 );143 }144145 io.extend_with(146 NetApiServer::to_delegate(NetApi::new(147 client.clone(),148 network.clone(),149 ))150 );151152 io.extend_with(153 Web3ApiServer::to_delegate(Web3Api::new(154 client.clone(),155 ))156 );157158 io.extend_with(159 EthPubSubApiServer::to_delegate(EthPubSubApi::new(160 pool.clone(),161 client.clone(),162 network.clone(),163 SubscriptionManager::<HexEncodedIdProvider>::with_id_provider(164 HexEncodedIdProvider::default(),165 Arc::new(subscription_task_executor)166 ),167 ))168 );169170 io171}172173/// Instantiate all Light RPC extensions.174pub fn create_light<C, P, M, F>(175 deps: LightDeps<C, F, P>,176) -> jsonrpc_core::IoHandler<M> where177 C: sp_blockchain::HeaderBackend<Block>,178 C: Send + Sync + 'static,179 F: sc_client_api::light::Fetcher<Block> + 'static,180 P: TransactionPool + 'static,181 M: jsonrpc_core::Metadata + Default,182{183 use substrate_frame_rpc_system::{LightSystem, SystemApi};184185 let LightDeps {186 client,187 pool,188 remote_blockchain,189 fetcher190 } = deps;191 let mut io = jsonrpc_core::IoHandler::default();192 io.extend_with(193 SystemApi::<Hash, AccountId, Index>::to_delegate(194 LightSystem::new(client, remote_blockchain, fetcher, pool)195 )196 );197198 io199}1//! A collection of node-specific RPC methods.2//! Substrate provides the `sc-rpc` crate, which defines the core RPC layer3//! used by Substrate nodes. This file extends those RPC definitions with4//! capabilities that are specific to this project's runtime configuration.56use std::sync::Arc;7use core::marker::PhantomData;89use std::collections::BTreeMap;10use fc_rpc::RuntimeApiStorageOverride;11use fc_rpc::OverrideHandle;12use fc_rpc_core::types::{PendingTransactions, FilterPool};13use nft_runtime::{Hash, AccountId, Index, opaque::Block, BlockNumber, Balance, NftApi};14use sp_api::ProvideRuntimeApi;15use sp_blockchain::{Error as BlockChainError, HeaderMetadata, HeaderBackend};16use sc_client_api::{17 backend::{StorageProvider, Backend, StateBackend, AuxStore},18 client::BlockchainEvents19};20use sc_rpc::SubscriptionTaskExecutor;21use sp_runtime::traits::BlakeTwo256;22use sp_block_builder::BlockBuilder;23use sc_rpc_api::DenyUnsafe;24use sp_transaction_pool::TransactionPool;25use sc_network::NetworkService;26use jsonrpc_pubsub::manager::SubscriptionManager;27use pallet_ethereum::EthereumStorageSchema;28use fc_rpc::{StorageOverride, SchemaV1Override};2930/// Light client extra dependencies.31pub struct LightDeps<C, F, P> {32 /// The client instance to use.33 pub client: Arc<C>,34 /// Transaction pool instance.35 pub pool: Arc<P>,36 /// Remote access to the blockchain (async).37 pub remote_blockchain: Arc<dyn sc_client_api::light::RemoteBlockchain<Block>>,38 /// Fetcher instance.39 pub fetcher: Arc<F>,40}4142/// Full client dependencies.43pub struct FullDeps<C, P> {44 /// The client instance to use.45 pub client: Arc<C>,46 /// Transaction pool instance.47 pub pool: Arc<P>,48 /// Whether to deny unsafe calls49 pub deny_unsafe: DenyUnsafe,50 /// The Node authority flag51 pub is_authority: bool,52 /// Whether to enable dev signer53 pub enable_dev_signer: bool,54 /// Network service55 pub network: Arc<NetworkService<Block, Hash>>,56 /// Ethereum pending transactions.57 pub pending_transactions: PendingTransactions,58 /// EthFilterApi pool.59 pub filter_pool: Option<FilterPool>,60 /// Backend.61 pub backend: Arc<fc_db::Backend<Block>>,62 /// Maximum number of logs in a query.63 pub max_past_logs: u32,64}6566struct AccountCodes<C, B> {67 client: Arc<C>,68 _marker: PhantomData<B>,69}7071impl<C, Block> AccountCodes<C, Block>72where73 Block: sp_api::BlockT,74 C: ProvideRuntimeApi<Block>,75{76 fn new(client: Arc<C>) -> Self {77 Self {78 client,79 _marker: PhantomData,80 }81 }82}8384impl<C, Block> fc_rpc::AccountCodeProvider<Block> for AccountCodes<C, Block>85where86 Block: sp_api::BlockT,87 C: ProvideRuntimeApi<Block>,88 C::Api: pallet_nft::NftApi<Block>,89{90 fn code(&self, block: &sp_api::BlockId<Block>, account: sp_core::H160) -> Option<Vec<u8>> {91 self.client.runtime_api().eth_contract_code(block, account).ok().flatten()92 }93}9495/// Instantiate all full RPC extensions.96pub fn create_full<C, P, BE>(97 deps: FullDeps<C, P>,98 subscription_task_executor: SubscriptionTaskExecutor99) -> jsonrpc_core::IoHandler<sc_rpc::Metadata> where100 BE: Backend<Block> + 'static,101 BE::State: StateBackend<BlakeTwo256>,102 C: ProvideRuntimeApi<Block> + StorageProvider<Block, BE> + AuxStore,103 C: BlockchainEvents<Block>,104 C: HeaderBackend<Block> + HeaderMetadata<Block, Error=BlockChainError>,105 C: Send + Sync + 'static,106 C::Api: substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>,107 C::Api: BlockBuilder<Block>,108 C::Api: pallet_contracts_rpc::ContractsRuntimeApi<Block, AccountId, Balance, BlockNumber>,109 C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,110 C::Api: fp_rpc::EthereumRuntimeRPCApi<Block>,111 C::Api: pallet_nft::NftApi<Block>,112 P: TransactionPool<Block=Block> + 'static,113{114 use substrate_frame_rpc_system::{FullSystem, SystemApi};115 use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi};116 use fc_rpc::{117 EthApi, EthApiServer, EthFilterApi, EthFilterApiServer, NetApi, NetApiServer,118 EthPubSubApi, EthPubSubApiServer, Web3Api, Web3ApiServer, EthDevSigner, EthSigner,119 HexEncodedIdProvider,120 };121122 let mut io = jsonrpc_core::IoHandler::default();123 let FullDeps {124 client,125 pool,126 deny_unsafe,127 is_authority,128 network,129 pending_transactions,130 filter_pool,131 backend,132 enable_dev_signer,133 max_past_logs,134 } = deps;135136 io.extend_with(137 SystemApi::to_delegate(FullSystem::new(client.clone(), pool.clone(), deny_unsafe))138 );139140 io.extend_with(141 TransactionPaymentApi::to_delegate(TransactionPayment::new(client.clone()))142 );143144 io.extend_with(145 pallet_contracts_rpc::ContractsApi::to_delegate(pallet_contracts_rpc::Contracts::new(client.clone()))146 );147148 let mut signers = Vec::new();149 if enable_dev_signer {150 signers.push(Box::new(EthDevSigner::new()) as Box<dyn EthSigner>);151 }152 let mut overrides_map = BTreeMap::new();153 overrides_map.insert(154 EthereumStorageSchema::V1,155 Box::new(SchemaV1Override::new_with_code_provider(156 client.clone(),157 Arc::new(AccountCodes::<C, Block>::new(client.clone()))158 )) as Box<dyn StorageOverride<_> + Send + Sync>159 );160161 let overrides = Arc::new(OverrideHandle {162 schemas: overrides_map,163 fallback: Box::new(RuntimeApiStorageOverride::new(client.clone())),164 });165166 io.extend_with(167 EthApiServer::to_delegate(EthApi::new(168 client.clone(),169 pool.clone(),170 nft_runtime::TransactionConverter,171 network.clone(),172 pending_transactions.clone(),173 signers,174 overrides.clone(),175 backend,176 is_authority,177 max_past_logs,178 ))179 );180181 if let Some(filter_pool) = filter_pool {182 io.extend_with(183 EthFilterApiServer::to_delegate(EthFilterApi::new(184 client.clone(),185 filter_pool.clone(),186 500 as usize, // max stored filters187 overrides.clone(),188 max_past_logs,189 ))190 );191 }192193 io.extend_with(194 NetApiServer::to_delegate(NetApi::new(195 client.clone(),196 network.clone(),197 ))198 );199200 io.extend_with(201 Web3ApiServer::to_delegate(Web3Api::new(202 client.clone(),203 ))204 );205206 io.extend_with(207 EthPubSubApiServer::to_delegate(EthPubSubApi::new(208 pool.clone(),209 client.clone(),210 network.clone(),211 SubscriptionManager::<HexEncodedIdProvider>::with_id_provider(212 HexEncodedIdProvider::default(),213 Arc::new(subscription_task_executor)214 ),215 overrides,216 ))217 );218219 io220}221222/// Instantiate all Light RPC extensions.223pub fn create_light<C, P, M, F>(224 deps: LightDeps<C, F, P>,225) -> jsonrpc_core::IoHandler<M> where226 C: sp_blockchain::HeaderBackend<Block>,227 C: Send + Sync + 'static,228 F: sc_client_api::light::Fetcher<Block> + 'static,229 P: TransactionPool + 'static,230 M: jsonrpc_core::Metadata + Default,231{232 use substrate_frame_rpc_system::{LightSystem, SystemApi};233234 let LightDeps {235 client,236 pool,237 remote_blockchain,238 fetcher239 } = deps;240 let mut io = jsonrpc_core::IoHandler::default();241 io.extend_with(242 SystemApi::<Hash, AccountId, Index>::to_delegate(243 LightSystem::new(client, remote_blockchain, fetcher, pool)244 )245 );246247 io248}node/src/service.rsdiffbeforeafterboth--- a/node/src/service.rs
+++ b/node/src/service.rs
@@ -237,6 +237,8 @@
let pending = pending_transactions.clone();
let filter_pool = filter_pool.clone();
let frontier_backend = frontier_backend.clone();
+ // TODO: Tune
+ let max_past_logs = 10000;
Box::new(move |deny_unsafe, _| {
let deps = crate::rpc::FullDeps {
@@ -249,6 +251,7 @@
pending_transactions: pending.clone(),
filter_pool: filter_pool.clone(),
backend: frontier_backend.clone(),
+ max_past_logs,
};
crate::rpc::create_full(
deps,
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -2889,4 +2889,11 @@
}
}
-// #endregion
\ No newline at end of file
+// #endregion
+
+sp_api::decl_runtime_apis! {
+ pub trait NftApi {
+ /// Used for ethereum integration
+ fn eth_contract_code(account: H160) -> Option<Vec<u8>>;
+ }
+}
runtime/src/lib.rsdiffbeforeafterboth--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -64,7 +64,7 @@
use sp_arithmetic::{traits::{BaseArithmetic, Unsigned}};
use smallvec::smallvec;
use codec::{Encode, Decode};
-use pallet_evm::{Account as EVMAccount, FeeCalculator};
+use pallet_evm::{Account as EVMAccount, FeeCalculator, OnMethodCall};
use fp_rpc::TransactionStatus;
use sp_core::H256;
@@ -344,14 +344,16 @@
}
impl pallet_evm::Config for Runtime {
+ type BlockGasLimit = BlockGasLimit;
type FeeCalculator = ();
type GasWeightMapping = ();
type CallOrigin = EnsureAddressTruncated;
type WithdrawOrigin = EnsureAddressTruncated;
- type AddressMapping = HashedAddressMapping<BlakeTwo256>;
+ type AddressMapping = HashedAddressMapping<Self::Hashing>;
+ type Precompiles = ();
type Currency = Balances;
type Event = Event;
- type Precompiles = ();
+ type OnMethodCall = pallet_nft::NftErcSupport<Self>;
type ChainId = ChainId;
type Runner = pallet_evm::runner::stack::Runner<Self>;
type OnChargeTransaction = ();
@@ -379,7 +381,6 @@
type Event = Event;
type FindAuthor = EthereumFindAuthor<Aura>;
type StateRoot = pallet_ethereum::IntermediateStateRoot;
- type BlockGasLimit = BlockGasLimit;
}
impl pallet_grandpa::Config for Runtime {
@@ -657,6 +658,13 @@
frame_executive::Executive<Runtime, Block, system::ChainContext<Runtime>, Runtime, AllModules>;
impl_runtime_apis! {
+ impl pallet_nft::NftApi<Block>
+ for Runtime
+ {
+ fn eth_contract_code(account: H160) -> Option<Vec<u8>> {
+ <pallet_nft::NftErcSupport<Runtime>>::get_code(&account)
+ }
+ }
impl pallet_contracts_rpc_runtime_api::ContractsApi<Block, AccountId, Balance, BlockNumber>
for Runtime