EVM interface Michelson interface Native atomic composability

Build on
Tezos X

Public testnet for Tezos X — the execution layer where the EVM and Michelson interfaces share a single chain, secured by Tezos L1. Deploy on Tezos X with the toolstack you already know — Solidity or Michelson — and have your contracts compose atomically with any other contract — EVM or Michelson — in a single transaction.

This dashboard is under active development — services and links may change without notice.

New here? Try a tutorial Found a bug? Tell us in the Tezos X Discord channel
EVM chain ID
Michelson chain ID
Block
Node

What's new

Latest updates

Recent events on Previewnet, ordered by date — most recent first. Kernel upgrades roll out through the on-chain governance contract.

July 20, 2026 — 15:00 UTC v0.7 ⚠ Network reset Previewnet reset — fresh network, new rollup address, and a major security & L1-parity release

Action required

  • Previewnet has been reset — all prior state is gone. Address identity now lives inside the account record, and the old identity data can't be carried over, so the network was rebuilt from genesis. Every account, balance, and contract deployed before this release is cleared: re-fund your accounts from the faucet and redeploy your contracts.
  • The rollup address changed. The reset produced a fresh smart-rollup address — update any hardcoded reference in installer configs, indexers, and node setups. The current value is shown live in the All endpoints section below and in the canonical repo ↗.
  • Newly originated contract addresses are now computed like Tezos L1 and shift by one from before. Every originated address — including those created through cross-runtime calls — is different now; don't reuse a pre-reset address.
  • Native operations must reference a recent Tezos X block, not a Tezos L1 block. This closes a replay hole where the same signed operation could be reused on another network, and it restores transaction freshness. Operations sent through the delayed inbox are affected — update tooling that builds native operations to anchor on a recent Tezos X block.
  • “CRAC” is now spelled out as “cross-runtime call” across headers, events, tags, error messages, and logs. Because event signatures change with the new names, log indexers must be updated to track both the new signatures and the new field names.
  • Gas costs have changed. Many Michelson operations were re-measured on the new runtime, some previously-free operations are now charged, and cross-runtime gas was rebalanced. Reported gas and gas estimates change for affected contracts — refresh any cached gas estimates.
  • Two legacy shortcuts were removed. The old direct-transfer selector on the runtime gateway and the old %default transfer entrypoint are gone — use the generic call entrypoint instead. Alias forwarders created before this change need to be re-created to keep working.

Security

  • Signature malleability is blocked. Alternate-but-equivalent encodings of a signature are now rejected, so a contract that relies on signature bytes for anti-replay can no longer be fooled by a reworked twin of a valid signature.
  • Transaction-hash malleability is blocked. A signed transaction now has a single valid encoding, so it can no longer appear under several different transaction hashes — protecting wallets, indexers, and bridges that track a transaction by its hash.
  • Fee-griefing on reveal batches is fixed. A batch whose declared public key doesn't match its source is now rejected up front, before any fee is charged, so an attacker can no longer force fees onto a solvent account.
  • Result spoofing on the gateway is fixed. Only the contract actually being dispatched can deposit its result, so a contract called along the way can no longer inject its own data as someone else's result or block a legitimate one.
  • Contracts can no longer forge access to another contract's storage. Passing or originating with a borrowed big-map identifier is now rejected, matching Tezos L1.
  • Duplicate internal operations are rejected. A contract could previously duplicate an operation value and have it run twice (a double transfer or origination); such duplicates now roll back the whole operation, matching Tezos L1.
  • Out-of-gas in a read-only cross-runtime call now fails safely, returning a clear out-of-gas error instead of an empty result — so a caller can't be pushed down a fallback path by exhausting the target's gas.
  • Attacker-controlled data can no longer bloat block metadata cheaply. Error and revert payloads carried across runtimes are now charged for their size before being stored, and several operations were reworked so oversized or deeply-nested values run out of gas instead of overwhelming the kernel. A separate denial-of-service path was closed off behind a feature flag.

