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;2627#[cfg(feature = "unique-runtime")]28use unique_runtime as runtime;2930#[cfg(feature = "quartz-runtime")]31use quartz_runtime as runtime;3233#[cfg(feature = "opal-runtime")]34use opal_runtime as runtime;3536use runtime::{*, opaque::*};373839pub type ChainSpec = sc_service::GenericChainSpec<runtime::GenesisConfig, Extensions>;404142pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {43 TPublic::Pair::from_string(&format!("//{}", seed), None)44 .expect("static values are valid; qed")45 .public()46}474849#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]50#[serde(deny_unknown_fields)]51pub struct Extensions {52 53 pub relay_chain: String,54 55 pub para_id: u32,56}5758impl Extensions {59 60 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {61 sc_chain_spec::get_extension(chain_spec.extensions())62 }63}6465type AccountPublic = <Signature as Verify>::Signer;666768pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId69where70 AccountPublic: From<<TPublic::Pair as Pair>::Public>,71{72 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()73}7475pub fn development_config() -> ChainSpec {76 let mut properties = Map::new();77 properties.insert("tokenSymbol".into(), "OPL".into());78 properties.insert("tokenDecimals".into(), 15.into());79 properties.insert("ss58Format".into(), 42.into());8081 ChainSpec::from_genesis(82 83 "Development",84 85 "dev",86 ChainType::Local,87 move || {88 testnet_genesis(89 90 get_account_id_from_seed::<sr25519::Public>("Alice"),91 vec![92 get_from_seed::<AuraId>("Alice"),93 get_from_seed::<AuraId>("Bob"),94 ],95 96 vec![97 get_account_id_from_seed::<sr25519::Public>("Alice"),98 get_account_id_from_seed::<sr25519::Public>("Bob"),99 ],100 1000.into(),101 )102 },103 104 vec![],105 106 None,107 108 None,109 None,110 111 Some(properties),112 113 Extensions {114 relay_chain: "rococo-dev".into(),115 para_id: 1000,116 },117 )118}119120pub fn local_testnet_rococo_config() -> ChainSpec {121 ChainSpec::from_genesis(122 123 "Local Testnet",124 125 "local_testnet",126 ChainType::Local,127 move || {128 testnet_genesis(129 130 get_account_id_from_seed::<sr25519::Public>("Alice"),131 vec![132 get_from_seed::<AuraId>("Alice"),133 get_from_seed::<AuraId>("Bob"),134 ],135 136 vec![137 get_account_id_from_seed::<sr25519::Public>("Alice"),138 get_account_id_from_seed::<sr25519::Public>("Bob"),139 get_account_id_from_seed::<sr25519::Public>("Charlie"),140 get_account_id_from_seed::<sr25519::Public>("Dave"),141 get_account_id_from_seed::<sr25519::Public>("Eve"),142 get_account_id_from_seed::<sr25519::Public>("Ferdie"),143 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),144 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),145 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),146 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),147 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),148 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),149 ],150 1000.into(),151 )152 },153 154 vec![],155 156 None,157 158 None,159 None,160 161 None,162 163 Extensions {164 relay_chain: "rococo-local".into(),165 para_id: 1000,166 },167 )168}169170pub fn local_testnet_westend_config() -> ChainSpec {171 ChainSpec::from_genesis(172 173 "Local Testnet",174 175 "local_testnet",176 ChainType::Local,177 move || {178 testnet_genesis(179 180 get_account_id_from_seed::<sr25519::Public>("Alice"),181 vec![182 get_from_seed::<AuraId>("Alice"),183 get_from_seed::<AuraId>("Bob"),184 get_from_seed::<AuraId>("Charlie"),185 get_from_seed::<AuraId>("Dave"),186 get_from_seed::<AuraId>("Eve"),187 ],188 189 vec![190 get_account_id_from_seed::<sr25519::Public>("Alice"),191 get_account_id_from_seed::<sr25519::Public>("Bob"),192 get_account_id_from_seed::<sr25519::Public>("Charlie"),193 get_account_id_from_seed::<sr25519::Public>("Dave"),194 get_account_id_from_seed::<sr25519::Public>("Eve"),195 get_account_id_from_seed::<sr25519::Public>("Ferdie"),196 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),197 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),198 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),199 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),200 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),201 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),202 ],203 1000.into(),204 )205 },206 207 vec![],208 209 None,210 211 None,212 None,213 214 None,215 216 Extensions {217 relay_chain: "westend-local".into(),218 para_id: 1000,219 },220 )221}222223fn testnet_genesis(224 root_key: AccountId,225 initial_authorities: Vec<AuraId>,226 endowed_accounts: Vec<AccountId>,227 id: ParaId,228) -> GenesisConfig {229 GenesisConfig {230 system: runtime::SystemConfig {231 code: runtime::WASM_BINARY232 .expect("WASM binary was not build, please build it!")233 .to_vec(),234 },235 balances: BalancesConfig {236 balances: endowed_accounts237 .iter()238 .cloned()239 240 .map(|k| (k, 1 << 100))241 .collect(),242 },243 treasury: Default::default(),244 sudo: SudoConfig {245 key: Some(root_key),246 },247 vesting: VestingConfig { vesting: vec![] },248 parachain_info: runtime::ParachainInfoConfig { parachain_id: id },249 parachain_system: Default::default(),250 aura: runtime::AuraConfig {251 authorities: initial_authorities,252 },253 aura_ext: Default::default(),254 evm: EVMConfig {255 accounts: BTreeMap::new(),256 },257 ethereum: EthereumConfig {},258 }259}