From 6287570454bd62ee8c67d46175db911c636e8af1 Mon Sep 17 00:00:00 2001 From: inphi Date: Wed, 4 Feb 2026 11:27:25 -0500 Subject: [PATCH] sysgo: restore portal ProxyAdmin owners after superroot migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During OPCM super-roots migration we temporarily transfer each OptimismPortal’s ProxyAdmin ownership to the DelegateCallProxy. Restore each portal ProxyAdmin back to the L1PAO after shared admin contracts are reset so both portals report the expected proxyAdminOwner() With this we can re-enable the TestInteropReadiness acceptance-test --- .../preinterop/interop_readiness_test.go | 1 - op-devstack/sysgo/superroot.go | 20 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/op-acceptance-tests/tests/isthmus/preinterop/interop_readiness_test.go b/op-acceptance-tests/tests/isthmus/preinterop/interop_readiness_test.go index 87d86de6f92..04c134ecc0d 100644 --- a/op-acceptance-tests/tests/isthmus/preinterop/interop_readiness_test.go +++ b/op-acceptance-tests/tests/isthmus/preinterop/interop_readiness_test.go @@ -103,7 +103,6 @@ func init() { } func TestInteropReadiness(gt *testing.T) { - gt.Skip("TODO(#18616): Skipping interop readiness test for now") t := devtest.ParallelT(gt) sys := presets.NewSimpleInterop(t) diff --git a/op-devstack/sysgo/superroot.go b/op-devstack/sysgo/superroot.go index 42d78e6cca4..942cc3f065b 100644 --- a/op-devstack/sysgo/superroot.go +++ b/op-devstack/sysgo/superroot.go @@ -523,6 +523,26 @@ func resetOwnershipAfterMigration( l1PAO, ) + // The migration temporarily transfers ownership of each portal ProxyAdmin to the DelegateCallProxy + // to satisfy the delegatecall requirement of the OPCM. Reset these back to the L1 proxy admin owner + // after the shared admin contracts are restored. + for _, cfg := range opChainConfigs { + portal := getOptimismPortal(t, w3Client, cfg.SystemConfigProxy) + portalProxyAdmin := getProxyAdmin(t, w3Client, portal) + // In some setups the migration may already restore ownership. Only reset when still owned by the proxy. + if getOwner(t, w3Client, portalProxyAdmin) == delegateCallProxy { + transferOwnershipForDelegateCallProxy( + t, + l1ChainID, + ownerPrivateKey, + client, + delegateCallProxy, + portalProxyAdmin, + l1PAO, + ) + } + } + // The Proxy Admin owner is changed. Assert that the admin of other proxies are consistent var sharedAnchorStateRegistryProxy common.Address err = w3Client.Call(w3eth.CallFunc(portal0, anchorStateRegistryFn).Returns(&sharedAnchorStateRegistryProxy))