@@ -18,7 +18,6 @@ use std::cmp::Ordering;
1818use std:: collections:: btree_map:: { BTreeMap , Entry } ;
1919use std:: collections:: btree_set:: { self , BTreeSet } ;
2020use std:: collections:: { btree_map, HashMap , HashSet } ;
21- use std:: mem;
2221use std:: ops:: Deref ;
2322use std:: vec;
2423
@@ -408,51 +407,116 @@ impl IntoIterator for Validators {
408407 }
409408}
410409
411- #[ derive( Default , Debug , PartialEq ) ]
412- pub struct IntermediateRewards {
413- previous : BTreeMap < Address , u64 > ,
414- current : BTreeMap < Address , u64 > ,
415- }
410+ pub mod v0 {
411+ use std:: mem;
416412
417- impl IntermediateRewards {
418- pub fn load_from_state ( state : & TopLevelState ) -> StateResult < Self > {
419- let key = get_intermediate_rewards_key ( ) ;
420- let action_data = state. action_data ( & key) ?;
421- let ( previous, current) = decode_map_tuple ( action_data. as_ref ( ) ) ;
413+ use super :: * ;
422414
423- Ok ( Self {
424- previous ,
425- current ,
426- } )
415+ # [ derive ( Default , Debug , PartialEq ) ]
416+ pub struct IntermediateRewards {
417+ pub ( super ) previous : BTreeMap < Address , u64 > ,
418+ pub ( super ) current : BTreeMap < Address , u64 > ,
427419 }
428420
429- pub fn save_to_state ( & self , state : & mut TopLevelState ) -> StateResult < ( ) > {
430- let key = get_intermediate_rewards_key ( ) ;
431- if self . previous . is_empty ( ) && self . current . is_empty ( ) {
432- state. remove_action_data ( & key) ;
433- } else {
434- let encoded = encode_map_tuple ( & self . previous , & self . current ) ;
435- state. update_action_data ( & key, encoded) ?;
421+ impl IntermediateRewards {
422+ pub fn load_from_state ( state : & TopLevelState ) -> StateResult < Self > {
423+ let key = get_intermediate_rewards_key ( ) ;
424+ let action_data = state. action_data ( & key) ?;
425+ let ( previous, current) = decode_map_tuple ( action_data. as_ref ( ) ) ;
426+
427+ Ok ( Self {
428+ previous,
429+ current,
430+ } )
436431 }
437- Ok ( ( ) )
438- }
439432
440- pub fn add_quantity ( & mut self , address : Address , quantity : StakeQuantity ) {
441- if quantity == 0 {
442- return
433+ pub fn save_to_state ( & self , state : & mut TopLevelState ) -> StateResult < ( ) > {
434+ let key = get_intermediate_rewards_key ( ) ;
435+ if self . previous . is_empty ( ) && self . current . is_empty ( ) {
436+ state. remove_action_data ( & key) ;
437+ } else {
438+ let encoded = encode_map_tuple ( & self . previous , & self . current ) ;
439+ state. update_action_data ( & key, encoded) ?;
440+ }
441+ Ok ( ( ) )
442+ }
443+
444+ pub fn add_quantity ( & mut self , address : Address , quantity : StakeQuantity ) {
445+ if quantity == 0 {
446+ return
447+ }
448+ * self . current . entry ( address) . or_insert ( 0 ) += quantity;
449+ }
450+
451+ pub fn drain_previous ( & mut self ) -> BTreeMap < Address , u64 > {
452+ let mut new = BTreeMap :: new ( ) ;
453+ mem:: swap ( & mut new, & mut self . previous ) ;
454+ new
455+ }
456+
457+ pub fn move_current_to_previous ( & mut self ) {
458+ assert ! ( self . previous. is_empty( ) ) ;
459+ mem:: swap ( & mut self . previous , & mut self . current ) ;
443460 }
444- * self . current . entry ( address) . or_insert ( 0 ) += quantity;
445461 }
462+ }
463+
464+ pub mod v1 {
465+ use std:: mem;
466+
467+ use super :: * ;
446468
447- pub fn drain_previous ( & mut self ) -> BTreeMap < Address , u64 > {
448- let mut new = BTreeMap :: new ( ) ;
449- mem :: swap ( & mut new , & mut self . previous ) ;
450- new
469+ # [ derive ( Default , Debug , PartialEq ) ]
470+ pub struct IntermediateRewards {
471+ pub ( super ) current : BTreeMap < Address , u64 > ,
472+ pub ( super ) calculated : BTreeMap < Address , u64 > ,
451473 }
452474
453- pub fn move_current_to_previous ( & mut self ) {
454- assert ! ( self . previous. is_empty( ) ) ;
455- mem:: swap ( & mut self . previous , & mut self . current ) ;
475+ impl IntermediateRewards {
476+ pub fn load_from_state ( state : & TopLevelState ) -> StateResult < Self > {
477+ let key = get_intermediate_rewards_key ( ) ;
478+ let action_data = state. action_data ( & key) ?;
479+ let ( current, calculated) = decode_map_tuple ( action_data. as_ref ( ) ) ;
480+
481+ Ok ( Self {
482+ current,
483+ calculated,
484+ } )
485+ }
486+
487+ pub fn save_to_state ( & self , state : & mut TopLevelState ) -> StateResult < ( ) > {
488+ let key = get_intermediate_rewards_key ( ) ;
489+ if self . current . is_empty ( ) && self . calculated . is_empty ( ) {
490+ state. remove_action_data ( & key) ;
491+ } else {
492+ let encoded = encode_map_tuple ( & self . current , & self . calculated ) ;
493+ state. update_action_data ( & key, encoded) ?;
494+ }
495+ Ok ( ( ) )
496+ }
497+
498+ pub fn add_quantity ( & mut self , address : Address , quantity : StakeQuantity ) {
499+ if quantity == 0 {
500+ return
501+ }
502+ * self . current . entry ( address) . or_insert ( 0 ) += quantity;
503+ }
504+
505+ pub fn update_calculated ( & mut self , rewards : BTreeMap < Address , u64 > ) {
506+ self . calculated = rewards;
507+ }
508+
509+ pub fn drain_current ( & mut self ) -> BTreeMap < Address , u64 > {
510+ let mut new = BTreeMap :: new ( ) ;
511+ mem:: swap ( & mut new, & mut self . current ) ;
512+ new
513+ }
514+
515+ pub fn drain_calculated ( & mut self ) -> BTreeMap < Address , u64 > {
516+ let mut new = BTreeMap :: new ( ) ;
517+ mem:: swap ( & mut new, & mut self . calculated ) ;
518+ new
519+ }
456520 }
457521}
458522
@@ -1129,46 +1193,99 @@ mod tests {
11291193 }
11301194
11311195 #[ test]
1132- fn load_and_save_intermediate_rewards ( ) {
1196+ fn load_and_save_intermediate_rewards_v0 ( ) {
11331197 let mut state = helpers:: get_temp_state ( ) ;
1134- let rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1198+ let rewards = v0 :: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
11351199 rewards. save_to_state ( & mut state) . unwrap ( ) ;
11361200 }
11371201
11381202 #[ test]
1139- fn add_quantity ( ) {
1203+ fn add_quantity_v0 ( ) {
11401204 let address1 = Address :: random ( ) ;
11411205 let address2 = Address :: random ( ) ;
11421206 let mut state = helpers:: get_temp_state ( ) ;
1143- let mut origin_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1207+ let mut origin_rewards = v0 :: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
11441208 origin_rewards. add_quantity ( address1, 1 ) ;
11451209 origin_rewards. add_quantity ( address2, 2 ) ;
11461210 origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1147- let recovered_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1211+ let recovered_rewards = v0 :: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
11481212 assert_eq ! ( origin_rewards, recovered_rewards) ;
11491213 }
11501214
11511215 #[ test]
1152- fn drain ( ) {
1216+ fn drain_v0 ( ) {
11531217 let address1 = Address :: random ( ) ;
11541218 let address2 = Address :: random ( ) ;
11551219 let mut state = helpers:: get_temp_state ( ) ;
1156- let mut origin_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1220+ let mut origin_rewards = v0 :: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
11571221 origin_rewards. add_quantity ( address1, 1 ) ;
11581222 origin_rewards. add_quantity ( address2, 2 ) ;
11591223 origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1160- let mut recovered_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1224+ let mut recovered_rewards = v0 :: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
11611225 assert_eq ! ( origin_rewards, recovered_rewards) ;
11621226 let _drained = recovered_rewards. drain_previous ( ) ;
11631227 recovered_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1164- let mut final_rewards = IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1228+ let mut final_rewards = v0 :: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
11651229 assert_eq ! ( BTreeMap :: new( ) , final_rewards. previous) ;
11661230 let current = final_rewards. current . clone ( ) ;
11671231 final_rewards. move_current_to_previous ( ) ;
11681232 assert_eq ! ( BTreeMap :: new( ) , final_rewards. current) ;
11691233 assert_eq ! ( current, final_rewards. previous) ;
11701234 }
11711235
1236+ #[ test]
1237+ fn save_v0_and_load_v1_intermediate_rewards ( ) {
1238+ let address1 = Address :: random ( ) ;
1239+ let address2 = Address :: random ( ) ;
1240+ let mut state = helpers:: get_temp_state ( ) ;
1241+ let mut origin_rewards = v0:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1242+ origin_rewards. add_quantity ( address1, 1 ) ;
1243+ origin_rewards. add_quantity ( address2, 2 ) ;
1244+ origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1245+ let recovered_rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1246+ assert_eq ! ( origin_rewards. previous, recovered_rewards. current) ;
1247+ assert_eq ! ( origin_rewards. current, recovered_rewards. calculated) ;
1248+ }
1249+
1250+ #[ test]
1251+ fn load_and_save_intermediate_rewards_v1 ( ) {
1252+ let mut state = helpers:: get_temp_state ( ) ;
1253+ let rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1254+ rewards. save_to_state ( & mut state) . unwrap ( ) ;
1255+ }
1256+
1257+ #[ test]
1258+ fn add_quantity_v1 ( ) {
1259+ let address1 = Address :: random ( ) ;
1260+ let address2 = Address :: random ( ) ;
1261+ let mut state = helpers:: get_temp_state ( ) ;
1262+ let mut origin_rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1263+ origin_rewards. add_quantity ( address1, 1 ) ;
1264+ origin_rewards. add_quantity ( address2, 2 ) ;
1265+ origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1266+ let recovered_rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1267+ assert_eq ! ( origin_rewards, recovered_rewards) ;
1268+ }
1269+
1270+ #[ test]
1271+ fn drain_v1 ( ) {
1272+ let address1 = Address :: random ( ) ;
1273+ let address2 = Address :: random ( ) ;
1274+ let mut state = helpers:: get_temp_state ( ) ;
1275+ let mut origin_rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1276+ origin_rewards. add_quantity ( address1, 1 ) ;
1277+ origin_rewards. add_quantity ( address2, 2 ) ;
1278+ origin_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1279+ let mut recovered_rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1280+ assert_eq ! ( origin_rewards, recovered_rewards) ;
1281+ recovered_rewards. drain_current ( ) ;
1282+ recovered_rewards. save_to_state ( & mut state) . unwrap ( ) ;
1283+ let mut final_rewards = v1:: IntermediateRewards :: load_from_state ( & state) . unwrap ( ) ;
1284+ assert_eq ! ( BTreeMap :: new( ) , final_rewards. current) ;
1285+ final_rewards. drain_calculated ( ) ;
1286+ assert_eq ! ( BTreeMap :: new( ) , final_rewards. calculated) ;
1287+ }
1288+
11721289 #[ test]
11731290 fn candidates_deposit_add ( ) {
11741291 let mut state = helpers:: get_temp_state ( ) ;
0 commit comments