difftreelog
Merge pull request #877 from UniqueNetwork/fix/sapphire-runtime
in: master
1 file changed
node/cli/src/chain_spec.rsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};18use sc_service::ChainType;19use sp_core::{sr25519, Pair, Public};20use sp_runtime::traits::{IdentifyAccount, Verify};21use std::collections::BTreeMap;2223use serde::{Deserialize, Serialize};24use serde_json::map::Map;2526use up_common::types::opaque::*;2728#[cfg(feature = "unique-runtime")]29pub use unique_runtime as default_runtime;3031#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]32pub use quartz_runtime as default_runtime;3334#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]35pub use opal_runtime as default_runtime;3637/// The `ChainSpec` parameterized for the unique runtime.38#[cfg(feature = "unique-runtime")]39pub type UniqueChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;4041/// The `ChainSpec` parameterized for the quartz runtime.42#[cfg(feature = "quartz-runtime")]43pub type QuartzChainSpec = sc_service::GenericChainSpec<quartz_runtime::GenesisConfig, Extensions>;4445/// The `ChainSpec` parameterized for the opal runtime.46pub type OpalChainSpec = sc_service::GenericChainSpec<opal_runtime::GenesisConfig, Extensions>;4748#[cfg(feature = "unique-runtime")]49pub type DefaultChainSpec = UniqueChainSpec;5051#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]52pub type DefaultChainSpec = QuartzChainSpec;5354#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]55pub type DefaultChainSpec = OpalChainSpec;5657#[cfg(not(feature = "unique-runtime"))]58/// PARA_ID for Opal/Sapphire/Quartz59const PARA_ID: u32 = 2095;6061#[cfg(feature = "unique-runtime")]62/// PARA_ID for Unique63const PARA_ID: u32 = 2037;6465pub trait RuntimeIdentification {66 fn runtime_id(&self) -> RuntimeId;67}6869impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {70 fn runtime_id(&self) -> RuntimeId {71 #[cfg(feature = "unique-runtime")]72 if self.id().starts_with("unique") || self.id().starts_with("unq") {73 return RuntimeId::Unique;74 }7576 #[cfg(feature = "quartz-runtime")]77 if self.id().starts_with("quartz") || self.id().starts_with("qtz") {78 return RuntimeId::Quartz;79 }8081 if self.id().starts_with("opal")82 || self.id().starts_with("sapphire")83 || self.id() == "dev"84 || self.id() == "local_testnet"85 {86 return RuntimeId::Opal;87 }8889 RuntimeId::Unknown(self.id().into())90 }91}9293pub enum ServiceId {94 Prod,95 Dev,96}9798pub trait ServiceIdentification {99 fn service_id(&self) -> ServiceId;100}101102impl ServiceIdentification for Box<dyn sc_service::ChainSpec> {103 fn service_id(&self) -> ServiceId {104 if self.id().ends_with("dev") {105 ServiceId::Dev106 } else {107 ServiceId::Prod108 }109 }110}111112/// Helper function to generate a crypto pair from seed113pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {114 TPublic::Pair::from_string(&format!("//{}", seed), None)115 .expect("static values are valid; qed")116 .public()117}118119/// The extensions for the [`DefaultChainSpec`].120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]121#[serde(deny_unknown_fields)]122pub struct Extensions {123 /// The relay chain of the Parachain.124 pub relay_chain: String,125 /// The id of the Parachain.126 pub para_id: u32,127}128129impl Extensions {130 /// Try to get the extension from the given `ChainSpec`.131 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {132 sc_chain_spec::get_extension(chain_spec.extensions())133 }134}135136type AccountPublic = <Signature as Verify>::Signer;137138/// Helper function to generate an account ID from seed139pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId140where141 AccountPublic: From<<TPublic::Pair as Pair>::Public>,142{143 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()144}145146#[cfg(not(feature = "unique-runtime"))]147macro_rules! testnet_genesis {148 (149 $runtime:path,150 $root_key:expr,151 $initial_invulnerables:expr,152 $endowed_accounts:expr,153 $id:expr154 ) => {{155 use $runtime::*;156157 GenesisConfig {158 system: SystemConfig {159 code: WASM_BINARY160 .expect("WASM binary was not build, please build it!")161 .to_vec(),162 },163 balances: BalancesConfig {164 balances: $endowed_accounts165 .iter()166 .cloned()167 // 1e13 UNQ168 .map(|k| (k, 1 << 100))169 .collect(),170 },171 treasury: Default::default(),172 tokens: TokensConfig { balances: vec![] },173 sudo: SudoConfig {174 key: Some($root_key),175 },176 vesting: VestingConfig { vesting: vec![] },177 parachain_info: ParachainInfoConfig {178 parachain_id: $id.into(),179 },180 parachain_system: Default::default(),181 collator_selection: CollatorSelectionConfig {182 invulnerables: $initial_invulnerables183 .iter()184 .cloned()185 .map(|(acc, _)| acc)186 .collect(),187 },188 session: SessionConfig {189 keys: $initial_invulnerables190 .into_iter()191 .map(|(acc, aura)| {192 (193 acc.clone(), // account id194 acc, // validator id195 SessionKeys { aura }, // session keys196 )197 })198 .collect(),199 },200 aura: Default::default(),201 aura_ext: Default::default(),202 evm: EVMConfig {203 accounts: BTreeMap::new(),204 },205 ethereum: EthereumConfig {},206 }207 }};208}209210#[cfg(feature = "unique-runtime")]211macro_rules! testnet_genesis {212 (213 $runtime:path,214 $root_key:expr,215 $initial_invulnerables:expr,216 $endowed_accounts:expr,217 $id:expr218 ) => {{219 use $runtime::*;220221 GenesisConfig {222 system: SystemConfig {223 code: WASM_BINARY224 .expect("WASM binary was not build, please build it!")225 .to_vec(),226 },227 balances: BalancesConfig {228 balances: $endowed_accounts229 .iter()230 .cloned()231 // 1e13 UNQ232 .map(|k| (k, 1 << 100))233 .collect(),234 },235 treasury: Default::default(),236 tokens: TokensConfig { balances: vec![] },237 sudo: SudoConfig {238 key: Some($root_key),239 },240 vesting: VestingConfig { vesting: vec![] },241 parachain_info: ParachainInfoConfig {242 parachain_id: $id.into(),243 },244 parachain_system: Default::default(),245 aura: AuraConfig {246 authorities: $initial_invulnerables247 .into_iter()248 .map(|(_, aura)| aura)249 .collect(),250 },251 aura_ext: Default::default(),252 evm: EVMConfig {253 accounts: BTreeMap::new(),254 },255 ethereum: EthereumConfig {},256 }257 }};258}259260pub fn development_config() -> DefaultChainSpec {261 let mut properties = Map::new();262 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());263 properties.insert("tokenDecimals".into(), 18.into());264 properties.insert(265 "ss58Format".into(),266 default_runtime::SS58Prefix::get().into(),267 );268269 DefaultChainSpec::from_genesis(270 // Name271 format!(272 "{}{}",273 default_runtime::RUNTIME_NAME.to_uppercase(),274 if cfg!(feature = "unique-runtime") {275 ""276 } else {277 " by UNIQUE"278 }279 )280 .as_str(),281 // ID282 format!("{}_dev", default_runtime::RUNTIME_NAME).as_str(),283 ChainType::Local,284 move || {285 testnet_genesis!(286 default_runtime,287 // Sudo account288 get_account_id_from_seed::<sr25519::Public>("Alice"),289 vec![290 (291 get_account_id_from_seed::<sr25519::Public>("Alice"),292 get_from_seed::<AuraId>("Alice"),293 ),294 (295 get_account_id_from_seed::<sr25519::Public>("Bob"),296 get_from_seed::<AuraId>("Bob"),297 ),298 ],299 // Pre-funded accounts300 vec![301 get_account_id_from_seed::<sr25519::Public>("Alice"),302 get_account_id_from_seed::<sr25519::Public>("Bob"),303 get_account_id_from_seed::<sr25519::Public>("Charlie"),304 get_account_id_from_seed::<sr25519::Public>("Dave"),305 get_account_id_from_seed::<sr25519::Public>("Eve"),306 get_account_id_from_seed::<sr25519::Public>("Ferdie"),307 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),308 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),309 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),310 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),311 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),312 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),313 ],314 PARA_ID315 )316 },317 // Bootnodes318 vec![],319 // Telemetry320 None,321 // Protocol ID322 None,323 None,324 // Properties325 Some(properties),326 // Extensions327 Extensions {328 relay_chain: "rococo-dev".into(),329 para_id: PARA_ID,330 },331 )332}333334pub fn local_testnet_config() -> DefaultChainSpec {335 let mut properties = Map::new();336 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());337 properties.insert("tokenDecimals".into(), 18.into());338 properties.insert(339 "ss58Format".into(),340 default_runtime::SS58Prefix::get().into(),341 );342343 DefaultChainSpec::from_genesis(344 // Name345 format!(346 "{}{}",347 default_runtime::RUNTIME_NAME.to_uppercase(),348 if cfg!(feature = "unique-runtime") {349 ""350 } else {351 " by UNIQUE"352 }353 )354 .as_str(),355 // ID356 format!("{}_local", default_runtime::RUNTIME_NAME).as_str(),357 ChainType::Local,358 move || {359 testnet_genesis!(360 default_runtime,361 // Sudo account362 get_account_id_from_seed::<sr25519::Public>("Alice"),363 vec![364 (365 get_account_id_from_seed::<sr25519::Public>("Alice"),366 get_from_seed::<AuraId>("Alice"),367 ),368 (369 get_account_id_from_seed::<sr25519::Public>("Bob"),370 get_from_seed::<AuraId>("Bob"),371 ),372 ],373 // Pre-funded accounts374 vec![375 get_account_id_from_seed::<sr25519::Public>("Alice"),376 get_account_id_from_seed::<sr25519::Public>("Bob"),377 get_account_id_from_seed::<sr25519::Public>("Charlie"),378 get_account_id_from_seed::<sr25519::Public>("Dave"),379 get_account_id_from_seed::<sr25519::Public>("Eve"),380 get_account_id_from_seed::<sr25519::Public>("Ferdie"),381 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),382 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),383 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),384 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),385 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),386 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),387 ],388 PARA_ID389 )390 },391 // Bootnodes392 vec![],393 // Telemetry394 None,395 // Protocol ID396 None,397 None,398 // Properties399 Some(properties),400 // Extensions401 Extensions {402 relay_chain: "westend-local".into(),403 para_id: PARA_ID,404 },405 )406}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};18use sc_service::ChainType;19use sp_core::{sr25519, Pair, Public};20use sp_runtime::traits::{IdentifyAccount, Verify};21use std::collections::BTreeMap;2223use serde::{Deserialize, Serialize};24use serde_json::map::Map;2526use up_common::types::opaque::*;2728#[cfg(feature = "unique-runtime")]29pub use unique_runtime as default_runtime;3031#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]32pub use quartz_runtime as default_runtime;3334#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]35pub use opal_runtime as default_runtime;3637/// The `ChainSpec` parameterized for the unique runtime.38#[cfg(feature = "unique-runtime")]39pub type UniqueChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;4041/// The `ChainSpec` parameterized for the quartz runtime.42#[cfg(feature = "quartz-runtime")]43pub type QuartzChainSpec = sc_service::GenericChainSpec<quartz_runtime::GenesisConfig, Extensions>;4445/// The `ChainSpec` parameterized for the opal runtime.46pub type OpalChainSpec = sc_service::GenericChainSpec<opal_runtime::GenesisConfig, Extensions>;4748#[cfg(feature = "unique-runtime")]49pub type DefaultChainSpec = UniqueChainSpec;5051#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]52pub type DefaultChainSpec = QuartzChainSpec;5354#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]55pub type DefaultChainSpec = OpalChainSpec;5657#[cfg(not(feature = "unique-runtime"))]58/// PARA_ID for Opal/Sapphire/Quartz59const PARA_ID: u32 = 2095;6061#[cfg(feature = "unique-runtime")]62/// PARA_ID for Unique63const PARA_ID: u32 = 2037;6465pub trait RuntimeIdentification {66 fn runtime_id(&self) -> RuntimeId;67}6869impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {70 fn runtime_id(&self) -> RuntimeId {71 #[cfg(feature = "unique-runtime")]72 if self.id().starts_with("unique") || self.id().starts_with("unq") {73 return RuntimeId::Unique;74 }7576 #[cfg(feature = "quartz-runtime")]77 if self.id().starts_with("quartz")78 || self.id().starts_with("qtz")79 || self.id().starts_with("sapphire")80 {81 return RuntimeId::Quartz;82 }8384 if self.id().starts_with("opal") || self.id() == "dev" || self.id() == "local_testnet" {85 return RuntimeId::Opal;86 }8788 RuntimeId::Unknown(self.id().into())89 }90}9192pub enum ServiceId {93 Prod,94 Dev,95}9697pub trait ServiceIdentification {98 fn service_id(&self) -> ServiceId;99}100101impl ServiceIdentification for Box<dyn sc_service::ChainSpec> {102 fn service_id(&self) -> ServiceId {103 if self.id().ends_with("dev") {104 ServiceId::Dev105 } else {106 ServiceId::Prod107 }108 }109}110111/// Helper function to generate a crypto pair from seed112pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {113 TPublic::Pair::from_string(&format!("//{}", seed), None)114 .expect("static values are valid; qed")115 .public()116}117118/// The extensions for the [`DefaultChainSpec`].119#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]120#[serde(deny_unknown_fields)]121pub struct Extensions {122 /// The relay chain of the Parachain.123 pub relay_chain: String,124 /// The id of the Parachain.125 pub para_id: u32,126}127128impl Extensions {129 /// Try to get the extension from the given `ChainSpec`.130 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {131 sc_chain_spec::get_extension(chain_spec.extensions())132 }133}134135type AccountPublic = <Signature as Verify>::Signer;136137/// Helper function to generate an account ID from seed138pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId139where140 AccountPublic: From<<TPublic::Pair as Pair>::Public>,141{142 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()143}144145#[cfg(not(feature = "unique-runtime"))]146macro_rules! testnet_genesis {147 (148 $runtime:path,149 $root_key:expr,150 $initial_invulnerables:expr,151 $endowed_accounts:expr,152 $id:expr153 ) => {{154 use $runtime::*;155156 GenesisConfig {157 system: SystemConfig {158 code: WASM_BINARY159 .expect("WASM binary was not build, please build it!")160 .to_vec(),161 },162 balances: BalancesConfig {163 balances: $endowed_accounts164 .iter()165 .cloned()166 // 1e13 UNQ167 .map(|k| (k, 1 << 100))168 .collect(),169 },170 treasury: Default::default(),171 tokens: TokensConfig { balances: vec![] },172 sudo: SudoConfig {173 key: Some($root_key),174 },175 vesting: VestingConfig { vesting: vec![] },176 parachain_info: ParachainInfoConfig {177 parachain_id: $id.into(),178 },179 parachain_system: Default::default(),180 collator_selection: CollatorSelectionConfig {181 invulnerables: $initial_invulnerables182 .iter()183 .cloned()184 .map(|(acc, _)| acc)185 .collect(),186 },187 session: SessionConfig {188 keys: $initial_invulnerables189 .into_iter()190 .map(|(acc, aura)| {191 (192 acc.clone(), // account id193 acc, // validator id194 SessionKeys { aura }, // session keys195 )196 })197 .collect(),198 },199 aura: Default::default(),200 aura_ext: Default::default(),201 evm: EVMConfig {202 accounts: BTreeMap::new(),203 },204 ethereum: EthereumConfig {},205 }206 }};207}208209#[cfg(feature = "unique-runtime")]210macro_rules! testnet_genesis {211 (212 $runtime:path,213 $root_key:expr,214 $initial_invulnerables:expr,215 $endowed_accounts:expr,216 $id:expr217 ) => {{218 use $runtime::*;219220 GenesisConfig {221 system: SystemConfig {222 code: WASM_BINARY223 .expect("WASM binary was not build, please build it!")224 .to_vec(),225 },226 balances: BalancesConfig {227 balances: $endowed_accounts228 .iter()229 .cloned()230 // 1e13 UNQ231 .map(|k| (k, 1 << 100))232 .collect(),233 },234 treasury: Default::default(),235 tokens: TokensConfig { balances: vec![] },236 sudo: SudoConfig {237 key: Some($root_key),238 },239 vesting: VestingConfig { vesting: vec![] },240 parachain_info: ParachainInfoConfig {241 parachain_id: $id.into(),242 },243 parachain_system: Default::default(),244 aura: AuraConfig {245 authorities: $initial_invulnerables246 .into_iter()247 .map(|(_, aura)| aura)248 .collect(),249 },250 aura_ext: Default::default(),251 evm: EVMConfig {252 accounts: BTreeMap::new(),253 },254 ethereum: EthereumConfig {},255 }256 }};257}258259pub fn development_config() -> DefaultChainSpec {260 let mut properties = Map::new();261 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());262 properties.insert("tokenDecimals".into(), 18.into());263 properties.insert(264 "ss58Format".into(),265 default_runtime::SS58Prefix::get().into(),266 );267268 DefaultChainSpec::from_genesis(269 // Name270 format!(271 "{}{}",272 default_runtime::RUNTIME_NAME.to_uppercase(),273 if cfg!(feature = "unique-runtime") {274 ""275 } else {276 " by UNIQUE"277 }278 )279 .as_str(),280 // ID281 format!("{}_dev", default_runtime::RUNTIME_NAME).as_str(),282 ChainType::Local,283 move || {284 testnet_genesis!(285 default_runtime,286 // Sudo account287 get_account_id_from_seed::<sr25519::Public>("Alice"),288 vec![289 (290 get_account_id_from_seed::<sr25519::Public>("Alice"),291 get_from_seed::<AuraId>("Alice"),292 ),293 (294 get_account_id_from_seed::<sr25519::Public>("Bob"),295 get_from_seed::<AuraId>("Bob"),296 ),297 ],298 // Pre-funded accounts299 vec![300 get_account_id_from_seed::<sr25519::Public>("Alice"),301 get_account_id_from_seed::<sr25519::Public>("Bob"),302 get_account_id_from_seed::<sr25519::Public>("Charlie"),303 get_account_id_from_seed::<sr25519::Public>("Dave"),304 get_account_id_from_seed::<sr25519::Public>("Eve"),305 get_account_id_from_seed::<sr25519::Public>("Ferdie"),306 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),307 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),308 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),309 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),310 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),311 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),312 ],313 PARA_ID314 )315 },316 // Bootnodes317 vec![],318 // Telemetry319 None,320 // Protocol ID321 None,322 None,323 // Properties324 Some(properties),325 // Extensions326 Extensions {327 relay_chain: "rococo-dev".into(),328 para_id: PARA_ID,329 },330 )331}332333pub fn local_testnet_config() -> DefaultChainSpec {334 let mut properties = Map::new();335 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());336 properties.insert("tokenDecimals".into(), 18.into());337 properties.insert(338 "ss58Format".into(),339 default_runtime::SS58Prefix::get().into(),340 );341342 DefaultChainSpec::from_genesis(343 // Name344 format!(345 "{}{}",346 default_runtime::RUNTIME_NAME.to_uppercase(),347 if cfg!(feature = "unique-runtime") {348 ""349 } else {350 " by UNIQUE"351 }352 )353 .as_str(),354 // ID355 format!("{}_local", default_runtime::RUNTIME_NAME).as_str(),356 ChainType::Local,357 move || {358 testnet_genesis!(359 default_runtime,360 // Sudo account361 get_account_id_from_seed::<sr25519::Public>("Alice"),362 vec![363 (364 get_account_id_from_seed::<sr25519::Public>("Alice"),365 get_from_seed::<AuraId>("Alice"),366 ),367 (368 get_account_id_from_seed::<sr25519::Public>("Bob"),369 get_from_seed::<AuraId>("Bob"),370 ),371 ],372 // Pre-funded accounts373 vec![374 get_account_id_from_seed::<sr25519::Public>("Alice"),375 get_account_id_from_seed::<sr25519::Public>("Bob"),376 get_account_id_from_seed::<sr25519::Public>("Charlie"),377 get_account_id_from_seed::<sr25519::Public>("Dave"),378 get_account_id_from_seed::<sr25519::Public>("Eve"),379 get_account_id_from_seed::<sr25519::Public>("Ferdie"),380 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),381 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),382 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),383 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),384 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),385 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),386 ],387 PARA_ID388 )389 },390 // Bootnodes391 vec![],392 // Telemetry393 None,394 // Protocol ID395 None,396 None,397 // Properties398 Some(properties),399 // Extensions400 Extensions {401 relay_chain: "westend-local".into(),402 para_id: PARA_ID,403 },404 )405}