From 103c736370c447b1aa559ec7fd9dfba7444700c3 Mon Sep 17 00:00:00 2001 From: Kevin Pita Date: Tue, 28 Apr 2026 11:02:40 +0200 Subject: [PATCH] fix: check unbonding delegations from delegator perspective in ExecuteAddValidator --- x/poa/keeper/keeper.go | 3 ++- x/poa/keeper/keeper_test.go | 15 ++++++++------- x/poa/testutil/expected_keepers_mock.go | 15 +++++++++++++++ x/poa/types/expected_keepers.go | 1 + 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/x/poa/keeper/keeper.go b/x/poa/keeper/keeper.go index 5a6af7bd..d4f32e52 100644 --- a/x/poa/keeper/keeper.go +++ b/x/poa/keeper/keeper.go @@ -2,6 +2,7 @@ package keeper import ( "fmt" + gomath "math" "cosmossdk.io/math" @@ -147,7 +148,7 @@ func (k Keeper) ExecuteAddValidator(ctx sdk.Context, msg *types.MsgAddValidator) // Check if address has unbonding delegations with balance // If so, return error since the account already has staking power unbondingBalance := math.ZeroInt() - ubds, err := k.sk.GetUnbondingDelegationsFromValidator(ctx, valAddress) + ubds, err := k.sk.GetUnbondingDelegations(ctx, accAddress, gomath.MaxUint16) if err != nil { return err } diff --git a/x/poa/keeper/keeper_test.go b/x/poa/keeper/keeper_test.go index 90103974..61fe5f8f 100644 --- a/x/poa/keeper/keeper_test.go +++ b/x/poa/keeper/keeper_test.go @@ -26,6 +26,7 @@ func poaKeeperTestSetup(t *testing.T) (*Keeper, sdk.Context) { }, nil).AnyTimes() stakingKeeper.EXPECT().GetValidator(ctx, gomock.Any()).Return(stakingtypes.Validator{Tokens: math.NewInt(0)}, nil).AnyTimes() stakingKeeper.EXPECT().GetAllDelegatorDelegations(ctx, gomock.Any()).Return([]stakingtypes.Delegation{}, nil).AnyTimes() + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil).AnyTimes() stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil).AnyTimes() stakingKeeper.EXPECT().SlashUnbondingDelegation(ctx, gomock.Any(), gomock.Any(), gomock.Any()).Return(math.ZeroInt(), nil).AnyTimes() stakingKeeper.EXPECT().RemoveDelegation(ctx, gomock.Any()).Return(nil).AnyTimes() @@ -249,7 +250,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { }, }, { - name: "should fail - GetUnbondingDelegationsFromValidator returns error", + name: "should fail - GetUnbondingDelegations returns error", validatorAddress: "ethm1a0pd5cyew47pvgf7rd7axxy3humv9ev0nnkprp", expectedError: errors.New("staking unbonding delegations error"), stakingMocks: func(ctx sdk.Context, stakingKeeper *testutil.MockStakingKeeper) { @@ -260,7 +261,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { stakingKeeper.EXPECT().GetAllValidators(ctx).Return([]stakingtypes.Validator{}, nil) stakingKeeper.EXPECT().GetValidator(ctx, gomock.Any()).Return(stakingtypes.Validator{Tokens: math.NewInt(0)}, nil) stakingKeeper.EXPECT().GetAllDelegatorDelegations(ctx, gomock.Any()).Return([]stakingtypes.Delegation{}, nil) - stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, errors.New("staking unbonding delegations error")) + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, errors.New("staking unbonding delegations error")) }, bankMocks: func(ctx sdk.Context, bankKeeper *testutil.MockBankKeeper) { bankKeeper.EXPECT().GetBalance(ctx, gomock.Any(), gomock.Any()).Return(sdk.Coin{ @@ -281,7 +282,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { stakingKeeper.EXPECT().GetAllValidators(ctx).Return([]stakingtypes.Validator{}, nil) stakingKeeper.EXPECT().GetValidator(ctx, gomock.Any()).Return(stakingtypes.Validator{Tokens: math.NewInt(0)}, nil) stakingKeeper.EXPECT().GetAllDelegatorDelegations(ctx, gomock.Any()).Return([]stakingtypes.Delegation{}, nil) - stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{ + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{ { Entries: []stakingtypes.UnbondingDelegationEntry{ { @@ -310,7 +311,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { stakingKeeper.EXPECT().GetAllValidators(ctx).Return([]stakingtypes.Validator{}, nil) stakingKeeper.EXPECT().GetValidator(ctx, gomock.Any()).Return(stakingtypes.Validator{Tokens: math.NewInt(0)}, nil) stakingKeeper.EXPECT().GetAllDelegatorDelegations(ctx, gomock.Any()).Return([]stakingtypes.Delegation{}, nil) - stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) }, bankMocks: func(ctx sdk.Context, bankKeeper *testutil.MockBankKeeper) { bankKeeper.EXPECT().GetBalance(ctx, gomock.Any(), gomock.Any()).Return(sdk.Coin{ @@ -332,7 +333,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { stakingKeeper.EXPECT().GetAllValidators(ctx).Return([]stakingtypes.Validator{}, nil) stakingKeeper.EXPECT().GetValidator(ctx, gomock.Any()).Return(stakingtypes.Validator{Tokens: math.NewInt(0)}, nil) stakingKeeper.EXPECT().GetAllDelegatorDelegations(ctx, gomock.Any()).Return([]stakingtypes.Delegation{}, nil) - stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) }, bankMocks: func(ctx sdk.Context, bankKeeper *testutil.MockBankKeeper) { bankKeeper.EXPECT().GetBalance(ctx, gomock.Any(), gomock.Any()).Return(sdk.Coin{ @@ -355,7 +356,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { stakingKeeper.EXPECT().GetAllValidators(ctx).Return([]stakingtypes.Validator{}, nil) stakingKeeper.EXPECT().GetValidator(ctx, gomock.Any()).Return(stakingtypes.Validator{Tokens: math.NewInt(0)}, nil) stakingKeeper.EXPECT().GetAllDelegatorDelegations(ctx, gomock.Any()).Return([]stakingtypes.Delegation{}, nil) - stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) }, bankMocks: func(ctx sdk.Context, bankKeeper *testutil.MockBankKeeper) { bankKeeper.EXPECT().GetBalance(ctx, gomock.Any(), gomock.Any()).Return(sdk.Coin{ @@ -385,7 +386,7 @@ func TestKeeper_ExecuteAddValidator(t *testing.T) { Shares: sdk.DefaultPowerReduction.ToLegacyDec(), }, }, nil) - stakingKeeper.EXPECT().GetUnbondingDelegationsFromValidator(ctx, gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) + stakingKeeper.EXPECT().GetUnbondingDelegations(ctx, gomock.Any(), gomock.Any()).Return([]stakingtypes.UnbondingDelegation{}, nil) }, bankMocks: func(ctx sdk.Context, bankKeeper *testutil.MockBankKeeper) { bankKeeper.EXPECT().GetBalance(ctx, gomock.Any(), gomock.Any()).Return(sdk.Coin{ diff --git a/x/poa/testutil/expected_keepers_mock.go b/x/poa/testutil/expected_keepers_mock.go index 203a15cd..0aee78be 100644 --- a/x/poa/testutil/expected_keepers_mock.go +++ b/x/poa/testutil/expected_keepers_mock.go @@ -284,6 +284,21 @@ func (mr *MockStakingKeeperMockRecorder) GetParams(ctx interface{}) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetParams", reflect.TypeOf((*MockStakingKeeper)(nil).GetParams), ctx) } +// GetUnbondingDelegations mocks base method. +func (m *MockStakingKeeper) GetUnbondingDelegations(ctx context.Context, delegator types.AccAddress, maxRetrieve uint16) ([]types1.UnbondingDelegation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUnbondingDelegations", ctx, delegator, maxRetrieve) + ret0, _ := ret[0].([]types1.UnbondingDelegation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUnbondingDelegations indicates an expected call of GetUnbondingDelegations. +func (mr *MockStakingKeeperMockRecorder) GetUnbondingDelegations(ctx, delegator, maxRetrieve interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnbondingDelegations", reflect.TypeOf((*MockStakingKeeper)(nil).GetUnbondingDelegations), ctx, delegator, maxRetrieve) +} + // GetUnbondingDelegationsFromValidator mocks base method. func (m *MockStakingKeeper) GetUnbondingDelegationsFromValidator(ctx context.Context, validator types.ValAddress) ([]types1.UnbondingDelegation, error) { m.ctrl.T.Helper() diff --git a/x/poa/types/expected_keepers.go b/x/poa/types/expected_keepers.go index 6578a32a..d861775e 100644 --- a/x/poa/types/expected_keepers.go +++ b/x/poa/types/expected_keepers.go @@ -36,6 +36,7 @@ type StakingKeeper interface { GetAllValidators(ctx context.Context) (validators []stakingtypes.Validator, err error) GetAllDelegations(ctx context.Context) (delegations []stakingtypes.Delegation, err error) GetAllDelegatorDelegations(ctx context.Context, delegator sdk.AccAddress) ([]stakingtypes.Delegation, error) + GetUnbondingDelegations(ctx context.Context, delegator sdk.AccAddress, maxRetrieve uint16) ([]stakingtypes.UnbondingDelegation, error) GetUnbondingDelegationsFromValidator(ctx context.Context, validator sdk.ValAddress) ([]stakingtypes.UnbondingDelegation, error) SlashUnbondingDelegation(ctx context.Context, ubd stakingtypes.UnbondingDelegation, infractionHeight int64, slashFactor math.LegacyDec) (totalSlashAmount math.Int, err error) RemoveDelegation(ctx context.Context, delegation stakingtypes.Delegation) error