123456use cumulus_primitives_core::ParaId;7use unique_runtime::*;8use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};9use sc_service::ChainType;10use sp_core::{sr25519, Pair, Public};11use sp_runtime::traits::{IdentifyAccount, Verify};12use std::collections::BTreeMap;1314use serde::{Deserialize, Serialize};15use serde_json::map::Map;161718pub type ChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;192021pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {22 TPublic::Pair::from_string(&format!("//{}", seed), None)23 .expect("static values are valid; qed")24 .public()25}262728#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]29#[serde(deny_unknown_fields)]30pub struct Extensions {31 32 pub relay_chain: String,33 34 pub para_id: u32,35}3637impl Extensions {38 39 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {40 sc_chain_spec::get_extension(chain_spec.extensions())41 }42}4344type AccountPublic = <Signature as Verify>::Signer;454647pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId48where49 AccountPublic: From<<TPublic::Pair as Pair>::Public>,50{51 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()52}5354pub fn development_config() -> ChainSpec {55 let mut properties = Map::new();56 properties.insert("tokenSymbol".into(), "OPL".into());57 properties.insert("tokenDecimals".into(), 15.into());58 properties.insert("ss58Format".into(), 42.into());5960 ChainSpec::from_genesis(61 62 "Development",63 64 "dev",65 ChainType::Local,66 move || {67 testnet_genesis(68 69 get_account_id_from_seed::<sr25519::Public>("Alice"),70 vec![71 get_from_seed::<AuraId>("Alice"),72 get_from_seed::<AuraId>("Bob"),73 ],74 75 vec![76 get_account_id_from_seed::<sr25519::Public>("Alice"),77 get_account_id_from_seed::<sr25519::Public>("Bob"),78 ],79 1000.into(),80 )81 },82 83 vec![],84 85 None,86 87 None,88 None,89 90 Some(properties),91 92 Extensions {93 relay_chain: "rococo-dev".into(),94 para_id: 1000,95 },96 )97}9899pub fn local_testnet_rococo_config() -> ChainSpec {100 ChainSpec::from_genesis(101 102 "Local Testnet",103 104 "local_testnet",105 ChainType::Local,106 move || {107 testnet_genesis(108 109 get_account_id_from_seed::<sr25519::Public>("Alice"),110 vec![111 get_from_seed::<AuraId>("Alice"),112 get_from_seed::<AuraId>("Bob"),113 ],114 115 vec![116 get_account_id_from_seed::<sr25519::Public>("Alice"),117 get_account_id_from_seed::<sr25519::Public>("Bob"),118 get_account_id_from_seed::<sr25519::Public>("Charlie"),119 get_account_id_from_seed::<sr25519::Public>("Dave"),120 get_account_id_from_seed::<sr25519::Public>("Eve"),121 get_account_id_from_seed::<sr25519::Public>("Ferdie"),122 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),123 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),124 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),125 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),126 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),127 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),128 ],129 1000.into(),130 )131 },132 133 vec![],134 135 None,136 137 None,138 None,139 140 None,141 142 Extensions {143 relay_chain: "rococo-local".into(),144 para_id: 1000,145 },146 )147}148149pub fn local_testnet_westend_config() -> ChainSpec {150 ChainSpec::from_genesis(151 152 "Local Testnet",153 154 "local_testnet",155 ChainType::Local,156 move || {157 testnet_genesis(158 159 get_account_id_from_seed::<sr25519::Public>("Alice"),160 vec![161 get_from_seed::<AuraId>("Alice"),162 get_from_seed::<AuraId>("Bob"),163 get_from_seed::<AuraId>("Charlie"),164 get_from_seed::<AuraId>("Dave"),165 get_from_seed::<AuraId>("Eve"),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: "westend-local".into(),197 para_id: 1000,198 },199 )200}201202fn testnet_genesis(203 root_key: AccountId,204 initial_authorities: Vec<AuraId>,205 endowed_accounts: Vec<AccountId>,206 id: ParaId,207) -> GenesisConfig {208 GenesisConfig {209 system: unique_runtime::SystemConfig {210 code: unique_runtime::WASM_BINARY211 .expect("WASM binary was not build, please build it!")212 .to_vec(),213 },214 balances: BalancesConfig {215 balances: endowed_accounts216 .iter()217 .cloned()218 219 .map(|k| (k, 1 << 100))220 .collect(),221 },222 treasury: Default::default(),223 sudo: SudoConfig {224 key: Some(root_key),225 },226 vesting: VestingConfig { vesting: vec![] },227 parachain_info: unique_runtime::ParachainInfoConfig { parachain_id: id },228 parachain_system: Default::default(),229 aura: unique_runtime::AuraConfig {230 authorities: initial_authorities,231 },232 aura_ext: Default::default(),233 evm: EVMConfig {234 accounts: BTreeMap::new(),235 },236 ethereum: EthereumConfig {},237 }238}