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