Skip to main content

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