Commit 7db0f6af authored by smartcontracts's avatar smartcontracts Committed by GitHub

maint: add interfaces for L2 bridge/messaging contracts (#11859)

First PR for adding interfaces for L2 contracts. Adds interfaces
for all of the bridging and message passing contracts.
parent ae37e024
......@@ -15,18 +15,13 @@ import { Process } from "scripts/libraries/Process.sol";
import { SetPreinstalls } from "scripts/SetPreinstalls.s.sol";
// Contracts
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
import { L1Block } from "src/L2/L1Block.sol";
import { GasPriceOracle } from "src/L2/GasPriceOracle.sol";
import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
import { BaseFeeVault } from "src/L2/BaseFeeVault.sol";
import { L1FeeVault } from "src/L2/L1FeeVault.sol";
import { OptimismSuperchainERC20Beacon } from "src/L2/OptimismSuperchainERC20Beacon.sol";
import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
import { GovernanceToken } from "src/governance/GovernanceToken.sol";
......@@ -36,6 +31,11 @@ import { Preinstalls } from "src/libraries/Preinstalls.sol";
// Interfaces
import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol";
import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol";
import { IL2StandardBridge } from "src/L2/interfaces/IL2StandardBridge.sol";
import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol";
import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol";
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
interface IInitializable {
function initialize(address _addr) external;
......@@ -304,10 +304,10 @@ contract L2Genesis is Deployer {
function setL2CrossDomainMessenger(address payable _l1CrossDomainMessengerProxy) public {
address impl = _setImplementationCode(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
L2CrossDomainMessenger(impl).initialize({ _l1CrossDomainMessenger: CrossDomainMessenger(address(0)) });
IL2CrossDomainMessenger(impl).initialize({ _l1CrossDomainMessenger: ICrossDomainMessenger(address(0)) });
L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize({
_l1CrossDomainMessenger: CrossDomainMessenger(_l1CrossDomainMessengerProxy)
IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize({
_l1CrossDomainMessenger: ICrossDomainMessenger(_l1CrossDomainMessengerProxy)
});
}
......@@ -323,10 +323,10 @@ contract L2Genesis is Deployer {
impl = _setImplementationCode(Predeploys.L2_STANDARD_BRIDGE);
}
L2StandardBridge(payable(impl)).initialize({ _otherBridge: StandardBridge(payable(address(0))) });
IL2StandardBridge(payable(impl)).initialize({ _otherBridge: IStandardBridge(payable(address(0))) });
L2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize({
_otherBridge: StandardBridge(_l1StandardBridgeProxy)
IL2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize({
_otherBridge: IStandardBridge(_l1StandardBridgeProxy)
});
}
......@@ -334,9 +334,9 @@ contract L2Genesis is Deployer {
function setL2ERC721Bridge(address payable _l1ERC721BridgeProxy) public {
address impl = _setImplementationCode(Predeploys.L2_ERC721_BRIDGE);
L2ERC721Bridge(impl).initialize({ _l1ERC721Bridge: payable(address(0)) });
IL2ERC721Bridge(impl).initialize({ _l1ERC721Bridge: payable(address(0)) });
L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE).initialize({ _l1ERC721Bridge: payable(_l1ERC721BridgeProxy) });
IL2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE).initialize({ _l1ERC721Bridge: payable(_l1ERC721BridgeProxy) });
}
/// @notice This predeploy is following the safety invariant #2,
......
......@@ -68,9 +68,6 @@ EXCLUDE_CONTRACTS=(
"ISuperchainConfig"
"IOptimismPortal"
"IL1BlockIsthmus"
# Need to make complex tweaks to the check script for this one
"ISystemConfigInterop"
)
# Find all JSON files in the forge-artifacts folder
......@@ -187,17 +184,23 @@ for interface_file in $JSON_FILES; do
# Base contracts aren't allowed to inherit from their interfaces in order
# to guarantee a 1:1 match between interfaces and contracts. This means
# that the interface will redefine types in the base contract. We normalize
# the ABI as if the interface and contract are the same name
# the ABI as if the interface and contract are the same name.
normalize_abi() {
# Here we just remove the leading "I" from any contract, enum, or
# struct type. It's not beautiful but it's good enough for now. It
# would miss certain edge cases like if an interface really is using
# the contract type instead of the interface type but that's unlikely
# to happen in practice and should be an easy fix if it does.
local abi="$1"
local interface_name="$2"
local contract_name="$3"
echo "${abi//$interface_name/$contract_name}"
abi="${abi//\"internalType\": \"contract I/\"internalType\": \"contract }"
abi="${abi//\"internalType\": \"enum I/\"internalType\": \"enum }"
abi="${abi//\"internalType\": \"struct I/\"internalType\": \"struct }"
echo "$abi"
}
# Normalize the ABIs
normalized_interface_abi=$(normalize_abi "$interface_abi" "$contract_name" "$contract_basename")
normalized_contract_abi="$contract_abi"
normalized_interface_abi=$(normalize_abi "$interface_abi")
normalized_contract_abi=$(normalize_abi "$contract_abi")
# Use jq to compare the ABIs
if ! diff_result=$(diff -u <(echo "$normalized_interface_abi" | jq -S .) <(echo "$normalized_contract_abi" | jq -S .)); then
......
......@@ -20,8 +20,8 @@
"sourceCodeHash": "0xb77342e6b55b835e9597f7a1c4a2d52ddd56f5cfb7cd38da0bcc488c79a9011e"
},
"src/L1/L1ERC721Bridge.sol": {
"initCodeHash": "0xda80d225e332f9ab38d5f3ae655df3eea1dd56dbb523036a25c78859d2931ada",
"sourceCodeHash": "0x0454bb88f7b52c362309935fa21ecc8be7bd6f0d888270b8a00677c60c1014cb"
"initCodeHash": "0xfb8b3c51e1790a0b951eaba05ed7368309fbfc7ddc558b4ce1de29da087fb4bd",
"sourceCodeHash": "0xcb125e7f640cf5f372c7bf4f8e36150328914ceef99b6fd5d65ae12b6db430b5"
},
"src/L1/L1StandardBridge.sol": {
"initCodeHash": "0x2868b09ecbe9f2bbc885605c2886b4c79f1c8e4171626c63776603b1b84698a8",
......@@ -92,8 +92,8 @@
"sourceCodeHash": "0x927cc729bf5c9f209112df597f649493f276c4c50e17a57f7da02c2be266b192"
},
"src/L2/L2CrossDomainMessenger.sol": {
"initCodeHash": "0xe7090ce8119fe373d930baa68c1df585953b7f6e8beea2a0084589d394bcab64",
"sourceCodeHash": "0xea51d4b7a96c3a4c06d73c214208775b6845d5f696198c169ef7c14ea005d451"
"initCodeHash": "0xff39e6cf57acfc04e7f3242d7a45b0b4dec489b5cb3aabb319dae94dfb7ee454",
"sourceCodeHash": "0x60620a3aa6dd85974bb4267fb8c5845ffe8981dd7772b8d9055c0392ed414f77"
},
"src/L2/L2ERC721Bridge.sol": {
"initCodeHash": "0x827077e1a0ce6c8f9ee1196c409ea77d831efd440992b3969b05259083cdf0bd",
......
......@@ -3,7 +3,6 @@ pragma solidity 0.8.15;
// Contracts
import { ERC721Bridge } from "src/universal/ERC721Bridge.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
......@@ -14,6 +13,7 @@ import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import { ISemver } from "src/universal/interfaces/ISemver.sol";
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol";
import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol";
/// @custom:proxied true
/// @title L1ERC721Bridge
......@@ -29,8 +29,8 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver {
ISuperchainConfig public superchainConfig;
/// @notice Semantic version.
/// @custom:semver 2.1.1-beta.2
string public constant version = "2.1.1-beta.2";
/// @custom:semver 2.1.1-beta.3
string public constant version = "2.1.1-beta.3";
/// @notice Constructs the L1ERC721Bridge contract.
constructor() ERC721Bridge() {
......@@ -109,7 +109,7 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver {
// Construct calldata for _l2Token.finalizeBridgeERC721(_to, _tokenId)
bytes memory message = abi.encodeWithSelector(
L2ERC721Bridge.finalizeBridgeERC721.selector, _remoteToken, _localToken, _from, _to, _tokenId, _extraData
IL2ERC721Bridge.finalizeBridgeERC721.selector, _remoteToken, _localToken, _from, _to, _tokenId, _extraData
);
// Lock token into bridge
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol";
import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol";
import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol";
interface IL1CrossDomainMessenger {
event FailedRelayedMessage(bytes32 indexed msgHash);
event Initialized(uint8 version);
event RelayedMessage(bytes32 indexed msgHash);
event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit);
event SentMessageExtension1(address indexed sender, uint256 value);
function MESSAGE_VERSION() external view returns (uint16);
function MIN_GAS_CALLDATA_OVERHEAD() external view returns (uint64);
function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() external view returns (uint64);
function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() external view returns (uint64);
function OTHER_MESSENGER() external view returns (address);
interface IL1CrossDomainMessenger is ICrossDomainMessenger {
function PORTAL() external view returns (address);
function RELAY_CALL_OVERHEAD() external view returns (uint64);
function RELAY_CONSTANT_OVERHEAD() external view returns (uint64);
function RELAY_GAS_CHECK_BUFFER() external view returns (uint64);
function RELAY_RESERVED_GAS() external view returns (uint64);
function baseGas(bytes memory _message, uint32 _minGasLimit) external pure returns (uint64);
function failedMessages(bytes32) external view returns (bool);
function initialize(
ISuperchainConfig _superchainConfig,
IOptimismPortal _portal,
ISystemConfig _systemConfig
)
external;
function messageNonce() external view returns (uint256);
function otherMessenger() external view returns (address);
function paused() external view returns (bool);
function portal() external view returns (address);
function relayMessage(
uint256 _nonce,
address _sender,
address _target,
uint256 _value,
uint256 _minGasLimit,
bytes memory _message
)
external
payable;
function sendMessage(address _target, bytes memory _message, uint32 _minGasLimit) external payable;
function successfulMessages(bytes32) external view returns (bool);
function superchainConfig() external view returns (address);
function systemConfig() external view returns (address);
function version() external view returns (string memory);
function xDomainMessageSender() external view returns (address);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { Predeploys } from "src/libraries/Predeploys.sol";
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
// Contracts
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
// Interfaces
import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol";
/// @title CrossDomainOwnable2
/// @notice This contract extends the OpenZeppelin `Ownable` contract for L2 contracts to be owned
/// by contracts on L1. Note that this contract is meant to be used with systems that use
......@@ -15,7 +20,7 @@ abstract contract CrossDomainOwnable2 is Ownable {
/// `xDomainMessageSender` is the owner of the contract. This value is set to the caller
/// of the L1CrossDomainMessenger.
function _checkOwner() internal view override {
L2CrossDomainMessenger messenger = L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
IL2CrossDomainMessenger messenger = IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
require(msg.sender == address(messenger), "CrossDomainOwnable2: caller is not the messenger");
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { Predeploys } from "src/libraries/Predeploys.sol";
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
// Contracts
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
// Interfaces
import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol";
/// @title CrossDomainOwnable3
/// @notice This contract extends the OpenZeppelin `Ownable` contract for L2 contracts to be owned
/// by contracts on either L1 or L2. Note that this contract is meant to be used with
......@@ -42,7 +47,7 @@ abstract contract CrossDomainOwnable3 is Ownable {
if (isLocal) {
require(owner() == msg.sender, "CrossDomainOwnable3: caller is not the owner");
} else {
L2CrossDomainMessenger messenger = L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
IL2CrossDomainMessenger messenger = IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
require(msg.sender == address(messenger), "CrossDomainOwnable3: caller is not the messenger");
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Contracts
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L1Block } from "src/L2/L1Block.sol";
// Libraries
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { ISemver } from "src/universal/interfaces/ISemver.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { Constants } from "src/libraries/Constants.sol";
import { L1Block } from "src/L2/L1Block.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
// Interfaces
import { ISemver } from "src/universal/interfaces/ISemver.sol";
import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol";
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000007
/// @title L2CrossDomainMessenger
......@@ -17,8 +22,8 @@ import { Predeploys } from "src/libraries/Predeploys.sol";
/// L2 on the L2 side. Users are generally encouraged to use this contract instead of lower
/// level message passing contracts.
contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver {
/// @custom:semver 2.1.1-beta.1
string public constant version = "2.1.1-beta.1";
/// @custom:semver 2.1.1-beta.2
string public constant version = "2.1.1-beta.2";
/// @notice Constructs the L2CrossDomainMessenger contract.
constructor() CrossDomainMessenger() {
......@@ -41,7 +46,7 @@ contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver {
/// @inheritdoc CrossDomainMessenger
function _sendMessage(address _to, uint64 _gasLimit, uint256 _value, bytes memory _data) internal override {
L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: _value }(
IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: _value }(
_to, _gasLimit, _data
);
}
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
interface IL2CrossDomainMessenger is ICrossDomainMessenger {
function MESSAGE_VERSION() external view returns (uint16);
function initialize(ICrossDomainMessenger _l1CrossDomainMessenger) external;
function l1CrossDomainMessenger() external view returns (ICrossDomainMessenger);
function version() external view returns (string memory);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC721Bridge } from "src/universal/interfaces/IERC721Bridge.sol";
interface IL2ERC721Bridge is IERC721Bridge {
function finalizeBridgeERC721(
address _localToken,
address _remoteToken,
address _from,
address _to,
uint256 _tokenId,
bytes memory _extraData
)
external;
function initialize(address payable _l1ERC721Bridge) external;
function version() external view returns (string memory);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol";
interface IL2StandardBridge is IStandardBridge {
event DepositFinalized(
address indexed l1Token,
address indexed l2Token,
address indexed from,
address to,
uint256 amount,
bytes extraData
);
event WithdrawalInitiated(
address indexed l1Token,
address indexed l2Token,
address indexed from,
address to,
uint256 amount,
bytes extraData
);
receive() external payable;
function initialize(IStandardBridge _otherBridge) external;
function l1TokenBridge() external view returns (address);
function version() external pure returns (string memory);
function withdraw(
address _l2Token,
uint256 _amount,
uint32 _minGasLimit,
bytes memory _extraData
)
external
payable;
function withdrawTo(
address _l2Token,
address _to,
uint256 _amount,
uint32 _minGasLimit,
bytes memory _extraData
)
external
payable;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IL2StandardBridge } from "src/L2/interfaces/IL2StandardBridge.sol";
interface IMintableAndBurnable is IERC20 {
function mint(address, uint256) external;
function burn(address, uint256) external;
}
interface IL2StandardBridgeInterop is IL2StandardBridge {
error InvalidDecimals();
error InvalidLegacyERC20Address();
error InvalidSuperchainERC20Address();
error InvalidTokenPair();
event Converted(address indexed from, address indexed to, address indexed caller, uint256 amount);
receive() external payable;
function convert(address _from, address _to, uint256 _amount) external;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IL2ToL1MessagePasser {
event MessagePassed(
uint256 indexed nonce,
address indexed sender,
address indexed target,
uint256 value,
uint256 gasLimit,
bytes data,
bytes32 withdrawalHash
);
event WithdrawerBalanceBurnt(uint256 indexed amount);
receive() external payable;
function MESSAGE_VERSION() external view returns (uint16);
function burn() external;
function initiateWithdrawal(address _target, uint256 _gasLimit, bytes memory _data) external payable;
function messageNonce() external view returns (uint256);
function sentMessages(bytes32) external view returns (bool);
function version() external view returns (string memory);
}
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
// Libraries
import { SafeCall } from "src/libraries/SafeCall.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
// Interfaces
import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol";
/// @title FeeVault
/// @notice The FeeVault contract contains the basic logic for the various different vault contracts
/// used to hold fee revenue generated by the L2 system.
......@@ -102,7 +105,7 @@ abstract contract FeeVault {
bool success = SafeCall.send(RECIPIENT, value);
require(success, "FeeVault: failed to send ETH to L2 fee recipient");
} else {
L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: value }({
IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: value }({
_target: RECIPIENT,
_gasLimit: WITHDRAWAL_MIN_GAS,
_data: hex""
......
......@@ -6,7 +6,6 @@ import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Contracts
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
......@@ -15,6 +14,7 @@ import { Predeploys } from "src/libraries/Predeploys.sol";
import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol";
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol";
import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol";
/// @dev Test ERC721 contract.
contract TestERC721 is ERC721 {
......@@ -96,7 +96,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer {
(
address(l2ERC721Bridge),
abi.encodeCall(
L2ERC721Bridge.finalizeBridgeERC721,
IL2ERC721Bridge.finalizeBridgeERC721,
(address(remoteToken), address(localToken), alice, alice, tokenId, hex"5678")
),
1234
......@@ -177,7 +177,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer {
(
address(Predeploys.L2_ERC721_BRIDGE),
abi.encodeCall(
L2ERC721Bridge.finalizeBridgeERC721,
IL2ERC721Bridge.finalizeBridgeERC721,
(address(remoteToken), address(localToken), alice, bob, tokenId, hex"5678")
),
1234
......
......@@ -8,7 +8,6 @@ import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Contracts
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Testing utilities
// Testing
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
......@@ -11,20 +11,20 @@ import { Hashing } from "src/libraries/Hashing.sol";
import { Encoding } from "src/libraries/Encoding.sol";
import { Types } from "src/libraries/Types.sol";
import { Constants } from "src/libraries/Constants.sol";
// Target contract dependencies
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
// Interfaces
import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol";
import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol";
contract L2CrossDomainMessenger_Test is Bridge_Initializer {
/// @dev Receiver address for testing
address recipient = address(0xabbaacdc);
/// @dev Tests that the implementation is initialized correctly.
function test_constructor_succeeds() external view {
L2CrossDomainMessenger impl =
L2CrossDomainMessenger(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2CrossDomainMessenger")));
IL2CrossDomainMessenger impl =
IL2CrossDomainMessenger(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2CrossDomainMessenger")));
assertEq(address(impl.OTHER_MESSENGER()), address(0));
assertEq(address(impl.otherMessenger()), address(0));
assertEq(address(impl.l1CrossDomainMessenger()), address(0));
......@@ -50,7 +50,7 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer {
vm.expectCall(
address(l2ToL1MessagePasser),
abi.encodeWithSelector(
L2ToL1MessagePasser.initiateWithdrawal.selector,
IL2ToL1MessagePasser.initiateWithdrawal.selector,
address(l1CrossDomainMessenger),
l2CrossDomainMessenger.baseGas(hex"ff", 100),
xDomainCallData
......@@ -238,7 +238,7 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer {
vm.expectCall(
address(l2ToL1MessagePasser),
abi.encodeWithSelector(
L2ToL1MessagePasser.initiateWithdrawal.selector,
IL2ToL1MessagePasser.initiateWithdrawal.selector,
address(l1CrossDomainMessenger),
l2CrossDomainMessenger.baseGas(hex"ff", 100),
xDomainCallData
......
......@@ -7,11 +7,11 @@ import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Contracts
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
import { OptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol";
// Interfaces
import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol";
import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol";
contract TestERC721 is ERC721 {
constructor() ERC721("Test", "TST") { }
......@@ -97,7 +97,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer {
(
address(l1ERC721Bridge),
abi.encodeCall(
L2ERC721Bridge.finalizeBridgeERC721,
IL2ERC721Bridge.finalizeBridgeERC721,
(address(remoteToken), address(localToken), alice, alice, tokenId, hex"5678")
),
1234
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Testing utilities
// Testing
import { stdStorage, StdStorage } from "forge-std/Test.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
// Target contract is imported by the `Bridge_Initializer`
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
import { stdStorage, StdStorage } from "forge-std/Test.sol";
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
// Contracts
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
import { Hashing } from "src/libraries/Hashing.sol";
import { Types } from "src/libraries/Types.sol";
// Target contract dependencies
import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
// Interfaces
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol";
import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol";
import { IL2StandardBridge } from "src/L2/interfaces/IL2StandardBridge.sol";
contract L2StandardBridge_Test is Bridge_Initializer {
using stdStorage for StdStorage;
/// @dev Test that the bridge's constructor sets the correct values.
function test_constructor_succeeds() external view {
L2StandardBridge impl =
L2StandardBridge(payable(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2StandardBridge"))));
IL2StandardBridge impl =
IL2StandardBridge(payable(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2StandardBridge"))));
// The implementation contract is initialized with a 0 L1 bridge address,
// but the L2 cross-domain-messenger is always set to the predeploy address for both proxy and implementation.
assertEq(address(impl.MESSENGER()), Predeploys.L2_CROSS_DOMAIN_MESSENGER, "constructor zero check MESSENGER");
......@@ -57,7 +57,7 @@ contract L2StandardBridge_Test is Bridge_Initializer {
uint256 nonce = l2CrossDomainMessenger.messageNonce();
bytes memory message =
abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, 100, hex"");
abi.encodeWithSelector(IStandardBridge.finalizeBridgeETH.selector, alice, alice, 100, hex"");
uint64 baseGas = l2CrossDomainMessenger.baseGas(message, 200_000);
bytes memory withdrawalData = abi.encodeWithSelector(
ICrossDomainMessenger.relayMessage.selector,
......@@ -118,7 +118,7 @@ contract L2StandardBridge_Test is Bridge_Initializer {
vm.expectCall(
Predeploys.L2_TO_L1_MESSAGE_PASSER,
abi.encodeWithSelector(
L2ToL1MessagePasser.initiateWithdrawal.selector,
IL2ToL1MessagePasser.initiateWithdrawal.selector,
address(l1CrossDomainMessenger),
baseGas,
withdrawalData
......@@ -278,7 +278,7 @@ contract PreBridgeERC20 is Bridge_Initializer {
assertEq(ERC20(_l2Token).balanceOf(alice), 100);
uint256 nonce = l2CrossDomainMessenger.messageNonce();
bytes memory message = abi.encodeWithSelector(
StandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, alice, 100, hex""
IStandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, alice, 100, hex""
);
uint64 baseGas = l2CrossDomainMessenger.baseGas(message, 1000);
bytes memory withdrawalData = abi.encodeWithSelector(
......@@ -323,7 +323,7 @@ contract PreBridgeERC20 is Bridge_Initializer {
vm.expectCall(
Predeploys.L2_TO_L1_MESSAGE_PASSER,
abi.encodeWithSelector(
L2ToL1MessagePasser.initiateWithdrawal.selector,
IL2ToL1MessagePasser.initiateWithdrawal.selector,
address(l1CrossDomainMessenger),
baseGas,
withdrawalData
......@@ -416,7 +416,7 @@ contract PreBridgeERC20To is Bridge_Initializer {
assertEq(ERC20(L2Token).balanceOf(alice), 100);
uint256 nonce = l2CrossDomainMessenger.messageNonce();
bytes memory message = abi.encodeWithSelector(
StandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, bob, 100, hex""
IStandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, bob, 100, hex""
);
uint64 baseGas = l2CrossDomainMessenger.baseGas(message, 1000);
bytes memory withdrawalData = abi.encodeWithSelector(
......@@ -486,7 +486,7 @@ contract PreBridgeERC20To is Bridge_Initializer {
vm.expectCall(
Predeploys.L2_TO_L1_MESSAGE_PASSER,
abi.encodeWithSelector(
L2ToL1MessagePasser.initiateWithdrawal.selector,
IL2ToL1MessagePasser.initiateWithdrawal.selector,
address(l1CrossDomainMessenger),
baseGas,
withdrawalData
......@@ -551,7 +551,7 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer {
uint256 nonce = l2CrossDomainMessenger.messageNonce();
bytes memory message =
abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, _value, _extraData);
abi.encodeWithSelector(IStandardBridge.finalizeBridgeETH.selector, alice, alice, _value, _extraData);
vm.expectCall(
address(l2StandardBridge),
......@@ -604,7 +604,7 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer {
);
bytes memory message =
abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, bob, _value, _extraData);
abi.encodeWithSelector(IStandardBridge.finalizeBridgeETH.selector, alice, bob, _value, _extraData);
// the L2 bridge should call
// L2CrossDomainMessenger.sendMessage
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Target contract is imported by the `Bridge_Initializer`
// Testing
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Target contract dependencies
import {
L2StandardBridgeInterop,
InvalidDecimals,
InvalidLegacyERC20Address,
InvalidSuperchainERC20Address,
InvalidTokenPair,
IOptimismERC20Factory,
MintableAndBurnable
} from "src/L2/L2StandardBridgeInterop.sol";
// Libraries
// TODO: Replace Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY with optimismSuperchainERC20Factory
import { Predeploys } from "src/libraries/Predeploys.sol";
// Interfaces
import { IL2StandardBridgeInterop, IMintableAndBurnable } from "src/L2/interfaces/IL2StandardBridgeInterop.sol";
import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import { IOptimismMintableERC20 } from "src/universal/interfaces/IOptimismMintableERC20.sol";
import { ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol";
contract L2StandardBridgeInterop_Test is Bridge_Initializer {
/// @notice Emitted when a conversion is made.
......@@ -99,7 +96,7 @@ contract L2StandardBridgeInterop_LegacyToSuper_Test is L2StandardBridgeInterop_T
_mockDecimals(_to, _decimalsTo);
// Expect the revert with `InvalidDecimals` selector
vm.expectRevert(InvalidDecimals.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidDecimals.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -114,7 +111,7 @@ contract L2StandardBridgeInterop_LegacyToSuper_Test is L2StandardBridgeInterop_T
_mockDeployments(address(l2OptimismMintableERC20Factory), _from, address(0));
// Expect the revert with `InvalidLegacyERC20Address` selector
vm.expectRevert(InvalidLegacyERC20Address.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidLegacyERC20Address.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -142,7 +139,7 @@ contract L2StandardBridgeInterop_LegacyToSuper_Test is L2StandardBridgeInterop_T
_mockDeployments(address(l2OptimismSuperchainERC20Factory), _to, address(0));
// Expect the revert with `InvalidSuperchainERC20Address` selector
vm.expectRevert(InvalidSuperchainERC20Address.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidSuperchainERC20Address.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -173,7 +170,7 @@ contract L2StandardBridgeInterop_LegacyToSuper_Test is L2StandardBridgeInterop_T
_mockDeployments(address(l2OptimismSuperchainERC20Factory), _to, _toRemoteToken);
// Expect the revert with `InvalidTokenPair` selector
vm.expectRevert(InvalidTokenPair.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidTokenPair.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -204,8 +201,10 @@ contract L2StandardBridgeInterop_LegacyToSuper_Test is L2StandardBridgeInterop_T
emit Converted(_from, _to, _caller, _amount);
// Mock and expect the `burn` and `mint` functions
_mockAndExpect(_from, abi.encodeWithSelector(MintableAndBurnable.burn.selector, _caller, _amount), abi.encode());
_mockAndExpect(_to, abi.encodeWithSelector(MintableAndBurnable.mint.selector, _caller, _amount), abi.encode());
_mockAndExpect(
_from, abi.encodeWithSelector(IMintableAndBurnable.burn.selector, _caller, _amount), abi.encode()
);
_mockAndExpect(_to, abi.encodeWithSelector(IMintableAndBurnable.mint.selector, _caller, _amount), abi.encode());
// Act
vm.prank(_caller);
......@@ -253,7 +252,7 @@ contract L2StandardBridgeInterop_SuperToLegacy_Test is L2StandardBridgeInterop_T
_mockDecimals(_to, _decimalsTo);
// Expect the revert with `InvalidDecimals` selector
vm.expectRevert(InvalidDecimals.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidDecimals.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -268,7 +267,7 @@ contract L2StandardBridgeInterop_SuperToLegacy_Test is L2StandardBridgeInterop_T
_mockDeployments(address(l2OptimismMintableERC20Factory), _to, address(0));
// Expect the revert with `InvalidLegacyERC20Address` selector
vm.expectRevert(InvalidLegacyERC20Address.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidLegacyERC20Address.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -296,7 +295,7 @@ contract L2StandardBridgeInterop_SuperToLegacy_Test is L2StandardBridgeInterop_T
_mockDeployments(address(l2OptimismSuperchainERC20Factory), _from, address(0));
// Expect the revert with `InvalidSuperchainERC20Address` selector
vm.expectRevert(InvalidSuperchainERC20Address.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidSuperchainERC20Address.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -327,7 +326,7 @@ contract L2StandardBridgeInterop_SuperToLegacy_Test is L2StandardBridgeInterop_T
_mockDeployments(address(l2OptimismSuperchainERC20Factory), _from, _toRemoteToken);
// Expect the revert with `InvalidTokenPair` selector
vm.expectRevert(InvalidTokenPair.selector);
vm.expectRevert(IL2StandardBridgeInterop.InvalidTokenPair.selector);
// Act
l2StandardBridge.convert(_from, _to, _amount);
......@@ -358,8 +357,10 @@ contract L2StandardBridgeInterop_SuperToLegacy_Test is L2StandardBridgeInterop_T
emit Converted(_from, _to, _caller, _amount);
// Mock and expect the `burn` and `mint` functions
_mockAndExpect(_from, abi.encodeWithSelector(MintableAndBurnable.burn.selector, _caller, _amount), abi.encode());
_mockAndExpect(_to, abi.encodeWithSelector(MintableAndBurnable.mint.selector, _caller, _amount), abi.encode());
_mockAndExpect(
_from, abi.encodeWithSelector(IMintableAndBurnable.burn.selector, _caller, _amount), abi.encode()
);
_mockAndExpect(_to, abi.encodeWithSelector(IMintableAndBurnable.mint.selector, _caller, _amount), abi.encode());
// Act
vm.prank(_caller);
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Testing utilities
// Testing
import { CommonTest } from "test/setup/CommonTest.sol";
import { Reverter } from "test/mocks/Callers.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { Hashing } from "src/libraries/Hashing.sol";
import { Types } from "src/libraries/Types.sol";
// Libraries
import { Predeploys } from "src/libraries/Predeploys.sol";
// Target contract dependencies
// Contracts
import { FeeVault } from "src/universal/FeeVault.sol";
// Target contract
import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
// Libraries
import { Hashing } from "src/libraries/Hashing.sol";
import { Types } from "src/libraries/Types.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
contract SequencerFeeVault_Test is CommonTest {
address recipient;
......
......@@ -14,16 +14,11 @@ import { OutputMode, Fork, ForkUtils } from "scripts/libraries/Config.sol";
import { Executables } from "scripts/libraries/Executables.sol";
// Contracts
import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
import { L2StandardBridgeInterop } from "src/L2/L2StandardBridgeInterop.sol";
import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
import { BaseFeeVault } from "src/L2/BaseFeeVault.sol";
import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
import { L1FeeVault } from "src/L2/L1FeeVault.sol";
import { GasPriceOracle } from "src/L2/GasPriceOracle.sol";
import { L1Block } from "src/L2/L1Block.sol";
import { LegacyMessagePasser } from "src/legacy/LegacyMessagePasser.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
import { WETH } from "src/L2/WETH.sol";
import { SuperchainWETH } from "src/L2/SuperchainWETH.sol";
......@@ -48,10 +43,15 @@ import { IDataAvailabilityChallenge } from "src/L1/interfaces/IDataAvailabilityC
import { IL1StandardBridge } from "src/L1/interfaces/IL1StandardBridge.sol";
import { IProtocolVersions } from "src/L1/interfaces/IProtocolVersions.sol";
import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol";
import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol";
import { IL2StandardBridgeInterop } from "src/L2/interfaces/IL2StandardBridgeInterop.sol";
import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol";
import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol";
import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol";
import { IAddressManager } from "src/legacy/interfaces/IAddressManager.sol";
import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol";
import { IGovernanceToken } from "src/governance/interfaces/IGovernanceToken.sol";
import { ILegacyMessagePasser } from "src/legacy/interfaces/ILegacyMessagePasser.sol";
/// @title Setup
/// @dev This contact is responsible for setting up the contracts in state. It currently
......@@ -92,20 +92,20 @@ contract Setup {
IDataAvailabilityChallenge dataAvailabilityChallenge;
// L2 contracts
L2CrossDomainMessenger l2CrossDomainMessenger =
L2CrossDomainMessenger(payable(Predeploys.L2_CROSS_DOMAIN_MESSENGER));
L2StandardBridgeInterop l2StandardBridge = L2StandardBridgeInterop(payable(Predeploys.L2_STANDARD_BRIDGE));
L2ToL1MessagePasser l2ToL1MessagePasser = L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER));
IL2CrossDomainMessenger l2CrossDomainMessenger =
IL2CrossDomainMessenger(payable(Predeploys.L2_CROSS_DOMAIN_MESSENGER));
IL2StandardBridgeInterop l2StandardBridge = IL2StandardBridgeInterop(payable(Predeploys.L2_STANDARD_BRIDGE));
IL2ToL1MessagePasser l2ToL1MessagePasser = IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER));
IOptimismMintableERC20Factory l2OptimismMintableERC20Factory =
IOptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY);
L2ERC721Bridge l2ERC721Bridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE);
IL2ERC721Bridge l2ERC721Bridge = IL2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE);
BaseFeeVault baseFeeVault = BaseFeeVault(payable(Predeploys.BASE_FEE_VAULT));
SequencerFeeVault sequencerFeeVault = SequencerFeeVault(payable(Predeploys.SEQUENCER_FEE_WALLET));
L1FeeVault l1FeeVault = L1FeeVault(payable(Predeploys.L1_FEE_VAULT));
GasPriceOracle gasPriceOracle = GasPriceOracle(Predeploys.GAS_PRICE_ORACLE);
L1Block l1Block = L1Block(Predeploys.L1_BLOCK_ATTRIBUTES);
LegacyMessagePasser legacyMessagePasser = LegacyMessagePasser(Predeploys.LEGACY_MESSAGE_PASSER);
IGovernanceToken governanceToken = IGovernanceToken(Predeploys.GOVERNANCE_TOKEN);
ILegacyMessagePasser legacyMessagePasser = ILegacyMessagePasser(Predeploys.LEGACY_MESSAGE_PASSER);
WETH weth = WETH(payable(Predeploys.WETH));
SuperchainWETH superchainWeth = SuperchainWETH(payable(Predeploys.SUPERCHAIN_WETH));
ETHLiquidity ethLiquidity = ETHLiquidity(Predeploys.ETH_LIQUIDITY);
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { LibString } from "@solady/utils/LibString.sol";
// Testing
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
// Scripts
import { Executables } from "scripts/libraries/Executables.sol";
import { Constants } from "src/libraries/Constants.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol";
import { StandardBridge } from "src/universal/StandardBridge.sol";
import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol";
import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol";
import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol";
import { ForgeArtifacts, StorageSlot } from "scripts/libraries/ForgeArtifacts.sol";
import { Process } from "scripts/libraries/Process.sol";
// Contracts
import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol";
import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol";
// Libraries
import { LibString } from "@solady/utils/LibString.sol";
import { Constants } from "src/libraries/Constants.sol";
import { GameTypes } from "src/dispute/lib/Types.sol";
import { ForgeArtifacts, StorageSlot } from "scripts/libraries/ForgeArtifacts.sol";
import { Process } from "scripts/libraries/Process.sol";
import { ProtocolVersion } from "src/L1/interfaces/IProtocolVersions.sol";
import "src/dispute/lib/Types.sol";
import "scripts/deploy/Deployer.sol";
// Interfaces
import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol";
import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol";
import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol";
import { ProtocolVersion } from "src/L1/interfaces/IProtocolVersions.sol";
/// @title Initializer_Test
/// @dev Ensures that the `initialize()` function on contracts cannot be called more than
/// once. This contract inherits from `ERC721Bridge_Initializer` because it is the
......@@ -264,9 +270,7 @@ contract Initializer_Test is Bridge_Initializer {
InitializeableContract({
name: "L2CrossDomainMessenger",
target: address(l2CrossDomainMessenger),
initCalldata: abi.encodeCall(
l2CrossDomainMessenger.initialize, (CrossDomainMessenger(address(l1CrossDomainMessenger)))
)
initCalldata: abi.encodeCall(l2CrossDomainMessenger.initialize, (l1CrossDomainMessenger))
})
);
// L1StandardBridgeImpl
......@@ -275,8 +279,7 @@ contract Initializer_Test is Bridge_Initializer {
name: "L1StandardBridge",
target: deploy.mustGetAddress("L1StandardBridge"),
initCalldata: abi.encodeCall(
l1StandardBridge.initialize,
(ICrossDomainMessenger(address(l1CrossDomainMessenger)), superchainConfig, systemConfig)
l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig)
)
})
);
......@@ -286,8 +289,7 @@ contract Initializer_Test is Bridge_Initializer {
name: "L1StandardBridgeProxy",
target: address(l1StandardBridge),
initCalldata: abi.encodeCall(
l1StandardBridge.initialize,
(ICrossDomainMessenger(address(l1CrossDomainMessenger)), superchainConfig, systemConfig)
l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig)
)
})
);
......@@ -296,7 +298,7 @@ contract Initializer_Test is Bridge_Initializer {
InitializeableContract({
name: "L2StandardBridge",
target: address(l2StandardBridge),
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (StandardBridge(payable(l1StandardBridge))))
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge))
})
);
// L2StandardBridgeInterop
......@@ -304,7 +306,7 @@ contract Initializer_Test is Bridge_Initializer {
InitializeableContract({
name: "L2StandardBridgeInterop",
target: address(l2StandardBridge),
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (StandardBridge(payable(l1StandardBridge))))
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge))
})
);
// L1ERC721BridgeImpl
......@@ -312,9 +314,7 @@ contract Initializer_Test is Bridge_Initializer {
InitializeableContract({
name: "L1ERC721Bridge",
target: deploy.mustGetAddress("L1ERC721Bridge"),
initCalldata: abi.encodeCall(
l1ERC721Bridge.initialize, (ICrossDomainMessenger(address(l1CrossDomainMessenger)), superchainConfig)
)
initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig))
})
);
// L1ERC721BridgeProxy
......@@ -322,9 +322,7 @@ contract Initializer_Test is Bridge_Initializer {
InitializeableContract({
name: "L1ERC721BridgeProxy",
target: address(l1ERC721Bridge),
initCalldata: abi.encodeCall(
l1ERC721Bridge.initialize, (ICrossDomainMessenger(address(l1CrossDomainMessenger)), superchainConfig)
)
initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig))
})
);
// L2ERC721Bridge
......
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