git.delta.rocks / unique-network / refs/commits / 8a7a7333f525

difftreelog

Merge pull request #877 from UniqueNetwork/fix/sapphire-runtime

Yaroslav Bolyukin2023-02-09parents: #8d17f4c #a921b70.patch.diff
in: master

1 file changed

modifiednode/cli/src/chain_spec.rsdiffbeforeafterboth
before · node/cli/src/chain_spec.rs
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") || 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}
after · node/cli/src/chain_spec.rs
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}