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, Box<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, Box<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
81        .map(Into::into)
82        .map_err(|e| Box::new(SdkError::from(e)))
83}
84
85#[cfg(test)]
86mod tests {
87
88    use super::*;
89    use crate::{helpers::public_key_from_secret_key, types::addr::entity_addr::EntityAddr};
90    use sdk_tests::{
91        config::{ENTRYPOINT_MINT, PAYMENT_AMOUNT},
92        tests::helpers::{get_network_constants, get_user_secret_key},
93    };
94
95    #[tokio::test]
96    async fn test_make_transaction_with_valid_params() {
97        // Arrange
98        let sdk = SDK::new(None, None, None);
99        let (_, _, _, _, chain_name) = get_network_constants();
100        let secret_key = get_user_secret_key(None).unwrap();
101
102        let transaction_params = TransactionStrParams::default();
103        transaction_params.set_secret_key(&secret_key);
104        transaction_params.set_chain_name(&chain_name);
105        transaction_params.set_payment_amount(PAYMENT_AMOUNT);
106
107        let entity_addr = EntityAddr::from_formatted_str(
108            "entity-contract-cfa781f5eb69c3eee952c2944ce9670a049f88c5e46b83fb5881ebe13fb98e6d",
109        )
110        .unwrap();
111
112        let builder_params =
113            TransactionBuilderParams::new_invocable_entity(entity_addr.into(), ENTRYPOINT_MINT);
114
115        // Act
116        let result = sdk.make_transaction(builder_params, transaction_params);
117
118        // Assert
119        assert!(result.is_ok());
120    }
121
122    #[tokio::test]
123    async fn test_make_transaction_with_valid_params_without_secret_key() {
124        // Arrange
125        let sdk = SDK::new(None, None, None);
126        let (_, _, _, _, chain_name) = get_network_constants();
127        let secret_key = get_user_secret_key(None).unwrap();
128        let initiator_addr = public_key_from_secret_key(&secret_key).unwrap();
129
130        let transaction_params = TransactionStrParams::default();
131        transaction_params.set_chain_name(&chain_name);
132        transaction_params.set_initiator_addr(&initiator_addr);
133        transaction_params.set_payment_amount(PAYMENT_AMOUNT);
134
135        let entity_addr = EntityAddr::from_formatted_str(
136            "entity-contract-cfa781f5eb69c3eee952c2944ce9670a049f88c5e46b83fb5881ebe13fb98e6d",
137        )
138        .unwrap();
139
140        let builder_params =
141            TransactionBuilderParams::new_invocable_entity(entity_addr.into(), ENTRYPOINT_MINT);
142
143        // Act
144        let result = sdk.make_transaction(builder_params, transaction_params);
145        // Assert
146        assert!(result.is_ok());
147    }
148}