From 27ff1eb359d6d887c9ba183ce9f549f7563b3819 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 15:13:04 +0100 Subject: [PATCH] fix(x/protocolpool): withdraw rewards before export genesis (backport #23467) (#23471) Co-authored-by: Julien Robert --- simapp/app_config.go | 23 ++++++++++++++++++++++- x/protocolpool/keeper/genesis.go | 15 +++++++++++++++ x/protocolpool/keeper/genesis_test.go | 9 +++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/simapp/app_config.go b/simapp/app_config.go index 34b6259595..0d5b14bc0c 100644 --- a/simapp/app_config.go +++ b/simapp/app_config.go @@ -174,7 +174,28 @@ var ( }, // When ExportGenesis is not specified, the export genesis module order // is equal to the init genesis order - // ExportGenesis: []string{}, + ExportGenesis: []string{ + consensustypes.ModuleName, + accounts.ModuleName, + authtypes.ModuleName, + pooltypes.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{}, // SkipStoreKeys is an optional list of store keys to skip when constructing the diff --git a/x/protocolpool/keeper/genesis.go b/x/protocolpool/keeper/genesis.go index cba8b0922f..3872fd6bc5 100644 --- a/x/protocolpool/keeper/genesis.go +++ b/x/protocolpool/keeper/genesis.go @@ -76,6 +76,21 @@ func (k Keeper) InitGenesis(ctx context.Context, data *types.GenesisState) error } func (k Keeper) ExportGenesis(ctx context.Context) (*types.GenesisState, error) { + // refresh all funds + if err := k.IterateAndUpdateFundsDistribution(ctx); err != nil { + return nil, err + } + + // withdraw all rewards before exporting genesis + if err := k.RecipientFundDistribution.Walk(ctx, nil, func(key sdk.AccAddress, value types.DistributionAmount) (stop bool, err error) { + if _, err := k.withdrawRecipientFunds(ctx, key.Bytes()); err != nil { + return true, err + } + return false, nil + }); err != nil { + return nil, err + } + var cf []*types.ContinuousFund err := k.ContinuousFund.Walk(ctx, nil, func(key sdk.AccAddress, value types.ContinuousFund) (stop bool, err error) { recipient, err := k.authKeeper.AddressCodec().BytesToString(key) diff --git a/x/protocolpool/keeper/genesis_test.go b/x/protocolpool/keeper/genesis_test.go index 9e6c942a8d..709c748e0d 100644 --- a/x/protocolpool/keeper/genesis_test.go +++ b/x/protocolpool/keeper/genesis_test.go @@ -3,13 +3,18 @@ package keeper_test import ( "time" + "github.com/golang/mock/gomock" + "cosmossdk.io/math" "cosmossdk.io/x/protocolpool/types" sdk "github.com/cosmos/cosmos-sdk/types" ) -func (suite *KeeperTestSuite) TestInitGenesis() { +func (suite *KeeperTestSuite) TestInitExportGenesis() { + suite.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), types.ProtocolPoolDistrAccount, gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + suite.bankKeeper.EXPECT().SendCoinsFromModuleToAccount(gomock.Any(), types.StreamAccount, gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + hour := time.Hour gs := types.NewGenesisState( []*types.ContinuousFund{ @@ -49,5 +54,5 @@ func (suite *KeeperTestSuite) TestInitGenesis() { suite.Require().NoError(err) suite.Require().Equal(gs.ContinuousFund, exportedGenState.ContinuousFund) suite.Require().Equal(gs.Budget, exportedGenState.Budget) - suite.Require().Equal(math.NewInt(101), exportedGenState.LastBalance.Amount.AmountOf("stake")) + suite.Require().Equal(math.ZeroInt(), exportedGenState.LastBalance.Amount.AmountOf("stake")) }