Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions sv2/binary-sv2/src/datatypes/non_copy_data_types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,20 @@ impl From<[u8; 32]> for U256<'_> {
}
}

impl<'a> U256<'a> {
/// Returns bytes in little-endian order (wire format for Stratum v2)
pub fn to_le_bytes(&self) -> [u8; 32] {
self.inner_as_ref().try_into().expect("U256 is 32 bytes")
}

/// Returns bytes in big-endian order
pub fn to_be_bytes(&self) -> [u8; 32] {
let mut ret = self.to_le_bytes();
ret.reverse();
ret
}
}

#[cfg(feature = "prop_test")]
impl<'a> U256<'a> {
pub fn from_gen(g: &mut Gen) -> Self {
Expand Down Expand Up @@ -367,3 +381,28 @@ impl<'a> From<&'a U32AsRef<'a>> for u32 {
u32::from_le_bytes([b[0], b[1], b[2], b[3]])
}
}

#[cfg(test)]
mod test_bytes_conversion {
use super::*;

#[test]
fn test_u256_endianness() {
// Create a 32-byte array pattern
let bytes_le: [u8; 32] = [
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
0x1D, 0x1E, 0x1F, 0x20,
];

let val: U256 = bytes_le.into();

// 1. Test Little Endian (Should match input exactly)
assert_eq!(val.to_le_bytes(), bytes_le);

// 2. Test Big Endian (Should be reversed)
let mut expected_be = bytes_le;
expected_be.reverse();
assert_eq!(val.to_be_bytes(), expected_be);
}
}
Loading