123456use cumulus_primitives_core::ParaId;7use nft_runtime::*;8use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};9use sc_service::ChainType;10use sp_core::{sr25519, Pair, Public};11use sp_runtime::traits::{IdentifyAccount, Verify};1213use serde::{Deserialize, Serialize};14use serde_json::map::Map;151617pub type ChainSpec = sc_service::GenericChainSpec<nft_runtime::GenesisConfig, Extensions>;181920pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {21 TPublic::Pair::from_string(&format!("//{}", seed), None)22 .expect("static values are valid; qed")23 .public()24}252627#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]28#[serde(deny_unknown_fields)]29pub struct Extensions {30 31 pub relay_chain: String,32 33 pub para_id: u32,34}3536impl Extensions {37 38 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {39 sc_chain_spec::get_extension(chain_spec.extensions())40 }41}4243type AccountPublic = <Signature as Verify>::Signer;444546pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId47where48 AccountPublic: From<<TPublic::Pair as Pair>::Public>,49{50 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()51}5253pub fn development_config(id: ParaId) -> ChainSpec {54 let mut properties = Map::new();55 properties.insert("tokenSymbol".into(), "testUNQ".into());56 properties.insert("tokenDecimals".into(), 15.into());57 properties.insert("ss58Format".into(), 42.into()); 5859 ChainSpec::from_genesis(60 61 "Development",62 63 "dev",64 ChainType::Local,65 move || testnet_genesis(66 67 get_account_id_from_seed::<sr25519::Public>("Alice"),68 vec![69 get_from_seed::<AuraId>("Alice"),70 get_from_seed::<AuraId>("Bob"),71 ],72 73 vec![74 get_account_id_from_seed::<sr25519::Public>("Alice"),75 get_account_id_from_seed::<sr25519::Public>("Bob"),76 ],77 id,78 ),79 80 vec![],81 82 None,83 84 None,85 86 Some(properties),87 88 Extensions {89 relay_chain: "rococo-dev".into(),90 para_id: id.into(),91 },92 )93}9495pub fn local_testnet_config(id: ParaId) -> ChainSpec {96 ChainSpec::from_genesis(97 98 "Local Testnet",99 100 "local_testnet",101 ChainType::Local,102 move || testnet_genesis(103 104 get_account_id_from_seed::<sr25519::Public>("Alice"),105 vec![106 get_from_seed::<AuraId>("Alice"),107 get_from_seed::<AuraId>("Bob"),108 ],109 110 vec![111 get_account_id_from_seed::<sr25519::Public>("Alice"),112 get_account_id_from_seed::<sr25519::Public>("Bob"),113 get_account_id_from_seed::<sr25519::Public>("Charlie"),114 get_account_id_from_seed::<sr25519::Public>("Dave"),115 get_account_id_from_seed::<sr25519::Public>("Eve"),116 get_account_id_from_seed::<sr25519::Public>("Ferdie"),117 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),118 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),119 get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),120 get_account_id_from_seed::<sr25519::Public>("Dave//stash"),121 get_account_id_from_seed::<sr25519::Public>("Eve//stash"),122 get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),123 ],124 id,125 ),126 127 vec![],128 129 None,130 131 None,132 133 None,134 135 Extensions {136 relay_chain: "rococo-local".into(),137 para_id: id.into(),138 },139 )140}141142fn testnet_genesis(143 root_key: AccountId,144 initial_authorities: Vec<AuraId>,145 endowed_accounts: Vec<AccountId>,146 id: ParaId,147) -> GenesisConfig {148149 let vested_accounts = vec![150 get_account_id_from_seed::<sr25519::Public>("Bob"),151 ];152153 GenesisConfig {154 system: nft_runtime::SystemConfig {155 code: nft_runtime::WASM_BINARY156 .expect("WASM binary was not build, please build it!")157 .to_vec(),158 changes_trie_config: Default::default(),159 },160 pallet_balances: BalancesConfig {161 balances: endowed_accounts162 .iter()163 .cloned()164 .map(|k| (k, 1 << 100))165 .collect(),166 },167 pallet_treasury: Default::default(),168 pallet_sudo: SudoConfig { key: root_key },169 pallet_vesting: VestingConfig {170 vesting: vested_accounts171 .iter()172 .cloned()173 .map(|k| (k, 1000, 100, 1 << 98))174 .collect(),175 },176 pallet_nft: NftConfig {177 collection_id: vec![(178 1,179 Collection {180 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),181 mode: CollectionMode::NFT,182 access: AccessMode::Normal,183 decimal_points: 0,184 name: vec![],185 description: vec![],186 token_prefix: vec![],187 mint_mode: false,188 offchain_schema: vec![],189 schema_version: SchemaVersion::default(),190 sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<sr25519::Public>("Alice")),191 const_on_chain_schema: vec![],192 variable_on_chain_schema: vec![],193 limits: CollectionLimits::default()194 },195 )],196 nft_item_id: vec![],197 fungible_item_id: vec![],198 refungible_item_id: vec![],199 chain_limit: ChainLimits {200 collection_numbers_limit: 100000,201 account_token_ownership_limit: 1000000,202 collections_admins_limit: 5,203 custom_data_limit: 2048,204 nft_sponsor_transfer_timeout: 15,205 fungible_sponsor_transfer_timeout: 15,206 refungible_sponsor_transfer_timeout: 15,207 offchain_schema_limit: 1024,208 variable_on_chain_schema_limit: 1024,209 const_on_chain_schema_limit: 1024,210 },211 },212 parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },213 pallet_aura: nft_runtime::AuraConfig {214 authorities: initial_authorities,215 },216 cumulus_pallet_aura_ext: Default::default(),217 }218}