New

  • Michelson contracts can read live EVM block data. A call from the Michelson interface into an EVM contract now sees real block values — base fee, gas limit, randomness, gas price, and more — instead of placeholder zeros. Fee handling is unchanged.
  • Aliases share a single upgradable implementation. Aliases no longer carry their own copy of the forwarder code; they all resolve to one shared implementation that can be upgraded for every alias at once, with safeguards so existing contracts keep working.
  • New storage-space queries. You can now read how much storage space a contract uses and has paid for, mirroring the equivalent Tezos L1 queries.
  • Clearer cross-runtime frames in receipts. Each cross-runtime call is now bracketed by a matching start and end marker, so tools can reconstruct the full call tree from a receipt.
  • The kernel recovers from software failures. A recovery procedure protects the network against internal crashes, and a transaction shown to trigger such a crash is dropped from the delayed inbox instead of stalling the network.

Improvements

  • Caller identity is now correct across runtimes. The original sender is carried through chains of cross-runtime calls, so identity checks resolve correctly even across an EVM → Michelson → EVM round-trip.
  • Storage burn now matches Tezos L1. Big-map usage counts toward a contract's storage footprint, genesis and bootstrap contracts start with the right storage accounting, and storage costs from cross-runtime work are billed to the correct payer.
  • Cross-runtime gas is fairer and consistent. Rounding no longer leaves a tiny remainder uncharged, and a call originating on the Michelson side is now charged the same as the equivalent call originating on the EVM side.
  • Recursive cross-runtime loops fail cleanly. A self-recursive gateway cycle now ends as a normal operation failure instead of exhausting memory, and the rest of the block — including deposits — is preserved.
  • The Michelson runtime is faster, touching fewer storage entries when reading account balances and storage accounting.
  • Cross-runtime events are self-consistent, reporting a stable target address and the correct source runtime, so tools no longer split one contract into two identities.
  • Block production is more robust. The sequencer now budgets blocks by their actual serialized size, avoiding block-production failures from oversized output.
  • Delayed-inbox operations behave like the others. Michelson contracts run there now see the right chain id, and fee checks and gas refunds are applied correctly.

Fixes

  • Deposits are refunded on revert. A cross-runtime deposit is now returned when the receiving call reverts, so funds can no longer be stranded while the receiver goes uncredited.
  • No more leftover storage entries. A fully reverted or fully drained bridge claim no longer leaves an empty ticket entry behind, and an alias forwarder created during a call that then runs out of gas is properly rolled back instead of leaking into a later call's receipt.
  • Gas reporting on failures is accurate — a failed cross-runtime call now reports the gas it actually consumed rather than a maximum value.
  • Receipts are correct. Gas totals, error placement, operation ordering, and internal-operation limits now match Tezos L1, and errors are recorded once rather than twice.
  • Many small Michelson divergences from Tezos L1 were fixed in how scripts are type-checked and how values are parsed and compared, so scripts behave the same on Tezos X as on Tezos L1.
  • Tickets are temporarily disabled in the Michelson runtime and can be re-enabled later once the conditions for doing so are agreed.
June 3, 2026 — 09:00 UTC v0.6 Kernel upgrade — cross-runtime tx.origin fixed, new gateway address views, and broad Michelson/L1 parity

Security

  • tx.origin now resolves to the real originator across runtimes. On a cross-interface call, the EVM ORIGIN opcode returns the transaction originator while msg.sender still returns the immediate caller. Previously both returned the immediate caller, so the common EOA-only guard require(tx.origin == msg.sender) could be silently bypassed by routing a call through the Michelson interface. The originator is also preserved across an EVM → Michelson → EVM round-trip — it resolves back to the originating account instead of collapsing onto an internal alias. Direct EOA calls are unchanged (tx.origin == msg.sender as before).

