numbat_wasm_debug/
tx_output.rs

1use crate::{async_data::*, TxLog, TxManagedTypes};
2use alloc::vec::Vec;
3use numbat_wasm::types::{Address, BoxedBytes};
4use num_bigint::BigUint;
5use std::{collections::HashMap, fmt};
6
7pub struct TxPanic {
8    pub status: u64,
9    pub message: Vec<u8>,
10}
11
12#[derive(Clone, Debug)]
13pub struct TxResult {
14    pub result_status: u64,
15    pub result_message: Vec<u8>,
16    pub result_values: Vec<Vec<u8>>,
17    pub result_logs: Vec<TxLog>,
18}
19
20impl fmt::Display for TxResult {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22        let results_hex: Vec<String> = self
23            .result_values
24            .iter()
25            .map(|r| format!("0x{}", hex::encode(r)))
26            .collect();
27        write!(
28            f,
29            "TxResult {{\n\tresult_status: {},\n\tresult_values:{:?}\n}}",
30            self.result_status, results_hex
31        )
32    }
33}
34
35impl TxResult {
36    pub fn empty() -> TxResult {
37        TxResult {
38            result_status: 0,
39            result_message: Vec::new(),
40            result_values: Vec::new(),
41            result_logs: Vec::new(),
42        }
43    }
44    pub fn print(&self) {
45        println!("{}", self);
46    }
47}
48
49#[derive(Debug)]
50pub struct SendBalance {
51    pub recipient: Address,
52    pub token_identifier: BoxedBytes,
53    pub amount: BigUint,
54}
55
56#[derive(Debug)]
57pub struct TxOutput {
58    pub contract_storage: HashMap<Vec<u8>, Vec<u8>>,
59    pub managed_types: TxManagedTypes, // TODO: move to root TxContext and reorg everything
60    pub result: TxResult,
61    pub send_balance_list: Vec<SendBalance>,
62    pub async_call: Option<AsyncCallTxData>,
63}
64
65impl Default for TxOutput {
66    fn default() -> Self {
67        TxOutput {
68            contract_storage: HashMap::new(),
69            managed_types: TxManagedTypes::new(),
70            result: TxResult::empty(),
71            send_balance_list: Vec::new(),
72            async_call: None,
73        }
74    }
75}
76
77impl TxOutput {
78    pub fn from_panic_obj(panic_obj: &TxPanic) -> Self {
79        TxOutput {
80            contract_storage: HashMap::new(),
81            managed_types: TxManagedTypes::new(),
82            result: TxResult {
83                result_status: panic_obj.status,
84                result_message: panic_obj.message.clone(),
85                result_values: Vec::new(),
86                result_logs: Vec::new(),
87            },
88            send_balance_list: Vec::new(),
89            async_call: None,
90        }
91    }
92
93    pub fn from_panic_string(_: &str) -> Self {
94        TxOutput {
95            contract_storage: HashMap::new(),
96            managed_types: TxManagedTypes::new(),
97            result: TxResult {
98                result_status: 4,
99                result_message: b"panic occurred".to_vec(),
100                result_values: Vec::new(),
101                result_logs: Vec::new(),
102            },
103            send_balance_list: Vec::new(),
104            async_call: None,
105        }
106    }
107}