diff --git a/app/abci_utils.go b/app/abci_utils.go
index c1a3a661..ec75c3b6 100644
--- a/app/abci_utils.go
+++ b/app/abci_utils.go
@@ -2,6 +2,8 @@ package app
 
 import (
 	"fmt"
+	"math/big"
+	"sort"
 
 	"github.com/cockroachdb/errors"
 	abci "github.com/cometbft/cometbft/abci/types"
@@ -13,6 +15,8 @@ import (
 	"github.com/cosmos/cosmos-sdk/x/auth/signing"
 )
 
+const gasPriceSuggestionBlockNum int64 = 5
+
 type (
 	// GasTx defines the contract that a transaction with a gas limit must implement.
 	GasTx interface {
@@ -30,17 +34,22 @@ type (
 	// DefaultProposalHandler defines the default ABCI PrepareProposal and
 	// ProcessProposal handlers.
 	DefaultProposalHandler struct {
-		mempool    mempool.Mempool
-		txVerifier ProposalTxVerifier
-		txSelector TxSelector
+		mempool         mempool.Mempool
+		txVerifier      ProposalTxVerifier
+		txSelector      TxSelector
+		feemarketKeeper FeeMarketKeeper
+	}
+	FeeMarketKeeper interface {
+		SetSuggestionGasPrice(ctx sdk.Context, gas *big.Int)
 	}
 )
 
-func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier) *DefaultProposalHandler {
+func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier, feemarketKeeper FeeMarketKeeper) *DefaultProposalHandler {
 	return &DefaultProposalHandler{
-		mempool:    mp,
-		txVerifier: txVerifier,
-		txSelector: NewDefaultTxSelector(),
+		mempool:         mp,
+		txVerifier:      txVerifier,
+		txSelector:      NewDefaultTxSelector(),
+		feemarketKeeper: feemarketKeeper,
 	}
 }
 
@@ -97,11 +106,25 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 			return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()}
 		}
 
+		gasPriceSlice := make([]*big.Int, 0, h.mempool.CountTx())
+
 		iterator := h.mempool.Select(ctx, req.Txs)
 		selectedTxsSignersSeqs := make(map[string]uint64)
 		var selectedTxsNums int
 		for iterator != nil {
 			memTx := iterator.Tx()
+
+			for _, msg := range memTx.GetMsgs() {
+				msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx)
+				if ok {
+					txData, err := evmtypes.UnpackTxData(msgEthTx.Data)
+					if err == nil {
+						gp := txData.GetGasPrice()
+						gasPriceSlice = append(gasPriceSlice, gp)
+					}
+				}
+			}
+
 			sigs, err := memTx.(signing.SigVerifiableTx).GetSignaturesV2()
 			if err != nil {
 				panic(fmt.Errorf("failed to get signatures: %w", err))
@@ -198,6 +221,28 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 
 			iterator = iterator.Next()
 		}
+
+		sort.Slice(gasPriceSlice, func(i, j int) bool {
+			return gasPriceSlice[i].Cmp(gasPriceSlice[j]) > 0
+		})
+
+		remaing := gasPriceSuggestionBlockNum * int64(maxBlockGas)
+		for _, gp := range gasPriceSlice {
+			if remaing <= 0 {
+				h.feemarketKeeper.SetSuggestionGasPrice(ctx, gp)
+				break
+			}
+			remaing -= gp.Int64()
+		}
+
+		if remaing > 0 {
+			if len(gasPriceSlice) > 0 {
+				h.feemarketKeeper.SetSuggestionGasPrice(ctx, gasPriceSlice[len(gasPriceSlice)-1])
+			} else {
+				h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0))
+			}
+		}
+
 		return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()}
 	}
 }