New

  • Contracts can now resolve cross-runtime address identity on-chain, through two read-only selectors on the runtime-gateway precompile (0xff…07) — both non-payable, log-free, and STATICCALL-safe, so they're callable from a view. originOf(addr, sourceRuntime) classifies an address as Native (a real account on that runtime), Alias (a forwarder standing in for a foreign caller), or Unknown — so a security gate or admin check can reject a foreign account's alias where it expects a genuine local account, the natural complement to the tx.origin fix above. A code-presence back-stop also recognizes CREATE/CREATE2 contracts and EIP-7702 delegated EOAs as Native. resolveAddress(addr, sourceRuntime, targetRuntime) returns the same identity's address on the other runtime and reports whether that counterpart is already materialized (its account exists) or still only derived (computable but not yet created) — letting a dApp route a cross-runtime payment or call to the correct address and, when needed, materialize the account first via a native atomic call rather than sending value to an address with no account behind it yet.
  • A Michelson contract's synthetic cross-interface views are now discoverable through standard contract introspection. The enshrined gateway's staticcall_evm view is surfaced on the synthesized /script, so wallets, indexers, and block explorers find it the same way they find any declared Tezos view.
  • Aliases originated as part of a native atomic call now emit dedicated receipts, so indexers can attribute the new account to the call that created it.

Improvements

  • The monitor/heads/main RPC now honors the protocol and next_protocol filters and emits the current head immediately as the first element of the stream, matching L1's monitor_heads. Wait-for-head flows no longer block until the next block, and filtered clients no longer receive heads they excluded.
  • Michelson/L1 parity: the same Michelson source now behaves identically on L1 and the Michelson interface. PUSH timestamp parses large decimal literals and RFC3339 leap-seconds like L1; UNPACK string rejects carriage returns and other non-permitted bytes; UNPACK rejects non-canonical zarith encodings; LSR bytes handles oversized shift counts without trapping; and big-map ids allocated during CREATE_CONTRACT are assigned in storage source order, like externally originated contracts.
  • Same-runtime gateway round-trips no longer launder the caller's identity: when source and target runtimes match and the caller is a native account, the callee now sees the real msg.sender / SENDER instead of a re-derived alias — so msg.sender-based access controls (require(msg.sender == owner) and the like) stay correct even when a call is routed through the gateway within one runtime.

Fixes

  • Alias materialization is now atomic. If forwarder initialization fails (revert, halt, or a gas budget below the intrinsic cost), the delegation code_hash write is rolled back. A failed init previously left a half-materialized account that a later call would bless without re-running initialization — permanently bricking the alias.
  • Cross-runtime calls now enforce a maximum chain depth (≤ 128). A self-recursive Michelson↔EVM gateway cycle that previously wedged sequencer block production now fails cleanly at the operation level (catchable revert) once the cap is reached, leaving the block intact.
  • Several conditions that could previously abort a whole block now surface as catchable, operation-level errors instead: EVM pre-execution validation failures (e.g. a forwarded gas limit below the intrinsic cost) on the cross-runtime and static-call paths, an inbound Michelson X-Tezos-Sender that is an implicit tz1/tz2/tz3 account, and other user-triggerable errors.
  • A failed cross-runtime call now always records its receipt, even when the caller's leftover gas is too low to encode the call event — the kernel sponsors that encoding from a dedicated budget. Indexers and call-graph reconstruction no longer go blind on gas-tight failed calls, and a successful call can no longer be misreported as out-of-gas by this bookkeeping.
  • Deeply nested Michelson input is now bounded by gas instead of trapping the runtime: (de)serialization, typechecking, interpretation, and the related walks run iteratively rather than recursively, so adversarially deep input fails on gas rather than crashing.
  • Fixed transient big-maps allocated by a Michelson callee leaking into — and persisting in — durable storage on the inbound cross-runtime path, where they could collide with real durable big-maps.
May 21, 2026 — 13:00 UTC v0.5 Kernel upgrade — Michelson reads EVM state, and storage now costs tez like L1

Action required

  • Re-create your accounts after this upgrade. Addresses and their aliases created before this update may now misbehave. Generate fresh addresses — their new aliases will work correctly. If octez-client aliases you set up earlier are throwing errors, this is why.

New

  • Michelson code can now read EVM state synchronously — the mirror of the EVM→Michelson view added in v0.2. A VIEW reaching the cross-interface gateway returns the EVM response with no value transfer, so it works even inside Michelson view bodies, where TRANSFER_TOKENS is forbidden. The view takes (destination, calldata) and returns the EVM response wrapped in Some on success.
  • Cross-interface reads now enforce a real static-call contract: the read entry rejects any attached value and refuses any state change. Attempting to write storage, emit a log, deploy, self-destruct, or send value during a static read fails cleanly with a catchable error instead of corrupting the call.

