Proposed state in Monad’s consensus lifecycle — typically about one second earlier than standard eth_subscribe("newHeads"), which currently fires at the Voted state. Each notification includes two Monad-specific fields, blockId and commitState, that let you follow a block through every stage of its lifecycle: Proposed → Voted → Finalized → Verified.
Monad’s real-time data behavior, including the commit state at which standard
newHeads fires, is still evolving. For the authoritative spec, see the Monad WebSocket guide and block states documentation.Get your own node endpoint today
Start for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.Parameters
string— the subscription type,monadNewHeadsin this case.
Response
subscription— the subscription ID.
blockId— a 32-byte identifier unique to this specific block proposal. A proposal with the samenumberbut a differentblockIdis a different proposal. Use this to deduplicate per-proposal when the same block number is emitted multiple times as itscommitStateadvances.commitState— the current state of the block in Monad’s commit lifecycle. One ofProposed,Voted,Finalized, orVerified.
number— the block number, encoded as hexadecimal.hash— the block hash.parentHash— hash of the previous block.sha3Uncles— hash of the list of uncles included in the block. Always0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347on Monad.logsBloom— the bloom filter for the logs of the block.transactionsRoot— the root of the transaction trie of the block.stateRoot— the root of the final state trie of the block.receiptsRoot— the root of the receipts trie of the block.miner— the address of the block proposer.difficulty— always0x0on Monad (proof-of-stake-based consensus).totalDifficulty— always0x0on Monad.extraData— arbitrary data field set by the proposer.size— the size of this block in bytes, encoded as hexadecimal.gasLimit— the maximum gas allowed in this block, encoded as hexadecimal.gasUsed— the total gas used by all transactions in this block, encoded as hexadecimal.timestamp— the Unix timestamp for when the block was proposed, encoded as hexadecimal.mixHash— the previous RANDAO value.nonce— always0x0000000000000000on Monad.baseFeePerGas— EIP-1559 base fee per gas, encoded as hexadecimal.withdrawalsRoot— Merkle root of withdrawals.blobGasUsed— cumulative blob gas used, EIP-4844.excessBlobGas— excess blob gas.parentBeaconBlockRoot— parent beacon block root.requestsHash— EIP-7685 execution requests hash.
The same block number will appear multiple times as its
commitState advances — typically once each for Proposed, Voted, Finalized, and Verified. Blocks may also skip intermediate states and go directly to Finalized when consensus outpaces execution. Failed proposals are abandoned implicitly — there is no explicit failure notification.Deduplicate by blockId if you need one event per unique proposal, or by the pair (number, commitState) if you care about lifecycle transitions.eth_subscribe("monadNewHeads") code examples
Note that subscriptions require a WebSocket connection and WebSocket cat for you to use this method in the console.Install WebSocket cat with:
npm install -g wscatExample notification
eth_unsubscribe with the returned subscription ID to close the stream.
monadNewHeads vs newHeads
Both subscription types work on Chainstack Monad nodes. Pick based on what you optimize for.
eth_subscribe("newHeads")— fires once per block, at theVotedstate. Closest to the semantics of Ethereum’snewHeads. Use this when you want one event per canonical block and do not need visibility into earlier states.eth_subscribe("monadNewHeads")— fires at every state transition, starting atProposed. Gives you block data roughly one second earlier thannewHeads, plus theblockIdandcommitStatefields. Use this when latency matters or when you need to react to speculative state.
eth_subscribe("logs", {...}) and HTTP polling alternatives — see Monad: Monitoring events and transactions.
Use case
A practical use case foreth_subscribe("monadNewHeads") is any latency-sensitive application that benefits from acting on speculatively-executed block state before it reaches the Voted state:
-
Trading and MEV. Searchers and takers can observe new blocks at the
Proposedstate to trigger off-chain logic roughly one second sooner than they could withnewHeads, while still reconciling against later states (Voted,Finalized) for correctness. -
Pre-confirmation UX. Wallets, explorers, and dashboards can surface “tentative” block data immediately on
Proposed, then upgrade the display as the sameblockIdadvances throughVoted→Finalized, giving users end-to-end visibility into Monad’s commit lifecycle. - Infrastructure and consensus monitoring. Node operators and analytics platforms can track the exact cadence and distribution of block states to detect execution lag, skipped intermediate states, or abandoned proposals in real time.