Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
63c71b69
Unverified
Commit
63c71b69
authored
Nov 22, 2023
by
Maurelian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
contracts-bedrock: Add Superchain Config immutable to OptimismPortal
parent
bd5f1d81
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
62 additions
and
57 deletions
+62
-57
ChainAssertions.sol
packages/contracts-bedrock/scripts/ChainAssertions.sol
+10
-9
Deploy.s.sol
packages/contracts-bedrock/scripts/Deploy.s.sol
+6
-4
OptimismPortal.sol
packages/contracts-bedrock/src/L1/OptimismPortal.sol
+29
-24
Initializable.t.sol
packages/contracts-bedrock/test/Initializable.t.sol
+1
-1
OptimismPortal.t.sol
packages/contracts-bedrock/test/OptimismPortal.t.sol
+16
-19
No files found.
packages/contracts-bedrock/scripts/ChainAssertions.sol
View file @
63c71b69
...
...
@@ -156,6 +156,7 @@ library ChainAssertions {
require(portal.guardian() == _cfg.portalGuardian());
require(address(portal.SYSTEM_CONFIG()) == _contracts.SystemConfig);
require(address(portal.systemConfig()) == _contracts.SystemConfig);
require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig));
require(portal.paused() == _isPaused);
}
...
...
@@ -181,16 +182,16 @@ library ChainAssertions {
}
/// @notice Asserts that the SuperchainConfig is setup correctly
function checkSuperchainConfig(
Types.ContractSet memory _contracts, DeployConfig _cfg) internal view {
SuperchainConfig superchainConfig = SuperchainConfig(_contracts.SuperchainConfig);
require(superchainConfig.guardian() == _cfg.portalGuardian());
require(superchainConfig.paused() == false);
}
/// @notice Asserts that the SuperchainConfig is setup correctly
function checkSuperchainConfig(Types.ContractSet memory _proxies, DeployConfig _cfg) internal view
{
function checkSuperchainConfig(
Types.ContractSet memory _proxies,
DeployConfig _cfg,
bool _isPaused
)
internal
view
{
SuperchainConfig superchainConfig = SuperchainConfig(_proxies.SuperchainConfig);
require(superchainConfig.guardian() == _cfg.portalGuardian());
require(superchainConfig.paused() ==
false
);
require(superchainConfig.paused() ==
_isPaused
);
}
}
packages/contracts-bedrock/scripts/Deploy.s.sol
View file @
63c71b69
...
...
@@ -504,12 +504,14 @@ contract Deploy is Deployer {
L2OutputOracle l2OutputOracle = L2OutputOracle(mustGetAddress("L2OutputOracleProxy"));
SystemConfig systemConfig = SystemConfig(mustGetAddress("SystemConfigProxy"));
SuperchainConfig superchainConfig = SuperchainConfig(mustGetAddress("SuperchainConfigProxy"));
OptimismPortal portal = new OptimismPortal{ salt: _implSalt() }({
_l2Oracle: l2OutputOracle,
_guardian: guardian,
_paused: true,
_systemConfig: systemConfig
_systemConfig: systemConfig,
_superchainConfig: superchainConfig
});
save("OptimismPortal", address(portal));
...
...
@@ -520,7 +522,7 @@ contract Deploy is Deployer {
// are always proxies.
Types.ContractSet memory contracts = _proxiesUnstrict();
contracts.OptimismPortal = address(portal);
ChainAssertions.checkOptimismPortal({ _contracts: contracts, _cfg: cfg, _isPaused:
tru
e });
ChainAssertions.checkOptimismPortal({ _contracts: contracts, _cfg: cfg, _isPaused:
fals
e });
require(loadInitializedSlot("OptimismPortal", false) == 1, "OptimismPortal is not initialized");
...
...
@@ -736,7 +738,7 @@ contract Deploy is Deployer {
_innerCallData: abi.encodeCall(SuperchainConfig.initialize, (cfg.portalGuardian()))
});
ChainAssertions.checkSuperchainConfig(
_proxiesUnstrict(), cfg
);
ChainAssertions.checkSuperchainConfig(
{ _proxies: _proxiesUnstrict(), _cfg: cfg, _isPaused: false }
);
}
/// @notice Initialize the DisputeGameFactory
...
...
@@ -939,7 +941,7 @@ contract Deploy is Deployer {
_upgradeAndCallViaSafe({
_proxy: payable(optimismPortalProxy),
_implementation: optimismPortal,
_innerCallData: abi.encodeCall(OptimismPortal.initialize, (
false
))
_innerCallData: abi.encodeCall(OptimismPortal.initialize, ())
});
OptimismPortal portal = OptimismPortal(payable(optimismPortalProxy));
...
...
packages/contracts-bedrock/src/L1/OptimismPortal.sol
View file @
63c71b69
...
...
@@ -5,6 +5,7 @@ import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable
import { SafeCall } from "src/libraries/SafeCall.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { Constants } from "src/libraries/Constants.sol";
import { Types } from "src/libraries/Types.sol";
import { Hashing } from "src/libraries/Hashing.sol";
...
...
@@ -51,6 +52,9 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
/// @custom:legacy
address public immutable GUARDIAN;
/// @notice The address of the Superchain Config contract.
SuperchainConfig internal immutable SUPERCHAIN_CONFIG;
/// @notice Address of the L2 account which initiated a withdrawal in this transaction.
/// If the of this variable is the default L2 sender address, then we are NOT inside of
/// a call to finalizeWithdrawalTransaction.
...
...
@@ -62,10 +66,13 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
/// @notice A mapping of withdrawal hashes to `ProvenWithdrawal` data.
mapping(bytes32 => ProvenWithdrawal) public provenWithdrawals;
/// @notice Determines if cross domain messaging is paused.
/// When set to true, withdrawals are paused.
/// This may be removed in the future.
bool public paused;
/// @custom:legacy
/// @custom:spacer paused
/// @notice Spacer for backwards compatibility.
bool public spacer_53_0_1;
/// @notice The address of the Superchain Config contract.
SuperchainConfig public superchainConfig;
/// @notice Emitted when a transaction is deposited from L1 to L2.
/// The parameters of this event are read by the rollup node and used to derive deposit
...
...
@@ -97,7 +104,7 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
/// @notice Reverts when paused.
modifier whenNotPaused() {
require(paused == false, "OptimismPortal: paused");
require(paused
()
== false, "OptimismPortal: paused");
_;
}
...
...
@@ -107,20 +114,19 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
/// @notice Constructs the OptimismPortal contract.
/// @param _l2Oracle Address of the L2OutputOracle contract.
/// @param _guardian Address that can pause withdrawals.
/// @param _paused Sets the contract's pausability state.
/// @param _systemConfig Address of the SystemConfig contract.
constructor(L2OutputOracle _l2Oracle, address _guardian, bool _paused, SystemConfig _systemConfig) {
/// @param _superchainConfig Address of the SuperchainConfig contract.
constructor(L2OutputOracle _l2Oracle, SystemConfig _systemConfig, SuperchainConfig _superchainConfig) {
L2_ORACLE = _l2Oracle;
GUARDIAN = _guardian;
SYSTEM_CONFIG = _systemConfig;
initialize(_paused);
SUPERCHAIN_CONFIG = _superchainConfig;
GUARDIAN = _superchainConfig.guardian();
initialize();
}
/// @notice Initializer.
function initialize(
bool _paused
) public initializer {
function initialize() public initializer {
l2Sender = Constants.DEFAULT_L2_SENDER;
paused = _paused;
__ResourceMetering_init();
}
...
...
@@ -136,24 +142,23 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
return SYSTEM_CONFIG;
}
/// @notice Getter function for the address of the L2OutputOracle on this chain.
/// @notice Getter function for the address of the L2OutputOracle on this chain. This will be removed in the
/// future, use `SuperchainConfig.guardian()` instead.
/// @notice Address of the L2OutputOracle on this chain.
/// @custom:legacy
function guardian() public view returns (address) {
return
GUARDIAN
;
return
SUPERCHAIN_CONFIG.guardian()
;
}
/// @notice Pauses withdrawals.
function pause() external {
require(msg.sender == GUARDIAN, "OptimismPortal: only guardian can pause");
paused = true;
emit Paused(msg.sender);
/// @notice Getter function for the address of the SuperchainConfig on this chain.
/// @return SuperchainConfig Address of the SuperchainConfig on this chain.
function superchainConfig() public view returns (SuperchainConfig) {
return SUPERCHAIN_CONFIG;
}
/// @notice Unpauses withdrawals.
function unpause() external {
require(msg.sender == GUARDIAN, "OptimismPortal: only guardian can unpause");
paused = false;
emit Unpaused(msg.sender);
/// @notice Getter for the current paused status.
function paused() public view returns (bool paused_) {
paused_ = SUPERCHAIN_CONFIG.paused();
}
/// @notice Computes the minimum gas limit for a deposit.
...
...
packages/contracts-bedrock/test/Initializable.t.sol
View file @
63c71b69
...
...
@@ -63,7 +63,7 @@ contract Initializer_Test is Bridge_Initializer {
contracts.push(
InitializeableContract({
target: address(optimismPortal),
initCalldata: abi.encodeCall(optimismPortal.initialize, (
false
)),
initCalldata: abi.encodeCall(optimismPortal.initialize, ()),
initializedSlotVal: deploy.loadInitializedSlot("OptimismPortal", true)
})
);
...
...
packages/contracts-bedrock/test/OptimismPortal.t.sol
View file @
63c71b69
...
...
@@ -21,9 +21,6 @@ import { SystemConfig } from "src/L1/SystemConfig.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract OptimismPortal_Test is CommonTest {
event Paused(address);
event Unpaused(address);
address depositor;
function setUp() public override {
...
...
@@ -49,11 +46,11 @@ contract OptimismPortal_Test is CommonTest {
assertEq(optimismPortal.paused(), false);
vm.expectEmit(address(
optimismPortal
));
emit Paused(
guardian
);
vm.expectEmit(address(
superchainConfig
));
emit Paused(
"identifier"
);
vm.prank(guardian);
optimismPortal.pause(
);
superchainConfig.pause("identifier"
);
assertEq(optimismPortal.paused(), true);
}
...
...
@@ -63,9 +60,9 @@ contract OptimismPortal_Test is CommonTest {
assertEq(optimismPortal.paused(), false);
assertTrue(optimismPortal.GUARDIAN() != alice);
vm.expectRevert("
OptimismPortal
: only guardian can pause");
vm.expectRevert("
SuperchainConfig
: only guardian can pause");
vm.prank(alice);
optimismPortal.pause(
);
superchainConfig.pause("identifier"
);
assertEq(optimismPortal.paused(), false);
}
...
...
@@ -76,13 +73,13 @@ contract OptimismPortal_Test is CommonTest {
address guardian = optimismPortal.GUARDIAN();
vm.prank(guardian);
optimismPortal.pause(
);
superchainConfig.pause("identifier"
);
assertEq(optimismPortal.paused(), true);
vm.expectEmit(address(
optimismPortal
));
emit Unpaused(
guardian
);
vm.expectEmit(address(
superchainConfig
));
emit Unpaused();
vm.prank(guardian);
optimismPortal
.unpause();
superchainConfig
.unpause();
assertEq(optimismPortal.paused(), false);
}
...
...
@@ -92,13 +89,13 @@ contract OptimismPortal_Test is CommonTest {
address guardian = optimismPortal.GUARDIAN();
vm.prank(guardian);
optimismPortal.pause(
);
superchainConfig.pause("identifier"
);
assertEq(optimismPortal.paused(), true);
assertTrue(optimismPortal.GUARDIAN() != alice);
vm.expectRevert("
OptimismPortal
: only guardian can unpause");
vm.expectRevert("
SuperchainConfig
: only guardian can unpause");
vm.prank(alice);
optimismPortal
.unpause();
superchainConfig
.unpause();
assertEq(optimismPortal.paused(), true);
}
...
...
@@ -383,7 +380,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
/// @dev Tests that `proveWithdrawalTransaction` reverts when paused.
function test_proveWithdrawalTransaction_paused_reverts() external {
vm.prank(optimismPortal.GUARDIAN());
optimismPortal.pause(
);
superchainConfig.pause("identifier"
);
vm.expectRevert("OptimismPortal: paused");
optimismPortal.proveWithdrawalTransaction({
...
...
@@ -535,7 +532,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
/// @dev Tests that `finalizeWithdrawalTransaction` reverts if the contract is paused.
function test_finalizeWithdrawalTransaction_paused_reverts() external {
vm.prank(optimismPortal.GUARDIAN());
optimismPortal.pause(
);
superchainConfig.pause("identifier"
);
vm.expectRevert("OptimismPortal: paused");
optimismPortal.finalizeWithdrawalTransaction(_defaultTx);
...
...
@@ -899,14 +896,14 @@ contract OptimismPortalUpgradeable_Test is CommonTest {
/// @dev Tests that the proxy cannot be initialized twice.
function test_initialize_cannotInitProxy_reverts() external {
vm.expectRevert("Initializable: contract is already initialized");
optimismPortal.initialize(
{ _paused: false }
);
optimismPortal.initialize();
}
/// @dev Tests that the implementation cannot be initialized twice.
function test_initialize_cannotInitImpl_reverts() external {
address opImpl = deploy.mustGetAddress("OptimismPortal");
vm.expectRevert("Initializable: contract is already initialized");
OptimismPortal(payable(opImpl)).initialize(
{ _paused: false }
);
OptimismPortal(payable(opImpl)).initialize();
}
/// @dev Tests that the proxy can be upgraded.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment