description |
---|
A simple application built on Abacus |
You can see the example Hello World application in the abacus-app-template repo.
The contract is very simple, it sends a user-specified string to another chain which handles the message by increasing counters and emitting events.
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.13;
// ============ External Imports ============
import {Router} from "@abacus-network/app/contracts/Router.sol";
/*
============ HelloWorld ============
The HelloWorld app
*/
contract HelloWorld is Router {
// A counter of how many messages have been sent from this contract.
uint256 public sent;
// A counter of how many messages have been received by this contract.
uint256 public received;
// Keyed by domain, a counter of how many messages that have been sent
// from this contract to the domain.
mapping(uint32 => uint256) public sentTo;
// Keyed by domain, a counter of how many messages that have been received
// by this contract from the domain.
mapping(uint32 => uint256) public receivedFrom;
// ============ Events ============
event SentHelloWorld(
uint32 indexed origin,
uint32 indexed destination,
string message
);
event ReceivedHelloWorld(
uint32 indexed origin,
uint32 indexed destination,
bytes32 sender,
string message
);
// ============ Constructor ============
constructor() {}
// ============ Initializer ============
function initialize(address _abacusConnectionManager) external initializer {
__Router_initialize(_abacusConnectionManager);
}
// ============ External functions ============
/**
* @notice Sends a message to the _destinationDomain. Any msg.value is
* used as interchain gas payment.
* @param _destinationDomain The destination domain to send the message to.
*/
function sendHelloWorld(uint32 _destinationDomain, string calldata _message)
external
payable
{
sent += 1;
sentTo[_destinationDomain] += 1;
_dispatchWithGasAndCheckpoint(
_destinationDomain,
bytes(_message),
msg.value
);
emit SentHelloWorld(_localDomain(), _destinationDomain, _message);
}
// ============ Internal functions ============
/**
* @notice Handles a message from a remote router.
* @dev Only called for messages sent from a remote router, as enforced by Router.sol.
* @param _origin The domain of the origin of the message.
* @param _sender The sender of the message.
* @param _message The message body.
*/
function _handle(
uint32 _origin,
bytes32 _sender,
bytes memory _message
) internal override {
received += 1;
receivedFrom[_origin] += 1;
emit ReceivedHelloWorld(
_origin,
_localDomain(),
_sender,
string(_message)
);
}
}