multiversx_sc_snippets/multi/
interactor_multi_sc_exec.rs1use 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}