diff --git a/types/module/module.go b/types/module/module.go index 924c99834250..6747d16e4c02 100644 --- a/types/module/module.go +++ b/types/module/module.go @@ -145,7 +145,7 @@ type AppModule interface { // ABCI BeginBlock(sdk.Context, abci.RequestBeginBlock) - EndBlock(sdk.Context, abci.RequestEndBlock) []abci.ValidatorUpdate + EndBlock(sdk.Context, abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) } //___________________________ @@ -181,8 +181,8 @@ func (gam GenesisOnlyAppModule) NewQuerierHandler() sdk.Querier { return nil } func (gam GenesisOnlyAppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) {} // EndBlock returns an empty module end-block -func (GenesisOnlyAppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (GenesisOnlyAppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ @@ -308,23 +308,26 @@ func (m *Manager) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) abci.R func (m *Manager) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { ctx = ctx.WithEventManager(sdk.NewEventManager()) validatorUpdates := []abci.ValidatorUpdate{} + dkgValidatorUpdates := []abci.ValidatorUpdate{} for _, moduleName := range m.OrderEndBlockers { - moduleValUpdates := m.Modules[moduleName].EndBlock(ctx, req) + moduleValUpdates, moduleDKGValUpdates := m.Modules[moduleName].EndBlock(ctx, req) // use these validator updates if provided, the module manager assumes - // only one module will update the validator set + // only one module will update the validator set and dkg validator set if len(moduleValUpdates) > 0 { if len(validatorUpdates) > 0 { panic("validator EndBlock updates already set by a previous module") } validatorUpdates = moduleValUpdates + dkgValidatorUpdates = moduleDKGValUpdates } } return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, + DkgValidatorUpdates: dkgValidatorUpdates, Events: ctx.EventManager().ABCIEvents(), } } diff --git a/x/auth/module.go b/x/auth/module.go index d3cf501e4f04..5c9c91cfab65 100644 --- a/x/auth/module.go +++ b/x/auth/module.go @@ -132,8 +132,8 @@ func (AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} // EndBlock returns the end blocker for the auth module. It returns no validator // updates. -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/bank/module.go b/x/bank/module.go index 114962382758..ce32598a3f2c 100644 --- a/x/bank/module.go +++ b/x/bank/module.go @@ -128,8 +128,8 @@ func (AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} // EndBlock returns the end blocker for the bank module. It returns no validator // updates. -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/crisis/module.go b/x/crisis/module.go index 1885f69ade9f..937ebb197986 100644 --- a/x/crisis/module.go +++ b/x/crisis/module.go @@ -130,7 +130,7 @@ func (AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} // EndBlock returns the end blocker for the crisis module. It returns no validator // updates. -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { +func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { EndBlocker(ctx, *am.keeper) - return []abci.ValidatorUpdate{} + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } diff --git a/x/distribution/module.go b/x/distribution/module.go index 0b143d6478b8..626784d7bef2 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -149,8 +149,8 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { // EndBlock returns the end blocker for the distribution module. It returns no validator // updates. -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/evidence/module.go b/x/evidence/module.go index 30b427a95c1d..e4a13f110ecc 100644 --- a/x/evidence/module.go +++ b/x/evidence/module.go @@ -163,6 +163,6 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { // EndBlock executes all ABCI EndBlock logic respective to the evidence module. It // returns no validator updates. -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } diff --git a/x/gov/keeper/tally_test.go b/x/gov/keeper/tally_test.go index 195df42ec012..e381774ef5af 100644 --- a/x/gov/keeper/tally_test.go +++ b/x/gov/keeper/tally_test.go @@ -227,7 +227,7 @@ func TestTallyDelgatorOverride(t *testing.T) { _, err := sk.Delegate(ctx, TestAddrs[0], delTokens, sdk.Unbonded, val1, true) require.NoError(t, err) - _ = staking.EndBlocker(ctx, &sk) + staking.EndBlocker(ctx, &sk) tp := TestProposal proposal, err := keeper.SubmitProposal(ctx, tp) @@ -261,7 +261,7 @@ func TestTallyDelgatorInherit(t *testing.T) { _, err := sk.Delegate(ctx, TestAddrs[0], delTokens, sdk.Unbonded, val3, true) require.NoError(t, err) - _ = staking.EndBlocker(ctx, &sk) + staking.EndBlocker(ctx, &sk) tp := TestProposal proposal, err := keeper.SubmitProposal(ctx, tp) @@ -298,7 +298,7 @@ func TestTallyDelgatorMultipleOverride(t *testing.T) { _, err = sk.Delegate(ctx, TestAddrs[0], delTokens, sdk.Unbonded, val2, true) require.NoError(t, err) - _ = staking.EndBlocker(ctx, &sk) + staking.EndBlocker(ctx, &sk) tp := TestProposal proposal, err := keeper.SubmitProposal(ctx, tp) @@ -336,7 +336,7 @@ func TestTallyDelgatorMultipleInherit(t *testing.T) { _, err = sk.Delegate(ctx, TestAddrs[0], delTokens, sdk.Unbonded, val3, true) require.NoError(t, err) - _ = staking.EndBlocker(ctx, &sk) + staking.EndBlocker(ctx, &sk) tp := TestProposal proposal, err := keeper.SubmitProposal(ctx, tp) @@ -373,7 +373,7 @@ func TestTallyJailedValidator(t *testing.T) { _, err = sk.Delegate(ctx, TestAddrs[0], delTokens, sdk.Unbonded, val3, true) require.NoError(t, err) - _ = staking.EndBlocker(ctx, &sk) + staking.EndBlocker(ctx, &sk) sk.Jail(ctx, sdk.ConsAddress(val2.ConsPubKey.Address())) diff --git a/x/gov/keeper/test_common.go b/x/gov/keeper/test_common.go index 94019ffbe1cc..0cc953c45671 100644 --- a/x/gov/keeper/test_common.go +++ b/x/gov/keeper/test_common.go @@ -203,7 +203,7 @@ func createValidators(ctx sdk.Context, sk staking.Keeper, powers []int64) { header := abci.Header{Entropy: testBlockEntropy()} staking.BeginBlocker(ctx, abci.RequestBeginBlock{Header: header}, &sk) - _ = staking.EndBlocker(ctx, &sk) + staking.EndBlocker(ctx, &sk) } func testBlockEntropy() abci.BlockEntropy { diff --git a/x/gov/module.go b/x/gov/module.go index 7ad5ecbc0ace..d36afc2ac2f0 100644 --- a/x/gov/module.go +++ b/x/gov/module.go @@ -166,9 +166,9 @@ func (AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} // EndBlock returns the end blocker for the gov module. It returns no validator // updates. -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { +func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { EndBlocker(ctx, am.keeper) - return []abci.ValidatorUpdate{} + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/mint/module.go b/x/mint/module.go index 95b171251ee1..f234c07e3b46 100644 --- a/x/mint/module.go +++ b/x/mint/module.go @@ -132,8 +132,8 @@ func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { // EndBlock returns the end blocker for the mint module. It returns no validator // updates. -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 998bf3c804b4..93220c25bfe2 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -81,7 +81,7 @@ func getBeginBlocker(keeper *staking.Keeper) sdk.BeginBlocker { // staking endblocker func getEndBlocker(keeper *staking.Keeper) sdk.EndBlocker { return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - validatorUpdates := staking.EndBlocker(ctx, keeper) + validatorUpdates, _ := staking.EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, } diff --git a/x/slashing/internal/keeper/keeper_test.go b/x/slashing/internal/keeper/keeper_test.go index bffe4178c8f6..015fb88eb173 100644 --- a/x/slashing/internal/keeper/keeper_test.go +++ b/x/slashing/internal/keeper/keeper_test.go @@ -151,7 +151,7 @@ func TestValidatorDippingInAndOut(t *testing.T) { require.NotNil(t, res) staking.BeginBlocker(ctx, abci.RequestBeginBlock{Header: header}, &sk) - validatorUpdates := staking.EndBlocker(ctx, &sk) + validatorUpdates, _ := staking.EndBlocker(ctx, &sk) require.Equal(t, 2, len(validatorUpdates)) validator, _ := sk.GetValidator(ctx, addr) require.Equal(t, sdk.Unbonding, validator.Status) @@ -167,7 +167,7 @@ func TestValidatorDippingInAndOut(t *testing.T) { require.NotNil(t, res) staking.BeginBlocker(ctx, abci.RequestBeginBlock{Header: header}, &sk) - validatorUpdates = staking.EndBlocker(ctx, &sk) + validatorUpdates, _ = staking.EndBlocker(ctx, &sk) require.Equal(t, 2, len(validatorUpdates)) validator, _ = sk.GetValidator(ctx, addr) require.Equal(t, sdk.Bonded, validator.Status) diff --git a/x/slashing/module.go b/x/slashing/module.go index e99b421574fe..9d656daf9fb5 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -146,8 +146,8 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { // EndBlock returns the end blocker for the slashing module. It returns no validator // updates. -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/staking/abci.go b/x/staking/abci.go index 3ce8a0cde58c..6e62d2df1bea 100644 --- a/x/staking/abci.go +++ b/x/staking/abci.go @@ -18,6 +18,10 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k *keeper.Keeper) } // Called every block, update validator set -func EndBlocker(ctx sdk.Context, k *keeper.Keeper) []abci.ValidatorUpdate { - return k.BlockValidatorUpdates(ctx) +func EndBlocker(ctx sdk.Context, k *keeper.Keeper) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + if !k.ChangeoverValidators { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} + } + k.ChangeoverValidators = false + return k.BlockValidatorUpdates(ctx), []abci.ValidatorUpdate{} } diff --git a/x/staking/app_test.go b/x/staking/app_test.go index 2cd97ed85c47..d250a82788d5 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -65,10 +65,11 @@ func getBeginBlocker(keeper *Keeper) sdk.BeginBlocker { // getEndBlocker returns a staking endblocker. func getEndBlocker(keeper *Keeper) sdk.EndBlocker { return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - validatorUpdates := EndBlocker(ctx, keeper) + validatorUpdates, dkgValidatorUpdates := EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, + DkgValidatorUpdates: dkgValidatorUpdates, } } } diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index cc0329f376cf..c02360e82548 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -560,9 +560,11 @@ func TestMultipleMsgCreateValidator(t *testing.T) { require.Equal(t, i+1, len(validators), "expected %d validators got %d, validators: %v", i+1, len(validators), validators) require.Equal(t, valTokens, val.DelegatorShares.RoundInt(), "expected %d shares, got %d", 10, val.DelegatorShares) - require.Equal(t, balanceExpd, balanceGot, "expected account to have %d, got %d", balanceExpd, balanceGot) + require.Equal(t, balanceExpd, balanceGot, "expected account %d to have %d, got %d", i, balanceExpd, balanceGot) } + header := abci.Header{Entropy: testBlockEntropy()} + BeginBlocker(ctx, abci.RequestBeginBlock{Header: header}, &keeper) EndBlocker(ctx, &keeper) // unbond them all by removing delegation @@ -580,11 +582,11 @@ func TestMultipleMsgCreateValidator(t *testing.T) { types.ModuleCdc.MustUnmarshalBinaryLengthPrefixed(res.Data, &finishTime) // adds validator into unbonding queue - header := abci.Header{Entropy: testBlockEntropy()} BeginBlocker(ctx, abci.RequestBeginBlock{Header: header}, &keeper) EndBlocker(ctx, &keeper) // removes validator from queue and set + BeginBlocker(ctx, abci.RequestBeginBlock{Header: header}, &keeper) EndBlocker(ctx.WithBlockTime(blockTime.Add(params.UnbondingTime)), &keeper) // Check that the validator is deleted from state @@ -596,7 +598,7 @@ func TestMultipleMsgCreateValidator(t *testing.T) { require.False(t, found) gotBalance := accMapper.GetAccount(ctx, delegatorAddrs[i]).GetCoins().AmountOf(params.BondDenom) - require.Equal(t, initTokens, gotBalance, "expected account to have %d, got %d", initTokens, gotBalance) + require.Equal(t, initTokens, gotBalance, "expected account %d to have %d, got %d", i, initTokens, gotBalance) } } diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index d4f7b94fe8d8..101bc139215a 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -13,12 +13,7 @@ import ( // Calculate the ValidatorUpdates for the current block // Called in each EndBlock -func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) (validatorUpdates []abci.ValidatorUpdate) { - if !k.ChangeoverValidators { - return - } - k.ChangeoverValidators = false - +func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { // Calculate validator set changes. // // NOTE: ApplyAndReturnValidatorSetUpdates has to come before @@ -28,7 +23,7 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) (validatorUpdates []abci. // unbonded after the Endblocker (go from Bonded -> Unbonding during // ApplyAndReturnValidatorSetUpdates and then Unbonding -> Unbonded during // UnbondAllMatureValidatorQueue). - validatorUpdates = k.ApplyAndReturnValidatorSetUpdates(ctx) + validatorUpdates := k.ApplyAndReturnValidatorSetUpdates(ctx) // Unbond all mature validators from the unbonding queue. k.UnbondAllMatureValidatorQueue(ctx) diff --git a/x/staking/module.go b/x/staking/module.go index 6a5c33be5032..c9a681067640 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -172,7 +172,7 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { // EndBlock returns the end blocker for the staking module. It returns no validator // updates. -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { +func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { return EndBlocker(ctx, &am.keeper) } diff --git a/x/supply/module.go b/x/supply/module.go index f9e45322a99c..94e406cd49a1 100644 --- a/x/supply/module.go +++ b/x/supply/module.go @@ -137,8 +137,8 @@ func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} // EndBlock returns the end blocker for the supply module. It returns no validator // updates. -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} } //____________________________________________________________________________ diff --git a/x/upgrade/module.go b/x/upgrade/module.go index 5605ca0b673e..a35145842ab9 100644 --- a/x/upgrade/module.go +++ b/x/upgrade/module.go @@ -130,6 +130,6 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { } // EndBlock does nothing -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} +func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) ([]abci.ValidatorUpdate, []abci.ValidatorUpdate) { + return []abci.ValidatorUpdate{}, []abci.ValidatorUpdate{} }