avalanche_rs/avm/parser/
export_tx_parser.rs1use 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 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 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 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}