diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol index 7dc58ea0a6761..38433921e42b3 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol @@ -1,10 +1,13 @@ pragma solidity ^0.5.0; +/* Interface Imports */ +import { ICrossDomainMessenger } from "./interfaces/CrossDomainMessenger.interface.sol"; + /** - * @title L1CrossDomainMessenger + * @title BaseCrossDomainMessenger */ -contract BaseCrossDomainMessenger { - /* +contract BaseCrossDomainMessenger is ICrossDomainMessenger { + /* * Contract Variables */ @@ -14,7 +17,6 @@ contract BaseCrossDomainMessenger { uint256 public messageNonce; address public xDomainMessageSender; - /* * Public Functions */ @@ -31,6 +33,30 @@ contract BaseCrossDomainMessenger { targetMessengerAddress = _targetMessengerAddress; } + /** + * Sends a cross domain message to the target messenger. + * .inheritdoc IL2CrossDomainMessenger + */ + function sendMessage( + address _target, + bytes memory _message, + uint32 _gasLimit + ) + public + { + bytes memory xDomainCalldata = _getXDomainCalldata( + _target, + msg.sender, + _message, + messageNonce + ); + + _sendXDomainMessage(xDomainCalldata, _gasLimit); + + messageNonce += 1; + sentMessages[keccak256(xDomainCalldata)] = true; + } + /* * Internal Functions @@ -64,4 +90,14 @@ contract BaseCrossDomainMessenger { _messageNonce ); } + + /** + * Sends a cross domain message. + * @param _message Message to send. + * @param _gasLimit OVM gas limit for the message. + */ + function _sendXDomainMessage( + bytes memory _message, + uint32 _gasLimit + ) internal; } \ No newline at end of file diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.interface.sol deleted file mode 100644 index db1fd025358fc..0000000000000 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.interface.sol +++ /dev/null @@ -1,81 +0,0 @@ -pragma solidity ^0.5.0; -pragma experimental ABIEncoderV2; - -/* Library Imports */ -import { DataTypes } from "../utils/libraries/DataTypes.sol"; - -/** - * @title IL1CrossDomainMessenger - */ -contract IL1CrossDomainMessenger { - /* - * Contract Variables - */ - - mapping (bytes32 => bool) public receivedMessages; - mapping (bytes32 => bool) public sentMessages; - address public targetMessengerAddress; - uint256 public messageNonce; - address public xDomainMessageSender; - - /* - * Data Structures - */ - - struct L2MessageInclusionProof { - bytes32 stateRoot; - uint256 stateRootIndex; - DataTypes.StateElementInclusionProof stateRootProof; - bytes stateTrieWitness; - bytes storageTrieWitness; - } - - - /* - * Public Functions - */ - - /** - * Relays a cross domain message to a contract. - * @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 _proof Inclusion proof for the given message. - */ - function relayMessage( - address _target, - address _sender, - bytes memory _message, - uint256 _messageNonce, - L2MessageInclusionProof memory _proof - ) public; - - /** - * 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. - */ - function sendMessage( - address _target, - bytes memory _message, - uint32 _gasLimit - ) public; - - /** - * Replays a cross domain message to the target messenger. - * @param _target Target contract address. - * @param _sender Original sender address. - * @param _message Message to send to the target. - * @param _messageNonce Nonce for the provided message. - * @param _gasLimit Gas limit for the provided message. - */ - function replayMessage( - address _target, - address _sender, - bytes memory _message, - uint256 _messageNonce, - uint32 _gasLimit - ) public; -} \ No newline at end of file diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol index 3a9adfa3722cb..7f0eddab5a271 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol @@ -5,9 +5,7 @@ pragma experimental ABIEncoderV2; import { ContractResolver } from "../utils/resolvers/ContractResolver.sol"; import { EthMerkleTrie } from "../utils/libraries/EthMerkleTrie.sol"; import { BytesLib } from "../utils/libraries/BytesLib.sol"; - -/* Interface Imports */ -import { IL1CrossDomainMessenger } from "./L1CrossDomainMessenger.interface.sol"; +import { DataTypes } from "../utils/libraries/DataTypes.sol"; /* Contract Imports */ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; @@ -17,7 +15,19 @@ import { StateCommitmentChain } from "../chain/StateCommitmentChain.sol"; /** * @title L1CrossDomainMessenger */ -contract L1CrossDomainMessenger is IL1CrossDomainMessenger, BaseCrossDomainMessenger, ContractResolver { +contract L1CrossDomainMessenger is BaseCrossDomainMessenger, ContractResolver { + + /* + * Data Structures + */ + + struct L2MessageInclusionProof { + bytes32 stateRoot; + uint256 stateRootIndex; + DataTypes.StateElementInclusionProof stateRootProof; + bytes stateTrieWitness; + bytes storageTrieWitness; + } /* * Constructor */ @@ -81,30 +91,6 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, BaseCrossDomainMesse receivedMessages[keccak256(xDomainCalldata)] = true; } - /** - * Sends a cross domain message to the target messenger. - * .inheritdoc IL1CrossDomainMessenger - */ - function sendMessage( - address _target, - bytes memory _message, - uint32 _gasLimit - ) - public - { - bytes memory xDomainCalldata = _getXDomainCalldata( - _target, - msg.sender, - _message, - messageNonce - ); - - _sendXDomainMessage(xDomainCalldata, _gasLimit); - - messageNonce += 1; - sentMessages[keccak256(xDomainCalldata)] = true; - } - /** * Replays a cross domain message to the target messenger. * .inheritdoc IL1CrossDomainMessenger diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.interface.sol deleted file mode 100644 index 9fa092ea88ad7..0000000000000 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.interface.sol +++ /dev/null @@ -1,47 +0,0 @@ -pragma solidity ^0.5.0; - -/** - * @title IL2CrossDomainMessenger - */ -contract IL2CrossDomainMessenger { - /* - * Contract Variables - */ - - mapping (bytes32 => bool) public receivedMessages; - mapping (bytes32 => bool) public sentMessages; - address public targetMessengerAddress; - uint256 public messageNonce; - address public 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. - */ - function sendMessage( - address _target, - bytes memory _message, - uint256 _gasLimit - ) public; - - /** - * Relays a cross domain message to a contract. - * @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. - */ - function relayMessage( - address _target, - address _sender, - bytes memory _message, - uint256 _messageNonce - ) public; -} diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol index c9fb95bfce87a..610511b749c3b 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol @@ -1,7 +1,6 @@ pragma solidity ^0.5.0; /* Interface Imports */ -import { IL2CrossDomainMessenger } from "./L2CrossDomainMessenger.interface.sol"; import { IL1MessageSender } from "../ovm/precompiles/L1MessageSender.interface.sol"; import { IL2ToL1MessagePasser } from "../ovm/precompiles/L2ToL1MessagePasser.interface.sol"; @@ -11,7 +10,7 @@ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; /** * @title L2CrossDomainMessenger */ -contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMessenger{ +contract L2CrossDomainMessenger is BaseCrossDomainMessenger { /* * Contract Variables */ @@ -19,7 +18,6 @@ contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMesse address private l1MessageSenderPrecompileAddress; address private l2ToL1MessagePasserPrecompileAddress; - /* * Constructor */ @@ -43,30 +41,6 @@ contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMesse * Public Functions */ - /** - * Sends a cross domain message to the target messenger. - * .inheritdoc IL2CrossDomainMessenger - */ - function sendMessage( - address _target, - bytes memory _message, - uint256 _gasLimit - ) - public - { - bytes memory xDomainCalldata = _getXDomainCalldata( - _target, - msg.sender, - _message, - messageNonce - ); - - _sendXDomainMessage(xDomainCalldata, _gasLimit); - - messageNonce += 1; - sentMessages[keccak256(xDomainCalldata)] = true; - } - /** * Relays a cross domain message to a contract. * .inheritdoc IL2CrossDomainMessenger @@ -134,7 +108,7 @@ contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMesse */ function _sendXDomainMessage( bytes memory _message, - uint256 _gasLimit + uint32 _gasLimit ) internal { diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/CrossDomainMessenger.interface.sol new file mode 100644 index 0000000000000..56dd8664b01f1 --- /dev/null +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/CrossDomainMessenger.interface.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.5.0; +pragma experimental ABIEncoderV2; + +/** + * @title ICrossDomainMessenger + */ +interface ICrossDomainMessenger { + + /******************** + * View Functions * + ********************/ + + function receivedMessages(bytes32 messageHash) external view returns (bool); + function sentMessages(bytes32 messageHash) external view returns (bool); + function targetMessengerAddress() external view returns (address); + function messageNonce() external view returns (uint256); + function xDomainMessageSender() external view returns (address); + + /******************** + * Public Functions * + ********************/ + + + /** + * Sets the target messenger address. + * @param _targetMessengerAddress New messenger address. + */ + function setTargetMessengerAddress( + address _targetMessengerAddress + ) external; + + /** + * 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. + */ + function sendMessage( + address _target, + bytes calldata _message, + uint32 _gasLimit + ) external; + +} diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/mocks/MockCrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/mocks/MockCrossDomainMessenger.sol index 3ad349a932c14..d28bdeb41ba16 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/mocks/MockCrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/mocks/MockCrossDomainMessenger.sol @@ -3,12 +3,12 @@ pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /* Contract Imports */ -import { BaseCrossDomainMessenger } from "../BaseCrossDomainMessenger.sol"; +import { ICrossDomainMessenger } from "../interfaces/CrossDomainMessenger.interface.sol"; /** * @title MockCrossDomainMessenger */ -contract MockCrossDomainMessenger is BaseCrossDomainMessenger { +contract MockCrossDomainMessenger is ICrossDomainMessenger { /*********** * Structs * @@ -32,6 +32,13 @@ contract MockCrossDomainMessenger is BaseCrossDomainMessenger { uint256 internal lastRelayedMessage; uint256 internal delay; + mapping (bytes32 => bool) public receivedMessages; + mapping (bytes32 => bool) public sentMessages; + address public targetMessengerAddress; + uint256 public messageNonce; + address public xDomainMessageSender; + + /*************** * Constructor * @@ -53,6 +60,18 @@ contract MockCrossDomainMessenger is BaseCrossDomainMessenger { * Public Functions * ********************/ + /** + * Sets the target messenger address. + * @param _targetMessengerAddress New messenger address. + */ + function setTargetMessengerAddress( + address _targetMessengerAddress + ) + external + { + targetMessengerAddress = _targetMessengerAddress; + } + /** * Sends a message to another mock xdomain messenger. * @param _target Target for the message. @@ -61,10 +80,10 @@ contract MockCrossDomainMessenger is BaseCrossDomainMessenger { */ function sendMessage( address _target, - bytes memory _message, + bytes calldata _message, uint32 _gasLimit ) - public + external { MockCrossDomainMessenger targetMessenger = MockCrossDomainMessenger( targetMessengerAddress diff --git a/packages/contracts/contracts/test-helpers/CrossDomainSimpleStorage.sol b/packages/contracts/contracts/test-helpers/CrossDomainSimpleStorage.sol index 20ac5a813ea58..c0d695f81db3b 100644 --- a/packages/contracts/contracts/test-helpers/CrossDomainSimpleStorage.sol +++ b/packages/contracts/contracts/test-helpers/CrossDomainSimpleStorage.sol @@ -1,14 +1,14 @@ pragma solidity ^0.5.0; -import { IL1CrossDomainMessenger } from "../optimistic-ethereum/bridge/L1CrossDomainMessenger.interface.sol"; +import { ICrossDomainMessenger } from "../optimistic-ethereum/bridge/interfaces/CrossDomainMessenger.interface.sol"; import { SimpleStorage } from "./SimpleStorage.sol"; contract CrossDomainSimpleStorage is SimpleStorage { - IL1CrossDomainMessenger crossDomainMessenger; + ICrossDomainMessenger crossDomainMessenger; address public crossDomainMsgSender; function setMessenger(address _crossDomainMessengerAddress) public { - crossDomainMessenger = IL1CrossDomainMessenger(_crossDomainMessengerAddress); + crossDomainMessenger = ICrossDomainMessenger(_crossDomainMessengerAddress); } function crossDomainSetStorage(bytes32 key, bytes32 value) public {