multiversx_sc_snippets/interactor/
interactor_chain_simulator.rs1use 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 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}