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 local_testnet_config(id: ParaId) -> 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 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}147148fn testnet_genesis(149 root_key: AccountId,150 initial_authorities: Vec<AuraId>,151 endowed_accounts: Vec<AccountId>,152 id: ParaId,153) -> GenesisConfig {154 let vested_accounts = vec![get_account_id_from_seed::<sr25519::Public>("Bob")];155156 GenesisConfig {157 system: nft_runtime::SystemConfig {158 code: nft_runtime::WASM_BINARY159 .expect("WASM binary was not build, please build it!")160 .to_vec(),161 changes_trie_config: Default::default(),162 },163 balances: BalancesConfig {164 balances: endowed_accounts165 .iter()166 .cloned()167 .map(|k| (k, 1 << 70))168 .collect(),169 },170 treasury: Default::default(),171 sudo: SudoConfig { key: root_key },172 vesting: VestingConfig {173 vesting: vested_accounts174 .iter()175 .cloned()176 .map(|k| (k, 1000, 100, 1 << 98))177 .collect(),178 },179 nft: NftConfig {180 collection_id: vec![(181 1,182 Collection {183 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),184 mode: CollectionMode::NFT,185 access: AccessMode::Normal,186 decimal_points: 0,187 name: vec![],188 description: vec![],189 token_prefix: vec![],190 mint_mode: false,191 offchain_schema: vec![],192 schema_version: SchemaVersion::default(),193 sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<194 sr25519::Public,195 >("Alice")),196 const_on_chain_schema: vec![],197 variable_on_chain_schema: vec![],198 limits: CollectionLimits::default(),199 meta_update_permission: MetaUpdatePermission::ItemOwner,200 transfers_enabled: true,201 },202 )],203 nft_item_id: vec![],204 fungible_item_id: vec![],205 refungible_item_id: vec![],206 },207 parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },208 aura: nft_runtime::AuraConfig {209 authorities: initial_authorities,210 },211 aura_ext: Default::default(),212 evm: EVMConfig {213 accounts: BTreeMap::new(),214 },215 ethereum: EthereumConfig {},216 }217}