neo_solidity/neo/
encoding.rs1fn 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}