use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Fr(pub [u8; 32]);
impl Fr {
pub fn from_u64(value: u64) -> Self {
let mut bytes = [0u8; 32];
bytes[0..8].copy_from_slice(&value.to_le_bytes());
Fr(bytes)
}
pub fn from_be_bytes(bytes: [u8; 32]) -> Self {
Fr(bytes)
}
pub fn from_le_bytes(bytes: [u8; 32]) -> Self {
Fr(bytes)
}
pub fn from_buffer(buffer: &[u8]) -> Self {
let bytes: [u8; 32] = buffer.try_into().expect("Buffer must be exactly 32 bytes");
Fr(bytes)
}
pub fn from_buffer_reduce(buffer: &[u8]) -> Self {
let mut bytes = [0u8; 32];
let len = buffer.len().min(32);
bytes[..len].copy_from_slice(&buffer[..len]);
Fr(bytes)
}
pub fn to_buffer(&self) -> Vec<u8> {
self.0.to_vec()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Point {
pub x: [u8; 32],
pub y: [u8; 32],
}