casper_rust_wasm_sdk/sdk/transaction_utils/
make_transaction.rs

1use crate::{
2    types::{
3        sdk_error::SdkError,
4        transaction::Transaction,
5        transaction_params::{
6            transaction_builder_params::{
7                transaction_builder_params_to_casper_client, TransactionBuilderParams,
8            },
9            transaction_str_params::{
10                transaction_str_params_to_casper_client, TransactionStrParams,
11            },
12        },
13    },
14    SDK,
15};
16use casper_client::cli::make_transaction as client_make_transaction;
17#[cfg(target_arch = "wasm32")]
18use wasm_bindgen::prelude::*;
19
20/// Exposes the `make_transaction` function to JavaScript with an alias.
21#[cfg(target_arch = "wasm32")]
22#[wasm_bindgen]
23impl SDK {
24    /// JS function for `make_transaction`.
25    ///
26    /// # Arguments
27    ///
28    /// * `builder_params` - Transaction Builder parameters.
29    /// * `transaction_params` - The transaction parameters.
30    ///
31    /// # Returns
32    ///
33    /// A `Result` containing the created `Transaction` or a `JsError` in case of an error.
34    #[wasm_bindgen(js_name = "make_transaction")]
35    pub fn make_transaction_js_alias(
36        &self,
37        builder_params: TransactionBuilderParams,
38        transaction_params: TransactionStrParams,
39    ) -> Result<Transaction, JsError> {
40        let result = make_transaction(builder_params, transaction_params);
41        match result {
42            Ok(data) => Ok(data),
43            Err(err) => {
44                let err = &format!("Error occurred with {:?}", err);
45                Err(JsError::new(err))
46            }
47        }
48    }
49}
50
51impl SDK {
52    /// Creates a transaction using the provided parameters.
53    ///
54    /// # Arguments
55    ///
56    /// * `builder_params` - Transaction Builder parameters.
57    /// * `transaction_params` - The transaction parameters.
58    ///
59    /// # Returns
60    ///
61    /// A `Result` containing the created `Transaction` or a `SdkError` in case of an error.
62    pub fn make_transaction(
63        &self,
64        builder_params: TransactionBuilderParams,
65        transaction_params: TransactionStrParams,
66    ) -> Result<Transaction, SdkError> {
67        make_transaction(builder_params, transaction_params)
68    }
69}
70
71/// Internal function to create a transaction.
72pub(crate) fn make_transaction(
73    builder_params: TransactionBuilderParams,
74    transaction_params: TransactionStrParams,
75) -> Result<Transaction, SdkError> {
76    let transaction_builder_params = transaction_builder_params_to_casper_client(&builder_params);
77    let transaction_str_params = transaction_str_params_to_casper_client(&transaction_params);
78    let transaction =
79        client_make_transaction(transaction_builder_params, transaction_str_params, false);
80    transaction.map(Into::into).map_err(SdkError::from)
81}
82
83#[cfg(test)]
84mod tests {
85
86    use super::*;
87    use crate::{helpers::public_key_from_secret_key, types::addr::entity_addr::EntityAddr};
88    use sdk_tests::{
89        config::{ENTRYPOINT_MINT, PAYMENT_AMOUNT},
90        tests::helpers::{get_network_constants, get_user_secret_key},
91    };
92
93    #[tokio::test]
94    async fn test_make_transaction_with_valid_params() {
95        // Arrange
96        let sdk = SDK::new(None, None, None);
97        let (_, _, _, _, chain_name) = get_network_constants();
98        let secret_key = get_user_secret_key(None).unwrap();
99
100        let transaction_params = TransactionStrParams::default();
101        transaction_params.set_secret_key(&secret_key);
102        transaction_params.set_chain_name(&chain_name);
103        transaction_params.set_payment_amount(PAYMENT_AMOUNT);
104
105        let entity_addr = EntityAddr::from_formatted_str(
106            "entity-contract-cfa781f5eb69c3eee952c2944ce9670a049f88c5e46b83fb5881ebe13fb98e6d",
107        )
108        .unwrap();
109
110        let builder_params =
111            TransactionBuilderParams::new_invocable_entity(entity_addr.into(), ENTRYPOINT_MINT);
112
113        // Act
114        let result = sdk.make_transaction(builder_params, transaction_params);
115
116        // Assert
117        assert!(result.is_ok());
118    }
119
120    #[tokio::test]
121    async fn test_make_transaction_with_valid_params_without_secret_key() {
122        // Arrange
123        let sdk = SDK::new(None, None, None);
124        let (_, _, _, _, chain_name) = get_network_constants();
125        let secret_key = get_user_secret_key(None).unwrap();
126        let initiator_addr = public_key_from_secret_key(&secret_key).unwrap();
127
128        let transaction_params = TransactionStrParams::default();
129        transaction_params.set_chain_name(&chain_name);
130        transaction_params.set_initiator_addr(&initiator_addr);
131        transaction_params.set_payment_amount(PAYMENT_AMOUNT);
132
133        let entity_addr = EntityAddr::from_formatted_str(
134            "entity-contract-cfa781f5eb69c3eee952c2944ce9670a049f88c5e46b83fb5881ebe13fb98e6d",
135        )
136        .unwrap();
137
138        let builder_params =
139            TransactionBuilderParams::new_invocable_entity(entity_addr.into(), ENTRYPOINT_MINT);
140
141        // Act
142        let result = sdk.make_transaction(builder_params, transaction_params);
143        // Assert
144        assert!(result.is_ok());
145    }
146}