Skip to content

Commit

Permalink
Bump optimism dep (#2)
Browse files Browse the repository at this point in the history
* Bump optimism dep

* Copy over interface changes
  • Loading branch information
mdehoog authored Oct 1, 2024
1 parent 1d92910 commit da59969
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 114 deletions.
2 changes: 0 additions & 2 deletions enclave/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@ func (p *PerChainConfig) MarshalBinary() (data []byte, err error) {
{Name: "version", Type: uint64Type},
{Name: "chainID", Type: uint256Type},
{Name: "genesisL1Hash", Type: bytes32Type},
{Name: "genesisL1Number", Type: uint64Type},
{Name: "genesisL2Hash", Type: bytes32Type},
{Name: "genesisL2Time", Type: uint64Type},
{Name: "genesisBatcherAddress", Type: addressType},
Expand All @@ -130,7 +129,6 @@ func (p *PerChainConfig) MarshalBinary() (data []byte, err error) {
version0,
p.ChainID,
p.Genesis.L1.Hash,
p.Genesis.L1.Number,
p.Genesis.L2.Hash,
p.Genesis.L2Time,
p.Genesis.SystemConfig.BatcherAddr,
Expand Down
9 changes: 7 additions & 2 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,15 @@
src = "src"
out = "out"
libs = ["lib"]
optimizer = true
optimizer_runs = 999999

viaIR = true
bytecode_hash = 'none'
ast = true
gas_limit = 9223372036854775807
ffi = true
evm_version = "shanghai"
evm_version = "cancun"

fs_permissions = [
{ access='read', path='./deploy-config/' },
{ access='read-write', path='./deployments/' }
Expand Down
2 changes: 1 addition & 1 deletion lib/optimism
Submodule optimism updated 987 files
1 change: 1 addition & 0 deletions remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
src/cannon/interfaces/=lib/optimism/packages/contracts-bedrock/src/cannon/interfaces/
src/L1/=lib/optimism/packages/contracts-bedrock/src/L1/
src/libraries/=lib/optimism/packages/contracts-bedrock/src/libraries/
src/universal/=lib/optimism/packages/contracts-bedrock/src/universal/
scripts/=lib/optimism/packages/contracts-bedrock/scripts/
20 changes: 11 additions & 9 deletions script/DeploySystem.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ pragma solidity ^0.8.15;

import { Deploy } from "@eth-optimism-bedrock/scripts/deploy/Deploy.s.sol";
import { DeployConfig } from "@eth-optimism-bedrock/scripts/deploy/DeployConfig.s.sol";
import { Types } from "@eth-optimism-bedrock/scripts/Types.sol";
import { ChainAssertions } from "@eth-optimism-bedrock/scripts/ChainAssertions.sol";
import { Types } from "@eth-optimism-bedrock/scripts/libraries/Types.sol";
import { ChainAssertions } from "@eth-optimism-bedrock/scripts/deploy/ChainAssertions.sol";
import { SystemConfig } from "@eth-optimism-bedrock/src/L1/SystemConfig.sol";
import { SuperchainConfig } from "@eth-optimism-bedrock/src/L1/SuperchainConfig.sol";
import { ISystemConfig } from "@eth-optimism-bedrock/src/L1/interfaces/ISystemConfig.sol";
import { ISuperchainConfig } from "@eth-optimism-bedrock/src/L1/interfaces/ISuperchainConfig.sol";
import { OptimismPortal } from "@eth-optimism-bedrock/src/L1/OptimismPortal.sol";
import { L2OutputOracle } from "@eth-optimism-bedrock/src/L1/L2OutputOracle.sol";
import { IL2OutputOracle } from "@eth-optimism-bedrock/src/L1/interfaces/IL2OutputOracle.sol";
import { Portal } from "src/Portal.sol";
import { OutputOracle } from "src/OutputOracle.sol";
import { OwnerConfig } from "src/OwnerConfig.sol";
Expand All @@ -17,6 +18,7 @@ import { SystemConfigGlobal } from "src/SystemConfigGlobal.sol";
import { DeployChain } from "src/DeployChain.sol";
import { Constants } from "@eth-optimism-bedrock/src/libraries/Constants.sol";
import { ResourceMetering } from "@eth-optimism-bedrock/src/L1/ResourceMetering.sol";
import { IResourceMetering } from "@eth-optimism-bedrock/src/L1/interfaces/IResourceMetering.sol";

import { console2 as console } from "forge-std/console2.sol";

Expand Down Expand Up @@ -273,9 +275,9 @@ contract DeploySystem is Deploy {
_innerCallData: abi.encodeCall(
OptimismPortal.initialize,
(
L2OutputOracle(l2OutputOracleProxy),
SystemConfig(systemConfigProxy),
SuperchainConfig(superchainConfigProxy)
IL2OutputOracle(l2OutputOracleProxy),
ISystemConfig(systemConfigProxy),
ISuperchainConfig(superchainConfigProxy)
)
)
});
Expand Down Expand Up @@ -339,7 +341,7 @@ contract DeploySystem is Deploy {
// Check that the contract is initialized
ChainAssertions.assertSlotValueIsOne({ _contractAddress: address(config), _slot: 0, _offset: 0 });

ResourceMetering.ResourceConfig memory resourceConfig = config.resourceConfig();
IResourceMetering.ResourceConfig memory resourceConfig = config.resourceConfig();

if (_isProxy) {
require(config.owner() == _cfg.finalSystemOwner());
Expand All @@ -350,7 +352,7 @@ contract DeploySystem is Deploy {
require(config.unsafeBlockSigner() == _cfg.p2pSequencerAddress());
require(config.scalar() >> 248 == 1);
// Check _config
ResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG();
IResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG();
require(resourceConfig.maxResourceLimit == rconfig.maxResourceLimit);
require(resourceConfig.elasticityMultiplier == rconfig.elasticityMultiplier);
require(resourceConfig.baseFeeMaxChangeDenominator == rconfig.baseFeeMaxChangeDenominator);
Expand Down
185 changes: 124 additions & 61 deletions src/DeployChain.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ import { Portal } from "./Portal.sol";
import { OutputOracle } from "./OutputOracle.sol";
import { SystemConfigOwnable } from "./SystemConfigOwnable.sol";
import { SystemConfig } from "@eth-optimism-bedrock/src/L1/SystemConfig.sol";
import { ISystemConfig } from "@eth-optimism-bedrock/src/L1/interfaces/ISystemConfig.sol";
import { OptimismPortal } from "@eth-optimism-bedrock/src/L1/OptimismPortal.sol";
import { SuperchainConfig } from "@eth-optimism-bedrock/src/L1/SuperchainConfig.sol";
import { IOptimismPortal } from "@eth-optimism-bedrock/src/L1/interfaces/IOptimismPortal.sol";
import { ISuperchainConfig } from "@eth-optimism-bedrock/src/L1/interfaces/ISuperchainConfig.sol";
import { L2OutputOracle } from "@eth-optimism-bedrock/src/L1/L2OutputOracle.sol";
import { L1StandardBridge } from "@eth-optimism-bedrock/src/L1/L1StandardBridge.sol";
import { L1CrossDomainMessenger } from "@eth-optimism-bedrock/src/L1/L1CrossDomainMessenger.sol";
import { ICrossDomainMessenger } from "@eth-optimism-bedrock/src/universal/interfaces/ICrossDomainMessenger.sol";
import { L1ERC721Bridge } from "@eth-optimism-bedrock/src/L1/L1ERC721Bridge.sol";
import { OptimismMintableERC20Factory } from "@eth-optimism-bedrock/src/universal/OptimismMintableERC20Factory.sol";
import { ResourceMetering } from "@eth-optimism-bedrock/src/L1/ResourceMetering.sol";
Expand All @@ -28,6 +31,11 @@ contract DeployChain {
address optimismMintableERC20Factory;
}

struct Hashes {
bytes32 configHash;
bytes32 genesisOutputRoot;
}

event Deploy(
uint256 indexed chainID,
bytes32 configHash,
Expand Down Expand Up @@ -98,29 +106,90 @@ contract DeployChain {
address batcherAddress,
address unsafeBlockSigner
) external {
DeployAddresses memory addresses = setupProxies(chainID);
bytes32 genesisL1Hash = blockhash(uint256(genesisL1Number));

Hashes memory hashes = calculateHashes(
chainID,
genesisL1Hash,
genesisL2Hash,
genesisL2StateRoot,
genesisL2Time,
basefeeScalar,
blobbasefeeScalar,
gasLimit,
batcherAddress,
addresses
);

address batchInbox = calculateBatchInbox(chainID);

initializeProxies(
basefeeScalar,
blobbasefeeScalar,
gasLimit,
batcherAddress,
unsafeBlockSigner,
batchInbox,
hashes,
addresses
);

emit Deploy({
chainID: chainID,
configHash: hashes.configHash,
outputRoot: hashes.genesisOutputRoot,
batchInbox: batchInbox,
addresses: addresses
});
}

function calculateBatchInbox(uint256 chainID) public pure returns (address) {
uint256 inbox = 0;
for (; chainID > 0; chainID /= 10) {
inbox = (inbox << 4) | (chainID % 10);
}
return address(uint160(inbox | (0xff << 152)));
}

function setupProxies(uint256 chainID) internal returns (DeployAddresses memory) {
bytes32 salt = keccak256(abi.encodePacked(chainID));
address _l2OutputOracle = setupProxy(l2OutputOracle, salt);
address _systemConfig = setupProxy(systemConfig, salt);
address _optimismPortal = setupProxy(optimismPortal, salt);
address _l1CrossDomainMessenger = setupProxy(l1CrossDomainMessenger, salt);
address _l1StandardBridge = setupProxy(l1StandardBridge, salt);
address _l1ERC721Bridge = setupProxy(l1ERC721Bridge, salt);
address _optimismMintableERC20Factory = setupProxy(optimismMintableERC20Factory, salt);
return DeployAddresses({
l2OutputOracle: setupProxy(l2OutputOracle, salt),
systemConfig: setupProxy(systemConfig, salt),
optimismPortal: setupProxy(optimismPortal, salt),
l1CrossDomainMessenger: setupProxy(l1CrossDomainMessenger, salt),
l1StandardBridge: setupProxy(l1StandardBridge, salt),
l1ERC721Bridge: setupProxy(l1ERC721Bridge, salt),
optimismMintableERC20Factory: setupProxy(optimismMintableERC20Factory, salt)
});
}

function calculateHashes(
uint256 chainID,
bytes32 genesisL1Hash,
bytes32 genesisL2Hash,
bytes32 genesisL2StateRoot,
uint64 genesisL2Time,
uint32 basefeeScalar,
uint32 blobbasefeeScalar,
uint64 gasLimit,
address batcherAddress,
DeployAddresses memory addresses
) internal pure returns (Hashes memory) {
bytes32 scalar = bytes32((uint256(0x01) << 248) | (uint256(blobbasefeeScalar) << 32) | basefeeScalar);
bytes32 genesisL1Hash = blockhash(uint256(genesisL1Number));

bytes32 configHash = keccak256(abi.encodePacked(
uint64(0), // version
chainID,
genesisL1Hash,
genesisL1Number,
genesisL2Hash,
genesisL2Time,
batcherAddress,
scalar,
gasLimit,
_optimismPortal,
_systemConfig
addresses.optimismPortal,
addresses.systemConfig
));

bytes32 genesisOutputRoot = Hashing.hashOutputRootProof(Types.OutputRootProof({
Expand All @@ -130,10 +199,28 @@ contract DeployChain {
latestBlockhash: genesisL2Hash
}));

OutputOracle(_l2OutputOracle).initialize(configHash, genesisOutputRoot);
return Hashes({
configHash: configHash,
genesisOutputRoot: genesisOutputRoot
});
}

address batchInbox = calculateBatchInbox(chainID);
SystemConfigOwnable(_systemConfig).initialize({
function initializeProxies(
uint32 basefeeScalar,
uint32 blobbasefeeScalar,
uint64 gasLimit,
address batcherAddress,
address unsafeBlockSigner,
address batchInbox,
Hashes memory hashes,
DeployAddresses memory addresses
) internal {
OutputOracle(addresses.l2OutputOracle).initialize(
hashes.configHash,
hashes.genesisOutputRoot
);

SystemConfigOwnable(addresses.systemConfig).initialize({
_basefeeScalar: basefeeScalar,
_blobbasefeeScalar: blobbasefeeScalar,
_batcherHash: bytes32(uint256(uint160(batcherAddress))),
Expand All @@ -142,66 +229,42 @@ contract DeployChain {
_config: Constants.DEFAULT_RESOURCE_CONFIG(),
_batchInbox: batchInbox,
_addresses: SystemConfig.Addresses({
l1CrossDomainMessenger: _l1CrossDomainMessenger,
l1ERC721Bridge: _l1ERC721Bridge,
l1StandardBridge: _l1StandardBridge,
l1CrossDomainMessenger: addresses.l1CrossDomainMessenger,
l1ERC721Bridge: addresses.l1ERC721Bridge,
l1StandardBridge: addresses.l1StandardBridge,
disputeGameFactory: address(0),
optimismPortal: _optimismPortal,
optimismMintableERC20Factory: _optimismMintableERC20Factory,
optimismPortal: addresses.optimismPortal,
optimismMintableERC20Factory: addresses.optimismMintableERC20Factory,
gasPayingToken: address(0)
})
});

Portal(payable(_optimismPortal)).initialize(
OutputOracle(_l2OutputOracle),
SystemConfig(_systemConfig),
SuperchainConfig(superchainConfig)
Portal(payable(addresses.optimismPortal)).initialize(
OutputOracle(addresses.l2OutputOracle),
ISystemConfig(addresses.systemConfig),
ISuperchainConfig(superchainConfig)
);

L1CrossDomainMessenger(_l1CrossDomainMessenger).initialize(
SuperchainConfig(superchainConfig),
OptimismPortal(payable(_optimismPortal)),
SystemConfig(_systemConfig)
L1CrossDomainMessenger(addresses.l1CrossDomainMessenger).initialize(
ISuperchainConfig(superchainConfig),
IOptimismPortal(payable(addresses.optimismPortal)),
ISystemConfig(addresses.systemConfig)
);

L1StandardBridge(payable(_l1StandardBridge)).initialize(
L1CrossDomainMessenger(_l1CrossDomainMessenger),
SuperchainConfig(superchainConfig),
SystemConfig(_systemConfig)
L1StandardBridge(payable(addresses.l1StandardBridge)).initialize(
ICrossDomainMessenger(addresses.l1CrossDomainMessenger),
ISuperchainConfig(superchainConfig),
ISystemConfig(addresses.systemConfig)
);

L1ERC721Bridge(_l1ERC721Bridge).initialize(
L1CrossDomainMessenger(_l1CrossDomainMessenger),
SuperchainConfig(superchainConfig)
L1ERC721Bridge(addresses.l1ERC721Bridge).initialize(
ICrossDomainMessenger(addresses.l1CrossDomainMessenger),
ISuperchainConfig(superchainConfig)
);

OptimismMintableERC20Factory(_optimismMintableERC20Factory).initialize(
_l1StandardBridge
OptimismMintableERC20Factory(addresses.optimismMintableERC20Factory).initialize(
addresses.l1StandardBridge
);

emit Deploy({
chainID: chainID,
configHash: configHash,
outputRoot: genesisOutputRoot,
batchInbox: batchInbox,
addresses: DeployAddresses({
l2OutputOracle: _l2OutputOracle,
systemConfig: _systemConfig,
optimismPortal: _optimismPortal,
l1CrossDomainMessenger: _l1CrossDomainMessenger,
l1StandardBridge: _l1StandardBridge,
l1ERC721Bridge: _l1ERC721Bridge,
optimismMintableERC20Factory: _optimismMintableERC20Factory
})
});
}

function calculateBatchInbox(uint256 chainID) public pure returns (address) {
uint256 inbox = 0;
for (; chainID > 0; chainID /= 10) {
inbox = (inbox << 4) | (chainID % 10);
}
return address(uint160(inbox | (0xff << 152)));
}

function setupProxy(address proxy, bytes32 salt) internal returns (address instance) {
Expand Down
19 changes: 12 additions & 7 deletions src/OutputOracle.sol
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

// Contracts
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { ISemver } from "@eth-optimism-bedrock/src/universal/ISemver.sol";
import { SystemConfigGlobal } from "./SystemConfigGlobal.sol";

// Libraries
import { Types } from "@eth-optimism-bedrock/src/libraries/Types.sol";
import { Constants } from "@eth-optimism-bedrock/src/libraries/Constants.sol";
import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import { SystemConfigGlobal } from "./SystemConfigGlobal.sol";

/// @custom:proxied
// Interfaces
import { ISemver } from "@eth-optimism-bedrock/src/universal/interfaces/ISemver.sol";

/// @custom:proxied true
/// @title OutputOracle
/// @notice The OutputOracle contains an array of L2 state outputs, where each output is a
/// commitment to the state of the L2 chain. Other contracts like the Portal use
Expand Down Expand Up @@ -46,8 +51,8 @@ contract OutputOracle is Initializable, ISemver {
);

/// @notice Semantic version.
/// @custom:semver 1.0.0
string public constant version = "1.0.0";
/// @custom:semver 1.8.1-beta.1
string public constant version = "1.8.1-beta.1";

/// @notice Constructs the OutputOracle contract. Initializes variables to the same values as
/// in the getting-started config.
Expand Down Expand Up @@ -135,11 +140,11 @@ contract OutputOracle is Initializable, ISemver {
// Make sure an output for this block number has actually been proposed.
require(
_l2BlockNumber <= latestBlockNumber(),
"L3OutputOracle: cannot get output for a block that has not been proposed"
"L2OutputOracle: cannot get output for a block that has not been proposed"
);

// Make sure there's at least one output proposed.
require(l2Outputs.length > 0, "L3OutputOracle: cannot get output as no outputs have been proposed yet");
require(l2Outputs.length > 0, "L2OutputOracle: cannot get output as no outputs have been proposed yet");

// Find the output via binary search, guaranteed to exist.
uint256 lo = 0;
Expand Down
Loading

0 comments on commit da59969

Please sign in to comment.