// Copyright (C) Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Cumulus 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.
// Cumulus 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 Cumulus. If not, see .
use crate::chain_spec::{
get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION,
};
use cumulus_primitives_core::ParaId;
use parachains_common::{AccountId, AuraId};
use sc_service::ChainType;
use sp_core::sr25519;
/// Specialized `ChainSpec` for the normal parachain runtime.
pub type PenpalChainSpec = sc_service::GenericChainSpec<(), Extensions>;
pub fn get_penpal_chain_spec(id: ParaId, relay_chain: &str) -> PenpalChainSpec {
// Give your base currency a unit name and decimal places
let mut properties = sc_chain_spec::Properties::new();
properties.insert("tokenSymbol".into(), "UNIT".into());
properties.insert("tokenDecimals".into(), 12u32.into());
properties.insert("ss58Format".into(), 42u32.into());
PenpalChainSpec::builder(
penpal_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"),
Extensions {
relay_chain: relay_chain.into(), // You MUST set this to the correct network!
para_id: id.into(),
},
)
.with_name("Penpal Parachain")
.with_id(&format!("penpal-{}", relay_chain.replace("-local", "")))
.with_chain_type(ChainType::Development)
.with_genesis_config_patch(penpal_testnet_genesis(
// initial collators.
vec![
(
get_account_id_from_seed::("Alice"),
get_collator_keys_from_seed::("Alice"),
),
(
get_account_id_from_seed::("Bob"),
get_collator_keys_from_seed::("Bob"),
),
],
vec![
get_account_id_from_seed::("Alice"),
get_account_id_from_seed::("Bob"),
get_account_id_from_seed::("Charlie"),
get_account_id_from_seed::("Dave"),
get_account_id_from_seed::("Eve"),
get_account_id_from_seed::("Ferdie"),
get_account_id_from_seed::("Alice//stash"),
get_account_id_from_seed::("Bob//stash"),
get_account_id_from_seed::("Charlie//stash"),
get_account_id_from_seed::("Dave//stash"),
get_account_id_from_seed::("Eve//stash"),
get_account_id_from_seed::("Ferdie//stash"),
],
id,
))
.build()
}
fn penpal_testnet_genesis(
invulnerables: Vec<(AccountId, AuraId)>,
endowed_accounts: Vec,
id: ParaId,
) -> serde_json::Value {
serde_json::json!({
"balances": {
"balances": endowed_accounts
.iter()
.cloned()
.map(|k| (k, penpal_runtime::EXISTENTIAL_DEPOSIT * 4096))
.collect::>(),
},
"parachainInfo": {
"parachainId": id,
},
"collatorSelection": {
"invulnerables": invulnerables.iter().cloned().map(|(acc, _)| acc).collect::>(),
"candidacyBond": penpal_runtime::EXISTENTIAL_DEPOSIT * 16,
},
"session": {
"keys": invulnerables
.into_iter()
.map(|(acc, aura)| {
(
acc.clone(), // account id
acc, // validator id
penpal_session_keys(aura), // session keys
)
})
.collect::>(),
},
"polkadotXcm": {
"safeXcmVersion": Some(SAFE_XCM_VERSION),
},
"sudo": {
"key": Some(get_account_id_from_seed::("Alice")),
},
})
}
/// Generate the session keys from individual elements.
///
/// The input must be a tuple of individual keys (a single arg for now since we have just one key).
pub fn penpal_session_keys(keys: AuraId) -> penpal_runtime::SessionKeys {
penpal_runtime::SessionKeys { aura: keys }
}