diff --git a/client/rpc-spec/src/chain_spec/chain_spec.rs b/client/rpc-spec/src/chain_spec/chain_spec.rs new file mode 100644 index 0000000000000..4ec796c4a72f0 --- /dev/null +++ b/client/rpc-spec/src/chain_spec/chain_spec.rs @@ -0,0 +1,68 @@ +// This file is part of Substrate. + +// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program 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. + +// This program 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 this program. If not, see . + +//! API implementation for the specification of a chain. + +use crate::chain_spec::api::ChainSpecApiServer; +use jsonrpsee::core::RpcResult; +use sc_chain_spec::Properties; + +/// An API for chain spec RPC calls. +pub struct ChainSpec { + /// The name of the chain. + name: String, + /// The hexadecimal encoded hash of the genesis block. + /// + /// # Note + /// + /// This can be empty, or prefixed with "0x". + genesis_hash: String, + /// Chain properties. + properties: Properties, +} + +impl ChainSpec { + /// Creates a new [`ChainSpec`]. + pub fn new>( + name: String, + genesis_hash: Hash, + properties: Properties, + ) -> Self { + let genesis_hash = if genesis_hash.as_ref().is_empty() { + "".into() + } else { + format!("0x{}", hex::encode(genesis_hash)) + }; + + Self { name, properties, genesis_hash } + } +} + +impl ChainSpecApiServer for ChainSpec { + fn chain_spec_unstable_chain_name(&self) -> RpcResult { + Ok(self.name.clone()) + } + + fn chain_spec_unstable_genesis_hash(&self) -> RpcResult { + Ok(self.genesis_hash.clone()) + } + + fn chain_spec_unstable_properties(&self) -> RpcResult { + Ok(self.properties.clone()) + } +} diff --git a/client/rpc-spec/src/chain_spec/mod.rs b/client/rpc-spec/src/chain_spec/mod.rs index 43e27e52e77f8..af11c8ca4af16 100644 --- a/client/rpc-spec/src/chain_spec/mod.rs +++ b/client/rpc-spec/src/chain_spec/mod.rs @@ -29,5 +29,7 @@ //! Methods are prefixed by `chainSpec`. pub mod api; +pub mod chain_spec; pub use api::ChainSpecApiServer; +pub use chain_spec::ChainSpec;