From d0f48c9fae09cad6e2bdc9de052ab817dc102a46 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Mon, 13 May 2024 18:16:10 +0800 Subject: [PATCH 1/4] Problem: query blocks before enable feemarket module get nil pointer error --- CHANGELOG.md | 1 + x/feemarket/keeper/params.go | 9 +++++++-- x/feemarket/keeper/params_test.go | 12 ++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87e367a713..c0ecc27590 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (rpc) [#473](https://github.com/crypto-org-chain/ethermint/pull/473) Avoid panic on invalid elasticity_multiplier. * (rpc) [#474](https://github.com/crypto-org-chain/ethermint/pull/474), [#476](https://github.com/crypto-org-chain/ethermint/pull/441) Align genesis related cmd. * (rpc) [#480](https://github.com/crypto-org-chain/ethermint/pull/480), [#482](https://github.com/crypto-org-chain/ethermint/pull/482) Fix parsed logs from old events. +* (rpc) [#](https://github.com/crypto-org-chain/ethermint/pull/) Avoid nil pointer on blocks before enable feemarket module. ### Improvements diff --git a/x/feemarket/keeper/params.go b/x/feemarket/keeper/params.go index 82d76f806a..682df2159c 100644 --- a/x/feemarket/keeper/params.go +++ b/x/feemarket/keeper/params.go @@ -25,8 +25,13 @@ import ( ) // GetParams returns the total set of fee market parameters. -func (k Keeper) GetParams(ctx sdk.Context) types.Params { - var params types.Params +func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { + defer func() { + if r := recover(); r != nil { + k.Logger(ctx).Error("failed to get params", "error", r) + params = types.DefaultParams() + } + }() bz := ctx.KVStore(k.storeKey).Get(types.ParamsKey) if len(bz) == 0 { k.ss.GetParamSetIfExists(ctx, ¶ms) diff --git a/x/feemarket/keeper/params_test.go b/x/feemarket/keeper/params_test.go index bf412f5a58..5696f86e59 100644 --- a/x/feemarket/keeper/params_test.go +++ b/x/feemarket/keeper/params_test.go @@ -4,6 +4,7 @@ import ( "reflect" "testing" + "cosmossdk.io/store/cachemulti" "github.com/evmos/ethermint/testutil" "github.com/evmos/ethermint/x/feemarket/types" "github.com/stretchr/testify/suite" @@ -72,6 +73,17 @@ func (suite *ParamsTestSuite) TestSetGetParams() { }, false, }, + { + "success - Recover from panic in GetParams", + func() interface{} { + return types.DefaultParams() + }, + func() interface{} { + ctx := suite.Ctx.WithMultiStore(cachemulti.NewFromKVStore(nil, nil, nil)) + return suite.App.FeeMarketKeeper.GetParams(ctx) + }, + true, + }, } for _, tc := range testCases { suite.Run(tc.name, func() { From 2aa809329af93692f067eafae5d10d25f7787687 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Tue, 14 May 2024 10:22:11 +0800 Subject: [PATCH 2/4] update doc --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0ecc27590..bd0fb96954 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,7 +58,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (rpc) [#473](https://github.com/crypto-org-chain/ethermint/pull/473) Avoid panic on invalid elasticity_multiplier. * (rpc) [#474](https://github.com/crypto-org-chain/ethermint/pull/474), [#476](https://github.com/crypto-org-chain/ethermint/pull/441) Align genesis related cmd. * (rpc) [#480](https://github.com/crypto-org-chain/ethermint/pull/480), [#482](https://github.com/crypto-org-chain/ethermint/pull/482) Fix parsed logs from old events. -* (rpc) [#](https://github.com/crypto-org-chain/ethermint/pull/) Avoid nil pointer on blocks before enable feemarket module. +* (rpc) [#485](https://github.com/crypto-org-chain/ethermint/pull/485) Avoid nil pointer error when query blocks before enable feemarket module. ### Improvements From d35ba1b64a9e945eef2611b78ca65aa9a053a331 Mon Sep 17 00:00:00 2001 From: yihuang Date: Tue, 14 May 2024 10:38:17 +0800 Subject: [PATCH 3/4] cleanup --- x/feemarket/keeper/params.go | 8 ++------ x/feemarket/types/params.go | 12 ++++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/x/feemarket/keeper/params.go b/x/feemarket/keeper/params.go index 682df2159c..7e2cf7e7c5 100644 --- a/x/feemarket/keeper/params.go +++ b/x/feemarket/keeper/params.go @@ -26,15 +26,11 @@ import ( // GetParams returns the total set of fee market parameters. func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - defer func() { - if r := recover(); r != nil { - k.Logger(ctx).Error("failed to get params", "error", r) - params = types.DefaultParams() - } - }() bz := ctx.KVStore(k.storeKey).Get(types.ParamsKey) if len(bz) == 0 { k.ss.GetParamSetIfExists(ctx, ¶ms) + // avoid nil pointers when params are not set + params.FillDefaults() } else { k.cdc.MustUnmarshal(bz, ¶ms) } diff --git a/x/feemarket/types/params.go b/x/feemarket/types/params.go index 53a2bd46ee..1d67a0db00 100644 --- a/x/feemarket/types/params.go +++ b/x/feemarket/types/params.go @@ -144,6 +144,18 @@ func (p Params) GetBaseFee() *big.Int { return p.BaseFee.BigInt() } +func (p *Params) FillDefaults() { + if p.BaseFee.IsNil() { + p.BaseFee = sdkmath.NewIntFromUint64(params.InitialBaseFee) + } + if p.MinGasPrice.IsNil() { + p.MinGasPrice = DefaultMinGasPrice + } + if p.MinGasMultiplier.IsNil() { + p.MinGasMultiplier = DefaultMinGasMultiplier + } +} + func validateMinGasPrice(i interface{}) error { v, ok := i.(sdkmath.LegacyDec) From 6f2285b7a77c10c7e554e22b7337cb1a37c20ed3 Mon Sep 17 00:00:00 2001 From: yihuang Date: Tue, 14 May 2024 10:48:58 +0800 Subject: [PATCH 4/4] fix test --- x/feemarket/keeper/params_test.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/x/feemarket/keeper/params_test.go b/x/feemarket/keeper/params_test.go index 5696f86e59..d14f0413c4 100644 --- a/x/feemarket/keeper/params_test.go +++ b/x/feemarket/keeper/params_test.go @@ -5,6 +5,10 @@ import ( "testing" "cosmossdk.io/store/cachemulti" + "cosmossdk.io/store/dbadapter" + storetypes "cosmossdk.io/store/types" + dbm "github.com/cosmos/cosmos-db" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/evmos/ethermint/testutil" "github.com/evmos/ethermint/x/feemarket/types" "github.com/stretchr/testify/suite" @@ -74,12 +78,18 @@ func (suite *ParamsTestSuite) TestSetGetParams() { false, }, { - "success - Recover from panic in GetParams", + "success - get default params if not exists", func() interface{} { - return types.DefaultParams() + var params types.Params + params.FillDefaults() + return params }, func() interface{} { - ctx := suite.Ctx.WithMultiStore(cachemulti.NewFromKVStore(nil, nil, nil)) + stores := map[storetypes.StoreKey]storetypes.CacheWrapper{ + suite.App.GetKey(types.StoreKey): dbadapter.Store{DB: dbm.NewMemDB()}, + suite.App.GetKey(paramstypes.StoreKey): dbadapter.Store{DB: dbm.NewMemDB()}, + } + ctx := suite.Ctx.WithMultiStore(cachemulti.NewFromKVStore(stores, nil, nil)) return suite.App.FeeMarketKeeper.GetParams(ctx) }, true,