Skip to content

Commit

Permalink
rename everything to ZkEVM, add origin network check and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
0xdapper committed Nov 2, 2023
1 parent 437fcc4 commit 47349cc
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 43 deletions.
38 changes: 38 additions & 0 deletions src/ZkEVMReceiver.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.0;

interface IZkEVMBridgeMessageReceiver {
function onMessageReceived(address originAddress, uint32 originNetwork, bytes calldata data) external payable;
}

/**
* @title ZkEVMReceiver
* @notice Receive messages to a zkevm chain
*/
abstract contract ZkEVMReceiver is IZkEVMBridgeMessageReceiver {
address public immutable l1Authority;
uint32 public immutable originNetworkId;
address public constant bridge = 0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe;

constructor(address _l1Authority, uint32 _originNetworkId) {
l1Authority = _l1Authority;
originNetworkId = _originNetworkId;
}

modifier onlyCrossChainMessage() {
require(msg.sender == address(this), "Receiver/invalid-sender");
_;
}

function onMessageReceived(address originAddress, uint32 originNetwork, bytes calldata data) external payable {
require(msg.sender == bridge, "Receiver/invalid-sender");
require(originNetwork == originNetworkId, "Receiver/invalid-originNetwork");
require(originAddress == l1Authority, "Receiver/invalid-l1Authority");
(bool success, bytes memory ret) = address(this).call(data);
if (!success) {
assembly {
revert(add(ret, 0x20), mload(ret))
}
}
}
}
35 changes: 0 additions & 35 deletions src/ZkEvmReceiver.sol

This file was deleted.

30 changes: 22 additions & 8 deletions test/ZkEVMIntegration.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,38 @@ pragma solidity >=0.8.0;
import "./IntegrationBase.t.sol";

import { ZkEVMDomain } from "../src/testing/ZkEVMDomain.sol";
import { ZkEvmReceiver } from "../src/ZkEvmReceiver.sol";
import { ZkEVMReceiver } from "../src/ZkEVMReceiver.sol";

contract ZkevmMessageOrdering is MessageOrdering, ZkEvmReceiver {
constructor(address l1Authority) ZkEvmReceiver(l1Authority) {}
contract ZkevmMessageOrdering is MessageOrdering, ZkEVMReceiver {
constructor(address l1Authority, uint32 networkId) ZkEVMReceiver(l1Authority, networkId) {}

function push(uint256 messageId) public override onlySelf {
function push(uint256 messageId) public override onlyCrossChainMessage {
super.push(messageId);
}

}

contract ZkEVMIntegrationTest is IntegrationBaseTest {
address l2Authority = makeAddr("l2Authority");
address l2Authority = makeAddr("l2Authority");
address notL2Authority = makeAddr("notL2Authority");

function test_zkevm() public {
setChain("zkevm", ChainData("ZkEVM", 1101, "https://zkevm-rpc.com"));

checkZkEVMStyle(new ZkEVMDomain(getChain("zkevm"), mainnet));
}

function checkZkEVMStyle(ZkEVMDomain zkevm) public {
function checkZkEVMStyle(ZkEVMDomain zkevm) public {
Domain host = zkevm.hostDomain();

host.selectFork();

ZkevmMessageOrdering moHost = new ZkevmMessageOrdering(l2Authority);
// origin network of the other leg, so 1 for host and 0 for l2
ZkevmMessageOrdering moHost = new ZkevmMessageOrdering(l2Authority, 1);

zkevm.selectFork();

ZkevmMessageOrdering moZkevm = new ZkevmMessageOrdering(l1Authority);
ZkevmMessageOrdering moZkevm = new ZkevmMessageOrdering(l1Authority, 0);

vm.startPrank(l2Authority);
// Queue up two more L2 -> L1 messages
Expand Down Expand Up @@ -77,6 +79,18 @@ contract ZkEVMIntegrationTest is IntegrationBaseTest {
zkevm.selectFork();
vm.expectRevert("Receiver/invalid-sender");
moZkevm.push(999);

// validate message sender is bridge
vm.expectRevert("Receiver/invalid-sender");
moZkevm.onMessageReceived(address(moHost), 0, abi.encodeCall(MessageOrdering.push, (1000)));

// validate origin network is correct
// cannot queue from l1 and relayFromHost because relayFromHost filters
// on the basis of origin network being 1
vm.startPrank(moZkevm.bridge());
vm.expectRevert("Receiver/invalid-originNetwork");
moZkevm.onMessageReceived(address(moZkevm), 2, abi.encodeCall(MessageOrdering.push, (1001)));
vm.stopPrank();
}

}

0 comments on commit 47349cc

Please sign in to comment.