numbat_wasm_debug/
async_data.rs1use 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}