avalanche_rs/pvm/parser/
export_tx_parser.rs

1use crate::avm::parser::Context;
2use crate::pvm::parser::atomic_block_parser::Transaction;
3use crate::pvm::parser::base_tx_parser::base_tx_parser;
4use crate::pvm::parser::transferable_output_parser::{
5    transferable_output_parser, TransferableOutput,
6};
7use crate::utils::cb58::encode;
8use crate::utils::conversion::pop_i32;
9use rust_base58::ToBase58;
10use std::borrow::Borrow;
11use std::error::Error;
12use tracing::{instrument, trace};
13
14#[derive(Serialize, Deserialize, Debug)]
15pub struct ExportTx {
16    pub destination_chain: String,
17    pub transferable_outputs: Vec<TransferableOutput>,
18}
19
20#[instrument(fields(block_id = % _context.tx_id, tx_type = "export"))]
21pub fn export_tx_parser(
22    _raw_msg: &[u8],
23    _tx_id: String,
24    _context: &mut Context,
25) -> Result<Transaction, Box<dyn Error>> {
26    let base_tx = base_tx_parser(_raw_msg, _context)?;
27
28    let destination_chain =
29        encode(&_raw_msg[*_context.offset..=(*_context.offset + 31)]).to_base58();
30    trace!("destination_chain : {:?}", destination_chain);
31
32    *_context.offset += 32;
33
34    let transfer_out_number = pop_i32(_raw_msg[*_context.offset..=(*_context.offset + 3)].borrow());
35    trace!("transfer_out_number : {:?}", transfer_out_number);
36
37    *_context.offset += 4;
38
39    let mut outputs = Vec::new();
40    let mut index = 0;
41
42    while index < transfer_out_number {
43        trace!("Output number {}", index,);
44        outputs.push(transferable_output_parser(&_raw_msg, _context)?);
45        index += 1;
46    }
47
48    let export_tx = ExportTx {
49        destination_chain,
50        transferable_outputs: outputs,
51    };
52
53    Ok(Transaction {
54        base_tx,
55        tx_id: _tx_id,
56        add_validator_tx: None,
57        import_tx: None,
58        export_tx: Some(export_tx),
59        add_subnet_validator_tx: None,
60        add_delegator_tx: None,
61        create_blockchain_tx: None,
62        create_subnet_tx: None,
63        advance_time_tx: None,
64        reward_validator_tx: None,
65        credentials: vec![],
66    })
67}