numbat_wasm_debug/
async_data.rs

1use crate::{TxInput, TxResult};
2use numbat_wasm::{
3    numbat_codec::*,
4    hex_call_data::HexCallDataDeserializer,
5    types::{Address, H256},
6};
7
8use num_bigint::BigUint;
9
10use alloc::vec::Vec;
11
12const DCDT_TRANSFER_STRING: &[u8] = b"DCDTTransfer";
13
14#[derive(Debug)]
15pub struct AsyncCallTxData {
16    pub to: Address,
17    pub call_data: Vec<u8>,
18    pub call_value: BigUint,
19    pub tx_hash: H256,
20}
21
22pub fn async_call_tx_input(async_data: &AsyncCallTxData, contract_addr: &Address) -> TxInput {
23    let mut de = HexCallDataDeserializer::new(async_data.call_data.as_slice());
24    let func_name = de.get_func_name().to_vec();
25    let mut args: Vec<Vec<u8>> = Vec::new();
26    let mut dcdt_token_identifier = Vec::<u8>::new();
27    let mut dcdt_value = 0u32.into();
28
29    if func_name == DCDT_TRANSFER_STRING {
30        dcdt_token_identifier = de.next_argument().unwrap().unwrap();
31        dcdt_value = BigUint::from_bytes_be(&de.next_argument().unwrap().unwrap());
32    }
33
34    while let Some(deserialized_arg) = de.next_argument().unwrap() {
35        args.push(deserialized_arg);
36    }
37    TxInput {
38        from: contract_addr.clone(),
39        to: async_data.to.clone(),
40        call_value: async_data.call_value.clone(),
41        dcdt_value,
42        dcdt_token_identifier,
43        func_name,
44        args,
45        gas_limit: 1000,
46        gas_price: 0,
47        tx_hash: async_data.tx_hash.clone(),
48    }
49}
50
51pub fn async_callback_tx_input(
52    async_data: &AsyncCallTxData,
53    contract_addr: &Address,
54    async_result: &TxResult,
55) -> TxInput {
56    let mut args: Vec<Vec<u8>> = Vec::new();
57    let serialized_bytes = top_encode_to_vec(&async_result.result_status).unwrap();
58    args.push(serialized_bytes);
59    if async_result.result_status == 0 {
60        args.extend_from_slice(async_result.result_values.as_slice());
61    } else {
62        args.push(async_result.result_message.clone());
63    }
64    TxInput {
65        from: async_data.to.clone(),
66        to: contract_addr.clone(),
67        call_value: 0u32.into(),
68        dcdt_value: 0u32.into(),
69        dcdt_token_identifier: Vec::new(),
70        func_name: b"callBack".to_vec(),
71        args,
72        gas_limit: 1000,
73        gas_price: 0,
74        tx_hash: async_data.tx_hash.clone(),
75    }
76}
77
78pub fn merge_results(mut original: TxResult, mut new: TxResult) -> TxResult {
79    if original.result_status == 0 {
80        original.result_values.append(&mut new.result_values);
81        original.result_logs.append(&mut new.result_logs);
82        original.result_message = new.result_message;
83        original
84    } else {
85        new
86    }
87}