github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/mint/abci_fbchain_test.go (about)

     1  package mint_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/simapp"
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint"
     9  	internaltypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint/internal/types"
    10  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    11  	"github.com/fibonacci-chain/fbc/libs/tendermint/types"
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/stretchr/testify/suite"
    14  )
    15  
    16  const (
    17  	BlocksPerYear  uint64 = 10519200        // Block per year, uint64(60 * 60 * 8766 / 3)
    18  	DeflationEpoch uint64 = 3               // Default epoch, 3 year
    19  	DeflationRate  string = "0.5"           // Default deflation rate 0.5
    20  	FarmProportion string = "0.5"           // Default farm proportion 0.5
    21  	Denom          string = "okt"           // OKT
    22  	FeeAccountName string = "fee_collector" // Fee account
    23  
    24  	InitStartBlock    int64  = 17601985 // Current mainnet block,  17601985
    25  	InitStartSupply   int64  = 19210060 // Current mainnet supply, 19210060
    26  	BlocksPerYearNew  uint64 = 8304636  // Reset new block per year, uint64(60 * 60 * 8766 / 3.8)
    27  	DeflationEpochNew uint64 = 9        // Reset epoch, year to month, and 3 to 9
    28  	Target24DayBlock  uint64 = 5000     // 24 day blocks must be 555000, but fake to 5000
    29  )
    30  
    31  // returns context and an app with updated mint keeper
    32  func createTestApp() (*simapp.SimApp, sdk.Context) {
    33  	isCheckTx := false
    34  	app := simapp.Setup(isCheckTx)
    35  
    36  	ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{})
    37  	app.MintKeeper.SetParams(ctx, internaltypes.DefaultParams())
    38  	app.MintKeeper.SetMinter(ctx, internaltypes.InitialMinterCustom())
    39  	types.UnittestOnlySetMilestoneVenus5Height(0)
    40  
    41  	return app, ctx
    42  }
    43  
    44  type AbciOkchainSuite struct {
    45  	suite.Suite
    46  }
    47  
    48  func TestAbciOkchainSuite(t *testing.T) {
    49  	suite.Run(t, new(AbciOkchainSuite))
    50  }
    51  
    52  func (suite *AbciOkchainSuite) TestNormalMint() {
    53  	testCases := []struct {
    54  		title          string
    55  		phase          uint64
    56  		mintedPerBlock sdk.Dec
    57  	}{
    58  		{"phase 0", 0, sdk.MustNewDecFromStr("1.0")},
    59  		{"phase 1", 1, sdk.MustNewDecFromStr("0.5")},
    60  		{"phase 2", 2, sdk.MustNewDecFromStr("0.25")},
    61  		{"phase 3", 3, sdk.MustNewDecFromStr("0.125")},
    62  		{"phase 4", 4, sdk.MustNewDecFromStr("0.0625")},
    63  		{"phase 5", 5, sdk.MustNewDecFromStr("0.03125")},
    64  		{"phase 6", 6, sdk.MustNewDecFromStr("0.015625")},
    65  		{"phase 7", 7, sdk.MustNewDecFromStr("0.0078125")},
    66  		{"phase 8", 8, sdk.MustNewDecFromStr("0.00390625")},
    67  		{"phase 9", 9, sdk.MustNewDecFromStr("0.001953125")},
    68  		{"phase 10", 10, sdk.MustNewDecFromStr("0.0009765625")},
    69  		{"phase 11", 11, sdk.MustNewDecFromStr("0.00048828125")},
    70  		{"phase 12", 12, sdk.MustNewDecFromStr("0.000244140625")},
    71  		{"phase 13", 13, sdk.MustNewDecFromStr("0.0001220703125")},
    72  		{"phase 14", 14, sdk.MustNewDecFromStr("0.00006103515625")},
    73  		{"phase 15", 15, sdk.MustNewDecFromStr("0.000030517578125")},
    74  		{"phase 16", 16, sdk.MustNewDecFromStr("0.0000152587890625")},
    75  		{"phase 17", 17, sdk.MustNewDecFromStr("0.00000762939453125")},
    76  		{"phase 18", 18, sdk.MustNewDecFromStr("0.000003814697265625")},
    77  		{"phase 19", 19, sdk.MustNewDecFromStr("0.000001907348632812")},
    78  		{"phase 20", 20, sdk.MustNewDecFromStr("0.000000953674316406")},
    79  		{"phase 21", 21, sdk.MustNewDecFromStr("0.000000476837158203")},
    80  		{"phase 22", 22, sdk.MustNewDecFromStr("0.000000238418579102")},
    81  		{"phase 23", 23, sdk.MustNewDecFromStr("0.000000119209289551")},
    82  		{"phase 24", 24, sdk.MustNewDecFromStr("0.000000059604644776")},
    83  		{"phase 25", 25, sdk.MustNewDecFromStr("0.000000029802322388")},
    84  		{"phase 26", 26, sdk.MustNewDecFromStr("0.000000014901161194")},
    85  		{"phase 27", 27, sdk.MustNewDecFromStr("0.000000007450580597")},
    86  		{"phase 28", 28, sdk.MustNewDecFromStr("0.000000003725290298")},
    87  		{"phase 29", 29, sdk.MustNewDecFromStr("0.000000001862645149")},
    88  		{"phase 30", 30, sdk.MustNewDecFromStr("0.000000000931322574")},
    89  		{"phase 31", 31, sdk.MustNewDecFromStr("0.000000000465661287")},
    90  		{"phase 32", 32, sdk.MustNewDecFromStr("0.000000000232830644")},
    91  		{"phase 33", 33, sdk.MustNewDecFromStr("0.000000000116415322")},
    92  		{"phase 34", 34, sdk.MustNewDecFromStr("0.000000000058207661")},
    93  		{"phase 35", 35, sdk.MustNewDecFromStr("0.000000000029103830")},
    94  		{"phase 36", 36, sdk.MustNewDecFromStr("0.000000000014551915")},
    95  		{"phase 37", 37, sdk.MustNewDecFromStr("0.000000000007275958")},
    96  		{"phase 38", 38, sdk.MustNewDecFromStr("0.000000000003637979")},
    97  		{"phase 39", 39, sdk.MustNewDecFromStr("0.000000000001818990")},
    98  		{"phase 40", 40, sdk.MustNewDecFromStr("0.000000000000909495")},
    99  		{"phase 41", 41, sdk.MustNewDecFromStr("0.000000000000454748")},
   100  		{"phase 42", 42, sdk.MustNewDecFromStr("0.000000000000227374")},
   101  		{"phase 43", 43, sdk.MustNewDecFromStr("0.000000000000113687")},
   102  		{"phase 44", 44, sdk.MustNewDecFromStr("0.000000000000056844")},
   103  		{"phase 45", 45, sdk.MustNewDecFromStr("0.000000000000028422")},
   104  		{"phase 46", 46, sdk.MustNewDecFromStr("0.000000000000014211")},
   105  		{"phase 47", 47, sdk.MustNewDecFromStr("0.000000000000007106")},
   106  		{"phase 48", 48, sdk.MustNewDecFromStr("0.000000000000003553")},
   107  		{"phase 49", 49, sdk.MustNewDecFromStr("0.000000000000001776")},
   108  		{"phase 50", 50, sdk.MustNewDecFromStr("0.000000000000000888")},
   109  		{"phase 51", 51, sdk.MustNewDecFromStr("0.000000000000000444")},
   110  		{"phase 52", 52, sdk.MustNewDecFromStr("0.000000000000000222")},
   111  		{"phase 53", 53, sdk.MustNewDecFromStr("0.000000000000000111")},
   112  		{"phase 54", 54, sdk.MustNewDecFromStr("0.000000000000000056")},
   113  		{"phase 55", 55, sdk.MustNewDecFromStr("0.000000000000000028")},
   114  		{"phase 56", 56, sdk.MustNewDecFromStr("0.000000000000000014")},
   115  		{"phase 57", 57, sdk.MustNewDecFromStr("0.000000000000000007")},
   116  		{"phase 58", 58, sdk.MustNewDecFromStr("0.000000000000000004")},
   117  		{"phase 59", 59, sdk.MustNewDecFromStr("0.000000000000000002")},
   118  		{"phase 60", 60, sdk.MustNewDecFromStr("0.000000000000000001")},
   119  		{"phase 61", 61, sdk.MustNewDecFromStr("0.000000000000000000")},
   120  		{"phase 62", 62, sdk.MustNewDecFromStr("0.000000000000000000")},
   121  	}
   122  
   123  	simApp, ctx := createTestApp()
   124  
   125  	for _, tc := range testCases {
   126  		suite.Run(tc.title, func() {
   127  			ctx.SetBlockHeight(int64(BlocksPerYear * DeflationEpoch * tc.phase))
   128  			mint.BeginBlocker(ctx, simApp.MintKeeper)
   129  			feeAccount := simApp.SupplyKeeper.GetModuleAccount(ctx, FeeAccountName)
   130  			require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom),
   131  				tc.mintedPerBlock.Sub(tc.mintedPerBlock.MulTruncate(sdk.MustNewDecFromStr(FarmProportion))))
   132  
   133  			params := simApp.MintKeeper.GetParams(ctx)
   134  			minter := simApp.MintKeeper.GetMinterCustom(ctx)
   135  			require.Equal(suite.T(), params.MintDenom, Denom)
   136  			require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYear)
   137  			require.Equal(suite.T(), params.DeflationRate, sdk.MustNewDecFromStr(DeflationRate))
   138  			require.Equal(suite.T(), params.DeflationEpoch, DeflationEpoch)
   139  			require.Equal(suite.T(), params.FarmProportion, sdk.MustNewDecFromStr(FarmProportion))
   140  
   141  			require.Equal(suite.T(), minter.NextBlockToUpdate, BlocksPerYear*DeflationEpoch*(tc.phase+1))
   142  			require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom), tc.mintedPerBlock)
   143  
   144  			simApp.SupplyKeeper.SendCoinsFromModuleToModule(ctx, FeeAccountName, "bonded_tokens_pool", feeAccount.GetCoins())
   145  		})
   146  	}
   147  }
   148  
   149  func (suite *AbciOkchainSuite) TestDateAndSupply() {
   150  	// TODO Check expected date and total supply
   151  }
   152  
   153  func (suite *AbciOkchainSuite) TestFakeUpdateNextBlock() {
   154  	simApp, ctx := createTestApp()
   155  	allRewards := sdk.NewDec(InitStartSupply)
   156  
   157  	suite.step1(sdk.MustNewDecFromStr("0.5"), &ctx, simApp, &allRewards)
   158  	suite.step2(sdk.MustNewDecFromStr("0.5"), &ctx, simApp, &allRewards)
   159  	suite.step3(sdk.MustNewDecFromStr("0.5"), &ctx, simApp, &allRewards)
   160  	suite.step4(sdk.MustNewDecFromStr("0.5"), &ctx, simApp, &allRewards)
   161  	suite.step5(sdk.MustNewDecFromStr("0.5"), &ctx, simApp, &allRewards)
   162  	suite.step6(sdk.MustNewDecFromStr("0.25"), &ctx, simApp, &allRewards)
   163  	suite.step7(sdk.MustNewDecFromStr("0.25"), &ctx, simApp, &allRewards)
   164  	suite.step8(sdk.MustNewDecFromStr("0.125"), &ctx, simApp, &allRewards)
   165  	suite.LoopDeflation(&ctx, simApp, &allRewards)
   166  }
   167  
   168  func (suite *AbciOkchainSuite) step1(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   169  	// Upgrade the main network code, wait N height to take effect.
   170  	ctx.SetBlockHeight(InitStartBlock)
   171  	coins := []sdk.Coin{sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(InitStartSupply))}
   172  	_ = simApp.SupplyKeeper.MintCoins(*ctx, mint.ModuleName, coins)
   173  	_ = simApp.SupplyKeeper.SendCoinsFromModuleToModule(*ctx, mint.ModuleName, FeeAccountName, coins)
   174  
   175  	// Execution block.
   176  	mint.BeginBlocker(*ctx, simApp.MintKeeper)
   177  	feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   178  	minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   179  	*allRewards = allRewards.Add(expectReward)
   180  
   181  	// Suit expect.
   182  	require.Equal(suite.T(), minter.NextBlockToUpdate, BlocksPerYear*DeflationEpoch)
   183  	require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   184  	require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   185  	require.Equal(suite.T(), InitStartBlock, ctx.BlockHeight())
   186  
   187  	// The target N height to take effect.
   188  	types.UnittestOnlySetMilestoneVenus5Height(InitStartBlock + 1000)
   189  }
   190  
   191  func (suite *AbciOkchainSuite) step2(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   192  	//System: block height N+1
   193  	for i := int64(1); i <= 1000+1; i++ {
   194  		// Execution block.
   195  		ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   196  		mint.BeginBlocker(*ctx, simApp.MintKeeper)
   197  		minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   198  		feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   199  		*allRewards = allRewards.Add(expectReward)
   200  
   201  		// Suit expect.
   202  		require.Equal(suite.T(), minter.NextBlockToUpdate, BlocksPerYear*DeflationEpoch)
   203  		require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   204  		require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   205  	}
   206  
   207  	require.Equal(suite.T(), InitStartBlock+1000, types.GetVenus5Height())
   208  	require.Equal(suite.T(), InitStartBlock+1000+1, ctx.BlockHeight())
   209  }
   210  
   211  func (suite *AbciOkchainSuite) step3(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   212  	// Send change BlocksPerYear proposal (effective immediately), first proposal.
   213  	params := simApp.MintKeeper.GetParams(*ctx)
   214  	params.BlocksPerYear = BlocksPerYearNew
   215  	simApp.MintKeeper.SetParams(*ctx, params)
   216  
   217  	for i := int64(1); i <= 1000; i++ {
   218  		// Execution block.
   219  		ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   220  		mint.BeginBlocker(*ctx, simApp.MintKeeper)
   221  		minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   222  		params = simApp.MintKeeper.GetParams(*ctx)
   223  		feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   224  		*allRewards = allRewards.Add(expectReward)
   225  
   226  		// Suit expect.
   227  		require.Equal(suite.T(), minter.NextBlockToUpdate, BlocksPerYear*DeflationEpoch)
   228  		require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   229  		require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   230  		require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   231  		require.Equal(suite.T(), params.DeflationEpoch, DeflationEpoch)
   232  	}
   233  
   234  	require.Equal(suite.T(), InitStartBlock+1000*2+1, ctx.BlockHeight())
   235  }
   236  
   237  func (suite *AbciOkchainSuite) step4(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   238  	// Send change DeflationEpoch proposal (effective immediately) from 3 to 9, second proposal.
   239  	params := simApp.MintKeeper.GetParams(*ctx)
   240  	params.DeflationEpoch = DeflationEpochNew
   241  	simApp.MintKeeper.SetParams(*ctx, params)
   242  
   243  	for i := int64(1); i <= 1000; i++ {
   244  		// Execution block.
   245  		ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   246  		mint.BeginBlocker(*ctx, simApp.MintKeeper)
   247  		minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   248  		feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   249  		*allRewards = allRewards.Add(expectReward)
   250  		params = simApp.MintKeeper.GetParams(*ctx)
   251  
   252  		// Suit expect.
   253  		require.Equal(suite.T(), minter.NextBlockToUpdate, BlocksPerYear*DeflationEpoch)
   254  		require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   255  		require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   256  		require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   257  		require.Equal(suite.T(), params.DeflationEpoch, DeflationEpochNew)
   258  	}
   259  	require.Equal(suite.T(), InitStartBlock+1000*3+1, ctx.BlockHeight())
   260  }
   261  
   262  func (suite *AbciOkchainSuite) step5(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   263  	// Send forced changes to the NextBlockUpdate proposal, third proposal.
   264  	minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   265  	minter.NextBlockToUpdate = uint64(ctx.BlockHeight() + 1000)
   266  	simApp.MintKeeper.SetMinterCustom(*ctx, minter)
   267  
   268  	for i := int64(1); i < 1000; i++ {
   269  		// Execution block.
   270  		ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   271  		mint.BeginBlocker(*ctx, simApp.MintKeeper)
   272  		minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   273  		feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   274  		*allRewards = allRewards.Add(expectReward)
   275  		params := simApp.MintKeeper.GetParams(*ctx)
   276  
   277  		// Suit expect.
   278  		require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   279  		require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   280  		require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   281  		require.Equal(suite.T(), params.DeflationEpoch, DeflationEpochNew)
   282  	}
   283  	require.Equal(suite.T(), InitStartBlock+1000*4, ctx.BlockHeight())
   284  }
   285  
   286  func (suite *AbciOkchainSuite) step6(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   287  	// System code triggers halving: 0.5->0.25
   288  	ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   289  	mint.BeginBlocker(*ctx, simApp.MintKeeper)
   290  	minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   291  	feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   292  	*allRewards = allRewards.Add(expectReward)
   293  	params := simApp.MintKeeper.GetParams(*ctx)
   294  
   295  	// Suit expect.
   296  	require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   297  	require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   298  	require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   299  	require.Equal(suite.T(), params.DeflationEpoch, DeflationEpochNew)
   300  	require.Equal(suite.T(), InitStartBlock+1000*4+1, ctx.BlockHeight())
   301  }
   302  
   303  func (suite *AbciOkchainSuite) step7(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   304  	// Send forced changes to the NextBlockUpdate proposal, fourth proposal.
   305  	minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   306  	minter.NextBlockToUpdate = uint64(ctx.BlockHeight()) + Target24DayBlock - 4000
   307  	simApp.MintKeeper.SetMinterCustom(*ctx, minter)
   308  
   309  	for i := int64(1); i < int64(Target24DayBlock)-4000; i++ {
   310  		// Execution block.
   311  		ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   312  		mint.BeginBlocker(*ctx, simApp.MintKeeper)
   313  		minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   314  		feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   315  		*allRewards = allRewards.Add(expectReward)
   316  		params := simApp.MintKeeper.GetParams(*ctx)
   317  
   318  		// Suit expect.
   319  		require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   320  		require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   321  		require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   322  		require.Equal(suite.T(), params.DeflationEpoch, DeflationEpochNew)
   323  	}
   324  
   325  	require.Equal(suite.T(), InitStartBlock+int64(Target24DayBlock), ctx.BlockHeight())
   326  }
   327  
   328  func (suite *AbciOkchainSuite) step8(expectReward sdk.Dec, ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   329  	// System code triggers halving: 0.25->0.125
   330  	ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   331  	mint.BeginBlocker(*ctx, simApp.MintKeeper)
   332  	minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   333  	feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   334  	*allRewards = allRewards.Add(expectReward)
   335  	params := simApp.MintKeeper.GetParams(*ctx)
   336  
   337  	// Suit expect.
   338  	require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom).MulTruncate(sdk.MustNewDecFromStr(FarmProportion)), expectReward)
   339  	require.Equal(suite.T(), feeAccount.GetCoins().AmountOf(Denom), *allRewards)
   340  	require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   341  	require.Equal(suite.T(), params.DeflationEpoch, DeflationEpochNew)
   342  	require.Equal(suite.T(), InitStartBlock+int64(Target24DayBlock)+1, ctx.BlockHeight())
   343  }
   344  
   345  func (suite *AbciOkchainSuite) LoopDeflation(ctx *sdk.Context, simApp *simapp.SimApp, allRewards *sdk.Dec) {
   346  	testCases := []struct {
   347  		title          string
   348  		phase          uint64
   349  		mintedPerBlock sdk.Dec
   350  	}{
   351  		{"phase 1", 1, sdk.MustNewDecFromStr("0.125")},
   352  		{"phase 2", 2, sdk.MustNewDecFromStr("0.0625")},
   353  		{"phase 3", 3, sdk.MustNewDecFromStr("0.03125")},
   354  		{"phase 4", 4, sdk.MustNewDecFromStr("0.015625")},
   355  		{"phase 5", 5, sdk.MustNewDecFromStr("0.0078125")},
   356  		{"phase 6", 6, sdk.MustNewDecFromStr("0.00390625")},
   357  		{"phase 7", 7, sdk.MustNewDecFromStr("0.001953125")},
   358  		{"phase 8", 8, sdk.MustNewDecFromStr("0.0009765625")},
   359  		{"phase 9", 9, sdk.MustNewDecFromStr("0.00048828125")},
   360  		{"phase 10", 10, sdk.MustNewDecFromStr("0.000244140625")},
   361  		{"phase 11", 11, sdk.MustNewDecFromStr("0.0001220703125")},
   362  		{"phase 12", 12, sdk.MustNewDecFromStr("0.00006103515625")},
   363  		{"phase 13", 13, sdk.MustNewDecFromStr("0.000030517578125")},
   364  		{"phase 14", 14, sdk.MustNewDecFromStr("0.0000152587890625")},
   365  		{"phase 15", 15, sdk.MustNewDecFromStr("0.00000762939453125")},
   366  		{"phase 16", 16, sdk.MustNewDecFromStr("0.000003814697265625")},
   367  		{"phase 17", 17, sdk.MustNewDecFromStr("0.000001907348632812")},
   368  		{"phase 18", 18, sdk.MustNewDecFromStr("0.000000953674316406")},
   369  		{"phase 19", 19, sdk.MustNewDecFromStr("0.000000476837158203")},
   370  		{"phase 20", 20, sdk.MustNewDecFromStr("0.000000238418579102")},
   371  		{"phase 21", 21, sdk.MustNewDecFromStr("0.000000119209289551")},
   372  		{"phase 22", 22, sdk.MustNewDecFromStr("0.000000059604644776")},
   373  		{"phase 23", 23, sdk.MustNewDecFromStr("0.000000029802322388")},
   374  		{"phase 24", 24, sdk.MustNewDecFromStr("0.000000014901161194")},
   375  		{"phase 25", 25, sdk.MustNewDecFromStr("0.000000007450580597")},
   376  		{"phase 26", 26, sdk.MustNewDecFromStr("0.000000003725290298")},
   377  		{"phase 27", 27, sdk.MustNewDecFromStr("0.000000001862645149")},
   378  		{"phase 28", 28, sdk.MustNewDecFromStr("0.000000000931322574")},
   379  		{"phase 29", 29, sdk.MustNewDecFromStr("0.000000000465661287")},
   380  		{"phase 30", 30, sdk.MustNewDecFromStr("0.000000000232830644")},
   381  		{"phase 31", 31, sdk.MustNewDecFromStr("0.000000000116415322")},
   382  		{"phase 32", 32, sdk.MustNewDecFromStr("0.000000000058207661")},
   383  		{"phase 33", 33, sdk.MustNewDecFromStr("0.000000000029103830")},
   384  		{"phase 34", 34, sdk.MustNewDecFromStr("0.000000000014551915")},
   385  		{"phase 35", 35, sdk.MustNewDecFromStr("0.000000000007275958")},
   386  		{"phase 36", 36, sdk.MustNewDecFromStr("0.000000000003637979")},
   387  		{"phase 37", 37, sdk.MustNewDecFromStr("0.000000000001818990")},
   388  		{"phase 38", 38, sdk.MustNewDecFromStr("0.000000000000909495")},
   389  		{"phase 39", 39, sdk.MustNewDecFromStr("0.000000000000454748")},
   390  		{"phase 40", 40, sdk.MustNewDecFromStr("0.000000000000227374")},
   391  		{"phase 41", 41, sdk.MustNewDecFromStr("0.000000000000113687")},
   392  		{"phase 42", 42, sdk.MustNewDecFromStr("0.000000000000056844")},
   393  		{"phase 43", 43, sdk.MustNewDecFromStr("0.000000000000028422")},
   394  		{"phase 44", 44, sdk.MustNewDecFromStr("0.000000000000014211")},
   395  		{"phase 45", 45, sdk.MustNewDecFromStr("0.000000000000007106")},
   396  		{"phase 46", 46, sdk.MustNewDecFromStr("0.000000000000003553")},
   397  		{"phase 47", 47, sdk.MustNewDecFromStr("0.000000000000001776")},
   398  		{"phase 48", 48, sdk.MustNewDecFromStr("0.000000000000000888")},
   399  		{"phase 49", 49, sdk.MustNewDecFromStr("0.000000000000000444")},
   400  		{"phase 50", 50, sdk.MustNewDecFromStr("0.000000000000000222")},
   401  		{"phase 51", 51, sdk.MustNewDecFromStr("0.000000000000000111")},
   402  		{"phase 52", 52, sdk.MustNewDecFromStr("0.000000000000000056")},
   403  		{"phase 53", 53, sdk.MustNewDecFromStr("0.000000000000000028")},
   404  		{"phase 54", 54, sdk.MustNewDecFromStr("0.000000000000000014")},
   405  		{"phase 55", 55, sdk.MustNewDecFromStr("0.000000000000000007")},
   406  		{"phase 56", 56, sdk.MustNewDecFromStr("0.000000000000000004")},
   407  		{"phase 57", 57, sdk.MustNewDecFromStr("0.000000000000000002")},
   408  		{"phase 58", 58, sdk.MustNewDecFromStr("0.000000000000000001")},
   409  		{"phase 59", 59, sdk.MustNewDecFromStr("0.000000000000000000")},
   410  		{"phase 60", 60, sdk.MustNewDecFromStr("0.000000000000000000")},
   411  	}
   412  
   413  	for _, tc := range testCases {
   414  		suite.Run(tc.title, func() {
   415  			ctx.SetBlockHeight(InitStartBlock + int64(Target24DayBlock) + int64(BlocksPerYearNew*DeflationEpochNew*tc.phase))
   416  			mint.BeginBlocker(*ctx, simApp.MintKeeper)
   417  			feeAccount := simApp.SupplyKeeper.GetModuleAccount(*ctx, FeeAccountName)
   418  			expect := feeAccount.GetCoins().AmountOf(Denom)
   419  			reward := tc.mintedPerBlock.Sub(tc.mintedPerBlock.MulTruncate(sdk.MustNewDecFromStr(FarmProportion)))
   420  			*allRewards = allRewards.Add(reward)
   421  			require.Equal(suite.T(), expect, *allRewards)
   422  
   423  			params := simApp.MintKeeper.GetParams(*ctx)
   424  			minter := simApp.MintKeeper.GetMinterCustom(*ctx)
   425  			require.Equal(suite.T(), params.MintDenom, Denom)
   426  			require.Equal(suite.T(), params.BlocksPerYear, BlocksPerYearNew)
   427  			require.Equal(suite.T(), params.DeflationRate, sdk.MustNewDecFromStr(DeflationRate))
   428  			require.Equal(suite.T(), params.DeflationEpoch, DeflationEpochNew)
   429  			require.Equal(suite.T(), params.FarmProportion, sdk.MustNewDecFromStr(FarmProportion))
   430  
   431  			require.Equal(suite.T(), minter.NextBlockToUpdate, uint64(InitStartBlock)+Target24DayBlock+BlocksPerYearNew/12*DeflationEpochNew*(tc.phase+1)+1)
   432  			require.Equal(suite.T(), minter.MintedPerBlock.AmountOf(Denom), tc.mintedPerBlock)
   433  		})
   434  	}
   435  }