123456use cumulus_primitives_core::ParaId;7use nft_runtime::*;8use nft_data_structs::*;9use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};10use sc_service::ChainType;11use sp_core::{sr25519, Pair, Public};12use sp_runtime::traits::{IdentifyAccount, Verify};13use std::collections::BTreeMap;1415use serde::{Deserialize, Serialize};16use serde_json::map::Map;171819pub type ChainSpec = sc_service::GenericChainSpec<nft_runtime::GenesisConfig, Extensions>;202122pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {23 TPublic::Pair::from_string(&format!("//{}", seed), None)24 .expect("static values are valid; qed")25 .public()26}272829#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]30#[serde(deny_unknown_fields)]31pub struct Extensions {32 33 pub relay_chain: String,34 35 pub para_id: u32,36}3738impl Extensions {39 40 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {41 sc_chain_spec::get_extension(chain_spec.extensions())42 }43}4445type AccountPublic = <Signature as Verify>::Signer;464748pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId49where50 AccountPublic: From<<TPublic::Pair as Pair>::Public>,51{52 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()53}5455pub fn development_config(id: ParaId) -> ChainSpec {56 let mut properties = Map::new();57 properties.insert("tokenSymbol".into(), "testUNQ".into());58 properties.insert("tokenDecimals".into(), 15.into());59 properties.insert("ss58Format".into(), 42.into()); 6061 ChainSpec::from_genesis(62 63 "Development",64 65 "dev",66 ChainType::Local,67 move || {68 testnet_genesis(69 70 get_account_id_from_seed::<sr25519::Public>("Alice"),71 vec![72 get_from_seed::<AuraId>("Alice"),73 get_from_seed::<AuraId>("Bob"),74 ],75 76 vec![77 get_account_id_from_seed::<sr25519::Public>("Alice"),78 get_account_id_from_seed::<sr25519::Public>("Bob"),79 ],80 id,81 )82 },83 84 vec![],85 86 None,87 88 None,89 90 Some(properties),91 92 Extensions {93 relay_chain: "rococo-dev".into(),94 para_id: id.into(),95 },96 )97}9899pub fn rococo_local_testnet_config(id: ParaId) -> ChainSpec {100 ChainSpec::from_genesis(101 102 "Unique Testnet @ Rococo Local",103 104 "unique_testnet_rococo",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 id,130 )131 },132 133 vec![],134 135 None,136 137 None,138 139 None,140 141 Extensions {142 relay_chain: "rococo-local".into(),143 para_id: id.into(),144 },145 )146}147148pub fn westend_local_testnet_config(id: ParaId) -> ChainSpec {149 let mut properties = Map::new();150 properties.insert("tokenSymbol".into(), "OPLW".into());151 properties.insert("tokenDecimals".into(), 15.into());152 properties.insert("ss58Format".into(), 42.into()); 153 154 ChainSpec::from_genesis(155 156 "Unique Testnet @ Westend Local",157 158 "unique_testnet_westend",159 ChainType::Local,160 move || {161 testnet_genesis(162 163 get_account_id_from_seed::<sr25519::Public>("Alice"),164 vec![165 get_from_seed::<AuraId>("Alice"),166 get_from_seed::<AuraId>("Bob"),167 get_from_seed::<AuraId>("Charlie"),168 get_from_seed::<AuraId>("Dave"),169 get_from_seed::<AuraId>("Eve"),170 ],171 172 vec![173 get_account_id_from_seed::<sr25519::Public>("Alice"),174 get_account_id_from_seed::<sr25519::Public>("Bob"),175 get_account_id_from_seed::<sr25519::Public>("Charlie"),176 get_account_id_from_seed::<sr25519::Public>("Dave"),177 get_account_id_from_seed::<sr25519::Public>("Eve"),178 get_account_id_from_seed::<sr25519::Public>("Ferdie"),179 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),180 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),181 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),182 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),183 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),184 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),185 ],186 id,187 )188 },189 190 vec![],191 192 None,193 194 None,195 196 Some(properties),197 198 Extensions {199 relay_chain: "westend-local".into(),200 para_id: id.into(),201 },202 )203}204205fn testnet_genesis(206 root_key: AccountId,207 initial_authorities: Vec<AuraId>,208 endowed_accounts: Vec<AccountId>,209 id: ParaId,210) -> GenesisConfig {211 let vested_accounts = vec![get_account_id_from_seed::<sr25519::Public>("Bob")];212213 GenesisConfig {214 system: nft_runtime::SystemConfig {215 code: nft_runtime::WASM_BINARY216 .expect("WASM binary was not build, please build it!")217 .to_vec(),218 changes_trie_config: Default::default(),219 },220 balances: BalancesConfig {221 balances: endowed_accounts222 .iter()223 .cloned()224 .map(|k| (k, 1 << 70))225 .collect(),226 },227 treasury: Default::default(),228 sudo: SudoConfig { key: root_key },229 vesting: VestingConfig {230 vesting: vested_accounts231 .iter()232 .cloned()233 .map(|k| (k, 1000, 100, 1 << 98))234 .collect(),235 },236 nft: NftConfig {237 collection_id: vec![(238 1,239 Collection {240 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),241 mode: CollectionMode::NFT,242 access: AccessMode::Normal,243 decimal_points: 0,244 name: vec![],245 description: vec![],246 token_prefix: vec![],247 mint_mode: false,248 offchain_schema: vec![],249 schema_version: SchemaVersion::default(),250 sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<251 sr25519::Public,252 >("Alice")),253 const_on_chain_schema: vec![],254 variable_on_chain_schema: vec![],255 limits: CollectionLimits::default(),256 meta_update_permission: MetaUpdatePermission::ItemOwner,257 transfers_enabled: true,258 },259 )],260 nft_item_id: vec![],261 fungible_item_id: vec![],262 refungible_item_id: vec![],263 },264 parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },265 aura: nft_runtime::AuraConfig {266 authorities: initial_authorities,267 },268 aura_ext: Default::default(),269 evm: EVMConfig {270 accounts: BTreeMap::new(),271 },272 ethereum: EthereumConfig {},273 }274}