From b4ff7baa6d3ae7906e6b74ebc641e294b50790cd Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 9 Jun 2026 13:38:42 +0900 Subject: [PATCH] fix(mstaking): detect zero-token exchange rates --- x/mstaking/types/validator.go | 4 ++-- x/mstaking/types/validator_test.go | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/x/mstaking/types/validator.go b/x/mstaking/types/validator.go index b9ae3ee27..c6c467882 100644 --- a/x/mstaking/types/validator.go +++ b/x/mstaking/types/validator.go @@ -277,8 +277,8 @@ func (v Validator) SetInitialCommission(commission Commission) (Validator, error // Validator loses all tokens due to slashing. In this case, // make all future delegations invalid. func (v Validator) InvalidExRate() bool { - for _, token := range v.Tokens { - if token.IsZero() && v.DelegatorShares.AmountOf(token.Denom).IsPositive() { + for _, share := range v.DelegatorShares { + if share.Amount.IsPositive() && v.Tokens.AmountOf(share.Denom).IsZero() { return true } } diff --git a/x/mstaking/types/validator_test.go b/x/mstaking/types/validator_test.go index c17aa7a47..f9683d873 100644 --- a/x/mstaking/types/validator_test.go +++ b/x/mstaking/types/validator_test.go @@ -104,6 +104,15 @@ func TestShareTokens(t *testing.T) { assert.Equal(t, decCoins(5), validator.TokensFromShares(sdk.NewDecCoins(sdk.NewDecCoin(sdk.DefaultBondDenom, math.NewInt(10))))) } +func TestInvalidExRate(t *testing.T) { + validator := mkValidator(coins(100), decCoins(100)) + require.False(t, validator.InvalidExRate()) + + validator = validator.RemoveTokens(coins(100)) + require.True(t, validator.Tokens.IsZero()) + require.True(t, validator.InvalidExRate()) +} + func TestRemoveTokens(t *testing.T) { validator := mkValidator(coins(100), decCoins(100))