Commit 1e159c7e authored by Mark Tyneway's avatar Mark Tyneway Committed by Maurelian

contracts-bedrock: ERC721Bridge pausable

Enable pausability in the ERC721Bridge following the other bridges
that also received pausability.
parent 13a12557
=======================
👁👁 STORAGE LAYOUT snapshot 👁👁
=======================
=======================
➡ src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|--------------------|---------------------------|------|--------|-------|----------------------------------------------------------|
| spacer_0_0_20 | address | 0 | 0 | 20 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| _initialized | uint8 | 0 | 20 | 1 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| _initializing | bool | 0 | 21 | 1 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_1_0_1600 | uint256[50] | 1 | 0 | 1600 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_51_0_20 | address | 51 | 0 | 20 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_52_0_1568 | uint256[49] | 52 | 0 | 1568 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_101_0_1 | bool | 101 | 0 | 1 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_102_0_1568 | uint256[49] | 102 | 0 | 1568 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_151_0_32 | uint256 | 151 | 0 | 32 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_152_0_1568 | uint256[49] | 152 | 0 | 1568 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_201_0_32 | mapping(bytes32 => bool) | 201 | 0 | 32 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| spacer_202_0_32 | mapping(bytes32 => bool) | 202 | 0 | 32 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| successfulMessages | mapping(bytes32 => bool) | 203 | 0 | 32 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| xDomainMsgSender | address | 204 | 0 | 20 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| msgNonce | uint240 | 205 | 0 | 30 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| failedMessages | mapping(bytes32 => bool) | 206 | 0 | 32 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| __gap | uint256[44] | 207 | 0 | 1408 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
| superchainConfig | contract SuperchainConfig | 251 | 0 | 20 | src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger |
=======================
➡ src/L1/L1StandardBridge.sol:L1StandardBridge
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|---------------|-------------------------------------------------|------|--------|-------|----------------------------------------------|
| spacer_0_0_20 | address | 0 | 0 | 20 | src/L1/L1StandardBridge.sol:L1StandardBridge |
| spacer_1_0_20 | address | 1 | 0 | 20 | src/L1/L1StandardBridge.sol:L1StandardBridge |
| deposits | mapping(address => mapping(address => uint256)) | 2 | 0 | 32 | src/L1/L1StandardBridge.sol:L1StandardBridge |
| __gap | uint256[47] | 3 | 0 | 1504 | src/L1/L1StandardBridge.sol:L1StandardBridge |
=======================
➡ src/L1/L2OutputOracle.sol:L2OutputOracle
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|---------------------|-------------------------------|------|--------|-------|------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | src/L1/L2OutputOracle.sol:L2OutputOracle |
| _initializing | bool | 0 | 1 | 1 | src/L1/L2OutputOracle.sol:L2OutputOracle |
| startingBlockNumber | uint256 | 1 | 0 | 32 | src/L1/L2OutputOracle.sol:L2OutputOracle |
| startingTimestamp | uint256 | 2 | 0 | 32 | src/L1/L2OutputOracle.sol:L2OutputOracle |
| l2Outputs | struct Types.OutputProposal[] | 3 | 0 | 32 | src/L1/L2OutputOracle.sol:L2OutputOracle |
=======================
➡ src/L1/OptimismPortal.sol:OptimismPortal
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------------|------------------------------------------------------------|------|--------|-------|------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | src/L1/OptimismPortal.sol:OptimismPortal |
| _initializing | bool | 0 | 1 | 1 | src/L1/OptimismPortal.sol:OptimismPortal |
| params | struct ResourceMetering.ResourceParams | 1 | 0 | 32 | src/L1/OptimismPortal.sol:OptimismPortal |
| __gap | uint256[48] | 2 | 0 | 1536 | src/L1/OptimismPortal.sol:OptimismPortal |
| l2Sender | address | 50 | 0 | 20 | src/L1/OptimismPortal.sol:OptimismPortal |
| finalizedWithdrawals | mapping(bytes32 => bool) | 51 | 0 | 32 | src/L1/OptimismPortal.sol:OptimismPortal |
| provenWithdrawals | mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal) | 52 | 0 | 32 | src/L1/OptimismPortal.sol:OptimismPortal |
| spacer_53_0_1 | bool | 53 | 0 | 1 | src/L1/OptimismPortal.sol:OptimismPortal |
| superchainConfig | contract SuperchainConfig | 53 | 1 | 20 | src/L1/OptimismPortal.sol:OptimismPortal |
=======================
➡ src/L1/SystemConfig.sol:SystemConfig
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|-----------------|----------------------------------------|------|--------|-------|--------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | src/L1/SystemConfig.sol:SystemConfig |
| _initializing | bool | 0 | 1 | 1 | src/L1/SystemConfig.sol:SystemConfig |
| __gap | uint256[50] | 1 | 0 | 1600 | src/L1/SystemConfig.sol:SystemConfig |
| _owner | address | 51 | 0 | 20 | src/L1/SystemConfig.sol:SystemConfig |
| __gap | uint256[49] | 52 | 0 | 1568 | src/L1/SystemConfig.sol:SystemConfig |
| overhead | uint256 | 101 | 0 | 32 | src/L1/SystemConfig.sol:SystemConfig |
| scalar | uint256 | 102 | 0 | 32 | src/L1/SystemConfig.sol:SystemConfig |
| batcherHash | bytes32 | 103 | 0 | 32 | src/L1/SystemConfig.sol:SystemConfig |
| gasLimit | uint64 | 104 | 0 | 8 | src/L1/SystemConfig.sol:SystemConfig |
| _resourceConfig | struct ResourceMetering.ResourceConfig | 105 | 0 | 32 | src/L1/SystemConfig.sol:SystemConfig |
=======================
➡ src/L1/L1ERC721Bridge.sol:L1ERC721Bridge
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|---------------|------------------------------------------------------------------|------|--------|-------|------------------------------------------|
| _initialized | uint8 | 0 | 0 | 1 | src/L1/L1ERC721Bridge.sol:L1ERC721Bridge |
| _initializing | bool | 0 | 1 | 1 | src/L1/L1ERC721Bridge.sol:L1ERC721Bridge |
| __gap | uint256[48] | 1 | 0 | 1536 | src/L1/L1ERC721Bridge.sol:L1ERC721Bridge |
| deposits | mapping(address => mapping(address => mapping(uint256 => bool))) | 49 | 0 | 32 | src/L1/L1ERC721Bridge.sol:L1ERC721Bridge |
=======================
➡ src/legacy/DeployerWhitelist.sol:DeployerWhitelist
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|-----------|--------------------------|------|--------|-------|----------------------------------------------------|
| owner | address | 0 | 0 | 20 | src/legacy/DeployerWhitelist.sol:DeployerWhitelist |
| whitelist | mapping(address => bool) | 1 | 0 | 32 | src/legacy/DeployerWhitelist.sol:DeployerWhitelist |
=======================
➡ src/L2/L1Block.sol:L1Block
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|---------|------|--------|-------|----------------------------|
| number | uint64 | 0 | 0 | 8 | src/L2/L1Block.sol:L1Block |
| timestamp | uint64 | 0 | 8 | 8 | src/L2/L1Block.sol:L1Block |
| basefee | uint256 | 1 | 0 | 32 | src/L2/L1Block.sol:L1Block |
| hash | bytes32 | 2 | 0 | 32 | src/L2/L1Block.sol:L1Block |
| sequenceNumber | uint64 | 3 | 0 | 8 | src/L2/L1Block.sol:L1Block |
| batcherHash | bytes32 | 4 | 0 | 32 | src/L2/L1Block.sol:L1Block |
| l1FeeOverhead | uint256 | 5 | 0 | 32 | src/L2/L1Block.sol:L1Block |
| l1FeeScalar | uint256 | 6 | 0 | 32 | src/L2/L1Block.sol:L1Block |
=======================
➡ src/legacy/L1BlockNumber.sol:L1BlockNumber
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|------|------|------|--------|-------|----------|
=======================
➡ src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|--------------------|--------------------------|------|--------|-------|----------------------------------------------------------|
| spacer_0_0_20 | address | 0 | 0 | 20 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| _initialized | uint8 | 0 | 20 | 1 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| _initializing | bool | 0 | 21 | 1 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_1_0_1600 | uint256[50] | 1 | 0 | 1600 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_51_0_20 | address | 51 | 0 | 20 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_52_0_1568 | uint256[49] | 52 | 0 | 1568 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_101_0_1 | bool | 101 | 0 | 1 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_102_0_1568 | uint256[49] | 102 | 0 | 1568 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_151_0_32 | uint256 | 151 | 0 | 32 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_152_0_1568 | uint256[49] | 152 | 0 | 1568 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_201_0_32 | mapping(bytes32 => bool) | 201 | 0 | 32 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| spacer_202_0_32 | mapping(bytes32 => bool) | 202 | 0 | 32 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| successfulMessages | mapping(bytes32 => bool) | 203 | 0 | 32 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| xDomainMsgSender | address | 204 | 0 | 20 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| msgNonce | uint240 | 205 | 0 | 30 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| failedMessages | mapping(bytes32 => bool) | 206 | 0 | 32 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
| __gap | uint256[44] | 207 | 0 | 1408 | src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger |
=======================
➡ src/L2/L2StandardBridge.sol:L2StandardBridge
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|---------------|-------------------------------------------------|------|--------|-------|----------------------------------------------|
| spacer_0_0_20 | address | 0 | 0 | 20 | src/L2/L2StandardBridge.sol:L2StandardBridge |
| spacer_1_0_20 | address | 1 | 0 | 20 | src/L2/L2StandardBridge.sol:L2StandardBridge |
| deposits | mapping(address => mapping(address => uint256)) | 2 | 0 | 32 | src/L2/L2StandardBridge.sol:L2StandardBridge |
| __gap | uint256[47] | 3 | 0 | 1504 | src/L2/L2StandardBridge.sol:L2StandardBridge |
=======================
➡ src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|--------------|--------------------------|------|--------|-------|----------------------------------------------------|
| sentMessages | mapping(bytes32 => bool) | 0 | 0 | 32 | src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser |
| msgNonce | uint240 | 1 | 0 | 30 | src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser |
=======================
➡ src/legacy/LegacyERC20ETH.sol:LegacyERC20ETH
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|--------------|-------------------------------------------------|------|--------|-------|----------------------------------------------|
| _balances | mapping(address => uint256) | 0 | 0 | 32 | src/legacy/LegacyERC20ETH.sol:LegacyERC20ETH |
| _allowances | mapping(address => mapping(address => uint256)) | 1 | 0 | 32 | src/legacy/LegacyERC20ETH.sol:LegacyERC20ETH |
| _totalSupply | uint256 | 2 | 0 | 32 | src/legacy/LegacyERC20ETH.sol:LegacyERC20ETH |
| _name | string | 3 | 0 | 32 | src/legacy/LegacyERC20ETH.sol:LegacyERC20ETH |
| _symbol | string | 4 | 0 | 32 | src/legacy/LegacyERC20ETH.sol:LegacyERC20ETH |
=======================
➡ src/L2/SequencerFeeVault.sol:SequencerFeeVault
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|---------|------|--------|-------|------------------------------------------------|
| totalProcessed | uint256 | 0 | 0 | 32 | src/L2/SequencerFeeVault.sol:SequencerFeeVault |
=======================
➡ src/L2/BaseFeeVault.sol:BaseFeeVault
=======================
| Name | Type | Slot | Offset | Bytes | Contract |
|----------------|---------|------|--------|-------|--------------------------------------|
| totalProcessed | uint256 | 0 | 0 | 32 | src/L2/BaseFeeVault.sol:BaseFeeVault |
=======================
➡ src/L2/L1FeeVault.sol:L1FeeVault
=======================
...@@ -42,7 +42,7 @@ library ChainAssertions { ...@@ -42,7 +42,7 @@ library ChainAssertions {
checkL1StandardBridge({ _contracts: _prox, _isProxy: true }); checkL1StandardBridge({ _contracts: _prox, _isProxy: true });
checkL2OutputOracle(_prox, _cfg, _l2OutputOracleStartingTimestamp, _l2OutputOracleStartingBlockNumber); checkL2OutputOracle(_prox, _cfg, _l2OutputOracleStartingTimestamp, _l2OutputOracleStartingBlockNumber);
checkOptimismMintableERC20Factory(_prox); checkOptimismMintableERC20Factory(_prox);
checkL1ERC721Bridge(_prox); checkL1ERC721Bridge({ _contracts: _prox, _isProxy: true });
checkOptimismPortal({ _contracts: _prox, _cfg: _cfg, _isProxy: true }); checkOptimismPortal({ _contracts: _prox, _cfg: _cfg, _isProxy: true });
checkProtocolVersions({ _contracts: _prox, _cfg: _cfg, _isProxy: true }); checkProtocolVersions({ _contracts: _prox, _cfg: _cfg, _isProxy: true });
} }
......
...@@ -690,7 +690,11 @@ contract Deploy is Deployer { ...@@ -690,7 +690,11 @@ contract Deploy is Deployer {
// are always proxies. // are always proxies.
Types.ContractSet memory contracts = _proxiesUnstrict(); Types.ContractSet memory contracts = _proxiesUnstrict();
contracts.L1ERC721Bridge = address(bridge); contracts.L1ERC721Bridge = address(bridge);
ChainAssertions.checkL1ERC721Bridge(contracts);
ChainAssertions.checkL1ERC721Bridge({
_contracts: contracts,
_isProxy: false
});
addr_ = address(bridge); addr_ = address(bridge);
} }
...@@ -811,17 +815,22 @@ contract Deploy is Deployer { ...@@ -811,17 +815,22 @@ contract Deploy is Deployer {
ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin"));
address l1ERC721BridgeProxy = mustGetAddress("L1ERC721BridgeProxy"); address l1ERC721BridgeProxy = mustGetAddress("L1ERC721BridgeProxy");
address l1ERC721Bridge = mustGetAddress("L1ERC721Bridge"); address l1ERC721Bridge = mustGetAddress("L1ERC721Bridge");
address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy");
_callViaSafe({ _upgradeAndCallViaSafe({
_target: address(proxyAdmin), _proxy: payable(l1ERC721BridgeProxy),
_data: abi.encodeCall(ProxyAdmin.upgrade, (payable(l1ERC721BridgeProxy), l1ERC721Bridge)) _implementation: l1ERC721Bridge,
_innerCallData: abi.encodeCall(L1ERC721Bridge.initialize, (SuperchainConfig(superchainConfigProxy)))
}); });
L1ERC721Bridge bridge = L1ERC721Bridge(l1ERC721BridgeProxy); L1ERC721Bridge bridge = L1ERC721Bridge(l1ERC721BridgeProxy);
string memory version = bridge.version(); string memory version = bridge.version();
console.log("L1ERC721Bridge version: %s", version); console.log("L1ERC721Bridge version: %s", version);
ChainAssertions.checkL1ERC721Bridge(_proxies()); ChainAssertions.checkL1ERC721Bridge({
_contracts: _proxies(),
_isProxy: true
});
} }
/// @notice Ininitialize the OptimismMintableERC20Factory /// @notice Ininitialize the OptimismMintableERC20Factory
......
...@@ -8,6 +8,7 @@ import { ISemver } from "src/universal/ISemver.sol"; ...@@ -8,6 +8,7 @@ import { ISemver } from "src/universal/ISemver.sol";
import { Predeploys } from "src/libraries/Predeploys.sol"; import { Predeploys } from "src/libraries/Predeploys.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { Constants } from "src/libraries/Constants.sol"; import { Constants } from "src/libraries/Constants.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
/// @title L1ERC721Bridge /// @title L1ERC721Bridge
/// @notice The L1 ERC721 bridge is a contract which works together with the L2 ERC721 bridge to /// @notice The L1 ERC721 bridge is a contract which works together with the L2 ERC721 bridge to
...@@ -25,7 +26,15 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver { ...@@ -25,7 +26,15 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver {
/// @notice Constructs the L1ERC721Bridge contract. /// @notice Constructs the L1ERC721Bridge contract.
/// @param _messenger Address of the CrossDomainMessenger on this network. /// @param _messenger Address of the CrossDomainMessenger on this network.
/// @param _otherBridge Address of the ERC721 bridge on the other network. /// @param _otherBridge Address of the ERC721 bridge on the other network.
constructor(address _messenger, address _otherBridge) ERC721Bridge(_messenger, _otherBridge) { } constructor(address _messenger, address _otherBridge) ERC721Bridge(_messenger, _otherBridge) {
initialize(SuperchainConfig(address(0)));
}
/// @notice Initializes the contract.
/// @param _superchainConfig Address of the SuperchainConfig contract on this network.
function initialize(SuperchainConfig _superchainConfig) public initializer {
superChainConfig = _superchainConfig;
}
/// @notice Completes an ERC721 bridge from the other domain and sends the ERC721 token to the /// @notice Completes an ERC721 bridge from the other domain and sends the ERC721 token to the
/// recipient on this domain. /// recipient on this domain.
......
...@@ -2,12 +2,16 @@ ...@@ -2,12 +2,16 @@
pragma solidity 0.8.15; pragma solidity 0.8.15;
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { Address } from "@openzeppelin/contracts/utils/Address.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
/// @title ERC721Bridge /// @title ERC721Bridge
/// @notice ERC721Bridge is a base contract for the L1 and L2 ERC721 bridges. /// @notice ERC721Bridge is a base contract for the L1 and L2 ERC721 bridges.
abstract contract ERC721Bridge { abstract contract ERC721Bridge is Initializable {
/// @notice
SuperchainConfig public superChainConfig;
/// @notice Messenger contract on this domain. This will be removed in the /// @notice Messenger contract on this domain. This will be removed in the
/// future, use `messenger` instead. /// future, use `messenger` instead.
/// @custom:legacy /// @custom:legacy
...@@ -19,7 +23,7 @@ abstract contract ERC721Bridge { ...@@ -19,7 +23,7 @@ abstract contract ERC721Bridge {
address public immutable OTHER_BRIDGE; address public immutable OTHER_BRIDGE;
/// @notice Reserve extra slots (to a total of 50) in the storage layout for future upgrades. /// @notice Reserve extra slots (to a total of 50) in the storage layout for future upgrades.
uint256[49] private __gap; uint256[48] private __gap;
/// @notice Emitted when an ERC721 bridge to the other network is initiated. /// @notice Emitted when an ERC721 bridge to the other network is initiated.
/// @param localToken Address of the token on this domain. /// @param localToken Address of the token on this domain.
......
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