numbat_wasm_debug/api/
log_api_mock.rs

1use numbat_wasm::{
2    api::{Handle, LogApi},
3    types::{
4        managed_vec_of_buffers_to_arg_buffer, ArgBuffer, ManagedBuffer, ManagedType, ManagedVec,
5    },
6};
7
8use crate::{TxContext, TxLog};
9
10/// Interface to only be used by code generated by the macros.
11/// The smart contract code doesn't have access to these methods directly.
12impl LogApi for TxContext {
13    fn write_event_log(&self, topics_buffer: &ArgBuffer, data: &[u8]) {
14        let arg_data_buffer = topics_buffer.arg_data();
15        let arg_data_lengths = topics_buffer.arg_lengths();
16
17        let mut current_index = 0;
18        let mut topics = Vec::new();
19
20        // we already processed the first data arg, so we skip it
21        for arg_len in arg_data_lengths.iter() {
22            let topic = arg_data_buffer[current_index..(current_index + arg_len)].to_vec();
23            topics.push(topic);
24
25            current_index += arg_len;
26        }
27
28        let mut tx_output_cell = self.tx_output_cell.borrow_mut();
29        tx_output_cell.result.result_logs.push(TxLog {
30            address: self.tx_input_box.to.clone(),
31            endpoint: self.tx_input_box.func_name.clone(),
32            topics,
33            data: data.to_vec(),
34        });
35    }
36
37    fn write_legacy_log(&self, topics: &[[u8; 32]], data: &[u8]) {
38        let topics_vec = topics.iter().map(|array| array.to_vec()).collect();
39
40        let mut tx_output_cell = self.tx_output_cell.borrow_mut();
41        tx_output_cell.result.result_logs.push(TxLog {
42            address: self.tx_input_box.to.clone(),
43            endpoint: self.tx_input_box.func_name.clone(),
44            topics: topics_vec,
45            data: data.to_vec(),
46        });
47    }
48
49    fn managed_write_log(&self, topics_handle: Handle, data_handle: Handle) {
50        let topics = ManagedVec::from_raw_handle(self.clone(), topics_handle);
51        let topics_arg_buffer = managed_vec_of_buffers_to_arg_buffer(&topics);
52        let data = ManagedBuffer::from_raw_handle(self.clone(), data_handle);
53        self.write_event_log(&topics_arg_buffer, data.to_boxed_bytes().as_slice());
54    }
55}