Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/122 Add TokenBridge e2e tests #210

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,42 @@ deploy-l2messageservice:
L2MSGSERVICE_RATE_LIMIT_AMOUNT=1000000000000000000000 \
npx hardhat deploy --no-compile --network zkevm_dev --tags L2MessageService

deploy-token-bridge-l1:
# WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE
cd contracts/; \
PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
BLOCKCHAIN_NODE=http:\\localhost:8445/ \
REMOTE_CHAIN_ID=1337 \
TOKEN_BRIDGE_L1=true \
TOKEN_BRIDGE_SECURITY_COUNCIL=0x90F79bf6EB2c4f870365E785982E1f101E93b906 \
L2_MESSAGE_SERVICE_ADDRESS=0xe537D669CA013d86EBeF1D64e40fC74CADC91987 \
LINEA_ROLLUP_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 \
npx hardhat deploy --network zkevm_dev --tags BridgedToken,TokenBridge

deploy-token-bridge-l2:
# WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE
cd contracts/; \
SAVE_ADDRESS=true \
PRIVATE_KEY=0x1dd171cec7e2995408b5513004e8207fe88d6820aeff0d82463b3e41df251aae \
BLOCKCHAIN_NODE=http:\\localhost:8545/ \
REMOTE_CHAIN_ID=31648428 \
TOKEN_BRIDGE_L1=false \
TOKEN_BRIDGE_SECURITY_COUNCIL=0xf17f52151EbEF6C7334FAD080c5704D77216b732 \
L2_MESSAGE_SERVICE_ADDRESS=0xe537D669CA013d86EBeF1D64e40fC74CADC91987 \
LINEA_ROLLUP_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 \
npx hardhat deploy --network zkevm_dev --tags BridgedToken,TokenBridge

deploy-test-erc20:
# WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE
cd contracts/; \
PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
BLOCKCHAIN_NODE=http:\\localhost:8445/ \
TEST_ERC20_NAME=TestERC20 \
TEST_ERC20_SYMBOL=TERC20 \
TEST_ERC20_INITIAL_SUPPLY=100000 \
TEST_ERC20_MINT_RECEIVER=0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 \
npx hardhat deploy --network zkevm_dev --tags TestERC20

upgrade-linea-rollup-on-uat:
cd contracts/; \
rm -f .openzeppelin/goerli.json; \
Expand Down Expand Up @@ -153,6 +189,8 @@ deploy-contracts-v4:
deploy-contracts:
make compile-contracts
$(MAKE) -j2 deploy-linea-rollup deploy-l2messageservice
$(MAKE) -j2 deploy-token-bridge-l1 deploy-token-bridge-l2
$(MAKE) -j1 deploy-test-erc20

testnet-start-l2:
docker compose -f docker/compose.yml -f docker/compose-testnet-sync.overrides.yml --profile l2 up -d
Expand Down
1 change: 1 addition & 0 deletions contracts/common/deployments/zkevm_dev/.chainId
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1337
5 changes: 5 additions & 0 deletions contracts/common/deployments/zkevm_dev/BridgedToken.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"address": "0xeB0b0a14F92e3BA35aEF3a2B6A24D7ED1D11631B",
"abi": "[{\"type\":\"constructor\",\"stateMutability\":\"undefined\",\"payable\":false,\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBridge\",\"inputs\":[{\"type\":\"address\",\"name\":\"bridgeAddress\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"_decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"bridge\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"initialize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"_tokenName\"},{\"type\":\"string\",\"name\":\"_tokenSymbol\"},{\"type\":\"uint8\",\"name\":\"_tokenDecimals\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_recipient\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"\"}]}]",
"transactionHash": "0x8a67127a873dc0a87c530d09c1cef836f84d445edffd964eae1b3a609c796c9b"
}
5 changes: 5 additions & 0 deletions contracts/common/deployments/zkevm_dev/TokenBridge.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"address": "0x35a5E43D3d3195B49CBFE78CD944115eAA2e09dB",
"abi": null,
"transactionHash": null
}
40 changes: 40 additions & 0 deletions contracts/contracts/tokenBridge/mocks/TestERC20.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
* @title TestERC20
* @dev Simple ERC20 Token example.
*/

