Commit 16e6c26c authored by Maurelian's avatar Maurelian

feat(ctb): Update tests

feat(Update Multichain.s.sol
Update tests

Update L2OutputOracle tests
parent 09b2bd17
...@@ -139,7 +139,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { ...@@ -139,7 +139,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
/// For now, it is critical that the first proposed output root of an OP stack /// For now, it is critical that the first proposed output root of an OP stack
/// chain is done so by an honest party. /// chain is done so by an honest party.
function test_initialize_firstOutput_reverts() public { function test_initialize_firstOutput_reverts() public {
uint256 submissionInterval = l2OutputOracle.submissionInterval(); uint256 submissionInterval = l2OutputOracle.SUBMISSION_INTERVAL();
vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x11)); vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x11));
factory.create(GAME_TYPE, ROOT_CLAIM, abi.encode(submissionInterval, block.number - 1)); factory.create(GAME_TYPE, ROOT_CLAIM, abi.encode(submissionInterval, block.number - 1));
} }
......
...@@ -15,16 +15,10 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol"; ...@@ -15,16 +15,10 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract Initializer_Test is Bridge_Initializer { contract Initializer_Test is Bridge_Initializer {
function test_cannotReinitializeL1_succeeds() public { function test_cannotReinitializeL1_succeeds() public {
vm.expectRevert("Initializable: contract is already initialized"); vm.expectRevert("Initializable: contract is already initialized");
l1CrossDomainMessenger.initialize(OptimismPortal(payable(address(0)))); l2OutputOracle.initialize(0, 0);
vm.expectRevert("Initializable: contract is already initialized"); vm.expectRevert("Initializable: contract is already initialized");
l1StandardBridge.initialize(CrossDomainMessenger(address(0))); optimismPortal.initialize(false);
vm.expectRevert("Initializable: contract is already initialized");
l2OutputOracle.initialize(0, 0, address(0), address(0));
vm.expectRevert("Initializable: contract is already initialized");
optimismPortal.initialize(L2OutputOracle(address(0)), address(0), SystemConfig(address(0)), false);
vm.expectRevert("Initializable: contract is already initialized"); vm.expectRevert("Initializable: contract is already initialized");
systemConfig.initialize({ systemConfig.initialize({
...@@ -41,20 +35,7 @@ contract Initializer_Test is Bridge_Initializer { ...@@ -41,20 +35,7 @@ contract Initializer_Test is Bridge_Initializer {
minimumBaseFee: 0, minimumBaseFee: 0,
systemTxMaxGas: 0, systemTxMaxGas: 0,
maximumBaseFee: 0 maximumBaseFee: 0
}),
_startBlock: type(uint256).max,
_batchInbox: address(0),
_addresses: SystemConfig.Addresses({
l1CrossDomainMessenger: address(0),
l1ERC721Bridge: address(0),
l1StandardBridge: address(0),
l2OutputOracle: address(0),
optimismPortal: address(0),
optimismMintableERC20Factory: address(0)
}) })
}); });
vm.expectRevert("Initializable: contract is already initialized");
l1ERC721Bridge.initialize(CrossDomainMessenger(address(0)));
} }
} }
...@@ -35,8 +35,6 @@ contract L1StandardBridge_Initialize_Test is Bridge_Initializer { ...@@ -35,8 +35,6 @@ contract L1StandardBridge_Initialize_Test is Bridge_Initializer {
assertEq(address(l1StandardBridge.messenger()), address(l1CrossDomainMessenger)); assertEq(address(l1StandardBridge.messenger()), address(l1CrossDomainMessenger));
assertEq(address(l1StandardBridge.OTHER_BRIDGE()), Predeploys.L2_STANDARD_BRIDGE); assertEq(address(l1StandardBridge.OTHER_BRIDGE()), Predeploys.L2_STANDARD_BRIDGE);
assertEq(address(l2StandardBridge), Predeploys.L2_STANDARD_BRIDGE); assertEq(address(l2StandardBridge), Predeploys.L2_STANDARD_BRIDGE);
bytes32 slot0 = vm.load(address(l1StandardBridge), bytes32(uint256(0)));
assertEq(slot0, bytes32(uint256(Constants.INITIALIZER)));
} }
} }
......
...@@ -36,9 +36,7 @@ contract OptimismPortal_Test is CommonTest { ...@@ -36,9 +36,7 @@ contract OptimismPortal_Test is CommonTest {
function test_constructor_succeeds() external { function test_constructor_succeeds() external {
address guardian = cfg.portalGuardian(); address guardian = cfg.portalGuardian();
assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle)); assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle));
assertEq(address(optimismPortal.l2Oracle()), address(l2OutputOracle));
assertEq(optimismPortal.GUARDIAN(), guardian); assertEq(optimismPortal.GUARDIAN(), guardian);
assertEq(optimismPortal.guardian(), guardian);
assertEq(optimismPortal.l2Sender(), 0x000000000000000000000000000000000000dEaD); assertEq(optimismPortal.l2Sender(), 0x000000000000000000000000000000000000dEaD);
assertEq(optimismPortal.paused(), false); assertEq(optimismPortal.paused(), false);
} }
...@@ -900,24 +898,14 @@ contract OptimismPortalUpgradeable_Test is CommonTest { ...@@ -900,24 +898,14 @@ contract OptimismPortalUpgradeable_Test is CommonTest {
/// @dev Tests that the proxy cannot be initialized twice. /// @dev Tests that the proxy cannot be initialized twice.
function test_initialize_cannotInitProxy_reverts() external { function test_initialize_cannotInitProxy_reverts() external {
vm.expectRevert("Initializable: contract is already initialized"); vm.expectRevert("Initializable: contract is already initialized");
optimismPortal.initialize({ optimismPortal.initialize({ _paused: false });
_l2Oracle: L2OutputOracle(address(0)),
_systemConfig: SystemConfig(address(0)),
_guardian: address(0),
_paused: false
});
} }
/// @dev Tests that the implementation cannot be initialized twice. /// @dev Tests that the implementation cannot be initialized twice.
function test_initialize_cannotInitImpl_reverts() external { function test_initialize_cannotInitImpl_reverts() external {
address opImpl = mustGetAddress("OptimismPortal"); address opImpl = mustGetAddress("OptimismPortal");
vm.expectRevert("Initializable: contract is already initialized"); vm.expectRevert("Initializable: contract is already initialized");
OptimismPortal(payable(opImpl)).initialize({ OptimismPortal(payable(opImpl)).initialize({ _paused: false });
_l2Oracle: L2OutputOracle(address(0)),
_systemConfig: SystemConfig(address(0)),
_guardian: address(0),
_paused: false
});
} }
/// @dev Tests that the proxy can be upgraded. /// @dev Tests that the proxy can be upgraded.
......
...@@ -10,12 +10,7 @@ import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; ...@@ -10,12 +10,7 @@ import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/// @notice Simple wrapper around the StandardBridge contract that exposes /// @notice Simple wrapper around the StandardBridge contract that exposes
/// internal functions so they can be more easily tested directly. /// internal functions so they can be more easily tested directly.
contract StandardBridgeTester is StandardBridge { contract StandardBridgeTester is StandardBridge {
constructor( constructor(address payable _messenger, address payable _otherBridge) StandardBridge(_messenger, _otherBridge) { }
address payable _messenger,
address payable _otherBridge
)
StandardBridge(StandardBridge(_otherBridge))
{ }
function isOptimismMintableERC20(address _token) external view returns (bool) { function isOptimismMintableERC20(address _token) external view returns (bool) {
return _isOptimismMintableERC20(_token); return _isOptimismMintableERC20(_token);
......
...@@ -45,21 +45,12 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init { ...@@ -45,21 +45,12 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
/// @dev Tests that initailization sets the correct values. /// @dev Tests that initailization sets the correct values.
function test_initialize_values_succeeds() external { function test_initialize_values_succeeds() external {
assertEq(systemConfig.l1CrossDomainMessenger(), address(l1CrossDomainMessenger));
assertEq(systemConfig.l1ERC721Bridge(), address(l1ERC721Bridge));
assertEq(systemConfig.l1StandardBridge(), address(l1StandardBridge));
assertEq(systemConfig.l2OutputOracle(), address(l2OutputOracle));
assertEq(systemConfig.optimismPortal(), address(optimismPortal));
assertEq(systemConfig.optimismMintableERC20Factory(), optimismMintableERC20Factory);
assertEq(systemConfig.batchInbox(), batchInbox);
assertEq(systemConfig.owner(), owner); assertEq(systemConfig.owner(), owner);
assertEq(systemConfig.overhead(), overhead); assertEq(systemConfig.overhead(), overhead);
assertEq(systemConfig.scalar(), scalar); assertEq(systemConfig.scalar(), scalar);
assertEq(systemConfig.batcherHash(), batcherHash); assertEq(systemConfig.batcherHash(), batcherHash);
assertEq(systemConfig.gasLimit(), gasLimit); assertEq(systemConfig.gasLimit(), gasLimit);
assertEq(systemConfig.unsafeBlockSigner(), unsafeBlockSigner); assertEq(systemConfig.unsafeBlockSigner(), unsafeBlockSigner);
// Depends on start block being set to 0 in `initialize`
assertEq(systemConfig.startBlock(), block.number);
// Depends on `initialize` being called with defaults // Depends on `initialize` being called with defaults
ResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); ResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG();
ResourceMetering.ResourceConfig memory actual = systemConfig.resourceConfig(); ResourceMetering.ResourceConfig memory actual = systemConfig.resourceConfig();
...@@ -70,139 +61,6 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init { ...@@ -70,139 +61,6 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
assertEq(actual.systemTxMaxGas, rcfg.systemTxMaxGas); assertEq(actual.systemTxMaxGas, rcfg.systemTxMaxGas);
assertEq(actual.maximumBaseFee, rcfg.maximumBaseFee); assertEq(actual.maximumBaseFee, rcfg.maximumBaseFee);
} }
/// @dev Ensures that the start block override can be used to set the start block.
function test_initialize_startBlockOverride_succeeds() external {
uint256 startBlock = 100;
// Wipe out the initialized slot so the proxy can be initialized again
vm.store(address(systemConfig), bytes32(0), bytes32(0));
assertEq(systemConfig.startBlock(), block.number);
// the startBlock slot is 106, wipe it out
vm.store(address(systemConfig), bytes32(uint256(106)), bytes32(0));
assertEq(systemConfig.startBlock(), 0);
address admin = address(uint160(uint256(vm.load(address(systemConfig), Constants.PROXY_OWNER_ADDRESS))));
vm.prank(admin);
Proxy(payable(address(systemConfig))).upgradeToAndCall(
address(systemConfigImpl),
abi.encodeCall(
SystemConfig.initialize,
(
alice, // _owner,
overhead, // _overhead,
scalar, // _scalar,
batcherHash, // _batcherHash
gasLimit, // _gasLimit,
unsafeBlockSigner, // _unsafeBlockSigner,
Constants.DEFAULT_RESOURCE_CONFIG(), // _config,
startBlock, // _startBlock
batchInbox, // _batchInbox
SystemConfig.Addresses({ // _addresses
l1CrossDomainMessenger: address(l1CrossDomainMessenger),
l1ERC721Bridge: address(l1ERC721Bridge),
l1StandardBridge: address(l1StandardBridge),
l2OutputOracle: address(l2OutputOracle),
optimismPortal: address(optimismPortal),
optimismMintableERC20Factory: optimismMintableERC20Factory
})
)
)
);
assertEq(systemConfig.startBlock(), startBlock);
}
/// @dev Tests that initialization with start block already set is a noop.
function test_initialize_startBlockNoop_reverts() external {
// wipe out initialized slot so we can initialize again
vm.store(address(systemConfig), bytes32(0), bytes32(0));
// the startBlock slot is 106, set it to something non zero
vm.store(address(systemConfig), bytes32(uint256(106)), bytes32(uint256(0xff)));
// Initialize with a non zero start block, should see a revert
vm.prank(EIP1967Helper.getAdmin(address(systemConfig)));
// The call to initialize reverts due to: "SystemConfig: cannot override an already set start block"
// but the proxy revert message bubbles up.
Proxy(payable(address(systemConfig))).upgradeToAndCall(
address(systemConfigImpl),
abi.encodeCall(
SystemConfig.initialize,
(
alice, // _owner,
overhead, // _overhead,
scalar, // _scalar,
batcherHash, // _batcherHash
gasLimit, // _gasLimit,
unsafeBlockSigner, // _unsafeBlockSigner,
Constants.DEFAULT_RESOURCE_CONFIG(), // _config,
1, // _startBlock
batchInbox, // _batchInbox
SystemConfig.Addresses({ // _addresses
l1CrossDomainMessenger: address(l1CrossDomainMessenger),
l1ERC721Bridge: address(l1ERC721Bridge),
l1StandardBridge: address(l1StandardBridge),
l2OutputOracle: address(l2OutputOracle),
optimismPortal: address(optimismPortal),
optimismMintableERC20Factory: optimismMintableERC20Factory
})
)
)
);
// It was initialized with 1 but it was already set so the override
// should be ignored.
uint256 startBlock = systemConfig.startBlock();
assertEq(startBlock, 0xff);
}
/// @dev Ensures that the events are emitted during initialization.
function test_initialize_events_succeeds() external {
// Wipe out the initialized slot so the proxy can be initialized again
vm.store(address(systemConfig), bytes32(0), bytes32(0));
vm.store(address(systemConfig), bytes32(uint256(106)), bytes32(0));
assertEq(systemConfig.startBlock(), 0);
// The order depends here
vm.expectEmit(true, true, true, true, address(systemConfig));
emit ConfigUpdate(0, SystemConfig.UpdateType.BATCHER, abi.encode(batcherHash));
vm.expectEmit(true, true, true, true, address(systemConfig));
emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_CONFIG, abi.encode(overhead, scalar));
vm.expectEmit(true, true, true, true, address(systemConfig));
emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_LIMIT, abi.encode(gasLimit));
vm.expectEmit(true, true, true, true, address(systemConfig));
emit ConfigUpdate(0, SystemConfig.UpdateType.UNSAFE_BLOCK_SIGNER, abi.encode(unsafeBlockSigner));
address admin = address(uint160(uint256(vm.load(address(systemConfig), Constants.PROXY_OWNER_ADDRESS))));
vm.prank(admin);
Proxy(payable(address(systemConfig))).upgradeToAndCall(
address(systemConfigImpl),
abi.encodeCall(
SystemConfig.initialize,
(
alice, // _owner,
overhead, // _overhead,
scalar, // _scalar,
batcherHash, // _batcherHash
gasLimit, // _gasLimit,
unsafeBlockSigner, // _unsafeBlockSigner,
Constants.DEFAULT_RESOURCE_CONFIG(), // _config,
0, // _startBlock
batchInbox, // _batchInbox
SystemConfig.Addresses({ // _addresses
l1CrossDomainMessenger: address(l1CrossDomainMessenger),
l1ERC721Bridge: address(l1ERC721Bridge),
l1StandardBridge: address(l1StandardBridge),
l2OutputOracle: address(l2OutputOracle),
optimismPortal: address(optimismPortal),
optimismMintableERC20Factory: optimismMintableERC20Factory
})
)
)
);
}
} }
contract SystemConfig_Initialize_TestFail is SystemConfig_Init { contract SystemConfig_Initialize_TestFail is SystemConfig_Init {
...@@ -231,17 +89,7 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Init { ...@@ -231,17 +89,7 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Init {
bytes32(hex"abcd"), // _batcherHash, bytes32(hex"abcd"), // _batcherHash,
minimumGasLimit - 1, // _gasLimit, minimumGasLimit - 1, // _gasLimit,
address(1), // _unsafeBlockSigner, address(1), // _unsafeBlockSigner,
Constants.DEFAULT_RESOURCE_CONFIG(), // _config, Constants.DEFAULT_RESOURCE_CONFIG() // _config
0, // _startBlock
address(0), // _batchInbox
SystemConfig.Addresses({ // _addresses
l1CrossDomainMessenger: address(0),
l1ERC721Bridge: address(0),
l1StandardBridge: address(0),
l2OutputOracle: address(0),
optimismPortal: address(0),
optimismMintableERC20Factory: address(0)
})
) )
) )
); );
......
...@@ -12,7 +12,15 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test { ...@@ -12,7 +12,15 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test {
function setUp() external { function setUp() external {
Proxy proxy = new Proxy(msg.sender); Proxy proxy = new Proxy(msg.sender);
SystemConfig configImpl = new SystemConfig(); SystemConfig configImpl = new SystemConfig({
_owner: address(0xbeef), // owner
_overhead: 2100, // overhead
_scalar: 1000000, // scalar
_batcherHash: bytes32(hex"abcd"), // batcher hash
_gasLimit: 30_000_000, // gas limit
_unsafeBlockSigner: address(1), // unsafe block signer
_config: Constants.DEFAULT_RESOURCE_CONFIG()
});
vm.prank(msg.sender); vm.prank(msg.sender);
proxy.upgradeToAndCall( proxy.upgradeToAndCall(
...@@ -26,17 +34,7 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test { ...@@ -26,17 +34,7 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test {
bytes32(hex"abcd"), // batcher hash bytes32(hex"abcd"), // batcher hash
30_000_000, // gas limit 30_000_000, // gas limit
address(1), // unsafe block signer address(1), // unsafe block signer
Constants.DEFAULT_RESOURCE_CONFIG(), // resource config Constants.DEFAULT_RESOURCE_CONFIG()
0, //_startBlock
address(0), // _batchInbox
SystemConfig.Addresses({ // _addrs
l1CrossDomainMessenger: address(0),
l1ERC721Bridge: address(0),
l1StandardBridge: address(0),
l2OutputOracle: address(0),
optimismPortal: address(0),
optimismMintableERC20Factory: address(0)
})
) )
) )
); );
......
...@@ -116,18 +116,17 @@ contract Setup is Deploy { ...@@ -116,18 +116,17 @@ contract Setup is Deploy {
vm.etch(address(l2ToL1MessagePasser), address(new L2ToL1MessagePasser()).code); vm.etch(address(l2ToL1MessagePasser), address(new L2ToL1MessagePasser()).code);
vm.etch( vm.etch(address(l2StandardBridge), address(new L2StandardBridge(payable(l1StandardBridge))).code);
address(l2StandardBridge), address(new L2StandardBridge(StandardBridge(payable(l1StandardBridge)))).code
);
l2StandardBridge.initialize();
vm.etch(address(l2OptimismMintableERC20Factory), address(new OptimismMintableERC20Factory()).code); vm.etch(address(l2OptimismMintableERC20Factory), address(new OptimismMintableERC20Factory()).code);
l2OptimismMintableERC20Factory.initialize(address(l2StandardBridge)); l2OptimismMintableERC20Factory.initialize(address(l2StandardBridge));
vm.etch(address(legacyERC20ETH), address(new LegacyERC20ETH()).code); vm.etch(address(legacyERC20ETH), address(new LegacyERC20ETH()).code);
vm.etch(address(l2ERC721Bridge), address(new L2ERC721Bridge(address(l1ERC721Bridge))).code); vm.etch(
l2ERC721Bridge.initialize(); address(l2ERC721Bridge),
address(new L2ERC721Bridge(address(l2CrossDomainMessenger), address(l1ERC721Bridge))).code
);
vm.etch( vm.etch(
address(sequencerFeeVault), address(sequencerFeeVault),
......
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