Hello World

Here is a hello-world example that sends and receives cross-chain messages with simple logics:

  • Users call sendMessage on the source chain to send a cross-chain message.

  • The receiver side implements executeMessage to receive and emit the message at the destination chain.

Source code at GitHub.

// A HelloWorld example for basic cross-chain message passing
contract MsgExampleBasic is MessageApp {
    event MessageReceived(
        address srcContract,
        uint64 srcChainId,
        address sender,
        bytes message

    constructor(address _messageBus) MessageApp(_messageBus) {}

    // called by user on source chain to send cross-chain messages
    function sendMessage(
        address _dstContract,
        uint64 _dstChainId,
        bytes calldata _message
    ) external payable {
        bytes memory message = abi.encode(msg.sender, _message);
        sendMessage(_dstContract, _dstChainId, message, msg.value);

    // called by MessageBus on destination chain to receive cross-chain messages
    function executeMessage(
        address _srcContract,
        uint64 _srcChainId,
        bytes calldata _message,
        address // executor
    ) external payable override onlyMessageBus returns (ExecutionStatus) {
        (address sender, bytes memory message) = abi.decode(
            (address, bytes)
        emit MessageReceived(_srcContract, _srcChainId, sender, message);
        return ExecutionStatus.Success;

Last updated