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
use elrond_wasm::{H256, Address}; use elrond_wasm::call_data::*; use elrond_wasm::elrond_codec::*; use crate::display_util::*; use crate::ext_mock::*; use num_bigint::{BigInt, BigUint}; use num_traits::cast::ToPrimitive; use alloc::vec::Vec; #[derive(Debug)] pub struct AsyncCallTxData { pub to: Address, pub call_data: Vec<u8>, pub call_value: BigUint, pub tx_hash: H256, } pub fn async_call_tx_input(async_data: &AsyncCallTxData, contract_addr: &Address) -> TxInput { let mut de = CallDataDeserializer::new(async_data.call_data.as_slice()); let func_name = de.get_func_name().to_vec(); let mut args: Vec<Vec<u8>> = Vec::new(); while let Some(deserialized_arg) = de.next_argument().unwrap() { args.push(deserialized_arg); } TxInput{ from: contract_addr.clone(), to: async_data.to.clone(), call_value: async_data.call_value.clone(), esdt_value: 0u32.into(), esdt_token_name: None, func_name, args, gas_limit: 1000, gas_price: 0, tx_hash: async_data.tx_hash.clone(), } } pub fn async_callback_tx_input(async_data: &AsyncCallTxData, contract_addr: &Address, async_result: &TxResult) -> TxInput { let mut args: Vec<Vec<u8>> = Vec::new(); args.push(async_result.result_status.top_encode().unwrap()); if async_result.result_status == 0 { args.extend_from_slice(async_result.result_values.as_slice()); } else { args.push(async_result.result_message.clone()); } TxInput{ from: async_data.to.clone(), to: contract_addr.clone(), call_value: 0u32.into(), esdt_value: 0u32.into(), esdt_token_name: None, func_name: b"callBack".to_vec(), args, gas_limit: 1000, gas_price: 0, tx_hash: async_data.tx_hash.clone(), } } pub fn merge_results(mut original: TxResult, new: TxResult) -> TxResult { if original.result_status == 0 { original.result_values.extend_from_slice(new.result_values.as_slice()); original } else { new } }