package e2e_test

// func (suite *IntegrationTestSuite) TestUpgradeCommunityParams() {
// 	suite.SkipIfUpgradeDisabled()

// 	beforeUpgradeCtx := util.CtxAtHeight(suite.UpgradeHeight - 1)
// 	afterUpgradeCtx := util.CtxAtHeight(suite.UpgradeHeight)

// 	// Before params
// 	kavaDistParamsBefore, err := suite.ZgChain.Kavadist.Params(beforeUpgradeCtx, &kavadisttypes.QueryParamsRequest{})
// 	suite.NoError(err)
// 	mintParamsBefore, err := suite.ZgChain.Mint.Params(beforeUpgradeCtx, &minttypes.QueryParamsRequest{})
// 	suite.NoError(err)

// 	// Before parameters
// 	suite.Run("x/community and x/kavadist parameters before upgrade", func() {
// 		_, err = suite.ZgChain.Community.Params(beforeUpgradeCtx, &communitytypes.QueryParamsRequest{})
// 		suite.Error(err, "x/community should not have params before upgrade")

// 		suite.Require().True(
// 			kavaDistParamsBefore.Params.Active,
// 			"x/kavadist should be active before upgrade",
// 		)

// 		suite.Require().True(
// 			mintParamsBefore.Params.InflationMax.IsPositive(),
// 			"x/mint inflation max should be positive before upgrade",
// 		)
// 		suite.Require().True(
// 			mintParamsBefore.Params.InflationMin.IsPositive(),
// 			"x/mint inflation min should be positive before upgrade",
// 		)
// 	})

// 	// After upgrade, Before switchover - parameters
// 	suite.Run("x/kavadist, x/mint, x/community parameters after upgrade, before switchover", func() {
// 		kavaDistParamsAfter, err := suite.ZgChain.Kavadist.Params(afterUpgradeCtx, &kavadisttypes.QueryParamsRequest{})
// 		suite.NoError(err)
// 		mintParamsAfter, err := suite.ZgChain.Mint.Params(afterUpgradeCtx, &minttypes.QueryParamsRequest{})
// 		suite.NoError(err)
// 		communityParamsAfter, err := suite.ZgChain.Community.Params(afterUpgradeCtx, &communitytypes.QueryParamsRequest{})
// 		suite.NoError(err)

// 		suite.Equal(
// 			kavaDistParamsBefore.Params,
// 			kavaDistParamsAfter.Params,
// 			"x/kavadist should be unaffected after upgrade",
// 		)

// 		suite.Equal(
// 			mintParamsBefore.Params,
// 			mintParamsAfter.Params,
// 			"x/mint params should be unaffected after upgrade",
// 		)

// 		expectedParams := app.CommunityParams_E2E
// 		// Make UpgradeTimeDisableInflation match so that we ignore it, because
// 		// referencing app.CommunityParams_E2E in this test files is different
// 		// from the one set in the upgrade handler. At least check that it is
// 		// set to a non-zero value in the assertion below
// 		expectedParams.UpgradeTimeDisableInflation = communityParamsAfter.Params.UpgradeTimeDisableInflation

// 		suite.False(
// 			communityParamsAfter.Params.UpgradeTimeDisableInflation.IsZero(),
// 			"x/community switchover time should be set after upgrade",
// 		)
// 		suite.Equal(
// 			expectedParams,
// 			communityParamsAfter.Params,
// 			"x/community params should be set to E2E params after upgrade",
// 		)
// 	})

// 	suite.Require().Eventually(
// 		func() bool {
// 			// Get x/community for switchover time
// 			params, err := suite.ZgChain.Community.Params(
// 				context.Background(),
// 				&communitytypes.QueryParamsRequest{},
// 			)
// 			suite.Require().NoError(err)

// 			// Check that switchover time is set to zero, e.g. switchover happened
// 			return params.Params.UpgradeTimeDisableInflation.Equal(time.Time{})
// 		},
// 		20*time.Second, 1*time.Second,
// 		"switchover should happen and x/community params should be updated",
// 	)

// 	// Fetch exact block when inflation stop event emitted
// 	_, switchoverHeight, err := suite.ZgChain.GetBeginBlockEventsFromQuery(
// 		context.Background(),
// 		fmt.Sprintf(
// 			"%s.%s EXISTS",
// 			communitytypes.EventTypeInflationStop,
// 			communitytypes.AttributeKeyInflationDisableTime,
// 		),
// 	)
// 	suite.Require().NoError(err)
// 	suite.Require().NotZero(switchoverHeight)

// 	beforeSwitchoverCtx := util.CtxAtHeight(switchoverHeight - 1)
// 	afterSwitchoverCtx := util.CtxAtHeight(switchoverHeight)

// 	suite.Run("x/kavadist, x/mint, x/community parameters after upgrade, after switchover", func() {
// 		kavaDistParamsAfter, err := suite.ZgChain.Kavadist.Params(
// 			afterSwitchoverCtx,
// 			&kavadisttypes.QueryParamsRequest{},
// 		)
// 		suite.NoError(err)
// 		mintParamsAfter, err := suite.ZgChain.Mint.Params(
// 			afterSwitchoverCtx,
// 			&minttypes.QueryParamsRequest{},
// 		)
// 		suite.NoError(err)
// 		communityParamsAfter, err := suite.ZgChain.Community.Params(
// 			afterSwitchoverCtx,
// 			&communitytypes.QueryParamsRequest{},
// 		)
// 		suite.NoError(err)

