mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 00:27:41 +00:00 
			
		
		
		
	* Add consolidate methods * Update distr feepool balance with dust, add tests * Set params for proposal handler to not influence module balances * Add StakingRewardsPerSecond param for proposal test * Update changelog * Update test to check emitted events * Log dust amounts for x/distribution * Modify feepool communitypool field instead of entire replacement * Update tests to include cases with empty balances * Move EventsContains to app * Remove extra copied ModuleName * Add Require() to incentive claims in tests to reduce errors * Move consolidate tests to testutil * Only transfer non-ukava coins * Add DefaultStakingRewardsState to proposal handler test * Move event emit before consolidate * add golangci specific timeout --------- Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com>
		
			
				
	
	
		
			181 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package testutil
 | 
						|
 | 
						|
import (
 | 
						|
	"time"
 | 
						|
 | 
						|
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
						|
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
						|
 | 
						|
	distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
 | 
						|
	"github.com/kava-labs/kava/app"
 | 
						|
	types "github.com/kava-labs/kava/x/community/types"
 | 
						|
	kavadisttypes "github.com/kava-labs/kava/x/kavadist/types"
 | 
						|
)
 | 
						|
 | 
						|
func (suite *disableInflationTestSuite) TestStartCommunityFundConsolidation() {
 | 
						|
	tests := []struct {
 | 
						|
		name                   string
 | 
						|
		initialFeePoolCoins    sdk.DecCoins
 | 
						|
		initialKavadistBalance sdk.Coins
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			"basic test with both balances and dust",
 | 
						|
			sdk.NewDecCoins(
 | 
						|
				sdk.NewDecCoinFromDec("ukava", sdk.NewDecWithPrec(123456, 2)),
 | 
						|
				sdk.NewDecCoinFromDec("usdx", sdk.NewDecWithPrec(654321, 3)),
 | 
						|
			),
 | 
						|
			sdk.NewCoins(
 | 
						|
				sdk.NewInt64Coin("ukava", 10_000),
 | 
						|
				sdk.NewInt64Coin("usdx", 10_000),
 | 
						|
			),
 | 
						|
		},
 | 
						|
		{
 | 
						|
			"empty x/distribution feepool",
 | 
						|
			sdk.DecCoins(nil),
 | 
						|
			sdk.NewCoins(
 | 
						|
				sdk.NewInt64Coin("ukava", 10_000),
 | 
						|
				sdk.NewInt64Coin("usdx", 10_000),
 | 
						|
			),
 | 
						|
		},
 | 
						|
		{
 | 
						|
			"empty x/kavadist balance",
 | 
						|
			sdk.NewDecCoins(
 | 
						|
				sdk.NewDecCoinFromDec("ukava", sdk.NewDecWithPrec(123456, 2)),
 | 
						|
				sdk.NewDecCoinFromDec("usdx", sdk.NewDecWithPrec(654321, 3)),
 | 
						|
			),
 | 
						|
			sdk.Coins{},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			"both x/distribution feepool and x/kavadist balance empty",
 | 
						|
			sdk.DecCoins(nil),
 | 
						|
			sdk.Coins{},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range tests {
 | 
						|
		suite.Run(tc.name, func() {
 | 
						|
			suite.SetupTest()
 | 
						|
			ak := suite.App.GetAccountKeeper()
 | 
						|
 | 
						|
			initialFeePool := distrtypes.FeePool{
 | 
						|
				CommunityPool: tc.initialFeePoolCoins,
 | 
						|
			}
 | 
						|
 | 
						|
			initialFeePoolCoins, initialFeePoolDust := initialFeePool.CommunityPool.TruncateDecimal()
 | 
						|
 | 
						|
			// More coins than initial feepool/communitypool
 | 
						|
			fundCoins := sdk.NewCoins(
 | 
						|
				sdk.NewInt64Coin("ukava", 10_000),
 | 
						|
				sdk.NewInt64Coin("usdx", 10_000),
 | 
						|
			)
 | 
						|
 | 
						|
			// Always fund x/distribution with enough coins to cover feepool
 | 
						|
			err := suite.App.FundModuleAccount(
 | 
						|
				suite.Ctx,
 | 
						|
				distrtypes.ModuleName,
 | 
						|
				fundCoins,
 | 
						|
			)
 | 
						|
			suite.NoError(err, "x/distribution account should be funded without error")
 | 
						|
 | 
						|
			err = suite.App.FundModuleAccount(
 | 
						|
				suite.Ctx,
 | 
						|
				kavadisttypes.ModuleName,
 | 
						|
				tc.initialKavadistBalance,
 | 
						|
			)
 | 
						|
			suite.NoError(err, "x/kavadist account should be funded without error")
 | 
						|
 | 
						|
			suite.App.GetDistrKeeper().SetFeePool(suite.Ctx, initialFeePool)
 | 
						|
 | 
						|
			// Ensure the feepool was set before migration
 | 
						|
			feePoolBefore := suite.App.GetDistrKeeper().GetFeePool(suite.Ctx)
 | 
						|
			suite.Equal(initialFeePool, feePoolBefore, "initial feepool should be set")
 | 
						|
			communityBalanceBefore := suite.App.GetCommunityKeeper().GetModuleAccountBalance(suite.Ctx)
 | 
						|
 | 
						|
			kavadistAcc := ak.GetModuleAccount(suite.Ctx, kavadisttypes.KavaDistMacc)
 | 
						|
			kavaDistCoinsBefore := suite.App.GetBankKeeper().GetAllBalances(suite.Ctx, kavadistAcc.GetAddress())
 | 
						|
			suite.Equal(
 | 
						|
				tc.initialKavadistBalance,
 | 
						|
				kavaDistCoinsBefore,
 | 
						|
				"x/kavadist balance should be funded",
 | 
						|
			)
 | 
						|
 | 
						|
			expectedKavaDistCoins := sdk.NewCoins(sdk.NewCoin("ukava", kavaDistCoinsBefore.AmountOf("ukava")))
 | 
						|
 | 
						|
			// -------------
 | 
						|
			// Run upgrade
 | 
						|
 | 
						|
			params, found := suite.Keeper.GetParams(suite.Ctx)
 | 
						|
			suite.Require().True(found)
 | 
						|
			params.UpgradeTimeDisableInflation = suite.Ctx.BlockTime().Add(-time.Minute)
 | 
						|
			suite.Keeper.SetParams(suite.Ctx, params)
 | 
						|
 | 
						|
			err = suite.Keeper.StartCommunityFundConsolidation(suite.Ctx)
 | 
						|
			suite.NoError(err, "consolidation should not error")
 | 
						|
 | 
						|
			// -------------
 | 
						|
			// Check results
 | 
						|
			suite.Run("module balances after consolidation should moved", func() {
 | 
						|
				feePoolAfter := suite.App.GetDistrKeeper().GetFeePool(suite.Ctx)
 | 
						|
				suite.Equal(
 | 
						|
					initialFeePoolDust,
 | 
						|
					feePoolAfter.CommunityPool,
 | 
						|
					"x/distribution community pool should be sent to x/community",
 | 
						|
				)
 | 
						|
 | 
						|
				kavaDistCoinsAfter := suite.App.GetBankKeeper().GetAllBalances(suite.Ctx, kavadistAcc.GetAddress())
 | 
						|
				suite.Equal(
 | 
						|
					expectedKavaDistCoins,
 | 
						|
					kavaDistCoinsAfter,
 | 
						|
					"x/kavadist balance should ony contain ukava",
 | 
						|
				)
 | 
						|
 | 
						|
				totalExpectedCommunityPoolCoins := communityBalanceBefore.
 | 
						|
					Add(initialFeePoolCoins...).      // x/distribution fee pool
 | 
						|
					Add(tc.initialKavadistBalance...) // x/kavadist module balance
 | 
						|
 | 
						|
				communityBalanceAfter := suite.App.GetCommunityKeeper().GetModuleAccountBalance(suite.Ctx)
 | 
						|
 | 
						|
				// Use .IsAllGTE to avoid types.Coins(nil) vs types.Coins{} mismatch
 | 
						|
				suite.Truef(
 | 
						|
					totalExpectedCommunityPoolCoins.IsAllGTE(communityBalanceAfter),
 | 
						|
					"x/community balance should be increased by the truncated x/distribution community pool, got %s, expected %s",
 | 
						|
					communityBalanceAfter,
 | 
						|
					totalExpectedCommunityPoolCoins,
 | 
						|
				)
 | 
						|
			})
 | 
						|
 | 
						|
			suite.Run("bank transfer events should be emitted", func() {
 | 
						|
				communityAcc := ak.GetModuleAccount(suite.Ctx, types.ModuleAccountName)
 | 
						|
				distributionAcc := ak.GetModuleAccount(suite.Ctx, distrtypes.ModuleName)
 | 
						|
				kavadistAcc := ak.GetModuleAccount(suite.Ctx, kavadisttypes.KavaDistMacc)
 | 
						|
 | 
						|
				events := suite.Ctx.EventManager().Events()
 | 
						|
 | 
						|
				suite.NoError(
 | 
						|
					app.EventsContains(
 | 
						|
						events,
 | 
						|
						sdk.NewEvent(
 | 
						|
							banktypes.EventTypeTransfer,
 | 
						|
							sdk.NewAttribute(banktypes.AttributeKeyRecipient, communityAcc.GetAddress().String()),
 | 
						|
							sdk.NewAttribute(banktypes.AttributeKeySender, distributionAcc.GetAddress().String()),
 | 
						|
							sdk.NewAttribute(sdk.AttributeKeyAmount, initialFeePoolCoins.String()),
 | 
						|
						),
 | 
						|
					),
 | 
						|
				)
 | 
						|
 | 
						|
				suite.NoError(
 | 
						|
					app.EventsContains(
 | 
						|
						events,
 | 
						|
						sdk.NewEvent(
 | 
						|
							banktypes.EventTypeTransfer,
 | 
						|
							sdk.NewAttribute(banktypes.AttributeKeyRecipient, communityAcc.GetAddress().String()),
 | 
						|
							sdk.NewAttribute(banktypes.AttributeKeySender, kavadistAcc.GetAddress().String()),
 | 
						|
							sdk.NewAttribute(sdk.AttributeKeyAmount, kavaDistCoinsBefore.Sub(expectedKavaDistCoins...).String()),
 | 
						|
						),
 | 
						|
					),
 | 
						|
				)
 | 
						|
			})
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 |