alloy_primitives/signature/
utils.rs1use crate::ChainId;
2
3#[inline]
5pub const fn to_eip155_v(v: u8, chain_id: ChainId) -> ChainId {
6 (v as u64) + 35 + chain_id * 2
7}
8
9#[inline]
13pub const fn normalize_v(v: u64) -> Option<bool> {
14 if !is_valid_v(v) {
15 return None;
16 }
17
18 let cmp = (v <= 1) as u64;
30 Some(v % 2 == cmp)
31}
32
33#[inline]
35const fn is_valid_v(v: u64) -> bool {
36 matches!(
37 v,
38 0 | 1
40 | 27 | 28
42 | 35..
44 )
45}
46
47#[cfg(test)]
48mod test {
49 use super::*;
50
51 #[test]
52 fn normalizes_v() {
53 assert_eq!(normalize_v(0), Some(false));
54 assert_eq!(normalize_v(1), Some(true));
55
56 for invalid_v in 2..27 {
57 assert_eq!(normalize_v(invalid_v), None);
58 }
59
60 assert_eq!(normalize_v(27), Some(false));
61 assert_eq!(normalize_v(28), Some(true));
62
63 for invalid_v in 29..35 {
64 assert_eq!(normalize_v(invalid_v), None);
65 }
66
67 assert_eq!(normalize_v(35), Some(false));
68 assert_eq!(normalize_v(36), Some(true));
69 for v in 35..100 {
70 assert_eq!(normalize_v(v), Some((v - 35) % 2 != 0));
71 }
72 }
73}