github.com/ethereum-optimism/optimism@v1.7.2/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol (about)

     1  // SPDX-License-Identifier: MIT
     2  pragma solidity 0.8.15;
     3  
     4  import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
     5  import { Predeploys } from "src/libraries/Predeploys.sol";
     6  import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
     7  import { ISemver } from "src/universal/ISemver.sol";
     8  import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
     9  import { Constants } from "src/libraries/Constants.sol";
    10  
    11  /// @custom:proxied
    12  /// @custom:predeploy 0x4200000000000000000000000000000000000007
    13  /// @title L2CrossDomainMessenger
    14  /// @notice The L2CrossDomainMessenger is a high-level interface for message passing between L1 and
    15  ///         L2 on the L2 side. Users are generally encouraged to use this contract instead of lower
    16  ///         level message passing contracts.
    17  contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver {
    18      /// @custom:semver 2.0.0
    19      string public constant version = "2.0.0";
    20  
    21      /// @notice Constructs the L2CrossDomainMessenger contract.
    22      constructor() CrossDomainMessenger() {
    23          initialize({ _l1CrossDomainMessenger: CrossDomainMessenger(address(0)) });
    24      }
    25  
    26      /// @notice Initializer.
    27      /// @param _l1CrossDomainMessenger L1CrossDomainMessenger contract on the other network.
    28      function initialize(CrossDomainMessenger _l1CrossDomainMessenger) public initializer {
    29          __CrossDomainMessenger_init({ _otherMessenger: _l1CrossDomainMessenger });
    30      }
    31  
    32      /// @notice Getter for the remote messenger.
    33      ///         Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead.
    34      /// @return L1CrossDomainMessenger contract.
    35      /// @custom:legacy
    36      function l1CrossDomainMessenger() public view returns (CrossDomainMessenger) {
    37          return otherMessenger;
    38      }
    39  
    40      /// @inheritdoc CrossDomainMessenger
    41      function _sendMessage(address _to, uint64 _gasLimit, uint256 _value, bytes memory _data) internal override {
    42          L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: _value }(
    43              _to, _gasLimit, _data
    44          );
    45      }
    46  
    47      /// @inheritdoc CrossDomainMessenger
    48      function _isOtherMessenger() internal view override returns (bool) {
    49          return AddressAliasHelper.undoL1ToL2Alias(msg.sender) == address(otherMessenger);
    50      }
    51  
    52      /// @inheritdoc CrossDomainMessenger
    53      function _isUnsafeTarget(address _target) internal view override returns (bool) {
    54          return _target == address(this) || _target == address(Predeploys.L2_TO_L1_MESSAGE_PASSER);
    55      }
    56  }