vialabs-stellar-common 0.1.3

Common interfaces, types, and utilities for Stellar contracts in the VIA cross-chain messaging system
Documentation
use soroban_sdk::{contracttype, xdr::ToXdr, Address, Bytes, Env};

#[contracttype]
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].copy_from_slice(&tx_id.to_be_bytes());
  encoded.extend_from_slice(&tx_id_bytes);

  let mut source_chain_id_bytes = [0u8; 8];
  source_chain_id_bytes.copy_from_slice(&source_chain_id.to_be_bytes());
  encoded.extend_from_slice(&source_chain_id_bytes);

  let mut destination_chain_id_bytes = [0u8; 8];
  destination_chain_id_bytes.copy_from_slice(&destination_chain_id.to_be_bytes());
  encoded.extend_from_slice(&destination_chain_id_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 = recipient.to_xdr(env);
  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
}