use crate::utils::address_to_raw_bytes;
use soroban_sdk::{contracttype, Address, Bytes, Env};
#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub struct ViaMessage {
pub tx_id: u128,
pub source_chain_id: u64,
pub destination_chain_id: u64,
pub sender: Bytes,
pub recipient: Address,
pub on_chain_data: Bytes,
pub off_chain_data: Bytes,
}
pub fn encode_via_message(env: &Env, data: ViaMessage) -> Bytes {
let ViaMessage {
tx_id,
source_chain_id,
destination_chain_id,
sender,
recipient,
on_chain_data,
off_chain_data,
} = data;
let mut encoded = Bytes::new(env);
let mut tx_id_bytes = [0u8; 32];
tx_id_bytes[16..32].copy_from_slice(&tx_id.to_be_bytes());
encoded.extend_from_slice(&tx_id_bytes);
encoded.extend_from_slice(&source_chain_id.to_be_bytes());
encoded.extend_from_slice(&destination_chain_id.to_be_bytes());
let sender_buffer = sender.to_buffer::<65536>();
let sender_bytes_slice = sender_buffer.as_slice();
encoded.extend_from_slice(sender_bytes_slice);
let recipient_bytes = address_to_raw_bytes(env, recipient);
let recipient_bytes_slice = recipient_bytes.to_buffer::<65536>();
let recipient_bytes_slice_bytes = recipient_bytes_slice.as_slice();
encoded.extend_from_slice(recipient_bytes_slice_bytes);
let on_chain_data_bytes = on_chain_data.to_buffer::<65536>();
let on_chain_data_bytes_slice = on_chain_data_bytes.as_slice();
encoded.extend_from_slice(on_chain_data_bytes_slice);
let off_chain_data_bytes = off_chain_data.to_buffer::<65536>();
let off_chain_data_bytes_slice = off_chain_data_bytes.as_slice();
encoded.extend_from_slice(off_chain_data_bytes_slice);
encoded
}