multiversx_sc_snippets/interactor/
interactor_chain_simulator.rs

1use anyhow::Error;
2use multiversx_sc_scenario::imports::Bech32Address;
3use multiversx_sdk::gateway::{
4    ChainSimulatorAddKeysRequest, ChainSimulatorGenerateBlocksRequest,
5    ChainSimulatorSendFundsRequest, ChainSimulatorSetStateOverwriteRequest,
6    ChainSimulatorSetStateRequest, GatewayAsyncService, SetStateAccount,
7};
8
9use crate::InteractorBase;
10
11pub const ALL_ACTIVATIONS_EPOCH: u64 = 2;
12
13impl<GatewayProxy> InteractorBase<GatewayProxy>
14where
15    GatewayProxy: GatewayAsyncService,
16{
17    pub async fn send_user_funds(&self, receiver: &Bech32Address) -> Result<String, Error> {
18        if !self.use_chain_simulator {
19            return Ok(String::from("no-simulator"));
20        }
21
22        self.proxy
23            .request(ChainSimulatorSendFundsRequest::to_address(receiver))
24            .await
25    }
26
27    pub async fn generate_blocks(&self, num_blocks: u64) -> Result<String, Error> {
28        if !self.use_chain_simulator {
29            return Ok(String::from("no-simulator"));
30        }
31
32        self.proxy
33            .request(ChainSimulatorGenerateBlocksRequest::num_blocks(num_blocks))
34            .await
35    }
36
37    pub async fn add_key(&self, key: Vec<u8>) -> Result<String, Error> {
38        if !self.use_chain_simulator {
39            return Ok(String::from("no-simulator"));
40        }
41
42        self.proxy
43            .request(ChainSimulatorAddKeysRequest::with_keys(vec![key]))
44            .await
45    }
46
47    pub async fn generate_blocks_until_epoch(&self, epoch_number: u64) -> Result<String, Error> {
48        if !self.use_chain_simulator {
49            return Ok(String::from("no-simulator"));
50        }
51
52        self.proxy
53            .request(ChainSimulatorGenerateBlocksRequest::until_epoch(
54                epoch_number,
55            ))
56            .await
57    }
58
59    /// Convenience method to wait enough blocks until all relevant activations are processed.
60    pub async fn generate_blocks_until_all_activations(&self) {
61        let _ = self
62            .generate_blocks_until_epoch(ALL_ACTIVATIONS_EPOCH)
63            .await
64            .expect("Failed to generate blocks until all activations");
65    }
66
67    pub async fn generate_blocks_until_tx_processed(&self, tx_hash: &str) -> Result<String, Error> {
68        if !self.use_chain_simulator {
69            return Ok(String::from("no-simulator"));
70        }
71
72        self.proxy
73            .request(ChainSimulatorGenerateBlocksRequest::until_tx_processed(
74                tx_hash,
75            ))
76            .await
77    }
78
79    pub async fn set_state(&self, accounts: Vec<SetStateAccount>) -> Result<String, Error> {
80        if !self.use_chain_simulator {
81            return Ok(String::from("no-simulator"));
82        }
83
84        self.proxy
85            .request(ChainSimulatorSetStateRequest::for_accounts(accounts))
86            .await
87    }
88
89    pub async fn set_state_overwrite(
90        &self,
91        accounts: Vec<SetStateAccount>,
92    ) -> Result<String, Error> {
93        if !self.use_chain_simulator {
94            return Ok(String::from("no-simulator"));
95        }
96
97        self.proxy
98            .request(ChainSimulatorSetStateOverwriteRequest::for_accounts(
99                accounts,
100            ))
101            .await
102    }
103
104    pub async fn set_state_for_saved_accounts(&self) -> Result<String, Error> {
105        if !self.use_chain_simulator {
106            return Ok(String::from("no-simulator"));
107        }
108
109        let accounts = self.get_accounts_from_file();
110        self.proxy
111            .request(ChainSimulatorSetStateRequest::for_accounts(accounts))
112            .await
113    }
114}