From 4d95fd5f305e45527b59556f7e4bfc2efa420267 Mon Sep 17 00:00:00 2001
From: Solovyov1796 <xinyu@0g.ai>
Date: Thu, 13 Feb 2025 02:19:08 +0800
Subject: [PATCH 1/2] update suggestion gas price

---
 app/abci_utils.go     | 144 ++----------------------------------------
 app/ante/ante_test.go |   1 -
 app/app.go            |   6 +-
 app/app_test.go       |   2 -
 app/test_common.go    |   2 +-
 cmd/0gchaind/app.go   |  10 ++-
 6 files changed, 13 insertions(+), 152 deletions(-)

diff --git a/app/abci_utils.go b/app/abci_utils.go
index dcc299cc..c1a3a661 100644
--- a/app/abci_utils.go
+++ b/app/abci_utils.go
@@ -2,10 +2,7 @@ package app
 
 import (
 	"fmt"
-	"math/big"
-	"sort"
 
-	"github.com/0glabs/0g-chain/chaincfg"
 	"github.com/cockroachdb/errors"
 	abci "github.com/cometbft/cometbft/abci/types"
 	gethtypes "github.com/ethereum/go-ethereum/core/types"
@@ -16,8 +13,6 @@ 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 {
@@ -35,29 +30,17 @@ type (
 	// DefaultProposalHandler defines the default ABCI PrepareProposal and
 	// ProcessProposal handlers.
 	DefaultProposalHandler struct {
-		mempool         mempool.Mempool
-		txVerifier      ProposalTxVerifier
-		txSelector      TxSelector
-		feemarketKeeper FeeMarketKeeper
-	}
-	FeeMarketKeeper interface {
-		SetSuggestionGasPrice(ctx sdk.Context, gas *big.Int)
-	}
-
-	txnInfo struct {
-		gasPrice *big.Int
-		gasLimit uint64
-		nonce    uint64
-		sender   string
+		mempool    mempool.Mempool
+		txVerifier ProposalTxVerifier
+		txSelector TxSelector
 	}
 )
 
-func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier, feemarketKeeper FeeMarketKeeper) *DefaultProposalHandler {
+func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier) *DefaultProposalHandler {
 	return &DefaultProposalHandler{
-		mempool:         mp,
-		txVerifier:      txVerifier,
-		txSelector:      NewDefaultTxSelector(),
-		feemarketKeeper: feemarketKeeper,
+		mempool:    mp,
+		txVerifier: txVerifier,
+		txSelector: NewDefaultTxSelector(),
 	}
 }
 
@@ -114,14 +97,11 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 			return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()}
 		}
 
-		txnInfoMap := make(map[string][]*txnInfo, h.mempool.CountTx())
-
 		iterator := h.mempool.Select(ctx, req.Txs)
 		selectedTxsSignersSeqs := make(map[string]uint64)
 		var selectedTxsNums int
 		for iterator != nil {
 			memTx := iterator.Tx()
-
 			sigs, err := memTx.(signing.SigVerifiableTx).GetSignaturesV2()
 			if err != nil {
 				panic(fmt.Errorf("failed to get signatures: %w", err))
@@ -154,42 +134,10 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 									txSignersSeqs[signer] = nonce
 								}
 							}
