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.2 [2025-11-18]
Revision: MONAD_EIGHT (upgrade; Wednesday, 2025-11-19 at 14:30 GMT)
Tags or hashes:
monad-bft: tagv0.12.2-rcmonad: tagv0.12.2-rc
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
- This changes the behavior of the following corner case:
- [EVM] Reduce pagination on staking precompile inverse mappings from 100 to 50
- Applies to
precompile_get_delegations()andprecompile_get_delegators() - Ref: monad PR #1920
- Applies to
Notable deployment changes
- [SDK] Execution events no longer require a special "preview" release to enable all EVM notifications (there are no more
--exec-eventsspecial versions) - [SDK] Fix race condition in event ring create
- Ref: monad PR #1914
Notable robustness changes
- [RPC] Fix
eth_feeHistory- Ref: monad-bft PR #2366
- [Consensus] Update transaction classification logic to apply emptying before delegation
- Improves delegation ordering in
try_apply_block_fees - Ref: monad-bft PR #2561
- Improves delegation ordering in
- [RPC] Check reserve balance in
eth_call- Prevent simulated transactions from violating reserve balance
- Call
revert_transactionineth_callimplementation - Ref: monad PR #1912
- [Execution] Failsafe sanity checks for reward system transactions
- Ref: monad PR #1921
- [Node ops] Fix remotely fetched
forkpoint.tomlwrite format- Ensures forkpoint files are written in the correct format when fetched from remote sources
- Ref: monad-bft PR #2554
- [Node ops] Fix
monad-keystorekey corruption issueto_blsandto_secpnow 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_pooltry_trim_contents()when bytes to start TRIM is not a multiple of disk page size- Ref: monad PR #1908
- [RPC] Use txpool bridge channel size for ratelimiting
- Prevents
try_sendmethod from failing by using channel capacity foreth_sendRawTransactionratelimiting - Ref: monad-bft PR #2506
- Prevents
- [Consensus] Improve RaptorCast message validation
- Add sanity check for
chunk_idrange in message parsing - Reject overflowing
merkle_leaf_idxin merkle proof construction - Update calculation of
encoded_symbol_capacityin decoder - Ref: monad-bft PR #2541
- Add sanity check for
- [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
- Ref: monad-bft PR #2575
Notable performance changes
- [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_uringSQ poll thread- IMPORTANT: Operators with
monad-executionsystemctl overrides should make the appropriate changes to eliminate the--ro_sq_thread_cpuparameter as demonstrated in monad-bft PR #2558. Overrides are commonly set when running an RPC or archive node with--trace_callsenabled. - Reduces thread contention during statesync, improving block execution performance
- Make
ro_sq_thread_cpuargument optional, remove from default configuration - Ref: monad PR #1911, monad-bft PR #2558
- IMPORTANT: Operators with
- [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()sinceeth_calltransactions have single authority - Ref: monad PR #1827
- [Execution] Remove
iopollsupport- Ref: monad PR #1910
Notable internal changes
- [Node ops] Add
monad-versioncrate for git version info in binaries- Ref: monad-bft PR #2572
- [Node ops] Add CLI argument for number of fibers in trace transaction execution pool (default: 100)
- Ref: monad-bft PR #2584
- [Node ops] Update block reward for mainnet
- Ref: monad-bft PR #2582
- [Node ops] Add block writer binary for testing and debugging
- Ref: monad-bft PR #2546
- [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
- Add environment variable support for artifact retention times (override in
- [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
- Prompt node operator when local tip is behind by
- [Node ops] Update
monad-cruftpermissions to monad user- Ref: monad-bft PR #2556
- [Node ops] Fix txpool metrics recording for transaction replacements
- Ref: monad-bft PR #2564
- [RPC] Operator can configure RPC worker threads
- Ref: monad-bft PR #2562
- [Archive] Add TOML config file support instead of CLI-only configuration
- Enables
monad-archiverbinary to use--configflag for configuration - CLI arguments continue to work and take precedence over config file values
- Ref: monad-bft PR #2570
- Enables
- [Node ops] Add random mutations to
txgenfor improved testing- Ref: monad-bft PR #2543
- [Node ops] Add reserve balance coherency tests
- Ref: monad-bft PR #2573
- [SDK] Record execution events
- Includes state access and system transactions
- Ref: monad PR #1906, monad PR #1907, monad PR #1913
- [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- Ref: monad PR #1918
- [Node ops] Add statesync server metrics
- Add
SyncDonemetric to track successes and failures - Add request timing metric for statesync server
- Ref: monad-bft PR #2555
- Add
- [Node ops] Disambiguate triedb error logs
- Improve error message clarity by making each log call unique
- Ref: monad-bft PR #2579
- [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_stateandprecompiles_testtests toTraitsTest - Add
runloop_monad_ethblocksto CLI for Monad EVM block replay - Ref: monad PR #1905, monad PR #1894
- Switch
- [Execution] Remove unused cross-thread pipe messaging infrastructure
- Ref: monad PR #1915
- [Node ops] Keep manytrace agent alive in node state
- Ref: monad-bft PR #2583
- [Node ops] Update keystore documentation
- Ref: monad-bft PR #2380
- [Node ops] Add more logging for block validation errors
- Ref: monad-bft PR #2550
- [Node ops] Log round leader when processing certificates
- Ref: monad-bft PR #2580
v0.12.1 [2025-11-12]
Revision: MONAD_SEVEN (unchanged)
Tags or hashes:
monad-bft: tagv0.12.1monad: tagv0.12.1
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.