@@ -3,11 +3,11 @@ use std::collections::BTreeMap;
3
3
use crate :: { BigNum , ValidatorId } ;
4
4
use std:: collections:: btree_map:: { Entry , Iter , Values } ;
5
5
6
- use serde:: { ser :: SerializeMap , Deserialize , Serialize , Serializer } ;
6
+ use serde:: { Deserialize , Serialize } ;
7
7
use std:: iter:: FromIterator ;
8
8
use std:: ops:: Index ;
9
9
10
- #[ derive( Clone , Debug , Default , Deserialize , PartialEq , Eq ) ]
10
+ #[ derive( Clone , Debug , Default , Serialize , Deserialize , PartialEq , Eq ) ]
11
11
#[ serde( transparent) ]
12
12
pub struct BalancesMap ( BTreeMap < ValidatorId , BigNum > ) ;
13
13
@@ -50,20 +50,6 @@ impl FromIterator<(ValidatorId, BigNum)> for BalancesMap {
50
50
}
51
51
}
52
52
53
- impl Serialize for BalancesMap {
54
- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
55
- where
56
- S : Serializer ,
57
- {
58
- let mut map = serializer. serialize_map ( Some ( self . 0 . len ( ) ) ) ?;
59
-
60
- for ( key, big_num) in self . 0 . iter ( ) {
61
- map. serialize_entry ( & key. to_hex_prefix_string ( ) , big_num) ?;
62
- }
63
- map. end ( )
64
- }
65
- }
66
-
67
53
#[ cfg( test) ]
68
54
mod test {
69
55
use super :: * ;
@@ -80,8 +66,7 @@ mod test {
80
66
let balances_map: BalancesMap = data. into_iter ( ) . collect ( ) ;
81
67
82
68
let actual_json = serde_json:: to_string ( & balances_map) . expect ( "Should serialize it" ) ;
83
- // should be all lowercase!
84
- let expected_json = r#"{"0xc91763d7f14ac5c5ddfbcd012e0d2a61ab9bded3":"100","0xce07cbb7e054514d590a0262c93070d838bfba2e":"50"}"# ;
69
+ let expected_json = r#"{"0xC91763D7F14ac5c5dDfBCD012e0D2A61ab9bDED3":"100","0xce07CbB7e054514D590a0262C93070D838bFBA2e":"50"}"# ;
85
70
86
71
assert_eq ! ( expected_json, actual_json) ;
87
72
@@ -90,4 +75,23 @@ mod test {
90
75
91
76
assert_eq ! ( balances_map, balances_map_from_json) ;
92
77
}
78
+
79
+ #[ test]
80
+ fn test_balances_map_deserialization_with_same_keys ( ) {
81
+ // the first is ETH Checksummed, the second is lowercase!
82
+ let json = r#"{"0xC91763D7F14ac5c5dDfBCD012e0D2A61ab9bDED3":"100","0xc91763d7f14ac5c5ddfbcd012e0d2a61ab9bded3":"20","0xce07CbB7e054514D590a0262C93070D838bFBA2e":"50"}"# ;
83
+
84
+ let actual_deserialized: BalancesMap =
85
+ serde_json:: from_str ( & json) . expect ( "Should deserialize it" ) ;
86
+
87
+ let expected_deserialized: BalancesMap = vec ! [
88
+ ( IDS [ "leader" ] . clone( ) , BigNum :: from( 50_u64 ) ) ,
89
+ // only the second should be accepted, as it appears second in the string and it's the latest one
90
+ ( IDS [ "follower" ] . clone( ) , BigNum :: from( 20_u64 ) ) ,
91
+ ]
92
+ . into_iter ( )
93
+ . collect ( ) ;
94
+
95
+ assert_eq ! ( expected_deserialized, actual_deserialized) ;
96
+ }
93
97
}
0 commit comments