-
-							if _, exists := txnInfoMap[signer]; !exists {
-								txnInfoMap[signer] = make([]*txnInfo, 0, 128)
-							}
-
-							txnInfoMap[signer] = append(txnInfoMap[signer], &txnInfo{
-								gasPrice: ethTx.GasPrice(),
-								gasLimit: ethTx.Gas(),
-								nonce:    nonce,
-								sender:   signer,
-							})
 						}
 					}
 				}
 			} else {
-				// ignore multisig case now
-				fee := memTx.(sdk.Fee)
-				if len(sigs) == 1 {
-					signer := sdk.AccAddress(sigs[0].PubKey.Address()).String()
-
-					if _, exists := txnInfoMap[signer]; !exists {
-						txnInfoMap[signer] = make([]*txnInfo, 0, 16)
-					}
-
-					evmGasPrice, err := utilCosmosDemonGasPriceToEvmDemonGasPrice(fee.GetAmount())
-
-					if err == nil {
-						txnInfoMap[signer] = append(txnInfoMap[signer], &txnInfo{
-							gasPrice: evmGasPrice,
-							gasLimit: utilCosmosDemonGasLimitToEvmDemonGasLimit(fee.GetGas()),
-							nonce:    sigs[0].Sequence,
-							sender:   signer,
-						})
-					}
-				}
-
 				for _, sig := range sigs {
 					signer := sdk.AccAddress(sig.PubKey.Address()).String()
 					seq, ok := selectedTxsSignersSeqs[signer]
@@ -250,65 +198,6 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 
 			iterator = iterator.Next()
 		}
-
-		if len(txnInfoMap) == 0 {
-			h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0))
-		} else {
-			senderCnt := 0
-			txnCnt := 0
-			for sender := range txnInfoMap {
-				sort.Slice(txnInfoMap[sender], func(i, j int) bool {
-					return txnInfoMap[sender][i].nonce < txnInfoMap[sender][j].nonce
-				})
-				txnCnt += len(txnInfoMap[sender])
-				senderCnt++
-			}
-
-			remaing := gasPriceSuggestionBlockNum * int64(maxBlockGas)
-			var lastProcessedTx *txnInfo
-
-			for remaing > 0 && len(txnInfoMap) > 0 {
-				// Find the highest gas price among the first transaction of each account
-				var highestGasPrice *big.Int
-				var selectedSender string
-
-				// Compare first transaction (lowest nonce) from each account
-				for sender, txns := range txnInfoMap {
-					if len(txns) == 0 {
-						delete(txnInfoMap, sender)
-						continue
-					}
-
-					// First tx has lowest nonce due to earlier sorting
-					if highestGasPrice == nil || txns[0].gasPrice.Cmp(highestGasPrice) > 0 {
-						highestGasPrice = txns[0].gasPrice
-						selectedSender = sender
-					}
-				}
-
-				if selectedSender == "" {
-					break
-				}
-
-				// Process the selected transaction
-				selectedTx := txnInfoMap[selectedSender][0]
-				remaing -= int64(selectedTx.gasLimit)
-				lastProcessedTx = selectedTx
-
-				// Remove processed transaction
-				txnInfoMap[selectedSender] = txnInfoMap[selectedSender][1:]
-				if len(txnInfoMap[selectedSender]) == 0 {
-					delete(txnInfoMap, selectedSender)
-				}
-			}
-
-			if lastProcessedTx != nil && remaing <= 0 {
-				h.feemarketKeeper.SetSuggestionGasPrice(ctx, lastProcessedTx.gasPrice)
-			} else {
-				h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0))
-			}
-		}
-
 		return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()}
 	}
 }
@@ -447,22 +336,3 @@ func (ts *defaultTxSelector) SelectTxForProposal(maxTxBytes, maxBlockGas uint64,
 	// check if we've reached capacity; if so, we cannot select any more transactions
 	return ts.totalTxBytes >= maxTxBytes || (maxBlockGas > 0 && (ts.totalTxGas >= maxBlockGas))
 }
-
-func utilCosmosDemonGasPriceToEvmDemonGasPrice(gasGroup sdk.Coins) (*big.Int, error) {
-	gasPrice := big.NewInt(0)
-	for _, coin := range gasGroup {
-		if coin.Denom == chaincfg.GasDenom {
-			thisGasPrice := big.NewInt(0).SetUint64(coin.Amount.Uint64())
-			thisGasPrice = thisGasPrice.Mul(thisGasPrice, big.NewInt(0).SetInt64(chaincfg.GasDenomConversionMultiplier))
-			gasPrice = gasPrice.Add(gasPrice, thisGasPrice)
-		} else {
-			return big.NewInt(0), fmt.Errorf("invalid denom: %s", coin.Denom)
-		}
-	}
-
-	return gasPrice, nil
-}
-
-func utilCosmosDemonGasLimitToEvmDemonGasLimit(gasLimit uint64) uint64 {
-	return gasLimit * chaincfg.GasDenomConversionMultiplier
-}
diff --git a/app/ante/ante_test.go b/app/ante/ante_test.go
index eb5aad35..35853919 100644
--- a/app/ante/ante_test.go
+++ b/app/ante/ante_test.go
@@ -62,7 +62,6 @@ func TestAppAnteHandler_AuthorizedMempool(t *testing.T) {
 				encodingConfig,
 				baseapp.SetChainID(app.TestChainId),
 			),
-			nil,
 		),
 	}
 
