Skip to main content

Testnet Changelog

This is a curated list of only changes affecting testnet.

note

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:

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
  • [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
  • [Execution] Failsafe sanity checks for reward system transactions
  • [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

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_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 [2025-11-12]

Revision: MONAD_SEVEN (unchanged)

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

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)
  • [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 [2025-11-04]

Revision: MONAD_SEVEN (upgrade; Wednesday, 2025-11-05 at 14:30 GMT)

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

Notable performance changes

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 [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:

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

Notable performance changes

  • [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

v0.11.3 [2025-10-14]

Revision: MONAD_FOUR (upgrade; takes effect at 2025-10-14 13:30 GMT)

Tags or hashes:

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

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-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.10.4 [2025-08-18]

Revision: MONAD_THREE (unchanged)

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.

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
  • [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 needed 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 [2025-08-12]

Revision: MONAD_THREE (upgrade; takes effect immediately - not time-gated)

Notable protocol changes - MONAD_THREE

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_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

Notable performance changes

  • [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 [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_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 [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

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

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.