Commit 68fc10f5 authored by Mark Tyneway's avatar Mark Tyneway Committed by GitHub

Merge pull request #7679 from ethereum-optimism/ctb/initialize-unit-tests

contracts-bedrock: initialize tests
parents 9a4d0e03 6f20dad3
This diff is collapsed.
This diff is collapsed.
......@@ -161,6 +161,7 @@ GovernanceToken_Test:test_mint_fromOwner_succeeds() (gas: 108592)
GovernanceToken_Test:test_transferFrom_succeeds() (gas: 146273)
GovernanceToken_Test:test_transfer_succeeds() (gas: 138108)
Hashing_hashDepositSource_Test:test_hashDepositSource_succeeds() (gas: 633)
Initializer_Test:test_cannotReinitializeL1_succeeds() (gas: 98390)
L1BlockNumberTest:test_fallback_succeeds() (gas: 18655)
L1BlockNumberTest:test_getL1BlockNumber_succeeds() (gas: 10625)
L1BlockNumberTest:test_receive_succeeds() (gas: 25384)
......@@ -185,21 +186,21 @@ L1CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 392933)
L1CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 1669172)
L1CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 86992)
L1CrossDomainMessenger_Test:test_xDomainSender_notSet_reverts() (gas: 24253)
L1ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 62677)
L1ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 37273)
L1ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 455254)
L1ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 70985)
L1ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 35669)
L1ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 60552)
L1ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 35192)
L1ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 454951)
L1ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 70811)
L1ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 62686)
L1ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 37285)
L1ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 455269)
L1ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 70997)
L1ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 35681)
L1ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 60561)
L1ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 35204)
L1ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 454966)
L1ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 70823)
L1ERC721Bridge_Test:test_constructor_succeeds() (gas: 18861)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notEscrowed_reverts() (gas: 29472)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 27217)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 23238)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notEscrowed_reverts() (gas: 29475)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 27220)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 23241)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 24990)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 425227)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 425245)
L1StandardBridge_BridgeETHTo_Test:test_bridgeETHTo_succeeds() (gas: 514756)
L1StandardBridge_BridgeETH_Test:test_bridgeETH_succeeds() (gas: 501934)
L1StandardBridge_DepositERC20To_Test:test_depositERC20To_succeeds() (gas: 720272)
......@@ -228,22 +229,22 @@ L2CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 123957)
L2CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 135812)
L2CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 48371)
L2CrossDomainMessenger_Test:test_xDomainSender_senderNotSet_reverts() (gas: 10590)
L2ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 31428)
L2ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 26826)
L2ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 157122)
L2ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 34461)
L2ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 27177)
L2ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 29302)
L2ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 24635)
L2ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 154737)
L2ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 34265)
L2ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 31431)
L2ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 26832)
L2ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 157134)
L2ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 34467)
L2ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 27183)
L2ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 29305)
L2ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 24641)
L2ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 154746)
L2ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 34271)
L2ERC721Bridge_Test:test_constructor_succeeds() (gas: 21027)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_alreadyExists_reverts() (gas: 38658)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_alreadyExists_reverts() (gas: 38661)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_interfaceNotCompliant_reverts() (gas: 246925)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 27205)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 23271)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 27208)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 23274)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 27124)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 179964)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 179976)
L2OutputOracleUpgradeable_Test:test_initValuesOnImpl_succeeds() (gas: 23902)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy_succeeds() (gas: 46800)
L2OutputOracleUpgradeable_Test:test_initializeImpl_alreadyInitialized_reverts() (gas: 15216)
......@@ -422,10 +423,10 @@ OptimismMintableERC20_Test:test_legacy_succeeds() (gas: 14322)
OptimismMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11165)
OptimismMintableERC20_Test:test_mint_succeeds() (gas: 63544)
OptimismMintableERC20_Test:test_remoteToken_succeeds() (gas: 7667)
OptimismMintableERC721Factory_Test:test_constructor_succeeds() (gas: 8351)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_sameTwice_reverts() (gas: 8937393460516800041)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_succeeds() (gas: 2316109)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_zeroRemoteToken_reverts() (gas: 9418)
OptimismMintableERC721Factory_Test:test_constructor_succeeds() (gas: 8381)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_sameTwice_reverts() (gas: 8937393460516800045)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_succeeds() (gas: 2316169)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_zeroRemoteToken_reverts() (gas: 9493)
OptimismMintableERC721_Test:test_burn_notBridge_reverts() (gas: 136966)
OptimismMintableERC721_Test:test_burn_succeeds() (gas: 118832)
OptimismMintableERC721_Test:test_constructor_succeeds() (gas: 24162)
......
......@@ -447,9 +447,9 @@ contract Bridge_Initializer is Messenger_Initializer {
}
}
contract ERC721Bridge_Initializer is Messenger_Initializer {
L1ERC721Bridge L1Bridge;
L2ERC721Bridge L2Bridge;
contract ERC721Bridge_Initializer is Bridge_Initializer {
L1ERC721Bridge L1NFTBridge;
L2ERC721Bridge L2NFTBridge;
function setUp() public virtual override {
super.setUp();
......@@ -463,10 +463,10 @@ contract ERC721Bridge_Initializer is Messenger_Initializer {
address(l1BridgeImpl), abi.encodeCall(L1ERC721Bridge.initialize, (CrossDomainMessenger(L1Messenger)))
);
L1Bridge = L1ERC721Bridge(address(l1BridgeProxy));
L1NFTBridge = L1ERC721Bridge(address(l1BridgeProxy));
// Deploy the implementation for the L2ERC721Bridge and etch it into the predeploy address.
L2ERC721Bridge l2BridgeImpl = new L2ERC721Bridge(address(L1Bridge));
L2ERC721Bridge l2BridgeImpl = new L2ERC721Bridge(address(L1NFTBridge));
Proxy l2BridgeProxy = new Proxy(multisig);
vm.etch(Predeploys.L2_ERC721_BRIDGE, address(l2BridgeProxy).code);
......@@ -480,11 +480,11 @@ contract ERC721Bridge_Initializer is Messenger_Initializer {
);
// Set up a reference to the L2ERC721Bridge.
L2Bridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE);
L2NFTBridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE);
// Label the L1 and L2 bridges.
vm.label(address(L1Bridge), "L1ERC721Bridge");
vm.label(address(L2Bridge), "L2ERC721Bridge");
vm.label(address(L1NFTBridge), "L1ERC721Bridge");
vm.label(address(L2NFTBridge), "L2ERC721Bridge");
}
}
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { ERC721Bridge_Initializer } from "test/CommonTest.t.sol";
import { console } from "forge-std/console.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.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
/// deepest contract in the inheritance chain for setting up the system contracts.
contract Initializer_Test is ERC721Bridge_Initializer {
function test_cannotReinitializeL1_succeeds() public {
vm.expectRevert("Initializable: contract is already initialized");
L1Messenger.initialize(OptimismPortal(payable(address(0))));
vm.expectRevert("Initializable: contract is already initialized");
L1Bridge.initialize(CrossDomainMessenger(address(0)));
vm.expectRevert("Initializable: contract is already initialized");
oracle.initialize(0, 0, address(0), address(0));
vm.expectRevert("Initializable: contract is already initialized");
op.initialize(L2OutputOracle(address(0)), address(0), SystemConfig(address(0)), false);
vm.expectRevert("Initializable: contract is already initialized");
systemConfig.initialize({
_owner: address(0xdEaD),
_overhead: 0,
_scalar: 0,
_batcherHash: bytes32(0),
_gasLimit: 1,
_unsafeBlockSigner: address(0),
_config: ResourceMetering.ResourceConfig({
maxResourceLimit: 1,
elasticityMultiplier: 1,
baseFeeMaxChangeDenominator: 2,
minimumBaseFee: 0,
systemTxMaxGas: 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");
L1NFTBridge.initialize(CrossDomainMessenger(address(0)));
}
}
......@@ -9,8 +9,8 @@ import { ERC721Bridge_Initializer } from "./CommonTest.t.sol";
import { OptimismMintableERC721, IOptimismMintableERC721 } from "../src/universal/OptimismMintableERC721.sol";
contract OptimismMintableERC721_Test is ERC721Bridge_Initializer {
ERC721 internal L1Token;
OptimismMintableERC721 internal L2Token;
ERC721 internal L1NFT;
OptimismMintableERC721 internal L2NFT;
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
......@@ -22,41 +22,41 @@ contract OptimismMintableERC721_Test is ERC721Bridge_Initializer {
super.setUp();
// Set up the token pair.
L1Token = new ERC721("L1Token", "L1T");
L2Token = new OptimismMintableERC721(
address(L2Bridge),
L1NFT = new ERC721("L1NFT", "L1T");
L2NFT = new OptimismMintableERC721(
address(L2NFTBridge),
1,
address(L1Token),
"L2Token",
address(L1NFT),
"L2NFT",
"L2T"
);
// Label the addresses for nice traces.
vm.label(address(L1Token), "L1ERC721Token");
vm.label(address(L2Token), "L2ERC721Token");
vm.label(address(L1NFT), "L1ERC721Token");
vm.label(address(L2NFT), "L2ERC721Token");
}
function test_constructor_succeeds() external {
assertEq(L2Token.name(), "L2Token");
assertEq(L2Token.symbol(), "L2T");
assertEq(L2Token.remoteToken(), address(L1Token));
assertEq(L2Token.bridge(), address(L2Bridge));
assertEq(L2Token.remoteChainId(), 1);
assertEq(L2Token.REMOTE_TOKEN(), address(L1Token));
assertEq(L2Token.BRIDGE(), address(L2Bridge));
assertEq(L2Token.REMOTE_CHAIN_ID(), 1);
assertEq(L2NFT.name(), "L2NFT");
assertEq(L2NFT.symbol(), "L2T");
assertEq(L2NFT.remoteToken(), address(L1NFT));
assertEq(L2NFT.bridge(), address(L2NFTBridge));
assertEq(L2NFT.remoteChainId(), 1);
assertEq(L2NFT.REMOTE_TOKEN(), address(L1NFT));
assertEq(L2NFT.BRIDGE(), address(L2NFTBridge));
assertEq(L2NFT.REMOTE_CHAIN_ID(), 1);
}
/// @notice Ensure that the contract supports the expected interfaces.
function test_supportsInterfaces_succeeds() external {
// Checks if the contract supports the IOptimismMintableERC721 interface.
assertTrue(L2Token.supportsInterface(type(IOptimismMintableERC721).interfaceId));
assertTrue(L2NFT.supportsInterface(type(IOptimismMintableERC721).interfaceId));
// Checks if the contract supports the IERC721Enumerable interface.
assertTrue(L2Token.supportsInterface(type(IERC721Enumerable).interfaceId));
assertTrue(L2NFT.supportsInterface(type(IERC721Enumerable).interfaceId));
// Checks if the contract supports the IERC721 interface.
assertTrue(L2Token.supportsInterface(type(IERC721).interfaceId));
assertTrue(L2NFT.supportsInterface(type(IERC721).interfaceId));
// Checks if the contract supports the IERC165 interface.
assertTrue(L2Token.supportsInterface(type(IERC165).interfaceId));
assertTrue(L2NFT.supportsInterface(type(IERC165).interfaceId));
}
function test_safeMint_succeeds() external {
......@@ -69,24 +69,24 @@ contract OptimismMintableERC721_Test is ERC721Bridge_Initializer {
emit Mint(alice, 1);
// Mint the token.
vm.prank(address(L2Bridge));
L2Token.safeMint(alice, 1);
vm.prank(address(L2NFTBridge));
L2NFT.safeMint(alice, 1);
// Token should be owned by alice.
assertEq(L2Token.ownerOf(1), alice);
assertEq(L2NFT.ownerOf(1), alice);
}
function test_safeMint_notBridge_reverts() external {
// Try to mint the token.
vm.expectRevert("OptimismMintableERC721: only bridge can call this function");
vm.prank(address(alice));
L2Token.safeMint(alice, 1);
L2NFT.safeMint(alice, 1);
}
function test_burn_succeeds() external {
// Mint the token first.
vm.prank(address(L2Bridge));
L2Token.safeMint(alice, 1);
vm.prank(address(L2NFTBridge));
L2NFT.safeMint(alice, 1);
// Expect a transfer event.
vm.expectEmit(true, true, true, true);
......@@ -97,37 +97,37 @@ contract OptimismMintableERC721_Test is ERC721Bridge_Initializer {
emit Burn(alice, 1);
// Burn the token.
vm.prank(address(L2Bridge));
L2Token.burn(alice, 1);
vm.prank(address(L2NFTBridge));
L2NFT.burn(alice, 1);
// Token should be owned by address(0).
vm.expectRevert("ERC721: invalid token ID");
L2Token.ownerOf(1);
L2NFT.ownerOf(1);
}
function test_burn_notBridge_reverts() external {
// Mint the token first.
vm.prank(address(L2Bridge));
L2Token.safeMint(alice, 1);
vm.prank(address(L2NFTBridge));
L2NFT.safeMint(alice, 1);
// Try to burn the token.
vm.expectRevert("OptimismMintableERC721: only bridge can call this function");
vm.prank(address(alice));
L2Token.burn(alice, 1);
L2NFT.burn(alice, 1);
}
function test_tokenURI_succeeds() external {
// Mint the token first.
vm.prank(address(L2Bridge));
L2Token.safeMint(alice, 1);
vm.prank(address(L2NFTBridge));
L2NFT.safeMint(alice, 1);
// Token URI should be correct.
assertEq(
L2Token.tokenURI(1),
L2NFT.tokenURI(1),
string(
abi.encodePacked(
"ethereum:",
Strings.toHexString(uint160(address(L1Token)), 20),
Strings.toHexString(uint160(address(L1NFT)), 20),
"@",
Strings.toString(1),
"/tokenURI?uint256=",
......
......@@ -15,14 +15,14 @@ contract OptimismMintableERC721Factory_Test is ERC721Bridge_Initializer {
super.setUp();
// Set up the token pair.
factory = new OptimismMintableERC721Factory(address(L2Bridge), 1);
factory = new OptimismMintableERC721Factory(address(L2NFTBridge), 1);
// Label the addresses for nice traces.
vm.label(address(factory), "OptimismMintableERC721Factory");
}
function test_constructor_succeeds() external {
assertEq(factory.BRIDGE(), address(L2Bridge));
assertEq(factory.BRIDGE(), address(L2NFTBridge));
assertEq(factory.REMOTE_CHAIN_ID(), 1);
}
......@@ -49,7 +49,7 @@ contract OptimismMintableERC721Factory_Test is ERC721Bridge_Initializer {
assertEq(created.name(), "L2Token");
assertEq(created.symbol(), "L2T");
assertEq(created.REMOTE_TOKEN(), remote);
assertEq(created.BRIDGE(), address(L2Bridge));
assertEq(created.BRIDGE(), address(L2NFTBridge));
assertEq(created.REMOTE_CHAIN_ID(), 1);
}
......@@ -80,7 +80,7 @@ contract OptimismMintableERC721Factory_Test is ERC721Bridge_Initializer {
view
returns (address)
{
bytes memory constructorArgs = abi.encode(address(L2Bridge), 1, _remote, _name, _symbol);
bytes memory constructorArgs = abi.encode(address(L2NFTBridge), 1, _remote, _name, _symbol);
bytes memory bytecode = abi.encodePacked(type(OptimismMintableERC721).creationCode, constructorArgs);
bytes32 salt = keccak256(abi.encode(_remote, _name, _symbol));
bytes32 hash = keccak256(abi.encodePacked(bytes1(0xff), address(factory), salt, keccak256(bytecode)));
......
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