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 }