Skip to main content

casper_rust_wasm_sdk/sdk/deploy/
transfer.rs

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