vialabs-stellar-common 0.1.10

Common interfaces, types, and utilities for Stellar contracts in the VIA cross-chain messaging system
Documentation
use crate::utils::address_to_raw_bytes;
/// # Encoding VIA Chain Data
///
/// This module provides functions for encoding and decoding VIA chain data.
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
}