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")60 || self.id() == "dev"61 || self.id() == "local_testnet"62 }63}646566pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {67 TPublic::Pair::from_string(&format!("//{}", seed), None)68 .expect("static values are valid; qed")69 .public()70}717273#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]74#[serde(deny_unknown_fields)]75pub struct Extensions {76 77 pub relay_chain: String,78 79 pub para_id: u32,80}8182impl Extensions {83 84 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {85 sc_chain_spec::get_extension(chain_spec.extensions())86 }87}8889type AccountPublic = <Signature as Verify>::Signer;909192pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId93where94 AccountPublic: From<<TPublic::Pair as Pair>::Public>,95{96 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()97}9899pub fn development_config() -> OpalChainSpec {100 let mut properties = Map::new();101 properties.insert("tokenSymbol".into(), "OPL".into());102 properties.insert("tokenDecimals".into(), 15.into());103 properties.insert("ss58Format".into(), 42.into());104105 OpalChainSpec::from_genesis(106 107 "Development",108 109 "dev",110 ChainType::Local,111 move || {112 testnet_genesis(113 114 get_account_id_from_seed::<sr25519::Public>("Alice"),115 vec![116 get_from_seed::<AuraId>("Alice"),117 get_from_seed::<AuraId>("Bob"),118 ],119 120 vec![121 get_account_id_from_seed::<sr25519::Public>("Alice"),122 get_account_id_from_seed::<sr25519::Public>("Bob"),123 ],124 1000.into(),125 )126 },127 128 vec![],129 130 None,131 132 None,133 None,134 135 Some(properties),136 137 Extensions {138 relay_chain: "rococo-dev".into(),139 para_id: 1000,140 },141 )142}143144pub fn local_testnet_rococo_config() -> OpalChainSpec {145 OpalChainSpec::from_genesis(146 147 "Local Testnet",148 149 "local_testnet",150 ChainType::Local,151 move || {152 testnet_genesis(153 154 get_account_id_from_seed::<sr25519::Public>("Alice"),155 vec![156 get_from_seed::<AuraId>("Alice"),157 get_from_seed::<AuraId>("Bob"),158 ],159 160 vec![161 get_account_id_from_seed::<sr25519::Public>("Alice"),162 get_account_id_from_seed::<sr25519::Public>("Bob"),163 get_account_id_from_seed::<sr25519::Public>("Charlie"),164 get_account_id_from_seed::<sr25519::Public>("Dave"),165 get_account_id_from_seed::<sr25519::Public>("Eve"),166 get_account_id_from_seed::<sr25519::Public>("Ferdie"),167 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),168 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),169 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),170 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),171 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),172 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),173 ],174 1000.into(),175 )176 },177 178 vec![],179 180 None,181 182 None,183 None,184 185 None,186 187 Extensions {188 relay_chain: "rococo-local".into(),189 para_id: 1000,190 },191 )192}193194pub fn local_testnet_westend_config() -> OpalChainSpec {195 OpalChainSpec::from_genesis(196 197 "Local Testnet",198 199 "local_testnet",200 ChainType::Local,201 move || {202 testnet_genesis(203 204 get_account_id_from_seed::<sr25519::Public>("Alice"),205 vec![206 get_from_seed::<AuraId>("Alice"),207 get_from_seed::<AuraId>("Bob"),208 get_from_seed::<AuraId>("Charlie"),209 get_from_seed::<AuraId>("Dave"),210 get_from_seed::<AuraId>("Eve"),211 ],212 213 vec![214 get_account_id_from_seed::<sr25519::Public>("Alice"),215 get_account_id_from_seed::<sr25519::Public>("Bob"),216 get_account_id_from_seed::<sr25519::Public>("Charlie"),217 get_account_id_from_seed::<sr25519::Public>("Dave"),218 get_account_id_from_seed::<sr25519::Public>("Eve"),219 get_account_id_from_seed::<sr25519::Public>("Ferdie"),220 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),221 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),222 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),223 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),224 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),225 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),226 ],227 1000.into(),228 )229 },230 231 vec![],232 233 None,234 235 None,236 None,237 238 None,239 240 Extensions {241 relay_chain: "westend-local".into(),242 para_id: 1000,243 },244 )245}246247fn testnet_genesis(248 root_key: AccountId,249 initial_authorities: Vec<AuraId>,250 endowed_accounts: Vec<AccountId>,251 id: ParaId,252) -> opal_runtime::GenesisConfig {253 use opal_runtime::*;254255 GenesisConfig {256 system: SystemConfig {257 code: WASM_BINARY258 .expect("WASM binary was not build, please build it!")259 .to_vec(),260 },261 balances: BalancesConfig {262 balances: endowed_accounts263 .iter()264 .cloned()265 266 .map(|k| (k, 1 << 100))267 .collect(),268 },269 treasury: Default::default(),270 sudo: SudoConfig {271 key: Some(root_key),272 },273 vesting: VestingConfig { vesting: vec![] },274 parachain_info: ParachainInfoConfig { parachain_id: id },275 parachain_system: Default::default(),276 aura: AuraConfig {277 authorities: initial_authorities,278 },279 aura_ext: Default::default(),280 evm: EVMConfig {281 accounts: BTreeMap::new(),282 },283 ethereum: EthereumConfig {},284 }285}