df_hyperliquid_core/client/evm/
rlp.rs1use crate::client::evm::u256::U256;
6
7#[must_use]
10pub fn bytes(payload: &[u8]) -> Vec<u8> {
11 if let [only] = payload
12 && *only < 0x80
13 {
14 return vec![*only];
15 }
16 let mut out = prefix(payload.len(), 0x80);
17 out.extend_from_slice(payload);
18 out
19}
20
21#[must_use]
23pub fn uint(value: u128) -> Vec<u8> {
24 bytes(trimmed(&value.to_be_bytes()))
25}
26
27#[must_use]
29pub fn u256(value: U256) -> Vec<u8> {
30 bytes(&value.to_be_trimmed())
31}
32
33#[must_use]
35pub fn word(value: &[u8; 32]) -> Vec<u8> {
36 bytes(trimmed(value))
37}
38
39#[must_use]
41pub fn list(items: &[Vec<u8>]) -> Vec<u8> {
42 let length = items.iter().map(Vec::len).sum();
43 let mut out = prefix(length, 0xc0);
44 for item in items {
45 out.extend_from_slice(item);
46 }
47 out
48}
49
50fn trimmed(big_endian: &[u8]) -> &[u8] {
51 let first = big_endian.iter().position(|byte| *byte != 0).unwrap_or(big_endian.len());
52 &big_endian[first..]
53}
54
55fn prefix(length: usize, base: u8) -> Vec<u8> {
58 if let Ok(short) = u8::try_from(length)
59 && short < 56
60 {
61 return vec![base + short];
62 }
63 let written = trimmed(&(length as u64).to_be_bytes()).to_vec();
64 let mut out = vec![base + 55 + written.len() as u8];
66 out.extend_from_slice(&written);
67 out
68}
69
70#[cfg(test)]
71#[path = "tests/rlp.rs"]
72mod tests;