Mainnet activation: 10 September 2026. The exact time comes with the release announcement on 1 September.
| Network | Block time now | Supernova |
|---|---|---|
| Testnet | 600ms | Running |
| Devnet | 600ms | Running. Crossed at round 15539530, 20 August 14:46:20 UTC |
| Mainnet | 6s | Nodes 1 September, activation 10 September |
| Item | Value |
|---|---|
| Epoch 6439 opens | 20 August, 14:26:20 UTC |
| Activation round 15539530 | 20 August, 14:46:20 UTC |
| Round duration | 6000ms to 600ms, at the round |
| Rounds per epoch | 2400 to 24000 |
| Epoch length | 4 hours, unchanged |
| Node action | Upgrade to D2.0.4.0 |
| Compatible services | proxy v1.5.1, notifier v1.4.2, indexer v1.10.3 |
| Release notes | mx-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.
| Network | Before | After | Epoch length |
|---|---|---|---|
| Testnet | 1200 rounds of 6000ms | 12000 rounds of 600ms | 2 hours, unchanged |
| Devnet | 2400 rounds of 6000ms | 24000 rounds of 600ms | 4 hours, unchanged |
| Mainnet | 14400 rounds of 6000ms | 144000 rounds of 600ms | 24 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.
| Surface | Change | Action |
|---|---|---|
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 defaults600ms poll, 9s timeout |
Tuned to the new clock | Pass timeoutMilliseconds when awaiting on mainnet before activation |
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.
if new_ts > last_ts { /* assumes one block, one second */ }
elapsed_secs = now_secs - start_secs // 1s resolution on a 600ms chain
| Type | Unit |
|---|---|
TimestampSeconds, DurationSeconds | Seconds |
TimestampMillis, DurationMillis | Milliseconds |
Timestamps and durations do not mix, so unit errors fail the build rather than the contract.
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.
| Testnet | Endpoint |
|---|---|
| API | testnet-api.multiversx.com |
| Gateway | testnet-gateway.multiversx.com |
| Explorer | testnet-explorer.multiversx.com |
| Wallet | testnet-wallet.multiversx.com |
| Resource | Link |
|---|---|
| Documentation | docs.multiversx.com |
| JS cookbook | sdk-js cookbook |
| JS SDK | mx-sdk-js-core |
| dApp SDK | mx-sdk-dapp |
| Rust framework | mx-sdk-rs |
| Contract examples | mx-sdk-rs/contracts/examples |
| Python SDK | mx-sdk-py |
| Node releases | mx-chain-go/releases |
Name the integration you want checked before September and we will put the right engineer on it.