drt_sc_snippets/multi/
interactor_multi_sc_exec.rs

1use 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}