Skip to main content

avalanche_rs/avm/parser/
initial_state_parser.rs

1use 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    // Type Id
23    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    // Outputs Array Size
32    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    // Outputs
41    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}