Skip to main content

radix_engine/updates/
eagle_ray.rs

1use super::*;
2use crate::{internal_prelude::*, system::system_callback::SystemBoot};
3
4#[derive(Clone, ScryptoSbor)]
5pub struct EagleRaySettings {
6    pub system_version_update: UpdateSetting<NoSettings>,
7}
8
9impl UpdateSettings for EagleRaySettings {
10    type UpdateGenerator = EagleRayGenerator;
11
12    fn protocol_version() -> ProtocolVersion {
13        ProtocolVersion::EagleRay
14    }
15
16    fn all_enabled_as_default_for_network(network: &NetworkDefinition) -> Self {
17        Self {
18            system_version_update: UpdateSetting::enabled_as_default_for_network(network),
19        }
20    }
21
22    fn all_disabled() -> Self {
23        Self {
24            system_version_update: UpdateSetting::Disabled,
25        }
26    }
27
28    fn create_generator(&self) -> Self::UpdateGenerator {
29        Self::UpdateGenerator {
30            settings: self.clone(),
31        }
32    }
33}
34
35pub struct EagleRayGenerator {
36    settings: EagleRaySettings,
37}
38
39impl ProtocolUpdateGenerator for EagleRayGenerator {
40    fn batch_groups(&self) -> Vec<Box<dyn ProtocolUpdateBatchGroupGenerator<'_> + '_>> {
41        vec![FixedBatchGroupGenerator::named("principal")
42            .add_batch("primary", |store| {
43                generate_main_batch(store, &self.settings)
44            })
45            .build()]
46    }
47}
48
49fn generate_main_batch(
50    store: &dyn SubstateDatabase,
51    EagleRaySettings {
52        system_version_update,
53    }: &EagleRaySettings,
54) -> ProtocolUpdateBatch {
55    let mut batch = ProtocolUpdateBatch::empty();
56
57    if let UpdateSetting::Enabled(NoSettings) = system_version_update {
58        batch.mut_add_flash(
59            "eagle-ray-system-version-update",
60            generate_system_boot_v5_updates(store),
61        );
62    }
63
64    batch
65}
66
67fn generate_system_boot_v5_updates(store: &dyn SubstateDatabase) -> StateUpdates {
68    let existing_system_boot: SystemBoot = store.get_existing_substate(
69        TRANSACTION_TRACKER,
70        BOOT_LOADER_PARTITION,
71        BootLoaderField::SystemBoot,
72    );
73
74    StateUpdates::empty().set_substate(
75        TRANSACTION_TRACKER,
76        BOOT_LOADER_PARTITION,
77        BootLoaderField::SystemBoot,
78        SystemBoot::eagle_ray_for_previous_parameters(existing_system_boot.into_parameters()),
79    )
80}