1
// Copyright (C) Moondance Labs Ltd.
2
// This file is part of Tanssi.
3

            
4
// Tanssi is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8

            
9
// Tanssi is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13

            
14
// You should have received a copy of the GNU General Public License
15
// along with Tanssi.  If not, see <http://www.gnu.org/licenses/>
16

            
17
//! Genesis configs presets for the Starlight runtime
18

            
19
#[cfg(not(feature = "std"))]
20
use sp_std::alloc::format;
21
use {
22
    crate::{SessionKeys, BABE_GENESIS_EPOCH_CONFIG},
23
    authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId,
24
    babe_primitives::AuthorityId as BabeId,
25
    beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId,
26
    grandpa_primitives::AuthorityId as GrandpaId,
27
    primitives::{vstaging::SchedulerParams, AccountId, AccountPublic, AssignmentId, ValidatorId},
28
    sp_core::{sr25519, Pair, Public},
29
    sp_runtime::traits::IdentifyAccount,
30
    sp_std::vec::Vec,
31
    starlight_runtime_constants::currency::UNITS as STAR,
32
};
33

            
34
/// Helper function to generate a crypto pair from seed
35
2496
fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
36
2496
    TPublic::Pair::from_string(&format!("//{}", seed), None)
37
2496
        .expect("static values are valid; qed")
38
2496
        .public()
39
2496
}
40

            
41
/// Helper function to generate an account ID from seed
42
624
fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
43
624
where
44
624
    AccountPublic: From<<TPublic::Pair as Pair>::Public>,
