#[inline]
pub const fn to_eip155_v(v: u8, chain_id: u64) -> u64 {
(v as u64) + 35 + chain_id * 2
}
#[cfg(feature = "k256")]
#[inline]
pub(crate) const fn normalize_v(v: u64) -> k256::ecdsa::RecoveryId {
let byte = normalize_v_to_byte(v);
assert!(byte <= k256::ecdsa::RecoveryId::MAX);
match k256::ecdsa::RecoveryId::from_byte(byte) {
Some(recid) => recid,
None => unsafe { core::hint::unreachable_unchecked() },
}
}
#[inline]
pub const fn normalize_v_to_byte(v: u64) -> u8 {
match v {
0..=26 => (v & 3) as u8,
27..=34 => ((v - 27) & 3) as u8,
35.. => ((v - 1) & 1) as u8,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_normalize_v_to_byte() {
assert_eq!(normalize_v_to_byte(0), 0);
assert_eq!(normalize_v_to_byte(1), 1);
assert_eq!(normalize_v_to_byte(2), 2);
assert_eq!(normalize_v_to_byte(3), 3);
assert_eq!(normalize_v_to_byte(4), 0);
assert_eq!(normalize_v_to_byte(27), 0);
assert_eq!(normalize_v_to_byte(28), 1);
assert_eq!(normalize_v_to_byte(35), 0);
assert_eq!(normalize_v_to_byte(36), 1);
}
}