Skip to content

Commit

Permalink
deploy relayer
Browse files Browse the repository at this point in the history
  • Loading branch information
PengDeng-Cyber committed May 21, 2024
1 parent e489ea3 commit 2cb93b3
Show file tree
Hide file tree
Showing 8 changed files with 169 additions and 1 deletion.
1 change: 1 addition & 0 deletions docs/deploy/cyber-7560/contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@
| CyberPaymaster | 0x672cf56a66b6f6a0a97f188abe57249fb7eef909 |
| CyberFrog | 0xfe98ba9d562f8359981269c9e22fdbf02717b723 |
| CyberNewEra | 0x4d5a1bf279aa7371e230df48a89fab822e4ad30e |
| CyberRelayer | 0x471b3e1006043556c7cee4e0aa374281fc92f95e |
1 change: 1 addition & 0 deletions docs/deploy/cyber_testnet-111557560/contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
| TokenReceiver | 0xcd97405fb58e94954e825e46db192b916a45d412 |
| CyberPaymaster | 0x672cf56a66b6f6a0a97f188abe57249fb7eef909 |
| CyberNewEra | 0xa621ba705b4f6e5afad33839ed2fbd79a181992b |
| CyberRelayer | 0x471b3e1006043556c7cee4e0aa374281fc92f95e |
1 change: 1 addition & 0 deletions docs/deploy/op-10/contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@
| CyberVaultV3(Impl) | 0x2bd76f186d9c160b79beae8c02ec8f9bc50eae10 |
| WorkInCryptoNFT | 0xb76d6fb6fabf0b1b6d08878e95f9bae630033b16 |
| CyberNewEraGate | 0x23e235ae376f08a9c2e6d08a8bfa8f171306a112 |
| GasBridge | 0xfdf7c22ca4704dfef46e7e5ef53dca1d5a9f8e12 |
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
"deploy_stakingpool:eth": "source .env.eth && FOUNDRY_PROFILE=prd forge script script/DeployStakingPool.s.sol:DeployStakingPool --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
"deploy_gas_bridge:sepolia": "source .env.sepolia && FOUNDRY_PROFILE=stg forge script script/DeployGasBridge.s.sol:DeployGasBridge --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
"verify_gas_bridge:sepolia": "source .env.sepolia && ETHERSCAN_API_KEY=$API_KEY forge verify-contract --chain-id 11155111 --compiler-version v0.8.14+commit.80d49f37 --constructor-args 0000000000000000000000007884f7f04f994da14302a16cf15e597e31eebecf 0x26eb5499461f14b00f4c4ef52bf29264476018b3 src/periphery/GasBridge.sol:GasBridge",
"deploy_gas_bridge:op": "source .env.op && FOUNDRY_PROFILE=prd forge script script/DeployGasBridge.s.sol:DeployGasBridge --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
"deploy_cyber_new_era_gate:sepolia": "source .env.sepolia && FOUNDRY_PROFILE=stg forge script script/DeployCyberNewEraGate.s.sol:DeployCyberNewEraGate --legacy --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
"deploy_cyber_new_era_gate:arb": "source .env.arb && FOUNDRY_PROFILE=prd forge script script/DeployCyberNewEraGate.s.sol:DeployCyberNewEraGate --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
"deploy_cyber_new_era_gate:base": "source .env.base && FOUNDRY_PROFILE=prd forge script script/DeployCyberNewEraGate.s.sol:DeployCyberNewEraGate --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
Expand All @@ -155,6 +156,8 @@
"deploy_cyber_new_era_gate:op": "source .env.op && FOUNDRY_PROFILE=prd forge script script/DeployCyberNewEraGate.s.sol:DeployCyberNewEraGate --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --etherscan-api-key $API_KEY -vvv",
"deploy_cyber_new_era:cyber_testnet": "source .env.cyber_testnet && FOUNDRY_PROFILE=stg forge script script/DeployCyberNewEra.s.sol:DeployCyberNewEra --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --verifier blockscout --verifier-url https://api.socialscan.io/cyber-testnet/v1/explorer/command_api/contract --chain-id 111557560 -vvv",
"deploy_cyber_new_era:cyber": "source .env.cyber && FOUNDRY_PROFILE=prd forge script script/DeployCyberNewEra.s.sol:DeployCyberNewEra --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --verifier blockscout --verifier-url https://api.socialscan.io/cyber/v1/explorer/command_api/contract --chain-id 7560 -vvv",
"deploy_cyber_relayer:cyber_testnet": "source .env.cyber_testnet.owner && FOUNDRY_PROFILE=stg forge script script/DeployCyberRelayer.s.sol:DeployCyberRelayer --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --verifier blockscout --verifier-url https://api.socialscan.io/cyber-testnet/v1/explorer/command_api/contract --chain-id 111557560 -vvv",
"deploy_cyber_relayer:cyber": "source .env.cyber.owner && FOUNDRY_PROFILE=prd forge script script/DeployCyberRelayer.s.sol:DeployCyberRelayer --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow --verify --verifier blockscout --verifier-url https://api.socialscan.io/cyber/v1/explorer/command_api/contract --chain-id 7560 -vvv",
"set_stakingpool:sepolia": "source .env.sepolia.owner && FOUNDRY_PROFILE=stg forge script script/DeployStakingPool.s.sol:SetStakingPool --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow -vvv",
"set_stakingpool:eth": "source .env.eth.owner && FOUNDRY_PROFILE=prd forge script script/DeployStakingPool.s.sol:SetStakingPool --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --slow -vvv",
"change_owner:polygon": "source .env.polygon.owner && FOUNDRY_PROFILE=prd forge script script/ChangeOwner.s.sol:ChangeOwner --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --legacy --etherscan-api-key $API_KEY -vvv",
Expand Down
29 changes: 29 additions & 0 deletions script/DeployCyberRelayer.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.14;

