Testnet Changelog
This is a curated list of only changes affecting testnet.
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.12.1 [2025-11-12]
Revision: MONAD_SEVEN (unchanged)
Tags or hashes:
monad-bft: TBDmonad: tagv0.12.1-rc
Notable RPC/SDK changes
- [RPC] Support for prestate and statediff tracing for the following RPC endpoints:
debug_traceTransactiondebug_traceBlockByNumberdebug_traceBlockByHash- Ref: monad PR #1753, monad-bft PR #2403
- [RPC] New endpoint
eth_createAccessList - [RPC] Fix serialization for
toaddress in historical traces- Follow on to monad-bft PR #2516 implemented in
v0.12.0(in a historical context) - Ref: monad-bft PR #2523, monad PR #1861
- Follow on to monad-bft PR #2516 implemented in
- [RPC] Remove artificial block height floor for
eth_calland RPC queries- Previously limited queries using
latestandsafeblock tags tofinalized + 1, now uses actual latest voted block - Ref: monad-bft PR #2148
- Previously limited queries using
- [RPC] Fix RPC errors when requesting traces for call frames that include a self-destructing transaction
- Ref: monad PR #1887
- [RPC] Fix inconsistent results being reported when using state overrides in RPC calls
- Ref: monad PR #1812
- [RPC] Fix for a possible denial-of-service attack on RPC nodes by overriding balances in the staking contract
- Ref: monad PR #1903
Notable robustness changes
- [Node ops/Consensus] Validators limit statesync service to validators and whitelisted full nodes
- Full nodes service all requests
- Ref: monad-bft PR #2524
- [Consensus] More intelligent txpool eviction logic
- Ref: monad-bft PR #2525
- [Consensus] Start vote pacing timer on startup
- Ref: monad-bft PR #2528
- [Consensus] Fix historical logs
selfdestructissue- Ref: monad-bft PR #2531
- [Consensus] Graceful handling of gas limit check
- Ref: monad-bft PR #2518
- [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
Notable performance changes
- [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)
- Ref: monad-bft PR #2533
- [Consensus] Dataplane: replace interval with sleep
- Ref: monad-bft PR #2517
- [Execution] Replace data structures in
VersionStackcode to improve performance when pushing and popping EVM call frames- Ref: monad PR #1802, monad PR #1877
Notable internal changes
- [Node ops] Try fetching remote
forkpoint.tomlandvalidators.tomlon 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_URLREMOTE_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_configbranches- Ref: monad-bft PR #2521
- [Node ops/Consensus] Dynamically expand statesync upstream peers
- Always initializes to
statesync.init_peers(no longer defaults to bootstrap peers) - If
expand_to_groupis enabled, expands to validator set (for validators) and/or secondary raptorcast peers (for public / prioritized full nodes) - Ref: monad-bft PR #2535
- Always initializes to
- [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_periodandinvite_lookaheadrecommended 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)
- Ref: monad-bft PR #2530
- [Node ops] Import
monad-executionAPI changes- Ref: monad-bft PR #2522
v0.12.0 [2025-11-04]
Revision: MONAD_SEVEN (upgrade; Wednesday, 2025-11-05 at 14:30 GMT)
Tags or hashes:
monad-bft: tagv0.12.0monad: tagv0.12.0
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/CREATE2repricing), monad PR #1830 (for reduced v2 scope), monad PR #1871 (activation forMONAD_SEVEN) - Gated by
MONAD_SEVENrevision
- [Consensus/Network params] [Staking] Increase
BLOCK_REWARD_MONfrom 1 MON to 25 MON- Note that this is not gated by
MONAD_SEVEN(execution hard fork) but by a specific epoch start fortestnet - Ref: monad-bft PR #2511
- Note that this is not gated by
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
- Ref: monad-bft PR #2457
Notable RPC/SDK changes
- [RPC] Fix
eth_syncingserialization- Ref: monad-bft PR #2476
- [RPC] Update
debug_getRawReceiptsRLP encoding- Ref: monad-bft PR #2490
- [RPC] Failed contract creation should return null to address
Notable performance changes
- [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
- Ref: monad-bft PR #2438
- [Consensus] RaptorCast: Modular packet assembly and round-robin ordering
- [Consensus] Txpool optimizations
- Add configurable limits, remove pending pool, refactor last commit state tracking
- Ref: monad-bft PR #2487, monad-bft PR #2363, monad-bft PR #2475
- [Archive] Move indexer read-back to async task
- Ref: monad-bft PR #2486
- [RPC] Remove unnecessary lock in request submission path
- Ref: monad-bft PR #2416
Notable internal changes
- [Node ops] Docker support for local Monad installation
- Optional
--use-prebuiltflag to avoid compilation - Ref: monad-bft PR #2456, monad-bft PR #2489
- Optional
- [Node ops] ledger-tail: New CLI configuration options
- Supports custom paths for ledger, forkpoint, node config, and validators files
- Fixes default
validators.tomlpath - 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
- Fast timestamp seeking/filtering across multiple files (e.g.,
v0.11.6 [2025-10-30]
Revision: MONAD_SIX (upgrade; Friday, 2025-10-31 at 13:30 GMT)
Revision: MONAD_FIVE (upgrade; Tuesday, 2025-10-28 at 13:30 GMT)
Tags or hashes:
monad-bft: tagv0.11.6-tn1monad: tagv0.11.6-tn1
Notable protocol changes - MONAD_SIX
- [EVM] EIP-2935 bugfix
- Ref: monad PR #1846
Notable protocol changes - MONAD_FIVE
- [Consensus/EVM] [Staking] Lower
ACTIVE_VALIDATOR_STAKEfrom 25,000,000 MON to 10,000,000 MON- Ref: monad PR #1810
- [EVM] [Staking] Add
getProposerValId()method to return theval_idof the most recent block proposer- Ref: monad PR #1815
Notable RPC/SDK changes
- [RPC] Fix race condition in block number queries
- Return triedb block number in ChainState to prevent errors when
eth_getBlockNumberreturns blocks not yet available in triedb - Fixes common wallet workflow issue with sequential
eth_getBlockNumberandeth_getBalancecalls - Ref: monad-bft PR #2393
- Return triedb block number in ChainState to prevent errors when
- [SDK] Add call frame recording to execution events
- Ref: monad PR #1541
- These will not be recorded unless the
--trace_callscommand line argument is passed to execution
- [RPC] Add
monad_eth_call_executor_get_state()API for better visibility intoeth_callrequests- 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
- Ref: monad-bft PR #2388
- [Consensus] More consistent checks on
EpochChangebetween block proposer and validator- This addresses an observed chain halt in
testnet-2 - Ref: monad-bft PR #2494
- This addresses an observed chain halt in
Notable performance changes
- [EVM] Use komihash in StateDelta maps
- Ref: monad PR #1786
- [EVM] JIT compiler: only emit jump table for contracts with indirect jumps
- Ref: monad PR #1749
- [RPC] Improve eth call concurrency with atomic sequence numbers
- Ref: monad PR #1759
Notable internal changes
- [Node ops] Fuzzer refactor (
--focusflag addition)- Ref: monad PR #1744
- [Node ops] Build images with debug symbols
- Ref: monad-bft PR #2459
v0.11.3 [2025-10-14]
Revision: MONAD_FOUR (upgrade; takes effect
at 2025-10-14 13:30 GMT)
Tags or hashes:
monad-bft: tagv0.11.3-tn1monad: hash3e17265
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_activationepoch - Note: staking rewards do not activate until
staking_rewards_activationepoch (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,ClaimRewardsevents
- Adds
- [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
- Ref: monad-bft PR #2246
- As discussed in the Monad Initial Spec Proposal
- [Network params] Increase block gas limit from 150M gas (375 Mgas/s) to 200M gas
(500 Mgas/s)
- Ref: monad-bft PR #2266
- [Network params] Implement dynamic base fee
- Ref: monad-bft PR #2207
- As specified in the Monad Initial Spec Proposal
- Target gas is 80% of a block
- Raise minimum base fee from 50 MON-gwei to 100 MON-gwei
- [EVM] Enable EIP-2935 + blockhash
buffer
- Ref: monad PR #1520
- [EVM] Enable EIP-7951 (P256VERIFY
precompile support)
- Ref: monad PR #1518
- [EVM] Enable EIP-2537 (BLS12-381 precompiles)
- Ref: monad-bft PR #1342 and monad-bft PR #1350
- [EVM] Raise max contract size for
CREATE/CREATE2to 128 kb- Ref: monad PR #1440
- This brings
CREATE/CREATE2to parity with toplevel contract creation transactions, which had their limit raised inMONAD_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_callsupport for preStateTracer and stateDiffTracer withdebug_traceCall- Ref: monad-bft PR #2275 and monad PR #1471
- [RPC] Support the
withLogparameter withcallTracer- Ref: monad-bft PR #2400
- If
withLogis set to true,callTracerincludes event logs in the trace output
Notable performance changes
- [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-sizeto--eth-call-executor-node-lru-max-memand a new flag--triedb-node-lru-max-memwith both default to 100MB.
Notable internal changes
- [Node ops] Remove
bft-fullnodebinary; onlybftbinary now- Ref: monad-bft PR #2072
bft-fullnoderemoved fromdebpkg forv0.11
- [Node ops] PeerDiscovery: Introduce precheck for peer self name address
- [Consensus] Blocksync: only select blocksync peers from connected nodes
- Ref: monad-bft PR #2401
- [Consensus] Raptorcast: DOS protection on decoding state cache
- Ref: monad-bft PR #2092
- [Node ops] Secondary raptorcast config change
- Ref: monad-bft PR #2378
- Replace ambiguous secondary raptorcast
modeparameter withenable_publisherandenable_client
- [Node ops] Dynamically reload prioritized full-nodes
- Ref: monad-bft PR #2364
- [Node ops] Fix wal2json
- Ref: monad-bft PR #2404
- [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
- Ref: monad-bft PR #2387
v0.10.4 [2025-08-18]
Revision: MONAD_THREE (unchanged)
Tags or hashes:
monad-bft: tagv0.10.4monad: hash39c42e6
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, andparentBeaconBlockRoot.
- Block headers returned from RPC will no longer have
Notable performance changes
- [Consensus] Votes are now sent to current round leader. This is a consensus optimization that
reduces the effective delay due to a round timeout
- Ref: monad-bft PR #2093
- [Consensus] Caching of recently-verified quorum certificates
- Ref: monad-bft PR #2167
- [Node ops] Enablement of trace calls is now controlled via
monad(execution) command line arg--trace_calls.- To preserve legacy behavior,
--trace_callsis 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 needed for RPC nodes.
- To preserve legacy behavior,
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
- Ref: monad-bft PR #2090
- [Node ops]
ledger-tailimprovements- Ref: monad-bft PR #2144
- Reduced memory usage on startup
author_dnsfield changed toauthor_addressto reflect change in v10 addresses- Timeouts and finalizations are tracked and logged
- [Consensus] Txpool account preloading bugfix
- Ref: monad-bft PR #2108
v0.10.3 [2025-08-12]
Revision: MONAD_THREE (upgrade; takes
effect immediately - not time-gated)
Notable protocol changes - MONAD_THREE
- [Consensus] Consensus mechanism upgraded from Fast-HotStuff to MonadBFT. This is a major upgrade that adds (i) resilience to tail forking and (ii) 1-slot speculative finality
- [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
Notable performance changes
- [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 [2025-05-29]
Revision: MONAD_TWO (unchanged)
Notable RPC/SDK changes
- [RPC]
eth_callandeth_estimateGaslimits- RPC providers can now set individual per-transaction limits on maximum gas for
eth_callandeth_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-limitand--eth-estimate-gas-provider-gas-limit
- Add a maximum timeout for queueing when executing
eth_callandeth_estimateGas- Controlled with
--eth_call_executor_queuing_timeout
- Controlled with
- RPC providers can now set individual per-transaction limits on maximum gas for
Notable performance changes
- [RPC] Improve overall
eth_callperformance by maintaining separate queues for cheap and expensiveeth_calloperations, so that cheapeth_calloperations will not be queued behind expensive ones.- This adds two new RPC error strings:
failure to submit eth_call to thread pool: queue size exceededfailure to execute eth_call: queuing time exceeded timeout threshold
- This adds two new RPC error strings:
- [RPC] Added an archive index for
eth_getLogsto 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]
keystoreQOL improvements- Support for importing from a private key in hex string format (previously required conversion to json file)
- More helpful documentation via
--helpcommand
testnet-1 active set expansion [2025-05-02]
Notable internal changes
- [Network params] Testnet validator set expanded from 72 to 99 nodes
v0.9.2 [2025-04-05]
Revision: MONAD_TWO (unchanged)
Notable performance changes
- [RPC] Update to the
eth_callexecution implementation - uses fewer threads to achieve the same concurrency as inv0.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 [2025-03-24]
Revision: MONAD_TWO (unchanged)
Notable internal changes
- [Node ops] Bugfix for blocksync errors
- [Node ops] Reliability and efficiency improvements to statesync
v0.9.0 [2025-03-14]
Revision: MONAD_TWO (upgrade; takes effect
at 2025-03-14 at 19:00 GMT)
Notable protocol changes - MONAD_TWO
- [EVM] Max contract size increased from 24kb to 128kb
Notable RPC/SDK changes
- [RPC]
debug_traceTransactionfixes- Fixed a bug where, within one transaction, only the first 100 calls were being traced
- Added
errorandrevertReasonfields to response data
Notable performance changes
- [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 [2025-02-14]
Revision: MONAD_ONE (upgrade; takes effect
at 2025-02-14 at 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.