drt_sc_snippets/multi/
interactor_multi_sc_exec.rs1use super::interactor_multi_sc_process::{update_nonces_and_sign_tx, SenderSet, Txs};
2use crate::{network_response, Interactor, InteractorStep, StepBuffer};
3use drt_sdk::data::transaction::Transaction;
4
5impl Interactor {
6 pub async fn multi_sc_exec(&mut self, mut buffer: StepBuffer<'_>) {
7 for step in buffer.refs.iter_mut() {
8 step.run_step(&mut self.pre_runners);
9 }
10
11 let senders = retrieve_senders(buffer.refs.as_slice());
12 self.recall_senders_nonce(senders).await;
13
14 let txs = self.retrieve_txs(&mut buffer);
15 let results = self.process_txs(txs).await;
16
17 for (i, sc_call_step) in buffer.refs.iter_mut().enumerate() {
18 sc_call_step.set_response(network_response::parse_tx_response(
19 results.get(i).unwrap().clone(),
20 ));
21 }
22
23 for step in buffer.refs.iter_mut() {
24 step.run_step(&mut self.post_runners);
25 }
26 }
27
28 fn retrieve_txs(&mut self, buffer: &mut StepBuffer<'_>) -> Vec<Transaction> {
29 let mut txs = Txs::new();
30
31 for sc_call_step in &mut buffer.refs {
32 let mut transaction = sc_call_step.to_transaction(self);
33 let sender_address = &sc_call_step.sender_address().value;
34 let sender = self
35 .sender_map
36 .get_mut(sender_address)
37 .expect("sender not registered");
38
39 update_nonces_and_sign_tx(&mut transaction, sender);
40 txs.push(transaction);
41 }
42 txs
43 }
44}
45
46fn retrieve_senders(sc_call_steps: &[&mut dyn InteractorStep]) -> SenderSet {
47 let mut senders = SenderSet::new();
48
49 for sc_call_step in sc_call_steps {
50 let sender_address = &sc_call_step.sender_address().value;
51 senders.insert(sender_address.clone());
52 }
53 senders
54}