Skip to content

Commit

Permalink
add zkpolygon example (#63)
Browse files Browse the repository at this point in the history
* deploy and init

* add syncBatchRoot case(unfinished)

* v1 unfinished

* add zkpolygon example

* fix package name
  • Loading branch information
zkJoaquin authored Mar 1, 2024
1 parent 3d8b758 commit 5f87d03
Show file tree
Hide file tree
Showing 14 changed files with 4,607 additions and 10 deletions.
18 changes: 14 additions & 4 deletions contracts/gateway/zkpolygon/ZkPolygonL1Gateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ pragma solidity ^0.8.0;
import {IZkPolygon} from "../../interfaces/zkpolygon/IZkPolygon.sol";
import {IArbitrator} from "../../interfaces/IArbitrator.sol";
import {L1BaseGateway} from "../L1BaseGateway.sol";
import {IMessageClaimer} from "../../interfaces/IMessageClaimer.sol";
import {IBridgeMessageReceiver} from "../../interfaces/zkpolygon/IBridgeMessageReceiver.sol";
import {BaseGateway} from "../BaseGateway.sol";

contract ZkPolygonL1Gateway is IMessageClaimer, L1BaseGateway, BaseGateway {
contract ZkPolygonL1Gateway is IBridgeMessageReceiver, L1BaseGateway, BaseGateway {
/// @notice ZkPolygon message service on local chain
IZkPolygon public immutable MESSAGE_SERVICE;

Expand All @@ -34,7 +34,9 @@ contract ZkPolygonL1Gateway is IMessageClaimer, L1BaseGateway, BaseGateway {
}

function sendMessage(uint256 _value, bytes memory _callData, bytes memory) external payable onlyArbitrator {
bytes memory executeData = abi.encodeCall(IMessageClaimer.claimMessageCallback, (_value, _callData));
require(msg.value == _value, "Invalid value");

bytes memory executeData = abi.encode(_value, _callData);
MESSAGE_SERVICE.bridgeMessage{value: msg.value}(
ETH_NETWORK_ID,
remoteGateway,
Expand All @@ -43,8 +45,16 @@ contract ZkPolygonL1Gateway is IMessageClaimer, L1BaseGateway, BaseGateway {
);
}

function claimMessageCallback(uint256 _value, bytes memory _callData) external payable override onlyMessageService {
function onMessageReceived(
address originAddress,
uint32,
bytes memory data
) external payable override onlyMessageService {
require(originAddress == remoteGateway, "Invalid origin address");

(uint256 _value, bytes memory _callData) = abi.decode(data, (uint256, bytes));
require(msg.value == _value, "Invalid value");

ARBITRATOR.receiveMessage{value: _value}(_value, _callData);
}
}
18 changes: 14 additions & 4 deletions contracts/gateway/zkpolygon/ZkPolygonL2Gateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
pragma solidity ^0.8.0;

import {IZkPolygon} from "../../interfaces/zkpolygon/IZkPolygon.sol";
import {IMessageClaimer} from "../../interfaces/IMessageClaimer.sol";
import {IBridgeMessageReceiver} from "../../interfaces/zkpolygon/IBridgeMessageReceiver.sol";
import {L2BaseGateway} from "../L2BaseGateway.sol";
import {BaseGateway} from "../BaseGateway.sol";

contract ZkPolygonL2Gateway is IMessageClaimer, L2BaseGateway, BaseGateway {
contract ZkPolygonL2Gateway is IBridgeMessageReceiver, L2BaseGateway, BaseGateway {
/// @notice ZkPolygon message service on local chain
IZkPolygon public immutable MESSAGE_SERVICE;

Expand All @@ -30,7 +30,10 @@ contract ZkPolygonL2Gateway is IMessageClaimer, L2BaseGateway, BaseGateway {
}

function sendMessage(uint256 _value, bytes memory _callData) external payable onlyZkLink {
bytes memory executeData = abi.encodeCall(IMessageClaimer.claimMessageCallback, (_value, _callData));
// no fee
require(msg.value == _value, "Invalid value");

bytes memory executeData = abi.encode(_value, _callData);
MESSAGE_SERVICE.bridgeMessage{value: msg.value}(
ETH_NETWORK_ID,
remoteGateway,
Expand All @@ -40,8 +43,15 @@ contract ZkPolygonL2Gateway is IMessageClaimer, L2BaseGateway, BaseGateway {
emit L2GatewayMessageSent(_value, _callData);
}

function claimMessageCallback(uint256 _value, bytes memory _callData) external payable onlyMessageService {
function onMessageReceived(
address originAddress,
uint32,
bytes memory data
) external payable override onlyMessageService {
require(originAddress == remoteGateway, "Invalid origin address");
(uint256 _value, bytes memory _callData) = abi.decode(data, (uint256, bytes));
require(msg.value == _value, "Invalid value");

(bool success, ) = ZKLINK.call{value: _value}(_callData);
require(success, "Call zkLink failed");
}
Expand Down
9 changes: 9 additions & 0 deletions contracts/interfaces/zkpolygon/IBridgeMessageReceiver.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.0;

/**
* @dev Define interface for PolygonZkEVM Bridge message receiver
*/
interface IBridgeMessageReceiver {
function onMessageReceived(address originAddress, uint32 originNetwork, bytes memory data) external payable;
}
21 changes: 21 additions & 0 deletions examples/zkpolygon/.env-sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# This is a sample .env file for use in local development.

# Duplicate this file as .env here

# Your Private key

DEVNET_PRIVKEY="0x your key here"

# Hosted Aggregator Node (JSON-RPC Endpoint). This is zkPolygon Goerli Testnet, can use any zkPolygon chain

L2RPC="https://rpc.public.zkevm-test.net"

# Ethereum RPC; i.e., for Goerli https://goerli.infura.io/v3/<your infura key>

L1RPC=""

# zkPolygon chain name
ZKPOLYGON="ZKPOLYGONTEST"

# Ethereum chain name
ETHEREUM="GOERLI"
1 change: 1 addition & 0 deletions examples/zkpolygon/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.env
14 changes: 14 additions & 0 deletions examples/zkpolygon/hardhat.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
require('@nomiclabs/hardhat-ethers');
require('./scripts/syncL2Requests');
require('./scripts/syncBatchRoot');
require('./scripts/setValidator');
require('./scripts/changeFeeParams');

const BaseConfig = require('../../hardhat.base.config');

module.exports = Object.assign({}, BaseConfig, {
paths: {
cache: '../../cache',
artifacts: '../../artifacts',
},
});
Loading

0 comments on commit 5f87d03

Please sign in to comment.