diff --git a/database/schema/03-staking.sql b/database/schema/03-staking.sql index 7fb5bfd4e..098a336df 100644 --- a/database/schema/03-staking.sql +++ b/database/schema/03-staking.sql @@ -64,7 +64,7 @@ CREATE TABLE validator_voting_power ( validator_address TEXT NOT NULL REFERENCES validator (consensus_address) PRIMARY KEY, voting_power BIGINT NOT NULL, - height BIGINT NOT NULL REFERENCES block (height) + height BIGINT NULL REFERENCES block (height) ); CREATE INDEX validator_voting_power_height_index ON validator_voting_power (height); @@ -108,4 +108,4 @@ CREATE TABLE double_sign_evidence vote_a_id BIGINT NOT NULL REFERENCES double_sign_vote (id), vote_b_id BIGINT NOT NULL REFERENCES double_sign_vote (id) ); -CREATE INDEX double_sign_evidence_height_index ON double_sign_evidence (height); \ No newline at end of file +CREATE INDEX double_sign_evidence_height_index ON double_sign_evidence (height); diff --git a/database/staking_validators.go b/database/staking_validators.go index 54d7d551a..30f18cf6c 100644 --- a/database/staking_validators.go +++ b/database/staking_validators.go @@ -378,7 +378,11 @@ func (db *Db) SaveValidatorsVotingPowers(entries []types.ValidatorVotingPower) e for i, entry := range entries { pi := i * 3 stmt += fmt.Sprintf("($%d,$%d,$%d),", pi+1, pi+2, pi+3) - params = append(params, entry.ConsensusAddress, entry.VotingPower, entry.Height) + if entry.Height == 0 { + params = append(params, entry.ConsensusAddress, entry.VotingPower, nil) + } else { + params = append(params, entry.ConsensusAddress, entry.VotingPower, entry.Height) + } } stmt = stmt[:len(stmt)-1] diff --git a/modules/staking/handle_genesis.go b/modules/staking/handle_genesis.go index c01f28954..312b44732 100644 --- a/modules/staking/handle_genesis.go +++ b/modules/staking/handle_genesis.go @@ -106,7 +106,10 @@ func (m *Module) saveValidators(doc *tmtypes.GenesisDoc, validators stakingtypes vals[i] = validator } - return m.db.SaveValidatorsData(vals) + if err := m.db.SaveValidatorsData(vals); err != nil { + return err + } + return m.UpdateValidatorStatuses() } // saveValidatorDescription saves the description for the given validators diff --git a/modules/staking/handle_msg.go b/modules/staking/handle_msg.go index d463a0d17..4a6c77928 100644 --- a/modules/staking/handle_msg.go +++ b/modules/staking/handle_msg.go @@ -54,7 +54,7 @@ func (m *Module) handleMsgCreateValidator(height int64, msg *stakingtypes.MsgCre if err != nil { return fmt.Errorf("error while refreshing validator from MsgCreateValidator: %s", err) } - return nil + return m.UpdateValidatorStatuses() } // handleEditValidator handles MsgEditValidator utils, updating the validator info diff --git a/modules/staking/utils_validators.go b/modules/staking/utils_validators.go index 1defd95d2..4222c4a3e 100644 --- a/modules/staking/utils_validators.go +++ b/modules/staking/utils_validators.go @@ -313,10 +313,10 @@ func (m *Module) updateProposalValidatorStatusSnapshot( // updateValidatorStatusAndVP updates validators status // and validators voting power func (m *Module) updateValidatorStatusAndVP(height int64, validators []stakingtypes.Validator) error { - votingPowers := make([]types.ValidatorVotingPower, len(validators)) - statuses := make([]types.ValidatorStatus, len(validators)) + votingPowers := make([]types.ValidatorVotingPower, 0, len(validators)) + statuses := make([]types.ValidatorStatus, 0, len(validators)) - for index, validator := range validators { + for _, validator := range validators { consAddr, err := validator.GetConsAddr() if err != nil { return err @@ -331,15 +331,15 @@ func (m *Module) updateValidatorStatusAndVP(height int64, validators []stakingty return err } - votingPowers[index] = types.NewValidatorVotingPower(consAddr.String(), validator.Tokens.Int64(), height) + votingPowers = append(votingPowers, types.NewValidatorVotingPower(consAddr.String(), validator.Tokens.Int64(), height)) - statuses[index] = types.NewValidatorStatus( + statuses = append(statuses, types.NewValidatorStatus( consAddr.String(), consPubKey.String(), int(validator.GetStatus()), validator.IsJailed(), height, - ) + )) } log.Debug().Str("module", "staking").Msg("refreshing validator voting power")