Documentation Index
Fetch the complete documentation index at: https://docs.monad.xyz/llms.txt
Use this file to discover all available pages before exploring further.
This page catalogues every notable release. Some releases target only specific networks; for a
more intuitive view of upgrades to one network, see:
We group changes into
- protocol changes (generally requiring a new Revision)
- generally tagged with [EVM], [Consensus], or [Network params]
- RPC/SDK behavioral changes (generally tagged with [RPC])
- performance changes
- tagged based on the nature of the change as [EVM], [Consensus], or [RPC]
- internal/node-ops changes (generally tagged as [Node ops])
v0.14.2
| Network | Date released | Comment |
|---|
mainnet | 2026-04-30 | |
testnet | 2026-04-23 | |
Tags or hashes:
Highlights
debug_* improvements — new index field on traced logs; eth_call returns explicit reserve balance violation error
- 8-9x speedup on compaction hot path — trie node array optimization reduces redundant pointer recomputation
- Fair queue forwarded ingress in txpool — improves tx forwarding fairness between validators
Notable RPC/SDK changes
- [RPC] Move callframe retrieval methods to ChainState
- Ref: monad-bft PR #2936, PR #2937
- Covers block and transaction callframes; deduplicates call frame decoding in debug trace handlers
- [RPC] Include log index in debug trace output; surface reserve balance error in
eth_call
- Ref: monad-bft PR #2658
- Adds
index field to each traced log in the debug call tracer, reflecting the global log order within a transaction across all nested call frames; eth_call now returns an explicit reserve balance violation error instead of a generic failure when a transaction exceeds the sender’s reserve balance
- [RPC] Move eth call gas limit config to EthCallHandler
- [RPC]
debug_* methods now count toward eth call rate limiting
- Ref: monad-bft PR #2868
debug_traceCall, debug_traceTransaction, and related methods now update the eth call stats tracker; previously they bypassed it
- [RPC] Enforce max response size earlier for debug RPC methods
- [RPC] Lower RPC batch request limit to match Geth’s default
Notable robustness changes
- [Consensus] ConfirmGroup message fix
- Ref: monad-bft PR #2652
- Prevents oversized ConfirmGroup messages being rejected by full nodes; introduces NoConfirm response when group reaches max size
- [Consensus] Fix leak in leanudp identity usage map
- [Consensus] Enforce stale message timeout in leanudp
- [RPC] Fix eth call stats tracking memleak in RPC
- [Consensus] Relax statesync assertion for stale DoneSync edge case
- [Execution] Fix possible UB in unaligned read
- [Execution] Fix incorrect auto_expire_version initialization after DB reset
- [Execution] Fix compaction progress reset during statesync
- Ref: monad (execution) PR #2133
- Fixes compaction head being incorrectly reset to 0 during statesync, causing compaction to restart from the beginning
- [Consensus] Decode exact forwarded transactions
- [Consensus] Front-load cheap consensus validation checks
- [Consensus] Fair queue forwarded ingress in txpool client
- [Consensus] Move forwarded tx pacing into executor, simplify ingress batching
- [Consensus] Drop already-obsolete consensus messages before certificate validation
- [Execution] Optimize trie node array access (8-9x speedup on compaction hot path)
- Ref: monad (execution) PR #2163
- Hoists base pointers for packed node arrays; reduces redundant pointer recomputation in compaction, expiration, and version tracking loops
Notable internal changes
- [Consensus] Raptorcast: direct UDP transport
- Ref: monad-bft PR #2898, PR #2900
- Adds a dedicated direct UDP socket for point-to-point traffic, bypassing Raptorcast erasure coding. Eliminates the ~2.5x bandwidth amplification inherent in Raptorcast for unicast sends. Falls back to the Raptorcast path gracefully for peers that don’t support it.
- Note: Still in testing — not recommended for production use in this release.
- [Consensus] Wireauth: lower per-instance defaults
- [Execution] Replace system boost fiber with submodule (boost-1.83.0)
- [Execution] Separate precompile gas cost calculation from runtime implementation
- [Execution] Remove support for EVMC_FRONTIER
- [Execution] Add block-level event recording for Ethereum and Monad replay
- [Consensus] Configure shared peer scoring for txpool and raptorcast
- [Consensus] Raptorcast: enforce type-level safety for BroadcastGroup in build target
- Ref: monad-bft PR #2843
- Restricts build target to established groups, eliminating packet builder epoch/round tracking desync risk
v0.14.1
| Network | Date released | Comment |
|---|
mainnet | 2026-04-09 | |
testnet | 2026-04-08 | |
Tags or hashes:
monad-bft (consensus): tag v0.14.1 (4ed79392)
monad (execution): tag v0.14.1 (54e132cfa) — same commit as v0.14.0
Note: Patch release on top of v0.14.0. Execution layer unchanged.
Notable RPC/SDK changes
- [RPC] Fix
eth_fillTransaction gas estimation and reserve balance handling
- Ref: monad-bft PR #2949
- Maps reserve-balance failures to a dedicated result instead of collapsing into a generic error; makes omitted-gas fill estimation more permissive with an unbounded-balance state override during fill estimation
- Note:
eth_fillTransaction with insufficient balance now returns reserve balance violation (was: insufficient balance). Callers matching on exact error strings should update accordingly.
v0.14.0
| Network | Date released | Comment |
|---|
mainnet | N/A | |
testnet | 2026-04-02 | |
Tags or hashes:
Highlights
- RPC: ~400ms faster receipt queries — Receipts now tracked in chainstate buffer and available at Proposed time, eliminating trie lookups that added ~400ms on v0.13.0.
- RPC:
eth_fillTransaction — New endpoint to get a fully populated transaction (gas, nonce, etc.) without signing. Useful for wallets and dapps preparing transactions.
- RPC: Websocket notifications on proposed blocks —
newHeads and logs subscriptions now emit on proposed blocks instead of voted, reducing notification latency for real-time applications.
Notable RPC/SDK changes
- [RPC]
eth_fillTransaction RPC endpoint
- Ref: monad-bft PR #2662, PR #2932
- PR #2932 fixes several inconsistencies: preserves user-provided
maxFeePerGas when sufficient, treats 0x0 gas/fee as missing, allows gas fill for failed txs, rejects blob-style requests, handles EIP-2930 legacy-fee correctly
- [RPC] Use proposed blocks in websocket notifications
- [RPC] Transaction receipts in chainstate buffer (~400ms faster receipt queries)
- [RPC] Consolidate triedb usage to ChainState
- [RPC] Use ChainStateBuffer for RPC logs
- [Execution] Add execution events Rust SDK with path resolution and descriptor info
Notable robustness changes
- [Execution] Remove ASSERT that relied on suboptimality of reserve balance accounting
- [Consensus] RLP cleanup and stricter decoding enforcement
- [Consensus] Fix zero-length allocation leak in triedb sync read FFI
- [Consensus] Fix dataplane ban expiry TOCTOU underflow
- [Archive] Fix S3 client stuck after sustained outage
- [Archive] Relax checker replica matching for AWS args
- Ref: monad-bft PR #2943
- Handles missing optional AWS fields in stored replica config; avoids dropping replicas from tracked state
- [Execution] Fix runloop_monad off-by-one when nblocks=1
- [Execution] Fix RangedGetMachine skipping keys past min prefix
- [Execution] Fix node writer reentrance causing non-contiguous writes
- [Execution] Fix undefined behavior in RLP encoding with empty inputs
- [Consensus] Fix unstable ordering of OpenRPC schemas
- [Consensus] Fix ledger-tail: read author_address from persisted peers
- [Consensus] Cache all successful Raptorcast decoding outcomes
- [Consensus] Weighted fair queue for transaction ingestion
- [Consensus] Gas-based peer scoring
- [Consensus] XOR decoder buffers in AVX2 chunks
- [Consensus] Lazy decoder for BLS signature
- [Execution] Improve fast list compaction offset calculation with hysteresis
Notable internal changes
- [Consensus] ⚠️ Make auth UDP fields in
node.toml required
- [Consensus] Lower max
raptor10_fullnode_redundancy_factor from 7 to 3
- [Node ops] ⚠️
monad-ledger-tail: rename --node-config-path to --peers-path
- Ref: monad-bft PR #2916
- If you run
monad-ledger-tail manually or in a custom systemd unit, update the flag name
- [Node ops] Change systemd services from
Restart=no to Restart=always
- [Consensus] Lightweight UDP framing protocol (leanudp)
- [Consensus] Support direct UDP port in peer discovery
- [Consensus] Auth socket with codec abstraction, direct point-to-point routing
- [Consensus] Raptorcast: remove legacy packet parser
- [Archive] Support per-source AWS profile with isolation (
--profile flag for archiver source/sink/fallback, reads from .aws/credentials and .aws/config)
- [Execution] Refactor chain: remove
static_validate_header and validate_transaction virtual methods
v0.13.1
| Network | Date released | Comment |
|---|
mainnet | 2026-03-16 | |
testnet | 2026-03-16 | |
devnet | N/A | |
Tags or hashes:
Note: This is a patch release based on v0.13.0 to fix State Archive node RPC issues. The monad (execution) tag points to the same commit as v0.13.0.
Notable robustness changes
- [RPC] Use latest voted as fallback for last_proposed
- Ref: monad-bft PR #2857
- Fixes State Archive node RPC returning stale block data when
last_proposed is unavailable
v0.13.0 (MONAD_NINE)
| Network | Date released | Hardfork timestamp | Comment |
|---|
mainnet | 2026-03-12 | 1773930600(2026-03-19 14:30UTC) | MONAD_NINE hard fork |
testnet | 2026-03-05 | 1773153000(2026-03-10 14:30UTC) | MONAD_NINE hard fork |
devnet | N/A | N/A | |
Tags or hashes:
Note: The canonical release version is v0.13.0. The +1 build metadata on the monad execution tag indicates a post-release rebuild that includes the reserve balance precompile fallback cost fix (PR #2109).
Highlights
- RPC:
latest block tag: Finalized -> Proposed — queries with the latest block tag now return data from the latest proposed block, reducing query latency for eth_getBalance, eth_call, and other state queries.
- RPC:
eth_sendRawTransactionSync: Voted -> Proposed — earlier receipts when using the eth_sendRawTransactionSync method.
- Websocket:
newHeads/logs: Finalized -> Voted — earlier notifications for websocket subscribers to either newHeads or logs.
Notable protocol changes
All updates below are gated by the MONAD_NINE revision
- [EVM] MIP-3: Linear memory implementation
- [Execution] MIP-4: Reserve balance precompile
- [EVM] MIP-5: Activate Osaka fork (CLZ opcode)
Hard Fork: This release activates MONAD_NINE at timestamp 1773153000 (testnet) / 1773930600 (mainnet). Nodes must upgrade before activation.
Notable RPC/SDK changes
- [RPC] Latest blocktag uses proposed blocks
- [RPC] Use voted blocks in websocket notifications
- [RPC] Add experimental flag to RPC doc macro
- [RPC] Refactor RPC middleware for improved request handling
- [RPC] Add decompression guard to RPC
Notable robustness changes
- [Consensus] Add signature verifier for Raptorcast
- [Consensus] Fix reactivate logic in r10 decoder
- [Execution] Fix buffer overflow in C->Rust logging
- [Consensus] Add global connect rate limit to wireauth
- [Consensus] Validate ping/pong source address against name record in peer discovery
- [Consensus] Persist voted_head in ledger
- [Consensus] Add dual UDP packet sender for dataplane
- [Execution] Fix ThreadSanitizer race by joining bootstrap fiber before thread exit
- [Execution] Include account balance in selfdestruct tracer frame
- [Consensus] Ensure proposed head is on canonical chain
- [Execution] Fix sentinel collision in compact virtual chunk offset
- [Execution] Fix potential race condition in execute_block_transactions
Notable internal changes
- [Consensus] Remove unneeded channels when secondary raptorcast is disabled
- [Consensus] Upgrade alloy to stable release
- [Execution] Add
evm-as syntactic sugar for VM utilities
- [Consensus] Parametrize wireauth metrics for better observability
- [Consensus] Cleanup block persist implementation
- [Consensus] Fix wip extension in block-persist
- [Consensus] Remove legacy
do_local_insert
- [Consensus] Add metrics for raptorcast deserialize failures
- [RPC] Reduce RPC event server broadcast channel size
- [Consensus] Pre-TFM base fee cleanup
- [Consensus] Remove pre-TFM reserve balance logic
- [RPC] Simplify hex encoding/decoding in RPC
- [Archive] Add exists(key) to kvstore
v0.12.7
| Network | Date released | Comment |
|---|
mainnet | 2026-01-29 | |
testnet | 2026-01-20 | |
devnet | N/A | |
Tags or hashes:
Notable RPC/SDK changes
- [RPC] Allow block hash as block identifier in
eth_estimateGas
- [RPC] Use
RawValue for RPC id to preserve original JSON types
- Reduces effectiveness of DoS attacks using large JSON arrays/dicts in request IDs
- Ref: monad-bft PR #2455
Notable robustness changes
- [EVM] Fix undefined behavior in modexp precompile
- [Consensus] Remove consecutive sequence number assertion
- [Consensus] Improve liveness when advancing round using TC from timeout messages
- [Consensus] Disallow creating an empty validator set
Notable internal changes
- [Consensus] Add security tests for
secp256k1
- Adds Wycheproof tests, malleability tests, and security unit tests
- Ref: monad-bft PR #2706
- [Node ops] Update
rkyv and other dependencies
- [Consensus] Return bound socket addresses synchronously in dataplane
- [Consensus] Rename state backend cache for clarity
v0.12.6
| Network | Date released | Comment |
|---|
mainnet | 2026-01-14 | |
testnet | 2026-01-07 | |
devnet | N/A | |
Tags or hashes:
Notable RPC/SDK changes
- [RPC] Fix depth bug in selfdestructing call frames
- [RPC] Prestate tracer conformance fixes
Notable robustness changes
- [Consensus] Add signature verification rate limiting with authenticated peer bypass
- [Consensus] Validate confirm group message before updating peers
- [Consensus] Use Tai64N directly for wireauth timestamp comparison
- [Consensus] Improve RaptorCast decoding cache eviction
- [Consensus] Fix blocksync in-flight request tracking on cache hydration
- [Execution] Update triedb voted metadata before executing proposal
- Solves a race condition between Voted updates through websocket and corresponding JSON-RPC calls
- Ref: monad PR #1964
- [Node ops] Persist peers periodically for improved discovery resilience
- [Consensus] Boost dataplane throughput with ring buffer implementation
- [Execution] Native implementation for
MLOAD, MSTORE, MSTORE8, CALLDATALOAD opcodes
- [Execution] Improve snapshot write performance
- [Execution] Optimize database history length adjustment with binary search
- [Execution] Unify single buffer and scatter read handling in AsyncIO
Notable internal changes
- [Node ops] Docker single-node container updates for prebuilt images
- [Consensus] Add support for generic txpool sidecars
- [EVM] Osaka fork preparation
- Modexp gas changes and upper bound (EIP-7823/EIP-7883)
- Implement
CLZ opcode
- [Node ops] Accept
--hyphen-style long options in CLI
- [Node ops / Archive] Archive pipeline improvements
- [Node ops] Simplify RPC txpool status tracking
- [Node ops] Snapshot tooling improvements in
monad_cli
- [Node ops] Add RaptorCast decoding cache metrics
- [Execution] Add
CommitBuilder API to execution database
- [Execution] Remove legacy
using_chunks_for_root_offsets metadata field
- [Node ops / Txgen] Add ERC-4337 + EIP-7702 generator (
erc4337_7702_bundled)
- [Node ops] Add systemd service scripts for
blockcapd and execution events archivers
- [SDK] Add
monad_event_resolve_ring_file API
- [Execution] Enable VM host exception handling outside VM
v0.12.5
| Network | Date released | Comment |
|---|
mainnet | N/A | |
testnet | 2025-12-16 | reset from genesis |
devnet | N/A | |
Tags or hashes:
Notable network changes
- [Network reset]
testnet reset from genesis starting from MONAD_EIGHT
- Increases total supply to 100 B, consistent with
mainnet
- Clears a path to eliminate dead code (revisions required for early
testnet)
- Ref: monad PR #1983, monad-bft PR #2673
v0.12.4
| Network | Date released | Comment |
|---|
mainnet | 2025-12-05 | |
testnet | 2025-12-05 | |
devnet | 2025-12-05 | |
Tags or hashes:
Notable internal changes
- [Node ops] Fix peer discovery port configuration when constructing self name record
- Use port from peer discovery config instead of bound socket when constructing self name record.
This bug affected node operators using a NAT.
- Ref: monad-bft PR #2655
v0.12.3
| Network | Date released | Comment |
|---|
mainnet | 2025-12-05 | |
testnet | 2025-12-04 | |
devnet | 2025-12-04 | |
Tags or hashes:
Notable RPC/SDK changes
- [RPC] EIP-7966 (
eth_sendRawTransactionSync) support
- [RPC] Populate
value field on traces for staking precompile syscalls (added in 0.12.3-rpc-hotfix2)
Notable robustness changes
- [Consensus] Wire authentication protocol for UDP
- [Execution] Improve
statesync shutdown and fix protocol corruption
- Modified
statesync_server_recv() to guarantee complete reads
- Ref: monad PR #1930
- [RPC] Prevent reserve balance crash in RPC
- [Consensus] Add timeout to
txpool IPC stream
- [Consensus] Reject timeout certificates with empty signers
- [Consensus] Verify RaptorCast chunk length is non-zero
- [Execution] Fix MPT restore bug that failed to preserve
version_lower_bound
- [Execution] Fix move trie version forward bug
- Erase versions that fall out of history range before moving forward to newer versions
- Ref: monad PR #1957
- [Execution] Fix dangling pointers to intercode
- Resolves memory safety issue with
get_code and read_code functions
- Ref: monad PR #1941
- [Execution] Add retries to
runloop_monad_ethblocks
- [RPC] Improve
eth_getLogs performance
- [Execution] Fiber: add support for move-only functors
- Improves execution efficiency by supporting move semantics
- Ref: monad PR #1936
Notable internal changes
- [RPC / Node ops] Allow RPC to run without
monad-bft
- Enables standalone RPC operation for improved deployment flexibility
- Ref: monad-bft PR #2613
- [Node ops] Add
--root-offsets-chunk-count flag to monad-mpt to configure the number of chunks allocated for root offsets
- Each chunk holds approximately 16.5M blocks. Previously, all nodes were hardcoded to use 2 chunks (max TrieDB capacity of ~33M blocks)
- New default: 16 must be a power of 2
- Note that the default value of 16 translates to approximately 268M blocks ~ 1240 days. In most cases the limiting factor is disk capacity which will auto-compact when filled to 80%
- Ref: monad PR #1937
- [Node ops] Peer discovery improvements
- [Node ops / Archive] Archive infrastructure improvements
- Refactor
monad-block-writer for improved reliability with --max-blocks-per-iter configuration
- Async backfill with traces-only archive support
- Add
require-traces archiver flag and indexer fallback source
- Support for historical execution event archiving with generic directory archiving
- Potentially breaking: Remove
--start-block from monad-archiver systemd service; operators must use imperative CLI to set start block
- Example:
monad-archiver set-start-block --block 1000000 --archive-sink s3://bucket-name/path
- Use
--async-backfill flag to set the async-backfill marker instead of primary marker
- Ref: monad-bft PR #2610, monad-bft PR #2606, monad-bft PR #2598, monad-bft PR #2514, monad-bft PR #2612, monad-bft PR #2569, monad-bft PR #2623
- [Node ops] Networking configuration updates
- [Consensus] RaptorCast improvements
- Clear histogram every 30s and keep only p99 for better latency tracking
- Fix timer update after receiving control messages to ensure proper keepalives
- Ref: monad-bft PR #2627, monad-bft PR #2637
- [Consensus] Dataplane: refactor to use socket handles
- Prepares dataplane for future extension with authenticated sockets
- Ref: monad-bft PR #2458
- [Execution] Replay monad: always execute first block off latest finalized state
- [Node ops] Txgen improvements: README and guide, nonce gaps and legacy tx options, ERC20 pools, Uniswap v3 mode, NFT sale mode, websocket and RPC request generation
v0.12.2
| Network | Date released | Comment |
|---|
mainnet | 2025-11-19 | |
testnet | 2025-11-18 | |
devnet | 2025-11-18 | |
Tags or hashes:
Notable protocol changes
All updates below are gated by the MONAD_EIGHT revision
- [Execution] Reserve balance checks now use the final state code hash. This makes checks
slightly more liberal (less likely to revert transactions during execution), and also makes the
implementation closer to the
Coq model
that was proven correct under some assumptions.
- This changes the behavior of the following corner case:
- In transaction 1, account X is sent a small amount of MON (e.g. 5 MON)
- Then (much later) in transaction 2, someone both deploys a smart contract wallet at account
X and sends MON out of that smart contract.
- Previously, transaction 2’s execution would treat account X as an EOA and apply reserve
balance checks on it, thus reverting the transaction because it would be a dipping
transaction that was not pre-authorized by consensus.
- After this change, account X will be treated as a smart contract account and
will be omitted from reserve balance checks.
- Note that smart contract addresses are deterministic, making it effectively impossible for
an address that receives a code deployment to also be an EOA (i.e. to correspond to a
private key).
- Ref: monad PR #1916,
monad PR #1917
- [EVM] Reduce pagination on staking precompile inverse mappings from 100 to 50
- Applies to
precompile_get_delegations() and precompile_get_delegators()
- Ref: monad PR #1920
Notable deployment changes
- [SDK] Execution events no longer require a special “preview” release to enable all EVM notifications (there are no more
--exec-events special versions)
- [SDK] Fix race condition in event ring create
Notable robustness changes
- [RPC] Fix
eth_feeHistory
- [Consensus] Update transaction classification logic to apply emptying before delegation
- [Execution] Failsafe sanity checks for reward system transactions
- [RPC] Check reserve balance in
eth_call
- Prevent simulated transactions from violating reserve balance
- Call
revert_transaction in eth_call implementation
- Ref: monad PR #1912
- [Node ops] Fix remotely fetched
forkpoint.toml write format
- Ensures forkpoint files are written in the correct format when fetched from remote sources
- Ref: monad-bft PR #2554
- [Node ops] Fix
monad-keystore key corruption issue
to_bls and to_secp now consume secret to prevent corrupted keystore files
- Add tests for command line keystore app to verify all flags combinations work correctly
- Ref: monad-bft PR #2553
- [Execution] Fix bad write offset in
storage_pool try_trim_contents() when bytes to start TRIM is not a multiple of disk page size
- [RPC] Use txpool bridge channel size for ratelimiting
- Prevents
try_send method from failing by using channel capacity for eth_sendRawTransaction ratelimiting
- Ref: monad-bft PR #2506
- [Consensus] Improve RaptorCast message validation
- Add sanity check for
chunk_id range in message parsing
- Reject overflowing
merkle_leaf_idx in merkle proof construction
- Update calculation of
encoded_symbol_capacity in decoder
- Ref: monad-bft PR #2541
- [Consensus] Improve RaptorCast group invite response checks
- Add sanity check to prevent processing group invite accept after reject from same full node
- Ref: monad-bft PR #2574
- [Consensus] Update txpool insertion policy - make balance check stricter
- [Consensus] Add dataplane warnings when priority queues are overrun
- Sets total priority queue capacity to 100MB per priority queue (200MB total max)
- Messages will be dropped with warnings logged if capacity is exceeded
- Ref: monad-bft PR #2559
- [Execution / Node ops] Remove read-only database
io_uring SQ poll thread
- IMPORTANT: Operators with
monad-execution systemctl overrides should make the appropriate changes to eliminate the --ro_sq_thread_cpu parameter as demonstrated in monad-bft PR #2558. Overrides are commonly set when running an RPC or archive node with --trace_calls enabled.
- Reduces thread contention during statesync, improving block execution performance
- Make
ro_sq_thread_cpu argument optional, remove from default configuration
- Ref: monad PR #1911, monad-bft PR #2558
- [RPC] Move recover authority logic inside submitted lambda for
eth_call
- Avoid blocking on fiber promises when called from rust thread, preventing performance issues
- Replace parallelization with single call to
recover_authority() since eth_call transactions have single authority
- Ref: monad PR #1827
- [Execution] Remove
iopoll support
Notable internal changes
- [Node ops] Add
monad-version crate for git version info in binaries
- [Node ops] Add CLI argument for number of fibers in trace transaction execution pool (default: 100)
- [Node ops] Update block reward for mainnet
- [Node ops] Add block writer binary for testing and debugging
- [Node ops] Make cruft timer retention configurable
- Add environment variable support for artifact retention times (override in
/home/monad/.env)
- Ref: monad-bft PR #2548
- [Node ops] Add warning when restoring from snapshot (hard reset) is required
- Prompt node operator when local tip is behind by
STATESYNC_BLOCK_THRESHOLD
- Ref: monad-bft PR #2581
- [Node ops] Update
monad-cruft permissions to monad user
- [Node ops] Fix txpool metrics recording for transaction replacements
- [RPC] Operator can configure RPC worker threads
- [Archive] Add TOML config file support instead of CLI-only configuration
- Enables
monad-archiver binary to use --config flag for configuration
- CLI arguments continue to work and take precedence over config file values
- Ref: monad-bft PR #2570
- [Node ops] Add random mutations to
txgen for improved testing
- [Node ops] Add reserve balance coherency tests
- [SDK] Record execution events
- [SDK] Explicitly clear flow info that doesn’t apply to certain event types
- Prevents poorly written event clients from reading invalid data
- Ref: monad PR #1919
- [Execution] Improve assertion messages with
MONAD_ASSERT_PRINTF
- [Node ops] Add statesync server metrics
- Add
SyncDone metric to track successes and failures
- Add request timing metric for statesync server
- Ref: monad-bft PR #2555
- [Node ops] Disambiguate triedb error logs
- [Node ops] Update devnet chain configs
- Shorten default devnet epoch length from 50,000 blocks to 10,000 blocks and epoch start delay from 5,000 rounds to 1,000 rounds
- Ref: monad-bft PR #2578
- [Node ops] Update test infrastructure
- Switch
test_state and precompiles_test tests to TraitsTest
- Add
runloop_monad_ethblocks to CLI for Monad EVM block replay
- Ref: monad PR #1905, monad PR #1894
- [Execution] Remove unused cross-thread pipe messaging infrastructure
- [Node ops] Keep manytrace agent alive in node state
- [Node ops] Update keystore documentation
- [Node ops] Add more logging for block validation errors
- [Node ops] Log round leader when processing certificates
v0.12.1
| Network | Date released | Comment |
|---|
testnet | 2025-11-12 | |
devnet | 2025-11-12 | |
Tags or hashes:
Notable RPC/SDK changes
- [RPC] Support for prestate and statediff tracing for the following RPC endpoints:
- [RPC] New endpoint
eth_createAccessList
- [RPC] Fix serialization for
to address in historical traces
- [RPC] Remove artificial block height floor for
eth_call and RPC queries
- Previously limited queries using
latest and safe block tags to finalized + 1, now uses actual latest voted block
- Ref: monad-bft PR #2148
- [RPC] Fix RPC errors when requesting traces for call frames that include a self-destructing transaction
- [RPC] Fix inconsistent results being reported when using state overrides in RPC calls
- [RPC] Fix for a possible denial-of-service attack on RPC nodes by overriding balances in the staking contract
Notable robustness changes
- [Node ops/Consensus] Validators limit statesync service to validators and whitelisted full nodes
- [Consensus] More intelligent txpool eviction logic
- [Consensus] Start vote pacing timer on startup
- [Consensus] Fix historical logs
selfdestruct issue
- [Consensus] Graceful handling of gas limit check
- [Consensus] Remove 0-stake validator support
- Support for 0-stake validators in the validator set was used as a workaround for lack of full-node support in the past and should no longer be supported
- Ref: monad-bft PR #2545
- [Consensus] Bias statesync requests to responsive peers
- Support dynamic peer expansion/contraction
- Nodes no longer panic if all peers are pruned (e.g., not whitelisted by any init peers)
- Ref: monad-bft PR #2536
- [Consensus] Drop blocksync requests that hit disk after cache hydration (~7min after startup)
- [Consensus] Dataplane: replace interval with sleep
- [Execution] Replace data structures in
VersionStack code to improve performance when pushing and popping EVM call frames.
Notable internal changes
- [Node ops] Try fetching remote
forkpoint.toml and validators.toml on startup
- IMPORTANT: Nodes now automatically attempt to download configuration files from remote locations on startup, no “Soft Reset” required. This remote fetch is subject to a configurable remote threshold
- The following env variables must be set to enable this behavior:
REMOTE_FORKPOINT_URL
REMOTE_VALIDATORS_URL
- Ref: monad-bft PR #2484, monad-bft PR #2534
- [Node ops] Serialize forkpoints in both TOML and RLP formats, with RLP as source of truth; cleanup
get_latest_config branches
- [Node ops/Consensus] Dynamically expand statesync upstream peers
- Always initializes to
statesync.init_peers (no longer defaults to bootstrap peers)
- If
expand_to_group is enabled, expands to validator set (for validators) and/or secondary raptorcast peers (for public / prioritized full nodes)
- Ref: monad-bft PR #2535
- [Node ops/Consensus] Full nodes no longer default to blocksync from validator set
- Dedicated full nodes must specify upstream as blocksync override
- IMPORTANT: prioritized/public full nodes can only blocksync after joining secondary raptorcast group.
refresh_period and invite_lookahead recommended to be lowered to 20 seconds
- Ref: monad-bft PR #2532
- [Consensus] Use epoch field to encode round number for secondary raptorcast
- Fixes issue where syncing full nodes receive unsolicited chunks from expired groups
- Ref: monad-bft PR #2442
- [Consensus] Add statesync server pending requests metric (better load visibility)
- [Node ops] Import
monad-execution API changes
v0.12.0
| Network | Date released | Comment |
|---|
testnet | 2025-11-05 | Revision is set to MONAD_SEVEN at 2025-11-05 14:30 GMT |
devnet | 2025-11-03 | Devnet was reset with this new release, with revision set to MONAD_SEVEN |
Tags or hashes:
Notable protocol changes
- [EVM/Network params] Opcode/precompile repricing
- Opcode pricing: increase cost of cold storage access
- Precompile pricing: better align a few underpriced precompile gas costs with the associated hardware / latency costs
- Ref: monad PR #1600 (for most of the repricings) and monad PR #1700 (for
CREATE/CREATE2 repricing), monad PR #1830 (for reduced v2 scope), monad PR #1871 (activation for MONAD_SEVEN)
- Gated by
MONAD_SEVEN revision
- [Consensus/Network params] [Staking] Increase
BLOCK_REWARD_MON from 1 MON to 25 MON
- Note that this is not gated by
MONAD_SEVEN (execution hard fork) but by a specific epoch start for testnet
- Ref: monad-bft PR #2511
Notable robustness changes
- [Consensus] Consensus message prioritization in dataplane
- Priority queues for UDP traffic ensure consensus messages are delivered before other traffic
- All consensus messages to validators are published and rebroadcast with high priority
- Ref: monad-bft PR #2352,
monad-bft PR #2354
- [Consensus] DoS protection: Reject repeated invalid consensus messages
- Prevents malicious validators from consuming CPU time by repeatedly sending invalid BLS signatures
- Ref: monad-bft PR #2445
- [Consensus] Leader synchronization improvements
- Forward AdvanceRound messages to current leader to prevent stale views due to message censorship
- Ref: monad-bft PR #2485
- [Consensus] Validate group message sender authenticity
Notable RPC/SDK changes
- [RPC] Fix
eth_syncing serialization
- [RPC] Update
debug_getRawReceipts RLP encoding
- [RPC] Failed contract creation should return null to address
- [Consensus] Dataplane: io_uring batching for UDP sends
- Replace GSO with io_uring batching to preserve 64KB burst size while splitting payload
- Batches multiple UDP sends into single io_uring submission
- Ref: monad-bft PR #2317
- [Consensus] Dataplane: Restore full 1500 byte MTU
- [Consensus] RaptorCast: Modular packet assembly and round-robin ordering
- [Consensus] Txpool optimizations
- [Archive] Move indexer read-back to async task
- [RPC] Remove unnecessary lock in request submission path
Notable internal changes
- [Node ops] Docker support for local Monad installation
- [Node ops] ledger-tail: New CLI configuration options
- Supports custom paths for ledger, forkpoint, node config, and validators files
- Fixes default
validators.toml path
- Ref: monad-bft PR #2439
- [Node ops] wal2json: Multi-file support with timestamp filtering
- Fast timestamp seeking/filtering across multiple files (e.g.,
wal2json -a"3:30pm EDT" -b"4:00pm EDT" wal*)
- Improved performance with parallel processing and reduced locking
- Ref: monad-bft PR #2496,
monad-bft PR #2493
v0.11.6-tn1
Revisions MONAD_FIVE and
MONAD_SIX introduced.
Revision MONAD_NEXT re-defined.
| Network | Date released | Comment |
|---|
testnet | 2025-10-31 | Revision is set to MONAD_SIX at 2025-10-31 13:30 GMT |
devnet | 2025-10-30 | Devnet was reset with this new release, with revision set to MONAD_NEXT |
Tags or hashes for testnet deployment (no protocol differences):
Notable protocol changes - MONAD_NEXT
- [EVM/Network params] Opcode Repricing
- Ref: monad PR #1600 (for most of the
repricings) and monad PR #1700 (for
on storage slot deletion via
SSTORE
- Raise the cost of
CREATE and CREATE2
- Note that this reduces the set of opcode pricings on
MONAD_NEXT relative to v0.11.3.
Notable protocol changes - MONAD_SIX
Notable protocol changes - MONAD_FIVE
- [Consensus/EVM] [Staking] Lower
ACTIVE_VALIDATOR_STAKE from 25,000,000 MON to 10,000,000 MON
- [EVM] [Staking] Add
getProposerValId() method to return the val_id of the most recent block proposer
Notable RPC/SDK changes
- [RPC] Fix race condition in block number queries
- Return triedb block number in ChainState to prevent errors when
eth_getBlockNumber returns blocks not yet available in triedb
- Fixes common wallet workflow issue with sequential
eth_getBlockNumber and eth_getBalance calls
- Ref: monad-bft PR #2393
- [SDK] Add call frame recording to execution events
- Ref: monad PR #1541
- These will not be recorded unless the
--trace_calls command line argument is passed to execution
- [RPC] Add
monad_eth_call_executor_get_state() API for better visibility into eth_call requests
- Ref: monad PR #1764
- Returns counts of currently executing/queued requests and error counts
Notable robustness changes
- [Consensus] Deterministic timeout certificate tiebreaking
- When TC contains multiple tips with the same round, tiebreak by tip.qc for consistency
- Ref: monad-bft PR #2460
- [Consensus] Transaction nonce overflow validation
- [Consensus] More consistent checks on
EpochChange between block proposer and validator
- [EVM] Use komihash in StateDelta maps
- [EVM] JIT compiler: only emit jump table for contracts with indirect jumps
- [RPC] Improve eth call concurrency with atomic sequence numbers
Notable internal changes
- [Node ops] Fuzzer refactor (
--focus flag addition)
- [Node ops] Build images with debug symbols
v0.11.3-tn1
Revisions MONAD_FOUR and
MONAD_NEXT introduced.
| Network | Date released | Comment |
|---|
testnet | 2025-10-13 | Revision is set to MONAD_FOUR at 2025-10-14 13:30 GMT |
devnet | 2025-10-08 | Revision is set to MONAD_NEXT upon upgrade |
Tags or hashes for testnet deployment (no protocol differences):
Notable protocol changes - MONAD_NEXT
- [EVM/Network params] Opcode Repricing)
- Ref: monad PR #1600 (for most of the
repricings) and monad PR #1700 (for
CREATE/CREATE2 repricing)
- Opcodes are repriced as discussed in the
Monad Initial Spec Proposal
- Increase cost of cold storage access
- Precompiles: better align a few underpriced precompile gas costs with the associated
hardware / latency costs
- Note: this release also includes a few opcode repricings in MISP v1.0.2 which were later removed:
- Increase cost of storage slot creation via
SSTORE, and increase the percent of gas refunded
on storage slot deletion via SSTORE
- Raise the cost of
CREATE and CREATE2
- [EVM] Disable CREATE and CREATE2 when executing delegated code
Notable protocol changes - MONAD_FOUR
- [Consensus/EVM] Staking is live
- (many PRs; see
staking)
- Active validator set is now determined by on-chain state of the staking precompile
- This takes effect starting from a designated
staking_activation epoch
- Note: staking rewards do not activate until
staking_rewards_activation epoch
(future point in time)
- External rewards - enable external (non-block-reward) deposits to the validator pool, see
monad PR #1625
- Also added additional events to staking precompile in monad PR #1742
- Adds
ValidatorRewarded, EpochChanged, ClaimRewards events
- [Consensus/EVM] Reserve balance logic is live
- Ref: monad-bft PR #2160 and
monad PR #1537
- Due to async execution, consensus does not have the latest state available for transaction
inclusion logic. Reserve balance is a buffer that enables simpler accounting for a given
account to mitigate the possibility of overspending in that delay window.
- Per-EOA reserve balance is set to
10 MON
- [Consensus/EVM] EIP-7702 is live
- [Network params] Set per-transaction gas limit of 30M gas
- [Network params] Increase block gas limit from 150M gas (375 Mgas/s) to 200M gas
(500 Mgas/s)
- [Network params] Implement dynamic base fee
- [EVM] Enable EIP-2935 + blockhash
buffer
- [EVM] Enable EIP-7951 (P256VERIFY
precompile support)
- [EVM] Enable EIP-2537 (BLS12-381 precompiles)
- [EVM] Raise max contract size for
CREATE/CREATE2 to 128 kb
- Ref: monad PR #1440
- This brings
CREATE/CREATE2 to parity with toplevel contract creation transactions, which
had their limit raised in MONAD_TWO.
- Previously, they were unintentionally limited to Ethereum’s max initcode size (49.152 kb)
due to a bug
Notable RPC/SDK changes
- [SDK] Added support for Execution Events
- [RPC] Extend
eth_call support for preStateTracer and stateDiffTracer with debug_traceCall
- [RPC] Support the
withLog parameter with callTracer
- Ref: monad-bft PR #2400
- If
withLog is set to true, callTracer includes event logs in the trace output
- [EVM] Kernel caching of db reads and writes
- Ref: monad PR #1559
- Utilize available host memory to cache recent DB operations - this cache
should increase performance of execution and RPC
- [RPC] Improve RPC Db Node Cache and make it memory bounded
- Ref: monad PR #1581
- Note a rename of RPC cli flags:
--eth-call-executor-node-lru-size to
--eth-call-executor-node-lru-max-mem and a new flag --triedb-node-lru-max-mem with
both default to 100MB.
Notable internal changes
- [Node ops] Remove
bft-fullnode binary; only bft binary now
- [Node ops] PeerDiscovery: Introduce precheck for peer self name address
- [Consensus] Blocksync: only select blocksync peers from connected nodes
- [Consensus] Raptorcast: DOS protection on decoding state cache
- [Node ops] Secondary raptorcast config change
- Ref: monad-bft PR #2378
- Replace ambiguous secondary raptorcast
mode parameter with enable_publisher and enable_client
- [Node ops] Dynamically reload prioritized full-nodes
- [Node ops] Fix wal2json
- [Node ops/RPC] Support the RPC CLI param
ws-sub-per-conn-limit
- Ref: monad-bft PR #2161
- Sets the maximum number of websocket subscriptions per connection (default to 100)
- [Node ops/RPC] Add configuration options for high eth-call pool
v0.11.1
Note: v0.11.1 was a version that was deployed only on testnet-2 (a temporary network deprecated
on 2025-10-27) from roughly 2025-09-16 until 2025-10-08; however, it maps some features differently
to revision MONAD_FOUR which are no longer memorialized in the codebase. testnet-2 was reset
before deploying v0.11.3.
For all intents and purposes, this version can be ignored. This changelog will compare v0.11.3
with v0.10.4.
Tags or hashes:
v0.10.4
| Network | Date deployed | Comment |
|---|
testnet | 2025-08-18 | Revision is still MONAD_THREE |
Tags or hashes:
Notable RPC/SDK changes
- [RPC] EIP-4844 related fields in RPC responses are removed.
- Block headers returned from RPC will no longer have
blobGasUsed , excessBlobGas, and
parentBeaconBlockRoot.
- [Consensus] Votes are now sent to current round leader. This is a consensus optimization that
reduces the effective delay due to a round timeout
- [Consensus] Caching of recently-verified quorum certificates
- [Node ops] Enablement of trace calls is now controlled via
monad (execution) command line
arg --trace_calls.
- To preserve legacy behavior,
--trace_calls is currently enabled in the debian package. In the
future we recommend disabling for validators and enabling it for RPC and archive nodes.
- This allows voting validators to opt out of computing traces since they’re only need for
RPC nodes.
Notable internal changes
- [Consensus] TC forwarding to prioritized and public (non-dedicated) full nodes
- Ref: monad-bft PR #2149
- Prior to
v0.10.4, all full nodes were subject to lagging behind validators in the event of a
timeout because round advancement due to TC was not forwarded (and still isn’t to dedicated full
nodes).
- As a result, after timeouts, full nodes would frequently forward transactions to the
next three leaders relative to a stale state. This results in those transactions often missing
and the ensuing blocks being comparatively empty.
- [Node ops] Bugfix for secondary raptorcast (round gap crash) that affected validators in
Publisher mode
- [Node ops]
ledger-tail improvements
- Reduced memory usage on startup
author_dns field changed to author_address to reflect change in v10 addresses
- Timeouts and finalizations are tracked and logged
- [Consensus] Txpool account preloading bugfix
v0.10.3
MONAD_THREE revision introduced.
| Network | Date deployed | Comment |
|---|
testnet | 2025-08-12 | Revision is set to MONAD_THREE when upgraded |
Notable protocol changes - MONAD_THREE
- [Consensus] Consensus mechanism upgraded from Fast-HotStuff
to MonadBFT
- [Network params] Block time reduced from 500 ms to 400 ms
Notable RPC/SDK changes
- [RPC] Add support for real-time data via
WebSocket and shared memory queue access (docs coming soon):
- Geth real-time events (via WebSocket)
- Geth real-time events with Monad extensions (via WebSocket)
- Real-time data via shared memory queue, for programs on a full node host using the execution event SDK
- [Execution] Switch to JIT EVM. The bytecode of expensive or frequently-executed contracts is
compiled directly to native code for faster execution
- [Execution] Switch to using file pointer-based IPC to execute blocks. Previously, the client
was using a write-ahead log (WAL), which did not take advantage of available consensus
information and could result in avoidable execution
Notable internal changes
- [Node ops] Adds peer discovery
- [Node ops] Adds full node RaptorCast, making the full
node network scalable
v0.9.3
| Network | Date deployed | Comment |
|---|
testnet | 2025-05-29 | Revision is still MONAD_TWO |
Notable RPC/SDK changes
- [RPC]
eth_call and eth_estimateGas limits
- RPC providers can now set individual per-transaction limits on maximum gas for
eth_call and
eth_estimateGas
- Previously the limit would always be the block gas limit (150M), now the RPC provider may
choose (default: 30M)
- Controlled with
--eth-call-provider-gas-limit and --eth-estimate-gas-provider-gas-limit
- Add a maximum timeout for queueing when executing
eth_call and eth_estimateGas
- Controlled with
--eth_call_executor_queuing_timeout
- [RPC] Improve overall
eth_call performance by maintaining separate queues for cheap and
expensive eth_call operations, so that cheap eth_call operations will not be queued behind expensive ones.
- This adds two new RPC error strings:
failure to submit eth_call to thread pool: queue size exceeded
failure to execute eth_call: queuing time exceeded timeout threshold
- [RPC] Added an archive index for
eth_getLogs to support queries with address and/or topic
filters
- This enables larger block ranges to be queried efficiently, with work proportional to number
of matching logs instead of number of blocks in range
- [Execution] Better bounding of TrieDB traversals
Notable internal changes
- [Node ops] Performance improvements for slow statesync client upsert
- [Node ops] Bugfix for execution delay and abrupt history length drops caused by premature
soft reset
- [Node ops]
keystore QOL improvements
- Support for importing from a private key in hex string format (previously required conversion
to json file)
- More helpful documentation via
--help command
testnet-1 active set expansion
On 2025-05-02, testnet-1 experienced an active set expansion
Notable internal changes
- [Network params] Testnet validator set expanded from 72 to 99 nodes
v0.9.2
| Network | Date deployed | Comment |
|---|
testnet | 2025-04-05 | Revision is still MONAD_TWO |
- [RPC] Update to the
eth_call execution implementation - uses fewer threads to achieve the
same concurrency as in v0.9.1
Notable internal changes
- [Node ops] Support for a faster statesync mechanism
- [RPC] RPC no longer accepts requests while node is statesyncing
- [Node ops] Some reliability and efficiency improvements to how statesync traffic is carried
between nodes
- [Node ops] Bugfixes for execution crashes (
monad::mpt::deserialize_node_from_buffer,
'Resource temporarily unavailable)
- [Node ops] Bug fix for unbounded blocksync requests that result in node OOM failures
- [Node ops] Removal of DNS resolution panic on start up
v0.9.1
| Network | Date deployed | Comment |
|---|
testnet | 2025-03-24 | Revision is set to MONAD_TWO |
Notable internal changes
- [Node ops] Bugfix for blocksync errors
- [Node ops] Reliability and efficiency improvements to statesync
v0.9.0
Revision MONAD_TWO introduced.
| Network | Date deployed | Comment |
|---|
testnet | 2025-03-14 | Revision is set to MONAD_TWO at 2025-03-14 19:00 GMT |
Notable protocol changes - MONAD_TWO
- [EVM] Max contract size increased from 24kb to 128kb
Notable RPC/SDK changes
- [RPC]
debug_traceTransaction fixes
- Fixed a bug where, within one transaction, only the first 100 calls were being traced
- Added
error and revertReason fields to response data
- [Consensus] Dataplane v2 - simpler and more efficient implementation; small performance
improvement in broadcast time
- [RPC] Improvements to RPC performance for
eth_call
- [RPC] Removed redundant sender_recovery operation on raw transactions received via RPC
Notable internal changes
- [Node ops] Statesync improvements to mitigate negative performance effects on upstream
validator nodes
- [RPC] EIP-2 signature validation added to RPC transaction validation
- [Node ops] Miscellaneous tracing, logging and metrics additions
- [Consensus] RaptorCast performance improvement when dealing with invalid symbols
v0.8.1
Revision MONAD_ONE introduced.
| Network | Date deployed | Comment |
|---|
testnet | 2025-02-14 | Revision is set to MONAD_ONE at 2025-02-14 19:00 GMT |
Notable protocol changes - MONAD_ONE
-
[Network params] Block time reduced from 1s to 500 ms
-
[Network params] Block gas limit reduced from 300M to 150M (to keep gas limit consistent)
-
[EVM] Transactions are charged based on gas limit,
not gas consumed
Notable RPC/SDK changes
- [RPC] UX improvements for transaction status. RPC
nodes track status of transactions submitted to them in order to provide updates to users.