// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot 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. // Polkadot 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 Polkadot. If not, see . //! Chain specifications for the test runtime. use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use babe_primitives::AuthorityId as BabeId; use grandpa::AuthorityId as GrandpaId; use pallet_staking::Forcing; use polkadot_primitives::v1::{ValidatorId, AccountId}; use polkadot_service::chain_spec::{get_account_id_from_seed, get_from_seed, Extensions}; use polkadot_test_runtime::constants::currency::DOTS; use sc_chain_spec::{ChainSpec, ChainType}; use sp_core::sr25519; use sp_runtime::Perbill; const DEFAULT_PROTOCOL_ID: &str = "dot"; /// The `ChainSpec` parametrized for polkadot test runtime. pub type PolkadotChainSpec = service::GenericChainSpec; /// Local testnet config (multivalidator Alice + Bob) pub fn polkadot_local_testnet_config() -> PolkadotChainSpec { PolkadotChainSpec::from_genesis( "Local Testnet", "local_testnet", ChainType::Local, || polkadot_local_testnet_genesis(), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), ) } /// Local testnet genesis config (multivalidator Alice + Bob) pub fn polkadot_local_testnet_genesis() -> polkadot_test_runtime::GenesisConfig { polkadot_testnet_genesis( vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), ], get_account_id_from_seed::("Alice"), None, ) } /// Helper function to generate stash, controller and session key from seed fn get_authority_keys_from_seed( seed: &str, ) -> (AccountId, AccountId, BabeId, GrandpaId, ValidatorId, AuthorityDiscoveryId) { ( get_account_id_from_seed::(&format!("{}//stash", seed)), get_account_id_from_seed::(seed), get_from_seed::(seed), get_from_seed::(seed), get_from_seed::(seed), get_from_seed::(seed), ) } fn testnet_accounts() -> Vec { 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"), ] } /// Helper function to create polkadot GenesisConfig for testing fn polkadot_testnet_genesis( initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ValidatorId, AuthorityDiscoveryId)>, root_key: AccountId, endowed_accounts: Option>, ) -> polkadot_test_runtime::GenesisConfig { use polkadot_test_runtime as runtime; let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); const ENDOWMENT: u128 = 1_000_000 * DOTS; const STASH: u128 = 100 * DOTS; runtime::GenesisConfig { frame_system: Some(runtime::SystemConfig { code: runtime::WASM_BINARY.expect("Wasm binary must be built for testing").to_vec(), ..Default::default() }), pallet_indices: Some(runtime::IndicesConfig { indices: vec![] }), pallet_balances: Some(runtime::BalancesConfig { balances: endowed_accounts .iter() .map(|k| (k.clone(), ENDOWMENT)) .collect(), }), pallet_session: Some(runtime::SessionConfig { keys: initial_authorities .iter() .map(|x| { ( x.0.clone(), x.0.clone(), runtime::SessionKeys { babe: x.2.clone(), grandpa: x.3.clone(), parachain_validator: x.4.clone(), authority_discovery: x.5.clone(), }, ) }) .collect::>(), }), pallet_staking: Some(runtime::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities .iter() .map(|x| { ( x.0.clone(), x.1.clone(), STASH, runtime::StakerStatus::Validator, ) }) .collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), force_era: Forcing::NotForcing, slash_reward_fraction: Perbill::from_percent(10), ..Default::default() }), pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_authority_discovery: Some(runtime::AuthorityDiscoveryConfig { keys: vec![] }), claims: Some(runtime::ClaimsConfig { claims: vec![], vesting: vec![], }), pallet_vesting: Some(runtime::VestingConfig { vesting: vec![] }), pallet_sudo: Some(runtime::SudoConfig { key: root_key }), parachains_configuration: Some(runtime::ParachainsConfigurationConfig { config: polkadot_runtime_parachains::configuration::HostConfiguration { validation_upgrade_frequency: 10u32, validation_upgrade_delay: 5, acceptance_period: 1200, max_code_size: 5 * 1024 * 1024, max_pov_size: 50 * 1024 * 1024, max_head_data_size: 32 * 1024, group_rotation_frequency: 10, ..Default::default() }, }), } } /// Can be called for a `Configuration` to check if it is a configuration for the `Test` network. pub trait IdentifyVariant { /// Returns if this is a configuration for the `Test` network. fn is_test(&self) -> bool; } impl IdentifyVariant for Box { fn is_test(&self) -> bool { self.id().starts_with("test") } }