Skip to content

Commit 21e6cc7

Browse files
committed
fix(deploy): upgrade ProtocolVersions proxy
1 parent b465d95 commit 21e6cc7

3 files changed

Lines changed: 72 additions & 6 deletions

File tree

scripts/deploy/SystemDeploy.s.sol

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ contract SystemDeploy is Script {
108108
ISuperchainConfig superchainConfigProxy;
109109
Types.Implementations implementations;
110110
ISystemConfig systemConfigProxy;
111+
IProtocolVersions protocolVersionsProxy;
111112
}
112113

113114
struct UpgradeOutput {
@@ -339,7 +340,12 @@ contract SystemDeploy is Script {
339340
revert SuperchainConfigNeedsUpgrade();
340341
}
341342

342-
_upgradeOPChain(systemConfigProxy, _input.implementations);
343+
IProtocolVersions protocolVersionsProxy = _input.protocolVersionsProxy;
344+
if (address(protocolVersionsProxy) == address(0) && address(artifacts).code.length != 0) {
345+
protocolVersionsProxy = IProtocolVersions(artifacts.getAddress("ProtocolVersionsProxy"));
346+
}
347+
348+
_upgradeOPChain(systemConfigProxy, _input.implementations, protocolVersionsProxy);
343349
output_.chainUpgraded = true;
344350
}
345351

@@ -650,7 +656,13 @@ contract SystemDeploy is Script {
650656
upgraded_ = true;
651657
}
652658

