diff --git a/chain-spec-generator/src/common.rs b/chain-spec-generator/src/common.rs
index 24162a4600..54bc86439a 100644
--- a/chain-spec-generator/src/common.rs
+++ b/chain-spec-generator/src/common.rs
@@ -15,15 +15,6 @@
// You should have received a copy of the GNU General Public License
// along with Polkadot. If not, see .
-use crate::{
- relay_chain_specs::{KusamaChainSpec, PolkadotChainSpec},
- system_parachains_specs::{
- AssetHubKusamaChainSpec, AssetHubPolkadotChainSpec, BridgeHubKusamaChainSpec,
- BridgeHubPolkadotChainSpec, CollectivesPolkadotChainSpec, EncointerKusamaChainSpec,
- GluttonKusamaChainSpec, PeopleKusamaChainSpec, PeoplePolkadotChainSpec,
- },
- ChainSpec,
-};
use polkadot_primitives::{AccountId, AccountPublic};
use sp_core::{sr25519, Pair, Public};
use sp_runtime::traits::IdentifyAccount;
@@ -59,41 +50,3 @@ where
{
AccountPublic::from(get_from_seed::(seed)).into_account()
}
-
-#[derive(Debug, serde::Deserialize)]
-struct EmptyChainSpecWithId {
- id: String,
-}
-
-pub fn from_json_file(filepath: &str, supported: String) -> Result, String> {
- let path = std::path::PathBuf::from(&filepath);
- let file = std::fs::File::open(filepath).expect("Failed to open file");
- let reader = std::io::BufReader::new(file);
- let chain_spec: EmptyChainSpecWithId = serde_json::from_reader(reader)
- .expect("Failed to read 'json' file with ChainSpec configuration");
- match &chain_spec.id {
- x if x.starts_with("polkadot") | x.starts_with("dot") =>
- Ok(Box::new(PolkadotChainSpec::from_json_file(path)?)),
- x if x.starts_with("kusama") | x.starts_with("ksm") =>
- Ok(Box::new(KusamaChainSpec::from_json_file(path)?)),
- x if x.starts_with("asset-hub-polkadot") =>
- Ok(Box::new(AssetHubPolkadotChainSpec::from_json_file(path)?)),
- x if x.starts_with("asset-hub-kusama") =>
- Ok(Box::new(AssetHubKusamaChainSpec::from_json_file(path)?)),
- x if x.starts_with("collectives-polkadot") =>
- Ok(Box::new(CollectivesPolkadotChainSpec::from_json_file(path)?)),
- x if x.starts_with("bridge-hub-polkadot") =>
- Ok(Box::new(BridgeHubPolkadotChainSpec::from_json_file(path)?)),
- x if x.starts_with("bridge-hub-kusama") =>
- Ok(Box::new(BridgeHubKusamaChainSpec::from_json_file(path)?)),
- x if x.starts_with("glutton-kusama") =>
- Ok(Box::new(GluttonKusamaChainSpec::from_json_file(path)?)),
- x if x.starts_with("encointer-kusama") =>
- Ok(Box::new(EncointerKusamaChainSpec::from_json_file(path)?)),
- x if x.starts_with("people-kusama") =>
- Ok(Box::new(PeopleKusamaChainSpec::from_json_file(path)?)),
- x if x.starts_with("people-polkadot") =>
- Ok(Box::new(PeoplePolkadotChainSpec::from_json_file(path)?)),
- _ => Err(format!("Unknown chain 'id' in json file. Only supported: {supported}'")),
- }
-}
diff --git a/chain-spec-generator/src/main.rs b/chain-spec-generator/src/main.rs
index 913d976d56..f720360fb0 100644
--- a/chain-spec-generator/src/main.rs
+++ b/chain-spec-generator/src/main.rs
@@ -17,7 +17,7 @@
use clap::Parser;
use sc_chain_spec::ChainSpec;
-use std::collections::HashMap;
+use std::{collections::HashMap, path::PathBuf};
mod common;
mod relay_chain_specs;
@@ -33,56 +33,95 @@ struct Cli {
raw: bool,
}
+#[derive(Debug, serde::Deserialize)]
+struct EmptyChainSpecWithId {
+ id: String,
+}
+
+macro_rules! chainspec {
+ ($chain:expr, $csty:ty, $defcon:expr $(,)?) => {
+ (
+ $chain,
+ Box::new(|p| {
+ if let Some(p) = p {
+ , String>>::Ok(Box::new(<$csty>::from_json_file(p)?))
+ } else {
+ $defcon()
+ }
+ }) as Box<_>,
+ )
+ };
+}
+
fn main() -> Result<(), String> {
let cli = Cli::parse();
let supported_chains =
- HashMap::<_, Box Result, String>>>::from([
- ("polkadot-dev", Box::new(relay_chain_specs::polkadot_development_config) as Box<_>),
- (
+ HashMap::<_, Box) -> Result, String>>>::from([
+ chainspec!(
+ "polkadot-dev",
+ relay_chain_specs::PolkadotChainSpec,
+ relay_chain_specs::polkadot_development_config,
+ ),
+ chainspec!(
"polkadot-local",
- Box::new(relay_chain_specs::polkadot_local_testnet_config) as Box<_>,
+ relay_chain_specs::PolkadotChainSpec,
+ relay_chain_specs::polkadot_local_testnet_config,
),
- ("kusama-dev", Box::new(relay_chain_specs::kusama_development_config) as Box<_>),
- ("kusama-local", Box::new(relay_chain_specs::kusama_local_testnet_config) as Box<_>),
- (
+ chainspec!(
+ "kusama-dev",
+ relay_chain_specs::KusamaChainSpec,
+ relay_chain_specs::kusama_development_config,
+ ),
+ chainspec!(
+ "kusama-local",
+ relay_chain_specs::KusamaChainSpec,
+ relay_chain_specs::kusama_local_testnet_config,
+ ),
+ chainspec!(
"asset-hub-kusama-local",
- Box::new(system_parachains_specs::asset_hub_kusama_local_testnet_config) as Box<_>,
+ system_parachains_specs::AssetHubKusamaChainSpec,
+ system_parachains_specs::asset_hub_kusama_local_testnet_config,
),
- (
+ chainspec!(
"asset-hub-polkadot-local",
- Box::new(system_parachains_specs::asset_hub_polkadot_local_testnet_config)
- as Box<_>,
+ system_parachains_specs::AssetHubPolkadotChainSpec,
+ system_parachains_specs::asset_hub_polkadot_local_testnet_config,
),
- (
+ chainspec!(
"collectives-polkadot-local",
- Box::new(system_parachains_specs::collectives_polkadot_local_testnet_config)
- as Box<_>,
+ system_parachains_specs::CollectivesPolkadotChainSpec,
+ system_parachains_specs::collectives_polkadot_local_testnet_config,
),
- (
+ chainspec!(
"bridge-hub-polkadot-local",
- Box::new(system_parachains_specs::bridge_hub_polkadot_local_testnet_config)
- as Box<_>,
+ system_parachains_specs::BridgeHubPolkadotChainSpec,
+ system_parachains_specs::bridge_hub_polkadot_local_testnet_config,
),
- (
+ chainspec!(
"bridge-hub-kusama-local",
- Box::new(system_parachains_specs::bridge_hub_kusama_local_testnet_config) as Box<_>,
+ system_parachains_specs::BridgeHubKusamaChainSpec,
+ system_parachains_specs::bridge_hub_kusama_local_testnet_config,
),
- (
+ chainspec!(
"glutton-kusama-local",
- Box::new(system_parachains_specs::glutton_kusama_local_testnet_config) as Box<_>,
+ system_parachains_specs::GluttonKusamaChainSpec,
+ system_parachains_specs::glutton_kusama_local_testnet_config,
),
- (
+ chainspec!(
"encointer-kusama-local",
- Box::new(system_parachains_specs::encointer_kusama_local_testnet_config) as Box<_>,
+ system_parachains_specs::EncointerKusamaChainSpec,
+ system_parachains_specs::encointer_kusama_local_testnet_config,
),
- (
+ chainspec!(
"coretime-kusama-local",
- Box::new(system_parachains_specs::coretime_kusama_local_testnet_config) as Box<_>,
+ system_parachains_specs::CoretimeKusamaChainSpec,
+ system_parachains_specs::coretime_kusama_local_testnet_config,
),
- (
+ chainspec!(
"people-kusama-local",
- Box::new(system_parachains_specs::people_kusama_local_testnet_config) as Box<_>,
+ system_parachains_specs::PeopleKusamaChainSpec,
+ system_parachains_specs::people_kusama_local_testnet_config,
),
(
"people-polkadot-local",
@@ -91,20 +130,24 @@ fn main() -> Result<(), String> {
]);
if let Some(function) = supported_chains.get(&*cli.chain) {
- let chain_spec = (*function)()?.as_json(cli.raw)?;
+ let chain_spec = (*function)(None)?.as_json(cli.raw)?;
print!("{chain_spec}");
- Ok(())
- } else {
- let supported = supported_chains.keys().enumerate().fold(String::new(), |c, (n, k)| {
- let extra = if n + 1 < supported_chains.len() { ", " } else { "" };
- format!("{c}{k}{extra}")
- });
- if cli.chain.ends_with(".json") {
- let chain_spec = common::from_json_file(&cli.chain, supported)?.as_json(cli.raw)?;
+ return Ok(())
+ } else if cli.chain.ends_with(".json") {
+ let file = std::fs::File::open(&cli.chain).expect("Failed to open file");
+ let reader = std::io::BufReader::new(file);
+ let chain_spec: EmptyChainSpecWithId = serde_json::from_reader(reader)
+ .expect("Failed to read 'json' file with ChainSpec configuration");
+
+ if let Some(function) = supported_chains.get(&*chain_spec.id) {
+ let path = std::path::PathBuf::from(&cli.chain);
+ let chain_spec = (*function)(Some(path))?.as_json(cli.raw)?;
print!("{chain_spec}");
- Ok(())
- } else {
- Err(format!("Unknown chain, only supported: {supported} or a json file"))
+ return Ok(())
}
}
+
+ let supported = supported_chains.keys().copied().collect::>().join(", ");
+
+ Err(format!("Unknown chain, only supported: {supported} or a json file"))
}