casper_rust_wasm_sdk/sdk/rpcs/
put_transaction.rs

1#[cfg(target_arch = "wasm32")]
2use crate::transaction::transaction::PutTransactionResult;
3use crate::{
4    types::{transaction::Transaction, verbosity::Verbosity},
5    SDK,
6};
7use casper_client::{
8    put_transaction, rpcs::results::PutTransactionResult as _PutTransactionResult, Error,
9    JsonRpcId, SuccessResponse,
10};
11use rand::Rng;
12#[cfg(target_arch = "wasm32")]
13use wasm_bindgen::prelude::*;
14
15/// SDK methods for putting a transaction.
16#[cfg(target_arch = "wasm32")]
17#[wasm_bindgen]
18impl SDK {
19    /// Puts a transaction using the provided options.
20    ///
21    /// # Arguments
22    ///
23    /// * `transaction` - The `Transaction` object to be sent.
24    /// * `verbosity` - An optional `Verbosity` level for controlling the output verbosity.
25    /// * `rpc_address` - An optional string specifying the rpc address to use for the request.
26    ///
27    /// # Returns
28    ///
29    /// A `Result` containing either a `PutTransactionResult` or a `JsError` in case of an error.
30    ///
31    /// # Errors
32    ///
33    /// Returns a `JsError` if there is an error during the transaction process.
34    #[wasm_bindgen(js_name = "put_transaction")]
35    pub async fn put_transaction_js_alias(
36        &self,
37        transaction: Transaction,
38        verbosity: Option<Verbosity>,
39        rpc_address: Option<String>,
40    ) -> Result<PutTransactionResult, JsError> {
41        let result = self
42            .put_transaction(transaction, verbosity, rpc_address)
43            .await;
44        match result {
45            Ok(data) => Ok(data.result.into()),
46            Err(err) => {
47                let err = &format!("Error occurred with {err:?}");
48                Err(JsError::new(err))
49            }
50        }
51    }
52
53    /// JavaScript Alias for `put_transaction`.
54    #[deprecated(note = "This function is an alias. Please use `put_transaction` instead.")]
55    #[allow(deprecated)]
56    pub async fn account_put_transaction(
57        &self,
58        transaction: Transaction,
59        verbosity: Option<Verbosity>,
60        rpc_address: Option<String>,
61    ) -> Result<PutTransactionResult, JsError> {
62        self.put_transaction_js_alias(transaction, verbosity, rpc_address)
63            .await
64    }
65}
66
67impl SDK {
68    /// Puts a transaction based on the provided options.
69    ///
70    /// # Arguments
71    ///
72    /// * `transaction` - The `Transaction` object to be sent.
73    /// * `verbosity` - An optional `Verbosity` level for controlling the output verbosity.
74    /// * `rpc_address` - An optional string specifying the rpc address to use for the request.
75    ///
76    /// # Returns
77    ///
78    /// A `Result` containing either a `_PutTransactionResult` or an `Error` in case of an error.
79    ///
80    /// # Errors
81    ///
82    /// Returns an `Error` if there is an error during the transaction process.
83    pub async fn put_transaction(
84        &self,
85        transaction: Transaction,
86        verbosity: Option<Verbosity>,
87        rpc_address: Option<String>,
88    ) -> Result<SuccessResponse<_PutTransactionResult>, Error> {
89        let random_id = JsonRpcId::from(rand::thread_rng().gen::<u64>().to_string());
90        //log("account_put_transaction!");
91        put_transaction(
92            random_id,
93            &self.get_rpc_address(rpc_address),
94            self.get_verbosity(verbosity).into(),
95            transaction.into(),
96        )
97        .await
98    }
99}
100
101#[cfg(test)]
102mod tests {
103    use super::*;
104    use crate::{
105        helpers::public_key_from_secret_key,
106        types::transaction_params::transaction_str_params::TransactionStrParams,
107    };
108    use sdk_tests::{
109        config::TRANSFER_AMOUNT,
110        tests::helpers::{get_network_constants, get_user_secret_key},
111    };
112
113    fn get_transaction() -> Transaction {
114        let secret_key = get_user_secret_key(None).unwrap();
115        let initiator_addr = public_key_from_secret_key(&secret_key).unwrap();
116        let (_, _, _, _, chain_name) = get_network_constants();
117
118        let transaction_params = TransactionStrParams::default();
119        transaction_params.set_secret_key(&secret_key);
120        transaction_params.set_chain_name(&chain_name);
121        transaction_params.set_payment_amount(TRANSFER_AMOUNT);
122
123        Transaction::new_transfer(
124            None,
125            &initiator_addr, // self transfer
126            TRANSFER_AMOUNT,
127            transaction_params,
128            None,
129        )
130        .unwrap()
131    }
132
133    #[tokio::test]
134    async fn test_put_transaction_with_none_values() {
135        // Arrange
136        let sdk = SDK::new(None, None, None);
137        let error_message = "failed to parse node address as valid URL";
138        let transaction = get_transaction();
139
140        // Act
141        let result = sdk.put_transaction(transaction, None, None).await;
142
143        // Assert
144        assert!(result.is_err());
145        let err_string = result.err().unwrap().to_string();
146        assert!(err_string.contains(error_message));
147    }
148
149    #[tokio::test]
150    async fn test_put_transaction() {
151        // Arrange
152        let sdk = SDK::new(None, None, None);
153        let verbosity = Some(Verbosity::High);
154        let (rpc_address, _, _, _, _) = get_network_constants();
155        let transaction = get_transaction();
156
157        // Act
158        let result = sdk
159            .put_transaction(transaction, verbosity, Some(rpc_address))
160            .await;
161
162        // Assert
163        assert!(result.is_ok());
164    }
165
166    #[tokio::test]
167    async fn test_put_transaction_with_error() {
168        // Arrange
169        let sdk = SDK::new(Some("http://localhost".to_string()), None, None);
170        let error_message = "error sending request";
171        let transaction = get_transaction();
172
173        // Act
174        let result = sdk.put_transaction(transaction, None, None).await;
175
176        // Assert
177        assert!(result.is_err());
178        let err_string = result.err().unwrap().to_string();
179        assert!(err_string.contains(error_message));
180    }
181}