From 258f01058298e151540d616b771de26a97fbeb8c Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Mar 2025 12:28:59 -0400 Subject: [PATCH 01/18] add func --- x/distribution/keeper/abci.go | 41 +++++++++++++++++++++++++++++ x/distribution/keeper/allocation.go | 28 ++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 x/distribution/keeper/abci.go diff --git a/x/distribution/keeper/abci.go b/x/distribution/keeper/abci.go new file mode 100644 index 000000000000..8d29973a53ca --- /dev/null +++ b/x/distribution/keeper/abci.go @@ -0,0 +1,41 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/telemetry" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +// BeginBlocker sets the proposer for determining distribution during endblock +// and distribute rewards for the previous block. +func (k Keeper) BeginBlocker(ctx sdk.Context) error { + start := telemetry.Now() + defer telemetry.ModuleMeasureSince(types.ModuleName, start, telemetry.MetricKeyBeginBlocker) + + // determine the total power signing the block + var previousTotalPower int64 + // determine the total power signing the block + for _, voteInfo := range ctx.VoteInfos() { + previousTotalPower += voteInfo.Validator.Power + } + + // TODO this is Tendermint-dependent + // ref https://github.com/cosmos/cosmos-sdk/issues/3095 + height := ctx.BlockHeight() + if height > 1 { + if err := k.AllocateTokens(ctx, previousTotalPower, ctx.VoteInfos()); err != nil { + return err + } + + // every 1000 blocks send whole coins from community pool to x/protocolpool if enabled + if height%1000 == 0 && k.protocolPoolEnabled { + if err := k.sendCommunityPoolToProtocolPool(ctx); err != nil { + return err + } + } + } + + // record the proposer for when we payout on the next block + consAddr := sdk.ConsAddress(ctx.BlockHeader().ProposerAddress) + return k.SetPreviousProposerConsAddr(ctx, consAddr) +} diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 83db0ae72e20..6b54fe644581 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -2,6 +2,7 @@ package keeper import ( "context" + protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" abci "github.com/cometbft/cometbft/abci/types" @@ -141,3 +142,30 @@ func (k Keeper) AllocateTokensToValidator(ctx context.Context, val stakingtypes. outstanding.Rewards = outstanding.Rewards.Add(tokens...) return k.SetValidatorOutstandingRewards(ctx, valBz, outstanding) } + +// sendCommunityPoolToProtocolPool does the following: +// +// truncate the community pool value (DecCoins) to sdk.Coins +// distribute from the distribution module account to the x/protocolpool account +// update the bookkept value in x/distribution +func (k Keeper) sendCommunityPoolToProtocolPool(ctx sdk.Context) error { + if k.protocolPoolEnabled { + return nil + } + + feePool, err := k.FeePool.Get(ctx) + if err != nil { + return err + } + + if feePool.CommunityPool.IsZero() { + return nil + } + + amt, re := feePool.CommunityPool.TruncateDecimal() + if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, protocolpooltypes.ProtocolPoolDistrAccount, amt); err != nil { + return err + } + + return k.FeePool.Set(ctx, types.FeePool{CommunityPool: re}) +} From ee0acc809cbdae33eb33964f1d7e370f63c4deea Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Mar 2025 12:57:47 -0400 Subject: [PATCH 02/18] setup --- x/distribution/keeper/abci.go | 6 +- x/distribution/keeper/abci_test.go | 314 +++++++++++++++++++++++++++++ 2 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 x/distribution/keeper/abci_test.go diff --git a/x/distribution/keeper/abci.go b/x/distribution/keeper/abci.go index 8d29973a53ca..7f30c5ae35ab 100644 --- a/x/distribution/keeper/abci.go +++ b/x/distribution/keeper/abci.go @@ -6,6 +6,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/types" ) +const truncationBlockInterval = 1000 + // BeginBlocker sets the proposer for determining distribution during endblock // and distribute rewards for the previous block. func (k Keeper) BeginBlocker(ctx sdk.Context) error { @@ -28,14 +30,14 @@ func (k Keeper) BeginBlocker(ctx sdk.Context) error { } // every 1000 blocks send whole coins from community pool to x/protocolpool if enabled - if height%1000 == 0 && k.protocolPoolEnabled { + if height%truncationBlockInterval == 0 && k.protocolPoolEnabled { if err := k.sendCommunityPoolToProtocolPool(ctx); err != nil { return err } } } - // record the proposer for when we payout on the next block + // record the proposer for when we pay out on the next block consAddr := sdk.ConsAddress(ctx.BlockHeader().ProposerAddress) return k.SetPreviousProposerConsAddr(ctx, consAddr) } diff --git a/x/distribution/keeper/abci_test.go b/x/distribution/keeper/abci_test.go new file mode 100644 index 000000000000..34069e033301 --- /dev/null +++ b/x/distribution/keeper/abci_test.go @@ -0,0 +1,314 @@ +package keeper_test + +import ( + "testing" + "time" + + abci "github.com/cometbft/cometbft/abci/types" + cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + + "cosmossdk.io/math" + storetypes "cosmossdk.io/store/types" + + "github.com/cosmos/cosmos-sdk/codec/address" + "github.com/cosmos/cosmos-sdk/runtime" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtestutil "github.com/cosmos/cosmos-sdk/x/distribution/testutil" + disttypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +func TestBeginBlockNoOp(t *testing.T) { + ctrl := gomock.NewController(t) + key := storetypes.NewKVStoreKey(disttypes.StoreKey) + storeService := runtime.NewKVStoreService(key) + testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) + encCfg := moduletestutil.MakeTestEncodingConfig(distribution.AppModuleBasic{}) + ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: time.Now()}).WithBlockHeight(0) + + bankKeeper := distrtestutil.NewMockBankKeeper(ctrl) + stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) + accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) + + accountKeeper.EXPECT().GetModuleAddress(disttypes.ModuleName).Return(distrAcc.GetAddress()) + + distrKeeper := keeper.NewKeeper( + encCfg.Codec, + storeService, + accountKeeper, + bankKeeper, + stakingKeeper, + "fee_collector", + authtypes.NewModuleAddress("gov").String(), + ) + + err := distrKeeper.BeginBlocker(ctx) + require.NoError(t, err) + + // check cons address +} + +func TestBeginBlockToManyValidators(t *testing.T) { + ctrl := gomock.NewController(t) + key := storetypes.NewKVStoreKey(disttypes.StoreKey) + storeService := runtime.NewKVStoreService(key) + testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) + encCfg := moduletestutil.MakeTestEncodingConfig(distribution.AppModuleBasic{}) + ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: time.Now()}).WithBlockHeight(1) + + bankKeeper := distrtestutil.NewMockBankKeeper(ctrl) + stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) + accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) + + feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") + accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() + + distrKeeper := keeper.NewKeeper( + encCfg.Codec, + storeService, + accountKeeper, + bankKeeper, + stakingKeeper, + "fee_collector", + authtypes.NewModuleAddress("gov").String(), + ) + + // reset fee pool & set params + require.NoError(t, distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) + require.NoError(t, distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) + + // create validator with 50% commission + valAddr0 := sdk.ValAddress(valConsAddr0) + val0, err := distrtestutil.CreateValidator(valConsPk0, math.NewInt(100)) + require.NoError(t, err) + val0.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) + stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() + + // create second validator with 0% commission + valAddr1 := sdk.ValAddress(valConsAddr1) + val1, err := distrtestutil.CreateValidator(valConsPk1, math.NewInt(100)) + require.NoError(t, err) + val1.Commission = stakingtypes.NewCommission(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) + stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() + + abciValA := abci.Validator{ + Address: valConsPk0.Address(), + Power: 100, + } + abciValB := abci.Validator{ + Address: valConsPk1.Address(), + Power: 100, + } + + // assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards + val0OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0OutstandingRewards.Rewards.IsZero()) + + val1OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1OutstandingRewards.Rewards.IsZero()) + + feePool, err := distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + require.True(t, feePool.CommunityPool.IsZero()) + + val0Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0Commission.Commission.IsZero()) + + val1Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1Commission.Commission.IsZero()) + + val0CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0CurrentRewards.Rewards.IsZero()) + + val1CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1CurrentRewards.Rewards.IsZero()) + + // allocate tokens as if both had voted and second was proposer + fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(100))) + bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) + bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) + + votes := []abci.VoteInfo{ + { + Validator: abciValA, + }, + { + Validator: abciValB, + }, + } + require.NoError(t, distrKeeper.AllocateTokens(ctx, 200, votes)) + + // 98 outstanding rewards (100 less 2 to community pool) + val0OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val0OutstandingRewards.Rewards) + + val1OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val1OutstandingRewards.Rewards) + + // 2 community pool coins + feePool, err = distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(2)}}, feePool.CommunityPool) + + // 50% commission for first proposer, (0.5 * 98%) * 100 / 2 = 23.25 + val0Commission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0Commission.Commission) + + // zero commission for second proposer + val1Commission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1Commission.Commission.IsZero()) + + // just staking.proportional for first proposer less commission = (0.5 * 98%) * 100 / 2 = 24.50 + val0CurrentRewards, err = distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0CurrentRewards.Rewards) + + // proposer reward + staking.proportional for second proposer = (0.5 * (98%)) * 100 = 49 + val1CurrentRewards, err = distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val1CurrentRewards.Rewards) +} + +func TestBeginBlockTruncation(t *testing.T) { + ctrl := gomock.NewController(t) + key := storetypes.NewKVStoreKey(disttypes.StoreKey) + storeService := runtime.NewKVStoreService(key) + testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) + encCfg := moduletestutil.MakeTestEncodingConfig(distribution.AppModuleBasic{}) + ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: time.Now()}) + + bankKeeper := distrtestutil.NewMockBankKeeper(ctrl) + stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) + accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) + + feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") + accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() + + distrKeeper := keeper.NewKeeper( + encCfg.Codec, + storeService, + accountKeeper, + bankKeeper, + stakingKeeper, + "fee_collector", + authtypes.NewModuleAddress("gov").String(), + ) + + // reset fee pool + require.NoError(t, distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) + require.NoError(t, distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) + + // create validator with 10% commission + valAddr0 := sdk.ValAddress(valConsAddr0) + val0, err := distrtestutil.CreateValidator(valConsPk0, math.NewInt(100)) + require.NoError(t, err) + val0.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) + stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() + + // create second validator with 10% commission + valAddr1 := sdk.ValAddress(valConsAddr1) + val1, err := distrtestutil.CreateValidator(valConsPk1, math.NewInt(100)) + require.NoError(t, err) + val1.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) + stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() + + // create third validator with 10% commission + valAddr2 := sdk.ValAddress(valConsAddr2) + val2, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr2).String(), valConsPk1, stakingtypes.Description{}) + require.NoError(t, err) + val2.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) + stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk2)).Return(val2, nil).AnyTimes() + + abciValA := abci.Validator{ + Address: valConsPk0.Address(), + Power: 11, + } + abciValB := abci.Validator{ + Address: valConsPk1.Address(), + Power: 10, + } + abciValC := abci.Validator{ + Address: valConsPk2.Address(), + Power: 10, + } + + // assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards + val0OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0OutstandingRewards.Rewards.IsZero()) + + val1OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1OutstandingRewards.Rewards.IsZero()) + + feePool, err := distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + require.True(t, feePool.CommunityPool.IsZero()) + + val0Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0Commission.Commission.IsZero()) + + val1Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1Commission.Commission.IsZero()) + + val0CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0CurrentRewards.Rewards.IsZero()) + + val1CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1CurrentRewards.Rewards.IsZero()) + + // allocate tokens as if both had voted and second was proposer + fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(634195840))) + bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) + bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) + + votes := []abci.VoteInfo{ + { + Validator: abciValA, + }, + { + Validator: abciValB, + }, + { + Validator: abciValC, + }, + } + require.NoError(t, distrKeeper.AllocateTokens(ctx, 31, votes)) + + val0OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0OutstandingRewards.Rewards.IsValid()) + + val1OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1OutstandingRewards.Rewards.IsValid()) + + val2OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr2) + require.NoError(t, err) + require.True(t, val2OutstandingRewards.Rewards.IsValid()) +} From 84ee43680ae8e560389a448bb11879760ed85cdc Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Mar 2025 15:32:44 -0400 Subject: [PATCH 03/18] ok --- x/distribution/abci.go | 23 +-- x/distribution/keeper/abci_test.go | 247 +++++++++++++++-------------- 2 files changed, 136 insertions(+), 134 deletions(-) diff --git a/x/distribution/abci.go b/x/distribution/abci.go index 70fdb7eeb270..9598672e38c3 100644 --- a/x/distribution/abci.go +++ b/x/distribution/abci.go @@ -1,32 +1,17 @@ package distribution import ( - "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - "github.com/cosmos/cosmos-sdk/x/distribution/types" ) // BeginBlocker sets the proposer for determining distribution during endblock // and distribute rewards for the previous block. func BeginBlocker(ctx sdk.Context, k keeper.Keeper) error { - defer telemetry.ModuleMeasureSince(types.ModuleName, telemetry.Now(), telemetry.MetricKeyBeginBlocker) - - // determine the total power signing the block - var previousTotalPower int64 - for _, voteInfo := range ctx.VoteInfos() { - previousTotalPower += voteInfo.Validator.Power - } - - // TODO this is Tendermint-dependent - // ref https://github.com/cosmos/cosmos-sdk/issues/3095 - if ctx.BlockHeight() > 1 { - if err := k.AllocateTokens(ctx, previousTotalPower, ctx.VoteInfos()); err != nil { - return err - } + if err := k.BeginBlocker(ctx); err != nil { + ctx.Logger().Error("BeginBlocker failed", "error", err) + return err } - // record the proposer for when we payout on the next block - consAddr := sdk.ConsAddress(ctx.BlockHeader().ProposerAddress) - return k.SetPreviousProposerConsAddr(ctx, consAddr) + return nil } diff --git a/x/distribution/keeper/abci_test.go b/x/distribution/keeper/abci_test.go index 34069e033301..3677039b518a 100644 --- a/x/distribution/keeper/abci_test.go +++ b/x/distribution/keeper/abci_test.go @@ -25,19 +25,37 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) -func TestBeginBlockNoOp(t *testing.T) { +var ( + testProposerAddress = sdk.ConsAddress("test") +) + +type testSetup struct { + testCtx testutil.TestContext + bankKeeper *distrtestutil.MockBankKeeper + stakingKeeper *distrtestutil.MockStakingKeeper + accountKeeper *distrtestutil.MockAccountKeeper + distrKeeper keeper.Keeper +} + +func setupTest(t *testing.T, protocolPoolEnabled bool) testSetup { + t.Helper() + ctrl := gomock.NewController(t) key := storetypes.NewKVStoreKey(disttypes.StoreKey) storeService := runtime.NewKVStoreService(key) testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) encCfg := moduletestutil.MakeTestEncodingConfig(distribution.AppModuleBasic{}) - ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: time.Now()}).WithBlockHeight(0) bankKeeper := distrtestutil.NewMockBankKeeper(ctrl) stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) - accountKeeper.EXPECT().GetModuleAddress(disttypes.ModuleName).Return(distrAcc.GetAddress()) + accountKeeper.EXPECT().GetModuleAddress(disttypes.ModuleName).Return(distrAcc.GetAddress()).Times(1) + + var opts []keeper.InitOptions + if protocolPoolEnabled { + opts = append(opts, keeper.WithProtocolPoolEnabled()) + } distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -47,268 +65,267 @@ func TestBeginBlockNoOp(t *testing.T) { stakingKeeper, "fee_collector", authtypes.NewModuleAddress("gov").String(), + opts..., ) - err := distrKeeper.BeginBlocker(ctx) + return testSetup{ + testCtx: testCtx, + bankKeeper: bankKeeper, + distrKeeper: distrKeeper, + stakingKeeper: stakingKeeper, + accountKeeper: accountKeeper, + } +} + +func TestBeginBlockNoOp(t *testing.T) { + ts := setupTest(t) + ctx := ts.testCtx.Ctx. + WithBlockHeader(cmtproto.Header{ + ProposerAddress: testProposerAddress, + Time: time.Now(), + }). + WithBlockHeight(0) + + err := ts.distrKeeper.BeginBlocker(ctx) require.NoError(t, err) // check cons address + got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) + require.NoError(t, err) + require.Equal(t, testProposerAddress, got) } func TestBeginBlockToManyValidators(t *testing.T) { - ctrl := gomock.NewController(t) - key := storetypes.NewKVStoreKey(disttypes.StoreKey) - storeService := runtime.NewKVStoreService(key) - testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) - encCfg := moduletestutil.MakeTestEncodingConfig(distribution.AppModuleBasic{}) - ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: time.Now()}).WithBlockHeight(1) + ts := setupTest(t) - bankKeeper := distrtestutil.NewMockBankKeeper(ctrl) - stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) - accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) + ctx := ts.testCtx.Ctx. + WithBlockHeader(cmtproto.Header{ + ProposerAddress: testProposerAddress, + Time: time.Now(), + }) feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") - accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) - accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) - stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() - - distrKeeper := keeper.NewKeeper( - encCfg.Codec, - storeService, - accountKeeper, - bankKeeper, - stakingKeeper, - "fee_collector", - authtypes.NewModuleAddress("gov").String(), - ) + ts.accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) + ts.stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() // reset fee pool & set params - require.NoError(t, distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) - require.NoError(t, distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) + require.NoError(t, ts.distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) + require.NoError(t, ts.distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) // create validator with 50% commission valAddr0 := sdk.ValAddress(valConsAddr0) val0, err := distrtestutil.CreateValidator(valConsPk0, math.NewInt(100)) require.NoError(t, err) val0.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) - stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() // create second validator with 0% commission valAddr1 := sdk.ValAddress(valConsAddr1) val1, err := distrtestutil.CreateValidator(valConsPk1, math.NewInt(100)) require.NoError(t, err) val1.Commission = stakingtypes.NewCommission(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) - stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() - - abciValA := abci.Validator{ - Address: valConsPk0.Address(), - Power: 100, - } - abciValB := abci.Validator{ - Address: valConsPk1.Address(), - Power: 100, - } + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() // assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards - val0OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + val0OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) require.NoError(t, err) require.True(t, val0OutstandingRewards.Rewards.IsZero()) - val1OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + val1OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) require.NoError(t, err) require.True(t, val1OutstandingRewards.Rewards.IsZero()) - feePool, err := distrKeeper.FeePool.Get(ctx) + feePool, err := ts.distrKeeper.FeePool.Get(ctx) require.NoError(t, err) require.True(t, feePool.CommunityPool.IsZero()) - val0Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + val0Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) require.NoError(t, err) require.True(t, val0Commission.Commission.IsZero()) - val1Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + val1Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) require.NoError(t, err) require.True(t, val1Commission.Commission.IsZero()) - val0CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + val0CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) require.NoError(t, err) require.True(t, val0CurrentRewards.Rewards.IsZero()) - val1CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + val1CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) require.NoError(t, err) require.True(t, val1CurrentRewards.Rewards.IsZero()) // allocate tokens as if both had voted and second was proposer fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(100))) - bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) - bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) + ts.bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) + ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) votes := []abci.VoteInfo{ { - Validator: abciValA, + Validator: abci.Validator{ + Address: valConsPk0.Address(), + Power: 100, + }, }, { - Validator: abciValB, + Validator: abci.Validator{ + Address: valConsPk1.Address(), + Power: 100, + }, }, } - require.NoError(t, distrKeeper.AllocateTokens(ctx, 200, votes)) + ctx = ctx.WithVoteInfos(votes).WithBlockHeight(2) + + require.NoError(t, ts.distrKeeper.BeginBlocker(ctx)) // 98 outstanding rewards (100 less 2 to community pool) - val0OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + val0OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) require.NoError(t, err) require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val0OutstandingRewards.Rewards) - val1OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + val1OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) require.NoError(t, err) require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val1OutstandingRewards.Rewards) // 2 community pool coins - feePool, err = distrKeeper.FeePool.Get(ctx) + feePool, err = ts.distrKeeper.FeePool.Get(ctx) require.NoError(t, err) require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(2)}}, feePool.CommunityPool) // 50% commission for first proposer, (0.5 * 98%) * 100 / 2 = 23.25 - val0Commission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + val0Commission, err = ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) require.NoError(t, err) require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0Commission.Commission) // zero commission for second proposer - val1Commission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + val1Commission, err = ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) require.NoError(t, err) require.True(t, val1Commission.Commission.IsZero()) // just staking.proportional for first proposer less commission = (0.5 * 98%) * 100 / 2 = 24.50 - val0CurrentRewards, err = distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + val0CurrentRewards, err = ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) require.NoError(t, err) require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0CurrentRewards.Rewards) // proposer reward + staking.proportional for second proposer = (0.5 * (98%)) * 100 = 49 - val1CurrentRewards, err = distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + val1CurrentRewards, err = ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) require.NoError(t, err) require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val1CurrentRewards.Rewards) + + // check cons address + got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) + require.NoError(t, err) + require.Equal(t, testProposerAddress, got) } func TestBeginBlockTruncation(t *testing.T) { - ctrl := gomock.NewController(t) - key := storetypes.NewKVStoreKey(disttypes.StoreKey) - storeService := runtime.NewKVStoreService(key) - testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) - encCfg := moduletestutil.MakeTestEncodingConfig(distribution.AppModuleBasic{}) - ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: time.Now()}) - - bankKeeper := distrtestutil.NewMockBankKeeper(ctrl) - stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) - accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) + ts := setupTest(t) + ctx := ts.testCtx.Ctx. + WithBlockHeader(cmtproto.Header{ + ProposerAddress: testProposerAddress, + Time: time.Now(), + }) feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") - accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) - accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) - stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() - - distrKeeper := keeper.NewKeeper( - encCfg.Codec, - storeService, - accountKeeper, - bankKeeper, - stakingKeeper, - "fee_collector", - authtypes.NewModuleAddress("gov").String(), - ) + ts.accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) + ts.stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() // reset fee pool - require.NoError(t, distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) - require.NoError(t, distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) + require.NoError(t, ts.distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) + require.NoError(t, ts.distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) // create validator with 10% commission valAddr0 := sdk.ValAddress(valConsAddr0) val0, err := distrtestutil.CreateValidator(valConsPk0, math.NewInt(100)) require.NoError(t, err) val0.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) - stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() // create second validator with 10% commission valAddr1 := sdk.ValAddress(valConsAddr1) val1, err := distrtestutil.CreateValidator(valConsPk1, math.NewInt(100)) require.NoError(t, err) val1.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) - stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() // create third validator with 10% commission valAddr2 := sdk.ValAddress(valConsAddr2) val2, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr2).String(), valConsPk1, stakingtypes.Description{}) require.NoError(t, err) val2.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) - stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk2)).Return(val2, nil).AnyTimes() - - abciValA := abci.Validator{ - Address: valConsPk0.Address(), - Power: 11, - } - abciValB := abci.Validator{ - Address: valConsPk1.Address(), - Power: 10, - } - abciValC := abci.Validator{ - Address: valConsPk2.Address(), - Power: 10, - } + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk2)).Return(val2, nil).AnyTimes() // assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards - val0OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + val0OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) require.NoError(t, err) require.True(t, val0OutstandingRewards.Rewards.IsZero()) - val1OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + val1OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) require.NoError(t, err) require.True(t, val1OutstandingRewards.Rewards.IsZero()) - feePool, err := distrKeeper.FeePool.Get(ctx) + feePool, err := ts.distrKeeper.FeePool.Get(ctx) require.NoError(t, err) require.True(t, feePool.CommunityPool.IsZero()) - val0Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + val0Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) require.NoError(t, err) require.True(t, val0Commission.Commission.IsZero()) - val1Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + val1Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) require.NoError(t, err) require.True(t, val1Commission.Commission.IsZero()) - val0CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + val0CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) require.NoError(t, err) require.True(t, val0CurrentRewards.Rewards.IsZero()) - val1CurrentRewards, err := distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + val1CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) require.NoError(t, err) require.True(t, val1CurrentRewards.Rewards.IsZero()) // allocate tokens as if both had voted and second was proposer fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(634195840))) - bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) - bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) + ts.bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) + ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) votes := []abci.VoteInfo{ { - Validator: abciValA, + Validator: abci.Validator{ + Address: valConsPk0.Address(), + Power: 11, + }, }, { - Validator: abciValB, + Validator: abci.Validator{ + Address: valConsPk1.Address(), + Power: 10, + }, }, { - Validator: abciValC, + Validator: abci.Validator{ + Address: valConsPk2.Address(), + Power: 10, + }, }, } - require.NoError(t, distrKeeper.AllocateTokens(ctx, 31, votes)) + ctx = ctx.WithVoteInfos(votes).WithBlockHeight(2) + require.NoError(t, ts.distrKeeper.BeginBlocker(ctx)) - val0OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + val0OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) require.NoError(t, err) require.True(t, val0OutstandingRewards.Rewards.IsValid()) - val1OutstandingRewards, err = distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + val1OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) require.NoError(t, err) require.True(t, val1OutstandingRewards.Rewards.IsValid()) - val2OutstandingRewards, err := distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr2) + val2OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr2) require.NoError(t, err) require.True(t, val2OutstandingRewards.Rewards.IsValid()) + + // check cons address + got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) + require.NoError(t, err) + require.Equal(t, testProposerAddress, got) } From 7e06a8766a8175c6b74bf0e1a1405e04436300fa Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Mar 2025 16:40:59 -0400 Subject: [PATCH 04/18] actually test --- x/distribution/keeper/abci_test.go | 330 +++++++++++++++++++++++++-- x/distribution/keeper/allocation.go | 4 - x/distribution/keeper/common_test.go | 5 +- 3 files changed, 318 insertions(+), 21 deletions(-) diff --git a/x/distribution/keeper/abci_test.go b/x/distribution/keeper/abci_test.go index 3677039b518a..d1e11a6e4019 100644 --- a/x/distribution/keeper/abci_test.go +++ b/x/distribution/keeper/abci_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "fmt" "testing" "time" @@ -22,6 +23,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtestutil "github.com/cosmos/cosmos-sdk/x/distribution/testutil" disttypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -50,11 +52,15 @@ func setupTest(t *testing.T, protocolPoolEnabled bool) testSetup { stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl) accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) - accountKeeper.EXPECT().GetModuleAddress(disttypes.ModuleName).Return(distrAcc.GetAddress()).Times(1) + accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc).AnyTimes() + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() + accountKeeper.EXPECT().GetModuleAddress(disttypes.ModuleName).Return(distrAcc.GetAddress()).AnyTimes() - var opts []keeper.InitOptions + var opts []keeper.InitOption if protocolPoolEnabled { opts = append(opts, keeper.WithProtocolPoolEnabled()) + // expect that we will verify that this module account is set + accountKeeper.EXPECT().GetModuleAddress(protocolpooltypes.ModuleName).Return(protocolPoolAcc.GetAddress()).AnyTimes() } distrKeeper := keeper.NewKeeper( @@ -68,6 +74,11 @@ func setupTest(t *testing.T, protocolPoolEnabled bool) testSetup { opts..., ) + err := distrKeeper.FeePool.Set(testCtx.Ctx, disttypes.FeePool{ + CommunityPool: sdk.NewDecCoins(), + }) + require.NoError(t, err) + return testSetup{ testCtx: testCtx, bankKeeper: bankKeeper, @@ -78,7 +89,7 @@ func setupTest(t *testing.T, protocolPoolEnabled bool) testSetup { } func TestBeginBlockNoOp(t *testing.T) { - ts := setupTest(t) + ts := setupTest(t, false) ctx := ts.testCtx.Ctx. WithBlockHeader(cmtproto.Header{ ProposerAddress: testProposerAddress, @@ -86,8 +97,14 @@ func TestBeginBlockNoOp(t *testing.T) { }). WithBlockHeight(0) - err := ts.distrKeeper.BeginBlocker(ctx) + feePoolBefore, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + err = ts.distrKeeper.BeginBlocker(ctx) require.NoError(t, err) + feePoolAfter, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + + require.True(t, feePoolBefore.CommunityPool.Equal(feePoolAfter.CommunityPool), fmt.Sprintf("before: %s, after: %s", feePoolBefore.CommunityPool.String(), feePoolAfter.CommunityPool.String())) // check cons address got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) @@ -96,7 +113,7 @@ func TestBeginBlockNoOp(t *testing.T) { } func TestBeginBlockToManyValidators(t *testing.T) { - ts := setupTest(t) + ts := setupTest(t, false) ctx := ts.testCtx.Ctx. WithBlockHeader(cmtproto.Header{ @@ -104,10 +121,6 @@ func TestBeginBlockToManyValidators(t *testing.T) { Time: time.Now(), }) - feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") - ts.accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) - ts.stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() - // reset fee pool & set params require.NoError(t, ts.distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) require.NoError(t, ts.distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) @@ -176,7 +189,14 @@ func TestBeginBlockToManyValidators(t *testing.T) { } ctx = ctx.WithVoteInfos(votes).WithBlockHeight(2) - require.NoError(t, ts.distrKeeper.BeginBlocker(ctx)) + feePoolBefore, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + err = ts.distrKeeper.BeginBlocker(ctx) + require.NoError(t, err) + feePoolAfter, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + + require.False(t, feePoolBefore.CommunityPool.Equal(feePoolAfter.CommunityPool), fmt.Sprintf("before: %s, after: %s", feePoolBefore.CommunityPool.String(), feePoolAfter.CommunityPool.String())) // 98 outstanding rewards (100 less 2 to community pool) val0OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) @@ -219,17 +239,13 @@ func TestBeginBlockToManyValidators(t *testing.T) { } func TestBeginBlockTruncation(t *testing.T) { - ts := setupTest(t) + ts := setupTest(t, false) ctx := ts.testCtx.Ctx. WithBlockHeader(cmtproto.Header{ ProposerAddress: testProposerAddress, Time: time.Now(), }) - feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") - ts.accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) - ts.stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() - // reset fee pool require.NoError(t, ts.distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) require.NoError(t, ts.distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) @@ -286,6 +302,7 @@ func TestBeginBlockTruncation(t *testing.T) { // allocate tokens as if both had voted and second was proposer fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(634195840))) + expectedCommunityPool := sdk.NewDecCoins(sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, math.LegacyMustNewDecFromStr("12683916.800000001243023848"))) ts.bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) @@ -310,7 +327,288 @@ func TestBeginBlockTruncation(t *testing.T) { }, } ctx = ctx.WithVoteInfos(votes).WithBlockHeight(2) - require.NoError(t, ts.distrKeeper.BeginBlocker(ctx)) + + feePoolBefore, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + err = ts.distrKeeper.BeginBlocker(ctx) + require.NoError(t, err) + feePoolAfter, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + + require.False(t, feePoolBefore.CommunityPool.Equal(feePoolAfter.CommunityPool), fmt.Sprintf("before: %s, after: %s", feePoolBefore.CommunityPool.String(), feePoolAfter.CommunityPool.String())) + require.True(t, feePoolAfter.CommunityPool.Equal(expectedCommunityPool)) + + val0OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0OutstandingRewards.Rewards.IsValid()) + + val1OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1OutstandingRewards.Rewards.IsValid()) + + val2OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr2) + require.NoError(t, err) + require.True(t, val2OutstandingRewards.Rewards.IsValid()) + + // check cons address + got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) + require.NoError(t, err) + require.Equal(t, testProposerAddress, got) +} + +func TestBeginBlockNoOpProtocolPool(t *testing.T) { + ts := setupTest(t, true) + ctx := ts.testCtx.Ctx. + WithBlockHeader(cmtproto.Header{ + ProposerAddress: testProposerAddress, + Time: time.Now(), + }). + WithBlockHeight(0) + + feePoolBefore, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + err = ts.distrKeeper.BeginBlocker(ctx) + require.NoError(t, err) + feePoolAfter, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + + require.True(t, feePoolBefore.CommunityPool.Equal(feePoolAfter.CommunityPool), fmt.Sprintf("before: %s, after: %s", feePoolBefore.CommunityPool.String(), feePoolAfter.CommunityPool.String())) + + // check cons address + got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) + require.NoError(t, err) + require.Equal(t, testProposerAddress, got) +} + +func TestBeginBlockToManyValidatorsProtocolPool(t *testing.T) { + ts := setupTest(t, true) + + ctx := ts.testCtx.Ctx. + WithBlockHeader(cmtproto.Header{ + ProposerAddress: testProposerAddress, + Time: time.Now(), + }) + + // reset fee pool & set params + require.NoError(t, ts.distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) + require.NoError(t, ts.distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) + + // create validator with 50% commission + valAddr0 := sdk.ValAddress(valConsAddr0) + val0, err := distrtestutil.CreateValidator(valConsPk0, math.NewInt(100)) + require.NoError(t, err) + val0.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() + + // create second validator with 0% commission + valAddr1 := sdk.ValAddress(valConsAddr1) + val1, err := distrtestutil.CreateValidator(valConsPk1, math.NewInt(100)) + require.NoError(t, err) + val1.Commission = stakingtypes.NewCommission(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() + + // assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards + val0OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0OutstandingRewards.Rewards.IsZero()) + + val1OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1OutstandingRewards.Rewards.IsZero()) + + feePool, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + require.True(t, feePool.CommunityPool.IsZero()) + + val0Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0Commission.Commission.IsZero()) + + val1Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1Commission.Commission.IsZero()) + + val0CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0CurrentRewards.Rewards.IsZero()) + + val1CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1CurrentRewards.Rewards.IsZero()) + + // allocate tokens as if both had voted and second was proposer + fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(100))) + ts.bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) + ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees).AnyTimes() + + votes := []abci.VoteInfo{ + { + Validator: abci.Validator{ + Address: valConsPk0.Address(), + Power: 100, + }, + }, + { + Validator: abci.Validator{ + Address: valConsPk1.Address(), + Power: 100, + }, + }, + } + + ctx = ctx.WithVoteInfos(votes).WithBlockHeight(1000) + + // expect to send to the protocol pool module + ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), disttypes.ModuleName, protocolpooltypes.ProtocolPoolDistrAccount, sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 2))).Return(nil).Times(1) + + feePoolBefore, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + err = ts.distrKeeper.BeginBlocker(ctx) + require.NoError(t, err) + feePoolAfter, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + + // we should fully remove everything that was in the community pool (2stake) + require.True(t, feePoolBefore.CommunityPool.Equal(feePoolAfter.CommunityPool), fmt.Sprintf("before: %s, after: %s", feePoolBefore.CommunityPool.String(), feePoolAfter.CommunityPool.String())) + + // 98 outstanding rewards (100 less 2 to community pool) + val0OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val0OutstandingRewards.Rewards) + + val1OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val1OutstandingRewards.Rewards) + + // 50% commission for first proposer, (0.5 * 98%) * 100 / 2 = 23.25 + val0Commission, err = ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0Commission.Commission) + + // zero commission for second proposer + val1Commission, err = ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1Commission.Commission.IsZero()) + + // just staking.proportional for first proposer less commission = (0.5 * 98%) * 100 / 2 = 24.50 + val0CurrentRewards, err = ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0CurrentRewards.Rewards) + + // proposer reward + staking.proportional for second proposer = (0.5 * (98%)) * 100 = 49 + val1CurrentRewards, err = ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + require.NoError(t, err) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(490, 1)}}, val1CurrentRewards.Rewards) + + // check cons address + got, err := ts.distrKeeper.GetPreviousProposerConsAddr(ctx) + require.NoError(t, err) + require.Equal(t, testProposerAddress, got) +} + +func TestBeginBlockTruncationProtocolPool(t *testing.T) { + ts := setupTest(t, true) + ctx := ts.testCtx.Ctx. + WithBlockHeader(cmtproto.Header{ + ProposerAddress: testProposerAddress, + Time: time.Now(), + }) + + // reset fee pool + require.NoError(t, ts.distrKeeper.FeePool.Set(ctx, disttypes.InitialFeePool())) + require.NoError(t, ts.distrKeeper.Params.Set(ctx, disttypes.DefaultParams())) + + // create validator with 10% commission + valAddr0 := sdk.ValAddress(valConsAddr0) + val0, err := distrtestutil.CreateValidator(valConsPk0, math.NewInt(100)) + require.NoError(t, err) + val0.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk0)).Return(val0, nil).AnyTimes() + + // create second validator with 10% commission + valAddr1 := sdk.ValAddress(valConsAddr1) + val1, err := distrtestutil.CreateValidator(valConsPk1, math.NewInt(100)) + require.NoError(t, err) + val1.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk1)).Return(val1, nil).AnyTimes() + + // create third validator with 10% commission + valAddr2 := sdk.ValAddress(valConsAddr2) + val2, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr2).String(), valConsPk1, stakingtypes.Description{}) + require.NoError(t, err) + val2.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) + ts.stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk2)).Return(val2, nil).AnyTimes() + + // assert initial state: zero outstanding rewards, zero community pool, zero commission, zero current rewards + val0OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0OutstandingRewards.Rewards.IsZero()) + + val1OutstandingRewards, err := ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1OutstandingRewards.Rewards.IsZero()) + + feePool, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + require.True(t, feePool.CommunityPool.IsZero()) + + val0Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0Commission.Commission.IsZero()) + + val1Commission, err := ts.distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1Commission.Commission.IsZero()) + + val0CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr0) + require.NoError(t, err) + require.True(t, val0CurrentRewards.Rewards.IsZero()) + + val1CurrentRewards, err := ts.distrKeeper.GetValidatorCurrentRewards(ctx, valAddr1) + require.NoError(t, err) + require.True(t, val1CurrentRewards.Rewards.IsZero()) + + // allocate tokens as if both had voted and second was proposer + fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(634195840))) + ts.bankKeeper.EXPECT().GetAllBalances(gomock.Any(), feeCollectorAcc.GetAddress()).Return(fees) + ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "fee_collector", disttypes.ModuleName, fees) + + votes := []abci.VoteInfo{ + { + Validator: abci.Validator{ + Address: valConsPk0.Address(), + Power: 11, + }, + }, + { + Validator: abci.Validator{ + Address: valConsPk1.Address(), + Power: 10, + }, + }, + { + Validator: abci.Validator{ + Address: valConsPk2.Address(), + Power: 10, + }, + }, + } + ctx = ctx.WithVoteInfos(votes).WithBlockHeight(1000) + + // expect us to send the truncated amount + // total amount in pool should be 12683916.800000001243023848 before the send + expectedCommunityPool := sdk.NewDecCoins(sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, math.LegacyMustNewDecFromStr("0.800000001243023848"))) + ts.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), disttypes.ModuleName, protocolpooltypes.ProtocolPoolDistrAccount, sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 12683916))).Return(nil).Times(1) + + feePoolBefore, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + err = ts.distrKeeper.BeginBlocker(ctx) + require.NoError(t, err) + feePoolAfter, err := ts.distrKeeper.FeePool.Get(ctx) + require.NoError(t, err) + + require.False(t, feePoolBefore.CommunityPool.Equal(feePoolAfter.CommunityPool), fmt.Sprintf("before: %s, after: %s", feePoolBefore.CommunityPool.String(), feePoolAfter.CommunityPool.String())) + require.True(t, feePoolAfter.CommunityPool.Equal(expectedCommunityPool)) val0OutstandingRewards, err = ts.distrKeeper.GetValidatorOutstandingRewards(ctx, valAddr0) require.NoError(t, err) diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 6b54fe644581..06b1db5783b2 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -149,10 +149,6 @@ func (k Keeper) AllocateTokensToValidator(ctx context.Context, val stakingtypes. // distribute from the distribution module account to the x/protocolpool account // update the bookkept value in x/distribution func (k Keeper) sendCommunityPoolToProtocolPool(ctx sdk.Context) error { - if k.protocolPoolEnabled { - return nil - } - feePool, err := k.FeePool.Get(ctx) if err != nil { return err diff --git a/x/distribution/keeper/common_test.go b/x/distribution/keeper/common_test.go index 642cbe45cf30..70e18516e464 100644 --- a/x/distribution/keeper/common_test.go +++ b/x/distribution/keeper/common_test.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" + protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" ) var ( @@ -18,5 +19,7 @@ var ( valConsAddr1 = sdk.ConsAddress(valConsPk1.Address()) valConsAddr2 = sdk.ConsAddress(valConsPk2.Address()) - distrAcc = authtypes.NewEmptyModuleAccount(types.ModuleName) + distrAcc = authtypes.NewEmptyModuleAccount(types.ModuleName) + protocolPoolAcc = authtypes.NewEmptyModuleAccount(protocolpooltypes.ModuleName) + feeCollectorAcc = authtypes.NewEmptyModuleAccount("fee_collector") ) From 2f09f3af69f9b7e1dd07f0a1dc6123da0b0dd91b Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Wed, 12 Mar 2025 15:51:25 +0100 Subject: [PATCH 05/18] Merge commit from fork * Fix ABS061 (cherry picked from commit f6f56395fd4b919063e19aa94e7178793ac0fd6b) (cherry picked from commit 34b30b0ed6b3145b94719650eb3246a91ed977ce) * Review feedback (cherry picked from commit c892055e7fa86db8382fb2af17bb66342d7e2eeb) * Check for events (cherry picked from commit 16fc26041457b01077df4d3d3d25c9eaf00780d2) * Review feedback * Remove unecessary code comments * Update changelog * Remove duplicate headline after merge --- CHANGELOG.md | 2 + api/cosmos/group/v1/events.pulsar.go | 573 ++++++++++++++++++++++++- proto/cosmos/group/v1/events.proto | 10 + x/group/events.pb.go | 268 ++++++++++-- x/group/keeper/msg_server.go | 31 +- x/group/keeper/msg_server_priv_test.go | 254 +++++++++++ 6 files changed, 1077 insertions(+), 61 deletions(-) create mode 100644 x/group/keeper/msg_server_priv_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a3a43f88858..bfa86fa58d54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,8 +50,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (gRPC) [#23844](https://github.com/cosmos/cosmos-sdk/pull/23844) Add debug log prints for each gRPC request. + ### Bug Fixes +* (x/group) [GHSA-47ww-ff84-4jrg](https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-47ww-ff84-4jrg) Fix x/group can halt when erroring in EndBlocker * (x/distribution) [#23934](https://github.com/cosmos/cosmos-sdk/pull/23934) Fix vulnerability in `incrementReferenceCount` in distribution. * (baseapp) [#23879](https://github.com/cosmos/cosmos-sdk/pull/23879) Ensure finalize block response is not empty in the defer check of FinalizeBlock to avoid panic by nil pointer. * (query) [#23883](https://github.com/cosmos/cosmos-sdk/pull/23883) Fix NPE in query pagination. diff --git a/api/cosmos/group/v1/events.pulsar.go b/api/cosmos/group/v1/events.pulsar.go index deebbe181739..31aa8b6c7140 100644 --- a/api/cosmos/group/v1/events.pulsar.go +++ b/api/cosmos/group/v1/events.pulsar.go @@ -4388,6 +4388,474 @@ func (x *fastReflection_EventProposalPruned) ProtoMethods() *protoiface.Methods } } +var ( + md_EventTallyError protoreflect.MessageDescriptor + fd_EventTallyError_proposal_id protoreflect.FieldDescriptor + fd_EventTallyError_error_message protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_group_v1_events_proto_init() + md_EventTallyError = File_cosmos_group_v1_events_proto.Messages().ByName("EventTallyError") + fd_EventTallyError_proposal_id = md_EventTallyError.Fields().ByName("proposal_id") + fd_EventTallyError_error_message = md_EventTallyError.Fields().ByName("error_message") +} + +var _ protoreflect.Message = (*fastReflection_EventTallyError)(nil) + +type fastReflection_EventTallyError EventTallyError + +func (x *EventTallyError) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventTallyError)(x) +} + +func (x *EventTallyError) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_group_v1_events_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_EventTallyError_messageType fastReflection_EventTallyError_messageType +var _ protoreflect.MessageType = fastReflection_EventTallyError_messageType{} + +type fastReflection_EventTallyError_messageType struct{} + +func (x fastReflection_EventTallyError_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventTallyError)(nil) +} +func (x fastReflection_EventTallyError_messageType) New() protoreflect.Message { + return new(fastReflection_EventTallyError) +} +func (x fastReflection_EventTallyError_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventTallyError +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventTallyError) Descriptor() protoreflect.MessageDescriptor { + return md_EventTallyError +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_EventTallyError) Type() protoreflect.MessageType { + return _fastReflection_EventTallyError_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventTallyError) New() protoreflect.Message { + return new(fastReflection_EventTallyError) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventTallyError) Interface() protoreflect.ProtoMessage { + return (*EventTallyError)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_EventTallyError) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ProposalId != uint64(0) { + value := protoreflect.ValueOfUint64(x.ProposalId) + if !f(fd_EventTallyError_proposal_id, value) { + return + } + } + if x.ErrorMessage != "" { + value := protoreflect.ValueOfString(x.ErrorMessage) + if !f(fd_EventTallyError_error_message, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_EventTallyError) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.group.v1.EventTallyError.proposal_id": + return x.ProposalId != uint64(0) + case "cosmos.group.v1.EventTallyError.error_message": + return x.ErrorMessage != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventTallyError")) + } + panic(fmt.Errorf("message cosmos.group.v1.EventTallyError does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventTallyError) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.group.v1.EventTallyError.proposal_id": + x.ProposalId = uint64(0) + case "cosmos.group.v1.EventTallyError.error_message": + x.ErrorMessage = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventTallyError")) + } + panic(fmt.Errorf("message cosmos.group.v1.EventTallyError does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_EventTallyError) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.group.v1.EventTallyError.proposal_id": + value := x.ProposalId + return protoreflect.ValueOfUint64(value) + case "cosmos.group.v1.EventTallyError.error_message": + value := x.ErrorMessage + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventTallyError")) + } + panic(fmt.Errorf("message cosmos.group.v1.EventTallyError does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventTallyError) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.group.v1.EventTallyError.proposal_id": + x.ProposalId = value.Uint() + case "cosmos.group.v1.EventTallyError.error_message": + x.ErrorMessage = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventTallyError")) + } + panic(fmt.Errorf("message cosmos.group.v1.EventTallyError does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventTallyError) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.group.v1.EventTallyError.proposal_id": + panic(fmt.Errorf("field proposal_id of message cosmos.group.v1.EventTallyError is not mutable")) + case "cosmos.group.v1.EventTallyError.error_message": + panic(fmt.Errorf("field error_message of message cosmos.group.v1.EventTallyError is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventTallyError")) + } + panic(fmt.Errorf("message cosmos.group.v1.EventTallyError does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_EventTallyError) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.group.v1.EventTallyError.proposal_id": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.group.v1.EventTallyError.error_message": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventTallyError")) + } + panic(fmt.Errorf("message cosmos.group.v1.EventTallyError does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_EventTallyError) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.group.v1.EventTallyError", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_EventTallyError) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventTallyError) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_EventTallyError) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_EventTallyError) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventTallyError) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.ProposalId != 0 { + n += 1 + runtime.Sov(uint64(x.ProposalId)) + } + l = len(x.ErrorMessage) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*EventTallyError) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ErrorMessage) > 0 { + i -= len(x.ErrorMessage) + copy(dAtA[i:], x.ErrorMessage) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ErrorMessage))) + i-- + dAtA[i] = 0x12 + } + if x.ProposalId != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ProposalId)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*EventTallyError) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventTallyError: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventTallyError: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ProposalId", wireType) + } + x.ProposalId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ProposalId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ErrorMessage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ErrorMessage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + // Since: cosmos-sdk 0.46 // Code generated by protoc-gen-go. DO NOT EDIT. @@ -4818,6 +5286,52 @@ func (x *EventProposalPruned) GetTallyResult() *TallyResult { return nil } +// EventTallyError is an event emitted when a proposal tally failed with an error. +type EventTallyError struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // proposal_id is the unique ID of the proposal. + ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty"` + // error_message is the raw error output + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` +} + +func (x *EventTallyError) Reset() { + *x = EventTallyError{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_group_v1_events_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventTallyError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventTallyError) ProtoMessage() {} + +// Deprecated: Use EventTallyError.ProtoReflect.Descriptor instead. +func (*EventTallyError) Descriptor() ([]byte, []int) { + return file_cosmos_group_v1_events_proto_rawDescGZIP(), []int{10} +} + +func (x *EventTallyError) GetProposalId() uint64 { + if x != nil { + return x.ProposalId + } + return 0 +} + +func (x *EventTallyError) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + var File_cosmos_group_v1_events_proto protoreflect.FileDescriptor var file_cosmos_group_v1_events_proto_rawDesc = []byte{ @@ -4878,18 +5392,24 @@ var file_cosmos_group_v1_events_proto_rawDesc = []byte{ 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x74, - 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0xaa, 0x01, 0x0a, 0x13, 0x63, - 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x76, 0x31, 0x42, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x28, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, - 0x58, 0xaa, 0x02, 0x0f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x57, 0x0a, 0x0f, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x42, 0xaa, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, 0x58, 0xaa, 0x02, 0x0f, 0x43, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x1b, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x3a, 0x56, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4904,7 +5424,7 @@ func file_cosmos_group_v1_events_proto_rawDescGZIP() []byte { return file_cosmos_group_v1_events_proto_rawDescData } -var file_cosmos_group_v1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_cosmos_group_v1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_cosmos_group_v1_events_proto_goTypes = []interface{}{ (*EventCreateGroup)(nil), // 0: cosmos.group.v1.EventCreateGroup (*EventUpdateGroup)(nil), // 1: cosmos.group.v1.EventUpdateGroup @@ -4916,14 +5436,15 @@ var file_cosmos_group_v1_events_proto_goTypes = []interface{}{ (*EventExec)(nil), // 7: cosmos.group.v1.EventExec (*EventLeaveGroup)(nil), // 8: cosmos.group.v1.EventLeaveGroup (*EventProposalPruned)(nil), // 9: cosmos.group.v1.EventProposalPruned - (ProposalExecutorResult)(0), // 10: cosmos.group.v1.ProposalExecutorResult - (ProposalStatus)(0), // 11: cosmos.group.v1.ProposalStatus - (*TallyResult)(nil), // 12: cosmos.group.v1.TallyResult + (*EventTallyError)(nil), // 10: cosmos.group.v1.EventTallyError + (ProposalExecutorResult)(0), // 11: cosmos.group.v1.ProposalExecutorResult + (ProposalStatus)(0), // 12: cosmos.group.v1.ProposalStatus + (*TallyResult)(nil), // 13: cosmos.group.v1.TallyResult } var file_cosmos_group_v1_events_proto_depIdxs = []int32{ - 10, // 0: cosmos.group.v1.EventExec.result:type_name -> cosmos.group.v1.ProposalExecutorResult - 11, // 1: cosmos.group.v1.EventProposalPruned.status:type_name -> cosmos.group.v1.ProposalStatus - 12, // 2: cosmos.group.v1.EventProposalPruned.tally_result:type_name -> cosmos.group.v1.TallyResult + 11, // 0: cosmos.group.v1.EventExec.result:type_name -> cosmos.group.v1.ProposalExecutorResult + 12, // 1: cosmos.group.v1.EventProposalPruned.status:type_name -> cosmos.group.v1.ProposalStatus + 13, // 2: cosmos.group.v1.EventProposalPruned.tally_result:type_name -> cosmos.group.v1.TallyResult 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name @@ -5058,6 +5579,18 @@ func file_cosmos_group_v1_events_proto_init() { return nil } } + file_cosmos_group_v1_events_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventTallyError); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -5065,7 +5598,7 @@ func file_cosmos_group_v1_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_group_v1_events_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 11, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/cosmos/group/v1/events.proto b/proto/cosmos/group/v1/events.proto index 2b98ec9abc32..754afa5dac3c 100644 --- a/proto/cosmos/group/v1/events.proto +++ b/proto/cosmos/group/v1/events.proto @@ -92,3 +92,13 @@ message EventProposalPruned { // tally_result is the proposal tally result (when applicable). TallyResult tally_result = 3; } + +// EventTallyError is an event emitted when a proposal tally failed with an error. +message EventTallyError { + + // proposal_id is the unique ID of the proposal. + uint64 proposal_id = 1; + + // error_message is the raw error output + string error_message = 2; +} diff --git a/x/group/events.pb.go b/x/group/events.pb.go index dc869b695c66..4d4c6822569a 100644 --- a/x/group/events.pb.go +++ b/x/group/events.pb.go @@ -528,6 +528,61 @@ func (m *EventProposalPruned) GetTallyResult() *TallyResult { return nil } +// EventTallyError is an event emitted when a proposal tally failed with an error. +type EventTallyError struct { + // proposal_id is the unique ID of the proposal. + ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty"` + // error_message is the raw error output + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` +} + +func (m *EventTallyError) Reset() { *m = EventTallyError{} } +func (m *EventTallyError) String() string { return proto.CompactTextString(m) } +func (*EventTallyError) ProtoMessage() {} +func (*EventTallyError) Descriptor() ([]byte, []int) { + return fileDescriptor_e8d753981546f032, []int{10} +} +func (m *EventTallyError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventTallyError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventTallyError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventTallyError) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventTallyError.Merge(m, src) +} +func (m *EventTallyError) XXX_Size() int { + return m.Size() +} +func (m *EventTallyError) XXX_DiscardUnknown() { + xxx_messageInfo_EventTallyError.DiscardUnknown(m) +} + +var xxx_messageInfo_EventTallyError proto.InternalMessageInfo + +func (m *EventTallyError) GetProposalId() uint64 { + if m != nil { + return m.ProposalId + } + return 0 +} + +func (m *EventTallyError) GetErrorMessage() string { + if m != nil { + return m.ErrorMessage + } + return "" +} + func init() { proto.RegisterType((*EventCreateGroup)(nil), "cosmos.group.v1.EventCreateGroup") proto.RegisterType((*EventUpdateGroup)(nil), "cosmos.group.v1.EventUpdateGroup") @@ -539,40 +594,43 @@ func init() { proto.RegisterType((*EventExec)(nil), "cosmos.group.v1.EventExec") proto.RegisterType((*EventLeaveGroup)(nil), "cosmos.group.v1.EventLeaveGroup") proto.RegisterType((*EventProposalPruned)(nil), "cosmos.group.v1.EventProposalPruned") + proto.RegisterType((*EventTallyError)(nil), "cosmos.group.v1.EventTallyError") } func init() { proto.RegisterFile("cosmos/group/v1/events.proto", fileDescriptor_e8d753981546f032) } var fileDescriptor_e8d753981546f032 = []byte{ - // 442 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x93, 0x4f, 0xef, 0xd2, 0x30, - 0x18, 0xc7, 0xe9, 0x4f, 0x02, 0x52, 0x8c, 0x98, 0xfa, 0x27, 0x03, 0xc9, 0x20, 0xc4, 0x44, 0x0e, - 0xb2, 0x05, 0x4c, 0xd4, 0x93, 0x44, 0x0c, 0x31, 0x24, 0x1c, 0xc8, 0xf0, 0x4f, 0xe2, 0x05, 0xc7, - 0xda, 0x8c, 0xc5, 0x41, 0x97, 0xb6, 0x9b, 0x70, 0xf4, 0x1d, 0xf8, 0x52, 0x3c, 0xf8, 0x22, 0x3c, - 0x12, 0x4f, 0x1e, 0x0d, 0xbc, 0x11, 0xb3, 0xae, 0x03, 0x82, 0x31, 0x23, 0xf9, 0x9d, 0x68, 0xfb, - 0xfd, 0x7c, 0xbf, 0x3c, 0x4f, 0x9f, 0x15, 0xd6, 0x1d, 0xca, 0x97, 0x94, 0x9b, 0x2e, 0xa3, 0x61, - 0x60, 0x46, 0x5d, 0x93, 0x44, 0x64, 0x25, 0xb8, 0x11, 0x30, 0x2a, 0x28, 0xaa, 0x24, 0xaa, 0x21, - 0x55, 0x23, 0xea, 0xd6, 0xaa, 0xc9, 0xc1, 0x4c, 0xca, 0xa6, 0x52, 0xe5, 0xa6, 0xf6, 0xf0, 0x3c, - 0x49, 0x6c, 0x02, 0xa2, 0xc4, 0x56, 0x07, 0xde, 0x19, 0xc6, 0xc1, 0xaf, 0x19, 0xb1, 0x05, 0x79, - 0x13, 0x23, 0xa8, 0x0a, 0x6f, 0x4a, 0x76, 0xe6, 0x61, 0x0d, 0x34, 0x41, 0x3b, 0x6f, 0x15, 0xe5, - 0x7e, 0x84, 0x0f, 0xf8, 0xbb, 0x00, 0x5f, 0x82, 0x8f, 0xe1, 0x83, 0xf3, 0xf4, 0x09, 0xf5, 0x3d, - 0x67, 0x83, 0x7a, 0xb0, 0x68, 0x63, 0xcc, 0x08, 0xe7, 0xd2, 0x53, 0x1a, 0x68, 0xbf, 0x7e, 0x74, - 0xee, 0xa9, 0xba, 0x5f, 0x25, 0xca, 0x54, 0x30, 0x6f, 0xe5, 0x5a, 0x29, 0x78, 0x48, 0x3b, 0xf9, - 0xf3, 0x6b, 0xa4, 0x3d, 0x83, 0x77, 0x65, 0xda, 0x34, 0x9c, 0x2f, 0x3d, 0x31, 0x61, 0x34, 0xa0, - 0xdc, 0xf6, 0x51, 0x03, 0x96, 0x03, 0xb5, 0x3e, 0x36, 0x04, 0xd3, 0xa3, 0x11, 0x6e, 0xbd, 0x80, - 0xf7, 0xa5, 0xef, 0x83, 0x27, 0x16, 0x98, 0xd9, 0x5f, 0x2e, 0x77, 0x3e, 0x81, 0x25, 0xe9, 0x7c, - 0x4f, 0x05, 0xc9, 0xa6, 0xbf, 0x02, 0x85, 0x0f, 0xd7, 0xc4, 0xc9, 0xc4, 0x51, 0x1f, 0x16, 0x18, - 0xe1, 0xa1, 0x2f, 0xb4, 0xab, 0x26, 0x68, 0xdf, 0xee, 0x3d, 0x36, 0xce, 0x3e, 0x11, 0x23, 0x2d, - 0x34, 0xce, 0x0b, 0x05, 0x65, 0x96, 0xc4, 0x2d, 0x65, 0x43, 0x08, 0xe6, 0x7d, 0xea, 0x72, 0xed, - 0x46, 0x7c, 0x81, 0x96, 0x5c, 0xb7, 0x3e, 0xc1, 0x8a, 0x2c, 0x61, 0x4c, 0xec, 0x28, 0x73, 0xda, - 0xa7, 0x53, 0xb8, 0xba, 0x74, 0x0a, 0xdf, 0x81, 0x1a, 0x43, 0x5a, 0xdd, 0x84, 0x85, 0x2b, 0x82, - 0xb3, 0xfb, 0x7d, 0x0e, 0x0b, 0x5c, 0xd8, 0x22, 0xe4, 0xaa, 0xdf, 0xc6, 0x7f, 0xfb, 0x9d, 0x4a, - 0xcc, 0x52, 0x38, 0xea, 0xc3, 0x5b, 0xc2, 0xf6, 0xfd, 0xcd, 0x4c, 0x5d, 0x57, 0xdc, 0x6f, 0xb9, - 0x57, 0xff, 0xc7, 0xfe, 0x36, 0x86, 0xd4, 0x1d, 0x95, 0xc5, 0x71, 0x33, 0x78, 0xf9, 0x73, 0xa7, - 0x83, 0xed, 0x4e, 0x07, 0x7f, 0x76, 0x3a, 0xf8, 0xb6, 0xd7, 0x73, 0xdb, 0xbd, 0x9e, 0xfb, 0xbd, - 0xd7, 0x73, 0x1f, 0x1f, 0xb9, 0x9e, 0x58, 0x84, 0x73, 0xc3, 0xa1, 0x4b, 0xf5, 0x04, 0xd5, 0x4f, - 0x87, 0xe3, 0xcf, 0xe6, 0x3a, 0x79, 0x81, 0xf3, 0x82, 0x7c, 0x79, 0x4f, 0xff, 0x06, 0x00, 0x00, - 0xff, 0xff, 0xa5, 0x1a, 0x1c, 0xb9, 0xe2, 0x03, 0x00, 0x00, + // 476 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x93, 0x4d, 0x6b, 0x13, 0x41, + 0x18, 0xc7, 0x33, 0xb5, 0xa4, 0xf6, 0x49, 0xb5, 0x32, 0xbe, 0x90, 0xd6, 0xb2, 0x2d, 0x51, 0xb0, + 0x07, 0xb3, 0x4b, 0x23, 0xa8, 0x27, 0x8b, 0x95, 0x20, 0x85, 0x0a, 0x61, 0xa3, 0x16, 0xbc, 0xc4, + 0x49, 0x66, 0xd8, 0x2e, 0xee, 0x66, 0x96, 0x99, 0xd9, 0xb5, 0x39, 0xfa, 0x0d, 0xfc, 0x28, 0x1e, + 0xfc, 0x10, 0x1e, 0x8b, 0x27, 0x8f, 0x92, 0x7c, 0x11, 0xd9, 0x67, 0x67, 0xdb, 0x10, 0x91, 0x0d, + 0x78, 0xca, 0xcc, 0xf3, 0xfc, 0xfe, 0xff, 0x3c, 0x2f, 0x3b, 0xb0, 0x33, 0x92, 0x3a, 0x96, 0xda, + 0x0b, 0x94, 0x4c, 0x13, 0x2f, 0x3b, 0xf0, 0x44, 0x26, 0xc6, 0x46, 0xbb, 0x89, 0x92, 0x46, 0xd2, + 0xcd, 0x22, 0xeb, 0x62, 0xd6, 0xcd, 0x0e, 0xb6, 0xb7, 0x8a, 0xc0, 0x00, 0xd3, 0x9e, 0xcd, 0xe2, + 0x65, 0xfb, 0xfe, 0xa2, 0x93, 0x99, 0x24, 0xc2, 0x26, 0x5b, 0x6d, 0xb8, 0xd5, 0xcd, 0x8d, 0x5f, + 0x29, 0xc1, 0x8c, 0x78, 0x9d, 0x23, 0x74, 0x0b, 0xae, 0x23, 0x3b, 0x08, 0x79, 0x93, 0xec, 0x91, + 0xfd, 0x55, 0x7f, 0x0d, 0xef, 0xc7, 0xfc, 0x12, 0x7f, 0x97, 0xf0, 0x65, 0xf0, 0x13, 0xb8, 0xb7, + 0xe8, 0xde, 0x93, 0x51, 0x38, 0x9a, 0xd0, 0x0e, 0xac, 0x31, 0xce, 0x95, 0xd0, 0x1a, 0x35, 0xeb, + 0x47, 0xcd, 0x9f, 0xdf, 0xdb, 0x77, 0x6c, 0xdd, 0x2f, 0x8b, 0x4c, 0xdf, 0xa8, 0x70, 0x1c, 0xf8, + 0x25, 0x78, 0xe9, 0x36, 0xf7, 0xe7, 0xff, 0xe1, 0xf6, 0x14, 0x6e, 0xa3, 0x5b, 0x3f, 0x1d, 0xc6, + 0xa1, 0xe9, 0x29, 0x99, 0x48, 0xcd, 0x22, 0xba, 0x0b, 0x8d, 0xc4, 0x9e, 0xaf, 0x1a, 0x82, 0x32, + 0x74, 0xcc, 0x5b, 0xcf, 0xe1, 0x2e, 0xea, 0x4e, 0x43, 0x73, 0xc6, 0x15, 0xfb, 0xbc, 0xbc, 0xf2, + 0x31, 0xac, 0xa3, 0xf2, 0xbd, 0x34, 0xa2, 0x9a, 0xfe, 0x42, 0x2c, 0xde, 0x3d, 0x17, 0xa3, 0x4a, + 0x9c, 0x1e, 0x42, 0x5d, 0x09, 0x9d, 0x46, 0xa6, 0xb9, 0xb2, 0x47, 0xf6, 0x6f, 0x76, 0x1e, 0xb9, + 0x0b, 0x9f, 0x88, 0x5b, 0x16, 0x9a, 0xfb, 0xa5, 0x46, 0x2a, 0x1f, 0x71, 0xdf, 0xca, 0x28, 0x85, + 0xd5, 0x48, 0x06, 0xba, 0x79, 0x2d, 0x1f, 0xa0, 0x8f, 0xe7, 0xd6, 0x47, 0xd8, 0xc4, 0x12, 0x4e, + 0x04, 0xcb, 0x2a, 0xb7, 0x3d, 0xbf, 0x85, 0x95, 0x65, 0xb7, 0xf0, 0x8d, 0xd8, 0x35, 0x94, 0xd5, + 0xf5, 0x54, 0x3a, 0x16, 0xbc, 0xba, 0xdf, 0x67, 0x50, 0xd7, 0x86, 0x99, 0x54, 0xdb, 0x7e, 0x77, + 0xff, 0xd9, 0x6f, 0x1f, 0x31, 0xdf, 0xe2, 0xf4, 0x10, 0x36, 0x0c, 0x8b, 0xa2, 0xc9, 0xc0, 0x8e, + 0x2b, 0xef, 0xb7, 0xd1, 0xd9, 0xf9, 0x4b, 0xfe, 0x36, 0x87, 0xec, 0x8c, 0x1a, 0xe6, 0xea, 0xd2, + 0x3a, 0xb5, 0x43, 0x41, 0xa0, 0xab, 0x94, 0x54, 0xd5, 0xd5, 0x3e, 0x80, 0x1b, 0x22, 0x27, 0x07, + 0xb1, 0xd0, 0x9a, 0x05, 0xa2, 0x18, 0x90, 0xbf, 0x81, 0xc1, 0x37, 0x45, 0xec, 0xe8, 0xc5, 0x8f, + 0xa9, 0x43, 0x2e, 0xa6, 0x0e, 0xf9, 0x3d, 0x75, 0xc8, 0xd7, 0x99, 0x53, 0xbb, 0x98, 0x39, 0xb5, + 0x5f, 0x33, 0xa7, 0xf6, 0xe1, 0x61, 0x10, 0x9a, 0xb3, 0x74, 0xe8, 0x8e, 0x64, 0x6c, 0xdf, 0xb6, + 0xfd, 0x69, 0x6b, 0xfe, 0xc9, 0x3b, 0x2f, 0x9e, 0xf6, 0xb0, 0x8e, 0x4f, 0xfa, 0xc9, 0x9f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x14, 0x0c, 0xb7, 0x93, 0x3b, 0x04, 0x00, 0x00, } func (m *EventCreateGroup) Marshal() (dAtA []byte, err error) { @@ -895,6 +953,41 @@ func (m *EventProposalPruned) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EventTallyError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventTallyError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventTallyError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ErrorMessage) > 0 { + i -= len(m.ErrorMessage) + copy(dAtA[i:], m.ErrorMessage) + i = encodeVarintEvents(dAtA, i, uint64(len(m.ErrorMessage))) + i-- + dAtA[i] = 0x12 + } + if m.ProposalId != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.ProposalId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -1046,6 +1139,22 @@ func (m *EventProposalPruned) Size() (n int) { return n } +func (m *EventTallyError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ProposalId != 0 { + n += 1 + sovEvents(uint64(m.ProposalId)) + } + l = len(m.ErrorMessage) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1906,6 +2015,107 @@ func (m *EventProposalPruned) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventTallyError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventTallyError: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventTallyError: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposalId", wireType) + } + m.ProposalId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ProposalId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ErrorMessage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ErrorMessage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipEvents(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/group/keeper/msg_server.go b/x/group/keeper/msg_server.go index 85dd52227659..6689cf573931 100644 --- a/x/group/keeper/msg_server.go +++ b/x/group/keeper/msg_server.go @@ -781,33 +781,40 @@ func (k Keeper) Vote(goCtx context.Context, msg *group.MsgVote) (*group.MsgVoteR // doTallyAndUpdate performs a tally, and, if the tally result is final, then: // - updates the proposal's `Status` and `FinalTallyResult` fields, // - prune all the votes. -func (k Keeper) doTallyAndUpdate(ctx sdk.Context, p *group.Proposal, groupInfo group.GroupInfo, policyInfo group.GroupPolicyInfo) error { +func (k Keeper) doTallyAndUpdate(ctx sdk.Context, proposal *group.Proposal, groupInfo group.GroupInfo, policyInfo group.GroupPolicyInfo) error { policy, err := policyInfo.GetDecisionPolicy() if err != nil { return err } - tallyResult, err := k.Tally(ctx, *p, policyInfo.GroupId) - if err != nil { - return err + var result group.DecisionPolicyResult + tallyResult, err := k.Tally(ctx, *proposal, policyInfo.GroupId) + if err == nil { + result, err = policy.Allow(tallyResult, groupInfo.TotalWeight) } - - result, err := policy.Allow(tallyResult, groupInfo.TotalWeight) if err != nil { - return errorsmod.Wrap(err, "policy allow") + if err := k.pruneVotes(ctx, proposal.Id); err != nil { + return err + } + proposal.Status = group.PROPOSAL_STATUS_REJECTED + return ctx.EventManager().EmitTypedEvents( + &group.EventTallyError{ + ProposalId: proposal.Id, + ErrorMessage: err.Error(), + }) } // If the result was final (i.e. enough votes to pass) or if the voting // period ended, then we consider the proposal as final. - if isFinal := result.Final || ctx.BlockTime().After(p.VotingPeriodEnd); isFinal { - if err := k.pruneVotes(ctx, p.Id); err != nil { + if isFinal := result.Final || ctx.BlockTime().After(proposal.VotingPeriodEnd); isFinal { + if err := k.pruneVotes(ctx, proposal.Id); err != nil { return err } - p.FinalTallyResult = tallyResult + proposal.FinalTallyResult = tallyResult if result.Allow { - p.Status = group.PROPOSAL_STATUS_ACCEPTED + proposal.Status = group.PROPOSAL_STATUS_ACCEPTED } else { - p.Status = group.PROPOSAL_STATUS_REJECTED + proposal.Status = group.PROPOSAL_STATUS_REJECTED } } diff --git a/x/group/keeper/msg_server_priv_test.go b/x/group/keeper/msg_server_priv_test.go new file mode 100644 index 000000000000..dd5c3e94644c --- /dev/null +++ b/x/group/keeper/msg_server_priv_test.go @@ -0,0 +1,254 @@ +package keeper + +import ( + "bytes" + "context" + "errors" + "fmt" + "testing" + "time" + + "github.com/cosmos/gogoproto/proto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + coreaddress "cosmossdk.io/core/address" + storetypes "cosmossdk.io/store/types" + + "github.com/cosmos/cosmos-sdk/codec/address" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" + "github.com/cosmos/cosmos-sdk/x/group" + "github.com/cosmos/cosmos-sdk/x/group/internal/math" +) + +func TestDoTallyAndUpdate(t *testing.T) { + var ( + myAddr = sdk.AccAddress(bytes.Repeat([]byte{0x01}, 20)) + myOtherAddr = sdk.AccAddress(bytes.Repeat([]byte{0x02}, 20)) + ) + encCfg := moduletestutil.MakeTestEncodingConfig() + group.RegisterInterfaces(encCfg.InterfaceRegistry) + + storeKey := storetypes.NewKVStoreKey(group.StoreKey) + testCtx := testutil.DefaultContextWithDB(t, storeKey, storetypes.NewTransientStoreKey("transient_test")) + myAccountKeeper := &mockAccountKeeper{ + AddressCodecFn: func() coreaddress.Codec { + return address.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix()) + }, + } + groupKeeper := NewKeeper(storeKey, encCfg.Codec, nil, myAccountKeeper, group.DefaultConfig()) + noEventsFn := func(proposalID uint64) sdk.Events { return sdk.Events{} } + type memberVote struct { + address string + weight string + option group.VoteOption + } + specs := map[string]struct { + votes []memberVote + policy group.DecisionPolicy + expStatus group.ProposalStatus + expVotesCleared bool + expEvents func(proposalID uint64) sdk.Events + }{ + "proposal accepted": { + votes: []memberVote{ + {address: myAddr.String(), option: group.VOTE_OPTION_YES, weight: "2"}, + {address: myOtherAddr.String(), option: group.VOTE_OPTION_NO, weight: "1"}, + }, + policy: mockDecisionPolicy{ + AllowFn: func(tallyResult group.TallyResult, totalPower string) (group.DecisionPolicyResult, error) { + return group.DecisionPolicyResult{Allow: true, Final: true}, nil + }, + }, + expStatus: group.PROPOSAL_STATUS_ACCEPTED, + expVotesCleared: true, + expEvents: noEventsFn, + }, + "proposal rejected": { + votes: []memberVote{ + {address: myAddr.String(), option: group.VOTE_OPTION_YES, weight: "1"}, + {address: myOtherAddr.String(), option: group.VOTE_OPTION_NO, weight: "2"}, + }, + policy: mockDecisionPolicy{ + AllowFn: func(tallyResult group.TallyResult, totalPower string) (group.DecisionPolicyResult, error) { + return group.DecisionPolicyResult{Allow: false, Final: true}, nil + }, + }, + expStatus: group.PROPOSAL_STATUS_REJECTED, + expVotesCleared: true, + expEvents: noEventsFn, + }, + "proposal in flight": { + votes: []memberVote{ + {address: myAddr.String(), option: group.VOTE_OPTION_YES, weight: "1"}, + {address: myOtherAddr.String(), option: group.VOTE_OPTION_NO, weight: "1"}, + }, + policy: mockDecisionPolicy{ + AllowFn: func(tallyResult group.TallyResult, totalPower string) (group.DecisionPolicyResult, error) { + return group.DecisionPolicyResult{Allow: false, Final: false}, nil + }, + }, + expStatus: group.PROPOSAL_STATUS_SUBMITTED, + expVotesCleared: false, + expEvents: noEventsFn, + }, + "policy errors": { + votes: []memberVote{ + {address: myAddr.String(), option: group.VOTE_OPTION_YES, weight: "1"}, + {address: myOtherAddr.String(), option: group.VOTE_OPTION_NO, weight: "2"}, + }, + policy: mockDecisionPolicy{ + AllowFn: func(tallyResult group.TallyResult, totalPower string) (group.DecisionPolicyResult, error) { + return group.DecisionPolicyResult{}, errors.New("my test error") + }, + }, + expStatus: group.PROPOSAL_STATUS_REJECTED, + expVotesCleared: true, + expEvents: func(proposalID uint64) sdk.Events { + return sdk.Events{ + sdk.NewEvent("cosmos.group.v1.EventTallyError", + sdk.Attribute{Key: "error_message", Value: `"my test error"`}, + sdk.Attribute{Key: "proposal_id", Value: fmt.Sprintf(`"%d"`, proposalID)}, + ), + } + }, + }, + } + var ( + groupID uint64 + proposalId uint64 + ) + for name, spec := range specs { + groupID++ + proposalId++ + t.Run(name, func(t *testing.T) { + em := sdk.NewEventManager() + ctx := testCtx.Ctx.WithEventManager(em) + totalWeight, err := math.NewDecFromString("0") + require.NoError(t, err) + // given a group, policy and persisted votes + for _, v := range spec.votes { + err := groupKeeper.groupMemberTable.Create(ctx.KVStore(storeKey), &group.GroupMember{ + GroupId: groupID, + Member: &group.Member{Address: v.address, Weight: v.weight}, + }) + require.NoError(t, err) + err = groupKeeper.voteTable.Create(ctx.KVStore(storeKey), &group.Vote{ + ProposalId: proposalId, + Voter: v.address, + Option: v.option, + }) + require.NoError(t, err) + } + myGroupInfo := group.GroupInfo{ + TotalWeight: totalWeight.String(), + } + myPolicy := group.GroupPolicyInfo{GroupId: groupID} + err = myPolicy.SetDecisionPolicy(spec.policy) + require.NoError(t, err) + + myProposal := &group.Proposal{ + Id: proposalId, + Status: group.PROPOSAL_STATUS_SUBMITTED, + VotingPeriodEnd: ctx.BlockTime().Add(time.Hour), + } + + // when + gotErr := groupKeeper.doTallyAndUpdate(ctx, myProposal, myGroupInfo, myPolicy) + // then + require.NoError(t, gotErr) + assert.Equal(t, spec.expStatus, myProposal.Status) + require.Equal(t, spec.expEvents(proposalId), em.Events()) + // and persistent state updated + persistedVotes, err := groupKeeper.votesByProposal(ctx, groupID) + require.NoError(t, err) + if spec.expVotesCleared { + assert.Empty(t, persistedVotes) + } else { + assert.Len(t, persistedVotes, len(spec.votes)) + } + }) + } +} + +var _ group.AccountKeeper = &mockAccountKeeper{} + +// mockAccountKeeper is a mock implementation of the AccountKeeper interface for testing purposes. +type mockAccountKeeper struct { + AddressCodecFn func() coreaddress.Codec +} + +func (m mockAccountKeeper) AddressCodec() coreaddress.Codec { + if m.AddressCodecFn == nil { + panic("not expected to be called") + } + return m.AddressCodecFn() +} + +func (m mockAccountKeeper) NewAccount(ctx context.Context, i sdk.AccountI) sdk.AccountI { + panic("not expected to be called") +} + +func (m mockAccountKeeper) GetAccount(ctx context.Context, address sdk.AccAddress) sdk.AccountI { + panic("not expected to be called") +} + +func (m mockAccountKeeper) SetAccount(ctx context.Context, i sdk.AccountI) { + panic("not expected to be called") +} + +func (m mockAccountKeeper) RemoveAccount(ctx context.Context, acc sdk.AccountI) { + panic("not expected to be called") +} + +// mockDecisionPolicy is a mock implementation of a decision policy for testing purposes. +type mockDecisionPolicy struct { + fakeProtoType + AllowFn func(tallyResult group.TallyResult, totalPower string) (group.DecisionPolicyResult, error) +} + +func (m mockDecisionPolicy) Allow(tallyResult group.TallyResult, totalPower string) (group.DecisionPolicyResult, error) { + if m.AllowFn == nil { + panic("not expected to be called") + } + return m.AllowFn(tallyResult, totalPower) +} + +func (m mockDecisionPolicy) GetVotingPeriod() time.Duration { + panic("not expected to be called") +} + +func (m mockDecisionPolicy) GetMinExecutionPeriod() time.Duration { + panic("not expected to be called") +} + +func (m mockDecisionPolicy) ValidateBasic() error { + panic("not expected to be called") +} + +func (m mockDecisionPolicy) Validate(g group.GroupInfo, config group.Config) error { + panic("not expected to be called") +} + +var ( + _ proto.Marshaler = (*fakeProtoType)(nil) + _ proto.Message = (*fakeProtoType)(nil) +) + +// fakeProtoType is a struct used for mocking and testing purposes. +// Custom types can be converted into Any and back via internal CachedValue only. +type fakeProtoType struct{} + +func (a fakeProtoType) Reset() {} + +func (a fakeProtoType) String() string { + return "testing" +} + +func (a fakeProtoType) Marshal() ([]byte, error) { + return nil, nil +} + +func (a fakeProtoType) ProtoMessage() {} From 5ede8877574073c4123987a2513902a76bb63a5c Mon Sep 17 00:00:00 2001 From: Alex | Interchain Labs Date: Wed, 12 Mar 2025 11:54:09 -0400 Subject: [PATCH 06/18] chore: update system tests (#23931) --- go.mod | 14 ++++++----- go.sum | 23 +++++++++--------- simapp/go.mod | 13 +++++----- simapp/go.sum | 23 +++++++++--------- tests/go.mod | 12 +++++----- tests/go.sum | 21 +++++++++------- tests/systemtests/README.md | 48 +++++++++++++++++++++++++++++++++++++ tests/systemtests/go.mod | 13 +++++----- tests/systemtests/go.sum | 25 ++++++++++--------- 9 files changed, 124 insertions(+), 68 deletions(-) create mode 100644 tests/systemtests/README.md diff --git a/go.mod b/go.mod index b05481437d7f..99c8de67f445 100644 --- a/go.mod +++ b/go.mod @@ -70,8 +70,8 @@ require ( github.com/DataDog/zstd v1.5.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bufbuild/protocompile v0.14.1 // indirect - github.com/bytedance/sonic v1.12.9 // indirect - github.com/bytedance/sonic/loader v0.2.2 // indirect + github.com/bytedance/sonic v1.13.1 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.5 // indirect @@ -121,12 +121,12 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -158,10 +158,10 @@ require ( go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/arch v0.3.0 // indirect + golang.org/x/arch v0.15.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/net v0.35.0 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.29.0 // indirect golang.org/x/text v0.22.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect @@ -178,6 +178,8 @@ require ( // ) replace cosmossdk.io/api => ./api +replace cosmossdk.io/log => ./log + // Below are the long-lived replace of the Cosmos SDK replace ( // use cosmos fork of keyring diff --git a/go.sum b/go.sum index 53c0dbb7ab16..138c6f5d064e 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,6 @@ cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= -cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= cosmossdk.io/math v1.5.0 h1:sbOASxee9Zxdjd6OkzogvBZ25/hP929vdcYcBJQbkLc= cosmossdk.io/math v1.5.0/go.mod h1:AAwwBmUhqtk2nlku174JwSll+/DepUXW3rWIXN5q+Nw= cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= @@ -75,11 +73,11 @@ github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/ github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/bytedance/sonic v1.12.9 h1:Od1BvK55NnewtGaJsTDeAOSnLVO2BTSLOe0+ooKokmQ= -github.com/bytedance/sonic v1.12.9/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8= +github.com/bytedance/sonic v1.13.1 h1:Jyd5CIvdFnkOWuKXr+wm4Nyk2h0yAFsr8ucJgEasO3g= +github.com/bytedance/sonic v1.13.1/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.2 h1:jxAJuN9fOot/cyz5Q6dUuMJF5OqQ6+5GfA8FjjQ0R4o= -github.com/bytedance/sonic/loader v0.2.2/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -454,8 +452,9 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -485,8 +484,9 @@ github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -769,8 +769,9 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -914,8 +915,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= diff --git a/simapp/go.mod b/simapp/go.mod index afce48c8d216..63a5a317bce4 100644 --- a/simapp/go.mod +++ b/simapp/go.mod @@ -48,8 +48,8 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.2.0 // indirect github.com/bits-and-blooms/bitset v1.20.0 // indirect - github.com/bytedance/sonic v1.12.9 // indirect - github.com/bytedance/sonic/loader v0.2.2 // indirect + github.com/bytedance/sonic v1.13.1 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -131,14 +131,14 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -181,13 +181,13 @@ require ( go.opentelemetry.io/otel/metric v1.32.0 // indirect go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/arch v0.3.0 // indirect + golang.org/x/arch v0.15.0 // indirect golang.org/x/crypto v0.35.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/net v0.35.0 // indirect golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.29.0 // indirect golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect @@ -213,6 +213,7 @@ require ( // Below are the long-lived replace of the SimApp replace ( cosmossdk.io/api => ../api + cosmossdk.io/log => ../log // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // Simapp always use the latest version of the cosmos-sdk diff --git a/simapp/go.sum b/simapp/go.sum index 2b07535d9426..2be933098c0b 100644 --- a/simapp/go.sum +++ b/simapp/go.sum @@ -192,8 +192,6 @@ cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= -cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= cosmossdk.io/math v1.5.0 h1:sbOASxee9Zxdjd6OkzogvBZ25/hP929vdcYcBJQbkLc= cosmossdk.io/math v1.5.0/go.mod h1:AAwwBmUhqtk2nlku174JwSll+/DepUXW3rWIXN5q+Nw= cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= @@ -277,11 +275,11 @@ github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/ github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/bytedance/sonic v1.12.9 h1:Od1BvK55NnewtGaJsTDeAOSnLVO2BTSLOe0+ooKokmQ= -github.com/bytedance/sonic v1.12.9/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8= +github.com/bytedance/sonic v1.13.1 h1:Jyd5CIvdFnkOWuKXr+wm4Nyk2h0yAFsr8ucJgEasO3g= +github.com/bytedance/sonic v1.13.1/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.2 h1:jxAJuN9fOot/cyz5Q6dUuMJF5OqQ6+5GfA8FjjQ0R4o= -github.com/bytedance/sonic/loader v0.2.2/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -744,8 +742,9 @@ github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrD github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -775,8 +774,9 @@ github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -1079,8 +1079,9 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1345,8 +1346,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/tests/go.mod b/tests/go.mod index ef5154784ced..ad15b9c0ed94 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -51,8 +51,8 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.2.0 // indirect github.com/bits-and-blooms/bitset v1.20.0 // indirect - github.com/bytedance/sonic v1.12.9 // indirect - github.com/bytedance/sonic/loader v0.2.2 // indirect + github.com/bytedance/sonic v1.13.1 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -130,14 +130,14 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -182,13 +182,13 @@ require ( go.opentelemetry.io/otel/metric v1.32.0 // indirect go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/arch v0.3.0 // indirect + golang.org/x/arch v0.15.0 // indirect golang.org/x/crypto v0.35.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/net v0.35.0 // indirect golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.29.0 // indirect golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect diff --git a/tests/go.sum b/tests/go.sum index 6bf35edeab80..72d77726e524 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -275,11 +275,11 @@ github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/ github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/bytedance/sonic v1.12.9 h1:Od1BvK55NnewtGaJsTDeAOSnLVO2BTSLOe0+ooKokmQ= -github.com/bytedance/sonic v1.12.9/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8= +github.com/bytedance/sonic v1.13.1 h1:Jyd5CIvdFnkOWuKXr+wm4Nyk2h0yAFsr8ucJgEasO3g= +github.com/bytedance/sonic v1.13.1/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.2 h1:jxAJuN9fOot/cyz5Q6dUuMJF5OqQ6+5GfA8FjjQ0R4o= -github.com/bytedance/sonic/loader v0.2.2/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -741,8 +741,9 @@ github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrD github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -772,8 +773,9 @@ github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -1080,8 +1082,9 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1345,8 +1348,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/tests/systemtests/README.md b/tests/systemtests/README.md new file mode 100644 index 000000000000..d2aa7112d5be --- /dev/null +++ b/tests/systemtests/README.md @@ -0,0 +1,48 @@ +# System tests + +Go black box tests that setup and interact with a local blockchain. The system test [framework](../../systemtests) +works with the compiled binary of the chain artifact only. +To get up to speed, checkout the [getting started guide](../../systemtests/getting_started.md). + +Beside the Go tests and testdata files, this directory can contain the following directories: + +* `binaries` - cache for binary +* `testnet` - node files + +Please make sure to not add or push them to git. + +## Execution + +Build a new binary from current branch and copy it to the `tests/systemtests/binaries` folder by running system tests. +In project root: + +```shell +make test-system +``` + +Or via manual steps + +```shell +make build +mkdir -p ./tests/systemtests/binaries +cp ./build/simd ./tests/systemtests/binaries/ +``` + +### Manual test run + +```shell +go test -v -mod=readonly -failfast -tags='system_test' --run TestStakeUnstake ./... --verbose +``` + +### Working with macOS + +Most tests should function seamlessly. However, the file [upgrade_test.go](upgrade_test.go) includes a **build annotation** for Linux only. + +For the system upgrade test, an older version of the binary is utilized to perform a chain upgrade. This artifact is retrieved from a Docker container built for Linux. + +To circumvent this limitation locally: +1. Checkout and build the older version of the artifact from a specific tag for your OS. +2. Place the built artifact into the `binaries` folder. +3. Ensure that the filename, including the version, is correct. + +With the cached artifact in place, the test will use this file instead of attempting to pull it from Docker. \ No newline at end of file diff --git a/tests/systemtests/go.mod b/tests/systemtests/go.mod index 9c93aa2c3c8e..f06662d56c26 100644 --- a/tests/systemtests/go.mod +++ b/tests/systemtests/go.mod @@ -4,6 +4,7 @@ go 1.23.0 replace ( cosmossdk.io/api => ../../api + cosmossdk.io/log => ../../log cosmossdk.io/systemtests => ../../systemtests github.com/cosmos/cosmos-sdk => ../.. ) @@ -31,8 +32,8 @@ require ( github.com/DataDog/zstd v1.5.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.2.0 // indirect - github.com/bytedance/sonic v1.12.10 // indirect - github.com/bytedance/sonic/loader v0.2.3 // indirect + github.com/bytedance/sonic v1.13.1 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.5 // indirect @@ -104,13 +105,13 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/linxGnu/grocksdb v1.9.7 // indirect github.com/magiconair/properties v1.8.9 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -152,12 +153,12 @@ require ( go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/arch v0.13.0 // indirect + golang.org/x/arch v0.15.0 // indirect golang.org/x/crypto v0.35.0 // indirect golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect golang.org/x/net v0.35.0 // indirect golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.29.0 // indirect golang.org/x/text v0.22.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/tests/systemtests/go.sum b/tests/systemtests/go.sum index 1e662eebce72..8326b77f0071 100644 --- a/tests/systemtests/go.sum +++ b/tests/systemtests/go.sum @@ -8,8 +8,6 @@ cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g= -cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI= cosmossdk.io/math v1.5.0 h1:sbOASxee9Zxdjd6OkzogvBZ25/hP929vdcYcBJQbkLc= cosmossdk.io/math v1.5.0/go.mod h1:AAwwBmUhqtk2nlku174JwSll+/DepUXW3rWIXN5q+Nw= cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= @@ -75,11 +73,11 @@ github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/ github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= -github.com/bytedance/sonic v1.12.10 h1:uVCQr6oS5669E9ZVW0HyksTLfNS7Q/9hV6IVS4nEMsI= -github.com/bytedance/sonic v1.12.10/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8= +github.com/bytedance/sonic v1.13.1 h1:Jyd5CIvdFnkOWuKXr+wm4Nyk2h0yAFsr8ucJgEasO3g= +github.com/bytedance/sonic v1.13.1/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0= -github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -454,8 +452,8 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -486,8 +484,9 @@ github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -778,8 +777,8 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/arch v0.13.0 h1:KCkqVVV1kGg0X87TFysjCJ8MxtZEIU4Ja/yXGeoECdA= -golang.org/x/arch v0.13.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -908,8 +907,8 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= From a978969be512a0eaf1b874fca18ebc40cf3b749b Mon Sep 17 00:00:00 2001 From: Alex | Interchain Labs Date: Wed, 12 Mar 2025 12:30:28 -0400 Subject: [PATCH 07/18] chore: clean up CI (#23968) --- .github/workflows/test.yml | 308 ++++--------------------------------- 1 file changed, 32 insertions(+), 276 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5211564b9c8e..7fd49c0ae22c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -114,9 +114,40 @@ jobs: name: "${{ github.sha }}-integration-coverage" path: ./tests/integration-profile.out + test-e2e: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: "1.21" + check-latest: true + cache: true + cache-dependency-path: go.sum + - uses: technote-space/get-diff-action@v6.1.2 + id: git_diff + with: + PATTERNS: | + **/*.go + go.mod + go.sum + **/go.mod + **/go.sum + **/Makefile + Makefile + - name: e2e tests + if: env.GIT_DIFF + run: | + make test-e2e-cov + - uses: actions/upload-artifact@v4 + if: env.GIT_DIFF + with: + name: "${{ github.sha }}-e2e-coverage" + path: ./tests/e2e-profile.out + repo-analysis: runs-on: depot-ubuntu-22.04-4 - needs: [tests, test-integration] + needs: [tests, test-integration, test-e2e] steps: - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v6.1.2 @@ -324,28 +355,6 @@ jobs: cd schema go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - test-schema-testing: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - cache: true - cache-dependency-path: schema/testing/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - schema/testing/**/*.go - schema/testing/go.mod - schema/testing/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd schema - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic ./... - test-collections: runs-on: depot-ubuntu-22.04-4 steps: @@ -537,52 +546,6 @@ jobs: cd x/circuit go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - test-x-distribution: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/distribution/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/distribution/**/*.go - x/distribution/go.mod - x/distribution/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/distribution - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-protocolpool: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/protocolpool/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/protocolpool/**/*.go - x/protocolpool/go.mod - x/protocolpool/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/protocolpool - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - test-x-feegrant: runs-on: depot-ubuntu-22.04-4 steps: @@ -652,213 +615,6 @@ jobs: cd x/upgrade go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - test-x-group: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/group/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/group/**/*.go - x/group/go.mod - x/group/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/group - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-gov: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/gov/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/gov/**/*.go - x/gov/go.mod - x/gov/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/gov - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-slashing: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/slashing/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/slashing/**/*.go - x/slashing/go.mod - x/slashing/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/slashing - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-staking: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/staking/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/staking/**/*.go - x/staking/go.mod - x/staking/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/staking - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-authz: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/authz/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/authz/**/*.go - x/authz/go.mod - x/authz/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/authz - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-bank: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/bank/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/bank/**/*.go - x/bank/go.mod - x/bank/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/bank - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-mint: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/mint/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/mint/**/*.go - x/mint/go.mod - x/mint/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/mint - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-epochs: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/epochs/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/epochs/**/*.go - x/epochs/go.mod - x/epochs/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/epochs - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - - test-x-consensus: - runs-on: depot-ubuntu-22.04-4 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.23" - check-latest: true - cache: true - cache-dependency-path: x/consensus/go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - x/consensus/**/*.go - x/consensus/go.mod - x/consensus/go.sum - - name: tests - if: env.GIT_DIFF - run: | - cd x/consensus - go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./... - test-tools-benchmark: runs-on: depot-ubuntu-22.04-4 steps: From dbeae672f3c546de5703522bc1d248cf22bb877a Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Mar 2025 12:33:15 -0400 Subject: [PATCH 08/18] working test with pp disabled --- simapp/app_config.go | 379 ++++++++++--------- tests/e2e/distribution/grpc_query_suite.go | 5 +- tests/e2e/distribution/suite.go | 61 ++- tests/e2e/distribution/withdraw_all_suite.go | 4 +- 4 files changed, 254 insertions(+), 195 deletions(-) diff --git a/simapp/app_config.go b/simapp/app_config.go index 4b4072e791a2..4e47d02ddd80 100644 --- a/simapp/app_config.go +++ b/simapp/app_config.go @@ -100,195 +100,197 @@ var ( // govtypes.ModuleName } - // application configuration (used by depinject) - AppConfig = depinject.Configs(appconfig.Compose(&appv1alpha1.Config{ - Modules: []*appv1alpha1.ModuleConfig{ - { - Name: runtime.ModuleName, - Config: appconfig.WrapAny(&runtimev1alpha1.Module{ - AppName: "SimApp", - // NOTE: upgrade module is required to be prioritized - PreBlockers: []string{ - upgradetypes.ModuleName, - }, - // During begin block slashing happens after distr.BeginBlocker so that - // there is nothing left over in the validator fee pool, so as to keep the - // CanWithdrawInvariant invariant. - // NOTE: staking module is required if HistoricalEntries param > 0 - BeginBlockers: []string{ - minttypes.ModuleName, - distrtypes.ModuleName, - protocolpooltypes.ModuleName, - slashingtypes.ModuleName, - evidencetypes.ModuleName, - stakingtypes.ModuleName, - authz.ModuleName, - epochstypes.ModuleName, - }, - EndBlockers: []string{ - govtypes.ModuleName, - stakingtypes.ModuleName, - feegrant.ModuleName, - group.ModuleName, - protocolpooltypes.ModuleName, - }, - OverrideStoreKeys: []*runtimev1alpha1.StoreKeyConfig{ - { - ModuleName: authtypes.ModuleName, - KvStoreKey: "acc", - }, + ModuleConfig = []*appv1alpha1.ModuleConfig{ + { + Name: runtime.ModuleName, + Config: appconfig.WrapAny(&runtimev1alpha1.Module{ + AppName: "SimApp", + // NOTE: upgrade module is required to be prioritized + PreBlockers: []string{ + upgradetypes.ModuleName, + }, + // During begin block slashing happens after distr.BeginBlocker so that + // there is nothing left over in the validator fee pool, so as to keep the + // CanWithdrawInvariant invariant. + // NOTE: staking module is required if HistoricalEntries param > 0 + BeginBlockers: []string{ + minttypes.ModuleName, + distrtypes.ModuleName, + protocolpooltypes.ModuleName, + slashingtypes.ModuleName, + evidencetypes.ModuleName, + stakingtypes.ModuleName, + authz.ModuleName, + epochstypes.ModuleName, + }, + EndBlockers: []string{ + govtypes.ModuleName, + stakingtypes.ModuleName, + feegrant.ModuleName, + group.ModuleName, + protocolpooltypes.ModuleName, + }, + OverrideStoreKeys: []*runtimev1alpha1.StoreKeyConfig{ + { + ModuleName: authtypes.ModuleName, + KvStoreKey: "acc", }, - // NOTE: The genutils module must occur after staking so that pools are - // properly initialized with tokens from genesis accounts. - // NOTE: The genutils module must also occur after auth so that it can access the params from auth. - InitGenesis: []string{ - authtypes.ModuleName, - banktypes.ModuleName, - distrtypes.ModuleName, - stakingtypes.ModuleName, - slashingtypes.ModuleName, - govtypes.ModuleName, - minttypes.ModuleName, - genutiltypes.ModuleName, - evidencetypes.ModuleName, - authz.ModuleName, - feegrant.ModuleName, - nft.ModuleName, - group.ModuleName, - upgradetypes.ModuleName, - vestingtypes.ModuleName, - circuittypes.ModuleName, - epochstypes.ModuleName, - protocolpooltypes.ModuleName, - }, - // When ExportGenesis is not specified, the export genesis module order - // is equal to the init genesis order - ExportGenesis: []string{ - consensustypes.ModuleName, - authtypes.ModuleName, - protocolpooltypes.ModuleName, // Must be exported before bank - banktypes.ModuleName, - distrtypes.ModuleName, - stakingtypes.ModuleName, - slashingtypes.ModuleName, - govtypes.ModuleName, - minttypes.ModuleName, - genutiltypes.ModuleName, - evidencetypes.ModuleName, - authz.ModuleName, - feegrant.ModuleName, - nft.ModuleName, - group.ModuleName, - upgradetypes.ModuleName, - vestingtypes.ModuleName, - circuittypes.ModuleName, - epochstypes.ModuleName, - }, - // Uncomment if you want to set a custom migration order here. - // OrderMigrations: []string{}, - }), - }, - { - Name: authtypes.ModuleName, - Config: appconfig.WrapAny(&authmodulev1.Module{ - Bech32Prefix: "cosmos", - ModuleAccountPermissions: moduleAccPerms, - // By default modules authority is the governance module. This is configurable with the following: - // Authority: "group", // A custom module authority can be set using a module name - // Authority: "cosmos1cwwv22j5ca08ggdv9c2uky355k908694z577tv", // or a specific address - }), - }, - { - Name: vestingtypes.ModuleName, - Config: appconfig.WrapAny(&vestingmodulev1.Module{}), - }, - { - Name: banktypes.ModuleName, - Config: appconfig.WrapAny(&bankmodulev1.Module{ - BlockedModuleAccountsOverride: blockAccAddrs, - }), - }, - { - Name: stakingtypes.ModuleName, - Config: appconfig.WrapAny(&stakingmodulev1.Module{ - // NOTE: specifying a prefix is only necessary when using bech32 addresses - // If not specfied, the auth Bech32Prefix appended with "valoper" and "valcons" is used by default - Bech32PrefixValidator: "cosmosvaloper", - Bech32PrefixConsensus: "cosmosvalcons", - }), - }, - { - Name: slashingtypes.ModuleName, - Config: appconfig.WrapAny(&slashingmodulev1.Module{}), - }, - { - Name: "tx", - Config: appconfig.WrapAny(&txconfigv1.Config{ - SkipAnteHandler: true, // Enable this to skip the default antehandlers and set custom ante handlers. - }), - }, - { - Name: genutiltypes.ModuleName, - Config: appconfig.WrapAny(&genutilmodulev1.Module{}), - }, - { - Name: authz.ModuleName, - Config: appconfig.WrapAny(&authzmodulev1.Module{}), - }, - { - Name: upgradetypes.ModuleName, - Config: appconfig.WrapAny(&upgrademodulev1.Module{}), - }, - { - Name: distrtypes.ModuleName, - Config: appconfig.WrapAny(&distrmodulev1.Module{ - ProtocolPoolEnabled: true, - }), - }, - { - Name: evidencetypes.ModuleName, - Config: appconfig.WrapAny(&evidencemodulev1.Module{}), - }, - { - Name: minttypes.ModuleName, - Config: appconfig.WrapAny(&mintmodulev1.Module{}), - }, - { - Name: group.ModuleName, - Config: appconfig.WrapAny(&groupmodulev1.Module{ - MaxExecutionPeriod: durationpb.New(time.Second * 1209600), - MaxMetadataLen: 255, - }), - }, - { - Name: nft.ModuleName, - Config: appconfig.WrapAny(&nftmodulev1.Module{}), - }, - { - Name: feegrant.ModuleName, - Config: appconfig.WrapAny(&feegrantmodulev1.Module{}), - }, - { - Name: govtypes.ModuleName, - Config: appconfig.WrapAny(&govmodulev1.Module{}), - }, - { - Name: consensustypes.ModuleName, - Config: appconfig.WrapAny(&consensusmodulev1.Module{}), - }, - { - Name: circuittypes.ModuleName, - Config: appconfig.WrapAny(&circuitmodulev1.Module{}), - }, - { - Name: epochstypes.ModuleName, - Config: appconfig.WrapAny(&epochsmodulev1.Module{}), - }, - { - Name: protocolpooltypes.ModuleName, - Config: appconfig.WrapAny(&protocolpoolmodulev1.Module{}), - }, + }, + // NOTE: The genutils module must occur after staking so that pools are + // properly initialized with tokens from genesis accounts. + // NOTE: The genutils module must also occur after auth so that it can access the params from auth. + InitGenesis: []string{ + authtypes.ModuleName, + banktypes.ModuleName, + distrtypes.ModuleName, + stakingtypes.ModuleName, + slashingtypes.ModuleName, + govtypes.ModuleName, + minttypes.ModuleName, + genutiltypes.ModuleName, + evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + nft.ModuleName, + group.ModuleName, + upgradetypes.ModuleName, + vestingtypes.ModuleName, + circuittypes.ModuleName, + epochstypes.ModuleName, + protocolpooltypes.ModuleName, + }, + // When ExportGenesis is not specified, the export genesis module order + // is equal to the init genesis order + ExportGenesis: []string{ + consensustypes.ModuleName, + authtypes.ModuleName, + protocolpooltypes.ModuleName, // Must be exported before bank + banktypes.ModuleName, + distrtypes.ModuleName, + stakingtypes.ModuleName, + slashingtypes.ModuleName, + govtypes.ModuleName, + minttypes.ModuleName, + genutiltypes.ModuleName, + evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + nft.ModuleName, + group.ModuleName, + upgradetypes.ModuleName, + vestingtypes.ModuleName, + circuittypes.ModuleName, + epochstypes.ModuleName, + }, + // Uncomment if you want to set a custom migration order here. + // OrderMigrations: []string{}, + }), + }, + { + Name: authtypes.ModuleName, + Config: appconfig.WrapAny(&authmodulev1.Module{ + Bech32Prefix: "cosmos", + ModuleAccountPermissions: moduleAccPerms, + // By default modules authority is the governance module. This is configurable with the following: + // Authority: "group", // A custom module authority can be set using a module name + // Authority: "cosmos1cwwv22j5ca08ggdv9c2uky355k908694z577tv", // or a specific address + }), + }, + { + Name: vestingtypes.ModuleName, + Config: appconfig.WrapAny(&vestingmodulev1.Module{}), + }, + { + Name: banktypes.ModuleName, + Config: appconfig.WrapAny(&bankmodulev1.Module{ + BlockedModuleAccountsOverride: blockAccAddrs, + }), + }, + { + Name: stakingtypes.ModuleName, + Config: appconfig.WrapAny(&stakingmodulev1.Module{ + // NOTE: specifying a prefix is only necessary when using bech32 addresses + // If not specfied, the auth Bech32Prefix appended with "valoper" and "valcons" is used by default + Bech32PrefixValidator: "cosmosvaloper", + Bech32PrefixConsensus: "cosmosvalcons", + }), + }, + { + Name: slashingtypes.ModuleName, + Config: appconfig.WrapAny(&slashingmodulev1.Module{}), + }, + { + Name: "tx", + Config: appconfig.WrapAny(&txconfigv1.Config{ + SkipAnteHandler: true, // Enable this to skip the default antehandlers and set custom ante handlers. + }), + }, + { + Name: genutiltypes.ModuleName, + Config: appconfig.WrapAny(&genutilmodulev1.Module{}), + }, + { + Name: authz.ModuleName, + Config: appconfig.WrapAny(&authzmodulev1.Module{}), + }, + { + Name: upgradetypes.ModuleName, + Config: appconfig.WrapAny(&upgrademodulev1.Module{}), + }, + { + Name: distrtypes.ModuleName, + Config: appconfig.WrapAny(&distrmodulev1.Module{ + ProtocolPoolEnabled: true, + }), + }, + { + Name: evidencetypes.ModuleName, + Config: appconfig.WrapAny(&evidencemodulev1.Module{}), }, + { + Name: minttypes.ModuleName, + Config: appconfig.WrapAny(&mintmodulev1.Module{}), + }, + { + Name: group.ModuleName, + Config: appconfig.WrapAny(&groupmodulev1.Module{ + MaxExecutionPeriod: durationpb.New(time.Second * 1209600), + MaxMetadataLen: 255, + }), + }, + { + Name: nft.ModuleName, + Config: appconfig.WrapAny(&nftmodulev1.Module{}), + }, + { + Name: feegrant.ModuleName, + Config: appconfig.WrapAny(&feegrantmodulev1.Module{}), + }, + { + Name: govtypes.ModuleName, + Config: appconfig.WrapAny(&govmodulev1.Module{}), + }, + { + Name: consensustypes.ModuleName, + Config: appconfig.WrapAny(&consensusmodulev1.Module{}), + }, + { + Name: circuittypes.ModuleName, + Config: appconfig.WrapAny(&circuitmodulev1.Module{}), + }, + { + Name: epochstypes.ModuleName, + Config: appconfig.WrapAny(&epochsmodulev1.Module{}), + }, + { + Name: protocolpooltypes.ModuleName, + Config: appconfig.WrapAny(&protocolpoolmodulev1.Module{}), + }, + } + + // AppConfig is application configuration (used by depinject) + AppConfig = depinject.Configs(appconfig.Compose(&appv1alpha1.Config{ + Modules: ModuleConfig, }), depinject.Supply( // supply custom module basics @@ -298,5 +300,6 @@ var ( []govclient.ProposalHandler{}, ), }, - )) + ), + ) ) diff --git a/tests/e2e/distribution/grpc_query_suite.go b/tests/e2e/distribution/grpc_query_suite.go index 6d40625d7e57..a7d7dd03f30a 100644 --- a/tests/e2e/distribution/grpc_query_suite.go +++ b/tests/e2e/distribution/grpc_query_suite.go @@ -6,8 +6,6 @@ import ( "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" - "cosmossdk.io/simapp" - sdktestutil "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" @@ -26,7 +24,8 @@ type GRPCQueryTestSuite struct { func (s *GRPCQueryTestSuite) SetupSuite() { s.T().Log("setting up e2e test suite") - cfg := network.DefaultConfig(simapp.NewTestNetworkFixture) + cfg := initNetworkConfig(s.T(), false) + cfg.NumValidators = 1 s.cfg = cfg diff --git a/tests/e2e/distribution/suite.go b/tests/e2e/distribution/suite.go index 54d02961f747..a63686bc7ee9 100644 --- a/tests/e2e/distribution/suite.go +++ b/tests/e2e/distribution/suite.go @@ -4,11 +4,17 @@ import ( "context" "encoding/hex" "fmt" + "github.com/stretchr/testify/require" + "testing" "time" "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" + appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1" + distrmodulev1 "cosmossdk.io/api/cosmos/distribution/module/v1" + "cosmossdk.io/depinject" + "cosmossdk.io/depinject/appconfig" "cosmossdk.io/math" "cosmossdk.io/simapp" @@ -19,8 +25,14 @@ import ( clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" ) @@ -35,6 +47,52 @@ func NewE2ETestSuite(cfg network.Config) *E2ETestSuite { return &E2ETestSuite{cfg: cfg} } +func findAndReplaceModuleConfig(moduleConfig []*appv1alpha1.ModuleConfig, cfg *appv1alpha1.ModuleConfig) ([]*appv1alpha1.ModuleConfig, error) { + for i, module := range moduleConfig { + if module.Name == cfg.Name { + moduleConfig[i] = cfg + return moduleConfig, nil + } + } + + return moduleConfig, fmt.Errorf("module %s not found", cfg.Name) +} + +func initNetworkConfig(t *testing.T, protocolPoolEnabled bool) network.Config { + t.Helper() + + // overwrite the module config so that protocolpool is disabled + moduleConfig := simapp.ModuleConfig + moduleConfig, err := findAndReplaceModuleConfig(moduleConfig, &appv1alpha1.ModuleConfig{ + Name: distrtypes.ModuleName, + Config: appconfig.WrapAny(&distrmodulev1.Module{ + ProtocolPoolEnabled: protocolPoolEnabled, + }), + }) + require.NoError(t, err) + + t.Log("setting up the e2e test suite", moduleConfig) + + // application configuration (used by depinject) + AppConfig := depinject.Configs(appconfig.Compose(&appv1alpha1.Config{ + Modules: moduleConfig, + }), + depinject.Supply( + // supply custom module basics + map[string]module.AppModuleBasic{ + genutiltypes.ModuleName: genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), + govtypes.ModuleName: gov.NewAppModuleBasic( + []govclient.ProposalHandler{}, + ), + }, + ), + ) + + cfg, err := network.DefaultConfigWithAppConfig(AppConfig) + require.NoError(t, err) + return cfg +} + // SetupSuite creates a new network for _each_ e2e test. We create a new // network for each test because there are some state modifications that are // needed to be made in order to make useful queries. However, we don't want @@ -42,7 +100,8 @@ func NewE2ETestSuite(cfg network.Config) *E2ETestSuite { func (s *E2ETestSuite) SetupSuite() { s.T().Log("setting up e2e test suite") - cfg := network.DefaultConfig(simapp.NewTestNetworkFixture) + cfg := initNetworkConfig(s.T(), false) + cfg.NumValidators = 1 s.cfg = cfg diff --git a/tests/e2e/distribution/withdraw_all_suite.go b/tests/e2e/distribution/withdraw_all_suite.go index 18a7a5b11555..7863b0c5b27c 100644 --- a/tests/e2e/distribution/withdraw_all_suite.go +++ b/tests/e2e/distribution/withdraw_all_suite.go @@ -7,8 +7,6 @@ import ( "github.com/stretchr/testify/suite" "cosmossdk.io/math" - "cosmossdk.io/simapp" - "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -29,7 +27,7 @@ type WithdrawAllTestSuite struct { } func (s *WithdrawAllTestSuite) SetupSuite() { - cfg := network.DefaultConfig(simapp.NewTestNetworkFixture) + cfg := initNetworkConfig(s.T(), false) cfg.NumValidators = 2 s.cfg = cfg From 1e307c7541d99c1bcb3754d2b5812a20870905a9 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Mar 2025 13:06:10 -0400 Subject: [PATCH 09/18] lint --- tests/e2e/distribution/cli_test.go | 9 ++++++--- tests/e2e/distribution/grpc_query_suite.go | 15 ++++++++++----- tests/e2e/distribution/suite.go | 15 ++++++++------- tests/e2e/distribution/withdraw_all_suite.go | 16 +++++++++++----- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/tests/e2e/distribution/cli_test.go b/tests/e2e/distribution/cli_test.go index 34d8cb0e0591..9a9c90c198cf 100644 --- a/tests/e2e/distribution/cli_test.go +++ b/tests/e2e/distribution/cli_test.go @@ -10,13 +10,16 @@ import ( ) func TestE2ETestSuite(t *testing.T) { - suite.Run(t, new(E2ETestSuite)) + suite.Run(t, NewE2ETestSuite(false)) + suite.Run(t, NewE2ETestSuite(true)) } func TestGRPCQueryTestSuite(t *testing.T) { - suite.Run(t, new(GRPCQueryTestSuite)) + suite.Run(t, NewGRPCQueryTestSuite(false)) + // suite.Run(t, NewGRPCQueryTestSuite(true)) } func TestWithdrawAllSuite(t *testing.T) { - suite.Run(t, new(WithdrawAllTestSuite)) + suite.Run(t, NewWithdrawAllTestSuite(false)) + // suite.Run(t, NewWithdrawAllTestSuite(true)) } diff --git a/tests/e2e/distribution/grpc_query_suite.go b/tests/e2e/distribution/grpc_query_suite.go index a7d7dd03f30a..0222db1dbb94 100644 --- a/tests/e2e/distribution/grpc_query_suite.go +++ b/tests/e2e/distribution/grpc_query_suite.go @@ -17,14 +17,19 @@ import ( type GRPCQueryTestSuite struct { suite.Suite - cfg network.Config - network *network.Network + protocolPoolEnabled bool + cfg network.Config + network *network.Network +} + +func NewGRPCQueryTestSuite(protocolPoolEnabled bool) *GRPCQueryTestSuite { + return &GRPCQueryTestSuite{protocolPoolEnabled: protocolPoolEnabled} } func (s *GRPCQueryTestSuite) SetupSuite() { - s.T().Log("setting up e2e test suite") + s.T().Log("setting up grpc e2e test suite") - cfg := initNetworkConfig(s.T(), false) + cfg := initNetworkConfig(s.T(), s.protocolPoolEnabled) cfg.NumValidators = 1 s.cfg = cfg @@ -38,7 +43,7 @@ func (s *GRPCQueryTestSuite) SetupSuite() { // TearDownSuite cleans up the curret test network after _each_ test. func (s *GRPCQueryTestSuite) TearDownSuite() { - s.T().Log("tearing down e2e test suite1") + s.T().Log("tearing down grpc e2e test suite") s.network.Cleanup() } diff --git a/tests/e2e/distribution/suite.go b/tests/e2e/distribution/suite.go index a63686bc7ee9..b2d533e8864f 100644 --- a/tests/e2e/distribution/suite.go +++ b/tests/e2e/distribution/suite.go @@ -4,11 +4,11 @@ import ( "context" "encoding/hex" "fmt" - "github.com/stretchr/testify/require" "testing" "time" "github.com/cosmos/gogoproto/proto" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1" @@ -39,12 +39,13 @@ import ( type E2ETestSuite struct { suite.Suite - cfg network.Config - network *network.Network + protocolPoolEnabled bool + cfg network.Config + network *network.Network } -func NewE2ETestSuite(cfg network.Config) *E2ETestSuite { - return &E2ETestSuite{cfg: cfg} +func NewE2ETestSuite(protocolPoolEnabled bool) *E2ETestSuite { + return &E2ETestSuite{protocolPoolEnabled: protocolPoolEnabled} } func findAndReplaceModuleConfig(moduleConfig []*appv1alpha1.ModuleConfig, cfg *appv1alpha1.ModuleConfig) ([]*appv1alpha1.ModuleConfig, error) { @@ -71,7 +72,7 @@ func initNetworkConfig(t *testing.T, protocolPoolEnabled bool) network.Config { }) require.NoError(t, err) - t.Log("setting up the e2e test suite", moduleConfig) + t.Log("setting up the e2e test suite", "protocolPoolEnabled", protocolPoolEnabled) // application configuration (used by depinject) AppConfig := depinject.Configs(appconfig.Compose(&appv1alpha1.Config{ @@ -100,7 +101,7 @@ func initNetworkConfig(t *testing.T, protocolPoolEnabled bool) network.Config { func (s *E2ETestSuite) SetupSuite() { s.T().Log("setting up e2e test suite") - cfg := initNetworkConfig(s.T(), false) + cfg := initNetworkConfig(s.T(), s.protocolPoolEnabled) cfg.NumValidators = 1 s.cfg = cfg diff --git a/tests/e2e/distribution/withdraw_all_suite.go b/tests/e2e/distribution/withdraw_all_suite.go index 7863b0c5b27c..bf5de4a51391 100644 --- a/tests/e2e/distribution/withdraw_all_suite.go +++ b/tests/e2e/distribution/withdraw_all_suite.go @@ -22,16 +22,22 @@ import ( type WithdrawAllTestSuite struct { suite.Suite - cfg network.Config - network *network.Network + protocolPoolEnabled bool + cfg network.Config + network *network.Network +} + +func NewWithdrawAllTestSuite(protocolPoolEnabled bool) *WithdrawAllTestSuite { + return &WithdrawAllTestSuite{protocolPoolEnabled: protocolPoolEnabled} } func (s *WithdrawAllTestSuite) SetupSuite() { - cfg := initNetworkConfig(s.T(), false) + s.T().Log("setting up withdraw all e2e test suite") + + cfg := initNetworkConfig(s.T(), s.protocolPoolEnabled) cfg.NumValidators = 2 s.cfg = cfg - s.T().Log("setting up e2e test suite") network, err := network.New(s.T(), s.T().TempDir(), s.cfg) s.Require().NoError(err) s.network = network @@ -41,7 +47,7 @@ func (s *WithdrawAllTestSuite) SetupSuite() { // TearDownSuite cleans up the curret test network after _each_ test. func (s *WithdrawAllTestSuite) TearDownSuite() { - s.T().Log("tearing down e2e test suite") + s.T().Log("tearing down withdraw all e2e test suite") s.network.Cleanup() } From dc64c6e9ade4fa93564ea5d2876db657caaf6007 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Mar 2025 15:46:12 -0400 Subject: [PATCH 10/18] test fully --- tests/e2e/distribution/cli_test.go | 4 ++-- tests/e2e/distribution/grpc_query_suite.go | 17 ++++++++++++----- tests/e2e/distribution/suite.go | 13 +++++++++---- testutil/rest.go | 5 +++++ 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/tests/e2e/distribution/cli_test.go b/tests/e2e/distribution/cli_test.go index 9a9c90c198cf..09f0ecf13493 100644 --- a/tests/e2e/distribution/cli_test.go +++ b/tests/e2e/distribution/cli_test.go @@ -16,10 +16,10 @@ func TestE2ETestSuite(t *testing.T) { func TestGRPCQueryTestSuite(t *testing.T) { suite.Run(t, NewGRPCQueryTestSuite(false)) - // suite.Run(t, NewGRPCQueryTestSuite(true)) + suite.Run(t, NewGRPCQueryTestSuite(true)) } func TestWithdrawAllSuite(t *testing.T) { suite.Run(t, NewWithdrawAllTestSuite(false)) - // suite.Run(t, NewWithdrawAllTestSuite(true)) + suite.Run(t, NewWithdrawAllTestSuite(true)) } diff --git a/tests/e2e/distribution/grpc_query_suite.go b/tests/e2e/distribution/grpc_query_suite.go index 0222db1dbb94..ce26bf08bf7b 100644 --- a/tests/e2e/distribution/grpc_query_suite.go +++ b/tests/e2e/distribution/grpc_query_suite.go @@ -1,6 +1,7 @@ package distribution import ( + "encoding/json" "fmt" "github.com/cosmos/gogoproto/proto" @@ -493,13 +494,19 @@ func (s *GRPCQueryTestSuite) TestQueryValidatorCommunityPoolGRPC() { } for _, tc := range testCases { - tc := tc - resp, err := sdktestutil.GetRequestWithHeaders(tc.url, tc.headers) - s.Run(tc.name, func() { - if tc.expErr { + resp, err := sdktestutil.GetRequestWithHeaders(tc.url, tc.headers) + + switch { + case tc.expErr: s.Require().Error(err) - } else { + case s.protocolPoolEnabled: + s.Require().NoError(err) + var errMessage sdktestutil.ErrorResponse + s.Require().NoError(json.Unmarshal(resp, &errMessage)) + s.Require().Equal(2, errMessage.Code) + s.Require().Equal("protocol pool is enabled - to query CommunityPool use the query exposed by x/protocolpool: invalid request: unknown request", errMessage.Message) + default: s.Require().NoError(err) s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) diff --git a/tests/e2e/distribution/suite.go b/tests/e2e/distribution/suite.go index b2d533e8864f..0c99d7bb33cf 100644 --- a/tests/e2e/distribution/suite.go +++ b/tests/e2e/distribution/suite.go @@ -424,16 +424,21 @@ func (s *E2ETestSuite) TestNewFundCommunityPoolCmd() { } for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { cmd := cli.NewFundCommunityPoolCmd(address.NewBech32Codec("cosmos")) clientCtx := val.ClientCtx out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { + switch { + case tc.expectErr: s.Require().Error(err) - } else { + case s.protocolPoolEnabled: + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType)) + txResp := tc.respType.(*sdk.TxResponse) + // expect 18 because we cannot submit to distribution + s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, 18)) + default: s.Require().NoError(err) s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) diff --git a/testutil/rest.go b/testutil/rest.go index 6dc1c5792ff9..506923a15e72 100644 --- a/testutil/rest.go +++ b/testutil/rest.go @@ -7,6 +7,11 @@ import ( "net/http" ) +type ErrorResponse struct { + Code int `json:"code"` + Message string `json:"message"` +} + // GetRequestWithHeaders defines a wrapper around an HTTP GET request with a provided URL // and custom headers // An error is returned if the request or reading the body fails. From a1b7ece7b4c98ce977679b85cc636ff595b16688 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Mar 2025 15:55:12 -0400 Subject: [PATCH 11/18] fix --- x/distribution/keeper/allocation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 06b1db5783b2..360bd247046a 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -2,7 +2,6 @@ package keeper import ( "context" - protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" abci "github.com/cometbft/cometbft/abci/types" @@ -10,6 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" + protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) From 57d87db179c2d92fbb97b8e7ee85e8f5b513ec9b Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Mar 2025 15:57:01 -0400 Subject: [PATCH 12/18] add logging --- x/distribution/keeper/allocation.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 360bd247046a..69eda039d657 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -158,10 +158,11 @@ func (k Keeper) sendCommunityPoolToProtocolPool(ctx sdk.Context) error { return nil } - amt, re := feePool.CommunityPool.TruncateDecimal() + amt, remaining := feePool.CommunityPool.TruncateDecimal() + ctx.Logger().Info("sending distribution community pool amount to protocol pool", "amount", amt.String(), "remaining", remaining.String()) if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, protocolpooltypes.ProtocolPoolDistrAccount, amt); err != nil { return err } - return k.FeePool.Set(ctx, types.FeePool{CommunityPool: re}) + return k.FeePool.Set(ctx, types.FeePool{CommunityPool: remaining}) } From 0761ba1532a5ef41bc6ba21a892ae4acee51abe8 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Mar 2025 15:57:34 -0400 Subject: [PATCH 13/18] add logging --- x/distribution/keeper/allocation.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 69eda039d657..9e377e1a29db 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -159,7 +159,11 @@ func (k Keeper) sendCommunityPoolToProtocolPool(ctx sdk.Context) error { } amt, remaining := feePool.CommunityPool.TruncateDecimal() - ctx.Logger().Info("sending distribution community pool amount to protocol pool", "amount", amt.String(), "remaining", remaining.String()) + ctx.Logger().Info( + "sending distribution community pool amount to protocol pool", + "amount", amt.String(), + "remaining", remaining.String(), + ) if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, protocolpooltypes.ProtocolPoolDistrAccount, amt); err != nil { return err } From 84eab8b4c87ed569c5371cb66c97a235145c1fdf Mon Sep 17 00:00:00 2001 From: plubber <51789398+ericHgorski@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:33:49 -0400 Subject: [PATCH 14/18] fix: update documentation links for module migrations and error types (#24003) --- api/cosmos/app/runtime/v1alpha1/module.pulsar.go | 2 +- proto/cosmos/app/runtime/v1alpha1/module.proto | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/cosmos/app/runtime/v1alpha1/module.pulsar.go b/api/cosmos/app/runtime/v1alpha1/module.pulsar.go index c1da19eccf67..62f92a4061a8 100644 --- a/api/cosmos/app/runtime/v1alpha1/module.pulsar.go +++ b/api/cosmos/app/runtime/v1alpha1/module.pulsar.go @@ -2217,7 +2217,7 @@ type Module struct { SkipStoreKeys []string `protobuf:"bytes,11,rep,name=skip_store_keys,json=skipStoreKeys,proto3" json:"skip_store_keys,omitempty"` // order_migrations defines the order in which module migrations are performed. // If this is left empty, it uses the default migration order. - // https://pkg.go.dev/github.com/cosmos/cosmos-sdk@v0.47.0-alpha2/types/module#DefaultMigrationsOrder + // https://pkg.go.dev/github.com/cosmos/cosmos-sdk/types/module#DefaultMigrationsOrder OrderMigrations []string `protobuf:"bytes,7,rep,name=order_migrations,json=orderMigrations,proto3" json:"order_migrations,omitempty"` // precommiters specifies the module names of the precommiters // to call in the order in which they should be called. If this is left empty diff --git a/proto/cosmos/app/runtime/v1alpha1/module.proto b/proto/cosmos/app/runtime/v1alpha1/module.proto index 516156dcb7d1..826376db4ddc 100644 --- a/proto/cosmos/app/runtime/v1alpha1/module.proto +++ b/proto/cosmos/app/runtime/v1alpha1/module.proto @@ -45,7 +45,7 @@ message Module { // order_migrations defines the order in which module migrations are performed. // If this is left empty, it uses the default migration order. - // https://pkg.go.dev/github.com/cosmos/cosmos-sdk@v0.47.0-alpha2/types/module#DefaultMigrationsOrder + // https://pkg.go.dev/github.com/cosmos/cosmos-sdk/types/module#DefaultMigrationsOrder repeated string order_migrations = 7; // precommiters specifies the module names of the precommiters From 742beb3ea2cce8d995fbe26917c158875a988cb5 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Fri, 14 Mar 2025 13:04:59 -0400 Subject: [PATCH 15/18] init --- tests/e2e/distribution/grpc_query_suite.go | 12 +++--- tests/e2e/distribution/suite.go | 42 +++++++++---------- tests/e2e/distribution/withdraw_all_suite.go | 8 ++-- tests/integration/protocolpool/module_test.go | 32 ++++++++++++++ testutil/configurator/configurator.go | 11 +++++ x/distribution/keeper/abci.go | 4 +- x/distribution/keeper/abci_test.go | 21 +++++++++- x/distribution/keeper/allocation.go | 12 +++--- x/distribution/keeper/common_test.go | 2 +- x/distribution/testutil/app_config.go | 1 + x/protocolpool/app_config.go | 26 ++++++++++++ 11 files changed, 128 insertions(+), 43 deletions(-) create mode 100644 tests/integration/protocolpool/module_test.go create mode 100644 x/protocolpool/app_config.go diff --git a/tests/e2e/distribution/grpc_query_suite.go b/tests/e2e/distribution/grpc_query_suite.go index ce26bf08bf7b..6a595a402a1a 100644 --- a/tests/e2e/distribution/grpc_query_suite.go +++ b/tests/e2e/distribution/grpc_query_suite.go @@ -18,19 +18,19 @@ import ( type GRPCQueryTestSuite struct { suite.Suite - protocolPoolEnabled bool + externalPoolEnabled bool cfg network.Config network *network.Network } -func NewGRPCQueryTestSuite(protocolPoolEnabled bool) *GRPCQueryTestSuite { - return &GRPCQueryTestSuite{protocolPoolEnabled: protocolPoolEnabled} +func NewGRPCQueryTestSuite(externalPoolEnabled bool) *GRPCQueryTestSuite { + return &GRPCQueryTestSuite{externalPoolEnabled: externalPoolEnabled} } func (s *GRPCQueryTestSuite) SetupSuite() { s.T().Log("setting up grpc e2e test suite") - cfg := initNetworkConfig(s.T(), s.protocolPoolEnabled) + cfg := initNetworkConfig(s.T(), s.externalPoolEnabled) cfg.NumValidators = 1 s.cfg = cfg @@ -500,12 +500,12 @@ func (s *GRPCQueryTestSuite) TestQueryValidatorCommunityPoolGRPC() { switch { case tc.expErr: s.Require().Error(err) - case s.protocolPoolEnabled: + case s.externalPoolEnabled: s.Require().NoError(err) var errMessage sdktestutil.ErrorResponse s.Require().NoError(json.Unmarshal(resp, &errMessage)) s.Require().Equal(2, errMessage.Code) - s.Require().Equal("protocol pool is enabled - to query CommunityPool use the query exposed by x/protocolpool: invalid request: unknown request", errMessage.Message) + s.Require().Equal("external community pool is enabled - use the CommunityPool query exposed by the external community pool: invalid request: unknown request", errMessage.Message) default: s.Require().NoError(err) s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) diff --git a/tests/e2e/distribution/suite.go b/tests/e2e/distribution/suite.go index 0c99d7bb33cf..e48c03f05f8c 100644 --- a/tests/e2e/distribution/suite.go +++ b/tests/e2e/distribution/suite.go @@ -4,6 +4,7 @@ import ( "context" "encoding/hex" "fmt" + protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" "testing" "time" @@ -12,7 +13,6 @@ import ( "github.com/stretchr/testify/suite" appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1" - distrmodulev1 "cosmossdk.io/api/cosmos/distribution/module/v1" "cosmossdk.io/depinject" "cosmossdk.io/depinject/appconfig" "cosmossdk.io/math" @@ -39,40 +39,38 @@ import ( type E2ETestSuite struct { suite.Suite - protocolPoolEnabled bool + externalPoolEnabled bool cfg network.Config network *network.Network } -func NewE2ETestSuite(protocolPoolEnabled bool) *E2ETestSuite { - return &E2ETestSuite{protocolPoolEnabled: protocolPoolEnabled} +func NewE2ETestSuite(externalPoolEnabled bool) *E2ETestSuite { + return &E2ETestSuite{externalPoolEnabled: externalPoolEnabled} } -func findAndReplaceModuleConfig(moduleConfig []*appv1alpha1.ModuleConfig, cfg *appv1alpha1.ModuleConfig) ([]*appv1alpha1.ModuleConfig, error) { - for i, module := range moduleConfig { - if module.Name == cfg.Name { - moduleConfig[i] = cfg - return moduleConfig, nil +func removeModuleConfig(moduleConfig []*appv1alpha1.ModuleConfig, target string) []*appv1alpha1.ModuleConfig { + newConfig := make([]*appv1alpha1.ModuleConfig, 0, len(moduleConfig)) + for _, mod := range moduleConfig { + if mod.Name != target { + newConfig = append(newConfig, mod) } } - return moduleConfig, fmt.Errorf("module %s not found", cfg.Name) + return newConfig } -func initNetworkConfig(t *testing.T, protocolPoolEnabled bool) network.Config { +func initNetworkConfig(t *testing.T, externalPoolEnabled bool) network.Config { t.Helper() - // overwrite the module config so that protocolpool is disabled moduleConfig := simapp.ModuleConfig - moduleConfig, err := findAndReplaceModuleConfig(moduleConfig, &appv1alpha1.ModuleConfig{ - Name: distrtypes.ModuleName, - Config: appconfig.WrapAny(&distrmodulev1.Module{ - ProtocolPoolEnabled: protocolPoolEnabled, - }), - }) - require.NoError(t, err) + var err error + + // overwrite the module config so that protocolpool is removed "disabling" it + if !externalPoolEnabled { + moduleConfig = removeModuleConfig(moduleConfig, protocolpooltypes.ModuleName) + } - t.Log("setting up the e2e test suite", "protocolPoolEnabled", protocolPoolEnabled) + t.Log("setting up the e2e test suite", "externalPoolEnabled", externalPoolEnabled) // application configuration (used by depinject) AppConfig := depinject.Configs(appconfig.Compose(&appv1alpha1.Config{ @@ -101,7 +99,7 @@ func initNetworkConfig(t *testing.T, protocolPoolEnabled bool) network.Config { func (s *E2ETestSuite) SetupSuite() { s.T().Log("setting up e2e test suite") - cfg := initNetworkConfig(s.T(), s.protocolPoolEnabled) + cfg := initNetworkConfig(s.T(), s.externalPoolEnabled) cfg.NumValidators = 1 s.cfg = cfg @@ -432,7 +430,7 @@ func (s *E2ETestSuite) TestNewFundCommunityPoolCmd() { switch { case tc.expectErr: s.Require().Error(err) - case s.protocolPoolEnabled: + case s.externalPoolEnabled: s.Require().NoError(err) s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType)) txResp := tc.respType.(*sdk.TxResponse) diff --git a/tests/e2e/distribution/withdraw_all_suite.go b/tests/e2e/distribution/withdraw_all_suite.go index bf5de4a51391..5bd4b439cecb 100644 --- a/tests/e2e/distribution/withdraw_all_suite.go +++ b/tests/e2e/distribution/withdraw_all_suite.go @@ -22,19 +22,19 @@ import ( type WithdrawAllTestSuite struct { suite.Suite - protocolPoolEnabled bool + externalPoolEnabled bool cfg network.Config network *network.Network } -func NewWithdrawAllTestSuite(protocolPoolEnabled bool) *WithdrawAllTestSuite { - return &WithdrawAllTestSuite{protocolPoolEnabled: protocolPoolEnabled} +func NewWithdrawAllTestSuite(externalPoolEnabled bool) *WithdrawAllTestSuite { + return &WithdrawAllTestSuite{externalPoolEnabled: externalPoolEnabled} } func (s *WithdrawAllTestSuite) SetupSuite() { s.T().Log("setting up withdraw all e2e test suite") - cfg := initNetworkConfig(s.T(), s.protocolPoolEnabled) + cfg := initNetworkConfig(s.T(), s.externalPoolEnabled) cfg.NumValidators = 2 s.cfg = cfg diff --git a/tests/integration/protocolpool/module_test.go b/tests/integration/protocolpool/module_test.go new file mode 100644 index 000000000000..85195e78d3e6 --- /dev/null +++ b/tests/integration/protocolpool/module_test.go @@ -0,0 +1,32 @@ +package protocolpool + +import ( + "testing" + + "gotest.tools/v3/assert" + + "cosmossdk.io/depinject" + "cosmossdk.io/log" + + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/distribution/testutil" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { + var accountKeeper authkeeper.AccountKeeper + + app, err := simtestutil.SetupAtGenesis( + depinject.Configs( + testutil.AppConfig, + depinject.Supply(log.NewNopLogger()), + ), + &accountKeeper) + assert.NilError(t, err) + + ctx := app.BaseApp.NewContext(false) + acc := accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ModuleName)) + assert.Assert(t, acc != nil) +} diff --git a/testutil/configurator/configurator.go b/testutil/configurator/configurator.go index 4359b57a5dff..765e4004f062 100644 --- a/testutil/configurator/configurator.go +++ b/testutil/configurator/configurator.go @@ -17,12 +17,14 @@ import ( mintmodulev1 "cosmossdk.io/api/cosmos/mint/module/v1" nftmodulev1 "cosmossdk.io/api/cosmos/nft/module/v1" paramsmodulev1 "cosmossdk.io/api/cosmos/params/module/v1" + protocolpoolmodulev1 "cosmossdk.io/api/cosmos/protocolpool/module/v1" slashingmodulev1 "cosmossdk.io/api/cosmos/slashing/module/v1" stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1" txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" vestingmodulev1 "cosmossdk.io/api/cosmos/vesting/module/v1" "cosmossdk.io/core/appconfig" "cosmossdk.io/depinject" + protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" ) // Config should never need to be instantiated manually and is solely used for ModuleOption. @@ -309,6 +311,15 @@ func CircuitModule() ModuleOption { } } +func ProtocolPoolModule() ModuleOption { + return func(config *Config) { + config.ModuleConfigs[protocolpooltypes.ModuleName] = &appv1alpha1.ModuleConfig{ + Name: protocolpooltypes.ModuleName, + Config: appconfig.WrapAny(&protocolpoolmodulev1.Module{}), + } + } +} + func OmitInitGenesis() ModuleOption { return func(config *Config) { config.setInitGenesis = false diff --git a/x/distribution/keeper/abci.go b/x/distribution/keeper/abci.go index 7f30c5ae35ab..61b908812428 100644 --- a/x/distribution/keeper/abci.go +++ b/x/distribution/keeper/abci.go @@ -30,8 +30,8 @@ func (k Keeper) BeginBlocker(ctx sdk.Context) error { } // every 1000 blocks send whole coins from community pool to x/protocolpool if enabled - if height%truncationBlockInterval == 0 && k.protocolPoolEnabled { - if err := k.sendCommunityPoolToProtocolPool(ctx); err != nil { + if height%truncationBlockInterval == 0 && k.externalCommunityPoolEnabled() { + if err := k.sendCommunityPoolToExternalPool(ctx); err != nil { return err } } diff --git a/x/distribution/keeper/abci_test.go b/x/distribution/keeper/abci_test.go index d1e11a6e4019..9ee0da62ffc9 100644 --- a/x/distribution/keeper/abci_test.go +++ b/x/distribution/keeper/abci_test.go @@ -31,6 +31,22 @@ var ( testProposerAddress = sdk.ConsAddress("test") ) +var _ disttypes.ExternalCommunityPoolKeeper = &mockProtocolPoolKeeper{} + +type mockProtocolPoolKeeper struct{} + +func (m mockProtocolPoolKeeper) GetCommunityPoolModule() string { + return protocolpooltypes.ProtocolPoolDistrAccount +} + +func (m mockProtocolPoolKeeper) FundCommunityPool(_ sdk.Context, _ sdk.Coins, _ sdk.AccAddress) error { + panic("do not use me") +} + +func (m mockProtocolPoolKeeper) DistributeFromCommunityPool(_ sdk.Context, _ sdk.Coins, _ sdk.AccAddress) error { + panic("do not use me") +} + type testSetup struct { testCtx testutil.TestContext bankKeeper *distrtestutil.MockBankKeeper @@ -58,9 +74,9 @@ func setupTest(t *testing.T, protocolPoolEnabled bool) testSetup { var opts []keeper.InitOption if protocolPoolEnabled { - opts = append(opts, keeper.WithProtocolPoolEnabled()) + opts = append(opts, keeper.WithExternalCommunityPool(mockProtocolPoolKeeper{})) // expect that we will verify that this module account is set - accountKeeper.EXPECT().GetModuleAddress(protocolpooltypes.ModuleName).Return(protocolPoolAcc.GetAddress()).AnyTimes() + accountKeeper.EXPECT().GetModuleAddress(protocolpooltypes.ProtocolPoolDistrAccount).Return(protocolPoolAcc.GetAddress()).AnyTimes() } distrKeeper := keeper.NewKeeper( @@ -74,6 +90,7 @@ func setupTest(t *testing.T, protocolPoolEnabled bool) testSetup { opts..., ) + // empty initialize err := distrKeeper.FeePool.Set(testCtx.Ctx, disttypes.FeePool{ CommunityPool: sdk.NewDecCoins(), }) diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 9e377e1a29db..9437a2a0dca1 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -9,7 +9,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" - protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -143,12 +142,12 @@ func (k Keeper) AllocateTokensToValidator(ctx context.Context, val stakingtypes. return k.SetValidatorOutstandingRewards(ctx, valBz, outstanding) } -// sendCommunityPoolToProtocolPool does the following: +// sendCommunityPoolToExternalPool does the following: // // truncate the community pool value (DecCoins) to sdk.Coins -// distribute from the distribution module account to the x/protocolpool account +// distribute from the distribution module account to the external community pool account // update the bookkept value in x/distribution -func (k Keeper) sendCommunityPoolToProtocolPool(ctx sdk.Context) error { +func (k Keeper) sendCommunityPoolToExternalPool(ctx sdk.Context) error { feePool, err := k.FeePool.Get(ctx) if err != nil { return err @@ -160,11 +159,12 @@ func (k Keeper) sendCommunityPoolToProtocolPool(ctx sdk.Context) error { amt, remaining := feePool.CommunityPool.TruncateDecimal() ctx.Logger().Info( - "sending distribution community pool amount to protocol pool", + "sending distribution community pool amount to external pool pool", + "pool", k.externalCommunityPool.GetCommunityPoolModule(), "amount", amt.String(), "remaining", remaining.String(), ) - if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, protocolpooltypes.ProtocolPoolDistrAccount, amt); err != nil { + if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, k.externalCommunityPool.GetCommunityPoolModule(), amt); err != nil { return err } diff --git a/x/distribution/keeper/common_test.go b/x/distribution/keeper/common_test.go index 70e18516e464..242d2d74a6c1 100644 --- a/x/distribution/keeper/common_test.go +++ b/x/distribution/keeper/common_test.go @@ -20,6 +20,6 @@ var ( valConsAddr2 = sdk.ConsAddress(valConsPk2.Address()) distrAcc = authtypes.NewEmptyModuleAccount(types.ModuleName) - protocolPoolAcc = authtypes.NewEmptyModuleAccount(protocolpooltypes.ModuleName) + protocolPoolAcc = authtypes.NewEmptyModuleAccount(protocolpooltypes.ProtocolPoolDistrAccount) feeCollectorAcc = authtypes.NewEmptyModuleAccount("fee_collector") ) diff --git a/x/distribution/testutil/app_config.go b/x/distribution/testutil/app_config.go index c824f4dff45c..1393dd2dc392 100644 --- a/x/distribution/testutil/app_config.go +++ b/x/distribution/testutil/app_config.go @@ -23,4 +23,5 @@ var AppConfig = configurator.NewAppConfig( configurator.GenutilModule(), configurator.DistributionModule(), configurator.MintModule(), + configurator.ProtocolPoolModule(), ) diff --git a/x/protocolpool/app_config.go b/x/protocolpool/app_config.go new file mode 100644 index 000000000000..26a592f59811 --- /dev/null +++ b/x/protocolpool/app_config.go @@ -0,0 +1,26 @@ +package protocolpool + +import ( + "github.com/cosmos/cosmos-sdk/testutil/configurator" + _ "github.com/cosmos/cosmos-sdk/x/auth" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/bank" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/consensus" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/distribution" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/genutil" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/mint" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/params" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/staking" // import as blank for app wiring +) + +var AppConfig = configurator.NewAppConfig( + configurator.AuthModule(), + configurator.BankModule(), + configurator.StakingModule(), + configurator.TxModule(), + configurator.ConsensusModule(), + configurator.ParamsModule(), + configurator.GenutilModule(), + configurator.DistributionModule(), + configurator.MintModule(), +) From da2b21dd578e9289c7cd95689492608d54ea102d Mon Sep 17 00:00:00 2001 From: aljo242 Date: Fri, 14 Mar 2025 13:52:07 -0400 Subject: [PATCH 16/18] init --- tests/integration/protocolpool/module_test.go | 9 ++++++-- testutil/configurator/configurator.go | 6 +++++ x/protocolpool/keeper/genesis.go | 23 +++++++++++++++++++ x/protocolpool/{ => testutil}/app_config.go | 4 +++- x/protocolpool/types/expected_keepers.go | 1 + 5 files changed, 40 insertions(+), 3 deletions(-) rename x/protocolpool/{ => testutil}/app_config.go (89%) diff --git a/tests/integration/protocolpool/module_test.go b/tests/integration/protocolpool/module_test.go index 85195e78d3e6..f6d6ec56df1d 100644 --- a/tests/integration/protocolpool/module_test.go +++ b/tests/integration/protocolpool/module_test.go @@ -11,8 +11,8 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/cosmos/cosmos-sdk/x/distribution/testutil" - "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/protocolpool/testutil" + "github.com/cosmos/cosmos-sdk/x/protocolpool/types" ) func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { @@ -29,4 +29,9 @@ func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { ctx := app.BaseApp.NewContext(false) acc := accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ModuleName)) assert.Assert(t, acc != nil) + acc = accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ProtocolPoolDistrAccount)) + assert.Assert(t, acc != nil) + acc = accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.StreamAccount)) + assert.Assert(t, acc != nil) + } diff --git a/testutil/configurator/configurator.go b/testutil/configurator/configurator.go index 765e4004f062..15689d27f4d8 100644 --- a/testutil/configurator/configurator.go +++ b/testutil/configurator/configurator.go @@ -61,6 +61,7 @@ func defaultConfig() *Config { "consensus", "vesting", "circuit", + "protocolpool", }, EndBlockersOrder: []string{ "gov", @@ -81,6 +82,7 @@ func defaultConfig() *Config { "upgrade", "vesting", "circuit", + "protocolpool", }, InitGenesisOrder: []string{ "auth", @@ -101,6 +103,7 @@ func defaultConfig() *Config { "upgrade", "vesting", "circuit", + "protocolpool", }, setInitGenesis: true, } @@ -155,6 +158,9 @@ func AuthModule() ModuleOption { {Account: "not_bonded_tokens_pool", Permissions: []string{"burner", "staking"}}, {Account: "gov", Permissions: []string{"burner"}}, {Account: "nft"}, + {Account: protocolpooltypes.ModuleName}, + {Account: protocolpooltypes.ProtocolPoolDistrAccount}, + {Account: protocolpooltypes.StreamAccount}, }, }), } diff --git a/x/protocolpool/keeper/genesis.go b/x/protocolpool/keeper/genesis.go index eb3b0ebd6a51..f58a0ba2206c 100644 --- a/x/protocolpool/keeper/genesis.go +++ b/x/protocolpool/keeper/genesis.go @@ -72,9 +72,32 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) error { if totalToBeDistributed.IsAnyGT(data.LastBalance.Amount) || !totalToBeDistributed.DenomsSubsetOf(data.LastBalance.Amount) { return fmt.Errorf("total to be distributed is greater than the last balance: %s > %s", totalToBeDistributed, data.LastBalance.Amount) } + + // ensure module accounts are set. They will only not be set in the case where no balances have been set in genesis. + k.checkModuleAccountsExist(ctx, types.ModuleName) + k.checkModuleAccountsExist(ctx, types.StreamAccount) + k.checkModuleAccountsExist(ctx, types.ProtocolPoolDistrAccount) + return nil } +func (k Keeper) checkModuleAccountsExist(ctx sdk.Context, module string) { + // ensure stream account is set + if addr := k.authKeeper.GetModuleAddress(module); addr == nil { + panic(fmt.Sprintf(errModuleAccountNotSet, module)) + } + + moduleAcc := k.authKeeper.GetModuleAccount(ctx, module) + if moduleAcc == nil { + panic(fmt.Sprintf("%s module account has not been set", module)) + } + + balances := k.bankKeeper.GetAllBalances(ctx, moduleAcc.GetAddress()) + if balances.IsZero() { + k.authKeeper.SetModuleAccount(ctx, moduleAcc) + } +} + func (k Keeper) ExportGenesis(ctx sdk.Context) (*types.GenesisState, error) { // refresh all funds if err := k.IterateAndUpdateFundsDistribution(ctx); err != nil { diff --git a/x/protocolpool/app_config.go b/x/protocolpool/testutil/app_config.go similarity index 89% rename from x/protocolpool/app_config.go rename to x/protocolpool/testutil/app_config.go index 26a592f59811..e6d3a4ba6c88 100644 --- a/x/protocolpool/app_config.go +++ b/x/protocolpool/testutil/app_config.go @@ -1,4 +1,4 @@ -package protocolpool +package testutil import ( "github.com/cosmos/cosmos-sdk/testutil/configurator" @@ -10,6 +10,7 @@ import ( _ "github.com/cosmos/cosmos-sdk/x/genutil" // import as blank for app wiring _ "github.com/cosmos/cosmos-sdk/x/mint" // import as blank for app wiring _ "github.com/cosmos/cosmos-sdk/x/params" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/protocolpool" // import as blank for app wiring _ "github.com/cosmos/cosmos-sdk/x/staking" // import as blank for app wiring ) @@ -23,4 +24,5 @@ var AppConfig = configurator.NewAppConfig( configurator.GenutilModule(), configurator.DistributionModule(), configurator.MintModule(), + configurator.ProtocolPoolModule(), ) diff --git a/x/protocolpool/types/expected_keepers.go b/x/protocolpool/types/expected_keepers.go index c4191460b2fa..7e6306a7b07b 100644 --- a/x/protocolpool/types/expected_keepers.go +++ b/x/protocolpool/types/expected_keepers.go @@ -13,6 +13,7 @@ type AccountKeeper interface { GetAccount(ctx context.Context, addr sdk.AccAddress) sdk.AccountI GetModuleAddress(name string) sdk.AccAddress GetModuleAccount(ctx context.Context, name string) sdk.ModuleAccountI + SetModuleAccount(ctx context.Context, macc sdk.ModuleAccountI) } // BankKeeper defines the expected interface needed to retrieve account balances. From 8e75ce964695dbbb8787b72a22d29b9078877931 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Fri, 14 Mar 2025 13:53:45 -0400 Subject: [PATCH 17/18] mocks --- scripts/mockgen.sh | 1 + x/protocolpool/testutil/expected_keepers_mocks.go | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/scripts/mockgen.sh b/scripts/mockgen.sh index 87c8ba387a8f..33df0450199b 100755 --- a/scripts/mockgen.sh +++ b/scripts/mockgen.sh @@ -26,3 +26,4 @@ $mockgen_cmd -source=x/genutil/types/expected_keepers.go -package testutil -dest $mockgen_cmd -source=x/gov/testutil/expected_keepers.go -package testutil -destination x/gov/testutil/expected_keepers_mocks.go $mockgen_cmd -source=x/staking/types/expected_keepers.go -package testutil -destination x/staking/testutil/expected_keepers_mocks.go $mockgen_cmd -source=x/auth/vesting/types/expected_keepers.go -package testutil -destination x/auth/vesting/testutil/expected_keepers_mocks.go +$mockgen_cmd -source=x/protocolpool/types/expected_keepers.go -package testutil -destination x/protocolpool/testutil/expected_keepers_mocks.go diff --git a/x/protocolpool/testutil/expected_keepers_mocks.go b/x/protocolpool/testutil/expected_keepers_mocks.go index 570778a0944e..584e8243740f 100644 --- a/x/protocolpool/testutil/expected_keepers_mocks.go +++ b/x/protocolpool/testutil/expected_keepers_mocks.go @@ -98,6 +98,18 @@ func (mr *MockAccountKeeperMockRecorder) GetModuleAddress(name any) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetModuleAddress", reflect.TypeOf((*MockAccountKeeper)(nil).GetModuleAddress), name) } +// SetModuleAccount mocks base method. +func (m *MockAccountKeeper) SetModuleAccount(ctx context.Context, macc types.ModuleAccountI) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetModuleAccount", ctx, macc) +} + +// SetModuleAccount indicates an expected call of SetModuleAccount. +func (mr *MockAccountKeeperMockRecorder) SetModuleAccount(ctx, macc any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetModuleAccount", reflect.TypeOf((*MockAccountKeeper)(nil).SetModuleAccount), ctx, macc) +} + // MockBankKeeper is a mock of BankKeeper interface. type MockBankKeeper struct { ctrl *gomock.Controller From 23131d5fd3e9dfaee699450affd364440c0cc8ff Mon Sep 17 00:00:00 2001 From: aljo242 Date: Fri, 14 Mar 2025 15:32:19 -0400 Subject: [PATCH 18/18] fix --- tests/integration/protocolpool/module_test.go | 19 +++------------- x/distribution/testutil/app_config.go | 1 - x/protocolpool/keeper/genesis.go | 22 ------------------- x/protocolpool/keeper/keeper_test.go | 6 ++--- 4 files changed, 6 insertions(+), 42 deletions(-) diff --git a/tests/integration/protocolpool/module_test.go b/tests/integration/protocolpool/module_test.go index f6d6ec56df1d..9b951e266a45 100644 --- a/tests/integration/protocolpool/module_test.go +++ b/tests/integration/protocolpool/module_test.go @@ -9,29 +9,16 @@ import ( "cosmossdk.io/log" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/protocolpool/testutil" - "github.com/cosmos/cosmos-sdk/x/protocolpool/types" ) -func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { - var accountKeeper authkeeper.AccountKeeper - - app, err := simtestutil.SetupAtGenesis( +func TestCreateTestModule(t *testing.T) { + _, err := simtestutil.SetupAtGenesis( depinject.Configs( testutil.AppConfig, depinject.Supply(log.NewNopLogger()), ), - &accountKeeper) + ) assert.NilError(t, err) - ctx := app.BaseApp.NewContext(false) - acc := accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ModuleName)) - assert.Assert(t, acc != nil) - acc = accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ProtocolPoolDistrAccount)) - assert.Assert(t, acc != nil) - acc = accountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.StreamAccount)) - assert.Assert(t, acc != nil) - } diff --git a/x/distribution/testutil/app_config.go b/x/distribution/testutil/app_config.go index 1393dd2dc392..c824f4dff45c 100644 --- a/x/distribution/testutil/app_config.go +++ b/x/distribution/testutil/app_config.go @@ -23,5 +23,4 @@ var AppConfig = configurator.NewAppConfig( configurator.GenutilModule(), configurator.DistributionModule(), configurator.MintModule(), - configurator.ProtocolPoolModule(), ) diff --git a/x/protocolpool/keeper/genesis.go b/x/protocolpool/keeper/genesis.go index f58a0ba2206c..98ba54c62e4c 100644 --- a/x/protocolpool/keeper/genesis.go +++ b/x/protocolpool/keeper/genesis.go @@ -73,31 +73,9 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) error { return fmt.Errorf("total to be distributed is greater than the last balance: %s > %s", totalToBeDistributed, data.LastBalance.Amount) } - // ensure module accounts are set. They will only not be set in the case where no balances have been set in genesis. - k.checkModuleAccountsExist(ctx, types.ModuleName) - k.checkModuleAccountsExist(ctx, types.StreamAccount) - k.checkModuleAccountsExist(ctx, types.ProtocolPoolDistrAccount) - return nil } -func (k Keeper) checkModuleAccountsExist(ctx sdk.Context, module string) { - // ensure stream account is set - if addr := k.authKeeper.GetModuleAddress(module); addr == nil { - panic(fmt.Sprintf(errModuleAccountNotSet, module)) - } - - moduleAcc := k.authKeeper.GetModuleAccount(ctx, module) - if moduleAcc == nil { - panic(fmt.Sprintf("%s module account has not been set", module)) - } - - balances := k.bankKeeper.GetAllBalances(ctx, moduleAcc.GetAddress()) - if balances.IsZero() { - k.authKeeper.SetModuleAccount(ctx, moduleAcc) - } -} - func (k Keeper) ExportGenesis(ctx sdk.Context) (*types.GenesisState, error) { // refresh all funds if err := k.IterateAndUpdateFundsDistribution(ctx); err != nil { diff --git a/x/protocolpool/keeper/keeper_test.go b/x/protocolpool/keeper/keeper_test.go index 5393e4b6a7f4..1185bf013d89 100644 --- a/x/protocolpool/keeper/keeper_test.go +++ b/x/protocolpool/keeper/keeper_test.go @@ -56,10 +56,10 @@ func (suite *KeeperTestSuite) SetupTest() { // gomock initializations ctrl := gomock.NewController(suite.T()) accountKeeper := pooltestutil.NewMockAccountKeeper(ctrl) - accountKeeper.EXPECT().GetModuleAddress(types.ModuleName).Return(poolAcc.GetAddress()) - accountKeeper.EXPECT().GetModuleAddress(types.ProtocolPoolDistrAccount).Return(poolDistrAcc.GetAddress()) + accountKeeper.EXPECT().GetModuleAddress(types.ModuleName).Return(poolAcc.GetAddress()).AnyTimes() + accountKeeper.EXPECT().GetModuleAddress(types.ProtocolPoolDistrAccount).Return(poolDistrAcc.GetAddress()).AnyTimes() accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes() - accountKeeper.EXPECT().GetModuleAddress(types.StreamAccount).Return(streamAcc.GetAddress()) + accountKeeper.EXPECT().GetModuleAddress(types.StreamAccount).Return(streamAcc.GetAddress()).AnyTimes() suite.authKeeper = accountKeeper bankKeeper := pooltestutil.NewMockBankKeeper(ctrl)