use crate::ChainId;
#[inline]
pub const fn to_eip155_v(v: u8, chain_id: ChainId) -> ChainId {
(v as u64) + 35 + chain_id * 2
}
#[inline]
pub const fn normalize_v(v: u64) -> Option<bool> {
if !is_valid_v(v) {
return None;
}
let cmp = (v <= 1) as u64;
Some(v % 2 == cmp)
}
#[inline]
const fn is_valid_v(v: u64) -> bool {
matches!(
v,
0 | 1
| 27 | 28
| 35..
)
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn normalizes_v() {
assert_eq!(normalize_v(0), Some(false));
assert_eq!(normalize_v(1), Some(true));
for invalid_v in 2..27 {
assert_eq!(normalize_v(invalid_v), None);
}
assert_eq!(normalize_v(27), Some(false));
assert_eq!(normalize_v(28), Some(true));
for invalid_v in 29..35 {
assert_eq!(normalize_v(invalid_v), None);
}
assert_eq!(normalize_v(35), Some(false));
assert_eq!(normalize_v(36), Some(true));
for v in 35..100 {
assert_eq!(normalize_v(v), Some((v - 35) % 2 != 0));
}
}
}