L2-to-L1 Message Prover
Free to download on every platform. Comes pre-installed on BotFone, BotPad and BotFlip — with extra free apps included.
About this app
WHAT IT DOES
The L2-to-L1 Message Prover enables users to prove and relay messages from Layer 2 to Layer 1. It reads L2 message contract state for L2CrossDomainMessenger and L2ToL1MessagePasser contracts, user address, wallet balance, and message data including sender, target, value, nonce, and data. The tool processes message inclusion proofs, L2 block headers, state roots, and Merkle proofs. It supports proveMessage for standard proof submission, batchProveMessages for multiple messages in one transaction, and proveAndRelayMessage for proving and relaying in a single transaction. The tool reads gas price, base fee, block timestamp, chain ID, transaction nonce, approval state, contract owner state, and message status before execution.
HOW TO USE
Connect your wallet and select the target network (L1). Enter the L2 message contract address and the message nonce. Provide the sender address, target L1 contract address, message value in wei, and message data as hex. Enter the Merkle proof nodes (one per line) from the L2 state root. Choose the execution method (proveMessage, batchProveMessages, or proveAndRelayMessage). The tool will fetch the message status, checking if it has been sent and relayed. Once confirmed, it submits the proof transaction. The tool validates the proof structure and displays the number of proof nodes before signing.
TECHNICAL MECHANISM
Unlike generic message tools, this executor is purpose-built for L2-to-L1 message proving workflows. It first reads the message contract's isActive() to ensure the contract is operational. The tool fetches message status via messageStatus() to check if the message has been sent and whether it has already been relayed. It reads isProven() to verify if the message proof has already been submitted. The tool validates the Merkle proof structure, ensuring each node is a valid 32-byte hex value. It selects the optimal method: proveMessage for standard proof submission, batchProveMessages for multiple messages in one transaction, or proveAndRelayMessage for combined proof and relay. The proof includes the L2 block header, state root, and Merkle inclusion proof, which the L1 contract verifies against its stored L2 state root. Gas costs are calculated using receipt.effectiveGasPrice for accurate post-EIP-1559 fee accounting.
WHAT IT CANNOT SEE
This tool cannot verify that the L2 message was actually sent or that the inclusion proof is valid beyond the contract's verification. It cannot detect if the message has already been relayed or if the L2 state root has been finalized. It also cannot guarantee that the L1 contract will accept the proof. The tool cannot detect if the L2 state root has been updated or if the message is no longer valid. It also cannot verify that the target L1 contract will correctly process the message.
PLEASE NOTE
This tool supports EVM-compatible chains. Proving a message is irreversible—verify all data carefully before signing. The message contract must implement the proof functions expected by this tool. Merkle proofs must be generated from the L2 state root and match the message inclusion path. Batch proving requires arrays of nonces, senders, targets, values, data, and proofs. This tool does not send messages from L1 to L2—for that, use the L1-to-L2 Message Sender. Always check that the L2 state root is finalized before proving.