Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
cecb3c16
Commit
cecb3c16
authored
Nov 01, 2023
by
Mark Tyneway
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
contracts-bedrock: modularize L2 setup
parent
6e890faf
Changes
44
Hide whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
536 additions
and
87 deletions
+536
-87
foundry.toml
packages/contracts-bedrock/foundry.toml
+0
-1
BenchmarkTest.t.sol
packages/contracts-bedrock/test/BenchmarkTest.t.sol
+7
-5
CrossDomainMessenger.t.sol
packages/contracts-bedrock/test/CrossDomainMessenger.t.sol
+3
-4
CrossDomainOwnable.t.sol
packages/contracts-bedrock/test/CrossDomainOwnable.t.sol
+2
-2
CrossDomainOwnable2.t.sol
packages/contracts-bedrock/test/CrossDomainOwnable2.t.sol
+4
-4
CrossDomainOwnable3.t.sol
packages/contracts-bedrock/test/CrossDomainOwnable3.t.sol
+2
-2
DelayedVetoable.t.sol
packages/contracts-bedrock/test/DelayedVetoable.t.sol
+1
-1
DisputeGameFactory.t.sol
packages/contracts-bedrock/test/DisputeGameFactory.t.sol
+2
-2
Encoding.t.sol
packages/contracts-bedrock/test/Encoding.t.sol
+1
-1
FeeVault.t.sol
packages/contracts-bedrock/test/FeeVault.t.sol
+1
-1
GasPriceOracle.t.sol
packages/contracts-bedrock/test/GasPriceOracle.t.sol
+1
-1
GovernanceToken.t.sol
packages/contracts-bedrock/test/GovernanceToken.t.sol
+1
-1
Hashing.t.sol
packages/contracts-bedrock/test/Hashing.t.sol
+1
-1
Initializable.t.sol
packages/contracts-bedrock/test/Initializable.t.sol
+1
-1
L1Block.t.sol
packages/contracts-bedrock/test/L1Block.t.sol
+1
-1
L1CrossDomainMessenger.t.sol
packages/contracts-bedrock/test/L1CrossDomainMessenger.t.sol
+2
-3
L1ERC721Bridge.t.sol
packages/contracts-bedrock/test/L1ERC721Bridge.t.sol
+1
-1
L1StandardBridge.t.sol
packages/contracts-bedrock/test/L1StandardBridge.t.sol
+1
-1
L2CrossDomainMessenger.t.sol
packages/contracts-bedrock/test/L2CrossDomainMessenger.t.sol
+2
-2
L2ERC721Bridge.t.sol
packages/contracts-bedrock/test/L2ERC721Bridge.t.sol
+1
-1
L2OutputOracle.t.sol
packages/contracts-bedrock/test/L2OutputOracle.t.sol
+6
-6
L2StandardBridge.t.sol
packages/contracts-bedrock/test/L2StandardBridge.t.sol
+1
-1
L2ToL1MessagePasser.t.sol
packages/contracts-bedrock/test/L2ToL1MessagePasser.t.sol
+1
-13
LegacyERC20ETH.t.sol
packages/contracts-bedrock/test/LegacyERC20ETH.t.sol
+1
-1
LegacyMessagePasser.t.sol
packages/contracts-bedrock/test/LegacyMessagePasser.t.sol
+1
-1
LibPosition.t.sol
packages/contracts-bedrock/test/LibPosition.t.sol
+1
-1
MIPS.t.sol
packages/contracts-bedrock/test/MIPS.t.sol
+1
-1
MintManager.t.sol
packages/contracts-bedrock/test/MintManager.t.sol
+1
-1
OptimismMintableERC20.t.sol
packages/contracts-bedrock/test/OptimismMintableERC20.t.sol
+1
-1
OptimismMintableERC20Factory.t.sol
...contracts-bedrock/test/OptimismMintableERC20Factory.t.sol
+1
-1
OptimismMintableERC721.t.sol
packages/contracts-bedrock/test/OptimismMintableERC721.t.sol
+1
-1
OptimismMintableERC721Factory.t.sol
...ontracts-bedrock/test/OptimismMintableERC721Factory.t.sol
+1
-1
OptimismPortal.t.sol
packages/contracts-bedrock/test/OptimismPortal.t.sol
+19
-9
ProtocolVersions.t.sol
packages/contracts-bedrock/test/ProtocolVersions.t.sol
+1
-1
SequencerFeeVault.t.sol
packages/contracts-bedrock/test/SequencerFeeVault.t.sol
+3
-3
StandardBridge.t.sol
packages/contracts-bedrock/test/StandardBridge.t.sol
+1
-1
SystemConfig.t.sol
packages/contracts-bedrock/test/SystemConfig.t.sol
+1
-1
CrossDomainMessenger.t.sol
...tracts-bedrock/test/invariants/CrossDomainMessenger.t.sol
+3
-2
L2OutputOracle.t.sol
...es/contracts-bedrock/test/invariants/L2OutputOracle.t.sol
+2
-2
OptimismPortal.t.sol
...es/contracts-bedrock/test/invariants/OptimismPortal.t.sol
+3
-3
Bridge_Initializer.sol
packages/contracts-bedrock/test/setup/Bridge_Initializer.sol
+69
-0
CommonTest.sol
packages/contracts-bedrock/test/setup/CommonTest.sol
+84
-0
Events.sol
packages/contracts-bedrock/test/setup/Events.sol
+97
-0
Setup.sol
packages/contracts-bedrock/test/setup/Setup.sol
+201
-0
No files found.
packages/contracts-bedrock/foundry.toml
View file @
cecb3c16
...
...
@@ -59,4 +59,3 @@ runs = 512
[profile.lite]
optimizer
=
false
packages/contracts-bedrock/test/BenchmarkTest.t.sol
View file @
cecb3c16
...
...
@@ -4,16 +4,18 @@ pragma solidity 0.8.15;
// Testing utilities
import { Test } from "forge-std/Test.sol";
import { Vm } from "forge-std/Vm.sol";
import "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { Types } from "src/libraries/Types.sol";
// Free function for setting the prevBaseFee param in the OptimismPortal.
function setPrevBaseFee(Vm _vm, address _op, uint128 _prevBaseFee) {
_vm.store(address(_op), bytes32(uint256(1)), bytes32((block.number << 192) | _prevBaseFee));
}
contract SetPrevBaseFee_Test is
Portal_Initializer
{
contract SetPrevBaseFee_Test is
CommonTest
{
function test_setPrevBaseFee_succeeds() external {
setPrevBaseFee(vm, address(optimismPortal), 100 gwei);
(uint128 prevBaseFee,, uint64 prevBlockNum) = optimismPortal.params();
...
...
@@ -27,7 +29,7 @@ contract SetPrevBaseFee_Test is Portal_Initializer {
// so that they are nothing more than the call we want measure the gas cost of.
// In order to achieve this we make no assertions, and handle everything else in the setUp()
// function.
contract GasBenchMark_OptimismPortal is
Portal_Initializer
{
contract GasBenchMark_OptimismPortal is
CommonTest
{
// Reusable default values for a test withdrawal
Types.WithdrawalTransaction _defaultTx;
...
...
@@ -100,7 +102,7 @@ contract GasBenchMark_OptimismPortal is Portal_Initializer {
}
}
contract GasBenchMark_L1CrossDomainMessenger is
Messenger
_Initializer {
contract GasBenchMark_L1CrossDomainMessenger is
Bridge
_Initializer {
function test_sendMessage_benchmark_0() external {
vm.pauseGasMetering();
setPrevBaseFee(vm, address(optimismPortal), 1 gwei);
...
...
@@ -192,7 +194,7 @@ contract GasBenchMark_L1StandardBridge_Finalize is Bridge_Initializer {
}
}
contract GasBenchMark_L2OutputOracle is
L2OutputOracle_Initializer
{
contract GasBenchMark_L2OutputOracle is
CommonTest
{
uint256 nextBlockNumber;
function setUp() public override {
...
...
packages/contracts-bedrock/test/CrossDomainMessenger.t.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Testing utilities
import { Test } from "forge-std/Test.sol";
import {
Messenger_Initializer } from "test/CommonTest.t
.sol";
import {
Bridge_Initializer } from "test/setup/Bridge_Initializer
.sol";
import { CallerCaller, Reverter } from "test/mocks/Callers.sol";
// Libraries
...
...
@@ -16,7 +15,7 @@ import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
// CrossDomainMessenger_Test is for testing functionality which is common to both the L1 and L2
// CrossDomainMessenger contracts. For simplicity, we use the L1 Messenger as the test contract.
contract CrossDomainMessenger_BaseGas_Test is
Messenger
_Initializer {
contract CrossDomainMessenger_BaseGas_Test is
Bridge
_Initializer {
/// @dev Ensure that baseGas passes for the max value of _minGasLimit,
/// this is about 4 Billion.
function test_baseGas_succeeds() external view {
...
...
@@ -112,7 +111,7 @@ contract ExternalRelay is Test {
/// @title CrossDomainMessenger_RelayMessage_Test
/// @notice Fuzz tests re-entrancy into the CrossDomainMessenger relayMessage function.
contract CrossDomainMessenger_RelayMessage_Test is
Messenger
_Initializer {
contract CrossDomainMessenger_RelayMessage_Test is
Bridge
_Initializer {
// Storage slot of the l2Sender
uint256 constant senderSlotIndex = 50;
...
...
packages/contracts-bedrock/test/CrossDomainOwnable.t.sol
View file @
cecb3c16
...
...
@@ -4,7 +4,7 @@ pragma solidity 0.8.15;
// Testing utilities
import { VmSafe } from "forge-std/Vm.sol";
import { Test } from "forge-std/Test.sol";
import {
Portal_Initializer } from "test/CommonTest.
t.sol";
import {
CommonTest } from "test/setup/CommonTes
t.sol";
// Libraries
import { Bytes32AddressLib } from "@rari-capital/solmate/src/utils/Bytes32AddressLib.sol";
...
...
@@ -46,7 +46,7 @@ contract CrossDomainOwnable_Test is Test {
}
}
contract CrossDomainOwnableThroughPortal_Test is
Portal_Initializer
{
contract CrossDomainOwnableThroughPortal_Test is
CommonTest
{
XDomainSetter setter;
/// @dev Sets up the test suite.
...
...
packages/contracts-bedrock/test/CrossDomainOwnable2.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import {
CommonTest, Messenger_Initializer } from "test/CommonTest.t
.sol";
import {
Bridge_Initializer } from "test/setup/Bridge_Initializer
.sol";
// Libraries
import { Hashing } from "src/libraries/Hashing.sol";
...
...
@@ -10,10 +10,10 @@ import { Encoding } from "src/libraries/Encoding.sol";
import { Bytes32AddressLib } from "@rari-capital/solmate/src/utils/Bytes32AddressLib.sol";
// Target contract dependencies
import { AddressAliasHelper } from "
../
src/vendor/AddressAliasHelper.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
// Target contract
import { CrossDomainOwnable2 } from "
../
src/L2/CrossDomainOwnable2.sol";
import { CrossDomainOwnable2 } from "src/L2/CrossDomainOwnable2.sol";
contract XDomainSetter2 is CrossDomainOwnable2 {
uint256 public value;
...
...
@@ -23,7 +23,7 @@ contract XDomainSetter2 is CrossDomainOwnable2 {
}
}
contract CrossDomainOwnable2_Test is
Messenger
_Initializer {
contract CrossDomainOwnable2_Test is
Bridge
_Initializer {
XDomainSetter2 setter;
/// @dev Sets up the test suite.
...
...
packages/contracts-bedrock/test/CrossDomainOwnable3.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import {
CommonTest, Messenger_Initializer } from "test/CommonTest.t
.sol";
import {
Bridge_Initializer } from "test/setup/Bridge_Initializer
.sol";
// Libraries
import { Hashing } from "src/libraries/Hashing.sol";
...
...
@@ -23,7 +23,7 @@ contract XDomainSetter3 is CrossDomainOwnable3 {
}
}
contract CrossDomainOwnable3_Test is
Messenger
_Initializer {
contract CrossDomainOwnable3_Test is
Bridge
_Initializer {
XDomainSetter3 setter;
/// @dev CrossDomainOwnable3.sol transferOwnership event
...
...
packages/contracts-bedrock/test/DelayedVetoable.t.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
import { DelayedVetoable } from "src/L1/DelayedVetoable.sol";
contract DelayedVetoable_Init is CommonTest {
...
...
packages/contracts-bedrock/test/DisputeGameFactory.t.sol
View file @
cecb3c16
...
...
@@ -8,9 +8,9 @@ import { Test } from "forge-std/Test.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
import { Proxy } from "src/universal/Proxy.sol";
import {
L2OutputOracle_Initializer } from "test/CommonTest.
t.sol";
import {
CommonTest } from "test/setup/CommonTes
t.sol";
contract DisputeGameFactory_Init is
L2OutputOracle_Initializer
{
contract DisputeGameFactory_Init is
CommonTest
{
DisputeGameFactory factory;
FakeClone fakeClone;
...
...
packages/contracts-bedrock/test/Encoding.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Libraries
import { Types } from "src/libraries/Types.sol";
...
...
packages/contracts-bedrock/test/FeeVault.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
// Target contract
import { FeeVault } from "src/universal/FeeVault.sol";
...
...
packages/contracts-bedrock/test/GasPriceOracle.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
contract GasPriceOracle_Test is CommonTest {
event OverheadUpdated(uint256);
...
...
packages/contracts-bedrock/test/GovernanceToken.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
contract GovernanceToken_Test is CommonTest {
address owner;
...
...
packages/contracts-bedrock/test/Hashing.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Libraries
import { Types } from "src/libraries/Types.sol";
...
...
packages/contracts-bedrock/test/Initializable.t.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
...
...
packages/contracts-bedrock/test/L1Block.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Target contract
import { L1Block } from "src/L2/L1Block.sol";
...
...
packages/contracts-bedrock/test/L1CrossDomainMessenger.t.sol
View file @
cecb3c16
...
...
@@ -2,8 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { Messenger_Initializer } from "test/CommonTest.t.sol";
import { L2OutputOracle_Initializer } from "test/L2OutputOracle.t.sol";
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol";
// Libraries
...
...
@@ -15,7 +14,7 @@ import { Encoding } from "src/libraries/Encoding.sol";
// Target contract dependencies
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract L1CrossDomainMessenger_Test is
Messenger
_Initializer {
contract L1CrossDomainMessenger_Test is
Bridge
_Initializer {
/// @dev The receiver address
address recipient = address(0xabbaacdc);
...
...
packages/contracts-bedrock/test/L1ERC721Bridge.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
// Target contract dependencies
...
...
packages/contracts-bedrock/test/L1StandardBridge.t.sol
View file @
cecb3c16
...
...
@@ -4,7 +4,7 @@ pragma solidity 0.8.15;
// Testing utilities
import { stdStorage, StdStorage } from "forge-std/Test.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
...
...
packages/contracts-bedrock/test/L2CrossDomainMessenger.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import {
Messenger_Initializer } from "test/CommonTest.t
.sol";
import {
Bridge_Initializer } from "test/setup/Bridge_Initializer
.sol";
import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol";
// Libraries
...
...
@@ -14,7 +14,7 @@ import { Types } from "src/libraries/Types.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
contract L2CrossDomainMessenger_Test is
Messenger
_Initializer {
contract L2CrossDomainMessenger_Test is
Bridge
_Initializer {
/// @dev Receiver address for testing
address recipient = address(0xabbaacdc);
...
...
packages/contracts-bedrock/test/L2ERC721Bridge.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
// Target contract dependencies
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
...
...
packages/contracts-bedrock/test/L2OutputOracle.t.sol
View file @
cecb3c16
...
...
@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
// Testing utilities
import { stdError } from "forge-std/Test.sol";
import {
L2OutputOracle_Initializer } from "test/CommonTest.
t.sol";
import {
CommonTest } from "test/setup/CommonTes
t.sol";
import { NextImpl } from "test/mocks/NextImpl.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
...
...
@@ -17,7 +17,7 @@ import { Proxy } from "src/universal/Proxy.sol";
// Target contract
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
contract L2OutputOracle_constructor_Test is
L2OutputOracle_Initializer
{
contract L2OutputOracle_constructor_Test is
CommonTest
{
/// @dev Tests that constructor sets the initial values correctly.
function test_constructor_succeeds() external {
address proposer = cfg.l2OutputOracleProposer();
...
...
@@ -80,7 +80,7 @@ contract L2OutputOracle_constructor_Test is L2OutputOracle_Initializer {
}
}
contract L2OutputOracle_getter_Test is
L2OutputOracle_Initializer
{
contract L2OutputOracle_getter_Test is
CommonTest
{
bytes32 proposedOutput1 = keccak256(abi.encode(1));
/// @dev Tests that `latestBlockNumber` returns the correct value.
...
...
@@ -216,7 +216,7 @@ contract L2OutputOracle_getter_Test is L2OutputOracle_Initializer {
}
}
contract L2OutputOracle_proposeL2Output_Test is
L2OutputOracle_Initializer
{
contract L2OutputOracle_proposeL2Output_Test is
CommonTest
{
/// @dev Test that `proposeL2Output` succeeds for a valid input
/// and when a block hash and number are not specified.
function test_proposeL2Output_proposeAnotherOutput_succeeds() public {
...
...
@@ -308,7 +308,7 @@ contract L2OutputOracle_proposeL2Output_Test is L2OutputOracle_Initializer {
}
}
contract L2OutputOracle_deleteOutputs_Test is
L2OutputOracle_Initializer
{
contract L2OutputOracle_deleteOutputs_Test is
CommonTest
{
/// @dev Tests that `deleteL2Outputs` succeeds for a single output.
function test_deleteOutputs_singleOutput_succeeds() external {
proposeAnotherOutput();
...
...
@@ -416,7 +416,7 @@ contract L2OutputOracle_deleteOutputs_Test is L2OutputOracle_Initializer {
}
}
contract L2OutputOracleUpgradeable_Test is
L2OutputOracle_Initializer
{
contract L2OutputOracleUpgradeable_Test is
CommonTest
{
/// @dev Tests that the proxy is initialized with the correct values.
function test_initValuesOnProxy_succeeds() external {
address proposer = cfg.l2OutputOracleProposer();
...
...
packages/contracts-bedrock/test/L2StandardBridge.t.sol
View file @
cecb3c16
...
...
@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
// Testing utilities
// Target contract is imported by the `Bridge_Initializer`
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
import { stdStorage, StdStorage } from "forge-std/Test.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
...
...
packages/contracts-bedrock/test/L2ToL1MessagePasser.t.sol
View file @
cecb3c16
...
...
@@ -2,25 +2,13 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Libraries
import { Types } from "src/libraries/Types.sol";
import { Hashing } from "src/libraries/Hashing.sol";
contract L2ToL1MessagePasserTest is CommonTest {
event MessagePassed(
uint256 indexed nonce,
address indexed sender,
address indexed target,
uint256 value,
uint256 gasLimit,
bytes data,
bytes32 withdrawalHash
);
event WithdrawerBalanceBurnt(uint256 indexed amount);
/// @dev Tests that `initiateWithdrawal` succeeds and correctly sets the state
/// of the message passer for the withdrawal hash.
function testFuzz_initiateWithdrawal_succeeds(
...
...
packages/contracts-bedrock/test/LegacyERC20ETH.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Target contract dependencies
import { Predeploys } from "src/libraries/Predeploys.sol";
...
...
packages/contracts-bedrock/test/LegacyMessagePasser.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
contract LegacyMessagePasser_Test is CommonTest {
/// @dev Tests that `passMessageToL1` succeeds.
...
...
packages/contracts-bedrock/test/LibPosition.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity ^0.8.15;
import { Test } from "forge-std/Test.sol";
import { LibPosition } from "
../
src/dispute/lib/LibPosition.sol";
import { LibPosition } from "src/dispute/lib/LibPosition.sol";
import "src/libraries/DisputeTypes.sol";
/// @notice Tests for `LibPosition`
...
...
packages/contracts-bedrock/test/MIPS.t.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { CommonTest } from "
./CommonTest.
t.sol";
import { CommonTest } from "
test/setup/CommonTes
t.sol";
import { MIPS } from "src/cannon/MIPS.sol";
import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
import "src/libraries/DisputeTypes.sol";
...
...
packages/contracts-bedrock/test/MintManager.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Target contract dependencies
import { GovernanceToken } from "src/governance/GovernanceToken.sol";
...
...
packages/contracts-bedrock/test/OptimismMintableERC20.t.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
import { ILegacyMintableERC20, IOptimismMintableERC20 } from "src/universal/IOptimismMintableERC20.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
...
...
packages/contracts-bedrock/test/OptimismMintableERC20Factory.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
contract OptimismMintableTokenFactory_Test is Bridge_Initializer {
event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken);
...
...
packages/contracts-bedrock/test/OptimismMintableERC721.t.sol
View file @
cecb3c16
...
...
@@ -5,7 +5,7 @@ import { ERC721, IERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol
import { IERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
import { OptimismMintableERC721, IOptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol";
contract OptimismMintableERC721_Test is Bridge_Initializer {
...
...
packages/contracts-bedrock/test/OptimismMintableERC721Factory.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import { Bridge_Initializer } from "test/
CommonTest.t
.sol";
import { Bridge_Initializer } from "test/
setup/Bridge_Initializer
.sol";
import { OptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol";
import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol";
...
...
packages/contracts-bedrock/test/OptimismPortal.t.sol
View file @
cecb3c16
...
...
@@ -3,7 +3,8 @@ pragma solidity 0.8.15;
// Testing utilities
import { stdError } from "forge-std/Test.sol";
import { Portal_Initializer } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
import { NextImpl } from "test/mocks/NextImpl.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
...
...
@@ -20,7 +21,7 @@ import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract OptimismPortal_Test is
Portal_Initializer
{
contract OptimismPortal_Test is
CommonTest
{
event Paused(address);
event Unpaused(address);
...
...
@@ -193,7 +194,11 @@ contract OptimismPortal_Test is Portal_Initializer {
external
{
_gasLimit = uint64(
bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
bound(
_gasLimit,
optimismPortal.minimumGasLimit(uint64(_data.length)),
systemConfig.resourceConfig().maxResourceLimit
)
);
if (_isCreation) _to = address(0);
...
...
@@ -232,7 +237,13 @@ contract OptimismPortal_Test is Portal_Initializer {
)
external
{
_gasLimit = uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit));
_gasLimit = uint64(
bound(
_gasLimit,
optimismPortal.minimumGasLimit(uint64(_data.length)),
systemConfig.resourceConfig().maxResourceLimit
)
);
if (_isCreation) _to = address(0);
vm.expectEmit(address(optimismPortal));
...
...
@@ -246,7 +257,6 @@ contract OptimismPortal_Test is Portal_Initializer {
_data: _data
});
vm.deal(address(this), _mint);
vm.prank(address(this));
optimismPortal.depositTransaction{ value: _mint }({
...
...
@@ -306,7 +316,7 @@ contract OptimismPortal_Test is Portal_Initializer {
}
}
contract OptimismPortal_FinalizeWithdrawal_Test is
Portal_Initializer
{
contract OptimismPortal_FinalizeWithdrawal_Test is
CommonTest
{
// Reusable default values for a test withdrawal
Types.WithdrawalTransaction _defaultTx;
...
...
@@ -876,7 +886,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer {
}
}
contract OptimismPortalUpgradeable_Test is
Portal_Initializer
{
contract OptimismPortalUpgradeable_Test is
CommonTest
{
/// @dev Tests that the proxy is initialized correctly.
function test_params_initValuesOnProxy_succeeds() external {
(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal.params();
...
...
@@ -884,7 +894,7 @@ contract OptimismPortalUpgradeable_Test is Portal_Initializer {
assertEq(prevBaseFee, rcfg.minimumBaseFee);
assertEq(prevBoughtGas, 0);
assertEq(prevBlockNum, block.number
- 1
);
assertEq(prevBlockNum, block.number);
}
/// @dev Tests that the proxy cannot be initialized twice.
...
...
@@ -936,7 +946,7 @@ contract OptimismPortalUpgradeable_Test is Portal_Initializer {
/// @title OptimismPortalResourceFuzz_Test
/// @dev Test various values of the resource metering config to ensure that deposits cannot be
/// broken by changing the config.
contract OptimismPortalResourceFuzz_Test is
Portal_Initializer
{
contract OptimismPortalResourceFuzz_Test is
CommonTest
{
/// @dev The max gas limit observed throughout this test. Setting this too high can cause
/// the test to take too long to run.
uint256 constant MAX_GAS_LIMIT = 30_000_000;
...
...
packages/contracts-bedrock/test/ProtocolVersions.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
// Libraries
...
...
packages/contracts-bedrock/test/SequencerFeeVault.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import {
FeeVault_Initializer } from "test/CommonTest.
t.sol";
import {
CommonTest } from "test/setup/CommonTes
t.sol";
import { Reverter } from "test/mocks/Callers.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
...
...
@@ -15,7 +15,7 @@ import { FeeVault } from "src/universal/FeeVault.sol";
// Target contract
import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
contract SequencerFeeVault_Test is
FeeVault_Initializer
{
contract SequencerFeeVault_Test is
CommonTest
{
address recipient;
/// @dev Sets up the test suite.
...
...
@@ -98,7 +98,7 @@ contract SequencerFeeVault_Test is FeeVault_Initializer {
}
}
contract SequencerFeeVault_L2Withdrawal_Test is
FeeVault_Initializer
{
contract SequencerFeeVault_L2Withdrawal_Test is
CommonTest
{
address recipient;
/// @dev Sets up the test suite.
...
...
packages/contracts-bedrock/test/StandardBridge.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
import { OptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
...
...
packages/contracts-bedrock/test/SystemConfig.t.sol
View file @
cecb3c16
...
...
@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/
CommonTest.
t.sol";
import { CommonTest } from "test/
setup/CommonTes
t.sol";
// Libraries
import { Constants } from "src/libraries/Constants.sol";
...
...
packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol
View file @
cecb3c16
...
...
@@ -5,12 +5,13 @@ import { StdUtils } from "forge-std/StdUtils.sol";
import { Vm } from "forge-std/Vm.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
import {
Messenger_Initializer } from "test/CommonTest.t
.sol";
import {
Bridge_Initializer } from "test/setup/Bridge_Initializer
.sol";
import { Types } from "src/libraries/Types.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { Constants } from "src/libraries/Constants.sol";
import { Encoding } from "src/libraries/Encoding.sol";
import { Hashing } from "src/libraries/Hashing.sol";
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
contract RelayActor is StdUtils {
// Storage slot of the l2Sender
...
...
@@ -88,7 +89,7 @@ contract RelayActor is StdUtils {
}
}
contract XDM_MinGasLimits is
Messenger
_Initializer {
contract XDM_MinGasLimits is
Bridge
_Initializer {
RelayActor actor;
function init(bool doFail) public virtual {
...
...
packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import {
L2OutputOracle_Initializer } from "test/CommonTest.
t.sol";
import {
CommonTest } from "test/setup/CommonTes
t.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { Vm } from "forge-std/Vm.sol";
...
...
@@ -29,7 +29,7 @@ contract L2OutputOracle_Proposer {
}
}
contract L2OutputOracle_MonotonicBlockNumIncrease_Invariant is
L2OutputOracle_Initializer
{
contract L2OutputOracle_MonotonicBlockNumIncrease_Invariant is
CommonTest
{
L2OutputOracle_Proposer internal actor;
function setUp() public override {
...
...
packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol
View file @
cecb3c16
...
...
@@ -11,7 +11,7 @@ import { SystemConfig } from "src/L1/SystemConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { Constants } from "src/libraries/Constants.sol";
import {
Portal_Initializer } from "test/CommonTest.
t.sol";
import {
CommonTest } from "test/setup/CommonTes
t.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
import { Types } from "src/libraries/Types.sol";
...
...
@@ -74,7 +74,7 @@ contract OptimismPortal_Depositor is StdUtils, ResourceMetering {
}
}
contract OptimismPortal_Invariant_Harness is
Portal_Initializer
{
contract OptimismPortal_Invariant_Harness is
CommonTest
{
// Reusable default values for a test withdrawal
Types.WithdrawalTransaction _defaultTx;
...
...
@@ -127,7 +127,7 @@ contract OptimismPortal_Invariant_Harness is Portal_Initializer {
}
}
contract OptimismPortal_Deposit_Invariant is
Portal_Initializer
{
contract OptimismPortal_Deposit_Invariant is
CommonTest
{
OptimismPortal_Depositor internal actor;
function setUp() public override {
...
...
packages/contracts-bedrock/test/setup/Bridge_Initializer.sol
0 → 100644
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { CommonTest } from "test/setup/CommonTest.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { LegacyMintableERC20 } from "src/legacy/LegacyMintableERC20.sol";
/// @title Bridge_Initializer
/// @dev This contract extends the CommonTest contract with token deployments
/// meant to be used with the bridge contracts.
contract Bridge_Initializer is CommonTest {
ERC20 L1Token;
ERC20 BadL1Token;
OptimismMintableERC20 L2Token;
LegacyMintableERC20 LegacyL2Token;
ERC20 NativeL2Token;
ERC20 BadL2Token;
OptimismMintableERC20 RemoteL1Token;
function setUp() public virtual override {
super.setUp();
L1Token = new ERC20("Native L1 Token", "L1T");
LegacyL2Token = new LegacyMintableERC20({
_l2Bridge: address(l2StandardBridge),
_l1Token: address(L1Token),
_name: string.concat("LegacyL2-", L1Token.name()),
_symbol: string.concat("LegacyL2-", L1Token.symbol())
});
vm.label(address(LegacyL2Token), "LegacyMintableERC20");
// Deploy the L2 ERC20 now
L2Token = OptimismMintableERC20(
l2OptimismMintableERC20Factory.createStandardL2Token(
address(L1Token),
string(abi.encodePacked("L2-", L1Token.name())),
string(abi.encodePacked("L2-", L1Token.symbol()))
)
);
BadL2Token = OptimismMintableERC20(
l2OptimismMintableERC20Factory.createStandardL2Token(
address(1),
string(abi.encodePacked("L2-", L1Token.name())),
string(abi.encodePacked("L2-", L1Token.symbol()))
)
);
NativeL2Token = new ERC20("Native L2 Token", "L2T");
RemoteL1Token = OptimismMintableERC20(
l1OptimismMintableERC20Factory.createStandardL2Token(
address(NativeL2Token),
string(abi.encodePacked("L1-", NativeL2Token.name())),
string(abi.encodePacked("L1-", NativeL2Token.symbol()))
)
);
BadL1Token = OptimismMintableERC20(
l1OptimismMintableERC20Factory.createStandardL2Token(
address(1),
string(abi.encodePacked("L1-", NativeL2Token.name())),
string(abi.encodePacked("L1-", NativeL2Token.symbol()))
)
);
}
}
packages/contracts-bedrock/test/setup/CommonTest.sol
0 → 100644
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { Test } from "forge-std/Test.sol";
import { Setup } from "test/setup/Setup.sol";
import { Events } from "test/setup/Events.sol";
import { FFIInterface } from "test/setup/FFIInterface.sol";
/// @title CommonTest
/// @dev An extenstion to `Test` that sets up the optimism smart contracts.
contract CommonTest is Setup, Test, Events {
address alice = address(128);
address bob = address(256);
bytes32 constant nonZeroHash = keccak256(abi.encode("NON_ZERO"));
FFIInterface ffi;
function setUp() public virtual override {
vm.deal(alice, type(uint64).max);
vm.deal(bob, type(uint64).max);
vm.label(alice, "alice");
vm.label(bob, "bob");
Setup.setUp();
ffi = new FFIInterface();
// Make sure the base fee is non zero
vm.fee(1 gwei);
// Set sane initialize block numbers
vm.warp(cfg.l2OutputOracleStartingTimestamp() + 1);
vm.roll(cfg.l2OutputOracleStartingBlockNumber() + 1);
// Deploy L1
Setup.L1();
// Deploy L2
Setup.L2({ cfg: cfg });
}
/// @dev Helper function that wraps `TransactionDeposited` event.
/// The magic `0` is the version.
function emitTransactionDeposited(
address _from,
address _to,
uint256 _mint,
uint256 _value,
uint64 _gasLimit,
bool _isCreation,
bytes memory _data
)
internal
{
emit TransactionDeposited(_from, _to, 0, abi.encodePacked(_mint, _value, _gasLimit, _isCreation, _data));
}
// @dev Advance the evm's time to meet the L2OutputOracle's requirements for proposeL2Output
function warpToProposeTime(uint256 _nextBlockNumber) public {
vm.warp(l2OutputOracle.computeL2Timestamp(_nextBlockNumber) + 1);
}
/// @dev Helper function to propose an output.
function proposeAnotherOutput() public {
bytes32 proposedOutput2 = keccak256(abi.encode());
uint256 nextBlockNumber = l2OutputOracle.nextBlockNumber();
uint256 nextOutputIndex = l2OutputOracle.nextOutputIndex();
warpToProposeTime(nextBlockNumber);
uint256 proposedNumber = l2OutputOracle.latestBlockNumber();
uint256 submissionInterval = cfg.l2OutputOracleSubmissionInterval();
// Ensure the submissionInterval is enforced
assertEq(nextBlockNumber, proposedNumber + submissionInterval);
vm.roll(nextBlockNumber + 1);
vm.expectEmit(true, true, true, true);
emit OutputProposed(proposedOutput2, nextOutputIndex, nextBlockNumber, block.timestamp);
address proposer = cfg.l2OutputOracleProposer();
vm.prank(proposer);
l2OutputOracle.proposeL2Output(proposedOutput2, nextBlockNumber, 0, 0);
}
}
packages/contracts-bedrock/test/setup/Events.sol
0 → 100644
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { FeeVault } from "src/universal/FeeVault.sol";
/// @title Events
/// @dev Contains various events that are tested against. This contract needs to
/// exist until we either modularize the implementations or use a newer version of
/// solc that allows for referencing events from other contracts.
contract Events {
/// @dev OpenZeppelin Ownable.sol transferOwnership event
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData);
event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success);
event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to);
event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit);
event SentMessageExtension1(address indexed sender, uint256 value);
event MessagePassed(
uint256 indexed nonce,
address indexed sender,
address indexed target,
uint256 value,
uint256 gasLimit,
bytes data,
bytes32 withdrawalHash
);
event WithdrawerBalanceBurnt(uint256 indexed amount);
event RelayedMessage(bytes32 indexed msgHash);
event FailedRelayedMessage(bytes32 indexed msgHash);
event TransactionDeposited(
address indexed from,
address indexed to,
uint256 mint,
uint256 value,
uint64 gasLimit,
bool isCreation,
bytes data
);
event WhatHappened(bool success, bytes returndata);
event OutputProposed(
bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp
);
event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex);
event Withdrawal(uint256 value, address to, address from);
event Withdrawal(uint256 value, address to, address from, FeeVault.WithdrawalNetwork withdrawalNetwork);
event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes data);
event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes data);
event ERC20DepositInitiated(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event ERC20WithdrawalFinalized(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event WithdrawalInitiated(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event DepositFinalized(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event DepositFailed(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes data);
event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes data);
event ERC20BridgeInitiated(
address indexed localToken,
address indexed remoteToken,
address indexed from,
address to,
uint256 amount,
bytes data
);
event ERC20BridgeFinalized(
address indexed localToken,
address indexed remoteToken,
address indexed from,
address to,
uint256 amount,
bytes data
);
}
packages/contracts-bedrock/test/
CommonTest.t
.sol
→
packages/contracts-bedrock/test/
setup/Setup
.sol
View file @
cecb3c16
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Testing utilities
import { Test, StdUtils } from "forge-std/Test.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol";
import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol";
import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
import { BaseFeeVault } from "src/L2/BaseFeeVault.sol";
import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
import { L1FeeVault } from "src/L2/L1FeeVault.sol";
import { BaseFeeVault } from "src/L2/BaseFeeVault.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
import { GasPriceOracle } from "src/L2/GasPriceOracle.sol";
import { L1Block } from "src/L2/L1Block.sol";
import { ProtocolVersions } from "src/L1/ProtocolVersions.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
import { LegacyERC20ETH } from "src/legacy/LegacyERC20ETH.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { Types } from "src/libraries/Types.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { Proxy } from "src/universal/Proxy.sol";
import { ResolvedDelegateProxy } from "src/legacy/ResolvedDelegateProxy.sol";
import { AddressManager } from "src/legacy/AddressManager.sol";
import { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol";
import { IL1ChugSplashDeployer } from "src/legacy/L1ChugSplashProxy.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { GovernanceToken } from "src/governance/GovernanceToken.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { LegacyMintableERC20 } from "src/legacy/LegacyMintableERC20.sol";
import { LegacyMessagePasser } from "src/legacy/LegacyMessagePasser.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { GovernanceToken } from "src/governance/GovernanceToken.sol";
import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol";
import { LegacyERC20ETH } from "src/legacy/LegacyERC20ETH.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
import { DeployConfig } from "scripts/DeployConfig.s.sol";
import { Deploy } from "scripts/Deploy.s.sol";
import { FFIInterface } from "test/setup/FFIInterface.sol";
contract CommonTest is Deploy, Test {
address alice = address(128);
address bob = address(256);
bytes32 constant nonZeroHash = keccak256(abi.encode("NON_ZERO"));
event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData);
/// @dev OpenZeppelin Ownable.sol transferOwnership event
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { ProtocolVersions } from "src/L1/ProtocolVersions.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
import { AddressManager } from "src/legacy/AddressManager.sol";
import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
/// @title Setup
/// @dev This contact is responsible for setting up the contracts in state. It currently
/// sets the L2 contracts directly at the predeploy addresses instead of setting them
/// up behind proxies. In the future we will migrate to importing the genesis JSON
/// file that is created to set up the L2 contracts instead of setting them up manually.
contract Setup is Deploy {
OptimismPortal optimismPortal;
L2OutputOracle l2OutputOracle;
SystemConfig systemConfig;
...
...
@@ -77,32 +57,22 @@ contract CommonTest is Deploy, Test {
L1Block l1Block;
LegacyMessagePasser legacyMessagePasser;
GovernanceToken governanceToken;
FFIInterface ffi;
LegacyERC20ETH legacyERC20ETH;
function setUp() public virtual override {
// Give alice and bob some ETH
vm.deal(alice, 1 << 16);
vm.deal(bob, 1 << 16);
vm.label(alice, "alice");
vm.label(bob, "bob");
// Make sure we have a non-zero base fee
vm.fee(1000000000);
Deploy.setUp();
}
// Set the deterministic deployer in state
/// @dev Sets up the L1 contracts.
function L1() public {
// Set the deterministic deployer in state to ensure that it is there
vm.etch(
0x4e59b44847b379578588920cA78FbF26c0B4956C,
hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
);
ffi = new FFIInterface();
Deploy.setUp();
Deploy.run();
// Set up L1
optimismPortal = OptimismPortal(mustGetAddress("OptimismPortalProxy"));
l2OutputOracle = L2OutputOracle(mustGetAddress("L2OutputOracleProxy"));
systemConfig = SystemConfig(mustGetAddress("SystemConfigProxy"));
...
...
@@ -115,15 +85,27 @@ contract CommonTest is Deploy, Test {
protocolVersions = ProtocolVersions(mustGetAddress("ProtocolVersionsProxy"));
vm.label(address(l2OutputOracle), "L2OutputOracle");
vm.label(mustGetAddress("L2OutputOracleProxy"), "L2OutputOracleProxy");
vm.label(address(optimismPortal), "OptimismPortal");
vm.label(mustGetAddress("OptimismPortalProxy"), "OptimismPortalProxy");
vm.label(address(systemConfig), "SystemConfig");
vm.label(mustGetAddress("SystemConfigProxy"), "SystemConfigProxy");
vm.label(address(l1StandardBridge), "L1StandardBridge");
vm.label(mustGetAddress("L1StandardBridgeProxy"), "L1StandardBridgeProxy");
vm.label(address(l1CrossDomainMessenger), "L1CrossDomainMessenger");
vm.label(mustGetAddress("L1CrossDomainMessengerProxy"), "L1CrossDomainMessengerProxy");
vm.label(address(addressManager), "AddressManager");
vm.label(address(l1ERC721Bridge), "L1ERC721Bridge");
vm.label(mustGetAddress("L1ERC721BridgeProxy"), "L1ERC721BridgeProxy");
vm.label(address(l1OptimismMintableERC20Factory), "OptimismMintableERC20Factory");
vm.label(mustGetAddress("OptimismMintableERC20FactoryProxy"), "OptimismMintableERC20FactoryProxy");
vm.label(address(protocolVersions), "ProtocolVersions");
vm.label(mustGetAddress("ProtocolVersionsProxy"), "ProtocolVersionsProxy");
vm.label(AddressAliasHelper.applyL1ToL2Alias(address(l1CrossDomainMessenger)), "L1CrossDomainMessenger_aliased");
}
/// @dev Sets up the L2 contracts. Depends on `L1()` being called first.
function L2(DeployConfig cfg) public {
// Set up L2. There are currently no proxies set in the L2 initialization.
vm.etch(
Predeploys.L2_CROSS_DOMAIN_MESSENGER,
...
...
@@ -146,6 +128,7 @@ contract CommonTest is Deploy, Test {
l2OptimismMintableERC20Factory.initialize(Predeploys.L2_STANDARD_BRIDGE);
vm.etch(Predeploys.LEGACY_ERC20_ETH, address(new LegacyERC20ETH()).code);
legacyERC20ETH = LegacyERC20ETH(Predeploys.LEGACY_ERC20_ETH);
vm.etch(Predeploys.L2_ERC721_BRIDGE, address(new L2ERC721Bridge(address(l1ERC721Bridge))).code);
l2ERC721Bridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE);
...
...
@@ -214,205 +197,5 @@ contract CommonTest is Deploy, Test {
vm.label(Predeploys.GAS_PRICE_ORACLE, "GasPriceOracle");
vm.label(Predeploys.LEGACY_MESSAGE_PASSER, "LegacyMessagePasser");
vm.label(Predeploys.GOVERNANCE_TOKEN, "GovernanceToken");
vm.label(AddressAliasHelper.applyL1ToL2Alias(address(l1CrossDomainMessenger)), "L1CrossDomainMessenger_aliased");
}
function emitTransactionDeposited(
address _from,
address _to,
uint256 _mint,
uint256 _value,
uint64 _gasLimit,
bool _isCreation,
bytes memory _data
)
internal
{
emit TransactionDeposited(_from, _to, 0, abi.encodePacked(_mint, _value, _gasLimit, _isCreation, _data));
}
}
contract L2OutputOracle_Initializer is CommonTest {
event OutputProposed(
bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp
);
event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex);
// @dev Advance the evm's time to meet the L2OutputOracle's requirements for proposeL2Output
function warpToProposeTime(uint256 _nextBlockNumber) public {
vm.warp(l2OutputOracle.computeL2Timestamp(_nextBlockNumber) + 1);
}
/// @dev Helper function to propose an output.
function proposeAnotherOutput() public {
bytes32 proposedOutput2 = keccak256(abi.encode());
uint256 nextBlockNumber = l2OutputOracle.nextBlockNumber();
uint256 nextOutputIndex = l2OutputOracle.nextOutputIndex();
warpToProposeTime(nextBlockNumber);
uint256 proposedNumber = l2OutputOracle.latestBlockNumber();
uint256 submissionInterval = cfg.l2OutputOracleSubmissionInterval();
// Ensure the submissionInterval is enforced
assertEq(nextBlockNumber, proposedNumber + submissionInterval);
vm.roll(nextBlockNumber + 1);
vm.expectEmit(true, true, true, true);
emit OutputProposed(proposedOutput2, nextOutputIndex, nextBlockNumber, block.timestamp);
address proposer = cfg.l2OutputOracleProposer();
vm.prank(proposer);
l2OutputOracle.proposeL2Output(proposedOutput2, nextBlockNumber, 0, 0);
}
function setUp() public virtual override {
super.setUp();
// By default the first block has timestamp and number zero, which will cause underflows in the
// tests, so we'll move forward to these block values.
vm.warp(cfg.l2OutputOracleStartingTimestamp() + 1);
vm.roll(cfg.l2OutputOracleStartingBlockNumber() + 1);
}
}
contract Portal_Initializer is L2OutputOracle_Initializer {
event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success);
event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to);
}
contract Messenger_Initializer is Portal_Initializer {
event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit);
event SentMessageExtension1(address indexed sender, uint256 value);
event MessagePassed(
uint256 indexed nonce,
address indexed sender,
address indexed target,
uint256 value,
uint256 gasLimit,
bytes data,
bytes32 withdrawalHash
);
event RelayedMessage(bytes32 indexed msgHash);
event FailedRelayedMessage(bytes32 indexed msgHash);
event TransactionDeposited(
address indexed from,
address indexed to,
uint256 mint,
uint256 value,
uint64 gasLimit,
bool isCreation,
bytes data
);
event WhatHappened(bool success, bytes returndata);
}
contract Bridge_Initializer is Messenger_Initializer {
ERC20 L1Token;
ERC20 BadL1Token;
OptimismMintableERC20 L2Token;
LegacyMintableERC20 LegacyL2Token;
ERC20 NativeL2Token;
ERC20 BadL2Token;
OptimismMintableERC20 RemoteL1Token;
event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes data);
event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes data);
event ERC20DepositInitiated(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event ERC20WithdrawalFinalized(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event WithdrawalInitiated(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event DepositFinalized(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event DepositFailed(
address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes data
);
event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes data);
event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes data);
event ERC20BridgeInitiated(
address indexed localToken,
address indexed remoteToken,
address indexed from,
address to,
uint256 amount,
bytes data
);
event ERC20BridgeFinalized(
address indexed localToken,
address indexed remoteToken,
address indexed from,
address to,
uint256 amount,
bytes data
);
function setUp() public virtual override {
super.setUp();
L1Token = new ERC20("Native L1 Token", "L1T");
LegacyL2Token = new LegacyMintableERC20({
_l2Bridge: address(l2StandardBridge),
_l1Token: address(L1Token),
_name: string.concat("LegacyL2-", L1Token.name()),
_symbol: string.concat("LegacyL2-", L1Token.symbol())
});
vm.label(address(LegacyL2Token), "LegacyMintableERC20");
// Deploy the L2 ERC20 now
L2Token = OptimismMintableERC20(
l2OptimismMintableERC20Factory.createStandardL2Token(
address(L1Token),
string(abi.encodePacked("L2-", L1Token.name())),
string(abi.encodePacked("L2-", L1Token.symbol()))
)
);
BadL2Token = OptimismMintableERC20(
l2OptimismMintableERC20Factory.createStandardL2Token(
address(1),
string(abi.encodePacked("L2-", L1Token.name())),
string(abi.encodePacked("L2-", L1Token.symbol()))
)
);
NativeL2Token = new ERC20("Native L2 Token", "L2T");
RemoteL1Token = OptimismMintableERC20(
l1OptimismMintableERC20Factory.createStandardL2Token(
address(NativeL2Token),
string(abi.encodePacked("L1-", NativeL2Token.name())),
string(abi.encodePacked("L1-", NativeL2Token.symbol()))
)
);
BadL1Token = OptimismMintableERC20(
l1OptimismMintableERC20Factory.createStandardL2Token(
address(1),
string(abi.encodePacked("L1-", NativeL2Token.name())),
string(abi.encodePacked("L1-", NativeL2Token.symbol()))
)
);
}
}
contract FeeVault_Initializer is Bridge_Initializer {
event Withdrawal(uint256 value, address to, address from);
event Withdrawal(uint256 value, address to, address from, FeeVault.WithdrawalNetwork withdrawalNetwork);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment