numbat_wasm_debug/
async_data.rs

1use crate::display_util::*;
2use crate::ext_mock::*;
3use numbat_wasm::numbat_codec::*;
4use numbat_wasm::hex_call_data::HexCallDataDeserializer;
5use numbat_wasm::{Address, H256};
6
7use num_bigint::{BigInt, BigUint};
8use num_traits::cast::ToPrimitive;
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_name = Vec::<u8>::new();
27	let mut dcdt_value = 0u32.into();
28
29	if func_name == DCDT_TRANSFER_STRING {
30		dcdt_token_name = 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_name,
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_name: 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, new: TxResult) -> TxResult {
79	if original.result_status == 0 {
80		original
81			.result_values
82			.extend_from_slice(new.result_values.as_slice());
83		original
84	} else {
85		new
86	}
87}