mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 15:47:58 +00:00
2e4b8996c4
Related to https://github.com/paritytech/polkadot-sdk/issues/2787 Adding BEEFY support to the kitchensink chain in order to be able to extend the current warp sync zombienet tests with BEEFY enabled
542 lines
18 KiB
Rust
542 lines
18 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
|
|
|
// This program 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.
|
|
|
|
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
//! Substrate chain configurations.
|
|
|
|
use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId;
|
|
use grandpa_primitives::AuthorityId as GrandpaId;
|
|
use kitchensink_runtime::{
|
|
constants::currency::*, wasm_binary_unwrap, Block, MaxNominations, SessionKeys, StakerStatus,
|
|
};
|
|
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
|
|
use sc_chain_spec::ChainSpecExtension;
|
|
use sc_service::ChainType;
|
|
use sc_telemetry::TelemetryEndpoints;
|
|
use serde::{Deserialize, Serialize};
|
|
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
|
|
use sp_consensus_babe::AuthorityId as BabeId;
|
|
use sp_core::{crypto::UncheckedInto, sr25519, Pair, Public};
|
|
use sp_mixnet::types::AuthorityId as MixnetId;
|
|
use sp_runtime::{
|
|
traits::{IdentifyAccount, Verify},
|
|
Perbill,
|
|
};
|
|
|
|
pub use kitchensink_runtime::RuntimeGenesisConfig;
|
|
pub use node_primitives::{AccountId, Balance, Signature};
|
|
|
|
type AccountPublic = <Signature as Verify>::Signer;
|
|
|
|
const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
|
|
const ENDOWMENT: Balance = 10_000_000 * DOLLARS;
|
|
const STASH: Balance = ENDOWMENT / 1000;
|
|
|
|
/// Node `ChainSpec` extensions.
|
|
///
|
|
/// Additional parameters for some Substrate core modules,
|
|
/// customizable from the chain spec.
|
|
#[derive(Default, Clone, Serialize, Deserialize, ChainSpecExtension)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct Extensions {
|
|
/// Block numbers with known hashes.
|
|
pub fork_blocks: sc_client_api::ForkBlocks<Block>,
|
|
/// Known bad block hashes.
|
|
pub bad_blocks: sc_client_api::BadBlocks<Block>,
|
|
/// The light sync state extension used by the sync-state rpc.
|
|
pub light_sync_state: sc_sync_state_rpc::LightSyncStateExtension,
|
|
}
|
|
|
|
/// Specialized `ChainSpec`.
|
|
pub type ChainSpec = sc_service::GenericChainSpec<RuntimeGenesisConfig, Extensions>;
|
|
/// Flaming Fir testnet generator
|
|
pub fn flaming_fir_config() -> Result<ChainSpec, String> {
|
|
ChainSpec::from_json_bytes(&include_bytes!("../res/flaming-fir.json")[..])
|
|
}
|
|
|
|
fn session_keys(
|
|
grandpa: GrandpaId,
|
|
babe: BabeId,
|
|
im_online: ImOnlineId,
|
|
authority_discovery: AuthorityDiscoveryId,
|
|
mixnet: MixnetId,
|
|
beefy: BeefyId,
|
|
) -> SessionKeys {
|
|
SessionKeys { grandpa, babe, im_online, authority_discovery, mixnet, beefy }
|
|
}
|
|
|
|
fn configure_accounts_for_staging_testnet() -> (
|
|
Vec<(
|
|
AccountId,
|
|
AccountId,
|
|
GrandpaId,
|
|
BabeId,
|
|
ImOnlineId,
|
|
AuthorityDiscoveryId,
|
|
MixnetId,
|
|
BeefyId,
|
|
)>,
|
|
AccountId,
|
|
Vec<AccountId>,
|
|
) {
|
|
#[rustfmt::skip]
|
|
// stash, controller, session-key, beefy id
|
|
// generated with secret:
|
|
// for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/fir/$j/$i; done; done
|
|
//
|
|
// and
|
|
//
|
|
// for i in 1 2 3 4 ; do for j in session; do subkey inspect --scheme ed25519 "$secret"//fir//$j//$i; done; done
|
|
//
|
|
// and
|
|
//
|
|
// for i in 1 2 3 4 ; do for j in session; do subkey inspect --scheme ecdsa "$secret"//fir//$j//$i; done; done
|
|
|
|
let initial_authorities: Vec<(
|
|
AccountId,
|
|
AccountId,
|
|
GrandpaId,
|
|
BabeId,
|
|
ImOnlineId,
|
|
AuthorityDiscoveryId,
|
|
MixnetId,
|
|
BeefyId,
|
|
)> = vec![
|
|
(
|
|
// 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy
|
|
array_bytes::hex_n_into_unchecked("9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"),
|
|
// 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq
|
|
array_bytes::hex_n_into_unchecked("781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"),
|
|
// 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC
|
|
array_bytes::hex2array_unchecked("9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332")
|
|
.unchecked_into(),
|
|
// 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8
|
|
array_bytes::hex2array_unchecked("6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106")
|
|
.unchecked_into(),
|
|
// 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8
|
|
array_bytes::hex2array_unchecked("6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106")
|
|
.unchecked_into(),
|
|
// 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8
|
|
array_bytes::hex2array_unchecked("6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106")
|
|
.unchecked_into(),
|
|
// 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8
|
|
array_bytes::hex2array_unchecked("6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106")
|
|
.unchecked_into(),
|
|
// 5DMLFcDdLLQbw696YfHaWBpQR99HwR456ycSCfr6L7KXGYK8
|
|
array_bytes::hex2array_unchecked("035560fafa241739869360aa4b32bc98953172ceb41a19c6cc1a27962fb3d1ecec")
|
|
.unchecked_into(),
|
|
),
|
|
(
|
|
// 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2
|
|
array_bytes::hex_n_into_unchecked("68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"),
|
|
// 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF
|
|
array_bytes::hex_n_into_unchecked("c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"),
|
|
// 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE
|
|
array_bytes::hex2array_unchecked("7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f")
|
|
.unchecked_into(),
|
|
// 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ
|
|
array_bytes::hex2array_unchecked("482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e")
|
|
.unchecked_into(),
|
|
// 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ
|
|
array_bytes::hex2array_unchecked("482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e")
|
|
.unchecked_into(),
|
|
// 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ
|
|
array_bytes::hex2array_unchecked("482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e")
|
|
.unchecked_into(),
|
|
// 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ
|
|
array_bytes::hex2array_unchecked("482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e")
|
|
.unchecked_into(),
|
|
// 5FYk11kNtB4178wLKJ2RNoUzzcjgRUciFe3SJDVZXhqX4dzG
|
|
array_bytes::hex2array_unchecked("02da1ab255ed888ee3e19b73d335fc13160b3eb10456c2d17c6a8ea7de403d2445")
|
|
.unchecked_into(),
|
|
),
|
|
(
|
|
// 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp
|
|
array_bytes::hex_n_into_unchecked("547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"),
|
|
// 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9
|
|
array_bytes::hex_n_into_unchecked("9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"),
|
|
// 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d
|
|
array_bytes::hex2array_unchecked("5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440")
|
|
.unchecked_into(),
|
|
// 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH
|
|
array_bytes::hex2array_unchecked("482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a")
|
|
.unchecked_into(),
|
|
// 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH
|
|
array_bytes::hex2array_unchecked("482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a")
|
|
.unchecked_into(),
|
|
// 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH
|
|
array_bytes::hex2array_unchecked("482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a")
|
|
.unchecked_into(),
|
|
// 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH
|
|
array_bytes::hex2array_unchecked("482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a")
|
|
.unchecked_into(),
|
|
// 5GQx4FToRBPqfani6o7owFJE1UstiviqbPP7HPWyvtXWWukn
|
|
array_bytes::hex2array_unchecked("036a818b3f59579c5fbbe4fede64f49dbf090ba883eb2a175d5ca90e5adb5f0b3e")
|
|
.unchecked_into(),
|
|
),
|
|
(
|
|
// 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9
|
|
array_bytes::hex_n_into_unchecked("f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"),
|
|
// 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn
|
|
array_bytes::hex_n_into_unchecked("66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"),
|
|
// 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4
|
|
array_bytes::hex2array_unchecked("3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef")
|
|
.unchecked_into(),
|
|
// 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x
|
|
array_bytes::hex2array_unchecked("00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378")
|
|
.unchecked_into(),
|
|
// 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x
|
|
array_bytes::hex2array_unchecked("00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378")
|
|
.unchecked_into(),
|
|
// 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x
|
|
array_bytes::hex2array_unchecked("00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378")
|
|
.unchecked_into(),
|
|
// 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x
|
|
array_bytes::hex2array_unchecked("00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378")
|
|
.unchecked_into(),
|
|
// 5FCu2pY928VVHPgnNVJssvxFJZECyNe1CyH3WTG79Wisx58B
|
|
array_bytes::hex2array_unchecked("020ce02b963548f9f8ade8765f7a4a06638c17819c78422a1cc35b647873583eef")
|
|
.unchecked_into(),
|
|
),
|
|
];
|
|
|
|
// generated with secret: subkey inspect "$secret"/fir
|
|
let root_key: AccountId = array_bytes::hex_n_into_unchecked(
|
|
// 5Ff3iXP75ruzroPWRP2FYBHWnmGGBSb63857BgnzCoXNxfPo
|
|
"9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809",
|
|
);
|
|
|
|
let endowed_accounts: Vec<AccountId> = vec![root_key.clone()];
|
|
(initial_authorities, root_key, endowed_accounts)
|
|
}
|
|
|
|
fn staging_testnet_config_genesis() -> serde_json::Value {
|
|
let (initial_authorities, root_key, endowed_accounts) =
|
|
configure_accounts_for_staging_testnet();
|
|
testnet_genesis(initial_authorities, vec![], root_key, Some(endowed_accounts))
|
|
}
|
|
|
|
/// Staging testnet config.
|
|
pub fn staging_testnet_config() -> ChainSpec {
|
|
ChainSpec::builder(wasm_binary_unwrap(), Default::default())
|
|
.with_name("Staging Testnet")
|
|
.with_id("staging_testnet")
|
|
.with_chain_type(ChainType::Live)
|
|
.with_genesis_config_patch(staging_testnet_config_genesis())
|
|
.with_telemetry_endpoints(
|
|
TelemetryEndpoints::new(vec![(STAGING_TELEMETRY_URL.to_string(), 0)])
|
|
.expect("Staging telemetry url is valid; qed"),
|
|
)
|
|
.build()
|
|
}
|
|
|
|
/// Helper function to generate a crypto pair from seed.
|
|
pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
|
|
TPublic::Pair::from_string(&format!("//{}", seed), None)
|
|
.expect("static values are valid; qed")
|
|
.public()
|
|
}
|
|
|
|
/// Helper function to generate an account ID from seed.
|
|
pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
|
|
where
|
|
AccountPublic: From<<TPublic::Pair as Pair>::Public>,
|
|
{
|
|
AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
|
|
}
|
|
|
|
/// Helper function to generate stash, controller and session key from seed.
|
|
pub fn authority_keys_from_seed(
|
|
seed: &str,
|
|
) -> (AccountId, AccountId, GrandpaId, BabeId, ImOnlineId, AuthorityDiscoveryId, MixnetId, BeefyId)
|
|
{
|
|
(
|
|
get_account_id_from_seed::<sr25519::Public>(&format!("{}//stash", seed)),
|
|
get_account_id_from_seed::<sr25519::Public>(seed),
|
|
get_from_seed::<GrandpaId>(seed),
|
|
get_from_seed::<BabeId>(seed),
|
|
get_from_seed::<ImOnlineId>(seed),
|
|
get_from_seed::<AuthorityDiscoveryId>(seed),
|
|
get_from_seed::<MixnetId>(seed),
|
|
get_from_seed::<BeefyId>(seed),
|
|
)
|
|
}
|
|
|
|
fn configure_accounts(
|
|
initial_authorities: Vec<(
|
|
AccountId,
|
|
AccountId,
|
|
GrandpaId,
|
|
BabeId,
|
|
ImOnlineId,
|
|
AuthorityDiscoveryId,
|
|
MixnetId,
|
|
BeefyId,
|
|
)>,
|
|
initial_nominators: Vec<AccountId>,
|
|
endowed_accounts: Option<Vec<AccountId>>,
|
|
stash: Balance,
|
|
) -> (
|
|
Vec<(
|
|
AccountId,
|
|
AccountId,
|
|
GrandpaId,
|
|
BabeId,
|
|
ImOnlineId,
|
|
AuthorityDiscoveryId,
|
|
MixnetId,
|
|
BeefyId,
|
|
)>,
|
|
Vec<AccountId>,
|
|
usize,
|
|
Vec<(AccountId, AccountId, Balance, StakerStatus<AccountId>)>,
|
|
) {
|
|
let mut endowed_accounts: Vec<AccountId> = endowed_accounts.unwrap_or_else(|| {
|
|
vec![
|
|
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
|
get_account_id_from_seed::<sr25519::Public>("Bob"),
|
|
get_account_id_from_seed::<sr25519::Public>("Charlie"),
|
|
get_account_id_from_seed::<sr25519::Public>("Dave"),
|
|
get_account_id_from_seed::<sr25519::Public>("Eve"),
|
|
get_account_id_from_seed::<sr25519::Public>("Ferdie"),
|
|
get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
|
|
get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
|
|
get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
|
|
get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
|
|
get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
|
|
get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),
|
|
]
|
|
});
|
|
// endow all authorities and nominators.
|
|
initial_authorities
|
|
.iter()
|
|
.map(|x| &x.0)
|
|
.chain(initial_nominators.iter())
|
|
.for_each(|x| {
|
|
if !endowed_accounts.contains(x) {
|
|
endowed_accounts.push(x.clone())
|
|
}
|
|
});
|
|
|
|
// stakers: all validators and nominators.
|
|
let mut rng = rand::thread_rng();
|
|
let stakers = initial_authorities
|
|
.iter()
|
|
.map(|x| (x.0.clone(), x.0.clone(), stash, StakerStatus::Validator))
|
|
.chain(initial_nominators.iter().map(|x| {
|
|
use rand::{seq::SliceRandom, Rng};
|
|
let limit = (MaxNominations::get() as usize).min(initial_authorities.len());
|
|
let count = rng.gen::<usize>() % limit;
|
|
let nominations = initial_authorities
|
|
.as_slice()
|
|
.choose_multiple(&mut rng, count)
|
|
.into_iter()
|
|
.map(|choice| choice.0.clone())
|
|
.collect::<Vec<_>>();
|
|
(x.clone(), x.clone(), stash, StakerStatus::Nominator(nominations))
|
|
}))
|
|
.collect::<Vec<_>>();
|
|
|
|
let num_endowed_accounts = endowed_accounts.len();
|
|
|
|
(initial_authorities, endowed_accounts, num_endowed_accounts, stakers)
|
|
}
|
|
|
|
/// Helper function to create RuntimeGenesisConfig json patch for testing.
|
|
pub fn testnet_genesis(
|
|
initial_authorities: Vec<(
|
|
AccountId,
|
|
AccountId,
|
|
GrandpaId,
|
|
BabeId,
|
|
ImOnlineId,
|
|
AuthorityDiscoveryId,
|
|
MixnetId,
|
|
BeefyId,
|
|
)>,
|
|
initial_nominators: Vec<AccountId>,
|
|
root_key: AccountId,
|
|
endowed_accounts: Option<Vec<AccountId>>,
|
|
) -> serde_json::Value {
|
|
let (initial_authorities, endowed_accounts, num_endowed_accounts, stakers) =
|
|
configure_accounts(initial_authorities, initial_nominators, endowed_accounts, STASH);
|
|
|
|
serde_json::json!({
|
|
"balances": {
|
|
"balances": endowed_accounts.iter().cloned().map(|x| (x, ENDOWMENT)).collect::<Vec<_>>(),
|
|
},
|
|
"session": {
|
|
"keys": initial_authorities
|
|
.iter()
|
|
.map(|x| {
|
|
(
|
|
x.0.clone(),
|
|
x.0.clone(),
|
|
session_keys(
|
|
x.2.clone(),
|
|
x.3.clone(),
|
|
x.4.clone(),
|
|
x.5.clone(),
|
|
x.6.clone(),
|
|
x.7.clone(),
|
|
),
|
|
)
|
|
})
|
|
.collect::<Vec<_>>(),
|
|
},
|
|
"staking": {
|
|
"validatorCount": initial_authorities.len() as u32,
|
|
"minimumValidatorCount": initial_authorities.len() as u32,
|
|
"invulnerables": initial_authorities.iter().map(|x| x.0.clone()).collect::<Vec<_>>(),
|
|
"slashRewardFraction": Perbill::from_percent(10),
|
|
"stakers": stakers.clone(),
|
|
},
|
|
"elections": {
|
|
"members": endowed_accounts
|
|
.iter()
|
|
.take((num_endowed_accounts + 1) / 2)
|
|
.cloned()
|
|
.map(|member| (member, STASH))
|
|
.collect::<Vec<_>>(),
|
|
},
|
|
"technicalCommittee": {
|
|
"members": endowed_accounts
|
|
.iter()
|
|
.take((num_endowed_accounts + 1) / 2)
|
|
.cloned()
|
|
.collect::<Vec<_>>(),
|
|
},
|
|
"sudo": { "key": Some(root_key.clone()) },
|
|
"babe": {
|
|
"epochConfig": Some(kitchensink_runtime::BABE_GENESIS_EPOCH_CONFIG),
|
|
},
|
|
"society": { "pot": 0 },
|
|
"assets": {
|
|
// This asset is used by the NIS pallet as counterpart currency.
|
|
"assets": vec![(9, get_account_id_from_seed::<sr25519::Public>("Alice"), true, 1)],
|
|
},
|
|
"nominationPools": {
|
|
"minCreateBond": 10 * DOLLARS,
|
|
"minJoinBond": 1 * DOLLARS,
|
|
},
|
|
})
|
|
}
|
|
|
|
fn development_config_genesis_json() -> serde_json::Value {
|
|
testnet_genesis(
|
|
vec![authority_keys_from_seed("Alice")],
|
|
vec![],
|
|
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
|
None,
|
|
)
|
|
}
|
|
|
|
/// Development config (single validator Alice).
|
|
pub fn development_config() -> ChainSpec {
|
|
ChainSpec::builder(wasm_binary_unwrap(), Default::default())
|
|
.with_name("Development")
|
|
.with_id("dev")
|
|
.with_chain_type(ChainType::Development)
|
|
.with_genesis_config_patch(development_config_genesis_json())
|
|
.build()
|
|
}
|
|
|
|
fn local_testnet_genesis() -> serde_json::Value {
|
|
testnet_genesis(
|
|
vec![authority_keys_from_seed("Alice"), authority_keys_from_seed("Bob")],
|
|
vec![],
|
|
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
|
None,
|
|
)
|
|
}
|
|
|
|
/// Local testnet config (multivalidator Alice + Bob).
|
|
pub fn local_testnet_config() -> ChainSpec {
|
|
ChainSpec::builder(wasm_binary_unwrap(), Default::default())
|
|
.with_name("Local Testnet")
|
|
.with_id("local_testnet")
|
|
.with_chain_type(ChainType::Local)
|
|
.with_genesis_config_patch(local_testnet_genesis())
|
|
.build()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub(crate) mod tests {
|
|
use super::*;
|
|
use crate::service::{new_full_base, NewFullBase};
|
|
use sc_service_test;
|
|
use sp_runtime::BuildStorage;
|
|
|
|
/// Local testnet config (single validator - Alice).
|
|
pub fn integration_test_config_with_single_authority() -> ChainSpec {
|
|
ChainSpec::builder(wasm_binary_unwrap(), Default::default())
|
|
.with_name("Integration Test")
|
|
.with_id("test")
|
|
.with_chain_type(ChainType::Development)
|
|
.with_genesis_config_patch(testnet_genesis(
|
|
vec![authority_keys_from_seed("Alice")],
|
|
vec![],
|
|
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
|
None,
|
|
))
|
|
.build()
|
|
}
|
|
|
|
/// Local testnet config (multivalidator Alice + Bob).
|
|
pub fn integration_test_config_with_two_authorities() -> ChainSpec {
|
|
ChainSpec::builder(wasm_binary_unwrap(), Default::default())
|
|
.with_name("Integration Test")
|
|
.with_id("test")
|
|
.with_chain_type(ChainType::Development)
|
|
.with_genesis_config_patch(local_testnet_genesis())
|
|
.build()
|
|
}
|
|
|
|
#[test]
|
|
#[ignore]
|
|
fn test_connectivity() {
|
|
sp_tracing::try_init_simple();
|
|
|
|
sc_service_test::connectivity(integration_test_config_with_two_authorities(), |config| {
|
|
let NewFullBase { task_manager, client, network, sync, transaction_pool, .. } =
|
|
new_full_base(config, None, false, |_, _| ())?;
|
|
Ok(sc_service_test::TestNetComponents::new(
|
|
task_manager,
|
|
client,
|
|
network,
|
|
sync,
|
|
transaction_pool,
|
|
))
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn test_create_development_chain_spec() {
|
|
development_config().build_storage().unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_create_local_testnet_chain_spec() {
|
|
local_testnet_config().build_storage().unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_staging_test_net_chain_spec() {
|
|
staging_testnet_config().build_storage().unwrap();
|
|
}
|
|
}
|