import "forge-std/Script.sol";
import { DeploySetting } from "./libraries/DeploySetting.sol";
import { LibDeploy } from "./libraries/LibDeploy.sol";

contract DeployCyberRelayer is Script, DeploySetting {
function run() external {
_setDeployParams();
vm.startBroadcast();

if (
block.chainid == DeploySetting.CYBER_TESTNET ||
block.chainid == DeploySetting.CYBER
) {
LibDeploy.deployCyberRelayer(
vm,
deployParams.deployerContract,
deployParams.protocolOwner,
deployParams.backendSigner
);
} else {
revert("UNSUPPORTED_CHAIN");
}
vm.stopBroadcast();
}
}
5 changes: 4 additions & 1 deletion script/DeployGasBridge.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ contract DeployGasBridge is Script, DeploySetting {
_setDeployParams();
vm.startBroadcast();

if (block.chainid == DeploySetting.SEPOLIA) {
if (
block.chainid == DeploySetting.SEPOLIA ||
block.chainid == DeploySetting.OPTIMISM
) {
LibDeploy.deployGasBridge(
vm,
deployParams.deployerContract,
Expand Down
24 changes: 24 additions & 0 deletions script/libraries/LibDeploy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import { WorkInCryptoNFT } from "../../src/periphery/WorkInCryptoNFT.sol";
import { GasBridge } from "../../src/periphery/GasBridge.sol";
import { CyberNewEraGate } from "../../src/periphery/CyberNewEraGate.sol";
import { CyberNewEra } from "../../src/periphery/CyberNewEra.sol";
import { CyberRelayer } from "../../src/periphery/CyberRelayer.sol";
import { CyberPaymaster } from "../../src/paymaster/CyberPaymaster.sol";
import { UUPSUpgradeable } from "openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol";
import { CyberFrog } from "../../src/periphery/CyberFrog.sol";
Expand Down Expand Up @@ -395,6 +396,29 @@ library LibDeploy {
_write(vm, "GasBridge", gasBridge);
}

function deployCyberRelayer(
Vm vm,
address _dc,
address owner,
address backendSigner
) internal {
Create2Deployer dc = Create2Deployer(_dc);
address cyberRelayer = dc.deploy(
abi.encodePacked(
type(CyberRelayer).creationCode,
abi.encode(owner)
),
SALT
);

CyberRelayer(cyberRelayer).grantRole(
keccak256("RELAYER_ROLE"),
backendSigner
);

_write(vm, "CyberRelayer", cyberRelayer);
}

function deployCyberNewEraGate(
Vm vm,
address _dc,
Expand Down
106 changes: 106 additions & 0 deletions src/periphery/CyberRelayer.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
pragma solidity ^0.8.0;

import { IERC20 } from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import { SafeERC20 } from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
import { AccessControlEnumerable } from "openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol";

contract CyberRelayer is AccessControlEnumerable {
using SafeERC20 for IERC20;

/*//////////////////////////////////////////////////////////////
EVENT
//////////////////////////////////////////////////////////////*/

event Relayed(bytes32 relayId);

/*//////////////////////////////////////////////////////////////
STORAGE
//////////////////////////////////////////////////////////////*/

bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE");
mapping(bytes32 => bool) public relayed;

/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/

constructor(address owner) {
_grantRole(DEFAULT_ADMIN_ROLE, owner);
}

/*//////////////////////////////////////////////////////////////
ONLY RELAYER
//////////////////////////////////////////////////////////////*/

function relay(
bytes32 relayId,
address to,
uint256 value,
bytes calldata data
) external payable onlyRole(RELAYER_ROLE) {
require(msg.value == value, "INVALID_VALUE");
require(!relayed[relayId], "ALREADY_RELAYED");
relayed[relayId] = true;
bool success;
bytes memory ret;

if (data.length == 0) {
// explicitly call transfer to limit gas to 2300
payable(to).transfer(value);
} else {
(success, ret) = _call(to, value, data);
if (!success) {
assembly {
revert(add(ret, 32), mload(ret))
}
}
}

emit Relayed(relayId);
}

/*//////////////////////////////////////////////////////////////
ONLY ADMIN
//////////////////////////////////////////////////////////////*/

function withdraw(
address to,
address token,
uint256 amount
) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (token == address(0)) {
(bool success, ) = to.call{ value: amount }("");
require(success, "WITHDRAW_FAILED");
} else {
IERC20(token).safeTransfer(to, amount);
}
}

/*//////////////////////////////////////////////////////////////
PRIVATE
//////////////////////////////////////////////////////////////*/

function _call(
address to,
uint256 value,
bytes memory data
) private returns (bool success, bytes memory returnData) {
assembly {
success := call(
gas(),
to,
value,
add(data, 0x20),
mload(data),
0,
0
)
let len := returndatasize()
let ptr := mload(0x40)
mstore(0x40, add(ptr, add(len, 0x20)))
mstore(ptr, len)
returndatacopy(add(ptr, 0x20), 0, len)
returnData := ptr
}
}
}

0 comments on commit 2cb93b3

Please sign in to comment.