# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml
###############################################################################
### Base Configuration ###
###############################################################################
# The minimum gas prices a validator is willing to accept for processing a
# transaction. A transaction's fees must meet the minimum of any denomination
# specified in this config (e.g. 0.25token1;0.0001token2).
minimum-gas-prices = "0.01usei"
# MinRetainBlocks defines the minimum block height offset from the current block
# for pruning Tendermint blocks. Set to 0 to disable pruning. This only affects
# Tendermint block pruning, not application state (see "pruning-*" configs).
min-retain-blocks = 100000
# ConcurrencyWorkers defines how many workers to run for concurrent transaction execution.
# Default is dynamically set to 2x CPU cores, capped at 128, with a minimum of 10.
concurrency-workers = 10
# occ-enabled defines whether OCC is enabled or not for transaction execution
occ-enabled = true
# HaltHeight contains a non-zero block height at which a node will gracefully
# halt and shutdown that can be used to assist upgrades and testing.
#
# Note: Commitment of state will be attempted on the corresponding block.
halt-height = 0
# HaltTime contains a non-zero minimum block time (in Unix seconds) at which
# a node will gracefully halt and shutdown that can be used to assist upgrades
# and testing.
#
# Note: Commitment of state will be attempted on the corresponding block.
halt-time = 0
# InterBlockCache enables inter-block caching.
inter-block-cache = true
# IndexEvents defines the set of events in the form {eventType}.{attributeKey},
# which informs Tendermint what to index. If empty, all events will be indexed.
#
# Example:
# ["message.sender", "message.recipient"]
index-events = []
# CompactionInterval sets (in seconds) the interval between forced levelDB
# compaction. A value of 0 means no forced levelDB.
# Default is 0.
compaction-interval = 0
###############################################################################
### State Sync Configuration ###
###############################################################################
# State sync snapshots allow other nodes to rapidly join the network without replaying historical
# blocks, instead downloading and applying a snapshot of the application state at a given height.
[state-sync]
# snapshot-interval specifies the block interval at which local state sync snapshots are
# taken (0 to disable). Must be a multiple of pruning-keep-every.
snapshot-interval = 0
# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).
snapshot-keep-recent = 2
# snapshot-directory sets the directory for where state sync snapshots are persisted.
# default is empty which will then store under the app home directory same as before.
snapshot-directory = ""
###############################################################################
### State Commit Configuration ###
###############################################################################
[state-commit]
# Enable defines if the SeiDB state-commit should be enabled.
sc-enable = true
# Defines the SC store directory, if not explicitly set, default to application home directory
sc-directory = ""
# Max concurrent historical proof queries (RPC /store path)
sc-historical-proof-max-inflight = 1
# Historical proof query rate limit in req/sec (<=0 disables rate limiting)
sc-historical-proof-rate-limit = 1
# Historical proof query burst size
sc-historical-proof-burst = 1
# AsyncCommitBuffer defines the size of asynchronous commit queue, this greatly improve block catching-up
# performance, setting to 0 means synchronous commit.
sc-async-commit-buffer = 100
# KeepRecent defines how many state-commit snapshots (besides the latest one) to keep
# defaults to 0 to only keep one current snapshot
sc-keep-recent = 0
# SnapshotInterval defines the block interval the snapshot is taken, default to 10000 blocks.
sc-snapshot-interval = 10000
# SnapshotMinTimeInterval defines the minimum time interval (in seconds) between snapshots.
# This prevents excessive snapshot creation during catch-up and ensures snapshots don't overlap
# (current snapshot creation takes 3+ hours). Default to 3600 seconds (1 hour).
# Note: If you set a small sc-snapshot-interval (e.g., < 5000), you may want to reduce this value
# to allow more frequent snapshots during normal operation.
sc-snapshot-min-time-interval = 3600
# SnapshotPrefetchThreshold defines the page cache residency threshold (0.0-1.0) to trigger snapshot prefetch.
# Prefetch sequentially reads nodes/leaves files into page cache for faster cold-start replay.
# Only active trees (evm/bank/acc/wasm) are prefetched, skipping sparse kv files to save memory.
# Skips prefetch if more than threshold of pages already resident (e.g., 0.8 = 80%).
# Defaults to 0.8
sc-snapshot-prefetch-threshold = 0.8
# Maximum snapshot write rate in MB/s (global across all trees). 0 = unlimited. Default 100.
sc-snapshot-write-rate-mbps = 100
# EVMSSMode consolidates the previous separate SC-layer EVM write/read routing
# modes (sc-write-mode / sc-read-mode) into a single setting. It controls how
# EVM state store data is written and read.
# Valid values: cosmos_only, dual_write, split_write
evm-ss-mode = "cosmos_only"
# EnableLatticeHash controls whether lattice hash participates in the final app hash.
# Must be enabled when using split_write mode.
sc-enable-lattice-hash = false
# KeysToMigratePerBlock controls how many EVM keys the in-flight migration
# (sc-write-mode = migrate_evm / migrate_bank / migrate_all_but_bank) drains
# from memiavl into flatkv per block. Default 1024 is appropriate for
# production drains; lower it (e.g. 256) to spread the migration across more
# blocks for test runs that need to observe the resume / hybrid-read path.
# Must be > 0; ignored entirely when not in a migration mode.
sc-keys-to-migrate-per-block = 1024
###############################################################################
### FlatKV (EVM) Configuration ###
###############################################################################
[state-commit.flatkv]
# Fsync controls whether PebbleDB writes (data DBs + metadataDB) use fsync.
# WAL always uses NoSync (matching memiavl); crash recovery relies on
# WAL catchup, which is idempotent. Default: false.
fsync = false
# AsyncWriteBuffer defines the size of the async write buffer for data DBs.
# Set <= 0 for synchronous writes.
async-write-buffer = 0
# SnapshotInterval defines how often (in blocks) a PebbleDB checkpoint is taken.
# 0 disables auto-snapshots. Default: 10000.
snapshot-interval = 10000
# SnapshotKeepRecent defines how many old snapshots to keep besides the latest one.
# 0 = keep only the current snapshot. Default: 2.
snapshot-keep-recent = 2
# EnablePebbleMetrics is a single FlatKV-level knob that controls whether
# PebbleDB internal metrics are emitted for all FlatKV data DBs (account,
# code, storage, legacy, and metadata). During initialization this value
# overrides any per-DB EnableMetrics settings, so all data DBs share the same
# behavior. Default: false.
enable-pebble-metrics = false
###############################################################################
### State Store Configuration ###
###############################################################################
[state-store]
# Enable defines whether the state-store should be enabled for storing historical data.
# Supporting historical queries or exporting state snapshot requires setting this to true
# This config only take effect when SeiDB is enabled (sc-enable = true)
ss-enable = true
# Defines the directory to store the state store db files
# If not explicitly set, default to application home directory
ss-db-directory = ""
# DBBackend defines the backend database used for state-store.
# Supported backends: pebbledb, rocksdb
# defaults to pebbledb (recommended)
ss-backend = "pebbledb"
# AsyncWriteBuffer defines the async queue length for commits to be applied to State Store
# Set <= 0 for synchronous writes, which means commits also need to wait for data to be persisted in State Store.
# defaults to 100 for asynchronous writes
ss-async-write-buffer = 100
# KeepRecent defines the number of versions to keep in state store
# Setting it to 0 means keep everything
# Default to keep the last 100,000 blocks
ss-keep-recent = 100000
# PruneInterval defines the minimum interval in seconds + some random delay to trigger SS pruning.
# It is recommended to trigger pruning less frequently with a large interval.
# default to 600 seconds
ss-prune-interval = 600
# ImportNumWorkers defines the concurrency for state sync import
# defaults to 1
ss-import-num-workers = 1
# EVMDBDirectory defines the directory for the optional EVM state-store DB(s).
# If unset, defaults to <home>/data/state_store/evm/{backend} when EVM SS is enabled.
evm-ss-db-directory = ""
# EVMSplit controls whether EVM data is routed to a dedicated SS backend.
# When false (default), EVM data lives in the Cosmos SS backend alongside
# everything else. When true, EVM data is routed exclusively to the EVM SS
# backend; non-EVM data stays in Cosmos SS. No fallback between backends.
evm-ss-split = false
# SeparateEVMSubDBs controls whether EVM data is split across per-type DBs.
# When false, all EVM data stays in one DB using the current unified layout.
# When true, data is routed to separate DBs while preserving the same evm key prefix format.
evm-ss-separate-dbs = false
###############################################################################
### Receipt Store Configuration ###
###############################################################################
[receipt-store]
# Backend defines the receipt store backend.
# Supported backends: pebble (aka pebbledb)
# defaults to pebbledb
rs-backend = "pebbledb"
# Defines the receipt store directory. If unset, defaults to <home>/data/ledger/receipt/{backend}
db-directory = ""
# AsyncWriteBuffer defines the async queue length for commits to be applied to receipt store.
# Applies only when rs-backend = "pebbledb".
# Set <= 0 for synchronous writes.
# defaults to 100
async-write-buffer = 100
# PruneIntervalSeconds defines the interval in seconds to trigger pruning.
# Receipt retention is controlled by the global min-retain-blocks flag: the
# receipt store keeps the last min-retain-blocks blocks (0 = keep everything,
# no pruning). The dedicated receipt-store.keep-recent field has been removed
# and is ignored if set.
# defaults to 600 seconds
prune-interval-seconds = 600
# TxIndexBackend selects the tx-hash index implementation for parquet receipts.
# Set to "pebbledb" to maintain a Pebble-backed tx_hash -> block_number index
# alongside parquet files so receipt-by-hash lookups can target a single file
# instead of scanning all files. Set to "" to disable the index.
#
# WARNING: with the index disabled, a receipt-by-tx-hash lookup (e.g.
# eth_getTransactionReceipt) that misses the in-memory cache fails fast and
# returns a not-found result instead of falling back to a full parquet scan
# (a full scan reads every file on disk and is prohibitively expensive at
# production scale). Operators that must serve historical receipts by tx hash
# should keep the index enabled; otherwise receipts that are no longer cached
# will appear as not-found. Block-range queries such as log filtering are
# unaffected since they do not use the tx hash index.
# Ignored unless rs-backend = "parquet".
# defaults to "pebbledb"
tx-index-backend = "pebbledb"
###############################################################################
### EVM Configuration ###
###############################################################################
[evm]
# controls whether an HTTP EVM server is enabled
http_enabled = true
http_port = 8545
# controls whether a websocket server is enabled
ws_enabled = true
ws_port = 8546
# ReadTimeout is the maximum duration for reading the entire
# request, including the body.
# Because ReadTimeout does not let Handlers make per-request
# decisions on each request body's acceptable deadline or
# upload rate, most users will prefer to use
# ReadHeaderTimeout. It is valid to use them both.
read_timeout = "30s"
# ReadHeaderTimeout is the amount of time allowed to read
# request headers. The connection's read deadline is reset
# after reading the headers and the Handler can decide what
# is considered too slow for the body. If ReadHeaderTimeout
# is zero, the value of ReadTimeout is used. If both are
# zero, there is no timeout.
read_header_timeout = "30s"
# WriteTimeout is the maximum duration before timing out
# writes of the response. It is reset whenever a new
# request's header is read. Like ReadTimeout, it does not
# let Handlers make decisions on a per-request basis.
write_timeout = "30s"
# IdleTimeout is the maximum amount of time to wait for the
# next request when keep-alives are enabled. If IdleTimeout
# is zero, the value of ReadTimeout is used. If both are
# zero, ReadHeaderTimeout is used.
idle_timeout = "2m0s"
# Maximum gas limit for simulation
simulation_gas_limit = 10000000
# Timeout for EVM call in simulation
simulation_evm_timeout = "1m0s"
# list of CORS allowed origins, separated by comma
cors_origins = "*"
# list of WS origins, separated by comma
ws_origins = "*"
# timeout for filters
filter_timeout = "2m0s"
# checkTx timeout for sig verify
checktx_timeout = "5s"
# controls whether to have txns go through one by one
slow = false
# Deny list defines list of methods that EVM RPC should fail fast, e.g ["debug_traceBlockByNumber"]
deny_list = []
# Legacy sei_* / sei2_* JSON-RPC (EVM HTTP only - not Cosmos REST on 1317).
#
# DEPRECATION: The sei_* and sei2_* JSON-RPC surfaces are deprecated and scheduled for removal. Do not
# build new integrations on them; use eth_* / debug_* and documented replacements. HTTP 200;
# gate errors use standard JSON-RPC error encoding (see evmrpc/AGENTS.md). Successful allowlisted
# responses are unchanged; nodes may set HTTP header Sei-Legacy-RPC-Deprecation (see AGENTS.md).
#
# Gating applies to both single-object requests and JSON-RPC batches. Single-object allowed calls
# pass through unchanged. For batches, only the allowlisted (and otherwise valid) elements are
# forwarded to the inner handler as a filtered subset, and the inner responses are merged back into
# the original batch by JSON-RPC id; blocked elements return the standard gate error and any
# non-object batch element returns a JSON-RPC -32600 Invalid Request, so the gate cannot be
# bypassed. The legacy HTTP request body is capped at 5 MiB, matching go-ethereum's default
# (rpc.defaultBodyLimit).
#
# Only methods listed in enabled_legacy_sei_apis are allowed. Init defaults enable the three
# address/Cosmos helpers; uncomment optional lines below to enable more legacy methods (include
# sei2_* block methods at the end of the list if you need them).
enabled_legacy_sei_apis = [
"sei_getSeiAddress",
"sei_getEVMAddress",
"sei_getCosmosTx",
# Optional legacy methods - uncomment to enable (same deprecation applies):
# "sei_associate",
# "sei_getBlockByHash",
# "sei_getBlockByHashExcludeTraceFail",
# "sei_getBlockByNumber",
# "sei_getBlockByNumberExcludeTraceFail",
# "sei_getBlockReceipts",
# "sei_getBlockTransactionCountByHash",
# "sei_getBlockTransactionCountByNumber",
# "sei_getEvmTx",
# "sei_getFilterChanges",
# "sei_getFilterLogs",
# "sei_getLogs",
# "sei_getTransactionByBlockHashAndIndex",
# "sei_getTransactionByBlockNumberAndIndex",
# "sei_getTransactionByHash",
# "sei_getTransactionCount",
# "sei_getTransactionErrorByHash",
# "sei_getTransactionReceipt",
# "sei_getTransactionReceiptExcludeTraceFail",
# "sei_getVMError",
# "sei_newBlockFilter",
# "sei_newFilter",
# "sei_sign",
# "sei_uninstallFilter",
#
# Optional sei2_* block namespace (bank transfers in blocks; HTTP only):
# "sei2_getBlockByHash",
# "sei2_getBlockByHashExcludeTraceFail",
# "sei2_getBlockByNumber",
# "sei2_getBlockByNumberExcludeTraceFail",
# "sei2_getBlockReceipts",
# "sei2_getBlockTransactionCountByHash",
# "sei2_getBlockTransactionCountByNumber",
]
# max number of logs returned if block range is open-ended
max_log_no_block = 10000
# max number of blocks to query logs for
max_blocks_for_log = 2000
# max number of concurrent NewHead subscriptions
max_subscriptions_new_head = 10000
# MaxConcurrentTraceCalls defines the maximum number of concurrent debug_trace calls.
# Set to 0 for unlimited.
max_concurrent_trace_calls = 10
# Max number of blocks allowed to look back for tracing
# Set to -1 for unlimited lookback, which is useful for archive nodes.
max_trace_lookback_blocks = 10000
# Timeout for each trace call
trace_timeout = "30s"
# Enable the parallelized default debug_traceBlock* path.
# When true, debug_traceBlock* requests that do not specify an explicit
# tracer use the parallelized block trace path; requests with an explicit
# tracer continue to use the legacy path. Default false.
enable_parallelized_block_trace = false
# WorkerPoolSize defines the number of workers in the worker pool.
# Default: min(64, CPU cores × 2). Capped at 64 to prevent excessive goroutines on high-core machines.
# Set to 0 to use the default.
worker_pool_size = 8
# WorkerQueueSize defines the size of the task queue in the worker pool.
# Default: 1000 tasks. Set to 0 to use the default.
worker_queue_size = 1000
# TraceBakeEnabled, when true, runs a background worker that re-executes
# each committed block with the configured tracers and stores the result
# to <home>/data/trace_db. debug_traceTransaction with a bakeable
# tracer config (callTracer / prestateTracer / flatCallTracer) returns
# from cache on hit. Recommended for RPC nodes only; default false.
trace_bake_enabled = false
# Number of re-execution worker goroutines (default 1).
trace_bake_workers = 1
# Bounded in-flight height queue. Drops on full so consensus never blocks.
trace_bake_queue_size = 4096
# Which tracers to bake per block; only standard named tracers are eligible.
trace_bake_tracers = ["callTracer"]
# Rolling cache window: prune blocks older than (latest - this).
# 0 disables pruning (cache grows forever).
trace_bake_window_blocks = 0
# TraceBakeUseSnapshot, when true, uses in-memory memiavl snapshots as the
# state backend for trace baking when the store backend supports snapshots.
# Watch these metrics when enabling on a high-throughput node:
# - memiavl_mem_node_total_size / memiavl_num_of_mem_node: rise if held
# snapshots are pinning too many COW nodes; lower the window or drop the
# memiavl snapshot interval.
# - trace baker dropped/baked counters: dropped > 0 or baked lagging chain
# tip means the baker is falling behind.
trace_bake_use_snapshot = false
# Number of recent memiavl snapshots to retain for trace baking.
trace_bake_snapshot_window = 64
# ip_rate_limit_rps is the per-IP sustained request rate in requests/second.
# Set to 0 to disable per-IP rate limiting (all requests pass through).
ip_rate_limit_rps = 200
# ip_rate_limit_burst is the maximum per-IP burst above the sustained rate.
ip_rate_limit_burst = 400
###############################################################################
### Giga Executor Configuration ###
###############################################################################
[giga_executor]
# enabled controls whether to use the Giga executor for improved EVM throughput.
# Default: true
enabled = true
# occ_enabled controls whether to use OCC (Optimistic Concurrency Control) with the Giga executor.
# When true, transactions are executed in parallel with conflict detection and retry.
# Default: true
occ_enabled = true
###############################################################################
### Admin Configuration (Auto-managed) ###
###############################################################################
[admin_server]
# Enable the admin gRPC server for runtime log level control.
admin_enabled = false
# Listen address for the admin gRPC server. Must be a loopback address.
admin_address = "127.0.0.1:9095"
###############################################################################
### Telemetry Configuration (Auto-managed) ###
###############################################################################
[telemetry]
# Prefixed with keys to separate services.
service-name = ""
# Enabled enables the application telemetry functionality. When enabled,
# an in-memory sink is also enabled by default. Operators may also enabled
# other sinks such as Prometheus.
enabled = true
# Enable prefixing gauge values with hostname.
enable-hostname = false
# Enable adding hostname to labels.
enable-hostname-label = false
# Enable adding service to labels.
enable-service-label = false
# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink.
prometheus-retention-time = 7200
# When both 'api.enable' and 'telemetry.enabled' are true, this node will expose
# application metrics (custom Cosmos SDK metrics) on the API server endpoint along with the
# Tendermint metrics (port 26660) which are always enabled.
# GlobalLabels defines a global set of name/value label tuples applied to all
# metrics emitted using the wrapper functions defined in telemetry package.
#
# Example:
# [["chain_id", "cosmoshub-1"]]
global-labels = []
###############################################################################
### API Configuration (Auto-managed) ###
###############################################################################
[api]
# Enable defines if the API server should be enabled.
enable = true
# Swagger defines if swagger documentation should automatically be registered.
swagger = true
# Address defines the API server to listen on.
address = "tcp://0.0.0.0:1317"
# MaxOpenConnections defines the number of maximum open connections.
max-open-connections = 1000
# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds).
rpc-read-timeout = 10
# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds).
rpc-write-timeout = 0
# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes).
rpc-max-body-bytes = 1000000
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enabled-unsafe-cors = false
###############################################################################
### Rosetta Configuration (Auto-managed) ###
###############################################################################
[rosetta]
# Enable defines if the Rosetta API server should be enabled.
enable = false
# Address defines the Rosetta API server to listen on.
address = ":8080"
# Network defines the name of the blockchain that will be returned by Rosetta.
blockchain = "app"
# Network defines the name of the network that will be returned by Rosetta.
network = "network"
# Retries defines the number of retries when connecting to the node before failing.
retries = 3
# Offline defines if Rosetta server should run in offline mode.
offline = false
###############################################################################
### gRPC Configuration (Auto-managed) ###
###############################################################################
[grpc]
# Enable defines if the gRPC server should be enabled.
enable = true
# Address defines the gRPC server address to bind to.
address = "0.0.0.0:9090"
###############################################################################
### gRPC Web Configuration (Auto-managed) ###
###############################################################################
[grpc-web]
# GRPCWebEnable defines if the gRPC-web should be enabled.
# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op.
enable = true
# Address defines the gRPC-web server address to bind to.
address = "0.0.0.0:9091"
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enable-unsafe-cors = false
###############################################################################
### Genesis Configuration (Auto-managed) ###
###############################################################################
# Genesis config allows configuring whether to stream from an genesis json file in streamed form
[genesis]
# stream-import specifies whether to the stream the import from the genesis json file. The genesis
# file must be in stream form and exported in a streaming fashion.
stream-import = false
# genesis-stream-file specifies the path of the genesis json file to stream from.
genesis-stream-file = ""
###############################################################################
### WASM Configuration (Auto-managed) ###
###############################################################################
[wasm]
# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries
query_gas_limit = 300000
# This is the number of wasm vm instances we keep cached in memory for speed-up
# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally
lru_size = 0
###############################################################################
### ETH Replay Configuration (Auto-managed) ###
###############################################################################
[eth_replay]
eth_replay_enabled = false
eth_rpc = "http://44.234.105.54:18545"
eth_data_dir = "/root/.ethereum/chaindata"
eth_replay_contract_state_checks = false
###############################################################################
### ETH Block Test Configuration (Auto-managed) ###
###############################################################################
[eth_blocktest]
eth_blocktest_enabled = false
eth_blocktest_test_data_path = "~/testdata/"
###############################################################################
### EVM Query Configuration (Auto-managed) ###
###############################################################################
[evm_query]
evm_query_gas_limit = 300000
###############################################################################
### Light Invariance Configuration (Auto-managed) ###
###############################################################################
[light_invariance]
supply_enabled = true