diff --git a/app/ante/ante_test.go b/app/ante/ante_test.go
index c96a5239..eb5aad35 100644
--- a/app/ante/ante_test.go
+++ b/app/ante/ante_test.go
@@ -52,13 +52,17 @@ func TestAppAnteHandler_AuthorizedMempool(t *testing.T) {
 
 	tApp := app.TestApp{
 		App: *app.NewApp(
-			log.NewNopLogger(),
-			tmdb.NewMemDB(),
 			chaincfg.DefaultNodeHome,
 			nil,
 			encodingConfig,
 			opts,
-			baseapp.SetChainID(app.TestChainId),
+			app.NewBaseApp(
+				log.NewNopLogger(),
+				tmdb.NewMemDB(),
+				encodingConfig,
+				baseapp.SetChainID(app.TestChainId),
+			),
+			nil,
 		),
 	}
 
diff --git a/app/app.go b/app/app.go
index b10fd016..49c71347 100644
--- a/app/app.go
+++ b/app/app.go
@@ -267,7 +267,7 @@ type App struct {
 	packetForwardKeeper   *packetforwardkeeper.Keeper
 	evmKeeper             *evmkeeper.Keeper
 	evmutilKeeper         evmutilkeeper.Keeper
-	feeMarketKeeper       feemarketkeeper.Keeper
+	feeMarketKeeper       *feemarketkeeper.Keeper
 	upgradeKeeper         upgradekeeper.Keeper
 	evidenceKeeper        evidencekeeper.Keeper
 	transferKeeper        ibctransferkeeper.Keeper
@@ -313,6 +313,7 @@ func NewApp(
 	encodingConfig chainparams.EncodingConfig,
 	options Options,
 	bApp *baseapp.BaseApp,
+	setAbciProposalHandler func(feemarketKeeper FeeMarketKeeper) sdk.PrepareProposalHandler,
 ) *App {
 	appCodec := encodingConfig.Marshaler
 	legacyAmino := encodingConfig.Amino
@@ -901,6 +902,10 @@ func NewApp(
 	app.SetBeginBlocker(app.BeginBlocker)
 	app.SetEndBlocker(app.EndBlocker)
 
+	if setAbciProposalHandler != nil {
+		abciProposalHandler := setAbciProposalHandler(app.feeMarketKeeper)
+		bApp.SetPrepareProposal(abciProposalHandler)
+	}
 	// load store
 	if !options.SkipLoadLatest {
 		if err := app.LoadLatestVersion(); err != nil {
diff --git a/app/app_test.go b/app/app_test.go
index 7ab5b262..becb9464 100644
--- a/app/app_test.go
+++ b/app/app_test.go
@@ -28,19 +28,36 @@ import (
 func TestNewApp(t *testing.T) {
 	chaincfg.SetSDKConfig()
 	NewApp(
-		log.NewTMLogger(log.NewSyncWriter(os.Stdout)),
-		db.NewMemDB(),
 		chaincfg.DefaultNodeHome,
 		nil,
 		MakeEncodingConfig(),
 		DefaultOptions,
+		NewBaseApp(
+			log.NewTMLogger(log.NewSyncWriter(os.Stdout)),
+			db.NewMemDB(),
+			MakeEncodingConfig(),
+			baseapp.SetChainID(TestChainId),
+		),
+		nil,
 	)
 }
 
 func TestExport(t *testing.T) {
 	chaincfg.SetSDKConfig()
 	db := db.NewMemDB()
-	app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, chaincfg.DefaultNodeHome, nil, MakeEncodingConfig(), DefaultOptions, baseapp.SetChainID(TestChainId))
+	app := NewApp(
+		chaincfg.DefaultNodeHome,
+		nil,
+		MakeEncodingConfig(),
+		DefaultOptions,
+		NewBaseApp(
+			log.NewTMLogger(log.NewSyncWriter(os.Stdout)),
+			db,
+			MakeEncodingConfig(),
+			baseapp.SetChainID(TestChainId),
+		),
+		nil,
+	)
 
 	genesisState := GenesisStateWithSingleValidator(&TestApp{App: *app}, NewDefaultGenesisState())
 
diff --git a/app/test_common.go b/app/test_common.go
index 52b527e0..6c469e4a 100644
--- a/app/test_common.go
+++ b/app/test_common.go
@@ -96,7 +96,7 @@ func NewTestAppFromSealed() TestApp {
 	bApp := NewBaseApp(log.NewNopLogger(), db, encCfg, baseapp.SetChainID(TestChainId))
 	app := NewApp(
 		chaincfg.DefaultNodeHome, nil,
-		encCfg, DefaultOptions, bApp,
+		encCfg, DefaultOptions, bApp, nil,
 	)
 	return TestApp{App: *app}
 }
@@ -117,7 +117,7 @@ func (tApp TestApp) GetPriceFeedKeeper() pricefeedkeeper.Keeper     { return tAp
 func (tApp TestApp) GetCommitteeKeeper() committeekeeper.Keeper     { return tApp.committeeKeeper }
 func (tApp TestApp) GetEvmutilKeeper() evmutilkeeper.Keeper         { return tApp.evmutilKeeper }
 func (tApp TestApp) GetEvmKeeper() *evmkeeper.Keeper                { return tApp.evmKeeper }
-func (tApp TestApp) GetFeeMarketKeeper() feemarketkeeper.Keeper     { return tApp.feeMarketKeeper }
+func (tApp TestApp) GetFeeMarketKeeper() *feemarketkeeper.Keeper    { return tApp.feeMarketKeeper }
 func (tApp TestApp) GetDASignersKeeper() dasignerskeeper.Keeper     { return tApp.dasignersKeeper }
 func (tApp TestApp) GetPrecisebankKeeper() precisebankkeeper.Keeper { return tApp.precisebankKeeper }
 func (tApp TestApp) GetWrappedA0GIBaseKeeper() wrappeda0gibasekeeper.Keeper {
diff --git a/app/upgrades_test.go b/app/upgrades_test.go
index d4783904..9e88d52a 100644
--- a/app/upgrades_test.go
+++ b/app/upgrades_test.go
@@ -1,434 +1 @@
 package app_test
-
-import (
-	"strconv"
-	"testing"
-	"time"
-
-	sdkmath "cosmossdk.io/math"
-	"github.com/0glabs/0g-chain/app"
-	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
-	precisebankkeeper "github.com/0glabs/0g-chain/x/precisebank/keeper"
-	precisebanktypes "github.com/0glabs/0g-chain/x/precisebank/types"
-	tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
-	sdk "github.com/cosmos/cosmos-sdk/types"
-	"github.com/stretchr/testify/require"
-)
-
-func TestMigrateEvmutilToPrecisebank(t *testing.T) {
-	// Full test case with all components together
-	tests := []struct {
-		name               string
-		initialReserve     sdkmath.Int
-		fractionalBalances []sdkmath.Int
-	}{
-		{
-			"no fractional balances",
-			sdkmath.NewInt(0),
-			[]sdkmath.Int{},
-		},
-		{
-			"sufficient reserve, 0 remainder",
-			// Accounts adding up to 2 int units, same as reserve
-			sdkmath.NewInt(2),
-			[]sdkmath.Int{
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"insufficient reserve, 0 remainder",
-			// Accounts adding up to 2 int units, but only 1 int unit in reserve
-			sdkmath.NewInt(1),
-			[]sdkmath.Int{
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"excess reserve, 0 remainder",
-			// Accounts adding up to 2 int units, but 3 int unit in reserve
-			sdkmath.NewInt(3),
-			[]sdkmath.Int{
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"sufficient reserve, non-zero remainder",
-			// Accounts adding up to 1.5 int units, same as reserve
-			sdkmath.NewInt(2),
-			[]sdkmath.Int{
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"insufficient reserve, non-zero remainder",
-			// Accounts adding up to 1.5 int units, less than reserve,
-			// Reserve should be 2 and remainder 0.5
-			sdkmath.NewInt(1),
-			[]sdkmath.Int{
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"excess reserve, non-zero remainder",
-			// Accounts adding up to 1.5 int units, 3 int units in reserve
-			sdkmath.NewInt(3),
-			[]sdkmath.Int{
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			tApp := app.NewTestApp()
-			tApp.InitializeFromGenesisStates()
-			ctx := tApp.NewContext(true, tmproto.Header{Height: 1, Time: time.Now()})
-
-			ak := tApp.GetAccountKeeper()
-			bk := tApp.GetBankKeeper()
-			evmuk := tApp.GetEvmutilKeeper()
-			pbk := tApp.GetPrecisebankKeeper()
-
-			reserveCoin := sdk.NewCoin(precisebanktypes.IntegerCoinDenom, tt.initialReserve)
-			err := bk.MintCoins(ctx, evmutiltypes.ModuleName, sdk.NewCoins(reserveCoin))
-			require.NoError(t, err)
-
-			oldReserveAddr := tApp.GetAccountKeeper().GetModuleAddress(evmutiltypes.ModuleName)
-			newReserveAddr := tApp.GetAccountKeeper().GetModuleAddress(precisebanktypes.ModuleName)
-
-			// Double check balances
-			oldReserveBalance := bk.GetBalance(ctx, oldReserveAddr, precisebanktypes.IntegerCoinDenom)
-			newReserveBalance := bk.GetBalance(ctx, newReserveAddr, precisebanktypes.IntegerCoinDenom)
-
-			require.Equal(t, tt.initialReserve, oldReserveBalance.Amount, "initial x/evmutil reserve balance")
-			require.True(t, newReserveBalance.IsZero(), "empty initial new reserve")
-
-			// Set accounts
-			for i, balance := range tt.fractionalBalances {
-				addr := sdk.AccAddress([]byte(strconv.Itoa(i)))
-
-				err := evmuk.SetBalance(ctx, addr, balance)
-				require.NoError(t, err)
-			}
-
-			// Run full x/evmutil -> x/precisebank migration
-			err = app.MigrateEvmutilToPrecisebank(
-				ctx,
-				ak,
-				bk,
-				evmuk,
-				pbk,
-			)
-			require.NoError(t, err)
-
-			// Check old reserve is empty
-			oldReserveBalanceAfter := bk.GetBalance(ctx, oldReserveAddr, precisebanktypes.IntegerCoinDenom)
-			require.True(t, oldReserveBalanceAfter.IsZero(), "old reserve should be empty")
-
-			// Check new reserve fully backs fractional balances
-			newReserveBalanceAfter := bk.GetBalance(ctx, newReserveAddr, precisebanktypes.IntegerCoinDenom)
-			fractionalBalanceTotal := pbk.GetTotalSumFractionalBalances(ctx)
-			remainder := pbk.GetRemainderAmount(ctx)
-
-			expectedReserveBal := fractionalBalanceTotal.Add(remainder)
-			require.Equal(
-				t,
-				expectedReserveBal,
-				newReserveBalanceAfter.Amount.Mul(precisebanktypes.ConversionFactor()),
-				"new reserve should equal total fractional balances",
-			)
-
-			// Check balances are deleted in evmutil and migrated to precisebank
-			for i := range tt.fractionalBalances {
-				addr := sdk.AccAddress([]byte(strconv.Itoa(i)))
-				acc := evmuk.GetAccount(ctx, addr)
-				require.Nil(t, acc, "account should be deleted")
-
-				balance := pbk.GetFractionalBalance(ctx, addr)
-				require.Equal(t, tt.fractionalBalances[i], balance, "balance should be migrated")
-			}
-
-			// Checks balances valid and remainder
-			res, stop := precisebankkeeper.AllInvariants(pbk)(ctx)
-			require.Falsef(t, stop, "invariants should pass: %s", res)
-		})
-	}
-}
-
-func TestTransferFractionalBalances(t *testing.T) {
-	tests := []struct {
-		name               string
-		fractionalBalances []sdkmath.Int
-	}{
-		{
-			"no fractional balances",
-			[]sdkmath.Int{},
-		},
-		{
-			"balanced fractional balances",
-			[]sdkmath.Int{
-				// 4 accounts
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"unbalanced balances",
-			[]sdkmath.Int{
-				// 3 accounts
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			tApp := app.NewTestApp()
-			tApp.InitializeFromGenesisStates()
-			ctx := tApp.NewContext(true, tmproto.Header{Height: 1, Time: time.Now()})
-
-			evmutilk := tApp.GetEvmutilKeeper()
-			pbk := tApp.GetPrecisebankKeeper()
-
-			for i, balance := range tt.fractionalBalances {
-				addr := sdk.AccAddress([]byte(strconv.Itoa(i)))
-
-				err := evmutilk.SetBalance(ctx, addr, balance)
-				require.NoError(t, err)
-			}
-
-			// Run balance transfer
-			aggregateSum, err := app.TransferFractionalBalances(
-				ctx,
-				evmutilk,
-				pbk,
-			)
-			require.NoError(t, err)
-
-			// Check balances are deleted in evmutil and migrated to precisebank
-			sum := sdkmath.ZeroInt()
-			for i := range tt.fractionalBalances {
-				sum = sum.Add(tt.fractionalBalances[i])
-
-				addr := sdk.AccAddress([]byte(strconv.Itoa(i)))
-				acc := evmutilk.GetAccount(ctx, addr)
-				require.Nil(t, acc, "account should be deleted")
-
-				balance := pbk.GetFractionalBalance(ctx, addr)
-				require.Equal(t, tt.fractionalBalances[i], balance, "balance should be migrated")
-			}
-
-			require.Equal(t, sum, aggregateSum, "aggregate sum should be correct")
-		})
-	}
-}
-
-func TestInitializeRemainder(t *testing.T) {
-	tests := []struct {
-		name             string
-		giveAggregateSum sdkmath.Int
-		wantRemainder    sdkmath.Int
-	}{
-		{
-			"0 remainder, 1ukava",
-			precisebanktypes.ConversionFactor(),
-			sdkmath.NewInt(0),
-		},
-		{
-			"0 remainder, multiple ukava",
-			precisebanktypes.ConversionFactor().MulRaw(5),
-			sdkmath.NewInt(0),
-		},
-		{
-			"non-zero remainder, min",
-			precisebanktypes.ConversionFactor().SubRaw(1),
-			sdkmath.NewInt(1),
-		},
-		{
-			"non-zero remainder, max",
-			sdkmath.NewInt(1),
-			precisebanktypes.ConversionFactor().SubRaw(1),
-		},
-		{
-			"non-zero remainder, half",
-			precisebanktypes.ConversionFactor().QuoRaw(2),
-			precisebanktypes.ConversionFactor().QuoRaw(2),
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			tApp := app.NewTestApp()
-			tApp.InitializeFromGenesisStates()
-
-			pbk := tApp.GetPrecisebankKeeper()
-
-			ctx := tApp.NewContext(true, tmproto.Header{Height: 1, Time: time.Now()})
-
-			remainder := app.InitializeRemainder(
-				ctx,
-				tApp.GetPrecisebankKeeper(),
-				tt.giveAggregateSum,
-			)
-			require.Equal(t, tt.wantRemainder, remainder)
-
-			// Check actual state
-			remainderAfter := pbk.GetRemainderAmount(ctx)
-			require.Equal(t, tt.wantRemainder, remainderAfter)
-
-			// Not checking invariants here since it requires actual balance state
-			aggregateSumWithRemainder := tt.giveAggregateSum.Add(remainder)
-			require.True(
-				t,
-				aggregateSumWithRemainder.
-					Mod(precisebanktypes.ConversionFactor()).
-					IsZero(),
-				"remainder + aggregate sum should be a multiple of the conversion factor",
-			)
-		})
-	}
-}
-
-func TestTransferFractionalBalanceReserve(t *testing.T) {
-	tests := []struct {
-		name               string
-		initialReserve     sdk.Coin
-		fractionalBalances []sdkmath.Int
-	}{
-		{
-			"balanced reserve, no remainder",
-			sdk.NewCoin(precisebanktypes.IntegerCoinDenom, sdk.NewInt(1)),
-			[]sdkmath.Int{
-				// 2 accounts
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"insufficient reserve",
-			sdk.NewCoin(precisebanktypes.IntegerCoinDenom, sdk.NewInt(1)),
-			[]sdkmath.Int{
-				// 4 accounts, total 2 int units
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"extra reserve funds",
-			sdk.NewCoin(precisebanktypes.IntegerCoinDenom, sdk.NewInt(2)),
-			[]sdkmath.Int{
-				// 2 accounts, total 1 int units
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"insufficient reserve, with remainder",
-			sdk.NewCoin(precisebanktypes.IntegerCoinDenom, sdk.NewInt(1)),
-			[]sdkmath.Int{
-				// 5 accounts, total 2.5 int units
-				// Expected 3 int units in reserve, 0.5 remainder
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-		{
-			"extra reserve funds, with remainder",
-			sdk.NewCoin(precisebanktypes.IntegerCoinDenom, sdk.NewInt(3)),
-			[]sdkmath.Int{
-				// 3 accounts, total 1.5 int units.
-				// Expected 2 int units in reserve, 0.5 remainder
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-				precisebanktypes.ConversionFactor().QuoRaw(2),
-			},
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			tApp := app.NewTestApp()
-			tApp.InitializeFromGenesisStates()
-			ctx := tApp.NewContext(true, tmproto.Header{Height: 1, Time: time.Now()})
-
-			bk := tApp.GetBankKeeper()
-			pbk := tApp.GetPrecisebankKeeper()
-			err := bk.MintCoins(ctx, evmutiltypes.ModuleName, sdk.NewCoins(tt.initialReserve))
-			require.NoError(t, err)
-
-			oldReserveAddr := tApp.GetAccountKeeper().GetModuleAddress(evmutiltypes.ModuleName)
-			newReserveAddr := tApp.GetAccountKeeper().GetModuleAddress(precisebanktypes.ModuleName)
-
-			// Double check balances
-			oldReserveBalance := bk.GetBalance(ctx, oldReserveAddr, precisebanktypes.IntegerCoinDenom)
-			newReserveBalance := bk.GetBalance(ctx, newReserveAddr, precisebanktypes.IntegerCoinDenom)
-
-			require.Equal(t, tt.initialReserve, oldReserveBalance)
-			require.True(t, newReserveBalance.IsZero(), "empty initial new reserve")
-
-			for i, balance := range tt.fractionalBalances {
-				addr := sdk.AccAddress([]byte{byte(i)})
-
-				require.NotPanics(t, func() {
-					pbk.SetFractionalBalance(ctx, addr, balance)
-				}, "given fractional balances should be valid")
-			}
-
-			// Run reserve migration
-			err = app.TransferFractionalBalanceReserve(
-				ctx,
-				tApp.GetAccountKeeper(),
-				bk,
-				tApp.GetPrecisebankKeeper(),
-			)
-			require.NoError(t, err)
-
-			// Check old reserve is empty
-			oldReserveBalanceAfter := bk.GetBalance(ctx, oldReserveAddr, precisebanktypes.IntegerCoinDenom)
-			require.True(t, oldReserveBalanceAfter.IsZero(), "old reserve should be empty")
-
-			// Check new reserve fully backs fractional balances
-			newReserveBalanceAfter := bk.GetBalance(ctx, newReserveAddr, precisebanktypes.IntegerCoinDenom)
-			fractionalBalanceTotal := pbk.GetTotalSumFractionalBalances(ctx)
-
-			expectedReserveBal := fractionalBalanceTotal.
-				Quo(precisebanktypes.ConversionFactor())
-
-			// Check if theres a remainder
-			if fractionalBalanceTotal.Mod(precisebanktypes.ConversionFactor()).IsPositive() {
-				expectedReserveBal = expectedReserveBal.Add(sdkmath.OneInt())
-			}
-
-			require.Equal(
-				t,
-				expectedReserveBal,
-				newReserveBalanceAfter.Amount,
-				"new reserve should equal total fractional balances + remainder",
-			)
-		})
-	}
-}
diff --git a/cmd/0gchaind/app.go b/cmd/0gchaind/app.go
index f09ec847..d8d3d10b 100644
--- a/cmd/0gchaind/app.go
+++ b/cmd/0gchaind/app.go
@@ -126,8 +126,6 @@ func (ac appCreator) newApp(
 		baseapp.SetMempool(mempool),
 	)
 	bApp.SetTxEncoder(ac.encodingConfig.TxConfig.TxEncoder())
-	abciProposalHandler := app.NewDefaultProposalHandler(mempool, bApp)
-	bApp.SetPrepareProposal(abciProposalHandler.PrepareProposalHandler())
 
 	newApp := app.NewApp(
 		homeDir, traceStore, ac.encodingConfig,
@@ -142,6 +140,10 @@ func (ac appCreator) newApp(
 			EVMMaxGasWanted:       cast.ToUint64(appOpts.Get(ethermintflags.EVMMaxTxGasWanted)),
 		},
 		bApp,
+		func(k app.FeeMarketKeeper) sdk.PrepareProposalHandler {
+			abciProposalHandler := app.NewDefaultProposalHandler(mempool, bApp, k)
+			return abciProposalHandler.PrepareProposalHandler()
+		},
 	)
 
 	return newApp
@@ -170,14 +172,14 @@ func (ac appCreator) appExport(
 	var tempApp *app.App
 	if height != -1 {
 		bApp := app.NewBaseApp(logger, db, ac.encodingConfig)
-		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp)
+		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp, nil)
 
 		if err := tempApp.LoadHeight(height); err != nil {
 			return servertypes.ExportedApp{}, err
 		}
 	} else {
 		bApp := app.NewBaseApp(logger, db, ac.encodingConfig)
-		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp)
+		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp, nil)
 	}
 	return tempApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport)
 }