Skip to main content

vialabs_stellar_common/encoding/
via.rs

1use crate::utils::address_to_raw_bytes;
2/// # Encoding VIA Chain Data
3///
4/// This module provides functions for encoding and decoding VIA chain data.
5use soroban_sdk::{contracttype, Address, Bytes, Env};
6
7#[contracttype]
8#[derive(Clone, Debug, PartialEq)]
9pub struct ViaMessage {
10  pub tx_id: u128,
11  pub source_chain_id: u64,
12  pub destination_chain_id: u64,
13  pub sender: Bytes,
14  pub recipient: Address,
15  pub on_chain_data: Bytes,
16  pub off_chain_data: Bytes,
17}
18
19pub fn encode_via_message(env: &Env, data: ViaMessage) -> Bytes {
20  let ViaMessage {
21    tx_id,
22    source_chain_id,
23    destination_chain_id,
24    sender,
25    recipient,
26    on_chain_data,
27    off_chain_data,
28  } = data;
29
30  let mut encoded = Bytes::new(env);
31
32  let mut tx_id_bytes = [0u8; 32];
33  tx_id_bytes[16..32].copy_from_slice(&tx_id.to_be_bytes());
34  encoded.extend_from_slice(&tx_id_bytes);
35
36  encoded.extend_from_slice(&source_chain_id.to_be_bytes());
37  encoded.extend_from_slice(&destination_chain_id.to_be_bytes());
38
39  let sender_buffer = sender.to_buffer::<65536>();
40  let sender_bytes_slice = sender_buffer.as_slice();
41  encoded.extend_from_slice(sender_bytes_slice);
42
43  let recipient_bytes = address_to_raw_bytes(env, recipient);
44  let recipient_bytes_slice = recipient_bytes.to_buffer::<65536>();
45  let recipient_bytes_slice_bytes = recipient_bytes_slice.as_slice();
46  encoded.extend_from_slice(recipient_bytes_slice_bytes);
47
48  let on_chain_data_bytes = on_chain_data.to_buffer::<65536>();
49  let on_chain_data_bytes_slice = on_chain_data_bytes.as_slice();
50  encoded.extend_from_slice(on_chain_data_bytes_slice);
51
52  let off_chain_data_bytes = off_chain_data.to_buffer::<65536>();
53  let off_chain_data_bytes_slice = off_chain_data_bytes.as_slice();
54  encoded.extend_from_slice(off_chain_data_bytes_slice);
55
56  encoded
57}