vialabs_stellar_common/encoding/
via.rs1use crate::utils::address_to_raw_bytes;
2use 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}