Skip to main content

casper_rust_wasm_sdk/sdk/deploy_utils/
make_transfer.rs

1use crate::types::deploy::Deploy;
2use crate::{
3    types::{
4        deploy_params::{
5            deploy_str_params::{deploy_str_params_to_casper_client, DeployStrParams},
6            payment_str_params::{payment_str_params_to_casper_client, PaymentStrParams},
7        },
8        sdk_error::SdkError,
9    },
10    SDK,
11};
12use casper_client::cli::deploy::make_transfer as client_make_transfer;
13use rand::RngExt;
14#[cfg(all(feature = "js", target_arch = "wasm32"))]
15use wasm_bindgen::prelude::*;
16
17/// Exposes the `make_transfer` function to JavaScript with an alias.
18#[cfg(all(feature = "js", target_arch = "wasm32"))]
19#[cfg_attr(feature = "js", wasm_bindgen)]
20impl SDK {
21    /// JS function for `make_transfer`.
22    ///
23    /// # Arguments
24    ///
25    /// * `amount` - The transfer amount.
26    /// * `target_account` - The target account.
27    /// * `transfer_id` - Optional transfer identifier.
28    /// * `deploy_params` - The deploy parameters.
29    /// * `payment_params` - The payment parameters.
30    ///
31    /// # Returns
32    ///
33    /// A `Result` containing the created `Deploy` or a `JsError` in case of an error.
34    #[cfg_attr(feature = "js", wasm_bindgen(js_name = "make_transfer"))]
35    #[deprecated(note = "prefer 'make_transfer_transaction'")]
36    #[allow(deprecated)]
37    #[cfg(feature = "js")]
38    pub fn make_transfer_js_alias(
39        &self,
40        amount: &str,
41        target_account: &str,
42        transfer_id: Option<String>,
43        deploy_params: DeployStrParams,
44        payment_params: PaymentStrParams,
45    ) -> Result<Deploy, JsError> {
46        // log("make_transfer");
47        let result = self.make_transfer(
48            amount,
49            target_account,
50            transfer_id,
51            deploy_params,
52            payment_params,
53        );
54        match result {
55            Ok(data) => Ok(data),
56            Err(err) => {
57                let err = &format!("Error occurred with {err:?}");
58                Err(JsError::new(err))
59            }
60        }
61    }
62}
63
64impl SDK {
65    /// Creates a transfer deploy with the provided parameters.
66    ///
67    /// # Arguments
68    ///
69    /// * `amount` - The transfer amount.
70    /// * `target_account` - The target account.
71    /// * `transfer_id` - Optional transfer identifier.
72    /// * `deploy_params` - The deploy parameters.
73    /// * `payment_params` - The payment parameters.
74    ///
75    /// # Returns
76    ///
77    /// A `Result` containing the created `Deploy` or a `SdkError` in case of an error.
78    #[deprecated(note = "prefer 'make_transfer_transaction'")]
79    #[allow(deprecated)]
80    pub fn make_transfer(
81        &self,
82        amount: &str,
83        target_account: &str,
84        transfer_id: Option<String>,
85        deploy_params: DeployStrParams,
86        payment_params: PaymentStrParams,
87    ) -> Result<Deploy, Box<SdkError>> {
88        // log("make_transfer");
89        make_transfer(
90            amount,
91            target_account,
92            transfer_id,
93            deploy_params,
94            payment_params,
95        )
96    }
97}
98
99/// Internal function to create a transfer deploy.
100#[deprecated(note = "prefer 'make_transfer_transaction'")]
101#[allow(deprecated)]
102pub(crate) fn make_transfer(
103    amount: &str,
104    target_account: &str,
105    transfer_id: Option<String>,
106    deploy_params: DeployStrParams,
107    payment_params: PaymentStrParams,
108) -> Result<Deploy, Box<SdkError>> {
109    let transfer_id = if let Some(transfer_id) = transfer_id {
110        transfer_id
111    } else {
112        rand::rng().random::<u64>().to_string()
113    };
114    client_make_transfer(
115        "",
116        amount,
117        target_account,
118        &transfer_id,
119        deploy_str_params_to_casper_client(&deploy_params),
120        payment_str_params_to_casper_client(&payment_params),
121        false,
122    )
123    .map(Into::into)
124    .map_err(|e| Box::new(SdkError::from(e)))
125}
126
127#[cfg(test)]
128#[allow(deprecated)]
129mod tests {
130    use super::*;
131    use crate::helpers::public_key_from_secret_key;
132    use sdk_tests::{
133        config::{PAYMENT_TRANSFER_AMOUNT, TRANSFER_AMOUNT},
134        tests::helpers::{get_network_constants, get_user_secret_key},
135    };
136
137    #[tokio::test]
138    async fn test_make_transfer_with_valid_transfer_params() {
139        // Arrange
140        let sdk = SDK::new(None, None, None);
141        let (_, _, _, _, chain_name) = get_network_constants();
142        let secret_key = get_user_secret_key(None).unwrap();
143        let account = public_key_from_secret_key(&secret_key).unwrap();
144
145        let deploy_params =
146            DeployStrParams::new(&chain_name, &account, Some(secret_key), None, None, None);
147        let payment_params = PaymentStrParams::default();
148        payment_params.set_payment_amount(PAYMENT_TRANSFER_AMOUNT);
149
150        // Act
151        let result = sdk.make_transfer(
152            TRANSFER_AMOUNT,
153            &account,
154            None,
155            deploy_params,
156            payment_params,
157        );
158
159        // Assert
160        assert!(result.is_ok());
161    }
162
163    #[tokio::test]
164    async fn test_make_transfer_with_valid_transfer_params_without_secret_key() {
165        // Arrange
166        let sdk = SDK::new(None, None, None);
167        let (_, _, _, _, chain_name) = get_network_constants();
168        let secret_key = get_user_secret_key(None).unwrap();
169        let account = public_key_from_secret_key(&secret_key).unwrap();
170
171        let deploy_params = DeployStrParams::new(&chain_name, &account, None, None, None, None);
172        let payment_params = PaymentStrParams::default();
173        payment_params.set_payment_amount(PAYMENT_TRANSFER_AMOUNT);
174
175        // Act
176        let result = sdk.make_transfer(
177            TRANSFER_AMOUNT,
178            &account,
179            None,
180            deploy_params,
181            payment_params,
182        );
183
184        // Assert
185        assert!(result.is_ok());
186    }
187
188    #[tokio::test]
189    async fn test_make_transfer_with_invalid_transfer_params() {
190        // Arrange
191        let sdk = SDK::new(None, None, None);
192        let (_, _, _, _, chain_name) = get_network_constants();
193        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\"]";
194        let secret_key = get_user_secret_key(None).unwrap();
195        let account = public_key_from_secret_key(&secret_key).unwrap();
196
197        let deploy_params =
198            DeployStrParams::new(&chain_name, &account, Some(secret_key), None, None, None);
199        let payment_params = PaymentStrParams::default();
200        payment_params.set_payment_amount(""); // This is not valid payment amount
201
202        // Act
203        let result = sdk.make_transfer(
204            TRANSFER_AMOUNT,
205            &account,
206            None,
207            deploy_params,
208            payment_params,
209        );
210        // Assert
211
212        assert!(result.is_err());
213
214        let err_string = result.err().unwrap().to_string();
215        assert!(err_string.contains(error_message));
216    }
217}