From 0d648090d00aa4a79cbdbfa49c89bf96254a9f45 Mon Sep 17 00:00:00 2001 From: Kevin Ho Date: Wed, 30 Sep 2020 22:30:35 -0400 Subject: [PATCH 1/4] add xdomain interface --- .../bridge/BaseCrossDomainMessenger.sol | 2 +- .../bridge/L1CrossDomainMessenger.sol | 2 +- .../bridge/L2CrossDomainMessenger.sol | 2 +- .../CrossDomainMessenger.interface.sol | 45 +++++++++++++++++++ .../L1CrossDomainMessenger.interface.sol | 14 +----- .../L2CrossDomainMessenger.interface.sol | 12 ----- .../bridge/mocks/MockCrossDomainMessenger.sol | 27 +++++++++-- .../bridge/L1CrossDomainMessenger.spec.ts | 2 +- .../bridge/L2CrossDomainMessenger.spec.ts | 2 +- 9 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/CrossDomainMessenger.interface.sol rename packages/contracts/contracts/optimistic-ethereum/bridge/{ => interfaces}/L1CrossDomainMessenger.interface.sol (81%) rename packages/contracts/contracts/optimistic-ethereum/bridge/{ => interfaces}/L2CrossDomainMessenger.interface.sol (69%) diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol index 7dc58ea0a6761..c3732bf096525 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; /** - * @title L1CrossDomainMessenger + * @title BaseCrossDomainMessenger */ contract BaseCrossDomainMessenger { /* diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol index 3a9adfa3722cb..8cbb74bfffbb4 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol @@ -7,7 +7,7 @@ import { EthMerkleTrie } from "../utils/libraries/EthMerkleTrie.sol"; import { BytesLib } from "../utils/libraries/BytesLib.sol"; /* Interface Imports */ -import { IL1CrossDomainMessenger } from "./L1CrossDomainMessenger.interface.sol"; +import { IL1CrossDomainMessenger } from "./interfaces/L1CrossDomainMessenger.interface.sol"; /* Contract Imports */ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol index c9fb95bfce87a..6430485ae48a5 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; /* Interface Imports */ -import { IL2CrossDomainMessenger } from "./L2CrossDomainMessenger.interface.sol"; +import { IL2CrossDomainMessenger } from "./interfaces/L2CrossDomainMessenger.interface.sol"; import { IL1MessageSender } from "../ovm/precompiles/L1MessageSender.interface.sol"; import { IL2ToL1MessagePasser } from "../ovm/precompiles/L2ToL1MessagePasser.interface.sol"; 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/L1CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol similarity index 81% rename from packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.interface.sol rename to packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol index db1fd025358fc..0acfcc4fb8fd2 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.interface.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol @@ -2,7 +2,7 @@ pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /* Library Imports */ -import { DataTypes } from "../utils/libraries/DataTypes.sol"; +import { DataTypes } from "../../utils/libraries/DataTypes.sol"; /** * @title IL1CrossDomainMessenger @@ -51,18 +51,6 @@ contract IL1CrossDomainMessenger { 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. diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L2CrossDomainMessenger.interface.sol similarity index 69% rename from packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.interface.sol rename to packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L2CrossDomainMessenger.interface.sol index 9fa092ea88ad7..292db5eaf9d18 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.interface.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L2CrossDomainMessenger.interface.sol @@ -19,18 +19,6 @@ contract IL2CrossDomainMessenger { * 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. 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/test/contracts/bridge/L1CrossDomainMessenger.spec.ts b/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts index 04333766f335a..e070cbf5fa69e 100644 --- a/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts +++ b/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts @@ -113,7 +113,7 @@ const appendAndGenerateStateBatch = async ( return localBatch } -describe('L1CrossDomainMessenger', () => { +describe.only('L1CrossDomainMessenger', () => { let wallet: Signer before(async () => { ;[wallet] = await ethers.getSigners() diff --git a/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts b/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts index a5152d08ed697..369fe08b9b592 100644 --- a/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts +++ b/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts @@ -19,7 +19,7 @@ const getXDomainCalldata = ( ]) } -describe('L2CrossDomainMessenger', () => { +describe.only('L2CrossDomainMessenger', () => { let wallet: Signer let wallet2: Signer before(async () => { From f75c88bedc529d5dcc12148a566ce9b908c78b1b Mon Sep 17 00:00:00 2001 From: Kevin Ho Date: Wed, 30 Sep 2020 23:07:06 -0400 Subject: [PATCH 2/4] remove other interfaces --- .../bridge/BaseCrossDomainMessenger.sol | 28 -------- .../bridge/L1CrossDomainMessenger.sol | 38 +++++++++- .../bridge/L2CrossDomainMessenger.sol | 24 +++++-- .../L1CrossDomainMessenger.interface.sol | 69 ------------------- .../L2CrossDomainMessenger.interface.sol | 35 ---------- 5 files changed, 56 insertions(+), 138 deletions(-) delete mode 100644 packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol delete mode 100644 packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L2CrossDomainMessenger.interface.sol diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol index c3732bf096525..a2e81807314a2 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol @@ -4,34 +4,6 @@ pragma solidity ^0.5.0; * @title BaseCrossDomainMessenger */ contract BaseCrossDomainMessenger { - /* - * Contract Variables - */ - - mapping (bytes32 => bool) public receivedMessages; - mapping (bytes32 => bool) public sentMessages; - address public targetMessengerAddress; - uint256 public messageNonce; - address public xDomainMessageSender; - - - /* - * Public Functions - */ - - /** - * Sets the target messenger address. - * @param _targetMessengerAddress New messenger address. - */ - function setTargetMessengerAddress( - address _targetMessengerAddress - ) - public - { - targetMessengerAddress = _targetMessengerAddress; - } - - /* * Internal Functions */ diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol index 8cbb74bfffbb4..17eeb3ea354df 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol @@ -5,9 +5,10 @@ pragma experimental ABIEncoderV2; import { ContractResolver } from "../utils/resolvers/ContractResolver.sol"; import { EthMerkleTrie } from "../utils/libraries/EthMerkleTrie.sol"; import { BytesLib } from "../utils/libraries/BytesLib.sol"; +import { DataTypes } from "../utils/libraries/DataTypes.sol"; /* Interface Imports */ -import { IL1CrossDomainMessenger } from "./interfaces/L1CrossDomainMessenger.interface.sol"; +import { ICrossDomainMessenger } from "./interfaces/CrossDomainMessenger.interface.sol"; /* Contract Imports */ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; @@ -17,7 +18,28 @@ import { StateCommitmentChain } from "../chain/StateCommitmentChain.sol"; /** * @title L1CrossDomainMessenger */ -contract L1CrossDomainMessenger is IL1CrossDomainMessenger, BaseCrossDomainMessenger, ContractResolver { +contract L1CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMessenger, ContractResolver { + /* + * 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; + } /* * Constructor */ @@ -37,6 +59,18 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, BaseCrossDomainMesse * Public Functions */ + /** + * Sets the target messenger address. + * @param _targetMessengerAddress New messenger address. + */ + function setTargetMessengerAddress( + address _targetMessengerAddress + ) + public + { + targetMessengerAddress = _targetMessengerAddress; + } + /** * Relays a cross domain message to a contract. * .inheritdoc IL1CrossDomainMessenger diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol index 6430485ae48a5..10a9eb58bc7ee 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; /* Interface Imports */ -import { IL2CrossDomainMessenger } from "./interfaces/L2CrossDomainMessenger.interface.sol"; +import { ICrossDomainMessenger } from "./interfaces/CrossDomainMessenger.interface.sol"; import { IL1MessageSender } from "../ovm/precompiles/L1MessageSender.interface.sol"; import { IL2ToL1MessagePasser } from "../ovm/precompiles/L2ToL1MessagePasser.interface.sol"; @@ -11,14 +11,18 @@ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; /** * @title L2CrossDomainMessenger */ -contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMessenger{ +contract L2CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMessenger { /* * Contract Variables */ + mapping (bytes32 => bool) public receivedMessages; + mapping (bytes32 => bool) public sentMessages; address private l1MessageSenderPrecompileAddress; address private l2ToL1MessagePasserPrecompileAddress; - + address public targetMessengerAddress; + uint256 public messageNonce; + address public xDomainMessageSender; /* * Constructor @@ -43,6 +47,18 @@ contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMesse * Public Functions */ + /** + * Sets the target messenger address. + * @param _targetMessengerAddress New messenger address. + */ + function setTargetMessengerAddress( + address _targetMessengerAddress + ) + public + { + targetMessengerAddress = _targetMessengerAddress; + } + /** * Sends a cross domain message to the target messenger. * .inheritdoc IL2CrossDomainMessenger @@ -50,7 +66,7 @@ contract L2CrossDomainMessenger is IL2CrossDomainMessenger, BaseCrossDomainMesse function sendMessage( address _target, bytes memory _message, - uint256 _gasLimit + uint32 _gasLimit ) public { diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol deleted file mode 100644 index 0acfcc4fb8fd2..0000000000000 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L1CrossDomainMessenger.interface.sol +++ /dev/null @@ -1,69 +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; - - /** - * 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/interfaces/L2CrossDomainMessenger.interface.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L2CrossDomainMessenger.interface.sol deleted file mode 100644 index 292db5eaf9d18..0000000000000 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/interfaces/L2CrossDomainMessenger.interface.sol +++ /dev/null @@ -1,35 +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 - */ - - /** - * 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; -} From 4c8d12ba8b40e64d5f6601af66d13341a349c906 Mon Sep 17 00:00:00 2001 From: Kevin Ho Date: Thu, 1 Oct 2020 01:20:26 -0400 Subject: [PATCH 3/4] lint --- .../contracts/test-helpers/CrossDomainSimpleStorage.sol | 6 +++--- .../test/contracts/bridge/L1CrossDomainMessenger.spec.ts | 2 +- .../test/contracts/bridge/L2CrossDomainMessenger.spec.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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 { diff --git a/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts b/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts index e070cbf5fa69e..04333766f335a 100644 --- a/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts +++ b/packages/contracts/test/contracts/bridge/L1CrossDomainMessenger.spec.ts @@ -113,7 +113,7 @@ const appendAndGenerateStateBatch = async ( return localBatch } -describe.only('L1CrossDomainMessenger', () => { +describe('L1CrossDomainMessenger', () => { let wallet: Signer before(async () => { ;[wallet] = await ethers.getSigners() diff --git a/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts b/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts index 369fe08b9b592..a5152d08ed697 100644 --- a/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts +++ b/packages/contracts/test/contracts/bridge/L2CrossDomainMessenger.spec.ts @@ -19,7 +19,7 @@ const getXDomainCalldata = ( ]) } -describe.only('L2CrossDomainMessenger', () => { +describe('L2CrossDomainMessenger', () => { let wallet: Signer let wallet2: Signer before(async () => { From e76c7247e9b060341799e6630a5a690fc50c96e8 Mon Sep 17 00:00:00 2001 From: Kevin Ho Date: Thu, 1 Oct 2020 12:55:11 -0400 Subject: [PATCH 4/4] move functionality into BaseCrossDomainMessenger --- .../bridge/BaseCrossDomainMessenger.sol | 66 ++++++++++++++++++- .../bridge/L1CrossDomainMessenger.sol | 50 +------------- .../bridge/L2CrossDomainMessenger.sol | 46 +------------ 3 files changed, 68 insertions(+), 94 deletions(-) diff --git a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol index a2e81807314a2..38433921e42b3 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/BaseCrossDomainMessenger.sol @@ -1,9 +1,63 @@ pragma solidity ^0.5.0; +/* Interface Imports */ +import { ICrossDomainMessenger } from "./interfaces/CrossDomainMessenger.interface.sol"; + /** * @title BaseCrossDomainMessenger */ -contract BaseCrossDomainMessenger { +contract BaseCrossDomainMessenger is ICrossDomainMessenger { + /* + * Contract Variables + */ + + mapping (bytes32 => bool) public receivedMessages; + mapping (bytes32 => bool) public sentMessages; + address public targetMessengerAddress; + uint256 public messageNonce; + address public xDomainMessageSender; + + /* + * Public Functions + */ + + /** + * Sets the target messenger address. + * @param _targetMessengerAddress New messenger address. + */ + function setTargetMessengerAddress( + address _targetMessengerAddress + ) + public + { + 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 */ @@ -36,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.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol index 17eeb3ea354df..7f0eddab5a271 100644 --- a/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol +++ b/packages/contracts/contracts/optimistic-ethereum/bridge/L1CrossDomainMessenger.sol @@ -7,9 +7,6 @@ import { EthMerkleTrie } from "../utils/libraries/EthMerkleTrie.sol"; import { BytesLib } from "../utils/libraries/BytesLib.sol"; import { DataTypes } from "../utils/libraries/DataTypes.sol"; -/* Interface Imports */ -import { ICrossDomainMessenger } from "./interfaces/CrossDomainMessenger.interface.sol"; - /* Contract Imports */ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; import { L1ToL2TransactionQueue } from "../queue/L1ToL2TransactionQueue.sol"; @@ -18,16 +15,7 @@ import { StateCommitmentChain } from "../chain/StateCommitmentChain.sol"; /** * @title L1CrossDomainMessenger */ -contract L1CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMessenger, ContractResolver { - /* - * Contract Variables - */ - - mapping (bytes32 => bool) public receivedMessages; - mapping (bytes32 => bool) public sentMessages; - address public targetMessengerAddress; - uint256 public messageNonce; - address public xDomainMessageSender; +contract L1CrossDomainMessenger is BaseCrossDomainMessenger, ContractResolver { /* * Data Structures @@ -59,18 +47,6 @@ contract L1CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMesseng * Public Functions */ - /** - * Sets the target messenger address. - * @param _targetMessengerAddress New messenger address. - */ - function setTargetMessengerAddress( - address _targetMessengerAddress - ) - public - { - targetMessengerAddress = _targetMessengerAddress; - } - /** * Relays a cross domain message to a contract. * .inheritdoc IL1CrossDomainMessenger @@ -115,30 +91,6 @@ contract L1CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMesseng 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.sol b/packages/contracts/contracts/optimistic-ethereum/bridge/L2CrossDomainMessenger.sol index 10a9eb58bc7ee..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 { ICrossDomainMessenger } from "./interfaces/CrossDomainMessenger.interface.sol"; import { IL1MessageSender } from "../ovm/precompiles/L1MessageSender.interface.sol"; import { IL2ToL1MessagePasser } from "../ovm/precompiles/L2ToL1MessagePasser.interface.sol"; @@ -11,18 +10,13 @@ import { BaseCrossDomainMessenger } from "./BaseCrossDomainMessenger.sol"; /** * @title L2CrossDomainMessenger */ -contract L2CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMessenger { +contract L2CrossDomainMessenger is BaseCrossDomainMessenger { /* * Contract Variables */ - mapping (bytes32 => bool) public receivedMessages; - mapping (bytes32 => bool) public sentMessages; address private l1MessageSenderPrecompileAddress; address private l2ToL1MessagePasserPrecompileAddress; - address public targetMessengerAddress; - uint256 public messageNonce; - address public xDomainMessageSender; /* * Constructor @@ -47,42 +41,6 @@ contract L2CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMesseng * Public Functions */ - /** - * Sets the target messenger address. - * @param _targetMessengerAddress New messenger address. - */ - function setTargetMessengerAddress( - address _targetMessengerAddress - ) - public - { - 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; - } - /** * Relays a cross domain message to a contract. * .inheritdoc IL2CrossDomainMessenger @@ -150,7 +108,7 @@ contract L2CrossDomainMessenger is ICrossDomainMessenger, BaseCrossDomainMesseng */ function _sendXDomainMessage( bytes memory _message, - uint256 _gasLimit + uint32 _gasLimit ) internal {