subspace_test_client/
auto_id_domain_chain_spec.rs

1//! Chain specification for the auto-id domain.
2
3use crate::chain_spec::get_from_seed;
4use auto_id_domain_test_runtime::{BalancesConfig, RuntimeGenesisConfig, SystemConfig};
5use domain_runtime_primitives::AccountIdConverter;
6use parity_scale_codec::Encode;
7use sc_chain_spec::{ChainType, GenericChainSpec, NoExtension};
8use sp_core::crypto::AccountId32;
9use sp_core::{sr25519, Pair, Public};
10use sp_domains::storage::RawGenesis;
11use sp_domains::{
12    DomainRuntimeConfig, GenesisDomain, OperatorAllowList, OperatorPublicKey, RuntimeType,
13};
14use sp_runtime::traits::{Convert, IdentifyAccount};
15use sp_runtime::{BuildStorage, MultiSigner, Percent};
16use subspace_runtime_primitives::{AccountId, Balance, SSC};
17
18/// Get public key from keypair seed.
19pub(crate) fn get_public_key_from_seed<TPublic: Public>(
20    seed: &'static str,
21) -> <TPublic::Pair as Pair>::Public {
22    TPublic::Pair::from_string(&format!("//{seed}"), None)
23        .expect("Static values are valid; qed")
24        .public()
25}
26
27/// Generate an account ID from seed.
28pub(crate) fn get_account_id_from_seed(seed: &'static str) -> AccountId32 {
29    MultiSigner::from(get_public_key_from_seed::<sr25519::Public>(seed)).into_account()
30}
31
32pub(crate) fn endowed_accounts() -> Vec<AccountId32> {
33    vec![
34        get_account_id_from_seed("Alice"),
35        get_account_id_from_seed("Bob"),
36        get_account_id_from_seed("Charlie"),
37        get_account_id_from_seed("Dave"),
38        get_account_id_from_seed("Eve"),
39        get_account_id_from_seed("Ferdie"),
40        get_account_id_from_seed("Alice//stash"),
41        get_account_id_from_seed("Bob//stash"),
42        get_account_id_from_seed("Charlie//stash"),
43        get_account_id_from_seed("Dave//stash"),
44        get_account_id_from_seed("Eve//stash"),
45        get_account_id_from_seed("Ferdie//stash"),
46    ]
47}
48
49fn testnet_auto_id_genesis() -> RuntimeGenesisConfig {
50    RuntimeGenesisConfig {
51        system: SystemConfig::default(),
52        balances: BalancesConfig::default(),
53        ..Default::default()
54    }
55}
56
57pub fn get_genesis_domain(
58    sudo_account: subspace_runtime_primitives::AccountId,
59) -> Result<GenesisDomain<AccountId, Balance>, String> {
60    let raw_genesis_storage = {
61        let domain_chain_spec = GenericChainSpec::<NoExtension, ()>::builder(
62            auto_id_domain_test_runtime::WASM_BINARY
63                .ok_or_else(|| "Development wasm not available".to_string())?,
64            None,
65        )
66        .with_chain_type(ChainType::Development)
67        .with_genesis_config(
68            serde_json::to_value(testnet_auto_id_genesis())
69                .map_err(|error| format!("Failed to serialize genesis config: {error}"))?,
70        )
71        .build();
72        let storage = domain_chain_spec
73            .build_storage()
74            .expect("Failed to build genesis storage from genesis runtime config");
75        let raw_genesis = RawGenesis::from_storage(storage);
76        raw_genesis.encode()
77    };
78
79    Ok(GenesisDomain {
80        runtime_name: "auto-id".to_owned(),
81        runtime_type: RuntimeType::AutoId,
82        runtime_version: auto_id_domain_test_runtime::VERSION,
83        raw_genesis_storage,
84
85        // Domain config, mainly for placeholder the concrete value TBD
86        owner_account_id: sudo_account,
87        domain_name: "auto-id-domain".to_owned(),
88        bundle_slot_probability: (1, 1),
89        operator_allow_list: OperatorAllowList::Anyone,
90
91        signing_key: get_from_seed::<OperatorPublicKey>("Bob"),
92        minimum_nominator_stake: 100 * SSC,
93        nomination_tax: Percent::from_percent(5),
94        initial_balances: endowed_accounts()
95            .iter()
96            .cloned()
97            .map(|k| (AccountIdConverter::convert(k), 2_000_000 * SSC))
98            .collect(),
99
100        domain_runtime_config: DomainRuntimeConfig::default_auto_id(),
101    })
102}