Skip to content

Commit 016c229

Browse files
otherviewpaologalligitvanja-vechain
authored
Increase and Decrease are only on active validators (#1422)
* Increase and Descrease are only on active validators * Update builtin/staker/staker.go Co-authored-by: Paolo Galli <paolo.galli@vechain.org> --------- Co-authored-by: Paolo Galli <paolo.galli@vechain.org> Co-authored-by: vanja-vechain <122791588+vanja-vechain@users.noreply.github.com>
1 parent f040eed commit 016c229

File tree

5 files changed

+127
-263
lines changed

5 files changed

+127
-263
lines changed

‎builtin/staker/staker.go‎

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,10 @@ func (s *Staker) IncreaseStake(validator thor.Address, endorser thor.Address, am
313313
if val.Status == validation.StatusExit {
314314
return NewReverts("validator exited")
315315
}
316-
if val.Status == validation.StatusActive && val.ExitBlock != nil {
316+
if val.Status != validation.StatusActive {
317+
return NewReverts("can't increase stake while validator not active")
318+
}
319+
if val.ExitBlock != nil {
317320
return NewReverts("validator has signaled exit, cannot increase stake")
318321
}
319322

@@ -327,10 +330,8 @@ func (s *Staker) IncreaseStake(validator thor.Address, endorser thor.Address, am
327330
return err
328331
}
329332

330-
if val.Status == validation.StatusActive {
331-
if err = s.validationService.AddToRenewalList(validator); err != nil {
332-
return err
333-
}
333+
if err = s.validationService.AddToRenewalList(validator); err != nil {
334+
return err
334335
}
335336

336337
// update global queued, use the initial multiplier
@@ -363,20 +364,14 @@ func (s *Staker) DecreaseStake(validator thor.Address, endorser thor.Address, am
363364
if val.Status == validation.StatusExit {
364365
return NewReverts("validator exited")
365366
}
366-
if val.Status == validation.StatusActive && val.ExitBlock != nil {
367+
if val.Status != validation.StatusActive {
368+
return NewReverts("can't decrease stake while validator not active")
369+
}
370+
if val.ExitBlock != nil {
367371
return NewReverts("validator has signaled exit, cannot decrease stake")
368372
}
369373

370-
var nextPeriodVET uint64
371-
if val.Status == validation.StatusActive {
372-
// We don't consider any increases, i.e., entry.QueuedVET. We only consider locked and current decreases.
373-
// The reason is that validator can instantly withdraw QueuedVET at any time.
374-
// We need to make sure the locked VET minus the sum of the current decreases is still above the minimum stake.
375-
nextPeriodVET = val.LockedVET - val.PendingUnlockVET
376-
}
377-
if val.Status == validation.StatusQueued {
378-
nextPeriodVET = val.QueuedVET
379-
}
374+
nextPeriodVET := val.LockedVET - val.PendingUnlockVET
380375
if amount > nextPeriodVET {
381376
return NewReverts("not enough locked stake")
382377
}
@@ -389,22 +384,8 @@ func (s *Staker) DecreaseStake(validator thor.Address, endorser thor.Address, am
389384
return err
390385
}
391386

392-
if val.Status == validation.StatusActive {
393-
if err = s.validationService.AddToRenewalList(validator); err != nil {
394-
return err
395-
}
396-
}
397-
398-
if val.Status == validation.StatusQueued {
399-
// update global queued
400-
if err = s.globalStatsService.RemoveQueued(amount); err != nil {
401-
return err
402-
}
403-
404-
// update global withdrawable
405-
if err = s.globalStatsService.AddWithdrawable(amount); err != nil {
406-
return err
407-
}
387+
if err = s.validationService.AddToRenewalList(validator); err != nil {
388+
return err
408389
}
409390

410391
if err = s.ContractBalanceCheck(0); err != nil {

‎builtin/staker/staker_test.go‎

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -677,8 +677,10 @@ func TestValidation_DecreaseStake_ActiveTooLowNextPeriod(t *testing.T) {
677677
end := id
678678

679679
assert.NoError(t, staker.AddValidation(id, end, thor.MediumStakingPeriod(), MinStakeVET))
680+
_, err := staker.Housekeep(thor.MediumStakingPeriod())
681+
assert.NoError(t, err)
680682

681-
err := staker.DecreaseStake(id, end, 100)
683+
err = staker.DecreaseStake(id, end, 100)
682684
assert.ErrorContains(t, err, "next period stake is lower than minimum stake")
683685
}
684686

@@ -721,7 +723,10 @@ func TestValidation_DecreaseStake_QueuedTooLowNextPeriod(t *testing.T) {
721723

722724
assert.NoError(t, staker.AddValidation(id, end, thor.MediumStakingPeriod(), MinStakeVET))
723725

724-
err := staker.DecreaseStake(id, end, 100)
726+
_, err := staker.Housekeep(thor.MediumStakingPeriod())
727+
assert.NoError(t, err)
728+
729+
err = staker.DecreaseStake(id, end, 100)
725730
assert.ErrorContains(t, err, "next period stake is lower than minimum stake")
726731
}
727732

@@ -733,15 +738,19 @@ func TestValidation_DecreaseStake_QueuedSuccess(t *testing.T) {
733738

734739
assert.NoError(t, staker.AddValidation(id, end, thor.MediumStakingPeriod(), MinStakeVET+100))
735740

741+
_, err := staker.Housekeep(thor.MediumStakingPeriod())
742+
assert.NoError(t, err)
743+
736744
assert.NoError(t, staker.DecreaseStake(id, end, 100))
737745
withdrawable, err := staker.globalStatsService.GetWithdrawableStake()
738746
assert.NoError(t, err)
739-
assert.Equal(t, uint64(100), withdrawable)
747+
assert.Equal(t, uint64(0), withdrawable)
740748

741749
v, err := staker.GetValidation(id)
742750
assert.NoError(t, err)
743-
assert.Equal(t, MinStakeVET, v.QueuedVET)
744-
assert.Equal(t, uint64(100), v.WithdrawableVET)
751+
assert.Equal(t, uint64(0), v.QueuedVET)
752+
assert.Equal(t, MinStakeVET+100, v.LockedVET)
753+
assert.Equal(t, uint64(0), v.WithdrawableVET)
745754
}
746755

747756
func TestValidation_WithdrawStake_InvalidEndorser(t *testing.T) {

0 commit comments

Comments
 (0)