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 || 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 id,80 ),81 82 vec![],83 84 None,85 86 None,87 88 Some(properties),89 90 Extensions {91 relay_chain: "rococo-dev".into(),92 para_id: id.into(),93 },94 )95}9697pub fn local_testnet_config(id: ParaId) -> ChainSpec {98 ChainSpec::from_genesis(99 100 "Local Testnet",101 102 "local_testnet",103 ChainType::Local,104 move || testnet_genesis(105 106 get_account_id_from_seed::<sr25519::Public>("Alice"),107 vec![108 get_from_seed::<AuraId>("Alice"),109 get_from_seed::<AuraId>("Bob"),110 ],111 112 vec![113 get_account_id_from_seed::<sr25519::Public>("Alice"),114 get_account_id_from_seed::<sr25519::Public>("Bob"),115 get_account_id_from_seed::<sr25519::Public>("Charlie"),116 get_account_id_from_seed::<sr25519::Public>("Dave"),117 get_account_id_from_seed::<sr25519::Public>("Eve"),118 get_account_id_from_seed::<sr25519::Public>("Ferdie"),119 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),120 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),121 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),122 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),123 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),124 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),125 ],126 id,127 ),128 129 vec![],130 131 None,132 133 None,134 135 None,136 137 Extensions {138 relay_chain: "rococo-local".into(),139 para_id: id.into(),140 },141 )142}143144fn testnet_genesis(145 root_key: AccountId,146 initial_authorities: Vec<AuraId>,147 endowed_accounts: Vec<AccountId>,148 id: ParaId,149) -> GenesisConfig {150151 let vested_accounts = vec![152 get_account_id_from_seed::<sr25519::Public>("Bob"),153 ];154155 GenesisConfig {156 system: nft_runtime::SystemConfig {157 code: nft_runtime::WASM_BINARY158 .expect("WASM binary was not build, please build it!")159 .to_vec(),160 changes_trie_config: Default::default(),161 },162 pallet_balances: BalancesConfig {163 balances: endowed_accounts164 .iter()165 .cloned()166 .map(|k| (k, 1 << 70))167 .collect(),168 },169 pallet_treasury: Default::default(),170 pallet_sudo: SudoConfig { key: root_key },171 pallet_vesting: VestingConfig {172 vesting: vested_accounts173 .iter()174 .cloned()175 .map(|k| (k, 1000, 100, 1 << 98))176 .collect(),177 },178 pallet_nft: NftConfig {179 collection_id: vec![(180 1,181 Collection {182 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),183 mode: CollectionMode::NFT,184 access: AccessMode::Normal,185 decimal_points: 0,186 name: vec![],187 description: vec![],188 token_prefix: vec![],189 mint_mode: false,190 offchain_schema: vec![],191 schema_version: SchemaVersion::default(),192 sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<sr25519::Public>("Alice")),193 const_on_chain_schema: vec![],194 variable_on_chain_schema: vec![],195 limits: CollectionLimits::default()196 },197 )],198 nft_item_id: vec![],199 fungible_item_id: vec![],200 refungible_item_id: vec![],201 chain_limit: ChainLimits {202 collection_numbers_limit: 100000,203 account_token_ownership_limit: 1000000,204 collections_admins_limit: 5,205 custom_data_limit: 2048,206 nft_sponsor_transfer_timeout: 15,207 fungible_sponsor_transfer_timeout: 15,208 refungible_sponsor_transfer_timeout: 15,209 offchain_schema_limit: 1024,210 variable_on_chain_schema_limit: 1024,211 const_on_chain_schema_limit: 1024,212 },213 },214 parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },215 pallet_aura: nft_runtime::AuraConfig {216 authorities: initial_authorities,217 },218 cumulus_pallet_aura_ext: Default::default(),219 pallet_evm: EVMConfig {220 accounts: BTreeMap::new(),221 },222 pallet_ethereum: EthereumConfig {},223 }224}