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 trait RuntimeIdentification {42 fn is_unique(&self) -> bool;4344 fn is_quartz(&self) -> bool;4546 fn is_opal(&self) -> bool;47}4849impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {50 fn is_unique(&self) -> bool {51 self.id().starts_with("unique")52 }5354 fn is_quartz(&self) -> bool {55 self.id().starts_with("quartz")56 }5758 fn is_opal(&self) -> bool {59 self.id().starts_with("opal") || self.id() == "dev" || self.id() == "local_testnet"60 }61}626364pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {65 TPublic::Pair::from_string(&format!("//{}", seed), None)66 .expect("static values are valid; qed")67 .public()68}697071#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]72#[serde(deny_unknown_fields)]73pub struct Extensions {74 75 pub relay_chain: String,76 77 pub para_id: u32,78}7980impl Extensions {81 82 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {83 sc_chain_spec::get_extension(chain_spec.extensions())84 }85}8687type AccountPublic = <Signature as Verify>::Signer;888990pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId91where92 AccountPublic: From<<TPublic::Pair as Pair>::Public>,93{94 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()95}9697pub fn development_config() -> OpalChainSpec {98 let mut properties = Map::new();99 properties.insert("tokenSymbol".into(), "OPL".into());100 properties.insert("tokenDecimals".into(), 15.into());101 properties.insert("ss58Format".into(), 42.into());102103 OpalChainSpec::from_genesis(104 105 "Development",106 107 "dev",108 ChainType::Local,109 move || {110 testnet_genesis(111 112 get_account_id_from_seed::<sr25519::Public>("Alice"),113 vec![114 get_from_seed::<AuraId>("Alice"),115 get_from_seed::<AuraId>("Bob"),116 ],117 118 vec![119 get_account_id_from_seed::<sr25519::Public>("Alice"),120 get_account_id_from_seed::<sr25519::Public>("Bob"),121 ],122 1000.into(),123 )124 },125 126 vec![],127 128 None,129 130 None,131 None,132 133 Some(properties),134 135 Extensions {136 relay_chain: "rococo-dev".into(),137 para_id: 1000,138 },139 )140}141142pub fn local_testnet_rococo_config() -> OpalChainSpec {143 OpalChainSpec::from_genesis(144 145 "Local Testnet",146 147 "local_testnet",148 ChainType::Local,149 move || {150 testnet_genesis(151 152 get_account_id_from_seed::<sr25519::Public>("Alice"),153 vec![154 get_from_seed::<AuraId>("Alice"),155 get_from_seed::<AuraId>("Bob"),156 ],157 158 vec![159 get_account_id_from_seed::<sr25519::Public>("Alice"),160 get_account_id_from_seed::<sr25519::Public>("Bob"),161 get_account_id_from_seed::<sr25519::Public>("Charlie"),162 get_account_id_from_seed::<sr25519::Public>("Dave"),163 get_account_id_from_seed::<sr25519::Public>("Eve"),164 get_account_id_from_seed::<sr25519::Public>("Ferdie"),165 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),166 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),167 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),168 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),169 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),170 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),171 ],172 1000.into(),173 )174 },175 176 vec![],177 178 None,179 180 None,181 None,182 183 None,184 185 Extensions {186 relay_chain: "rococo-local".into(),187 para_id: 1000,188 },189 )190}191192pub fn local_testnet_westend_config() -> OpalChainSpec {193 OpalChainSpec::from_genesis(194 195 "Local Testnet",196 197 "local_testnet",198 ChainType::Local,199 move || {200 testnet_genesis(201 202 get_account_id_from_seed::<sr25519::Public>("Alice"),203 vec![204 get_from_seed::<AuraId>("Alice"),205 get_from_seed::<AuraId>("Bob"),206 get_from_seed::<AuraId>("Charlie"),207 get_from_seed::<AuraId>("Dave"),208 get_from_seed::<AuraId>("Eve"),209 ],210 211 vec![212 get_account_id_from_seed::<sr25519::Public>("Alice"),213 get_account_id_from_seed::<sr25519::Public>("Bob"),214 get_account_id_from_seed::<sr25519::Public>("Charlie"),215 get_account_id_from_seed::<sr25519::Public>("Dave"),216 get_account_id_from_seed::<sr25519::Public>("Eve"),217 get_account_id_from_seed::<sr25519::Public>("Ferdie"),218 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),219 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),220 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),221 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),222 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),223 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),224 ],225 1000.into(),226 )227 },228 229 vec![],230 231 None,232 233 None,234 None,235 236 None,237 238 Extensions {239 relay_chain: "westend-local".into(),240 para_id: 1000,241 },242 )243}244245fn testnet_genesis(246 root_key: AccountId,247 initial_authorities: Vec<AuraId>,248 endowed_accounts: Vec<AccountId>,249 id: ParaId,250) -> opal_runtime::GenesisConfig {251 use opal_runtime::*;252253 GenesisConfig {254 system: SystemConfig {255 code: WASM_BINARY256 .expect("WASM binary was not build, please build it!")257 .to_vec(),258 },259 balances: BalancesConfig {260 balances: endowed_accounts261 .iter()262 .cloned()263 264 .map(|k| (k, 1 << 100))265 .collect(),266 },267 treasury: Default::default(),268 sudo: SudoConfig {269 key: Some(root_key),270 },271 vesting: VestingConfig { vesting: vec![] },272 parachain_info: ParachainInfoConfig { parachain_id: id },273 parachain_system: Default::default(),274 aura: AuraConfig {275 authorities: initial_authorities,276 },277 aura_ext: Default::default(),278 evm: EVMConfig {279 accounts: BTreeMap::new(),280 },281 ethereum: EthereumConfig {},282 }283}