partner_chains_demo_node/
chain_spec.rs

1use partner_chains_cli::CreateChainSpecConfig;
2use partner_chains_demo_runtime::{
3	AccountId, CrossChainPublic, SLOT_DURATION, SessionConfig, Signature, WASM_BINARY,
4	opaque::SessionKeys,
5};
6use sc_service::ChainType;
7use sidechain_domain::ScEpochDuration;
8use sp_core::{Pair, Public};
9use sp_runtime::traits::{IdentifyAccount, Verify};
10
11pub type ChainSpec = sc_service::GenericChainSpec;
12
13#[derive(Clone, Debug, PartialEq)]
14pub struct AuthorityKeys {
15	pub session: SessionKeys,
16	pub cross_chain: CrossChainPublic,
17}
18
19/// Generate a crypto pair from seed.
20pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
21	TPublic::Pair::from_string(seed, None)
22		.expect("static values are valid; qed")
23		.public()
24}
25
26type AccountPublic = <Signature as Verify>::Signer;
27
28pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
29where
30	AccountPublic: From<<TPublic::Pair as Pair>::Public>,
31{
32	AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
33}
34
35pub fn runtime_wasm() -> &'static [u8] {
36	WASM_BINARY.expect("Runtime wasm not available")
37}
38
39pub const DEFAULT_SLOTS_PER_EPOCH: u64 = 60;
40
41/// Creates chain-spec according to the config obtained by wizards.
42/// [serde_json::Value] is returned instead of [sc_service::GenericChainSpec] in order to avoid
43/// GPL code in the toolkit.
44pub fn pc_create_chain_spec(config: &CreateChainSpecConfig<SessionKeys>) -> serde_json::Value {
45	let runtime_genesis_config = partner_chains_demo_runtime::RuntimeGenesisConfig {
46		system: partner_chains_demo_runtime::SystemConfig::default(),
47		balances: partner_chains_demo_runtime::BalancesConfig::default(),
48		aura: partner_chains_demo_runtime::AuraConfig::default(),
49		grandpa: partner_chains_demo_runtime::GrandpaConfig::default(),
50		sudo: partner_chains_demo_runtime::SudoConfig::default(),
51		transaction_payment: Default::default(),
52		session: SessionConfig {
53			keys: config
54				.initial_permissioned_candidates_parsed
55				.iter()
56				.map(|authority_keys| {
57					(
58						authority_keys.account_id_32().into(),
59						authority_keys.account_id_32().into(),
60						authority_keys.keys.clone(),
61					)
62				})
63				.collect(),
64			non_authority_keys: vec![],
65		},
66		sidechain: config.pallet_sidechain_config(ScEpochDuration::from_millis(
67			SLOT_DURATION * DEFAULT_SLOTS_PER_EPOCH,
68		)),
69		session_committee_management: config.pallet_session_validator_management_config(),
70		governed_map: config.governed_map_config(),
71		test_helper_pallet: partner_chains_demo_runtime::TestHelperPalletConfig {
72			participation_data_release_period: 30,
73			..Default::default()
74		},
75		bridge: config.bridge_config(),
76	};
77	let genesis_json = serde_json::to_value(runtime_genesis_config)
78		.expect("Genesis config must be serialized correctly");
79	let chain_spec = ChainSpec::builder(runtime_wasm(), None)
80		.with_name("Partner Chains Demo")
81		.with_id("partner_chains_demo")
82		.with_chain_type(ChainType::Live)
83		.with_genesis_config(genesis_json)
84		.with_boot_nodes(config.bootnodes.iter().map(|bn| bn.parse().unwrap()).collect())
85		.build();
86	let raw = false;
87	let chain_spec_str = chain_spec.as_json(raw).expect("Chain spec serialization can not fail");
88	serde_json::from_str(&chain_spec_str).unwrap()
89}
90
91pub(crate) fn read_slots_per_epoch_from_env() -> u64 {
92	std::env::var("SLOTS_PER_EPOCH")
93		.ok()
94		.and_then(|s| s.parse().ok())
95		.unwrap_or(DEFAULT_SLOTS_PER_EPOCH)
96}