multiversx_sc_scenario/scenario/model/transaction/tx_response.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
use multiversx_chain_vm::{tx_mock::TxResult, types::H256};
use multiversx_sc::types::Address;
use super::{Log, TxExpect, TxResponseStatus};
#[derive(Debug, Default, Clone)]
/// The response of a transaction.
pub struct TxResponse {
/// The output of the transaction.
pub out: Vec<Vec<u8>>,
/// The address of the newly deployed smart contract.
pub new_deployed_address: Option<Address>,
/// The identifier of the newly issued token.
pub new_issued_token_identifier: Option<String>,
/// The status of the transaction.
pub tx_error: TxResponseStatus,
/// The logs of the transaction.
pub logs: Vec<Log>,
/// The gas used by the transaction.
pub gas_used: u64,
/// The refund of the transaction.
pub refund: u64,
/// The transaction hash, if available.
pub tx_hash: Option<H256>,
}
impl TxResponse {
/// Creates a [`TxResponse`] from a [`TxResult`].
pub fn from_tx_result(tx_result: TxResult) -> Self {
TxResponse {
out: tx_result.result_values,
tx_error: TxResponseStatus {
status: tx_result.result_status,
message: tx_result.result_message,
},
logs: tx_result
.result_logs
.iter()
.map(|tx_log| Log {
address: tx_log.address.clone(),
endpoint: tx_log.endpoint.to_string(),
topics: tx_log.topics.clone(),
data: tx_log.data.clone(),
})
.collect(),
..Default::default()
}
}
/// Creates a [`TxResponse`] from raw results.
pub fn from_raw_results(raw_results: Vec<Vec<u8>>) -> Self {
TxResponse {
out: raw_results,
..Default::default()
}
}
/// Creates a scenario "expect" field based on the real response.
///
/// Useful for creating traces that also check the results come out always the same.
pub fn to_expect(&self) -> TxExpect {
if self.tx_error.is_success() {
let mut tx_expect = TxExpect::ok();
if self.out.is_empty() {
tx_expect = tx_expect.no_result();
} else {
for raw_result in &self.out {
let result_hex_string = format!("0x{}", hex::encode(raw_result));
tx_expect = tx_expect.result(result_hex_string.as_str());
}
}
tx_expect
} else {
TxExpect::err(
self.tx_error.status,
format!("str:{}", self.tx_error.message),
)
}
}
/// Checks if the transaction was successful.
pub fn is_success(&self) -> bool {
self.tx_error.is_success()
}
}