multiversx_sc_scenario/scenario/run_trace/
scenario_trace.rs1use 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}