653-
function _upgradeOPChain(ISystemConfig _systemConfigProxy, Types.Implementations memory _impls) internal {
659+
function _upgradeOPChain(
660+
ISystemConfig _systemConfigProxy,
661+
Types.Implementations memory _impls,
662+
IProtocolVersions _protocolVersionsProxy
663+
)
664+
internal
665+
{
654666
IProxyAdmin proxyAdmin = _systemConfigProxy.proxyAdmin();
655667
uint256 l2ChainId = _systemConfigProxy.l2ChainId();
656668

@@ -675,6 +687,10 @@ contract SystemDeploy is Script {
675687
_upgradeTo(proxyAdmin, opChainAddrs.delayedWETH, _impls.delayedWETHImpl);
676688
}
677689

690+
if (address(_protocolVersionsProxy) != address(0)) {
691+
_upgradeTo(proxyAdmin, address(_protocolVersionsProxy), _impls.protocolVersionsImpl);
692+
}
693+
678694
emit Upgraded(l2ChainId, _systemConfigProxy, msg.sender);
679695
}
680696

test/deploy/SystemDeploy.t.sol

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { Types } from "scripts/libraries/Types.sol";
99
import { SystemDeployAssertions } from "test/deploy/SystemDeployAssertions.sol";
1010

1111
import { ISP1Verifier } from "interfaces/L1/proofs/zk/ISP1Verifier.sol";
12+
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
13+
import { ProtocolVersions } from "src/L1/ProtocolVersions.sol";
1214
import { TEEProverRegistry } from "src/L1/proofs/tee/TEEProverRegistry.sol";
1315
import { TEEVerifier } from "src/L1/proofs/tee/TEEVerifier.sol";
1416
import { ZKVerifier } from "src/L1/proofs/zk/ZKVerifier.sol";
@@ -140,13 +142,17 @@ contract SystemDeploy_Test is Test, SystemDeployAssertions {
140142
function test_upgrade_withoutManagerDelegatecall_succeeds() public {
141143
SystemDeploy.DeployInput memory input = _defaultDeployInput();
142144
SystemDeploy.DeployOutput memory output = systemDeploy.deploy(input);
145+
Types.Implementations memory implementations = output.impls;
146+
ProtocolVersions protocolVersionsImpl = new ProtocolVersions();
147+
implementations.protocolVersionsImpl = address(protocolVersionsImpl);
143148

144149
SystemDeploy.UpgradeOutput memory upgradeOutput = systemDeploy.upgrade(
145150
SystemDeploy.UpgradeInput({
146151
saveArtifacts: false,
147152
superchainConfigProxy: output.superchain.superchainConfigProxy,
148-
implementations: output.impls,
149-
systemConfigProxy: output.opChain.systemConfigProxy
153+
implementations: implementations,
154+
systemConfigProxy: output.opChain.systemConfigProxy,
155+
protocolVersionsProxy: output.opChain.protocolVersionsProxy
150156
})
151157
);
152158

@@ -158,9 +164,42 @@ contract SystemDeploy_Test is Test, SystemDeployAssertions {
158164
output.impls.superchainConfigImpl,
159165
"superchain config impl"
160166
);
167+
assertEq(
168+
output.opChain.opChainProxyAdmin.getProxyImplementation(address(output.opChain.protocolVersionsProxy)),
169+
address(protocolVersionsImpl),
170+
"protocol versions impl"
171+
);
161172
assertValidStandardSystem(_expected(output, input));
162173
}
163174

175+
function test_upgrade_discoversProtocolVersionsProxyFromArtifacts_succeeds() public {
176+
SystemDeploy.DeployInput memory input = _defaultDeployInput();
177+
SystemDeploy.DeployOutput memory output = systemDeploy.deploy(input);
178+
Types.Implementations memory implementations = output.impls;
179+
ProtocolVersions protocolVersionsImpl = new ProtocolVersions();
180+
implementations.protocolVersionsImpl = address(protocolVersionsImpl);
181+
182+
_saveArtifact("ProtocolVersionsProxy", address(output.opChain.protocolVersionsProxy));
183+
184+
SystemDeploy.UpgradeOutput memory upgradeOutput = systemDeploy.upgrade(
185+
SystemDeploy.UpgradeInput({
186+
saveArtifacts: false,
187+
superchainConfigProxy: output.superchain.superchainConfigProxy,
188+
implementations: implementations,
189+
systemConfigProxy: output.opChain.systemConfigProxy,
190+
protocolVersionsProxy: IProtocolVersions(address(0))
191+
})
192+
);
193+
194+
assertFalse(upgradeOutput.superchainConfigUpgraded, "superchain already current");
195+
assertTrue(upgradeOutput.chainUpgraded, "chain upgraded");
196+
assertEq(
197+
output.opChain.opChainProxyAdmin.getProxyImplementation(address(output.opChain.protocolVersionsProxy)),
198+
address(protocolVersionsImpl),
199+
"protocol versions impl"
200+
);
201+
}
202+
164203
function test_deploy_reusingImplementations_doesNotSaveZeroImplementationOnlyArtifacts() public {
165204
SystemDeploy.DeployInput memory input = _defaultDeployInput();
166205
SystemDeploy.DeployOutput memory output = systemDeploy.deploy(input);
@@ -278,6 +317,13 @@ contract SystemDeploy_Test is Test, SystemDeployAssertions {
278317
);
279318
}
280319

320+
function _saveArtifact(string memory _name, address _addr) internal {
321+
vm.etch(address(artifacts), vm.getDeployedCode("Artifacts.s.sol:Artifacts"));
322+
bytes32 slot = keccak256(abi.encodePacked(_name, uint256(0)));
323+
vm.store(address(artifacts), slot, bytes32(uint256(uint160(_addr))));
324+
assertEq(artifacts.getAddress(_name), _addr, "artifact saved");
325+
}
326+
281327
function _expected(
282328
SystemDeploy.DeployOutput memory _output,
283329
SystemDeploy.DeployInput memory _input

test/setup/ForkLive.s.sol

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { IDisputeGameFactory } from "interfaces/L1/proofs/IDisputeGameFactory.so
2121
import { IAggregateVerifier } from "interfaces/L1/proofs/IAggregateVerifier.sol";
2222
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";
2323
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
24+
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
2425
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
2526
import { IETHLockbox } from "interfaces/L1/IETHLockbox.sol";
2627
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
@@ -190,6 +191,7 @@ contract ForkLive is Script {
190191
ISuperchainConfig superchainConfig = ISuperchainConfig(artifacts.mustGetAddress("SuperchainConfigProxy"));
191192
IProxyAdmin superchainProxyAdmin = IProxyAdmin(EIP1967Helper.getAdmin(address(superchainConfig)));
192193
address superchainPAO = superchainProxyAdmin.owner();
194+
IProtocolVersions protocolVersionsProxy = IProtocolVersions(artifacts.getAddress("ProtocolVersionsProxy"));
193195

194196
// Run the shared SuperchainConfig upgrade as the Superchain ProxyAdmin owner. The script
195197
// skips this step when the proxy is already at or above the target implementation version.
@@ -199,7 +201,8 @@ contract ForkLive is Script {
199201
saveArtifacts: false,
200202
superchainConfigProxy: superchainConfig,
201203
implementations: implementations,
202-
systemConfigProxy: ISystemConfig(address(0))
204+
systemConfigProxy: ISystemConfig(address(0)),
205+
protocolVersionsProxy: IProtocolVersions(address(0))
203206
})
204207
);
205208

@@ -210,7 +213,8 @@ contract ForkLive is Script {
210213
saveArtifacts: false,
211214
superchainConfigProxy: ISuperchainConfig(address(0)),
212215
implementations: implementations,
213-
systemConfigProxy: _systemConfigProxy
216+
systemConfigProxy: _systemConfigProxy,
217+
protocolVersionsProxy: protocolVersionsProxy
214218
})
215219
);
216220
}

0 commit comments

Comments
 (0)