casper_rust_wasm_sdk/sdk/deploy/
speculative_deploy.rs

1#[cfg(target_arch = "wasm32")]
2use crate::rpcs::speculative_exec_deploy::SpeculativeExecResult;
3use crate::{
4    types::{
5        deploy_params::{
6            deploy_str_params::{deploy_str_params_to_casper_client, DeployStrParams},
7            payment_str_params::{payment_str_params_to_casper_client, PaymentStrParams},
8            session_str_params::{session_str_params_to_casper_client, SessionStrParams},
9        },
10        sdk_error::SdkError,
11        verbosity::Verbosity,
12    },
13    SDK,
14};
15use casper_client::{
16    cli::deploy::make_deploy, rpcs::results::SpeculativeExecResult as _SpeculativeExecResult,
17    SuccessResponse,
18};
19#[cfg(target_arch = "wasm32")]
20use wasm_bindgen::prelude::*;
21
22#[cfg(target_arch = "wasm32")]
23#[wasm_bindgen]
24impl SDK {
25    /// This function allows executing a deploy speculatively.
26    ///
27    /// # Arguments
28    ///
29    /// * `deploy_params` - Deployment parameters for the deploy.
30    /// * `session_params` - Session parameters for the deploy.
31    /// * `payment_params` - Payment parameters for the deploy.
32    /// * `verbosity` - Optional verbosity level.
33    /// * `rpc_address` - Optional rpc address.
34    ///
35    /// # Returns
36    ///
37    /// A `Result` containing either a `SpeculativeExecResult` or a `JsError` in case of an error.
38    #[wasm_bindgen(js_name = "speculative_deploy")]
39    #[allow(clippy::too_many_arguments, deprecated)]
40    #[deprecated(note = "prefer speculative_transaction")]
41    pub async fn speculative_deploy_js_alias(
42        &self,
43        deploy_params: DeployStrParams,
44        session_params: SessionStrParams,
45        payment_params: PaymentStrParams,
46        verbosity: Option<Verbosity>,
47        rpc_address: Option<String>,
48    ) -> Result<SpeculativeExecResult, JsError> {
49        let result = self
50            .speculative_deploy(
51                deploy_params,
52                session_params,
53                payment_params,
54                verbosity,
55                rpc_address,
56            )
57            .await;
58        match result {
59            Ok(data) => Ok(data.result.into()),
60            Err(err) => {
61                let err = &format!("Error occurred with {:?}", err);
62                Err(JsError::new(err))
63            }
64        }
65    }
66}
67
68impl SDK {
69    /// This function allows executing a deploy speculatively.
70    ///
71    /// # Arguments
72    ///
73    /// * `deploy_params` - Deployment parameters for the deploy.
74    /// * `session_params` - Session parameters for the deploy.
75    /// * `payment_params` - Payment parameters for the deploy.
76    /// * `verbosity` - Optional verbosity level.
77    /// * `rpc_address` - Optional rpc address.
78    ///
79    /// # Returns
80    ///
81    /// A `Result` containing either a `SuccessResponse<_SpeculativeExecResult>` or a `SdkError` in case of an error.
82    #[allow(clippy::too_many_arguments, deprecated)]
83    #[deprecated(note = "prefer speculative_transaction")]
84    pub async fn speculative_deploy(
85        &self,
86        deploy_params: DeployStrParams,
87        session_params: SessionStrParams,
88        payment_params: PaymentStrParams,
89        verbosity: Option<Verbosity>,
90        rpc_address: Option<String>,
91    ) -> Result<SuccessResponse<_SpeculativeExecResult>, SdkError> {
92        // log("speculative_deploy!");
93        let deploy = make_deploy(
94            "",
95            deploy_str_params_to_casper_client(&deploy_params),
96            session_str_params_to_casper_client(&session_params),
97            payment_str_params_to_casper_client(&payment_params),
98            false,
99        );
100
101        if let Err(err) = deploy {
102            return Err(SdkError::from(err));
103        }
104
105        self.speculative_exec_deploy(deploy.unwrap().into(), verbosity, rpc_address)
106            .await
107    }
108}
109
110#[cfg(test)]
111#[allow(deprecated)]
112mod tests {
113    use super::*;
114    use crate::helpers::public_key_from_secret_key;
115    use once_cell::sync::Lazy;
116    use sdk_tests::{
117        config::{ARGS_SIMPLE, HELLO_CONTRACT, PAYMENT_AMOUNT, WASM_PATH},
118        tests::helpers::{get_network_constants, get_user_secret_key, read_wasm_file},
119    };
120    use std::sync::Mutex;
121
122    static SESSION_PARAMS: Lazy<Mutex<Option<SessionStrParams>>> = Lazy::new(|| Mutex::new(None));
123
124    fn get_session_params() -> SessionStrParams {
125        let mut session_params = SESSION_PARAMS.lock().unwrap();
126
127        if session_params.is_none() {
128            let mut new_session_params = SessionStrParams::default();
129            let file_path = &format!("{WASM_PATH}{HELLO_CONTRACT}");
130            let module_bytes = match read_wasm_file(file_path) {
131                Ok(module_bytes) => module_bytes,
132                Err(err) => {
133                    eprintln!("Error reading file: {:?}", err);
134                    unimplemented!()
135                }
136            };
137            new_session_params.set_session_bytes(module_bytes.into());
138            let args_simple: Vec<String> = ARGS_SIMPLE.iter().map(|s| s.to_string()).collect();
139            new_session_params.set_session_args(args_simple);
140            *session_params = Some(new_session_params);
141        }
142
143        session_params.clone().unwrap()
144    }
145
146    #[tokio::test]
147    #[ignore]
148    async fn _test_speculative_deploy_with_valid_params() {
149        // Arrange
150        let sdk = SDK::new(None, None, None);
151        let verbosity = Some(Verbosity::High);
152        let (_, _, default_speculative_address, _, chain_name) = get_network_constants();
153
154        let secret_key = get_user_secret_key(None).unwrap();
155        let account = public_key_from_secret_key(&secret_key).unwrap();
156
157        let deploy_params =
158            DeployStrParams::new(&chain_name, &account, Some(secret_key), None, None, None);
159        let payment_params = PaymentStrParams::default();
160        payment_params.set_payment_amount(PAYMENT_AMOUNT);
161
162        // Act
163        let result = sdk
164            .speculative_deploy(
165                deploy_params,
166                get_session_params().clone(),
167                payment_params,
168                verbosity,
169                Some(default_speculative_address),
170            )
171            .await;
172
173        // Assert
174        assert!(result.is_ok());
175    }
176
177    #[tokio::test]
178    async fn test_speculative_deploy_with_valid_params_without_secret_key() {
179        // Arrange
180        let sdk = SDK::new(None, None, None);
181        let verbosity = Some(Verbosity::High);
182        let (_, _, default_speculative_address, _, chain_name) = get_network_constants();
183
184        let deploy_params = DeployStrParams::new(&chain_name, "", None, None, None, None);
185        let payment_params = PaymentStrParams::default();
186        payment_params.set_payment_amount(PAYMENT_AMOUNT);
187
188        // Act
189        let result = sdk
190            .speculative_deploy(
191                deploy_params,
192                get_session_params().clone(),
193                payment_params,
194                verbosity,
195                Some(default_speculative_address),
196            )
197            .await;
198
199        // Assert
200        assert!(result.is_err());
201    }
202
203    #[tokio::test]
204    async fn test_speculative_deploy_with_invalid_params() {
205        // Arrange
206        let sdk = SDK::new(None, None, None);
207        let verbosity = Some(Verbosity::High);
208        let (_, _, default_speculative_address, _, _) = get_network_constants();
209
210        let error_message = "Missing a required arg - exactly one of the following must be provided: [\"payment_amount\", \"payment_hash\", \"payment_name\", \"payment_package_hash\", \"payment_package_name\", \"payment_path\", \"has_payment_bytes\"]";
211
212        let deploy_params = DeployStrParams::default();
213        let payment_params = PaymentStrParams::default();
214        payment_params.set_payment_amount(""); // This is not valid payment amount
215
216        // Act
217        let result = sdk
218            .speculative_deploy(
219                deploy_params,
220                get_session_params().clone(),
221                payment_params,
222                verbosity,
223                Some(default_speculative_address),
224            )
225            .await;
226
227        // Assert
228        assert!(result.is_err());
229
230        let err_string = result.err().unwrap().to_string();
231
232        assert!(err_string.contains(error_message));
233    }
234}