1234567891011121314151617use default_runtime::WASM_BINARY;18#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]19pub use opal_runtime as default_runtime;20#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]21pub use quartz_runtime as default_runtime;22use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};23use sc_service::ChainType;24use serde::{Deserialize, Serialize};25use serde_json::{json, map::Map};26use sp_core::{sr25519, Pair, Public};27use sp_runtime::traits::{IdentifyAccount, Verify};28#[cfg(feature = "unique-runtime")]29pub use unique_runtime as default_runtime;30use up_common::types::opaque::*;313233#[cfg(feature = "unique-runtime")]34pub type UniqueChainSpec =35 sc_service::GenericChainSpec<unique_runtime::RuntimeGenesisConfig, Extensions>;363738#[cfg(feature = "quartz-runtime")]39pub type QuartzChainSpec =40 sc_service::GenericChainSpec<quartz_runtime::RuntimeGenesisConfig, Extensions>;414243pub type OpalChainSpec =44 sc_service::GenericChainSpec<opal_runtime::RuntimeGenesisConfig, Extensions>;4546#[cfg(feature = "unique-runtime")]47pub type DefaultChainSpec = UniqueChainSpec;4849#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]50pub type DefaultChainSpec = QuartzChainSpec;5152#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]53pub type DefaultChainSpec = OpalChainSpec;5455#[cfg(not(feature = "unique-runtime"))]5657const PARA_ID: u32 = 2095;5859#[cfg(feature = "unique-runtime")]6061const PARA_ID: u32 = 2037;6263pub trait RuntimeIdentification {64 fn runtime_id(&self) -> RuntimeId;65}6667impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {68 fn runtime_id(&self) -> RuntimeId {69 #[cfg(feature = "unique-runtime")]70 if self.id().starts_with("unique") || self.id().starts_with("unq") {71 return RuntimeId::Unique;72 }7374 #[cfg(feature = "quartz-runtime")]75 if self.id().starts_with("quartz")76 || self.id().starts_with("qtz")77 || self.id().starts_with("sapphire")78 {79 return RuntimeId::Quartz;80 }8182 if self.id().starts_with("opal") || self.id() == "dev" || self.id() == "local_testnet" {83 return RuntimeId::Opal;84 }8586 RuntimeId::Unknown(self.id().into())87 }88}8990pub enum ServiceId {91 Prod,92 Dev,93}9495pub trait ServiceIdentification {96 fn service_id(&self) -> ServiceId;97}9899impl ServiceIdentification for Box<dyn sc_service::ChainSpec> {100 fn service_id(&self) -> ServiceId {101 if self.id().ends_with("dev") {102 ServiceId::Dev103 } else {104 ServiceId::Prod105 }106 }107}108109110pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {111 TPublic::Pair::from_string(&format!("//{seed}"), None)112 .expect("static values are valid; qed")113 .public()114}115116117#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]118#[serde(deny_unknown_fields)]119pub struct Extensions {120 121 pub relay_chain: String,122 123 pub para_id: u32,124}125126impl Extensions {127 128 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {129 sc_chain_spec::get_extension(chain_spec.extensions())130 }131}132133type AccountPublic = <Signature as Verify>::Signer;134135136pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId137where138 AccountPublic: From<<TPublic::Pair as Pair>::Public>,139{140 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()141}142143pub fn test_config(chain_id: &str, relay_chain: &str) -> DefaultChainSpec {144 DefaultChainSpec::builder(145 WASM_BINARY.expect("WASM binary was not build, please build it!"),146 Extensions {147 relay_chain: relay_chain.into(),148 para_id: PARA_ID,149 },150 )151 .with_id(&format!(152 "{}_{}",153 default_runtime::VERSION.spec_name,154 chain_id155 ))156 .with_name(&format!(157 "{}{}",158 default_runtime::VERSION.spec_name.to_uppercase(),159 if cfg!(feature = "unique-runtime") {160 ""161 } else {162 " by UNIQUE"163 }164 ))165 .with_properties(chain_properties())166 .with_chain_type(ChainType::Development)167 .with_genesis_config_patch(genesis_patch())168 .build()169}170171fn genesis_patch() -> serde_json::Value {172 use default_runtime::*;173174 let invulnerables = ["Alice", "Bob"];175176 #[allow(unused_mut)]177 let mut patch = json!({178 "parachainInfo": {179 "parachainId": PARA_ID,180 },181182 "aura": {183 "authorities": invulnerables.into_iter()184 .map(|name| get_from_seed::<AuraId>(name))185 .collect::<Vec<_>>(),186 },187188 "session": {189 "keys": invulnerables.into_iter()190 .map(|name| {191 let account = get_account_id_from_seed::<sr25519::Public>(name);192 let aura = get_from_seed::<AuraId>(name);193194 (195 account.clone(),196 account,197 SessionKeys { aura },198 )199 })200 .collect::<Vec<_>>()201 },202203 "sudo": {204 "key": get_account_id_from_seed::<sr25519::Public>("Alice"),205 },206207 "balances": {208 "balances": &[209 get_account_id_from_seed::<sr25519::Public>("Alice"),210 get_account_id_from_seed::<sr25519::Public>("Bob"),211 get_account_id_from_seed::<sr25519::Public>("Charlie"),212 get_account_id_from_seed::<sr25519::Public>("Dave"),213 get_account_id_from_seed::<sr25519::Public>("Eve"),214 get_account_id_from_seed::<sr25519::Public>("Ferdie"),215 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),216 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),217 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),218 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),219 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),220 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),221 ].into_iter()222 .map(|k| (k, 1u128 << 100))223 .collect::<Vec<_>>(),224 },225 });226227 #[cfg(feature = "unique-runtime")]228 {229 patch230 .as_object_mut()231 .expect("the genesis patch is always an object; qed")232 .remove("session");233 }234235 patch236}237238fn chain_properties() -> sc_chain_spec::Properties {239 let mut properties = Map::new();240 properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());241 properties.insert("tokenDecimals".into(), default_runtime::DECIMALS.into());242 properties.insert(243 "ss58Format".into(),244 default_runtime::SS58Prefix::get().into(),245 );246247 properties248}