MultiversX MultiversX | Supernova for builders

Supernova for builders

Mainnet activation: 10 September 2026. The exact time comes with the release announcement on 1 September.

Schedule

NetworkBlock time nowSupernova
Testnet600msRunning
Devnet600msRunning. Crossed at round 15539530, 20 August 14:46:20 UTC
Mainnet6sNodes 1 September, activation 10 September

Devnet activation, D2.0.4.0

ItemValue
Epoch 6439 opens20 August, 14:26:20 UTC
Activation round 1553953020 August, 14:46:20 UTC
Round duration6000ms to 600ms, at the round
Rounds per epoch2400 to 24000
Epoch length4 hours, unchanged
Node actionUpgrade to D2.0.4.0
Compatible servicesproxy v1.5.1, notifier v1.4.2, indexer v1.10.3
Release notesmx-chain-devnet-config D2.0.4.0

The clock changes at the round, not at the epoch, and the gateway will tell you otherwise. network/config returned erd_round_duration 600 from the epoch boundary at 14:26:20, twenty minutes before block production actually changed at 14:46:20. For those twenty minutes the config declared the new clock while the chain was still producing 6 second blocks. Gate on the round, or measure the interval between consecutive blocks. The declared duration is a promise; the round is the event.

Epoch arithmetic

NetworkBeforeAfterEpoch length
Testnet1200 rounds of 6000ms12000 rounds of 600ms2 hours, unchanged
Devnet2400 rounds of 6000ms24000 rounds of 600ms4 hours, unchanged
Mainnet14400 rounds of 6000ms144000 rounds of 600ms24 hours, unchanged

Mainnet activation epoch is 2233. Missed rounds push the boundary later by minutes. The epoch stays 24 hours, matching testnet and devnet, which both kept their length across the change. The activation epoch itself runs about 20 minutes long. It opens on the old clock, so the rounds before the activation round still take 6 seconds each, and the epoch absorbs the difference. Every epoch after it is 24 hours.

What changes

SurfaceChangeAction
get_block_timestamp()
get_block_timestamp_seconds()
None. Still seconds.None
Timestamp uniqueness One second can span several blocks Move time logic to get_block_timestamp_millis()
Raw block header field Seconds becomes milliseconds at the Supernova epoch Factor of 1000 in custom indexers and header parsers
/blocks and the public API None. Seconds on every network.None
TransactionWatcher defaults
600ms poll, 9s timeout
Tuned to the new clock Pass timeoutMilliseconds when awaiting on mainnet before activation

Why the seconds API is safe

GetBlockTimestamp and GetBlockTimestampMs are separate, separately metered VM hooks. The node divides on the way to the seconds accessor, so a contract that did not ask for milliseconds does not get them.

Breaks after activation

if new_ts > last_ts { /* assumes one block, one second */ }
elapsed_secs = now_secs - start_secs      // 1s resolution on a 600ms chain

Types, mx-sdk-rs

TypeUnit
TimestampSeconds, DurationSecondsSeconds
TimestampMillis, DurationMillisMilliseconds

Timestamps and durations do not mix, so unit errors fail the build rather than the contract.

Test on testnet

curl -s "https://testnet-api.multiversx.com/blocks?size=10&shard=1&fields=nonce,timestamp"

Ten blocks span about five seconds, against about a minute on mainnet. Adjacent blocks can carry the same second.

TestnetEndpoint
APItestnet-api.multiversx.com
Gatewaytestnet-gateway.multiversx.com
Explorertestnet-explorer.multiversx.com
Wallettestnet-wallet.multiversx.com

Resources

ResourceLink
Documentationdocs.multiversx.com
JS cookbooksdk-js cookbook
JS SDKmx-sdk-js-core
dApp SDKmx-sdk-dapp
Rust frameworkmx-sdk-rs
Contract examplesmx-sdk-rs/contracts/examples
Python SDKmx-sdk-py
Node releasesmx-chain-go/releases

Questions

Name the integration you want checked before September and we will put the right engineer on it.