Commit a88f6398 authored by clabby's avatar clabby Committed by GitHub

chore(op-deployer): Accept existing impl in `DelayedWETH` bootstrap task (#13250)

* chore(op-deployer): Accept existing impl in `DelayedWETH` bootstrap task

* remove check
parent 37d7bda6
...@@ -37,6 +37,7 @@ type DelayedWETHConfig struct { ...@@ -37,6 +37,7 @@ type DelayedWETHConfig struct {
PrivateKey string PrivateKey string
Logger log.Logger Logger log.Logger
ArtifactsLocator *artifacts2.Locator ArtifactsLocator *artifacts2.Locator
DelayedWethImpl common.Address
privateKeyECDSA *ecdsa.PrivateKey privateKeyECDSA *ecdsa.PrivateKey
} }
...@@ -90,11 +91,13 @@ func NewDelayedWETHConfigFromClI(cliCtx *cli.Context, l log.Logger) (DelayedWETH ...@@ -90,11 +91,13 @@ func NewDelayedWETHConfigFromClI(cliCtx *cli.Context, l log.Logger) (DelayedWETH
if err := artifactsLocator.UnmarshalText([]byte(artifactsURLStr)); err != nil { if err := artifactsLocator.UnmarshalText([]byte(artifactsURLStr)); err != nil {
return DelayedWETHConfig{}, fmt.Errorf("failed to parse artifacts URL: %w", err) return DelayedWETHConfig{}, fmt.Errorf("failed to parse artifacts URL: %w", err)
} }
delayedWethImpl := common.HexToAddress(cliCtx.String(DelayedWethImplFlagName))
config := DelayedWETHConfig{ config := DelayedWETHConfig{
L1RPCUrl: l1RPCUrl, L1RPCUrl: l1RPCUrl,
PrivateKey: privateKey, PrivateKey: privateKey,
Logger: l, Logger: l,
ArtifactsLocator: artifactsLocator, ArtifactsLocator: artifactsLocator,
DelayedWethImpl: delayedWethImpl,
} }
return config, nil return config, nil
} }
...@@ -134,10 +137,6 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -134,10 +137,6 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
if err != nil { if err != nil {
return fmt.Errorf("error getting superchain config: %w", err) return fmt.Errorf("error getting superchain config: %w", err)
} }
standardVersionsTOML, err := standard.L1VersionsDataFor(chainIDU64)
if err != nil {
return fmt.Errorf("error getting standard versions TOML: %w", err)
}
proxyAdmin, err := standard.ManagerOwnerAddrFor(chainIDU64) proxyAdmin, err := standard.ManagerOwnerAddrFor(chainIDU64)
if err != nil { if err != nil {
return fmt.Errorf("error getting superchain proxy admin: %w", err) return fmt.Errorf("error getting superchain proxy admin: %w", err)
...@@ -210,9 +209,9 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -210,9 +209,9 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
host, host,
opcm.DeployDelayedWETHInput{ opcm.DeployDelayedWETHInput{
Release: release, Release: release,
StandardVersionsToml: standardVersionsTOML,
ProxyAdmin: proxyAdmin, ProxyAdmin: proxyAdmin,
SuperchainConfigProxy: superchainConfigAddr, SuperchainConfigProxy: superchainConfigAddr,
DelayedWethImpl: cfg.DelayedWethImpl,
DelayedWethOwner: delayedWethOwner, DelayedWethOwner: delayedWethOwner,
DelayedWethDelay: big.NewInt(604800), DelayedWethDelay: big.NewInt(604800),
}, },
......
...@@ -26,13 +26,14 @@ const ( ...@@ -26,13 +26,14 @@ const (
SplitDepthFlagName = "split-depth" SplitDepthFlagName = "split-depth"
ClockExtensionFlagName = "clock-extension" ClockExtensionFlagName = "clock-extension"
MaxClockDurationFlagName = "max-clock-duration" MaxClockDurationFlagName = "max-clock-duration"
DelayedWethProxyFlagName = "delayed-weth-proxy"
AnchorStateRegistryProxyFlagName = "anchor-state-registry-proxy" AnchorStateRegistryProxyFlagName = "anchor-state-registry-proxy"
L2ChainIdFlagName = "l2-chain-id" L2ChainIdFlagName = "l2-chain-id"
ProposerFlagName = "proposer" ProposerFlagName = "proposer"
ChallengerFlagName = "challenger" ChallengerFlagName = "challenger"
PreimageOracleFlagName = "preimage-oracle" PreimageOracleFlagName = "preimage-oracle"
ReleaseFlagName = "release" ReleaseFlagName = "release"
DelayedWethProxyFlagName = "delayed-weth-proxy"
DelayedWethImplFlagName = "delayed-weth-impl"
) )
var ( var (
...@@ -128,6 +129,12 @@ var ( ...@@ -128,6 +129,12 @@ var (
Usage: "Delayed WETH proxy.", Usage: "Delayed WETH proxy.",
EnvVars: deployer.PrefixEnvVar("DELAYED_WETH_PROXY"), EnvVars: deployer.PrefixEnvVar("DELAYED_WETH_PROXY"),
} }
DelayedWethImplFlag = &cli.StringFlag{
Name: DelayedWethImplFlagName,
Usage: "Delayed WETH implementation.",
EnvVars: deployer.PrefixEnvVar("DELAYED_WETH_IMPL"),
Value: common.Address{}.Hex(),
}
AnchorStateRegistryProxyFlag = &cli.StringFlag{ AnchorStateRegistryProxyFlag = &cli.StringFlag{
Name: AnchorStateRegistryProxyFlagName, Name: AnchorStateRegistryProxyFlagName,
Usage: "Anchor state registry proxy.", Usage: "Anchor state registry proxy.",
...@@ -182,6 +189,7 @@ var DelayedWETHFlags = []cli.Flag{ ...@@ -182,6 +189,7 @@ var DelayedWETHFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
ArtifactsLocatorFlag, ArtifactsLocatorFlag,
DelayedWethImplFlag,
} }
var DisputeGameFlags = []cli.Flag{ var DisputeGameFlags = []cli.Flag{
......
...@@ -11,9 +11,9 @@ import ( ...@@ -11,9 +11,9 @@ import (
type DeployDelayedWETHInput struct { type DeployDelayedWETHInput struct {
Release string Release string
StandardVersionsToml string
ProxyAdmin common.Address ProxyAdmin common.Address
SuperchainConfigProxy common.Address SuperchainConfigProxy common.Address
DelayedWethImpl common.Address
DelayedWethOwner common.Address DelayedWethOwner common.Address
DelayedWethDelay *big.Int DelayedWethDelay *big.Int
} }
......
...@@ -5,7 +5,6 @@ import ( ...@@ -5,7 +5,6 @@ import (
"testing" "testing"
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/broadcaster" "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/broadcaster"
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/standard"
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/testutil" "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/testutil"
"github.com/ethereum-optimism/optimism/op-deployer/pkg/env" "github.com/ethereum-optimism/optimism/op-deployer/pkg/env"
"github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum-optimism/optimism/op-service/testlog"
...@@ -17,29 +16,44 @@ import ( ...@@ -17,29 +16,44 @@ import (
func TestDeployDelayedWETH(t *testing.T) { func TestDeployDelayedWETH(t *testing.T) {
_, artifacts := testutil.LocalArtifacts(t) _, artifacts := testutil.LocalArtifacts(t)
host, err := env.DefaultScriptHost( testCases := []struct {
broadcaster.NoopBroadcaster(), TestName string
testlog.Logger(t, log.LevelInfo), Impl common.Address
common.Address{'D'}, }{
artifacts, {
) TestName: "ExistingImpl",
require.NoError(t, err) Impl: common.Address{'I'},
},
standardVersionsTOML, err := standard.L1VersionsDataFor(11155111) {
require.NoError(t, err) TestName: "NoExistingImpl",
Impl: common.Address{},
input := DeployDelayedWETHInput{ },
Release: "dev",
StandardVersionsToml: standardVersionsTOML,
ProxyAdmin: common.Address{'P'},
SuperchainConfigProxy: common.Address{'S'},
DelayedWethOwner: common.Address{'O'},
DelayedWethDelay: big.NewInt(100),
} }
output, err := DeployDelayedWETH(host, input) for _, testCase := range testCases {
require.NoError(t, err) t.Run(testCase.TestName, func(t *testing.T) {
host, err := env.DefaultScriptHost(
require.NotEmpty(t, output.DelayedWethImpl) broadcaster.NoopBroadcaster(),
require.NotEmpty(t, output.DelayedWethProxy) testlog.Logger(t, log.LevelInfo),
common.Address{'D'},
artifacts,
)
require.NoError(t, err)
input := DeployDelayedWETHInput{
Release: "dev",
ProxyAdmin: common.Address{'P'},
SuperchainConfigProxy: common.Address{'S'},
DelayedWethImpl: testCase.Impl,
DelayedWethOwner: common.Address{'O'},
DelayedWethDelay: big.NewInt(100),
}
output, err := DeployDelayedWETH(host, input)
require.NoError(t, err)
require.NotEmpty(t, output.DelayedWethImpl)
require.NotEmpty(t, output.DelayedWethProxy)
})
}
} }
...@@ -20,9 +20,9 @@ import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; ...@@ -20,9 +20,9 @@ import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
contract DeployDelayedWETHInput is BaseDeployIO { contract DeployDelayedWETHInput is BaseDeployIO {
/// Required inputs. /// Required inputs.
string internal _release; string internal _release;
string internal _standardVersionsToml;
address public _proxyAdmin; address public _proxyAdmin;
ISuperchainConfig public _superchainConfigProxy; ISuperchainConfig public _superchainConfigProxy;
address public _delayedWethImpl;
address public _delayedWethOwner; address public _delayedWethOwner;
uint256 public _delayedWethDelay; uint256 public _delayedWethDelay;
...@@ -45,6 +45,8 @@ contract DeployDelayedWETHInput is BaseDeployIO { ...@@ -45,6 +45,8 @@ contract DeployDelayedWETHInput is BaseDeployIO {
} else if (_sel == this.delayedWethOwner.selector) { } else if (_sel == this.delayedWethOwner.selector) {
require(_value != address(0), "DeployDelayedWETH: delayedWethOwner cannot be zero address"); require(_value != address(0), "DeployDelayedWETH: delayedWethOwner cannot be zero address");
_delayedWethOwner = _value; _delayedWethOwner = _value;
} else if (_sel == this.delayedWethImpl.selector) {
_delayedWethImpl = _value;
} else { } else {
revert("DeployDelayedWETH: unknown selector"); revert("DeployDelayedWETH: unknown selector");
} }
...@@ -54,9 +56,6 @@ contract DeployDelayedWETHInput is BaseDeployIO { ...@@ -54,9 +56,6 @@ contract DeployDelayedWETHInput is BaseDeployIO {
if (_sel == this.release.selector) { if (_sel == this.release.selector) {
require(!LibString.eq(_value, ""), "DeployDelayedWETH: release cannot be empty"); require(!LibString.eq(_value, ""), "DeployDelayedWETH: release cannot be empty");
_release = _value; _release = _value;
} else if (_sel == this.standardVersionsToml.selector) {
require(!LibString.eq(_value, ""), "DeployDelayedWETH: standardVersionsToml cannot be empty");
_standardVersionsToml = _value;
} else { } else {
revert("DeployDelayedWETH: unknown selector"); revert("DeployDelayedWETH: unknown selector");
} }
...@@ -67,11 +66,6 @@ contract DeployDelayedWETHInput is BaseDeployIO { ...@@ -67,11 +66,6 @@ contract DeployDelayedWETHInput is BaseDeployIO {
return _release; return _release;
} }
function standardVersionsToml() public view returns (string memory) {
require(!LibString.eq(_standardVersionsToml, ""), "DeployDelayedWETH: standardVersionsToml not set");
return _standardVersionsToml;
}
function proxyAdmin() public view returns (address) { function proxyAdmin() public view returns (address) {
require(_proxyAdmin != address(0), "DeployDelayedWETH: proxyAdmin not set"); require(_proxyAdmin != address(0), "DeployDelayedWETH: proxyAdmin not set");
return _proxyAdmin; return _proxyAdmin;
...@@ -82,6 +76,11 @@ contract DeployDelayedWETHInput is BaseDeployIO { ...@@ -82,6 +76,11 @@ contract DeployDelayedWETHInput is BaseDeployIO {
return _superchainConfigProxy; return _superchainConfigProxy;
} }
function delayedWethImpl() public view returns (address) {
require(_delayedWethImpl != address(0), "DeployDelayedWETH: delayedWethImpl not set");
return _delayedWethImpl;
}
function delayedWethOwner() public view returns (address) { function delayedWethOwner() public view returns (address) {
require(_delayedWethOwner != address(0), "DeployDelayedWETH: delayedWethOwner not set"); require(_delayedWethOwner != address(0), "DeployDelayedWETH: delayedWethOwner not set");
return _delayedWethOwner; return _delayedWethOwner;
...@@ -166,11 +165,9 @@ contract DeployDelayedWETH is Script { ...@@ -166,11 +165,9 @@ contract DeployDelayedWETH is Script {
function deployDelayedWethImpl(DeployDelayedWETHInput _dwi, DeployDelayedWETHOutput _dwo) internal { function deployDelayedWethImpl(DeployDelayedWETHInput _dwi, DeployDelayedWETHOutput _dwo) internal {
string memory release = _dwi.release(); string memory release = _dwi.release();
string memory stdVerToml = _dwi.standardVersionsToml();
string memory contractName = "delayed_weth";
IDelayedWETH impl; IDelayedWETH impl;
address existingImplementation = getReleaseAddress(release, contractName, stdVerToml); address existingImplementation = _dwi.delayedWethImpl();
if (existingImplementation != address(0)) { if (existingImplementation != address(0)) {
impl = IDelayedWETH(payable(existingImplementation)); impl = IDelayedWETH(payable(existingImplementation));
} else if (isDevelopRelease(release)) { } else if (isDevelopRelease(release)) {
...@@ -214,30 +211,6 @@ contract DeployDelayedWETH is Script { ...@@ -214,30 +211,6 @@ contract DeployDelayedWETH is Script {
_dwo.set(_dwo.delayedWethProxy.selector, address(proxy)); _dwo.set(_dwo.delayedWethProxy.selector, address(proxy));
} }
// Zero address is returned if the address is not found in '_standardVersionsToml'.
function getReleaseAddress(
string memory _version,
string memory _contractName,
string memory _standardVersionsToml
)
internal
pure
returns (address addr_)
{
string memory baseKey = string.concat('.releases["', _version, '"].', _contractName);
string memory implAddressKey = string.concat(baseKey, ".implementation_address");
string memory addressKey = string.concat(baseKey, ".address");
try vm.parseTomlAddress(_standardVersionsToml, implAddressKey) returns (address parsedAddr_) {
addr_ = parsedAddr_;
} catch {
try vm.parseTomlAddress(_standardVersionsToml, addressKey) returns (address parsedAddr_) {
addr_ = parsedAddr_;
} catch {
addr_ = address(0);
}
}
}
// A release is considered a 'develop' release if it does not start with 'op-contracts'. // A release is considered a 'develop' release if it does not start with 'op-contracts'.
function isDevelopRelease(string memory _release) internal pure returns (bool) { function isDevelopRelease(string memory _release) internal pure returns (bool) {
return !LibString.startsWith(_release, "op-contracts"); return !LibString.startsWith(_release, "op-contracts");
......
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