@@ -409,12 +409,12 @@ impl IntoIterator for Validators {
409409}
410410
411411#[ derive( Default , Debug , PartialEq ) ]
412- pub struct IntermediateRewards {
412+ pub struct IntermediateRewardsV0 {
413413 previous : BTreeMap < Address , u64 > ,
414414 current : BTreeMap < Address , u64 > ,
415415}
416416
417- impl IntermediateRewards {
417+ impl IntermediateRewardsV0 {
418418 pub fn load_from_state ( state : & TopLevelState ) -> StateResult < Self > {
419419 let key = get_intermediate_rewards_key ( ) ;
420420 let action_data = state. action_data ( & key) ?;
@@ -456,6 +456,59 @@ impl IntermediateRewards {
456456 }
457457}
458458
459+ #[ derive( Default , Debug , PartialEq ) ]
460+ pub struct IntermediateRewardsV1 {
461+ current : BTreeMap < Address , u64 > ,
462+ calculated : BTreeMap < Address , u64 > ,
463+ }
464+
465+ impl IntermediateRewardsV1 {
466+ pub fn load_from_state ( state : & TopLevelState ) -> StateResult < Self > {
467+ let key = get_intermediate_rewards_key ( ) ;
468+ let action_data = state. action_data ( & key) ?;
469+ let ( current, calculated) = decode_map_tuple ( action_data. as_ref ( ) ) ;
470+
471+ Ok ( Self {
472+ current,
473+ calculated,
474+ } )
475+ }
476+
477+ pub fn save_to_state ( & self , state : & mut TopLevelState ) -> StateResult < ( ) > {
478+ let key = get_intermediate_rewards_key ( ) ;
479+ if self . current . is_empty ( ) && self . calculated . is_empty ( ) {
480+ state. remove_action_data ( & key) ;
481+ } else {
482+ let encoded = encode_map_tuple ( & self . current , & self . calculated ) ;
483+ state. update_action_data ( & key, encoded) ?;
484+ }
485+ Ok ( ( ) )
486+ }
487+
488+ pub fn add_quantity ( & mut self , address : Address , quantity : StakeQuantity ) {
489+ if quantity == 0 {
490+ return
491+ }
492+ * self . current . entry ( address) . or_insert ( 0 ) += quantity;
493+ }
494+
495+ pub fn update_calculated ( & mut self , rewards : BTreeMap < Address , u64 > ) {
496+ self . calculated = rewards;
497+ }
498+
499+ pub fn drain_current ( & mut self ) -> BTreeMap < Address , u64 > {
500+ let mut new = BTreeMap :: new ( ) ;
501+ mem:: swap ( & mut new, & mut self . current ) ;
502+ new
503+ }
504+
505+ pub fn drain_calculated ( & mut self ) -> BTreeMap < Address , u64 > {
506+ let mut new = BTreeMap :: new ( ) ;
507+ mem:: swap ( & mut new, & mut self . calculated ) ;
508+ new
509+ }
510+ }
511+
459512pub struct Candidates ( Vec < Candidate > ) ;
460513#[ derive( Clone , Debug , Eq , PartialEq , RlpEncodable , RlpDecodable ) ]
461514pub struct Candidate {
@@ -1129,46 +1182,85 @@ mod tests {
11291182 }
11301183
11311184 #[ test]
1132- fn load_and_save_intermediate_rewards ( ) {
1185+ fn load_and_save_intermediate_rewards_v0 ( ) {
11331186 let mut state = helpers:: get_temp_state ( ) ;
1134- let rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1187+ let rewards = IntermediateRewardsV0 :: load_from_state ( & state) . unwrap ( ) ;
11351188 rewards. save_to_state ( & mut state) . unwrap ( ) ;
11361189 }
11371190
11381191 #[ test]
1139- fn add_quantity ( ) {
1192+ fn add_quantity_v0 ( ) {
11401193 let address1 = Address :: random ( ) ;
11411194 let address2 = Address :: random ( ) ;
11421195 let mut state = helpers:: get_temp_state ( ) ;
1143- let mut origin_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1196+ let mut origin_rewards = IntermediateRewardsV0 :: load_from_state ( & state) . unwrap ( ) ;
11441197 origin_rewards. add_quantity ( address1, 1 ) ;
11451198 origin_rewards. add_quantity ( address2, 2 ) ;
11461199 origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1147- let recovered_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1200+ let recovered_rewards = IntermediateRewardsV0 :: load_from_state ( & state) . unwrap ( ) ;
11481201 assert_eq ! ( origin_rewards, recovered_rewards) ;
11491202 }
11501203
11511204 #[ test]
1152- fn drain ( ) {
1205+ fn drain_v0 ( ) {
11531206 let address1 = Address :: random ( ) ;
11541207 let address2 = Address :: random ( ) ;
11551208 let mut state = helpers:: get_temp_state ( ) ;
1156- let mut origin_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1209+ let mut origin_rewards = IntermediateRewardsV0 :: load_from_state ( & state) . unwrap ( ) ;
11571210 origin_rewards. add_quantity ( address1, 1 ) ;
11581211 origin_rewards. add_quantity ( address2, 2 ) ;
11591212 origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1160- let mut recovered_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1213+ let mut recovered_rewards = IntermediateRewardsV0 :: load_from_state ( & state) . unwrap ( ) ;
11611214 assert_eq ! ( origin_rewards, recovered_rewards) ;
11621215 let _drained = recovered_rewards. drain_previous ( ) ;
11631216 recovered_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1164- let mut final_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1217+ let mut final_rewards = IntermediateRewardsV0 :: load_from_state ( & state) . unwrap ( ) ;
11651218 assert_eq ! ( BTreeMap :: new( ) , final_rewards. previous) ;
11661219 let current = final_rewards. current . clone ( ) ;
11671220 final_rewards. move_current_to_previous ( ) ;
11681221 assert_eq ! ( BTreeMap :: new( ) , final_rewards. current) ;
11691222 assert_eq ! ( current, final_rewards. previous) ;
11701223 }
11711224
1225+ #[ test]
1226+ fn load_and_save_intermediate_rewards_v1 ( ) {
1227+ let mut state = helpers:: get_temp_state ( ) ;
1228+ let rewards = IntermediateRewardsV1 :: load_from_state ( & state) . unwrap ( ) ;
1229+ rewards. save_to_state ( & mut state) . unwrap ( ) ;
1230+ }
1231+
1232+ #[ test]
1233+ fn add_quantity_v1 ( ) {
1234+ let address1 = Address :: random ( ) ;
1235+ let address2 = Address :: random ( ) ;
1236+ let mut state = helpers:: get_temp_state ( ) ;
1237+ let mut origin_rewards = IntermediateRewardsV1 :: load_from_state ( & state) . unwrap ( ) ;
1238+ origin_rewards. add_quantity ( address1, 1 ) ;
1239+ origin_rewards. add_quantity ( address2, 2 ) ;
1240+ origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1241+ let recovered_rewards = IntermediateRewardsV1 :: load_from_state ( & state) . unwrap ( ) ;
1242+ assert_eq ! ( origin_rewards, recovered_rewards) ;
1243+ }
1244+
1245+ #[ test]
1246+ fn drain_v1 ( ) {
1247+ let address1 = Address :: random ( ) ;
1248+ let address2 = Address :: random ( ) ;
1249+ let mut state = helpers:: get_temp_state ( ) ;
1250+ let mut origin_rewards = IntermediateRewardsV1 :: load_from_state ( & state) . unwrap ( ) ;
1251+ origin_rewards. add_quantity ( address1, 1 ) ;
1252+ origin_rewards. add_quantity ( address2, 2 ) ;
1253+ origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1254+ let mut recovered_rewards = IntermediateRewardsV1 :: load_from_state ( & state) . unwrap ( ) ;
1255+ assert_eq ! ( origin_rewards, recovered_rewards) ;
1256+ recovered_rewards. drain_current ( ) ;
1257+ recovered_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1258+ let mut final_rewards = IntermediateRewardsV1 :: load_from_state ( & state) . unwrap ( ) ;
1259+ assert_eq ! ( BTreeMap :: new( ) , final_rewards. current) ;
1260+ final_rewards. drain_calculated ( ) ;
1261+ assert_eq ! ( BTreeMap :: new( ) , final_rewards. calculated) ;
1262+ }
1263+
11721264 #[ test]
11731265 fn candidates_deposit_add ( ) {
11741266 let mut state = helpers:: get_temp_state ( ) ;
0 commit comments