Skip to content

Commit df4ea03

Browse files
committed
fix: by explicitly using delegatcall
was expecting foundry to override the CALL to a delegatcall for some reason.
1 parent 184f4da commit df4ea03

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

packages/contracts-bedrock/test/L1/OPContractsManager.t.sol

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,15 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames {
212212
// Execute the SuperchainConfig upgrade.
213213
// nosemgrep: sol-safety-trycatch-eip150)
214214
vm.prank(superchainPAO, true);
215-
try _opcm.upgradeSuperchainConfig(superchainConfig) {
216-
// Great, the upgrade succeeded.
217-
} catch (bytes memory reason) {
215+
(bool success, bytes memory returndata) =
216+
address(_opcm).delegatecall(abi.encodeCall(IOPContractsManager.upgradeSuperchainConfig, (superchainConfig)));
217+
if (success == false) {
218218
// Only acceptable revert reason is the SuperchainConfig already being up to date. This
219219
// try/catch is better than checking the version via the implementations struct because
220220
// the implementations struct interface can change between OPCM versions which would
221221
// cause the test to break and be a pain to resolve.
222222
assertTrue(
223-
bytes4(reason)
223+
bytes4(returndata)
224224
== IOPContractsManagerUpgrader.OPContractsManagerUpgrader_SuperchainConfigAlreadyUpToDate.selector,
225225
"Revert reason other than SuperchainConfigAlreadyUpToDate"
226226
);
@@ -232,7 +232,9 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames {
232232
}
233233

234234
vm.prank(_delegateCaller, true);
235-
_opcm.upgrade(opChainConfigs);
235+
(bool upgradeSuccess, bytes memory upgradeReturndata) =
236+
address(_opcm).delegatecall(abi.encodeCall(IOPContractsManager.upgrade, (opChainConfigs)));
237+
assertTrue(upgradeSuccess, "upgrade failed");
236238

237239
// Return early if a revert was expected. Otherwise we'll get errors below.
238240
if (_revertBytes.length > 0) {
@@ -1187,7 +1189,9 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit {
11871189
// Trigger the updatePrestate function.
11881190
address proxyAdminOwner = chainDeployOutput1.opChainProxyAdmin.owner();
11891191
vm.prank(proxyAdminOwner, true);
1190-
prestateUpdater.updatePrestate(inputs);
1192+
(bool success, bytes memory returndata) =
1193+
address(prestateUpdater).delegatecall(abi.encodeCall(IOPContractsManager.updatePrestate, (inputs)));
1194+
assertTrue(success, "updatePrestate failed");
11911195

11921196
LibGameArgs.GameArgs memory permissionedGameArgs = LibGameArgs.decode(
11931197
IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()).gameArgs(
@@ -1313,7 +1317,9 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit {
13131317
// Trigger the updatePrestate function.
13141318
address proxyAdminOwner = chainDeployOutput1.opChainProxyAdmin.owner();
13151319
vm.prank(proxyAdminOwner, true);
1316-
prestateUpdater.updatePrestate(inputs);
1320+
(bool success, bytes memory returndata) =
1321+
address(prestateUpdater).delegatecall(abi.encodeCall(IOPContractsManager.updatePrestate, (inputs)));
1322+
assertTrue(success, "updatePrestate failed");
13171323

13181324
LibGameArgs.GameArgs memory permissionedGameArgs =
13191325
LibGameArgs.decode(chainDeployOutput1.disputeGameFactoryProxy.gameArgs(GameTypes.SUPER_PERMISSIONED_CANNON));
@@ -1720,7 +1726,9 @@ contract OPContractsManager_UpgradeSuperchainConfig_Test is OPContractsManager_U
17201726
vm.expectEmit(address(superchainConfig));
17211727
emit Upgraded(impls.superchainConfigImpl);
17221728
vm.prank(superchainPAO, true);
1723-
opcm.upgradeSuperchainConfig(superchainConfig);
1729+
(bool success, bytes memory returndata) =
1730+
address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.upgradeSuperchainConfig, (superchainConfig)));
1731+
assertTrue(success, "upgradeSuperchainConfig failed");
17241732
}
17251733

17261734
/// @notice Tests that the upgradeSuperchainConfig function reverts when it is not called via delegatecall.
@@ -1737,13 +1745,16 @@ contract OPContractsManager_UpgradeSuperchainConfig_Test is OPContractsManager_U
17371745
ISuperchainConfig superchainConfig = ISuperchainConfig(artifacts.mustGetAddress("SuperchainConfigProxy"));
17381746

17391747
address delegateCaller = makeAddr("delegateCaller");
1748+
vm.etch(delegateCaller, hex"00"); // Foundry fails with "cannot `prank` delegate call from an EOA" if empty
17401749

17411750
assertNotEq(superchainProxyAdmin.owner(), delegateCaller);
17421751
assertNotEq(proxyAdmin.owner(), delegateCaller);
17431752

17441753
vm.expectRevert("Ownable: caller is not the owner");
17451754
vm.prank(delegateCaller, true);
1746-
opcm.upgradeSuperchainConfig(superchainConfig);
1755+
(bool success, bytes memory returndata) =
1756+
address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.upgradeSuperchainConfig, (superchainConfig)));
1757+
assertTrue(success, "upgradeSuperchainConfig failed");
17471758
}
17481759

17491760
/// @notice Tests that the upgradeSuperchainConfig function reverts when the superchainConfig version is the same or
@@ -1758,9 +1769,12 @@ contract OPContractsManager_UpgradeSuperchainConfig_Test is OPContractsManager_U
17581769
vm.mockCall(address(superchainConfig), abi.encodeCall(ISuperchainConfig.version, ()), abi.encode("99.99.99"));
17591770

17601771
// Try to upgrade the SuperchainConfig contract again, should fail.
1772+
vm.etch(upgrader, hex"00"); // Foundry fails with "cannot `prank` delegate call from an EOA" if empty
17611773
vm.expectRevert(IOPContractsManagerUpgrader.OPContractsManagerUpgrader_SuperchainConfigAlreadyUpToDate.selector);
17621774
vm.prank(upgrader, true);
1763-
opcm.upgradeSuperchainConfig(superchainConfig);
1775+
(bool success, bytes memory returndata) =
1776+
address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.upgradeSuperchainConfig, (superchainConfig)));
1777+
assertTrue(success, "upgradeSuperchainConfig failed");
17641778
}
17651779
}
17661780

@@ -1833,7 +1847,9 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit {
18331847
vm.expectRevert(_revertSelector);
18341848
}
18351849
vm.prank(proxyAdminOwner, true);
1836-
opcm.migrate(_input);
1850+
(bool success, bytes memory returndata) =
1851+
address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.migrate, (_input)));
1852+
assertTrue(success, "migrate failed");
18371853
uint256 gasAfter = gasleft();
18381854

18391855
// Make sure the gas usage is less than 20 million so we can definitely fit in a block.

0 commit comments

Comments
 (0)