novax-executor 0.2.12

Part of the NovaX framework, this crate facilitates the execution of transactions and queries against smart contracts on the blockchain.
use novax_request::gateway::client::GatewayClient;
use crate::error::transaction::TransactionError;
use crate::ExecutorError;
use crate::network::transaction::models::send_request::TransactionSendRequest;
use crate::network::transaction::models::send_response::TransactionSendResponse;
use crate::network::transaction::models::transaction_on_network::{TransactionOnNetworkResponse, TransactionOnNetwork};

pub async fn send_transaction<Client: GatewayClient>(client: &Client, transaction_request: &TransactionSendRequest) -> Result<String, ExecutorError> {
    let Ok((_, Some(text))) = client
        .with_appended_url("/transaction/send")
        .post(transaction_request)
        .await else {
        return Err(TransactionError::ErrorWhileSendingTheTransaction.into())
    };

    let sent_transaction_response: TransactionSendResponse = serde_json::from_str(&text)
        .map_err(|_| TransactionError::CannotDeserializeTransactionSendingResponse { response: text })?;

    let Some(sent_transaction_data) = sent_transaction_response.data else {
        return Err(TransactionError::FailedToSendTheTransaction { message: sent_transaction_response.error }.into())
    };

    Ok(sent_transaction_data.tx_hash)
}

pub async fn get_transaction_on_network<Client: GatewayClient>(client: &Client, tx_hash: &str) -> Result<TransactionOnNetwork, ExecutorError> {
    let url_to_append = format!("/transaction/{tx_hash}?withResults=true");
    let Ok((_, Some(text))) = client
        .with_appended_url(&url_to_append)
        .get()
        .await else {
        return Err(TransactionError::ErrorWhileGettingTransactionOnNetwork { tx_hash: tx_hash.to_string() }.into())
    };

    let transaction_on_network_response: TransactionOnNetworkResponse = serde_json::from_str(&text)
        .map_err(|_| {
            TransactionError::CannotDeserializeTransactionOnNetworkResponse { response: text }
        })?;

    let Some(transaction_on_network_data) = transaction_on_network_response.data else {
        return Err(TransactionError::FailedToSendTheTransaction { message: transaction_on_network_response.error }.into())
    };

    Ok(transaction_on_network_data)
}