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 }