// SPDX-License-Identifier: MIT // +build ovm pragma solidity >0.5.0 <0.8.0; pragma experimental ABIEncoderV2; /* Interface Imports */ import { iBaseCustomCrossDomainMessenger } from "./interfaces/iBaseCustomCrossDomainMessenger.sol"; /* Library Imports */ import { Lib_ReentrancyGuard } from "@eth-optimism/contracts/build/contracts/libraries/utils/Lib_ReentrancyGuard.sol"; abstract contract BaseCustomCrossDomainMessenger is iBaseCustomCrossDomainMessenger, Lib_ReentrancyGuard { /********************** * Contract Variables * **********************/ mapping(bytes32 => bool) public relayedMessages; mapping(bytes32 => bool) public successfulMessages; mapping(bytes32 => bool) public sentMessages; uint256 public messageNonce; address public override xDomainMessageSender; /******************** * Public Functions * ********************/ /** * Sends a cross domain message to the target messenger. * @param _target Target contract address. * @param _message Message to send to the target. * @param _gasLimit Gas limit for the provided message. * @param _timelock Timelock (in seconds) for the provided message. */ function sendMessage( address _target, bytes memory _message, uint32 _gasLimit, uint256 _timelock ) public override { bytes memory xDomainCalldata = _getXDomainCalldata( _target, msg.sender, _message, messageNonce, _timelock ); messageNonce += 1; sentMessages[keccak256(xDomainCalldata)] = true; _sendXDomainMessage(xDomainCalldata, _gasLimit); emit SentMessage(xDomainCalldata); } /********************** * Internal Functions * **********************/ /** * Generates the correct cross domain calldata for a message. * @param _target Target contract address. * @param _sender Message sender address. * @param _message Message to send to the target. * @param _messageNonce Nonce for the provided message. * @param _timelock Timelock (in seconds) for the provided message. * @return ABI encoded cross domain calldata. */ function _getXDomainCalldata( address _target, address _sender, bytes memory _message, uint256 _messageNonce, uint256 _timelock ) internal pure returns (bytes memory) { return abi.encodeWithSignature( "relayMessage(address,address,bytes,uint256,uint256)", _target, _sender, _message, _messageNonce, _timelock ); } /** * Sends a cross domain message. * @param _message Message to send. * @param _gasLimit Gas limit for the provided message. */ function _sendXDomainMessage(bytes memory _message, uint256 _gasLimit) internal virtual { revert("Implement me in child contracts!"); } }