From 8dc443dc5bddee463118878a73b1eceecec406cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= <tomusdrw@users.noreply.github.com>
Date: Wed, 23 Oct 2019 13:17:53 +0200
Subject: [PATCH] Support `account_nextIndex` RPC. (#460)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Use node-rpc extensions to support account_nextIndex.

* Remove todo.

* Update lock.

* Use new srml_system_rpc crate.

* Update to substrate=master

* Update lockfile.

* Update to polkadot-master.

* Apply suggestions from code review

Co-Authored-By: Bastian Köcher <bkchr@users.noreply.github.com>
---
 polkadot/Cargo.lock         | 44 ++++++++++++++++++++++++++++++++++++
 polkadot/rpc/Cargo.toml     | 15 +++++++++++++
 polkadot/rpc/src/lib.rs     | 45 +++++++++++++++++++++++++++++++++++++
 polkadot/runtime/Cargo.toml |  2 ++
 polkadot/runtime/src/lib.rs |  6 +++++
 polkadot/service/Cargo.toml |  1 +
 polkadot/service/src/lib.rs |  6 +++++
 7 files changed, 119 insertions(+)
 create mode 100644 polkadot/rpc/Cargo.toml
 create mode 100644 polkadot/rpc/src/lib.rs

diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock
index 7a8f9eaac14..dad51e1181e 100644
--- a/polkadot/Cargo.lock
+++ b/polkadot/Cargo.lock
@@ -2777,6 +2777,19 @@ dependencies = [
  "substrate-serializer 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
 ]
 
+[[package]]
+name = "polkadot-rpc"
+version = "0.6.0"
+dependencies = [
+ "jsonrpc-core 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "polkadot-primitives 0.6.0",
+ "sr-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "srml-system-rpc 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "substrate-client 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "substrate-rpc 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "substrate-transaction-pool 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+]
+
 [[package]]
 name = "polkadot-runtime"
 version = "0.6.0"
@@ -2819,6 +2832,7 @@ dependencies = [
  "srml-sudo 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
  "srml-support 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
  "srml-system 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "srml-system-rpc-runtime-api 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
  "srml-timestamp 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
  "srml-transaction-payment 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
  "srml-treasury 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
@@ -2851,6 +2865,7 @@ dependencies = [
  "polkadot-executor 0.6.0",
  "polkadot-network 0.6.0",
  "polkadot-primitives 0.6.0",
+ "polkadot-rpc 0.6.0",
  "polkadot-runtime 0.6.0",
  "polkadot-validation 0.6.0",
  "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4159,6 +4174,33 @@ dependencies = [
  "substrate-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
 ]
 
+[[package]]
+name = "srml-system-rpc"
+version = "2.0.0"
+source = "git+https://github.com/paritytech/substrate?branch=polkadot-master#5fde6d0882bd9943da28df6d40dc78714672dcca"
+dependencies = [
+ "jsonrpc-core 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "jsonrpc-core-client 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "jsonrpc-derive 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parity-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "sr-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "srml-system-rpc-runtime-api 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "substrate-client 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "substrate-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+ "substrate-transaction-pool 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+]
+
+[[package]]
+name = "srml-system-rpc-runtime-api"
+version = "2.0.0"
+source = "git+https://github.com/paritytech/substrate?branch=polkadot-master#5fde6d0882bd9943da28df6d40dc78714672dcca"
+dependencies = [
+ "parity-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "substrate-client 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)",
+]
+
 [[package]]
 name = "srml-timestamp"
 version = "2.0.0"
@@ -6306,6 +6348,8 @@ dependencies = [
 "checksum srml-support-procedural-tools 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
 "checksum srml-support-procedural-tools-derive 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
 "checksum srml-system 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
+"checksum srml-system-rpc 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
+"checksum srml-system-rpc-runtime-api 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
 "checksum srml-timestamp 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
 "checksum srml-transaction-payment 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
 "checksum srml-treasury 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>"
diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml
new file mode 100644
index 00000000000..d4bc83e0bbc
--- /dev/null
+++ b/polkadot/rpc/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "polkadot-rpc"
+version = "0.6.0"
+authors = ["Parity Technologies <admin@parity.io>"]
+edition = "2018"
+
+[dependencies]
+client = { package = "substrate-client", git = "https://github.com/paritytech/substrate", branch = "polkadot-master" }
+jsonrpc-core = "13.2.0"
+polkadot-primitives = { path = "../primitives" }
+sr-primitives = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master"  }
+substrate-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" }
+transaction_pool = { package = "substrate-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "polkadot-master"  }
+srml-system-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master"  }
+
diff --git a/polkadot/rpc/src/lib.rs b/polkadot/rpc/src/lib.rs
new file mode 100644
index 00000000000..5b86a900126
--- /dev/null
+++ b/polkadot/rpc/src/lib.rs
@@ -0,0 +1,45 @@
+// Copyright 2019 Parity Technologies (UK) Ltd.
+// This file is part of Polkadot.
+
+// Polkadot 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.
+
+// Polkadot 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 Polkadot.  If not, see <http://www.gnu.org/licenses/>.
+
+//! Polkadot-specific RPCs implementation.
+
+#![warn(missing_docs)]
+
+use std::sync::Arc;
+
+use polkadot_primitives::{Block, AccountId, Nonce};
+use sr_primitives::traits::ProvideRuntimeApi;
+use transaction_pool::txpool::{ChainApi, Pool};
+
+/// A type representing all RPC extensions.
+pub type RpcExtension = jsonrpc_core::IoHandler<substrate_rpc::Metadata>;
+
+/// Instantiate all RPC extensions.
+pub fn create<C, P>(client: Arc<C>, pool: Arc<Pool<P>>) -> RpcExtension where
+	C: ProvideRuntimeApi,
+	C: client::blockchain::HeaderBackend<Block>,
+	C: Send + Sync + 'static,
+	C::Api: srml_system_rpc::AccountNonceApi<Block, AccountId, Nonce>,
+	P: ChainApi + Sync + Send + 'static,
+{
+	use srml_system_rpc::{System, SystemApi};
+
+	let mut io = jsonrpc_core::IoHandler::default();
+	io.extend_with(
+		SystemApi::to_delegate(System::new(client.clone(), pool))
+	);
+	io
+}
diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml
index 728759596e4..c9a0ce679b9 100644
--- a/polkadot/runtime/Cargo.toml
+++ b/polkadot/runtime/Cargo.toml
@@ -50,6 +50,7 @@ staking = { package = "srml-staking", git = "https://github.com/paritytech/subst
 srml-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" }
 sudo = { package = "srml-sudo", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" }
 system = { package = "srml-system", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" }
+system_rpc_runtime_api = { package = "srml-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" }
 timestamp = { package = "srml-timestamp", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" }
 treasury = { package = "srml-treasury", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" }
 
@@ -106,6 +107,7 @@ std = [
 	"staking/std",
 	"sudo/std",
 	"system/std",
+	"system_rpc_runtime_api/std",
 	"timestamp/std",
 	"treasury/std",
 	"version/std",
diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs
index c87b2d0952f..d1906ce94ff 100644
--- a/polkadot/runtime/src/lib.rs
+++ b/polkadot/runtime/src/lib.rs
@@ -759,4 +759,10 @@ impl_runtime_apis! {
 			SessionKeys::generate(seed)
 		}
 	}
+
+	impl system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime {
+		fn account_nonce(account: AccountId) -> Nonce {
+			System::account_nonce(account)
+		}
+	}
 }
diff --git a/polkadot/service/Cargo.toml b/polkadot/service/Cargo.toml
index 3059af36be9..808aef0f48a 100644
--- a/polkadot/service/Cargo.toml
+++ b/polkadot/service/Cargo.toml
@@ -18,6 +18,7 @@ polkadot-primitives = { path = "../primitives" }
 polkadot-runtime = { path = "../runtime" }
 polkadot-executor = { path = "../executor" }
 polkadot-network = { path = "../network"  }
+polkadot-rpc = { path = "../rpc" }
 sr-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" }
 sr-primitives = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" }
 primitives = { package = "substrate-primitives", git = "https://github.com/paritytech/substrate", branch = "polkadot-master" }
diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs
index 616d521d651..2c705faa015 100644
--- a/polkadot/service/src/lib.rs
+++ b/polkadot/service/src/lib.rs
@@ -117,6 +117,9 @@ macro_rules! new_full_start {
 
 				import_setup = Some((block_import, grandpa_link, babe_link));
 				Ok(import_queue)
+			})?
+			.with_rpc_extensions(|client, pool| -> polkadot_rpc::RpcExtension {
+				polkadot_rpc::create(client, pool)
 			})?;
 
 		(builder, import_setup, inherent_data_providers)
@@ -369,5 +372,8 @@ pub fn new_light(config: Configuration<CustomConfiguration, GenesisConfig>)
 		.with_finality_proof_provider(|client, backend|
 			Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, client)) as _)
 		)?
+		.with_rpc_extensions(|client, pool| -> polkadot_rpc::RpcExtension {
+			polkadot_rpc::create(client, pool)
+		})?
 		.build()
 }
-- 
GitLab