123456use nft_runtime::*;78use cumulus_primitives_core::ParaId;9use parachain_runtime::{AccountId, Signature};10use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};11use sc_service::ChainType;12use sp_core::{sr25519, Pair, Public};13use sp_finality_grandpa::AuthorityId as GrandpaId;14use sp_runtime::traits::{IdentifyAccount, Verify};1516use serde::{Deserialize, Serialize};17use serde_json::map::Map;181920pub type ChainSpec = sc_service::GenericChainSpec<GenesisConfig>;212223pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {24 TPublic::Pair::from_string(&format!("//{}", seed), None)25 .expect("static values are valid; qed")26 .public()27}2829type AccountPublic = <Signature as Verify>::Signer;303132pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId33where34 AccountPublic: From<<TPublic::Pair as Pair>::Public>,35{36 AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()37}383940pub fn authority_keys_from_seed(s: &str) -> (AuraId, GrandpaId) {41 (get_from_seed::<AuraId>(s), get_from_seed::<GrandpaId>(s))42}4344pub fn development_config(id: ParaId) -> ChainSpec {45 let wasm_binary = WASM_BINARY.ok_or("Development wasm binary not available".to_string())?;4647 let mut properties = Map::new();48 properties.insert("tokenSymbol".into(), "UniqueTest".into());49 properties.insert("tokenDecimals".into(), 15.into());50 properties.insert("ss58Format".into(), 42.into()); 5152 ChainSpec::from_genesis(53 54 "Development",55 56 "dev",57 ChainType::Local,58 move || testnet_genesis(59 wasm_binary,60 61 vec![62 authority_keys_from_seed("Alice"),63 ],64 65 get_account_id_from_seed::<sr25519::Public>("Alice"),66 67 vec![68 get_account_id_from_seed::<sr25519::Public>("Alice"),69 get_account_id_from_seed::<sr25519::Public>("Bob"),70 get_account_id_from_seed::<sr25519::Public>("Alice//stash"),71 get_account_id_from_seed::<sr25519::Public>("Bob//stash"),72 ],73 true,74 ),75 76 vec![],77 78 None,79 80 None,81 82 Some(properties),83 84 Extensions {85 relay_chain: "rococo-dev".into(),86 para_id: id.into(),87 },88 )89}9091pub fn local_testnet_config(id: ParaId) -> ChainSpec {92 let wasm_binary = WASM_BINARY.ok_or("Development wasm binary not available".to_string())?;9394 Ok(ChainSpec::from_genesis(95 96 "Local Testnet",97 98 "local_testnet",99 ChainType::Local,100 move || testnet_genesis(101 wasm_binary,102 103 vec![104 authority_keys_from_seed("Alice"),105 authority_keys_from_seed("Bob"),106 ],107 108 get_account_id_from_seed::<sr25519::Public>("Alice"),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 true,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 wasm_binary: &[u8],144 initial_authorities: Vec<(AuraId, GrandpaId)>,145 root_key: AccountId,146 endowed_accounts: Vec<AccountId>,147 enable_println: bool,148) -> GenesisConfig {149150 let vested_accounts = vec![151 get_account_id_from_seed::<sr25519::Public>("Bob"),152 ];153154 GenesisConfig {155 system: Some(SystemConfig {156 code: wasm_binary.to_vec(),157 changes_trie_config: Default::default(),158 }),159 pallet_balances: Some(BalancesConfig {160 balances: endowed_accounts161 .iter()162 .cloned()163 .map(|k| (k, 1 << 100))164 .collect(),165 }),166 pallet_treasury: Some(Default::default()),167 pallet_sudo: Some(SudoConfig { key: root_key }),168 pallet_vesting: Some(VestingConfig {169 vesting: vested_accounts170 .iter()171 .cloned()172 .map(|k| (k, 1000, 100, 1 << 98))173 .collect(),174 }),175 pallet_nft: Some(NftConfig {176 collection_id: vec![(177 1,178 Collection {179 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),180 mode: CollectionMode::NFT,181 access: AccessMode::Normal,182 decimal_points: 0,183 name: vec![],184 description: vec![],185 token_prefix: vec![],186 mint_mode: false,187 offchain_schema: vec![],188 schema_version: SchemaVersion::default(),189 sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<sr25519::Public>("Alice")),190 const_on_chain_schema: vec![],191 variable_on_chain_schema: vec![],192 limits: CollectionLimits::default()193 },194 )],195 nft_item_id: vec![],196 fungible_item_id: vec![],197 refungible_item_id: vec![],198 chain_limit: ChainLimits {199 collection_numbers_limit: 100000,200 account_token_ownership_limit: 1000000,201 collections_admins_limit: 5,202 custom_data_limit: 2048,203 nft_sponsor_transfer_timeout: 15,204 fungible_sponsor_transfer_timeout: 15,205 refungible_sponsor_transfer_timeout: 15,206 offchain_schema_limit: 1024,207 variable_on_chain_schema_limit: 1024,208 const_on_chain_schema_limit: 1024,209 },210 }),211 pallet_contracts: Some(ContractsConfig {212 current_schedule: ContractsSchedule {213 enable_println,214 ..Default::default()215 },216 }),217 parachain_info: parachain_runtime::ParachainInfoConfig { parachain_id: id },218 }219}