Skip to main content

avalanche_rs/avm/parser/
export_tx_parser.rs

1use std::borrow::Borrow;
2use std::error::Error;
3
4use rust_base58::ToBase58;
5use tracing::{instrument, trace};
6
7use crate::avm::parser::base_tx_parser::{base_tx_parser, BaseTx};
8use crate::avm::parser::transferable_output_parser::{
9    transferable_output_parser, TransferableOutput,
10};
11use crate::avm::parser::Context;
12use crate::utils::cb58::encode;
13use crate::utils::conversion::pop_u32;
14
15#[derive(Serialize, Deserialize, Debug)]
16pub struct ExportTx {
17    pub base_tx: BaseTx,
18    pub destination_chain: String,
19    pub transferable_outputs: Vec<TransferableOutput>,
20}
21
22#[instrument(skip(_raw_msg), fields(tx_id = % _context.tx_id))]
23pub fn export_tx_parser(
24    _raw_msg: &[u8],
25    _context: &mut Context,
26) -> Result<ExportTx, Box<dyn Error>> {
27    let base = base_tx_parser(_raw_msg, _context)?;
28
29    // Destination chain
30    let destination_chain = encode(&_raw_msg[*_context.offset..=(*_context.offset + 31)].to_vec());
31    trace!(
32        "Export Parser -- {} \n Destination chain : {:?} \n +++++++",
33        _context.tx_id,
34        destination_chain
35    );
36    *_context.offset += 32;
37
38    // Inputs Array Size
39    let number_of_outputs = pop_u32(_raw_msg[*_context.offset..=(*_context.offset + 3)].borrow());
40    trace!(
41        "ExportTx Parser -- {} \n Output' array size : {:?} \n +++++++",
42        _context.tx_id,
43        number_of_outputs
44    );
45    *_context.offset += 4;
46
47    // Inputs
48    let mut outputs = Vec::new();
49    let mut index = 0;
50
51    while index < number_of_outputs {
52        trace!(
53            "ExportTx Parser -- {} \n Output number {} -- bytes {:?} \n +++++++",
54            _context.tx_id,
55            index,
56            &_raw_msg[*_context.offset..=(*_context.offset + 31)]
57        );
58        outputs.push(transferable_output_parser(&Vec::from(_raw_msg), _context)?);
59        index += 1;
60    }
61
62    Ok(ExportTx {
63        base_tx: base,
64        transferable_outputs: outputs,
65        destination_chain: destination_chain.to_base58(),
66    })
67}