// 		suite.False(
// 			kavaDistParamsAfter.Params.Active,
// 			"x/kavadist should be disabled after upgrade",
// 		)

// 		suite.True(
// 			mintParamsAfter.Params.InflationMax.IsZero(),
// 			"x/mint inflation max should be zero after switchover",
// 		)
// 		suite.True(
// 			mintParamsAfter.Params.InflationMin.IsZero(),
// 			"x/mint inflation min should be zero after switchover",
// 		)

// 		suite.Equal(
// 			time.Time{},
// 			communityParamsAfter.Params.UpgradeTimeDisableInflation,
// 			"x/community switchover time should be reset",
// 		)

// 		suite.Equal(
// 			communityParamsAfter.Params.UpgradeTimeSetStakingRewardsPerSecond,
// 			communityParamsAfter.Params.StakingRewardsPerSecond,
// 			"x/community staking rewards per second should match upgrade time staking rewards per second",
// 		)
// 	})

// 	suite.Run("x/kavadist, x/distribution, x/community balances after switchover", func() {
// 		// Before balances - community pool fund consolidation
// 		kavaDistBalBefore, err := suite.ZgChain.Kavadist.Balance(
// 			beforeSwitchoverCtx,
// 			&kavadisttypes.QueryBalanceRequest{},
// 		)
// 		suite.NoError(err)
// 		distrBalBefore, err := suite.ZgChain.Distribution.CommunityPool(
// 			beforeSwitchoverCtx,
// 			&distrtypes.QueryCommunityPoolRequest{},
// 		)
// 		suite.NoError(err)
// 		distrBalCoinsBefore, distrDustBefore := distrBalBefore.Pool.TruncateDecimal()
// 		beforeCommPoolBalance, err := suite.ZgChain.Community.Balance(
// 			beforeSwitchoverCtx,
// 			&communitytypes.QueryBalanceRequest{},
// 		)
// 		suite.NoError(err)

// 		// After balances
// 		kavaDistBalAfter, err := suite.ZgChain.Kavadist.Balance(
// 			afterSwitchoverCtx,
// 			&kavadisttypes.QueryBalanceRequest{},
// 		)
// 		suite.NoError(err)
// 		distrBalAfter, err := suite.ZgChain.Distribution.CommunityPool(
// 			afterSwitchoverCtx,
// 			&distrtypes.QueryCommunityPoolRequest{},
// 		)
// 		suite.NoError(err)
// 		afterCommPoolBalance, err := suite.ZgChain.Community.Balance(
// 			afterSwitchoverCtx,
// 			&communitytypes.QueryBalanceRequest{},
// 		)
// 		suite.NoError(err)

// 		expectedKavadistBal := sdk.NewCoins(sdk.NewCoin(
// 			"ukava",
// 			kavaDistBalBefore.Coins.AmountOf("ukava"),
// 		))
// 		suite.Equal(
// 			expectedKavadistBal,
// 			kavaDistBalAfter.Coins,
// 			"x/kavadist balance should persist the ukava amount and move all other funds",
// 		)
// 		expectedKavadistTransferred := kavaDistBalBefore.Coins.Sub(expectedKavadistBal...)

// 		// very low ukava balance after (ignoring dust in x/distribution)
// 		// a small amount of tx fees can still end up here.
// 		// dust should stay in x/distribution, but may not be the same so it's unchecked
// 		distrCoinsAfter, distrDustAfter := distrBalAfter.Pool.TruncateDecimal()
// 		suite.Empty(distrCoinsAfter, "expected no coins in x/distribution community pool")

// 		// Fetch block results for paid staking rewards in the block
// 		blockRes, err := suite.ZgChain.TmSignClient.BlockResults(
// 			context.Background(),
// 			&switchoverHeight,
// 		)
// 		suite.Require().NoError(err)

// 		stakingRewardPaidEvents := util.FilterEventsByType(
// 			blockRes.BeginBlockEvents,
// 			communitytypes.EventTypeStakingRewardsPaid,
// 		)
// 		suite.Require().Len(stakingRewardPaidEvents, 1, "there should be only 1 staking reward paid event")
// 		stakingRewardAmount := sdk.NewCoins()
// 		for _, attr := range stakingRewardPaidEvents[0].Attributes {
// 			if string(attr.Key) == communitytypes.AttributeKeyStakingRewardAmount {
// 				stakingRewardAmount, err = sdk.ParseCoinsNormalized(string(attr.Value))
// 				suite.Require().NoError(err)

// 				break
// 			}
// 		}

// 		expectedCommunityBal := beforeCommPoolBalance.Coins.
// 			Add(distrBalCoinsBefore...).
// 			Add(expectedKavadistTransferred...).
// 			Sub(stakingRewardAmount...) // Remove staking rewards paid in the block

// 		// x/kavadist and x/distribution community pools should be moved to x/community
// 		suite.Equal(
// 			expectedCommunityBal,
// 			afterCommPoolBalance.Coins,
// 		)

// 		suite.Equal(
// 			distrDustBefore,
// 			distrDustAfter,
// 			"x/distribution community pool dust should be unchanged",
// 		)
// 	})
// }