evmd. For conceptual information about mempool design and architecture, see the Mempool Concepts page.
The mempool setup is split across two locations:
evmd/mempool.go—configureEVMMempoolmust be called from yourapp.goaftersetAnteHandlermempool/— the mempool implementation (EVMMempool,TxPool,Rechecker,ReapList,RecheckPool, etc)
MinTip are exposed via
app.toml and require no code changes. The legacy
pool (legacypool.LegacyPool) is a port of go-ethereum’s transaction pool and
handles all EVM transaction ordering and fee enforcement. Some advanced
settings are not covered by app.toml, and require modifying
createMempoolConfig in evmd/mempool.go. BlockGasLimit is read from
consensus_params.block.max_gas in genesis.json.
Configuration Options
TheConfig struct controls mempool behavior:
mempool/mempool.go
Defaults and Fallbacks
- If
BlockGasLimitis0, the mempool uses a fallback of100_000_000gas. - If
LegacyPoolConfigis not provided, defaults fromlegacypool.DefaultConfigare used. - If
CosmosPoolConfigis not provided, a defaultPriorityNonceMempoolis created with:- Priority =
(fee_amount / gas_limit)in the EVM coin denom - Comparator = big-int comparison (higher is selected first)
MinValue = 0
- Priority =
MinTipis optional. If unset, selection uses the effective tip from each tx (min(gas_tip_cap, gas_fee_cap - base_fee)).- If
PendingTxProposalTimeoutis not provided, 0 is used. This means unlimited timeout and always wait for all tx rechecking to finish before creating a proposal. - If
InsertQueueSizeis 0, the mempool uses a fallback of 5000. - If
EnableTxTrackeris not provided, it is kept false.
Custom Legacy Pool Configuration
Customize EVM transaction pool parameters:evmd/mempool.go
Custom Cosmos Mempool Configuration
The mempool uses aPriorityNonceMempool for Cosmos transactions by default. You can customize the priority calculation:
evmd/mempool.go
Custom Block Gas Limit
BlockGasLimit is read automatically from consensus_params.block.max_gas in genesis.json — it is not an app.toml setting. To change it, update the genesis file before chain start. The value can also be overridden in code:
evmd/mempool.go
Event Bus Integration
Users must connect the mempool to CometBFT’s EventBus so it can react to finalized blocks:evmd/app.go
app.toml Configuration
The following settings can be configured inapp.toml and take effect at node startup without code changes:
| Key | Default | Description |
|---|---|---|
evm.min-tip | 0 | Minimum tip (priority fee) in wei; transactions below this are excluded from block selection |
evm.mempool.price-limit | 1 | Minimum gas price in wei to accept a transaction into the pool |
evm.mempool.price-bump | 10 | Minimum % increase required to replace a pending transaction with the same nonce |
evm.mempool.account-slots | 16 | Max executable transactions per account |
evm.mempool.global-slots | 5120 | Max total executable transactions across all accounts |
evm.mempool.account-queue | 64 | Max queued (non-executable) transactions per account |
evm.mempool.global-queue | 1024 | Max total queued transactions across all accounts |
evm.mempool.lifetime | 3h | Max time a transaction can remain queued before eviction |
evm.mempool.included-nonce-cache-size | 4096 | Max amount of nonces to track for eviction. Should be set to the maximum number of accounts you expect to see in a single block, given your chains block gas limit. |
evm.mempool.pending-tx-proposal-timeout | 0ms | Max time to wait for fetching pending execution transaction when creating a proposal. 0 means wait for all transactions to be validated before creating a proposal. Note that this may take a significant amount of time under high load and can degrade performance. We’ve found setting this to ~250ms strikes the right balance between performance and rechecking a sufficient amount of transactions per block. |
evm.mempool.check-tx-timeout | 5s | Timeout to wait for CheckTx on Cosmos txs insertion. |
evm.mempool.insert-queue-size | 5000 | Max amount of transactions that can be pending insertion before returning an error. Note that EVM & Cosmos transaction use separate queues. So you may have insert-queue-size EVM transactions pending insertion, and insert-queue-size Cosmos transactions pending insertion. |
evm.mempool.enable-tx-tracker | false | If metrics for tracking EVM transaction inclusion latencies should be enabled. |
Monitoring and Debugging
Use the txpool RPC methods to monitor mempool state:txpool_status: Get pending and queued transaction countstxpool_content: View all transactions in the pooltxpool_inspect: Get human-readable transaction summariestxpool_contentFrom: View transactions from specific addresses
Related Documentation
- Mempool Concepts - Understanding mempool behavior and design
- EVM Module Integration - Prerequisites for mempool integration
- JSON-RPC Methods - Mempool query methods