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