Deploy

Verify & Inspect

Verify your program deployment and inspect state on Ethereum explorers.

Verify & Inspect

After deploying your program, verify it on Ethereum block explorers and inspect its state through multiple tools.

Explorer Verification

Etherscan

Find your Mirror contract on Hoodi Etherscan. Search by the Mirror address returned during program creation.

Without ABI:
Base Mirror methods visible — sendMessage, sendReply, executableBalanceTopUp, claimValue

With ABI:
Under "Write as Proxy" and "Read as Proxy", your program's custom methods appear with decoded parameters

Key Events

On your Mirror contract's "Events" tab:

EventMeaning
MessageQueueingRequestedMessage was queued for your program
ExecutableBalanceTopUpRequestedwVARA was deposited for execution
StateChangedProgram state was updated (batch committed)
MessageProgram sent an outgoing message
ReplyProgram replied to a message
ValueClaimedValue was claimed from the program

Read Program State

CLI

ethexe tx query "$PROGRAM_ID" \
  --ethereum-rpc "$RPC" \
  --ethereum-router "$ROUTER" \
  --sender "$SENDER"

TypeScript SDK (sails-js)

import { MyProgram } from './generated';

const program = new MyProgram(provider, PROGRAM_ADDRESS);

// Read-only queries — free, no gas
const counter = await program.counter.get();
const balance = await program.token.balanceOf(userAddress);

Etherscan (with ABI)

If deployed with ABI, navigate to the Mirror address on Etherscan and use the "Read as Proxy" tab to call read-only methods directly in the browser.

State Hash

Every program's Mirror contract stores a stateHash — a cryptographic commitment to the program's full state.

const mirror = new ethers.Contract(mirrorAddress, mirrorAbi, provider);
const stateHash = await mirror.stateHash();

State Guarantee

The stateHash guarantees that the state stored by executors matches what's committed on L1. Any dispute about program state can be resolved by comparing hashes.

Checking Program Health

A healthy, active program should show:

Valid codeCodeGotValidated(codeId, true) event exists on the Router
Initialized — At least one StateChanged event after the init message
Funded — At least one successful ExecutableBalanceTopUpRequested event and continued StateChanged activity
Processing — Recent StateChanged events when messages are sent

Troubleshooting

If something looks wrong, consult Errors & Troubleshooting.

On this page