@@ -162,6 +162,9 @@ impl<'a> Delegation<'a> {
162162 }
163163
164164 pub fn add_quantity ( & mut self , delegatee : Address , quantity : StakeQuantity ) -> StateResult < ( ) > {
165+ if quantity == 0 {
166+ return Ok ( ( ) )
167+ }
165168 * self . delegatees . entry ( delegatee) . or_insert ( 0 ) += quantity;
166169 Ok ( ( ) )
167170 }
@@ -461,4 +464,41 @@ mod tests {
461464 assert_eq ! ( delegation. get_quantity( delegatee) , delegation_amount[ delegatee] ) ;
462465 }
463466 }
467+
468+ #[ test]
469+ fn delegation_zero_add_should_not_be_included ( ) {
470+ let mut state = helpers:: get_temp_state ( ) ;
471+
472+ // Prepare
473+ let delegator = Address :: random ( ) ;
474+ let delegatee1 = Address :: random ( ) ;
475+ let delegatee2 = Address :: random ( ) ;
476+
477+ // Do delegate
478+ let mut delegation = Delegation :: load_from_state ( & state, & delegator) . unwrap ( ) ;
479+ delegation. add_quantity ( delegatee1, 100 ) . unwrap ( ) ;
480+ delegation. add_quantity ( delegatee2, 0 ) . unwrap ( ) ;
481+ delegation. save_to_state ( & mut state) . unwrap ( ) ;
482+
483+ let delegation = Delegation :: load_from_state ( & state, & delegator) . unwrap ( ) ;
484+ let delegated = delegation. iter ( ) . collect :: < Vec < _ > > ( ) ;
485+ assert_eq ! ( & delegated, & [ ( & delegatee1, & 100 ) ] ) ;
486+ }
487+
488+ #[ test]
489+ fn delegation_empty_removed_from_state ( ) {
490+ let mut state = helpers:: get_temp_state ( ) ;
491+
492+ // Prepare
493+ let delegator = Address :: random ( ) ;
494+ let delegatee = Address :: random ( ) ;
495+
496+ // Do delegate
497+ let mut delegation = Delegation :: load_from_state ( & state, & delegator) . unwrap ( ) ;
498+ delegation. add_quantity ( delegatee, 0 ) . unwrap ( ) ;
499+ delegation. save_to_state ( & mut state) . unwrap ( ) ;
500+
501+ let result = state. action_data ( & get_delegation_key ( & delegator) ) . unwrap ( ) ;
502+ assert_eq ! ( result, None ) ;
503+ }
464504}
0 commit comments