git.delta.rocks / unique-network / refs/commits / 3e664068170a

difftreelog

source

node/cli/src/chain_spec.rs9.1 KiBsourcehistory
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;5657pub enum RuntimeId {58	#[cfg(feature = "unique-runtime")]59	Unique,6061	#[cfg(feature = "quartz-runtime")]62	Quartz,6364	Opal,65	Unknown(String),66}6768#[cfg(not(feature = "unique-runtime"))]69/// PARA_ID for Opal/Sapphire/Quartz70const PARA_ID: u32 = 2095;7172#[cfg(feature = "unique-runtime")]73/// PARA_ID for Unique74const PARA_ID: u32 = 2037;7576pub trait RuntimeIdentification {77	fn runtime_id(&self) -> RuntimeId;78}7980impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {81	fn runtime_id(&self) -> RuntimeId {82		#[cfg(feature = "unique-runtime")]83		if self.id().starts_with("unique") || self.id().starts_with("unq") {84			return RuntimeId::Unique;85		}8687		#[cfg(feature = "quartz-runtime")]88		if self.id().starts_with("quartz") || self.id().starts_with("qtz") {89			return RuntimeId::Quartz;90		}9192		if self.id().starts_with("opal")93			|| self.id().starts_with("sapphire")94			|| self.id() == "dev"95			|| self.id() == "local_testnet"96		{97			return RuntimeId::Opal;98		}99100		RuntimeId::Unknown(self.id().into())101	}102}103104pub enum ServiceId {105	Prod,106	Dev,107}108109pub trait ServiceIdentification {110	fn service_id(&self) -> ServiceId;111}112113impl ServiceIdentification for Box<dyn sc_service::ChainSpec> {114	fn service_id(&self) -> ServiceId {115		if self.id().ends_with("dev") {116			ServiceId::Dev117		} else {118			ServiceId::Prod119		}120	}121}122123/// Helper function to generate a crypto pair from seed124pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {125	TPublic::Pair::from_string(&format!("//{}", seed), None)126		.expect("static values are valid; qed")127		.public()128}129130/// The extensions for the [`DefaultChainSpec`].131#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]132#[serde(deny_unknown_fields)]133pub struct Extensions {134	/// The relay chain of the Parachain.135	pub relay_chain: String,136	/// The id of the Parachain.137	pub para_id: u32,138}139140impl Extensions {141	/// Try to get the extension from the given `ChainSpec`.142	pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {143		sc_chain_spec::get_extension(chain_spec.extensions())144	}145}146147type AccountPublic = <Signature as Verify>::Signer;148149/// Helper function to generate an account ID from seed150pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId151where152	AccountPublic: From<<TPublic::Pair as Pair>::Public>,153{154	AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()155}156157macro_rules! testnet_genesis {158	(159		$runtime:path,160		$root_key:expr,161		$initial_authorities:expr,162		$endowed_accounts:expr,163		$id:expr164	) => {{165		use $runtime::*;166167		GenesisConfig {168			system: SystemConfig {169				code: WASM_BINARY170					.expect("WASM binary was not build, please build it!")171					.to_vec(),172			},173			balances: BalancesConfig {174				balances: $endowed_accounts175					.iter()176					.cloned()177					// 1e13 UNQ178					.map(|k| (k, 1 << 100))179					.collect(),180			},181			treasury: Default::default(),182			tokens: TokensConfig { balances: vec![] },183			sudo: SudoConfig {184				key: Some($root_key),185			},186			vesting: VestingConfig { vesting: vec![] },187			parachain_info: ParachainInfoConfig {188				parachain_id: $id.into(),189			},190			parachain_system: Default::default(),191			aura: AuraConfig {192				authorities: $initial_authorities,193			},194			aura_ext: Default::default(),195			evm: EVMConfig {196				accounts: BTreeMap::new(),197			},198			ethereum: EthereumConfig {},199		}200	}};201}202203pub fn development_config() -> DefaultChainSpec {204	let mut properties = Map::new();205	properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());206	properties.insert("tokenDecimals".into(), 18.into());207	properties.insert(208		"ss58Format".into(),209		default_runtime::SS58Prefix::get().into(),210	);211212	DefaultChainSpec::from_genesis(213		// Name214		format!(215			"{}{}",216			default_runtime::RUNTIME_NAME.to_uppercase(),217			if cfg!(feature = "unique-runtime") {218				""219			} else {220				" by UNIQUE"221			}222		)223		.as_str(),224		// ID225		format!("{}_dev", default_runtime::RUNTIME_NAME).as_str(),226		ChainType::Local,227		move || {228			testnet_genesis!(229				default_runtime,230				// Sudo account231				get_account_id_from_seed::<sr25519::Public>("Alice"),232				vec![233					get_from_seed::<AuraId>("Alice"),234					get_from_seed::<AuraId>("Bob"),235				],236				// Pre-funded accounts237				vec![238					get_account_id_from_seed::<sr25519::Public>("Alice"),239					get_account_id_from_seed::<sr25519::Public>("Bob"),240					get_account_id_from_seed::<sr25519::Public>("Charlie"),241					get_account_id_from_seed::<sr25519::Public>("Dave"),242					get_account_id_from_seed::<sr25519::Public>("Eve"),243					get_account_id_from_seed::<sr25519::Public>("Ferdie"),244					get_account_id_from_seed::<sr25519::Public>("Alice//stash"),245					get_account_id_from_seed::<sr25519::Public>("Bob//stash"),246					get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),247					get_account_id_from_seed::<sr25519::Public>("Dave//stash"),248					get_account_id_from_seed::<sr25519::Public>("Eve//stash"),249					get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),250				],251				PARA_ID252			)253		},254		// Bootnodes255		vec![],256		// Telemetry257		None,258		// Protocol ID259		None,260		None,261		// Properties262		Some(properties),263		// Extensions264		Extensions {265			relay_chain: "rococo-dev".into(),266			para_id: PARA_ID,267		},268	)269}270271pub fn local_testnet_config() -> DefaultChainSpec {272	let mut properties = Map::new();273	properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());274	properties.insert("tokenDecimals".into(), 18.into());275	properties.insert(276		"ss58Format".into(),277		default_runtime::SS58Prefix::get().into(),278	);279280	DefaultChainSpec::from_genesis(281		// Name282		format!(283			"{}{}",284			default_runtime::RUNTIME_NAME.to_uppercase(),285			if cfg!(feature = "unique-runtime") {286				""287			} else {288				" by UNIQUE"289			}290		)291		.as_str(),292		// ID293		format!("{}_local", default_runtime::RUNTIME_NAME).as_str(),294		ChainType::Local,295		move || {296			testnet_genesis!(297				default_runtime,298				// Sudo account299				get_account_id_from_seed::<sr25519::Public>("Alice"),300				vec![301					get_from_seed::<AuraId>("Alice"),302					get_from_seed::<AuraId>("Bob"),303				],304				// Pre-funded accounts305				vec![306					get_account_id_from_seed::<sr25519::Public>("Alice"),307					get_account_id_from_seed::<sr25519::Public>("Bob"),308					get_account_id_from_seed::<sr25519::Public>("Charlie"),309					get_account_id_from_seed::<sr25519::Public>("Dave"),310					get_account_id_from_seed::<sr25519::Public>("Eve"),311					get_account_id_from_seed::<sr25519::Public>("Ferdie"),312					get_account_id_from_seed::<sr25519::Public>("Alice//stash"),313					get_account_id_from_seed::<sr25519::Public>("Bob//stash"),314					get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),315					get_account_id_from_seed::<sr25519::Public>("Dave//stash"),316					get_account_id_from_seed::<sr25519::Public>("Eve//stash"),317					get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),318				],319				PARA_ID320			)321		},322		// Bootnodes323		vec![],324		// Telemetry325		None,326		// Protocol ID327		None,328		None,329		// Properties330		Some(properties),331		// Extensions332		Extensions {333			relay_chain: "westend-local".into(),334			para_id: PARA_ID,335		},336	)337}