diff --git a/app/app.go b/app/app.go
index 49c71347..814f0631 100644
--- a/app/app.go
+++ b/app/app.go
@@ -313,7 +313,6 @@ func NewApp(
 	encodingConfig chainparams.EncodingConfig,
 	options Options,
 	bApp *baseapp.BaseApp,
-	setAbciProposalHandler func(feemarketKeeper FeeMarketKeeper) sdk.PrepareProposalHandler,
 ) *App {
 	appCodec := encodingConfig.Marshaler
 	legacyAmino := encodingConfig.Amino
@@ -490,6 +489,7 @@ func NewApp(
 		keys[feemarkettypes.StoreKey],
 		tkeys[feemarkettypes.TransientKey],
 		feemarketSubspace,
+		bApp.Mempool(),
 	)
 
 	app.evmutilKeeper = evmutilkeeper.NewKeeper(
@@ -902,10 +902,6 @@ 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 becb9464..3f95d81f 100644
--- a/app/app_test.go
+++ b/app/app_test.go
@@ -38,7 +38,6 @@ func TestNewApp(t *testing.T) {
 			MakeEncodingConfig(),
 			baseapp.SetChainID(TestChainId),
 		),
-		nil,
 	)
 }
 
@@ -56,7 +55,6 @@ func TestExport(t *testing.T) {
 			MakeEncodingConfig(),
 			baseapp.SetChainID(TestChainId),
 		),
-		nil,
 	)
 
 	genesisState := GenesisStateWithSingleValidator(&TestApp{App: *app}, NewDefaultGenesisState())
diff --git a/app/test_common.go b/app/test_common.go
index 6c469e4a..3809646e 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, nil,
+		encCfg, DefaultOptions, bApp,
 	)
 	return TestApp{App: *app}
 }
diff --git a/cmd/0gchaind/app.go b/cmd/0gchaind/app.go
index d8d3d10b..f09ec847 100644
--- a/cmd/0gchaind/app.go
+++ b/cmd/0gchaind/app.go
@@ -126,6 +126,8 @@ 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,
@@ -140,10 +142,6 @@ 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
@@ -172,14 +170,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, nil)
+		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp)
 
 		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, nil)
+		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp)
 	}
 	return tempApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport)
 }

From 6f83c2285310569f501836f766eef63db6396c2b Mon Sep 17 00:00:00 2001
From: Solovyov1796 <xinyu@0g.ai>
Date: Thu, 13 Feb 2025 10:11:33 +0800
Subject: [PATCH 2/2] update ethermint version

---
 go.mod | 2 +-
 go.sum | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/go.mod b/go.mod
index e8ee335e..15434cb9 100644
--- a/go.mod
+++ b/go.mod
@@ -250,7 +250,7 @@ replace (
 	// TODO: Tag before release
 	github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc2
 	// Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support
-	github.com/evmos/ethermint => github.com/0glabs/ethermint v0.21.0-0g.v3.1.10
+	github.com/evmos/ethermint => github.com/0glabs/ethermint v0.21.0-0g.v3.1.12
 	// See https://github.com/cosmos/cosmos-sdk/pull/10401, https://github.com/cosmos/cosmos-sdk/commit/0592ba6158cd0bf49d894be1cef4faeec59e8320
 	github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0
 	// Downgraded to avoid bugs in following commits which causes "version does not exist" errors
diff --git a/go.sum b/go.sum
index f17c68f4..f0821f5f 100644
--- a/go.sum
+++ b/go.sum
@@ -213,8 +213,8 @@ github.com/0glabs/cometbft v0.37.9-0glabs.1 h1:KQJG17Y21suKP3QNICLto4b5Ak73XbSmK
 github.com/0glabs/cometbft v0.37.9-0glabs.1/go.mod h1:j0Q3RqrCd+cztWCugs3obbzC4NyHGBPZZjtm/fWV00I=
 github.com/0glabs/cosmos-sdk v0.47.10-0glabs.10 h1:NJp0RwczHBO4EvrQdDxxftHOgUDBtNh7M/vpaG7wFtQ=
 github.com/0glabs/cosmos-sdk v0.47.10-0glabs.10/go.mod h1:KskIVnhXTFqrw7CDccMvx7To5KzUsOomIsQV7sPGOog=
-github.com/0glabs/ethermint v0.21.0-0g.v3.1.10 h1:DE8hK2OJp9rKYdT2Y0G259/6nAFcOQi383l2e7/VFnE=
-github.com/0glabs/ethermint v0.21.0-0g.v3.1.10/go.mod h1:6e/gOcDLhvlDWK3JLJVBgki0gD6H4E1eG7l9byocgWA=
+github.com/0glabs/ethermint v0.21.0-0g.v3.1.12 h1:IRVTFhDEH2J5w8ywQW7obXQxYhJYib70SNgKqLOXikU=
+github.com/0glabs/ethermint v0.21.0-0g.v3.1.12/go.mod h1:6e/gOcDLhvlDWK3JLJVBgki0gD6H4E1eG7l9byocgWA=
 github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
 github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
 github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM=