partner_chains_demo_node/
chain_spec.rs1use 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
19pub 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
41pub 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}