Commit cecb3c16 authored by Mark Tyneway's avatar Mark Tyneway

contracts-bedrock: modularize L2 setup

parent 6e890faf
...@@ -59,4 +59,3 @@ runs = 512 ...@@ -59,4 +59,3 @@ runs = 512
[profile.lite] [profile.lite]
optimizer = false optimizer = false
...@@ -4,16 +4,18 @@ pragma solidity 0.8.15; ...@@ -4,16 +4,18 @@ pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { Test } from "forge-std/Test.sol"; import { Test } from "forge-std/Test.sol";
import { Vm } from "forge-std/Vm.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 { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.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. // Free function for setting the prevBaseFee param in the OptimismPortal.
function setPrevBaseFee(Vm _vm, address _op, uint128 _prevBaseFee) { function setPrevBaseFee(Vm _vm, address _op, uint128 _prevBaseFee) {
_vm.store(address(_op), bytes32(uint256(1)), bytes32((block.number << 192) | _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 { function test_setPrevBaseFee_succeeds() external {
setPrevBaseFee(vm, address(optimismPortal), 100 gwei); setPrevBaseFee(vm, address(optimismPortal), 100 gwei);
(uint128 prevBaseFee,, uint64 prevBlockNum) = optimismPortal.params(); (uint128 prevBaseFee,, uint64 prevBlockNum) = optimismPortal.params();
...@@ -27,7 +29,7 @@ contract SetPrevBaseFee_Test is Portal_Initializer { ...@@ -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. // 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() // In order to achieve this we make no assertions, and handle everything else in the setUp()
// function. // function.
contract GasBenchMark_OptimismPortal is Portal_Initializer { contract GasBenchMark_OptimismPortal is CommonTest {
// Reusable default values for a test withdrawal // Reusable default values for a test withdrawal
Types.WithdrawalTransaction _defaultTx; Types.WithdrawalTransaction _defaultTx;
...@@ -100,7 +102,7 @@ contract GasBenchMark_OptimismPortal is Portal_Initializer { ...@@ -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 { function test_sendMessage_benchmark_0() external {
vm.pauseGasMetering(); vm.pauseGasMetering();
setPrevBaseFee(vm, address(optimismPortal), 1 gwei); setPrevBaseFee(vm, address(optimismPortal), 1 gwei);
...@@ -192,7 +194,7 @@ contract GasBenchMark_L1StandardBridge_Finalize is Bridge_Initializer { ...@@ -192,7 +194,7 @@ contract GasBenchMark_L1StandardBridge_Finalize is Bridge_Initializer {
} }
} }
contract GasBenchMark_L2OutputOracle is L2OutputOracle_Initializer { contract GasBenchMark_L2OutputOracle is CommonTest {
uint256 nextBlockNumber; uint256 nextBlockNumber;
function setUp() public override { function setUp() public override {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { Test } from "forge-std/Test.sol"; 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"; import { CallerCaller, Reverter } from "test/mocks/Callers.sol";
// Libraries // Libraries
...@@ -16,7 +15,7 @@ import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; ...@@ -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_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. // 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, /// @dev Ensure that baseGas passes for the max value of _minGasLimit,
/// this is about 4 Billion. /// this is about 4 Billion.
function test_baseGas_succeeds() external view { function test_baseGas_succeeds() external view {
...@@ -112,7 +111,7 @@ contract ExternalRelay is Test { ...@@ -112,7 +111,7 @@ contract ExternalRelay is Test {
/// @title CrossDomainMessenger_RelayMessage_Test /// @title CrossDomainMessenger_RelayMessage_Test
/// @notice Fuzz tests re-entrancy into the CrossDomainMessenger relayMessage function. /// @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 // Storage slot of the l2Sender
uint256 constant senderSlotIndex = 50; uint256 constant senderSlotIndex = 50;
......
...@@ -4,7 +4,7 @@ pragma solidity 0.8.15; ...@@ -4,7 +4,7 @@ pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { VmSafe } from "forge-std/Vm.sol"; import { VmSafe } from "forge-std/Vm.sol";
import { Test } from "forge-std/Test.sol"; import { Test } from "forge-std/Test.sol";
import { Portal_Initializer } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries // Libraries
import { Bytes32AddressLib } from "@rari-capital/solmate/src/utils/Bytes32AddressLib.sol"; import { Bytes32AddressLib } from "@rari-capital/solmate/src/utils/Bytes32AddressLib.sol";
...@@ -46,7 +46,7 @@ contract CrossDomainOwnable_Test is Test { ...@@ -46,7 +46,7 @@ contract CrossDomainOwnable_Test is Test {
} }
} }
contract CrossDomainOwnableThroughPortal_Test is Portal_Initializer { contract CrossDomainOwnableThroughPortal_Test is CommonTest {
XDomainSetter setter; XDomainSetter setter;
/// @dev Sets up the test suite. /// @dev Sets up the test suite.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest, Messenger_Initializer } from "test/CommonTest.t.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Libraries // Libraries
import { Hashing } from "src/libraries/Hashing.sol"; import { Hashing } from "src/libraries/Hashing.sol";
...@@ -10,10 +10,10 @@ import { Encoding } from "src/libraries/Encoding.sol"; ...@@ -10,10 +10,10 @@ import { Encoding } from "src/libraries/Encoding.sol";
import { Bytes32AddressLib } from "@rari-capital/solmate/src/utils/Bytes32AddressLib.sol"; import { Bytes32AddressLib } from "@rari-capital/solmate/src/utils/Bytes32AddressLib.sol";
// Target contract dependencies // Target contract dependencies
import { AddressAliasHelper } from "../src/vendor/AddressAliasHelper.sol"; import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
// Target contract // Target contract
import { CrossDomainOwnable2 } from "../src/L2/CrossDomainOwnable2.sol"; import { CrossDomainOwnable2 } from "src/L2/CrossDomainOwnable2.sol";
contract XDomainSetter2 is CrossDomainOwnable2 { contract XDomainSetter2 is CrossDomainOwnable2 {
uint256 public value; uint256 public value;
...@@ -23,7 +23,7 @@ contract XDomainSetter2 is CrossDomainOwnable2 { ...@@ -23,7 +23,7 @@ contract XDomainSetter2 is CrossDomainOwnable2 {
} }
} }
contract CrossDomainOwnable2_Test is Messenger_Initializer { contract CrossDomainOwnable2_Test is Bridge_Initializer {
XDomainSetter2 setter; XDomainSetter2 setter;
/// @dev Sets up the test suite. /// @dev Sets up the test suite.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest, Messenger_Initializer } from "test/CommonTest.t.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Libraries // Libraries
import { Hashing } from "src/libraries/Hashing.sol"; import { Hashing } from "src/libraries/Hashing.sol";
...@@ -23,7 +23,7 @@ contract XDomainSetter3 is CrossDomainOwnable3 { ...@@ -23,7 +23,7 @@ contract XDomainSetter3 is CrossDomainOwnable3 {
} }
} }
contract CrossDomainOwnable3_Test is Messenger_Initializer { contract CrossDomainOwnable3_Test is Bridge_Initializer {
XDomainSetter3 setter; XDomainSetter3 setter;
/// @dev CrossDomainOwnable3.sol transferOwnership event /// @dev CrossDomainOwnable3.sol transferOwnership event
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { DelayedVetoable } from "src/L1/DelayedVetoable.sol"; import { DelayedVetoable } from "src/L1/DelayedVetoable.sol";
contract DelayedVetoable_Init is CommonTest { contract DelayedVetoable_Init is CommonTest {
......
...@@ -8,9 +8,9 @@ import { Test } from "forge-std/Test.sol"; ...@@ -8,9 +8,9 @@ import { Test } from "forge-std/Test.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
import { Proxy } from "src/universal/Proxy.sol"; import { Proxy } from "src/universal/Proxy.sol";
import { L2OutputOracle_Initializer } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
contract DisputeGameFactory_Init is L2OutputOracle_Initializer { contract DisputeGameFactory_Init is CommonTest {
DisputeGameFactory factory; DisputeGameFactory factory;
FakeClone fakeClone; FakeClone fakeClone;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries // Libraries
import { Types } from "src/libraries/Types.sol"; import { Types } from "src/libraries/Types.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { Bridge_Initializer } from "test/CommonTest.t.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Target contract // Target contract
import { FeeVault } from "src/universal/FeeVault.sol"; import { FeeVault } from "src/universal/FeeVault.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
contract GasPriceOracle_Test is CommonTest { contract GasPriceOracle_Test is CommonTest {
event OverheadUpdated(uint256); event OverheadUpdated(uint256);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
contract GovernanceToken_Test is CommonTest { contract GovernanceToken_Test is CommonTest {
address owner; address owner;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries // Libraries
import { Types } from "src/libraries/Types.sol"; import { Types } from "src/libraries/Types.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; 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 { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Target contract // Target contract
import { L1Block } from "src/L2/L1Block.sol"; import { L1Block } from "src/L2/L1Block.sol";
......
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { Messenger_Initializer } from "test/CommonTest.t.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
import { L2OutputOracle_Initializer } from "test/L2OutputOracle.t.sol";
import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol"; import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol";
// Libraries // Libraries
...@@ -15,7 +14,7 @@ import { Encoding } from "src/libraries/Encoding.sol"; ...@@ -15,7 +14,7 @@ import { Encoding } from "src/libraries/Encoding.sol";
// Target contract dependencies // Target contract dependencies
import { OptimismPortal } from "src/L1/OptimismPortal.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract L1CrossDomainMessenger_Test is Messenger_Initializer { contract L1CrossDomainMessenger_Test is Bridge_Initializer {
/// @dev The receiver address /// @dev The receiver address
address recipient = address(0xabbaacdc); address recipient = address(0xabbaacdc);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // 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"; import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
// Target contract dependencies // Target contract dependencies
......
...@@ -4,7 +4,7 @@ pragma solidity 0.8.15; ...@@ -4,7 +4,7 @@ pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { stdStorage, StdStorage } from "forge-std/Test.sol"; import { stdStorage, StdStorage } from "forge-std/Test.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.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 // Libraries
import { Predeploys } from "src/libraries/Predeploys.sol"; import { Predeploys } from "src/libraries/Predeploys.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // 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"; import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol";
// Libraries // Libraries
...@@ -14,7 +14,7 @@ import { Types } from "src/libraries/Types.sol"; ...@@ -14,7 +14,7 @@ import { Types } from "src/libraries/Types.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol"; import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.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 /// @dev Receiver address for testing
address recipient = address(0xabbaacdc); address recipient = address(0xabbaacdc);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { Bridge_Initializer } from "test/CommonTest.t.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Target contract dependencies // Target contract dependencies
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
......
...@@ -3,7 +3,7 @@ pragma solidity 0.8.15; ...@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { stdError } from "forge-std/Test.sol"; import { stdError } from "forge-std/Test.sol";
import { L2OutputOracle_Initializer } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { NextImpl } from "test/mocks/NextImpl.sol"; import { NextImpl } from "test/mocks/NextImpl.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
...@@ -17,7 +17,7 @@ import { Proxy } from "src/universal/Proxy.sol"; ...@@ -17,7 +17,7 @@ import { Proxy } from "src/universal/Proxy.sol";
// Target contract // Target contract
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; 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. /// @dev Tests that constructor sets the initial values correctly.
function test_constructor_succeeds() external { function test_constructor_succeeds() external {
address proposer = cfg.l2OutputOracleProposer(); address proposer = cfg.l2OutputOracleProposer();
...@@ -80,7 +80,7 @@ contract L2OutputOracle_constructor_Test is L2OutputOracle_Initializer { ...@@ -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)); bytes32 proposedOutput1 = keccak256(abi.encode(1));
/// @dev Tests that `latestBlockNumber` returns the correct value. /// @dev Tests that `latestBlockNumber` returns the correct value.
...@@ -216,7 +216,7 @@ contract L2OutputOracle_getter_Test is L2OutputOracle_Initializer { ...@@ -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 /// @dev Test that `proposeL2Output` succeeds for a valid input
/// and when a block hash and number are not specified. /// and when a block hash and number are not specified.
function test_proposeL2Output_proposeAnotherOutput_succeeds() public { function test_proposeL2Output_proposeAnotherOutput_succeeds() public {
...@@ -308,7 +308,7 @@ contract L2OutputOracle_proposeL2Output_Test is L2OutputOracle_Initializer { ...@@ -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. /// @dev Tests that `deleteL2Outputs` succeeds for a single output.
function test_deleteOutputs_singleOutput_succeeds() external { function test_deleteOutputs_singleOutput_succeeds() external {
proposeAnotherOutput(); proposeAnotherOutput();
...@@ -416,7 +416,7 @@ contract L2OutputOracle_deleteOutputs_Test is L2OutputOracle_Initializer { ...@@ -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. /// @dev Tests that the proxy is initialized with the correct values.
function test_initValuesOnProxy_succeeds() external { function test_initValuesOnProxy_succeeds() external {
address proposer = cfg.l2OutputOracleProposer(); address proposer = cfg.l2OutputOracleProposer();
......
...@@ -3,7 +3,7 @@ pragma solidity 0.8.15; ...@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
// Testing utilities // Testing utilities
// Target contract is imported by the `Bridge_Initializer` // 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 { stdStorage, StdStorage } from "forge-std/Test.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol"; import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
......
...@@ -2,25 +2,13 @@ ...@@ -2,25 +2,13 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries // Libraries
import { Types } from "src/libraries/Types.sol"; import { Types } from "src/libraries/Types.sol";
import { Hashing } from "src/libraries/Hashing.sol"; import { Hashing } from "src/libraries/Hashing.sol";
contract L2ToL1MessagePasserTest is CommonTest { 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 /// @dev Tests that `initiateWithdrawal` succeeds and correctly sets the state
/// of the message passer for the withdrawal hash. /// of the message passer for the withdrawal hash.
function testFuzz_initiateWithdrawal_succeeds( function testFuzz_initiateWithdrawal_succeeds(
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Target contract dependencies // Target contract dependencies
import { Predeploys } from "src/libraries/Predeploys.sol"; import { Predeploys } from "src/libraries/Predeploys.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
contract LegacyMessagePasser_Test is CommonTest { contract LegacyMessagePasser_Test is CommonTest {
/// @dev Tests that `passMessageToL1` succeeds. /// @dev Tests that `passMessageToL1` succeeds.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.15; pragma solidity ^0.8.15;
import { Test } from "forge-std/Test.sol"; 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"; import "src/libraries/DisputeTypes.sol";
/// @notice Tests for `LibPosition` /// @notice Tests for `LibPosition`
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { CommonTest } from "./CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { MIPS } from "src/cannon/MIPS.sol"; import { MIPS } from "src/cannon/MIPS.sol";
import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
import "src/libraries/DisputeTypes.sol"; import "src/libraries/DisputeTypes.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Target contract dependencies // Target contract dependencies
import { GovernanceToken } from "src/governance/GovernanceToken.sol"; import { GovernanceToken } from "src/governance/GovernanceToken.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; 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 { ILegacyMintableERC20, IOptimismMintableERC20 } from "src/universal/IOptimismMintableERC20.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; 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 { contract OptimismMintableTokenFactory_Test is Bridge_Initializer {
event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken); event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken);
......
...@@ -5,7 +5,7 @@ import { ERC721, IERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol ...@@ -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 { IERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.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"; import { OptimismMintableERC721, IOptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol";
contract OptimismMintableERC721_Test is Bridge_Initializer { contract OptimismMintableERC721_Test is Bridge_Initializer {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; 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 { OptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol";
import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol"; import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol";
......
...@@ -3,7 +3,8 @@ pragma solidity 0.8.15; ...@@ -3,7 +3,8 @@ pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { stdError } from "forge-std/Test.sol"; 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 { NextImpl } from "test/mocks/NextImpl.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
...@@ -20,7 +21,7 @@ import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; ...@@ -20,7 +21,7 @@ import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract OptimismPortal_Test is Portal_Initializer { contract OptimismPortal_Test is CommonTest {
event Paused(address); event Paused(address);
event Unpaused(address); event Unpaused(address);
...@@ -193,7 +194,11 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -193,7 +194,11 @@ contract OptimismPortal_Test is Portal_Initializer {
external external
{ {
_gasLimit = uint64( _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); if (_isCreation) _to = address(0);
...@@ -232,7 +237,13 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -232,7 +237,13 @@ contract OptimismPortal_Test is Portal_Initializer {
) )
external 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); if (_isCreation) _to = address(0);
vm.expectEmit(address(optimismPortal)); vm.expectEmit(address(optimismPortal));
...@@ -246,7 +257,6 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -246,7 +257,6 @@ contract OptimismPortal_Test is Portal_Initializer {
_data: _data _data: _data
}); });
vm.deal(address(this), _mint); vm.deal(address(this), _mint);
vm.prank(address(this)); vm.prank(address(this));
optimismPortal.depositTransaction{ value: _mint }({ optimismPortal.depositTransaction{ value: _mint }({
...@@ -306,7 +316,7 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -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 // Reusable default values for a test withdrawal
Types.WithdrawalTransaction _defaultTx; Types.WithdrawalTransaction _defaultTx;
...@@ -876,7 +886,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer { ...@@ -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. /// @dev Tests that the proxy is initialized correctly.
function test_params_initValuesOnProxy_succeeds() external { function test_params_initValuesOnProxy_succeeds() external {
(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal.params(); (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal.params();
...@@ -884,7 +894,7 @@ contract OptimismPortalUpgradeable_Test is Portal_Initializer { ...@@ -884,7 +894,7 @@ contract OptimismPortalUpgradeable_Test is Portal_Initializer {
assertEq(prevBaseFee, rcfg.minimumBaseFee); assertEq(prevBaseFee, rcfg.minimumBaseFee);
assertEq(prevBoughtGas, 0); assertEq(prevBoughtGas, 0);
assertEq(prevBlockNum, block.number - 1); assertEq(prevBlockNum, block.number);
} }
/// @dev Tests that the proxy cannot be initialized twice. /// @dev Tests that the proxy cannot be initialized twice.
...@@ -936,7 +946,7 @@ contract OptimismPortalUpgradeable_Test is Portal_Initializer { ...@@ -936,7 +946,7 @@ contract OptimismPortalUpgradeable_Test is Portal_Initializer {
/// @title OptimismPortalResourceFuzz_Test /// @title OptimismPortalResourceFuzz_Test
/// @dev Test various values of the resource metering config to ensure that deposits cannot be /// @dev Test various values of the resource metering config to ensure that deposits cannot be
/// broken by changing the config. /// 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 /// @dev The max gas limit observed throughout this test. Setting this too high can cause
/// the test to take too long to run. /// the test to take too long to run.
uint256 constant MAX_GAS_LIMIT = 30_000_000; uint256 constant MAX_GAS_LIMIT = 30_000_000;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
// Libraries // Libraries
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { FeeVault_Initializer } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { Reverter } from "test/mocks/Callers.sol"; import { Reverter } from "test/mocks/Callers.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol"; import { StandardBridge } from "src/universal/StandardBridge.sol";
...@@ -15,7 +15,7 @@ import { FeeVault } from "src/universal/FeeVault.sol"; ...@@ -15,7 +15,7 @@ import { FeeVault } from "src/universal/FeeVault.sol";
// Target contract // Target contract
import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol"; import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
contract SequencerFeeVault_Test is FeeVault_Initializer { contract SequencerFeeVault_Test is CommonTest {
address recipient; address recipient;
/// @dev Sets up the test suite. /// @dev Sets up the test suite.
...@@ -98,7 +98,7 @@ contract SequencerFeeVault_Test is FeeVault_Initializer { ...@@ -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; address recipient;
/// @dev Sets up the test suite. /// @dev Sets up the test suite.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { StandardBridge } from "src/universal/StandardBridge.sol"; import { StandardBridge } from "src/universal/StandardBridge.sol";
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { OptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; import { OptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities // Testing utilities
import { CommonTest } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries // Libraries
import { Constants } from "src/libraries/Constants.sol"; import { Constants } from "src/libraries/Constants.sol";
......
...@@ -5,12 +5,13 @@ import { StdUtils } from "forge-std/StdUtils.sol"; ...@@ -5,12 +5,13 @@ import { StdUtils } from "forge-std/StdUtils.sol";
import { Vm } from "forge-std/Vm.sol"; import { Vm } from "forge-std/Vm.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.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 { Types } from "src/libraries/Types.sol";
import { Predeploys } from "src/libraries/Predeploys.sol"; import { Predeploys } from "src/libraries/Predeploys.sol";
import { Constants } from "src/libraries/Constants.sol"; import { Constants } from "src/libraries/Constants.sol";
import { Encoding } from "src/libraries/Encoding.sol"; import { Encoding } from "src/libraries/Encoding.sol";
import { Hashing } from "src/libraries/Hashing.sol"; import { Hashing } from "src/libraries/Hashing.sol";
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
contract RelayActor is StdUtils { contract RelayActor is StdUtils {
// Storage slot of the l2Sender // Storage slot of the l2Sender
...@@ -88,7 +89,7 @@ contract RelayActor is StdUtils { ...@@ -88,7 +89,7 @@ contract RelayActor is StdUtils {
} }
} }
contract XDM_MinGasLimits is Messenger_Initializer { contract XDM_MinGasLimits is Bridge_Initializer {
RelayActor actor; RelayActor actor;
function init(bool doFail) public virtual { function init(bool doFail) public virtual {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { L2OutputOracle_Initializer } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { Vm } from "forge-std/Vm.sol"; import { Vm } from "forge-std/Vm.sol";
...@@ -29,7 +29,7 @@ contract L2OutputOracle_Proposer { ...@@ -29,7 +29,7 @@ contract L2OutputOracle_Proposer {
} }
} }
contract L2OutputOracle_MonotonicBlockNumIncrease_Invariant is L2OutputOracle_Initializer { contract L2OutputOracle_MonotonicBlockNumIncrease_Invariant is CommonTest {
L2OutputOracle_Proposer internal actor; L2OutputOracle_Proposer internal actor;
function setUp() public override { function setUp() public override {
......
...@@ -11,7 +11,7 @@ import { SystemConfig } from "src/L1/SystemConfig.sol"; ...@@ -11,7 +11,7 @@ import { SystemConfig } from "src/L1/SystemConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol"; import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { Constants } from "src/libraries/Constants.sol"; import { Constants } from "src/libraries/Constants.sol";
import { Portal_Initializer } from "test/CommonTest.t.sol"; import { CommonTest } from "test/setup/CommonTest.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
import { Types } from "src/libraries/Types.sol"; import { Types } from "src/libraries/Types.sol";
...@@ -74,7 +74,7 @@ contract OptimismPortal_Depositor is StdUtils, ResourceMetering { ...@@ -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 // Reusable default values for a test withdrawal
Types.WithdrawalTransaction _defaultTx; Types.WithdrawalTransaction _defaultTx;
...@@ -127,7 +127,7 @@ contract OptimismPortal_Invariant_Harness is Portal_Initializer { ...@@ -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; OptimismPortal_Depositor internal actor;
function setUp() public override { function setUp() public override {
......
// 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()))
)
);
}
}
// 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);
}
}
// 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
);
}
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity 0.8.15; pragma solidity 0.8.15;
// Testing utilities import { Predeploys } from "src/libraries/Predeploys.sol";
import { Test, StdUtils } from "forge-std/Test.sol"; import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
import { L2StandardBridge } from "src/L2/L2StandardBridge.sol"; import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol"; import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol"; import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; import { BaseFeeVault } from "src/L2/BaseFeeVault.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 { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol"; import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
import { L1FeeVault } from "src/L2/L1FeeVault.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 { GasPriceOracle } from "src/L2/GasPriceOracle.sol";
import { L1Block } from "src/L2/L1Block.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 { LegacyMessagePasser } from "src/legacy/LegacyMessagePasser.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol"; import { GovernanceToken } from "src/governance/GovernanceToken.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.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 { Deploy } from "scripts/Deploy.s.sol";
import { FFIInterface } from "test/setup/FFIInterface.sol"; import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { ProtocolVersions } from "src/L1/ProtocolVersions.sol";
contract CommonTest is Deploy, Test { import { SystemConfig } from "src/L1/SystemConfig.sol";
address alice = address(128); import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
address bob = address(256); import { AddressManager } from "src/legacy/AddressManager.sol";
import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
bytes32 constant nonZeroHash = keccak256(abi.encode("NON_ZERO")); import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
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);
/// @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; OptimismPortal optimismPortal;
L2OutputOracle l2OutputOracle; L2OutputOracle l2OutputOracle;
SystemConfig systemConfig; SystemConfig systemConfig;
...@@ -77,32 +57,22 @@ contract CommonTest is Deploy, Test { ...@@ -77,32 +57,22 @@ contract CommonTest is Deploy, Test {
L1Block l1Block; L1Block l1Block;
LegacyMessagePasser legacyMessagePasser; LegacyMessagePasser legacyMessagePasser;
GovernanceToken governanceToken; GovernanceToken governanceToken;
LegacyERC20ETH legacyERC20ETH;
FFIInterface ffi;
function setUp() public virtual override { function setUp() public virtual override {
// Give alice and bob some ETH Deploy.setUp();
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);
// 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( vm.etch(
0x4e59b44847b379578588920cA78FbF26c0B4956C, 0x4e59b44847b379578588920cA78FbF26c0B4956C,
hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3" hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
); );
ffi = new FFIInterface();
Deploy.setUp();
Deploy.run(); Deploy.run();
// Set up L1
optimismPortal = OptimismPortal(mustGetAddress("OptimismPortalProxy")); optimismPortal = OptimismPortal(mustGetAddress("OptimismPortalProxy"));
l2OutputOracle = L2OutputOracle(mustGetAddress("L2OutputOracleProxy")); l2OutputOracle = L2OutputOracle(mustGetAddress("L2OutputOracleProxy"));
systemConfig = SystemConfig(mustGetAddress("SystemConfigProxy")); systemConfig = SystemConfig(mustGetAddress("SystemConfigProxy"));
...@@ -115,15 +85,27 @@ contract CommonTest is Deploy, Test { ...@@ -115,15 +85,27 @@ contract CommonTest is Deploy, Test {
protocolVersions = ProtocolVersions(mustGetAddress("ProtocolVersionsProxy")); protocolVersions = ProtocolVersions(mustGetAddress("ProtocolVersionsProxy"));
vm.label(address(l2OutputOracle), "L2OutputOracle"); vm.label(address(l2OutputOracle), "L2OutputOracle");
vm.label(mustGetAddress("L2OutputOracleProxy"), "L2OutputOracleProxy");
vm.label(address(optimismPortal), "OptimismPortal"); vm.label(address(optimismPortal), "OptimismPortal");
vm.label(mustGetAddress("OptimismPortalProxy"), "OptimismPortalProxy");
vm.label(address(systemConfig), "SystemConfig"); vm.label(address(systemConfig), "SystemConfig");
vm.label(mustGetAddress("SystemConfigProxy"), "SystemConfigProxy");
vm.label(address(l1StandardBridge), "L1StandardBridge"); vm.label(address(l1StandardBridge), "L1StandardBridge");
vm.label(mustGetAddress("L1StandardBridgeProxy"), "L1StandardBridgeProxy");
vm.label(address(l1CrossDomainMessenger), "L1CrossDomainMessenger"); vm.label(address(l1CrossDomainMessenger), "L1CrossDomainMessenger");
vm.label(mustGetAddress("L1CrossDomainMessengerProxy"), "L1CrossDomainMessengerProxy");
vm.label(address(addressManager), "AddressManager"); vm.label(address(addressManager), "AddressManager");
vm.label(address(l1ERC721Bridge), "L1ERC721Bridge"); vm.label(address(l1ERC721Bridge), "L1ERC721Bridge");
vm.label(mustGetAddress("L1ERC721BridgeProxy"), "L1ERC721BridgeProxy");
vm.label(address(l1OptimismMintableERC20Factory), "OptimismMintableERC20Factory"); vm.label(address(l1OptimismMintableERC20Factory), "OptimismMintableERC20Factory");
vm.label(mustGetAddress("OptimismMintableERC20FactoryProxy"), "OptimismMintableERC20FactoryProxy");
vm.label(address(protocolVersions), "ProtocolVersions"); 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. // Set up L2. There are currently no proxies set in the L2 initialization.
vm.etch( vm.etch(
Predeploys.L2_CROSS_DOMAIN_MESSENGER, Predeploys.L2_CROSS_DOMAIN_MESSENGER,
...@@ -146,6 +128,7 @@ contract CommonTest is Deploy, Test { ...@@ -146,6 +128,7 @@ contract CommonTest is Deploy, Test {
l2OptimismMintableERC20Factory.initialize(Predeploys.L2_STANDARD_BRIDGE); l2OptimismMintableERC20Factory.initialize(Predeploys.L2_STANDARD_BRIDGE);
vm.etch(Predeploys.LEGACY_ERC20_ETH, address(new LegacyERC20ETH()).code); 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); vm.etch(Predeploys.L2_ERC721_BRIDGE, address(new L2ERC721Bridge(address(l1ERC721Bridge))).code);
l2ERC721Bridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE); l2ERC721Bridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE);
...@@ -214,205 +197,5 @@ contract CommonTest is Deploy, Test { ...@@ -214,205 +197,5 @@ contract CommonTest is Deploy, Test {
vm.label(Predeploys.GAS_PRICE_ORACLE, "GasPriceOracle"); vm.label(Predeploys.GAS_PRICE_ORACLE, "GasPriceOracle");
vm.label(Predeploys.LEGACY_MESSAGE_PASSER, "LegacyMessagePasser"); vm.label(Predeploys.LEGACY_MESSAGE_PASSER, "LegacyMessagePasser");
vm.label(Predeploys.GOVERNANCE_TOKEN, "GovernanceToken"); 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);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment