neo_solidity/neo/
encoding.rs

1fn write_fixed_string(buffer: &mut Vec<u8>, value: &str, width: usize) {
2    let mut padded = vec![0u8; width];
3    let bytes = value.as_bytes();
4    let copy_len = bytes.len().min(width);
5    padded[..copy_len].copy_from_slice(&bytes[..copy_len]);
6    buffer.extend_from_slice(&padded);
7}
8
9fn write_varstring(buffer: &mut Vec<u8>, value: &str) {
10    write_varbytes(buffer, value.as_bytes());
11}
12
13fn write_varbytes(buffer: &mut Vec<u8>, data: &[u8]) {
14    write_varint(buffer, data.len() as u64);
15    buffer.extend_from_slice(data);
16}
17
18fn write_varint(buffer: &mut Vec<u8>, value: u64) {
19    match value {
20        0x0000_0000..=0x0000_00FC => buffer.push(value as u8),
21        0x0000_00FD..=0x0000_FFFF => {
22            buffer.push(0xFD);
23            buffer.extend_from_slice(&(value as u16).to_le_bytes());
24        }
25        0x0001_0000..=0xFFFF_FFFF => {
26            buffer.push(0xFE);
27            buffer.extend_from_slice(&(value as u32).to_le_bytes());
28        }
29        _ => {
30            buffer.push(0xFF);
31            buffer.extend_from_slice(&value.to_le_bytes());
32        }
33    }
34}
35
36fn calculate_checksum(payload: &[u8]) -> u32 {
37    let first = Sha256::digest(payload);
38    let second = Sha256::digest(first);
39    u32::from_le_bytes(second[..4].try_into().expect("checksum slice"))
40}