1234567891011121314151617use cumulus_primitives_core::ParaId;18use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};19use sc_service::ChainType;20use sp_core::{sr25519, Pair, Public};21use sp_runtime::traits::{IdentifyAccount, Verify};22use std::collections::BTreeMap;2324use serde::{Deserialize, Serialize};25use serde_json::map::Map;2627use unique_runtime_common::types::*;282930#[cfg(feature = "unique-runtime")]31pub type UniqueChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;323334#[cfg(feature = "quartz-runtime")]35pub type QuartzChainSpec = sc_service::GenericChainSpec<quartz_runtime::GenesisConfig, Extensions>;363738#[cfg(feature = "opal-runtime")]39pub type OpalChainSpec = sc_service::GenericChainSpec<opal_runtime::GenesisConfig, Extensions>;4041pub enum RuntimeId {42 Unique,43 Quartz,44 Opal,45 Unknown(String),46}4748pub trait RuntimeIdentification {49 fn runtime_id(&self) -> RuntimeId;50}5152impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {53 fn runtime_id(&self) -> RuntimeId {54 #[cfg(feature = "unique-runtime")]55 if self.id().starts_with("unique") {56 return RuntimeId::Unique;57 }5859 #[cfg(feature = "quartz-runtime")]60 if self.id().starts_with("quartz") {61 return RuntimeId::Quartz;62 }6364 #[cfg(feature = "opal-runtime")]65 if self.id().starts_with("opal") {66 return RuntimeId::Opal;67 }6869 RuntimeId::Unknown(self.id().into())70 }71}727374pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {75 TPublic::Pair::from_string(&format!("//{}", seed), None)76 .expect("static values are valid; qed")77 .public()78}798081#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]82#[serde(deny_unknown_fields)]83pub struct Extensions {84 85 pub relay_chain: String,86 87 pub para_id: u32,88}8990impl Extensions {91 92 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {93 sc_chain_spec::get_extension(chain_spec.extensions())94 }95}9697type AccountPublic = <Signature as Verify>::Signer;9899100pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId101where102 AccountPublic: From<<TPublic::Pair as Pair>::Public>,103{104 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()105}106107pub fn development_config() -> OpalChainSpec {108 let mut properties = Map::new();109 properties.insert("tokenSymbol".into(), "OPL".into());110 properties.insert("tokenDecimals".into(), 15.into());111 properties.insert("ss58Format".into(), 42.into());112113 OpalChainSpec::from_genesis(114 115 "Development",116 117 "dev",118 ChainType::Local,119 move || {120 testnet_genesis(121 122 get_account_id_from_seed::<sr25519::Public>("Alice"),123 vec![124 get_from_seed::<AuraId>("Alice"),125 get_from_seed::<AuraId>("Bob"),126 ],127 128 vec![129 get_account_id_from_seed::<sr25519::Public>("Alice"),130 get_account_id_from_seed::<sr25519::Public>("Bob"),131 ],132 1000.into(),133 )134 },135 136 vec![],137 138 None,139 140 None,141 None,142 143 Some(properties),144 145 Extensions {146 relay_chain: "rococo-dev".into(),147 para_id: 1000,148 },149 )150}151152pub fn local_testnet_rococo_config() -> OpalChainSpec {153 OpalChainSpec::from_genesis(154 155 "Local Testnet",156 157 "local_testnet",158 ChainType::Local,159 move || {160 testnet_genesis(161 162 get_account_id_from_seed::<sr25519::Public>("Alice"),163 vec![164 get_from_seed::<AuraId>("Alice"),165 get_from_seed::<AuraId>("Bob"),166 ],167 168 vec![169 get_account_id_from_seed::<sr25519::Public>("Alice"),170 get_account_id_from_seed::<sr25519::Public>("Bob"),171 get_account_id_from_seed::<sr25519::Public>("Charlie"),172 get_account_id_from_seed::<sr25519::Public>("Dave"),173 get_account_id_from_seed::<sr25519::Public>("Eve"),174 get_account_id_from_seed::<sr25519::Public>("Ferdie"),175 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),176 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),177 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),178 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),179 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),180 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),181 ],182 1000.into(),183 )184 },185 186 vec![],187 188 None,189 190 None,191 None,192 193 None,194 195 Extensions {196 relay_chain: "rococo-local".into(),197 para_id: 1000,198 },199 )200}201202pub fn local_testnet_westend_config() -> OpalChainSpec {203 OpalChainSpec::from_genesis(204 205 "Local Testnet",206 207 "local_testnet",208 ChainType::Local,209 move || {210 testnet_genesis(211 212 get_account_id_from_seed::<sr25519::Public>("Alice"),213 vec![214 get_from_seed::<AuraId>("Alice"),215 get_from_seed::<AuraId>("Bob"),216 get_from_seed::<AuraId>("Charlie"),217 get_from_seed::<AuraId>("Dave"),218 get_from_seed::<AuraId>("Eve"),219 ],220 221 vec![222 get_account_id_from_seed::<sr25519::Public>("Alice"),223 get_account_id_from_seed::<sr25519::Public>("Bob"),224 get_account_id_from_seed::<sr25519::Public>("Charlie"),225 get_account_id_from_seed::<sr25519::Public>("Dave"),226 get_account_id_from_seed::<sr25519::Public>("Eve"),227 get_account_id_from_seed::<sr25519::Public>("Ferdie"),228 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),229 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),230 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),231 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),232 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),233 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),234 ],235 1000.into(),236 )237 },238 239 vec![],240 241 None,242 243 None,244 None,245 246 None,247 248 Extensions {249 relay_chain: "westend-local".into(),250 para_id: 1000,251 },252 )253}254255fn testnet_genesis(256 root_key: AccountId,257 initial_authorities: Vec<AuraId>,258 endowed_accounts: Vec<AccountId>,259 id: ParaId,260) -> opal_runtime::GenesisConfig {261 use opal_runtime::*;262263 GenesisConfig {264 system: SystemConfig {265 code: WASM_BINARY266 .expect("WASM binary was not build, please build it!")267 .to_vec(),268 },269 balances: BalancesConfig {270 balances: endowed_accounts271 .iter()272 .cloned()273 274 .map(|k| (k, 1 << 100))275 .collect(),276 },277 treasury: Default::default(),278 sudo: SudoConfig {279 key: Some(root_key),280 },281 vesting: VestingConfig { vesting: vec![] },282 parachain_info: ParachainInfoConfig { parachain_id: id },283 parachain_system: Default::default(),284 aura: AuraConfig {285 authorities: initial_authorities,286 },287 aura_ext: Default::default(),288 evm: EVMConfig {289 accounts: BTreeMap::new(),290 },291 ethereum: EthereumConfig {},292 }293}