Commit cecb3c16 authored by Mark Tyneway's avatar Mark Tyneway

contracts-bedrock: modularize L2 setup

parent 6e890faf
......@@ -59,4 +59,3 @@ runs = 512
[profile.lite]
optimizer = false
......@@ -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 {
......
// 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;
......
......@@ -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/CommonTest.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.
......
......@@ -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.
......
......@@ -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
......
// SPDX-License-Identifier: MIT
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";
contract DelayedVetoable_Init is CommonTest {
......
......@@ -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/CommonTest.sol";
contract DisputeGameFactory_Init is L2OutputOracle_Initializer {
contract DisputeGameFactory_Init is CommonTest {
DisputeGameFactory factory;
FakeClone fakeClone;
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries
import { Types } from "src/libraries/Types.sol";
......
......@@ -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";
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
contract GasPriceOracle_Test is CommonTest {
event OverheadUpdated(uint256);
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
contract GovernanceToken_Test is CommonTest {
address owner;
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries
import { Types } from "src/libraries/Types.sol";
......
// 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";
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
// Target contract
import { L1Block } from "src/L2/L1Block.sol";
......
......@@ -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);
......
......@@ -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
......
......@@ -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";
......
......@@ -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);
......
......@@ -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";
......
......@@ -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/CommonTest.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();
......
......@@ -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";
......
......@@ -2,25 +2,13 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.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(
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
// Target contract dependencies
import { Predeploys } from "src/libraries/Predeploys.sol";
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
contract LegacyMessagePasser_Test is CommonTest {
/// @dev Tests that `passMessageToL1` succeeds.
......
......@@ -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`
......
// SPDX-License-Identifier: MIT
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 { PreimageOracle } from "src/cannon/PreimageOracle.sol";
import "src/libraries/DisputeTypes.sol";
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
// Target contract dependencies
import { GovernanceToken } from "src/governance/GovernanceToken.sol";
......
// 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";
......
......@@ -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);
......
......@@ -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 {
......
......@@ -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";
......
......@@ -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;
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
// Libraries
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// 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 { 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.
......
......@@ -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/CommonTest.sol";
import { OptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
......
......@@ -2,7 +2,7 @@
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "test/CommonTest.t.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
// Libraries
import { Constants } from "src/libraries/Constants.sol";
......
......@@ -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 {
......
// SPDX-License-Identifier: MIT
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 { 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 {
......
......@@ -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/CommonTest.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 {
......
// 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
);
}
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