fix(sims): skip operations that use denoms that can't be sent (#20399)

This commit is contained in:
Facundo Medica 2024-05-15 12:19:10 +02:00 committed by GitHub
parent 080229f300
commit 74f44b0231
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 53 additions and 3 deletions

View File

@ -9,8 +9,8 @@ import (
json "encoding/json"
reflect "reflect"
legacy "cosmossdk.io/core/legacy"
client "github.com/cosmos/cosmos-sdk/client"
codec "github.com/cosmos/cosmos-sdk/codec"
types "github.com/cosmos/cosmos-sdk/types"
module "github.com/cosmos/cosmos-sdk/types/module"
gomock "github.com/golang/mock/gomock"
@ -67,7 +67,7 @@ func (mr *MockAppModuleBasicMockRecorder) RegisterGRPCGatewayRoutes(arg0, arg1 i
}
// RegisterLegacyAminoCodec mocks base method.
func (m *MockAppModuleBasic) RegisterLegacyAminoCodec(arg0 *codec.LegacyAmino) {
func (m *MockAppModuleBasic) RegisterLegacyAminoCodec(arg0 legacy.Amino) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "RegisterLegacyAminoCodec", arg0)
}
@ -265,7 +265,7 @@ func (m *MockHasAminoCodec) EXPECT() *MockHasAminoCodecMockRecorder {
}
// RegisterLegacyAminoCodec mocks base method.
func (m *MockHasAminoCodec) RegisterLegacyAminoCodec(arg0 *codec.LegacyAmino) {
func (m *MockHasAminoCodec) RegisterLegacyAminoCodec(arg0 legacy.Amino) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "RegisterLegacyAminoCodec", arg0)
}

View File

@ -158,6 +158,18 @@ func SimulateMsgWithdrawDelegatorReward(txConfig client.TxConfig, ak types.Accou
msg := types.NewMsgWithdrawDelegatorReward(addr, validator.GetOperator())
// get outstanding rewards so we can first check if the withdrawable coins are sendable
outstanding, err := k.GetValidatorOutstandingRewardsCoins(ctx, sdk.ValAddress(delAddr))
if err != nil {
return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(&types.MsgWithdrawDelegatorReward{}), "error getting outstanding rewards"), nil, err
}
for _, v := range outstanding {
if !bk.IsSendEnabledDenom(ctx, v.Denom) {
return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(msg), "denom send not enabled: "+v.Denom), nil, nil
}
}
txCtx := simulation.OperationInput{
R: r,
App: app,

View File

@ -156,6 +156,20 @@ func (mr *MockBankKeeperMockRecorder) GetAllBalances(ctx, addr interface{}) *gom
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllBalances", reflect.TypeOf((*MockBankKeeper)(nil).GetAllBalances), ctx, addr)
}
// IsSendEnabledDenom mocks base method.
func (m *MockBankKeeper) IsSendEnabledDenom(ctx context.Context, denom string) bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "IsSendEnabledDenom", ctx, denom)
ret0, _ := ret[0].(bool)
return ret0
}
// IsSendEnabledDenom indicates an expected call of IsSendEnabledDenom.
func (mr *MockBankKeeperMockRecorder) IsSendEnabledDenom(ctx, denom interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSendEnabledDenom", reflect.TypeOf((*MockBankKeeper)(nil).IsSendEnabledDenom), ctx, denom)
}
// MintCoins mocks base method.
func (m *MockBankKeeper) MintCoins(ctx context.Context, moduleName string, amt types0.Coins) error {
m.ctrl.T.Helper()

View File

@ -31,6 +31,7 @@ type BankKeeper interface {
SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
BlockedAddr(addr sdk.AccAddress) bool
IsSendEnabledDenom(ctx context.Context, denom string) bool
}
// PoolKeeper defines the expected interface needed to fund & distribute pool balances.

View File

@ -450,6 +450,10 @@ func SimulateMsgUndelegate(
delAddr, val.GetOperator(), sdk.NewCoin(bondDenom, unbondAmt),
)
if !bk.IsSendEnabledDenom(ctx, bondDenom) {
return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(msg), "bond denom send not enabled"), nil, nil
}
// need to retrieve the simulation account associated with delegation to retrieve PrivKey
var simAccount simtypes.Account
@ -712,6 +716,10 @@ func SimulateMsgBeginRedelegate(
return simtypes.NoOpMsg(types.ModuleName, msgType, "bond denom not found"), nil, err
}
if !bk.IsSendEnabledDenom(ctx, bondDenom) {
return simtypes.NoOpMsg(types.ModuleName, msgType, "bond denom send not enabled"), nil, nil
}
msg := types.NewMsgBeginRedelegate(
delAddr, srcVal.GetOperator(), destVal.GetOperator(),
sdk.NewCoin(bondDenom, redAmt),

View File

@ -202,6 +202,20 @@ func (mr *MockBankKeeperMockRecorder) GetSupply(ctx, denom interface{}) *gomock.
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSupply", reflect.TypeOf((*MockBankKeeper)(nil).GetSupply), ctx, denom)
}
// IsSendEnabledDenom mocks base method.
func (m *MockBankKeeper) IsSendEnabledDenom(ctx context.Context, denom string) bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "IsSendEnabledDenom", ctx, denom)
ret0, _ := ret[0].(bool)
return ret0
}
// IsSendEnabledDenom indicates an expected call of IsSendEnabledDenom.
func (mr *MockBankKeeperMockRecorder) IsSendEnabledDenom(ctx, denom interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSendEnabledDenom", reflect.TypeOf((*MockBankKeeper)(nil).IsSendEnabledDenom), ctx, denom)
}
// LockedCoins mocks base method.
func (m *MockBankKeeper) LockedCoins(ctx context.Context, addr types2.AccAddress) types2.Coins {
m.ctrl.T.Helper()

View File

@ -40,6 +40,7 @@ type BankKeeper interface {
DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
BurnCoins(context.Context, []byte, sdk.Coins) error
IsSendEnabledDenom(ctx context.Context, denom string) bool
}
// ValidatorSet expected properties for the set of all validators (noalias)