Improvements

  • Michelson operations now pay storage burn like Tezos L1: originations, transfers that grow storage, and the first credit to a fresh implicit account each burn tez in proportion to the storage they use. An operation whose source can't cover the burn is cleanly backtracked with no partial state, matching L1 manager-operation semantics. Keep enough tez on your accounts to cover storage.

Fixes

  • Internal failures in the Michelson runtime now surface as structured errors instead of opaque aborts, making failed operations easier to diagnose.
May 13, 2026 — 12:00 UTC v0.4 Kernel upgrade — richer Michelson receipts for indexers and wallets

Improvements

  • Michelson manager-operation receipts now report real storage_size and paid_storage_size_diff. Originations, transfers and updates surface the contract's actual storage footprint instead of zeros, matching the receipt shape produced by Tezos L1.

New

  • Deposits targeting a Tezos implicit account (tz1…) now emit a Michelson deposit event of type pair (nat %inbox_level) (nat %inbox_msg_id) on the operation receipt. Indexers can correlate the L2 credit with the exact shared-inbox message that triggered it.
  • Deposits to a Tezos implicit account also emit balance updates on the receipt, so TzKT and Tezos wallets attribute the credit to the right account without inferring it from context.
May 7, 2026 — 11:00 UTC Michelson interface incident — resolved

Incident

  • Following the May 6 upgrade, all smart contracts previously deployed on Tezos X Previewnet through the Michelson interface have been lost. If you deployed a dApp before block 17,555, you will need to redeploy it. We apologize for the inconvenience.
  • The Michelson RPC and TzKT are back to nominal. Redeployments are unblocked.
  • The chain kept producing blocks throughout. The EVM interface was unaffected — no impact on Solidity contracts, no balances or state lost on the EVM side.
May 6, 2026 — 16:00 UTC Investigating: bug on the Michelson interface

Incident

  • An issue has surfaced on the Michelson interface following this morning's kernel upgrade. Michelson contract calls and queries are returning unexpected results. The chain is still producing blocks normally and the EVM interface is unaffected. Team is investigating, updates will follow.
May 6, 2026 — 10:42 UTC v0.3 Kernel upgrade — smoother cross-runtime calls and cleaner indexer data

Improvements

  • Michelson operations can now consume up to 3,000,000 gas units (matching the EVM 30M-gas budget). EVM transactions reaching the Michelson interface with plenty of gas left no longer hit a misleading out-of-gas error.

Fixes

  • Events emitted during cross-interface calls — both EVM logs and Michelson EMIT events — now reliably appear on transaction receipts. Block explorers, indexers and on-chain analytics tools see a complete picture of what happened.
  • Receipts of transactions that mix successful and failed cross-interface calls now match the call order and the semantics already used by Tezos L1 manager operations.
  • The internal address used to attribute cross-interface calls (0x7e205800…01) no longer shows a fake huge balance on Blockscout.
April 29, 2026 v0.2 EVM contracts can now read Michelson state

New

  • EVM contracts can call Michelson views through the cross-interface gateway — read state from a Michelson contract during an EVM call, with no value transfer and no log emission. Compatible with Solidity's staticcall pattern.

Fixes

  • Unused gas is now correctly refunded when a precompile reverts — previously the full gas limit could be charged.
  • When a transaction interleaves successful and failed cross-interface calls, internal operations are now ordered by execution and the top-level result reconciles consistently with the internals.
April 24, 2026 v0.1 First consolidated release of Tezos X

New

  • The Michelson interface goes live on top of Etherlink. Tezos-native applications can be deployed alongside the existing EVM ecosystem.
  • Two gateways enable native atomic composability: an EVM contract and a Michelson contract can interact within a single transaction, with shared atomic semantics.
  • The kernel processes Tezos operations sequenced in incoming blueprints and produces Tezos blocks visible to Michelson explorers and wallets.

Full technical changelog: CHANGES_TEZOSX.md ↗


Get connected

Add the network to your wallet

MetaMask for the EVM interface, Temple or octez-client for the Michelson interface. Each account holds two addresses — 0x… for EVM and tz1… for Michelson — on the same chain, with separate balances.

