Where is My Message?
How can I see my message get delivered?
When you send an interchain message, your application may want to perform an action upon receiving and processing the message on the destination chain. Your smart contracts can make state changes or emit their own events but there is some minimal observability included in the core protocol for your use.
A fully-featured interchain message explorer is coming soon! For now, use the methods below for message observability.

Mailbox Events

When you use the send API, a Dispatch event is emitted from the Outbox contract with your message body and a leafIndex that uniquely identifies your message in the stored Merkle tree. When the message lands on the destination chain, a Process event is emitted from the corresponding origin Inbox contract with the hash of your message body and leafIndex. You can use this relation to trace when your message has been processed and the recipient contract's handle has been invoked with the message body.

Using Block Explorers

If you visit a verified Outbox contract on a block explorer, you can easily view the most recent emitted Dispatch events. See the Ethereum Outbox events tab on etherscan and reference the outbox addresses section for other networks.
If you visit a verified Inbox contract on a block explorer, you can easily view the most recent emitted Process events. See the Ethereum Inbox on Celo events tab on celoscan and reference the inbox addresses section for other networks.

Using the NodeJS SDK

The Hyperlane Core App (built using the App Framework) exposes various utilities for message observability. To instantiate this app, reference the Core App environments docs.
import { AbacusCore } from '@abacus-network/sdk';
const core = AbacusCore.fromEnvironment(environment, multiProvider);
Note: Abacus is the former name of the Hyperlane protocol. The repo and SDK will soon be renamed.

Get dispatched messages

// included for reference
type DispatchedMessage = {
leafIndex: number;
message: string; // unparsed
parsed: {
origin: number;
sender: string;
destination: number;
recipient: string;
body: string;
};
};
// get dispatched messages for tx receipt
const messages: DispatchedMessage[] = core.getDispatchedMessages(txReceipt);

Wait for message processing

Using an ethers transaction receipt from the source chain, wait for message processing and get destination chain(s) transaction receipt(s)!
This utility leverages ethers event polling and should be used with caution against RPC providers.
const processReceipts = await core.waitForMessageProcessing(txReceipt);
Copy link
On this page
Mailbox Events
Using Block Explorers
Using the NodeJS SDK