multiversx_sc_scenario/scenario/run_trace/
scenario_trace.rs

1use multiversx_chain_scenario_format::{
2    interpret_trait::{InterpretableFrom, InterpreterContext},
3    serde_raw::ScenarioRaw,
4};
5
6use crate::{
7    multiversx_sc::types::Address,
8    scenario::{model::*, ScenarioRunner},
9    scenario_format::interpret_trait::IntoRaw,
10};
11use std::{collections::HashMap, path::Path};
12
13#[derive(Default, Debug)]
14pub struct ScenarioTrace {
15    pub scenario_trace: Scenario,
16    pub addr_to_pretty_string_map: HashMap<Address, String>,
17}
18
19impl ScenarioTrace {
20    pub fn write_scenario_trace<P: AsRef<Path>>(&mut self, file_path: P) {
21        self.scenario_trace_prettify();
22
23        let mandos_trace = core::mem::take(&mut self.scenario_trace);
24        let mandos_trace_raw = mandos_trace.into_raw();
25        mandos_trace_raw.save_to_file(file_path);
26    }
27
28    pub fn load_scenario_trace<P: AsRef<Path>>(&mut self, file_path: P) {
29        let mandos_trace_raw = ScenarioRaw::load_from_file(file_path);
30        let mandos_trace =
31            Scenario::interpret_from(mandos_trace_raw, &InterpreterContext::default());
32        self.scenario_trace = mandos_trace;
33    }
34
35    fn process_address_key(&mut self, address_key: &AddressKey) {
36        if !self
37            .addr_to_pretty_string_map
38            .contains_key(&address_key.value)
39        {
40            self.addr_to_pretty_string_map
41                .insert(address_key.value.clone(), address_key.original.clone());
42        }
43    }
44
45    fn process_address_value(&mut self, address_value: &AddressValue) {
46        if !self
47            .addr_to_pretty_string_map
48            .contains_key(&address_value.value)
49        {
50            self.addr_to_pretty_string_map.insert(
51                address_value.value.clone(),
52                address_value.original.to_concatenated_string(),
53            );
54        }
55    }
56}
57
58impl ScenarioRunner for ScenarioTrace {
59    fn run_external_steps(&mut self, step: &ExternalStepsStep) {
60        self.scenario_trace
61            .steps
62            .push(Step::ExternalSteps(step.clone()));
63    }
64
65    fn run_set_state_step(&mut self, step: &SetStateStep) {
66        for address_key in step.accounts.keys() {
67            self.process_address_key(address_key);
68        }
69        for new_address in &step.new_addresses {
70            self.process_address_value(&new_address.new_address);
71        }
72        self.scenario_trace.steps.push(Step::SetState(step.clone()));
73    }
74
75    fn run_sc_call_step(&mut self, step: &mut ScCallStep) {
76        self.process_address_value(&step.tx.from);
77        self.process_address_value(&step.tx.to);
78        self.scenario_trace.steps.push(Step::ScCall(step.clone()));
79    }
80
81    fn run_multi_sc_call_step(&mut self, steps: &mut [ScCallStep]) {
82        for step in steps {
83            self.process_address_value(&step.tx.from);
84            self.process_address_value(&step.tx.to);
85            self.scenario_trace.steps.push(Step::ScCall(step.clone()));
86        }
87    }
88
89    fn run_multi_sc_deploy_step(&mut self, steps: &mut [ScDeployStep]) {
90        for step in steps {
91            self.process_address_value(&step.tx.from);
92            self.scenario_trace.steps.push(Step::ScDeploy(step.clone()));
93        }
94    }
95
96    fn run_sc_query_step(&mut self, step: &mut ScQueryStep) {
97        self.process_address_value(&step.tx.to);
98        self.scenario_trace.steps.push(Step::ScQuery(step.clone()));
99    }
100
101    fn run_sc_deploy_step(&mut self, step: &mut ScDeployStep) {
102        self.process_address_value(&step.tx.from);
103        self.scenario_trace.steps.push(Step::ScDeploy(step.clone()));
104    }
105
106    fn run_transfer_step(&mut self, step: &TransferStep) {
107        self.process_address_value(&step.tx.from);
108        self.process_address_value(&step.tx.to);
109        self.scenario_trace.steps.push(Step::Transfer(step.clone()));
110    }
111
112    fn run_validator_reward_step(&mut self, step: &ValidatorRewardStep) {
113        self.scenario_trace
114            .steps
115            .push(Step::ValidatorReward(step.clone()));
116    }
117
118    fn run_check_state_step(&mut self, step: &CheckStateStep) {
119        for address_key in step.accounts.accounts.keys() {
120            self.process_address_key(address_key);
121        }
122        self.scenario_trace
123            .steps
124            .push(Step::CheckState(step.clone()));
125    }
126
127    fn run_dump_state_step(&mut self) {
128        self.scenario_trace
129            .steps
130            .push(Step::DumpState(DumpStateStep::default()));
131    }
132}