multiversx_sc_snippets/multi/
interactor_multi_sc_exec.rs

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