difftreelog
cargo fmt
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 unique_runtime_common::types::*;2728#[cfg(feature = "unique-runtime")]29use unique_runtime as default_runtime;3031#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]32use quartz_runtime as default_runtime;3334#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]35use 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}6768pub trait RuntimeIdentification {69 fn runtime_id(&self) -> RuntimeId;70}7172impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {73 fn runtime_id(&self) -> RuntimeId {74 #[cfg(feature = "unique-runtime")]75 if self.id().starts_with("unique") {76 return RuntimeId::Unique;77 }7879 #[cfg(feature = "quartz-runtime")]80 if self.id().starts_with("quartz") {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 [`ChainSpec`].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}144145macro_rules! testnet_genesis {146 (147 $runtime:path,148 $root_key:expr,149 $initial_authorities:expr,150 $endowed_accounts:expr,151 $id:expr152 ) => {{153 use $runtime::*;154155 GenesisConfig {156 system: SystemConfig {157 code: WASM_BINARY158 .expect("WASM binary was not build, please build it!")159 .to_vec(),160 },161 balances: BalancesConfig {162 balances: $endowed_accounts163 .iter()164 .cloned()165 // 1e13 UNQ166 .map(|k| (k, 1 << 100))167 .collect(),168 },169 treasury: Default::default(),170 sudo: SudoConfig {171 key: Some($root_key),172 },173 vesting: VestingConfig { vesting: vec![] },174 parachain_info: ParachainInfoConfig { parachain_id: $id.into() },175 parachain_system: Default::default(),176 aura: AuraConfig {177 authorities: $initial_authorities,178 },179 aura_ext: Default::default(),180 evm: EVMConfig {181 accounts: BTreeMap::new(),182 },183 ethereum: EthereumConfig {},184 }185 }};186}187188pub fn development_config() -> OpalChainSpec {189 let mut properties = Map::new();190 properties.insert("tokenSymbol".into(), opal_runtime::TOKEN_SYMBOL.into());191 properties.insert("tokenDecimals".into(), 18.into());192 properties.insert("ss58Format".into(), opal_runtime::SS58Prefix::get().into());193194 OpalChainSpec::from_genesis(195 // Name196 "OPAL by UNIQUE",197 // ID198 "opal_dev",199 ChainType::Local,200 move || {201 testnet_genesis!(202 opal_runtime,203204 // Sudo account205 get_account_id_from_seed::<sr25519::Public>("Alice"),206 vec![207 get_from_seed::<AuraId>("Alice"),208 get_from_seed::<AuraId>("Bob"),209 ],210 // Pre-funded accounts211 vec![212 get_account_id_from_seed::<sr25519::Public>("Alice"),213 get_account_id_from_seed::<sr25519::Public>("Bob"),214 ],215 1000216 )217 },218 // Bootnodes219 vec![],220 // Telemetry221 None,222 // Protocol ID223 None,224 None,225 // Properties226 Some(properties),227 // Extensions228 Extensions {229 relay_chain: "rococo-dev".into(),230 para_id: 1000,231 },232 )233}234235pub fn local_testnet_rococo_config() -> DefaultChainSpec {236 let mut properties = Map::new();237 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());238 properties.insert("tokenDecimals".into(), 18.into());239 properties.insert("ss58Format".into(), default_runtime::SS58Prefix::get().into());240241 DefaultChainSpec::from_genesis(242 // Name243 format!(244 "{}{}",245 default_runtime::RUNTIME_NAME.to_uppercase(),246 if cfg!(feature = "unique-runtime") { "" } else { " by UNIQUE" }247 ).as_str(),248 // ID249 format!("{}_local", default_runtime::RUNTIME_NAME).as_str(),250 ChainType::Local,251 move || {252 testnet_genesis!(253 default_runtime,254255 // Sudo account256 get_account_id_from_seed::<sr25519::Public>("Alice"),257 vec![258 get_from_seed::<AuraId>("Alice"),259 get_from_seed::<AuraId>("Bob"),260 ],261 // Pre-funded accounts262 vec![263 get_account_id_from_seed::<sr25519::Public>("Alice"),264 get_account_id_from_seed::<sr25519::Public>("Bob"),265 get_account_id_from_seed::<sr25519::Public>("Charlie"),266 get_account_id_from_seed::<sr25519::Public>("Dave"),267 get_account_id_from_seed::<sr25519::Public>("Eve"),268 get_account_id_from_seed::<sr25519::Public>("Ferdie"),269 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),270 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),271 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),272 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),273 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),274 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),275 ],276 1000277 )278 },279 // Bootnodes280 vec![],281 // Telemetry282 None,283 // Protocol ID284 None,285 None,286 // Properties287 Some(properties),288 // Extensions289 Extensions {290 relay_chain: "rococo-local".into(),291 para_id: 1000,292 },293 )294}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 unique_runtime_common::types::*;2728#[cfg(feature = "unique-runtime")]29use unique_runtime as default_runtime;3031#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]32use quartz_runtime as default_runtime;3334#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]35use 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}6768pub trait RuntimeIdentification {69 fn runtime_id(&self) -> RuntimeId;70}7172impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {73 fn runtime_id(&self) -> RuntimeId {74 #[cfg(feature = "unique-runtime")]75 if self.id().starts_with("unique") {76 return RuntimeId::Unique;77 }7879 #[cfg(feature = "quartz-runtime")]80 if self.id().starts_with("quartz") {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 [`ChainSpec`].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}144145macro_rules! testnet_genesis {146 (147 $runtime:path,148 $root_key:expr,149 $initial_authorities:expr,150 $endowed_accounts:expr,151 $id:expr152 ) => {{153 use $runtime::*;154155 GenesisConfig {156 system: SystemConfig {157 code: WASM_BINARY158 .expect("WASM binary was not build, please build it!")159 .to_vec(),160 },161 balances: BalancesConfig {162 balances: $endowed_accounts163 .iter()164 .cloned()165 // 1e13 UNQ166 .map(|k| (k, 1 << 100))167 .collect(),168 },169 treasury: Default::default(),170 sudo: SudoConfig {171 key: Some($root_key),172 },173 vesting: VestingConfig { vesting: vec![] },174 parachain_info: ParachainInfoConfig {175 parachain_id: $id.into(),176 },177 parachain_system: Default::default(),178 aura: AuraConfig {179 authorities: $initial_authorities,180 },181 aura_ext: Default::default(),182 evm: EVMConfig {183 accounts: BTreeMap::new(),184 },185 ethereum: EthereumConfig {},186 }187 }};188}189190pub fn development_config() -> OpalChainSpec {191 let mut properties = Map::new();192 properties.insert("tokenSymbol".into(), opal_runtime::TOKEN_SYMBOL.into());193 properties.insert("tokenDecimals".into(), 18.into());194 properties.insert("ss58Format".into(), opal_runtime::SS58Prefix::get().into());195196 OpalChainSpec::from_genesis(197 // Name198 "OPAL by UNIQUE",199 // ID200 "opal_dev",201 ChainType::Local,202 move || {203 testnet_genesis!(204 opal_runtime,205 // Sudo account206 get_account_id_from_seed::<sr25519::Public>("Alice"),207 vec![208 get_from_seed::<AuraId>("Alice"),209 get_from_seed::<AuraId>("Bob"),210 ],211 // Pre-funded accounts212 vec![213 get_account_id_from_seed::<sr25519::Public>("Alice"),214 get_account_id_from_seed::<sr25519::Public>("Bob"),215 ],216 1000217 )218 },219 // Bootnodes220 vec![],221 // Telemetry222 None,223 // Protocol ID224 None,225 None,226 // Properties227 Some(properties),228 // Extensions229 Extensions {230 relay_chain: "rococo-dev".into(),231 para_id: 1000,232 },233 )234}235236pub fn local_testnet_rococo_config() -> DefaultChainSpec {237 let mut properties = Map::new();238 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());239 properties.insert("tokenDecimals".into(), 18.into());240 properties.insert(241 "ss58Format".into(),242 default_runtime::SS58Prefix::get().into(),243 );244245 DefaultChainSpec::from_genesis(246 // Name247 format!(248 "{}{}",249 default_runtime::RUNTIME_NAME.to_uppercase(),250 if cfg!(feature = "unique-runtime") {251 ""252 } else {253 " by UNIQUE"254 }255 )256 .as_str(),257 // ID258 format!("{}_local", default_runtime::RUNTIME_NAME).as_str(),259 ChainType::Local,260 move || {261 testnet_genesis!(262 default_runtime,263 // Sudo account264 get_account_id_from_seed::<sr25519::Public>("Alice"),265 vec![266 get_from_seed::<AuraId>("Alice"),267 get_from_seed::<AuraId>("Bob"),268 ],269 // Pre-funded accounts270 vec![271 get_account_id_from_seed::<sr25519::Public>("Alice"),272 get_account_id_from_seed::<sr25519::Public>("Bob"),273 get_account_id_from_seed::<sr25519::Public>("Charlie"),274 get_account_id_from_seed::<sr25519::Public>("Dave"),275 get_account_id_from_seed::<sr25519::Public>("Eve"),276 get_account_id_from_seed::<sr25519::Public>("Ferdie"),277 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),278 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),279 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),280 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),281 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),282 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),283 ],284 1000285 )286 },287 // Bootnodes288 vec![],289 // Telemetry290 None,291 // Protocol ID292 None,293 None,294 // Properties295 Some(properties),296 // Extensions297 Extensions {298 relay_chain: "rococo-local".into(),299 para_id: 1000,300 },301 )302}