🦊
MetaMask
EVM interface · Solidity contracts
One-click setup via wallet_addEthereumChain. No MetaMask? Install it ↗

Or add manually

Network name Tezos X Previewnet
RPC URL evm.previewnet.tezosx.nomadic-labs.com
Chain ID
Currency symbol XTZ
Block explorer blockscout.previewnet.tezosx.nomadic-labs.com
🏛
Michelson wallets
Temple, Kukai, Umami, octez-client — any Tezos-compatible wallet
RPC endpoint michelson.previewnet.tezosx.nomadic-labs.com
Michelson chain ID
Block explorer tzkt.previewnet.tezosx.nomadic-labs.com
octez-client \ --endpoint https://michelson.previewnet.tezosx.nomadic-labs.com \ config update

Get started

Fund your wallet

Get testnet XTZ before anything else — works for both interfaces.

Faucet

Fund any address — MetaMask (0x…) or Temple (tz1…) — with testnet XTZ in seconds. No registration, no rate limit.

Get testnet XTZ  ↗

Move funds

Bridge & withdraw

Deposit from Tezos L1 to the Previewnet, or withdraw back — same UI for both directions.

Bridge

Move XTZ between Tezos L1 and the Tezos X Previewnet. Supports both deposit and withdraw flows through a single interface.

Open bridge  ↗

Explore the chain

Inspect what's on-chain

A dedicated explorer per interface — plus a unified view that follows atomic cross-interface calls across both.

EVM
Blockscout

Inspect EVM transactions, deployed contracts, token transfers, and contract verification on the Previewnet.

Michelson
TzKT

Query Michelson contracts, operations, and on-chain storage via the TzKT indexer and REST API.

Composability Experimental
Cross-interface explorer

Follow an atomic call end-to-end — across the EVM and Michelson interfaces — in a single timeline. Bridges Blockscout and TzKT data.


What you can build

Live demos on Previewnet

Hosted, working applications showcasing what native atomic composability unlocks.

Composability
Potluck

A native atomic composability demo, dressed up as a small game. Every button press is a single transaction that atomically touches both the EVM and Michelson interfaces in the same block — the game is just the wrapper that makes the mechanic tangible.

Demonstrates Native atomic composability: an EVM contract calls a Michelson contract atomically, with no intermediate steps or trusted relayers.
Composability
Cross-interface counter

Live working version of the application built in our cross-interface counter tutorial. Click to play with it; follow the tutorial below to deploy your own.

Demonstrates EVM Solidity forwarder calling a Michelson contract through the gateway — increment, decrement, atomic revert when Michelson rejects the call.

Tools

Tools for builders

Libraries, services, and integrations to write, deploy, and use Tezos X.

Coming soon
tx-codec

Optimized Solidity library for encoding and decoding Michelson values from EVM contracts, backed by formal verification.

Composability EVM Michelson
Tezos X Wallet

A wallet built for Tezos X — one account, both interfaces. Drives any EVM dApp directly through the cross-interface gateway via window.ethereum / EIP-6963, so dApps see your Tezos account natively without an extra EVM key.

Already use Temple, Kukai, or MetaMask? Keep them — this is an alternative for users who want a single integrated app instead of two wallets side by side.

EVM
xDex

IguanaDEX fork running on the Previewnet — swap, provide liquidity, create pools and tokens. Useful for liquidity and integration tests against EVM contracts.


Documentation
Developer docs
Concepts, operations, and full API references for the EVM and Michelson interfaces.
Documentation
Tutorials
Step-by-step walkthroughs — start with a Native Atomic Composability counter that spans the EVM and Michelson interfaces in a single transaction.

Background reading: Tezos X — From Roadmap to Reality ↗

Questions or feedback? Reach the team in the Tezos X channel on discord.gg/tezos ↗.


Network

All endpoints

Raw RPC and infrastructure endpoints for direct integration. Canonical reference (chain IDs, rollup address, kernel config): github.com/trilitech/tezos-x-previewnet ↗.

EVM RPC https://evm.previewnet.tezosx.nomadic-labs.com
Michelson RPC https://michelson.previewnet.tezosx.nomadic-labs.com
Rollup address
EVM node version