avalanche_rs/avm/parser/
initial_state_parser.rs1use tracing::{instrument, trace};
2
3use std::borrow::Borrow;
4
5use std::error::Error;
6
7use crate::avm::parser::output_parser::{output_parser, Output};
8use crate::avm::parser::Context;
9use crate::utils::conversion::{pop_i32, pop_u32};
10
11#[derive(Serialize, Deserialize, Debug)]
12pub struct InitialState {
13 pub fx_id: i32,
14 pub outputs: Vec<Output>,
15}
16
17#[instrument(skip(_raw_msg), fields(tx_id = % _context.tx_id))]
18pub fn initial_state_parser(
19 _raw_msg: &[u8],
20 _context: &mut Context,
21) -> Result<InitialState, Box<dyn Error>> {
22 let fx_id = pop_i32(_raw_msg[*_context.offset..=(*_context.offset + 3)].borrow());
24 trace!(
25 "{} \n Output -- fx_id : {:?} \n +++++++",
26 _context.tx_id,
27 fx_id
28 );
29 *_context.offset += 4;
30
31 let number_of_outputs = pop_u32(&_raw_msg[*_context.offset..=(*_context.offset + 3)].borrow());
33 trace!(
34 "InitialState Parser -- {} \n Number of outputs : {:?} \n +++++++",
35 _context.tx_id,
36 number_of_outputs
37 );
38 *_context.offset += 4;
39
40 let mut outputs = Vec::new();
42 let mut index = 0;
43
44 while index < number_of_outputs {
45 trace!(
46 "InitialState Parser -- {} \n Initial state - output number {} -- offset {} -- size {} \n +++++++",
47 _context.tx_id,
48 index,
49 _context.offset,
50 _raw_msg.len()
51 );
52 let output = output_parser(&Vec::from(_raw_msg), _context)?;
53
54 outputs.push(output);
55 index += 1;
56 }
57
58 Ok(InitialState { fx_id, outputs })
59}