45
624
{
46
624
    AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
47
624
}
48

            
49
#[derive(Clone, Debug)]
50
pub struct AuthorityKeys {
51
    pub stash: AccountId,
52
    pub controller: AccountId,
53
    pub babe: BabeId,
54
    pub grandpa: GrandpaId,
55
    pub para_validator: ValidatorId,
56
    pub para_assignment: AssignmentId,
57
    pub authority_discovery: AuthorityDiscoveryId,
58
    pub beefy: BeefyId,
59
    pub nimbus: nimbus_primitives::NimbusId,
60
}
61

            
62
/// Helper function to generate stash, controller and session key from seed
63
312
pub fn get_authority_keys_from_seed(seed: &str) -> AuthorityKeys {
64
312
    let keys = get_authority_keys_from_seed_no_beefy(seed);
65
312

            
66
312
    AuthorityKeys {
67
312
        stash: keys.0,
68
312
        controller: keys.1,
69
312
        babe: keys.2,
70
312
        grandpa: keys.3,
71
312
        para_validator: keys.4,
72
312
        para_assignment: keys.5,
73
312
        authority_discovery: keys.6,
74
312
        beefy: get_from_seed::<BeefyId>(seed),
75
312
        nimbus: get_aura_id_from_seed(seed),
76
312
    }
77
312
}
78

            
79
/// Helper function to generate a crypto pair from seed
80
312
pub fn get_aura_id_from_seed(seed: &str) -> nimbus_primitives::NimbusId {
81
312
    sp_core::sr25519::Pair::from_string(&format!("//{}", seed), None)
82
312
        .expect("static values are valid; qed")
83
312
        .public()
84
312
        .into()
85
312
}
86

            
87
/// Helper function to generate stash, controller and session key from seed
88
312
fn get_authority_keys_from_seed_no_beefy(
89
312
    seed: &str,
90
312
) -> (
91
312
    AccountId,
92
312
    AccountId,
93
312
    BabeId,
94
312
    GrandpaId,
95
312
    ValidatorId,
96
312
    AssignmentId,
97
312
    AuthorityDiscoveryId,
98
312
) {
99
312
    (
100
312
        get_account_id_from_seed::<sr25519::Public>(&format!("{}//stash", seed)),
101
312
        get_account_id_from_seed::<sr25519::Public>(seed),
102
312
        get_from_seed::<BabeId>(seed),
103
312
        get_from_seed::<GrandpaId>(seed),
104
312
        get_from_seed::<ValidatorId>(seed),
105
312
        get_from_seed::<AssignmentId>(seed),
106
312
        get_from_seed::<AuthorityDiscoveryId>(seed),
107
312
    )
108
312
}
109

            
110
fn testnet_accounts() -> Vec<AccountId> {
111
    Vec::from([
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
}
126

            
127
fn starlight_session_keys(
128
    babe: BabeId,
129
    grandpa: GrandpaId,
130
    para_validator: ValidatorId,
131
    para_assignment: AssignmentId,
132
    authority_discovery: AuthorityDiscoveryId,
133
    beefy: BeefyId,
134
    nimbus: nimbus_primitives::NimbusId,
135
) -> SessionKeys {
136
    SessionKeys {
137
        babe,
138
        grandpa,
139
        para_validator,
140
        para_assignment,
141
        authority_discovery,
142
        beefy,
143
        nimbus,
144
    }
145
}
146

            
147
1
fn default_parachains_host_configuration(
148
1
) -> runtime_parachains::configuration::HostConfiguration<primitives::BlockNumber> {
149
1
    use primitives::{
150
1
        node_features::FeatureIndex, AsyncBackingParams, MAX_CODE_SIZE, MAX_POV_SIZE,
151
1
    };
152
1

            
153
1
    runtime_parachains::configuration::HostConfiguration {
154
1
        validation_upgrade_cooldown: 2u32,
155
1
        validation_upgrade_delay: 2,
156
1
        code_retention_period: 1200,
157
1
        max_code_size: MAX_CODE_SIZE,
158
1
        max_pov_size: MAX_POV_SIZE,
159
1
        max_head_data_size: 32 * 1024,
160
1
        max_upward_queue_count: 8,
161
1
        max_upward_queue_size: 1024 * 1024,
162
1
        max_downward_message_size: 1024 * 1024,
163
1
        max_upward_message_size: 50 * 1024,
164
1
        max_upward_message_num_per_candidate: 5,
165
1
        hrmp_sender_deposit: 0,
166
1
        hrmp_recipient_deposit: 0,
167
1
        hrmp_channel_max_capacity: 8,
168
1
        hrmp_channel_max_total_size: 8 * 1024,
169
1
        hrmp_max_parachain_inbound_channels: 4,
170
1
        hrmp_channel_max_message_size: 1024 * 1024,
171
1
        hrmp_max_parachain_outbound_channels: 4,
172
1
        hrmp_max_message_num_per_candidate: 5,
173
1
        dispute_period: 6,
174
1
        no_show_slots: 2,
175
1
        n_delay_tranches: 25,
176
1
        needed_approvals: 2,
177
1
        relay_vrf_modulo_samples: 2,
178
1
        zeroth_delay_tranche_width: 0,
179
1
        minimum_validation_upgrade_delay: 5,
180
1
        async_backing_params: AsyncBackingParams {
181
1
            max_candidate_depth: 3,
182
1
            allowed_ancestry_len: 2,
183
1
        },
184
1
        node_features: bitvec::vec::BitVec::from_element(
185
1
            1u8 << (FeatureIndex::ElasticScalingMVP as usize),
186
1
        ),
187
1
        scheduler_params: SchedulerParams {
188
1
            lookahead: 2,
189
1
            group_rotation_frequency: 20,
190
1
            paras_availability_period: 4,
191
1
            ..Default::default()
192
1
        },
193
1
        ..Default::default()
194
1
    }
195
1
}
196

            
197
#[test]
198
1
fn default_parachains_host_configuration_is_consistent() {
199
1
    default_parachains_host_configuration().panic_if_not_consistent();
200
1
}
201

            
202
fn starlight_testnet_genesis(
203
    initial_authorities: Vec<AuthorityKeys>,
204
    root_key: AccountId,
205
    endowed_accounts: Option<Vec<AccountId>>,
206
) -> serde_json::Value {
207
    let endowed_accounts: Vec<AccountId> = endowed_accounts.unwrap_or_else(testnet_accounts);
208

            
209
    const ENDOWMENT: u128 = 1_000_000 * STAR;
210

            
211
    serde_json::json!({
212
        "balances": {
213
            "balances": endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect::<Vec<_>>(),
214
        },
215
        "session": {
216
            "keys": initial_authorities
217
                .iter()
218
                .map(|x| {
219
                    (
220
                        x.stash.clone(),
221
                        x.stash.clone(),
222
                        starlight_session_keys(
223
                            x.babe.clone(),
224
                            x.grandpa.clone(),
225
                            x.para_validator.clone(),
226
                            x.para_assignment.clone(),
227
                            x.authority_discovery.clone(),
228
                            x.beefy.clone(),
229
                            x.nimbus.clone(),
230
                        ),
231
                    )
232
                })
233
                .collect::<Vec<_>>(),
234
        },
235
        "babe": {
236
            "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG),
237
        },
238
        "sudo": { "key": Some(root_key.clone()) },
239
        "configuration": {
240
            "config": runtime_parachains::configuration::HostConfiguration {
241
                scheduler_params: SchedulerParams {
242
                    max_validators_per_core: Some(1),
243
                    ..default_parachains_host_configuration().scheduler_params
244
                },
245
                ..default_parachains_host_configuration()
246
            },
247
        },
248
        "registrar": {
249
            "nextFreeParaId": primitives::LOWEST_PUBLIC_ID,
250
        }
251
    })
252
}
253

            
254
// staging_testnet
255
fn starlight_staging_testnet_config_genesis() -> serde_json::Value {
256
    use {hex_literal::hex, sp_core::crypto::UncheckedInto};
257

            
258
    // subkey inspect "$SECRET"
259
    let endowed_accounts = Vec::from([
260
        // 5DwBmEFPXRESyEam5SsQF1zbWSCn2kCjyLW51hJHXe9vW4xs
261
        hex!["52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649"].into(),
262
    ]);
263

            
264
    let initial_authorities = Vec::from([
265
        AuthorityKeys {
266
            stash: //5EHZkbp22djdbuMFH9qt1DVzSCvqi3zWpj6DAYfANa828oei
267
            hex!["62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a"].into(),
268
            controller: //5FeSEpi9UYYaWwXXb3tV88qtZkmSdB3mvgj3pXkxKyYLGhcd
269
            hex!["9e6e781a76810fe93187af44c79272c290c2b9e2b8b92ee11466cd79d8023f50"].into(),
270
            babe: //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H
271
            hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"].unchecked_into(),
272
            grandpa: //5CPd3zoV9Aaah4xWucuDivMHJ2nEEmpdi864nPTiyRZp4t87
273
            hex!["0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa"].unchecked_into(),
274
            para_validator: //5CP6oGfwqbEfML8efqm1tCZsUgRsJztp9L8ZkEUxA16W8PPz
275
            hex!["0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205"].unchecked_into(),
276
            para_assignment: //5HQdwiDh8Qtd5dSNWajNYpwDvoyNWWA16Y43aEkCNactFc2b
277
            hex!["ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b"].unchecked_into(),
278
            authority_discovery: //5HbSgM72xVuscsopsdeG3sCSCYdAeM1Tay9p79N6ky6vwDGq
279
            hex!["f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c"].unchecked_into(),
280
            beefy: //5DPSWdgw38Spu315r6LSvYCggeeieBAJtP5A1qzuzKhqmjVu
281
            hex!["034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276"].unchecked_into(),
282
            nimbus: //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H
283
            hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"].unchecked_into(),
284
        },
285
        AuthorityKeys {
286
            stash: //5DvH8oEjQPYhzCoQVo7WDU91qmQfLZvxe9wJcrojmJKebCmG
287
            hex!["520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a"].into(),
288
            controller: //5ENZvCRzyXJJYup8bM6yEzb2kQHEb1NDpY2ZEyVGBkCfRdj3
289
            hex!["6618289af7ae8621981ffab34591e7a6486e12745dfa3fd3b0f7e6a3994c7b5b"].into(),
290
            babe: //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM
291
            hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"].unchecked_into(),
292
            grandpa: //5HnDVBN9mD6mXyx8oryhDbJtezwNSj1VRXgLoYCBA6uEkiao
293
            hex!["fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d"].unchecked_into(),
294
            para_validator: //5EPEWRecy2ApL5n18n3aHyU1956zXTRqaJpzDa9DoqiggNwF
295
            hex!["669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816"].unchecked_into(),
296
            para_assignment: //5ES3fw5X4bndSgLNmtPfSbM2J1kLqApVB2CCLS4CBpM1UxUZ
297
            hex!["68bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d"].unchecked_into(),
298
            authority_discovery: //5HeXbwb5PxtcRoopPZTp5CQun38atn2UudQ8p2AxR5BzoaXw
299
            hex!["f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349"].unchecked_into(),
300
            beefy: //5F7nTtN8MyJV4UsXpjg7tHSnfANXZ5KRPJmkASc1ZSH2Xoa5
301
            hex!["03a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e"].unchecked_into(),
302
            nimbus: //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM
303
            hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"].unchecked_into(),
304
        },
305
        AuthorityKeys {
306
            stash: //5FPMzsezo1PRxYbVpJMWK7HNbR2kUxidsAAxH4BosHa4wd6S
307
            hex!["92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f"].into(),
308
            controller: //5G6NQidFG7YiXsvV7hQTLGArir9tsYqD4JDxByhgxKvSKwRx
309
            hex!["b235f57244230589523271c27b8a490922ffd7dccc83b044feaf22273c1dc735"].into(),
310
            babe: //5GpZhzAVg7SAtzLvaAC777pjquPEcNy1FbNUAG2nZvhmd6eY
311
            hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"].unchecked_into(),
312
            grandpa: //5HAes2RQYPbYKbLBfKb88f4zoXv6pPA6Ke8CjN7dob3GpmSP
313
            hex!["e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1"].unchecked_into(),
314
            para_validator: //5FtAGDZYJKXkhVhAxCQrXmaP7EE2mGbBMfmKDHjfYDgq2BiU
315
            hex!["a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037"].unchecked_into(),
316
            para_assignment: //5CtK7JHv3h6UQZ44y54skxdwSVBRtuxwPE1FYm7UZVhg8rJV
317
            hex!["244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e"].unchecked_into(),
318
            authority_discovery: //5D4r6YaB6F7A7nvMRHNFNF6zrR9g39bqDJFenrcaFmTCRwfa
319
            hex!["2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d"].unchecked_into(),
320
            beefy: //5EPoHj8uV4fFKQHYThc6Z9fDkU7B6ih2ncVzQuDdNFb8UyhF
321
            hex!["039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53"].unchecked_into(),
322
            nimbus: hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"].unchecked_into(),
323
        },
324
        AuthorityKeys {
325
            stash: //5DMNx7RoX6d7JQ38NEM7DWRcW2THu92LBYZEWvBRhJeqcWgR
326
            hex!["38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404"].into(),
327
            controller: //5GGdKNDr9P47dpVnmtq3m8Tvowwf1ot1abw6tPsTYYFoKm2v
328
            hex!["ba0898c1964196474c0be08d364cdf4e9e1d47088287f5235f70b0590dfe1704"].into(),
329
            babe: //5EjkyPCzR2SjhDZq8f7ufsw6TfkvgNRepjCRQFc4TcdXdaB1
330
            hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"]
331
                .unchecked_into(),
332
            grandpa: //5DJV3zCBTJBLGNDCcdWrYxWDacSz84goGTa4pFeKVvehEBte
333
            hex!["36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4"]
334
                .unchecked_into(),
335
            para_validator: //5F9FsRjpecP9GonktmtFL3kjqNAMKjHVFjyjRdTPa4hbQRZA
336
            hex!["882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b"]
337
                .unchecked_into(),
338
            para_assignment: //5F1FZWZSj3JyTLs8sRBxU6QWyGLSL9BMRtmSKDmVEoiKFxSP
339
            hex!["821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75"]
340
                .unchecked_into(),
341
            authority_discovery: //5CtgRR74VypK4h154s369abs78hDUxZSJqcbWsfXvsjcHJNA
342
            hex!["2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c"]
343
                .unchecked_into(),
344
            beefy: //5CPx6dsr11SCJHKFkcAQ9jpparS7FwXQBrrMznRo4Hqv1PXz
345
            hex!["0307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d58"]
346
                .unchecked_into(),
347
            nimbus: hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"]
348
                .unchecked_into(),
349
        },
350
        AuthorityKeys {
351
            stash: //5C8AL1Zb4bVazgT3EgDxFgcow1L4SJjVu44XcLC9CrYqFN4N
352
            hex!["02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16"].into(),
353
            controller: //5FLYy3YKsAnooqE4hCudttAsoGKbVG3hYYBtVzwMjJQrevPa
354
            hex!["90cab33f0bb501727faa8319f0845faef7d31008f178b65054b6629fe531b772"].into(),
355
            babe: //5Et3tfbVf1ByFThNAuUq5pBssdaPPskip5yob5GNyUFojXC7
356
            hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"]
357
                .unchecked_into(),
358
            grandpa: //5EX1JBghGbQqWohTPU6msR9qZ2nYPhK9r3RTQ2oD1K8TCxaG
359
            hex!["6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81"]
360
                .unchecked_into(),
361
            para_validator: //5EUNaBpX9mJgcmLQHyG5Pkms6tbDiKuLbeTEJS924Js9cA1N
362
            hex!["6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01"]
363
                .unchecked_into(),
364
            para_assignment: //5CaZuueRVpMATZG4hkcrgDoF4WGixuz7zu83jeBdY3bgWGaG
365
            hex!["16c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33"]
366
                .unchecked_into(),
367
            authority_discovery: //5DABsdQCDUGuhzVGWe5xXzYQ9rtrVxRygW7RXf9Tsjsw1aGJ
368
            hex!["306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531"]
369
                .unchecked_into(),
370
            beefy: //5H91T5mHhoCw9JJG4NjghDdQyhC6L7XcSuBWKD3q3TAhEVvQ
371
            hex!["02fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6"]
372
                .unchecked_into(),
373
            nimbus: hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"]
374
                .unchecked_into(),
375
        },
376
        AuthorityKeys {
377
            stash: //5C8XbDXdMNKJrZSrQURwVCxdNdk8AzG6xgLggbzuA399bBBF
378
            hex!["02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864"].into(),
379
            controller: //5GsyzFP8qtF8tXPSsjhjxAeU1v7D1PZofuQKN9TdCc7Dp1JM
380
            hex!["d4ffc4c05b47d1115ad200f7f86e307b20b46c50e1b72a912ec4f6f7db46b616"].into(),
381
            babe: //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD
382
            hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"]
383
                .unchecked_into(),
384
            grandpa: //5GzDPGbUM9uH52ZEwydasTj8edokGUJ7vEpoFWp9FE1YNuFB
385
            hex!["d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33"]
386
                .unchecked_into(),
387
            para_validator: //5CmLCFeSurRXXtwMmLcVo7sdJ9EqDguvJbuCYDcHkr3cpqyE
388
            hex!["1efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c"]
389
                .unchecked_into(),
390
            para_assignment: //5DnsSy8a8pfE2aFjKBDtKw7WM1V4nfE5sLzP15MNTka53GqS
391
            hex!["4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22"]
392
                .unchecked_into(),
393
            authority_discovery: //5CZdFnyzZvKetZTeUwj5APAYskVJe4QFiTezo5dQNsrnehGd
394
            hex!["160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a"]
395
                .unchecked_into(),
396
            beefy: //5HgoR9JJkdBusxKrrs3zgd3ToppgNoGj1rDyAJp4e7eZiYyT
397
            hex!["020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474"]
398
                .unchecked_into(),
399
            nimbus: //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD
400
            hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"]
401
                .unchecked_into(),
402
        },
403
        AuthorityKeys {
404
            stash: //5HinEonzr8MywkqedcpsmwpxKje2jqr9miEwuzyFXEBCvVXM
405
            hex!["fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00"].into(),
406
            controller: //5EHJbj6Td6ks5HDnyfN4ttTSi57osxcQsQexm7XpazdeqtV7
407
            hex!["62145d721967bd88622d08625f0f5681463c0f1b8bcd97eb3c2c53f7660fd513"].into(),
408
            babe: //5EeCsC58XgJ1DFaoYA1WktEpP27jvwGpKdxPMFjicpLeYu96
409
            hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"]
410
                .unchecked_into(),
411
            grandpa: //5DnEySxbnppWEyN8cCLqvGjAorGdLRg2VmkY96dbJ1LHFK8N
412
            hex!["4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14"]
413
                .unchecked_into(),
414
            para_validator: //5CAC278tFCHAeHYqE51FTWYxHmeLcENSS1RG77EFRTvPZMJT
415
            hex!["042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f"]
416
                .unchecked_into(),
417
            para_assignment: //5HjRTLWcQjZzN3JDvaj1UzjNSayg5ZD9ZGWMstaL7Ab2jjAa
418
            hex!["fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f"]
419
                .unchecked_into(),
420
            authority_discovery: //5ELv74v7QcsS6FdzvG4vL2NnYDGWmRnJUSMKYwdyJD7Xcdi7
421
            hex!["64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f"]
422
                .unchecked_into(),
423
            beefy: //5FaUcPt4fPz93vBhcrCJqmDkjYZ7jCbzAF56QJoCmvPaKrmx
424
            hex!["033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685"]
425
                .unchecked_into(),
426
            nimbus: hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"]
427
                .unchecked_into(),
428
        },
429
        AuthorityKeys {
430
            stash: //5Ey3NQ3dfabaDc16NUv7wRLsFCMDFJSqZFzKVycAsWuUC6Di
431
            hex!["8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47"].into(),
432
            controller: //5HiWsuSBqt8nS9pnggexXuHageUifVPKPHDE2arTKqhTp1dV
433
            hex!["fa0388fa88f3f0cb43d583e2571fbc0edad57dff3a6fd89775451dd2c2b8ea00"].into(),
434
            babe: //5H168nKX2Yrfo3bxj7rkcg25326Uv3CCCnKUGK6uHdKMdPt8
435
            hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"]
436
                .unchecked_into(),
437
            grandpa: //5DrA2fZdzmNqT5j6DXNwVxPBjDV9jhkAqvjt6Us3bQHKy3cF
438
            hex!["4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc"]
439
                .unchecked_into(),
440
            para_validator: //5Gx6YeNhynqn8qkda9QKpc9S7oDr4sBrfAu516d3sPpEt26F
441
            hex!["d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d"]
442
                .unchecked_into(),
443
            para_assignment: //5DhDcHqwxoes5s89AyudGMjtZXx1nEgrk5P45X88oSTR3iyx
444
            hex!["481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c"]
445
                .unchecked_into(),
446
            authority_discovery: //5DqAvikdpfRdk5rR35ZobZhqaC5bJXZcEuvzGtexAZP1hU3T
447
            hex!["4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26"]
448
                .unchecked_into(),
449
            beefy: //5E41Znrr2YtZu8bZp3nvRuLVHg3jFksfQ3tXuviLku4wsao7
450
            hex!["025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986"]
451
                .unchecked_into(),
452
            nimbus: hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"]
453
                .unchecked_into(),
454
        },
455
    ]);
456

            
457
    const ENDOWMENT: u128 = 1_000_000 * STAR;
458
    const STASH: u128 = 100 * STAR;
459

            
460
    serde_json::json!({
461
        "balances": {
462
            "balances": endowed_accounts
463
                .iter()
464
                .map(|k: &AccountId| (k.clone(), ENDOWMENT))
465
                .chain(initial_authorities.iter().map(|x| (x.stash.clone(), STASH)))
466
                .collect::<Vec<_>>(),
467
        },
468
        "session": {
469
            "keys": initial_authorities
470
                .into_iter()
471
                .map(|x| {
472
                    (
473
                        x.stash.clone(),
474
                        x.stash,
475
                        starlight_session_keys(
476
                            x.babe,
477
                            x.grandpa,
478
                            x.para_validator,
479
                            x.para_assignment,
480
                            x.authority_discovery,
481
                            x.beefy,
482
                            x.nimbus,
483
                        ),
484
                    )
485
                })
486
                .collect::<Vec<_>>(),
487
        },
488
        "babe": {
489
            "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG),
490
        },
491
        "sudo": { "key": Some(endowed_accounts[0].clone()) },
492
        "configuration": {
493
            "config": default_parachains_host_configuration(),
494
        },
495
        "registrar": {
496
            "nextFreeParaId": primitives::LOWEST_PUBLIC_ID,
497
        },
498
    })
499
}
500

            
501
//development
502
fn starlight_development_config_genesis() -> serde_json::Value {
503
    starlight_testnet_genesis(
504
        Vec::from([get_authority_keys_from_seed("Alice")]),
505
        get_account_id_from_seed::<sr25519::Public>("Alice"),
506
        None,
507
    )
508
}
509

            
510
//local_testnet
511
fn starlight_local_testnet_genesis() -> serde_json::Value {
512
    starlight_testnet_genesis(
513
        Vec::from([
514
            get_authority_keys_from_seed("Alice"),
515
            get_authority_keys_from_seed("Bob"),
516
        ]),
517
        get_account_id_from_seed::<sr25519::Public>("Alice"),
518
        None,
519
    )
520
}
521

            
522
/// `Versi` is a temporary testnet that uses the same runtime as starlight.
523
// versi_local_testnet
524
fn versi_local_testnet_genesis() -> serde_json::Value {
525
    starlight_testnet_genesis(
526
        Vec::from([
527
            get_authority_keys_from_seed("Alice"),
528
            get_authority_keys_from_seed("Bob"),
529
            get_authority_keys_from_seed("Charlie"),
530
            get_authority_keys_from_seed("Dave"),
531
        ]),
532
        get_account_id_from_seed::<sr25519::Public>("Alice"),
533
        None,
534
    )
535
}
536

            
537
/// Wococo is a temporary testnet that uses almost the same runtime as starlight.
538
//wococo_local_testnet
539
fn wococo_local_testnet_genesis() -> serde_json::Value {
540
    starlight_testnet_genesis(
541
        Vec::from([
542
            get_authority_keys_from_seed("Alice"),
543
            get_authority_keys_from_seed("Bob"),
544
            get_authority_keys_from_seed("Charlie"),
545
            get_authority_keys_from_seed("Dave"),
546
        ]),
547
        get_account_id_from_seed::<sr25519::Public>("Alice"),
548
        None,
549
    )
550
}
551

            
552
/// Provides the JSON representation of predefined genesis config for given `id`.
553
pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option<sp_std::vec::Vec<u8>> {
554
    let patch = match id.try_into() {
555
        Ok("local_testnet") => starlight_local_testnet_genesis(),
556
        Ok("development") => starlight_development_config_genesis(),
557
        Ok("staging_testnet") => starlight_staging_testnet_config_genesis(),
558
        Ok("wococo_local_testnet") => wococo_local_testnet_genesis(),
559
        Ok("versi_local_testnet") => versi_local_testnet_genesis(),
560
        _ => return None,
561
    };
562
    Some(
563
        serde_json::to_string(&patch)
564
            .expect("serialization to json is expected to work. qed.")
565
            .into_bytes(),
566
    )
567
}