#[cfg(test)]
use crate::chain_spec::{derive_bip44_pairs_from_mnemonic, get_account_id_from_pair};
use crate::chain_spec::{generate_accounts, get_from_seed, Extensions};
use cumulus_primitives_core::ParaId;
use hex_literal::hex;
use moonbeam_runtime::{
currency::{GLMR, SUPPLY_FACTOR},
genesis_config_preset::testnet_genesis,
AccountId, WASM_BINARY,
};
use nimbus_primitives::NimbusId;
use sc_service::ChainType;
#[cfg(test)]
use sp_core::ecdsa;
pub type ChainSpec = sc_service::GenericChainSpec<Extensions>;
pub fn development_chain_spec(mnemonic: Option<String>, num_accounts: Option<u32>) -> ChainSpec {
let parent_mnemonic = mnemonic.unwrap_or_else(|| {
"bottom drive obey lake curtain smoke basket hold race lonely fit walk".to_string()
});
let mut accounts = generate_accounts(parent_mnemonic, num_accounts.unwrap_or(10));
accounts.push(AccountId::from(hex!(
"6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b"
)));
ChainSpec::builder(
WASM_BINARY.expect("WASM binary was not build, please build it!"),
Extensions {
relay_chain: "dev-service".into(),
para_id: Default::default(),
},
)
.with_name("Moonbeam Development Testnet")
.with_id("moonbeam_dev")
.with_chain_type(ChainType::Development)
.with_properties(
serde_json::from_str(
"{\"tokenDecimals\": 18, \"tokenSymbol\": \"GLMR\", \"SS58Prefix\": 1284}",
)
.expect("Provided valid json map"),
)
.with_genesis_config(testnet_genesis(
vec![accounts[1], accounts[2], accounts[3]],
vec![accounts[0], accounts[1]],
vec![(
accounts[0],
get_from_seed::<NimbusId>("Alice"),
20_000 * GLMR * SUPPLY_FACTOR,
)],
vec![],
accounts.clone(),
1_500_000 * GLMR * SUPPLY_FACTOR,
Default::default(), 1281, ))
.build()
}
pub fn get_chain_spec(para_id: ParaId) -> ChainSpec {
ChainSpec::builder(
WASM_BINARY.expect("WASM binary was not build, please build it!"),
Extensions {
relay_chain: "polkadot-local".into(),
para_id: para_id.into(),
},
)
.with_name("Moonbeam Local Testnet")
.with_id("moonbeam_local")
.with_chain_type(ChainType::Local)
.with_properties(
serde_json::from_str(
"{\"tokenDecimals\": 18, \"tokenSymbol\": \"GLMR\", \"SS58Prefix\": 1284}",
)
.expect("Provided valid json map"),
)
.with_genesis_config(testnet_genesis(
vec![
AccountId::from(hex!("3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0")),
AccountId::from(hex!("798d4Ba9baf0064Ec19eB4F0a1a45785ae9D6DFc")),
AccountId::from(hex!("773539d4Ac0e786233D90A233654ccEE26a613D9")),
],
vec![
AccountId::from(hex!("f24FF3a9CF04c71Dbc94D0b566f7A27B94566cac")),
AccountId::from(hex!("3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0")),
],
vec![
(
AccountId::from(hex!("f24FF3a9CF04c71Dbc94D0b566f7A27B94566cac")),
get_from_seed::<NimbusId>("Alice"),
20_000 * GLMR * SUPPLY_FACTOR,
),
(
AccountId::from(hex!("3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0")),
get_from_seed::<NimbusId>("Bob"),
20_000 * GLMR * SUPPLY_FACTOR,
),
],
vec![],
vec![
AccountId::from(hex!("f24FF3a9CF04c71Dbc94D0b566f7A27B94566cac")),
AccountId::from(hex!("3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0")),
AccountId::from(hex!("798d4Ba9baf0064Ec19eB4F0a1a45785ae9D6DFc")),
AccountId::from(hex!("773539d4Ac0e786233D90A233654ccEE26a613D9")),
],
1_500_000 * GLMR * SUPPLY_FACTOR,
para_id,
1280, ))
.build()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_derived_pairs_1() {
let mnemonic =
"bottom drive obey lake curtain smoke basket hold race lonely fit walk".to_string();
let accounts = 10;
let pairs = derive_bip44_pairs_from_mnemonic::<ecdsa::Public>(&mnemonic, accounts);
let first_account = get_account_id_from_pair(pairs.first().unwrap().clone()).unwrap();
let last_account = get_account_id_from_pair(pairs.last().unwrap().clone()).unwrap();
let expected_first_account =
AccountId::from(hex!("f24FF3a9CF04c71Dbc94D0b566f7A27B94566cac"));
let expected_last_account =
AccountId::from(hex!("2898FE7a42Be376C8BC7AF536A940F7Fd5aDd423"));
assert_eq!(first_account, expected_first_account);
assert_eq!(last_account, expected_last_account);
assert_eq!(pairs.len(), 10);
}
#[test]
fn test_derived_pairs_2() {
let mnemonic =
"slab nerve salon plastic filter inherit valve ozone crash thumb quality whale"
.to_string();
let accounts = 20;
let pairs = derive_bip44_pairs_from_mnemonic::<ecdsa::Public>(&mnemonic, accounts);
let first_account = get_account_id_from_pair(pairs.first().unwrap().clone()).unwrap();
let last_account = get_account_id_from_pair(pairs.last().unwrap().clone()).unwrap();
let expected_first_account =
AccountId::from(hex!("1e56ca71b596f2b784a27a2fdffef053dbdeff83"));
let expected_last_account =
AccountId::from(hex!("4148202BF0c0Ad7697Cff87EbB83340C80c947f8"));
assert_eq!(first_account, expected_first_account);
assert_eq!(last_account, expected_last_account);
assert_eq!(pairs.len(), 20);
}
}