1use solana_program::pubkey::Pubkey;
2
3use crate::utils::split_at_checked;
4
5pub(crate) trait DeserializeRef<'a>: Sized {
8 fn deserialize_ref(slice: &mut &'a [u8]) -> Option<Self>;
13}
14
15pub struct MessageDataRef<'a> {
17 pub msg_hash: &'a [u8; 32],
19
20 pub total_fee: u128,
21 pub selector: &'a [u8; 32],
23 pub sender_addr: &'a [u8],
25 pub dest_addr: Pubkey,
27 pub payload: &'a [u8],
29 pub reserved: &'a [u8],
31 pub transmitter_params: &'a [u8],
33
34 pub src_chain_id: u128,
36 pub src_block_number: u128,
38 pub src_op_tx_id: &'a [[u8; 32]; 2],
40}
41
42impl<'a> DeserializeRef<'a> for MessageDataRef<'a> {
43 fn deserialize_ref(data: &mut &'a [u8]) -> Option<Self> {
44 let mut read_data = |count| {
45 let (left, right) = split_at_checked(data, count)?;
46 *data = right;
47 Some(left)
48 };
49
50 let msg_hash = read_data(32)?.try_into().unwrap();
51
52 let total_fee = u128::from_le_bytes(read_data(16)?.try_into().unwrap());
53 let selector = read_data(32)?.try_into().unwrap();
54
55 let sender_len = u32::from_le_bytes(read_data(4)?.try_into().unwrap()) as usize;
56 let sender_addr = read_data(sender_len)?;
57
58 let dest_addr = Pubkey::new_from_array(read_data(32)?.try_into().unwrap());
59
60 let payload_len = u32::from_le_bytes(read_data(4)?.try_into().unwrap()) as usize;
61 let payload = read_data(payload_len)?;
62
63 let reserved_len = u32::from_le_bytes(read_data(4)?.try_into().unwrap()) as usize;
64 let reserved = read_data(reserved_len)?;
65
66 let transmitter_len = u32::from_le_bytes(read_data(4)?.try_into().unwrap()) as usize;
67 let transmitter_params = read_data(transmitter_len)?;
68
69 let src_chain_id = u128::from_le_bytes(read_data(16)?.try_into().unwrap());
70
71 let src_block_number = u128::from_le_bytes(read_data(16)?.try_into().unwrap());
72 let src_op_tx_id: &[u8; 64] = read_data(64)?.try_into().unwrap();
73 let src_op_tx_id: &[[u8; 32]; 2] = bytemuck::cast_ref(src_op_tx_id);
74
75 Some(MessageDataRef {
76 payload,
77 src_chain_id,
78 sender_addr,
79 msg_hash,
80 total_fee,
81 selector,
82 dest_addr,
83 reserved,
84 transmitter_params,
85 src_block_number,
86 src_op_tx_id,
87 })
88 }
89}