contract TestERC20 is ERC20, Ownable {
/**
* @dev Constructor that gives msg.sender all of existing tokens.
*/

constructor(string memory _name, string memory _symbol, uint256 _initialSupply, address _mintReceiver) ERC20(_name, _symbol) {
_mint(_mintReceiver, _initialSupply);
}

/**
* @dev Function to mint tokens
* @param _to The address that will receive the minted tokens.
* @param _amount The amount of tokens to mint.
*/

function mint(address _to, uint256 _amount) public onlyOwner {
_mint(_to, _amount);
}

/**
* @dev Function to burn tokens
* @param _amount The amount of tokens to burn.
*/

function burn(uint256 _amount) public {
_burn(msg.sender, _amount);
}
}
6 changes: 5 additions & 1 deletion contracts/deploy/05_deploy_BridgedToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {

await tryStoreAddress(network.name, contractName, bridgedTokenAddress, deployTx.hash);

console.log(`BridgedToken beacon deployed on ${network.name}, at address:`, bridgedTokenAddress);
if (process.env.TOKEN_BRIDGE_L1 === "true") {
console.log(`L1 BridgedToken beacon deployed on ${network.name}, at address:`, bridgedTokenAddress);
} else {
console.log(`L2 BridgedToken beacon deployed on ${network.name}, at address:`, bridgedTokenAddress);
}

await tryVerifyContract(bridgedTokenAddress);
};
Expand Down
7 changes: 5 additions & 2 deletions contracts/deploy/06_deploy_TokenBridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {

await tryStoreProxyAdminAddress(network.name, contractName, proxyAdminAddress);

console.log(`TokenBridge deployed on ${network.name}, at address: ${tokenBridgeAddress}`);

if (process.env.TOKEN_BRIDGE_L1 === "true") {
console.log(`L1 TokenBridge deployed on ${network.name}, at address: ${tokenBridgeAddress}`);
} else {
console.log(`L2 TokenBridge deployed on ${network.name}, at address: ${tokenBridgeAddress}`);
}
await tryVerifyContract(tokenBridgeAddress);
};
export default func;
Expand Down
55 changes: 55 additions & 0 deletions contracts/deploy/11_deploy_TestERC20.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { ethers, network } from "hardhat";
import { DeployFunction } from "hardhat-deploy/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import {
getRequiredEnvVar,
tryVerifyContract,
tryStoreAddress,
validateDeployBranchAndTags,
getDeployedContractAddress,
} from "../common/helpers";

const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments } = hre;
validateDeployBranchAndTags(hre.network.name);

const contractName = "TestERC20";
const existingContractAddress = await getDeployedContractAddress(contractName, deployments);

const tokenName = getRequiredEnvVar("TEST_ERC20_NAME");
const tokenSymbol = getRequiredEnvVar("TEST_ERC20_SYMBOL");
const initialSupply = getRequiredEnvVar("TEST_ERC20_INITIAL_SUPPLY");
const mintReceiver = getRequiredEnvVar("TEST_ERC20_MINT_RECEIVER");

if (!existingContractAddress) {
console.log(`Deploying initial version, NB: the address will be saved if env SAVE_ADDRESS=true.`);
} else {
console.log(`Deploying new version, NB: ${existingContractAddress} will be overwritten if env SAVE_ADDRESS=true.`);
}

const TestERC20Factory = await ethers.getContractFactory(contractName);
const contract = await TestERC20Factory.deploy(
tokenName,
tokenSymbol,
ethers.parseEther(initialSupply),
mintReceiver,
);

await contract.waitForDeployment();
const contractAddress = await contract.getAddress();

console.log(`${contractName} deployed at ${contractAddress}`);

const deployTx = contract.deploymentTransaction();
if (!deployTx) {
throw "Deployment transaction not found.";
}

await tryStoreAddress(network.name, contractName, contractAddress, deployTx.hash);

console.log(`${contractName} deployed on ${network.name}, at address: ${contractAddress}`);
await tryVerifyContract(contractAddress);
};

export default func;
func.tags = ["TestERC20"];
2 changes: 1 addition & 1 deletion docker/config/linea-local-dev-genesis-PoA.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"f17f52151EbEF6C7334FAD080c5704D77216b732": {
"@WARNING": "FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE",
"privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f",
"comment": "account 3, can be used as end user",
"comment": "L2 Security Council",
"balance": "90000000000000000000003"
},
"6d26dcc30a1693043aefa35ed9171c16da53f275": {
Expand Down
Loading
Loading