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::*;282930pub type ChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;3132pub trait RuntimeIdentification {33 fn is_unique(&self) -> bool;3435 fn is_quartz(&self) -> bool;3637 fn is_opal(&self) -> bool;38}3940impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {41 fn is_unique(&self) -> bool {42 self.id().starts_with("unique")43 }4445 fn is_quartz(&self) -> bool {46 self.id().starts_with("quartz")47 }4849 fn is_opal(&self) -> bool {50 self.id().starts_with("opal")51 }52}535455pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {56 TPublic::Pair::from_string(&format!("//{}", seed), None)57 .expect("static values are valid; qed")58 .public()59}606162#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]63#[serde(deny_unknown_fields)]64pub struct Extensions {65 66 pub relay_chain: String,67 68 pub para_id: u32,69}7071impl Extensions {72 73 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {74 sc_chain_spec::get_extension(chain_spec.extensions())75 }76}7778type AccountPublic = <Signature as Verify>::Signer;798081pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId82where83 AccountPublic: From<<TPublic::Pair as Pair>::Public>,84{85 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()86}8788pub fn development_config() -> ChainSpec {89 let mut properties = Map::new();90 properties.insert("tokenSymbol".into(), "OPL".into());91 properties.insert("tokenDecimals".into(), 15.into());92 properties.insert("ss58Format".into(), 42.into());9394 ChainSpec::from_genesis(95 96 "Development",97 98 "dev",99 ChainType::Local,100 move || {101 testnet_genesis(102 103 get_account_id_from_seed::<sr25519::Public>("Alice"),104 vec![105 get_from_seed::<AuraId>("Alice"),106 get_from_seed::<AuraId>("Bob"),107 ],108 109 vec![110 get_account_id_from_seed::<sr25519::Public>("Alice"),111 get_account_id_from_seed::<sr25519::Public>("Bob"),112 ],113 1000.into(),114 )115 },116 117 vec![],118 119 None,120 121 None,122 None,123 124 Some(properties),125 126 Extensions {127 relay_chain: "rococo-dev".into(),128 para_id: 1000,129 },130 )131}132133pub fn local_testnet_rococo_config() -> ChainSpec {134 ChainSpec::from_genesis(135 136 "Local Testnet",137 138 "local_testnet",139 ChainType::Local,140 move || {141 testnet_genesis(142 143 get_account_id_from_seed::<sr25519::Public>("Alice"),144 vec![145 get_from_seed::<AuraId>("Alice"),146 get_from_seed::<AuraId>("Bob"),147 ],148 149 vec![150 get_account_id_from_seed::<sr25519::Public>("Alice"),151 get_account_id_from_seed::<sr25519::Public>("Bob"),152 get_account_id_from_seed::<sr25519::Public>("Charlie"),153 get_account_id_from_seed::<sr25519::Public>("Dave"),154 get_account_id_from_seed::<sr25519::Public>("Eve"),155 get_account_id_from_seed::<sr25519::Public>("Ferdie"),156 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),157 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),158 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),159 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),160 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),161 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),162 ],163 1000.into(),164 )165 },166 167 vec![],168 169 None,170 171 None,172 None,173 174 None,175 176 Extensions {177 relay_chain: "rococo-local".into(),178 para_id: 1000,179 },180 )181}182183pub fn local_testnet_westend_config() -> ChainSpec {184 ChainSpec::from_genesis(185 186 "Local Testnet",187 188 "local_testnet",189 ChainType::Local,190 move || {191 testnet_genesis(192 193 get_account_id_from_seed::<sr25519::Public>("Alice"),194 vec![195 get_from_seed::<AuraId>("Alice"),196 get_from_seed::<AuraId>("Bob"),197 get_from_seed::<AuraId>("Charlie"),198 get_from_seed::<AuraId>("Dave"),199 get_from_seed::<AuraId>("Eve"),200 ],201 202 vec![203 get_account_id_from_seed::<sr25519::Public>("Alice"),204 get_account_id_from_seed::<sr25519::Public>("Bob"),205 get_account_id_from_seed::<sr25519::Public>("Charlie"),206 get_account_id_from_seed::<sr25519::Public>("Dave"),207 get_account_id_from_seed::<sr25519::Public>("Eve"),208 get_account_id_from_seed::<sr25519::Public>("Ferdie"),209 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),210 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),211 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),212 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),213 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),214 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),215 ],216 1000.into(),217 )218 },219 220 vec![],221 222 None,223 224 None,225 None,226 227 None,228 229 Extensions {230 relay_chain: "westend-local".into(),231 para_id: 1000,232 },233 )234}235236fn testnet_genesis(237 root_key: AccountId,238 initial_authorities: Vec<AuraId>,239 endowed_accounts: Vec<AccountId>,240 id: ParaId,241) -> unique_runtime::GenesisConfig {242 use unique_runtime::*;243244 GenesisConfig {245 system: SystemConfig {246 code: WASM_BINARY247 .expect("WASM binary was not build, please build it!")248 .to_vec(),249 },250 balances: BalancesConfig {251 balances: endowed_accounts252 .iter()253 .cloned()254 255 .map(|k| (k, 1 << 100))256 .collect(),257 },258 treasury: Default::default(),259 sudo: SudoConfig {260 key: Some(root_key),261 },262 vesting: VestingConfig { vesting: vec![] },263 parachain_info: ParachainInfoConfig { parachain_id: id },264 parachain_system: Default::default(),265 aura: AuraConfig {266 authorities: initial_authorities,267 },268 aura_ext: Default::default(),269 evm: EVMConfig {270 accounts: BTreeMap::new(),271 },272 ethereum: EthereumConfig {},273 }274}