diff --git a/op-acceptance-tests/tests/interop/interop_tx_test.go b/op-acceptance-tests/tests/interop/interop_tx_test.go index 032e49e1b8daf..a83bc672603d1 100644 --- a/op-acceptance-tests/tests/interop/interop_tx_test.go +++ b/op-acceptance-tests/tests/interop/interop_tx_test.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum-optimism/optimism/devnet-sdk/testing/testlib/validators" sdktypes "github.com/ethereum-optimism/optimism/devnet-sdk/types" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -31,13 +32,13 @@ func messagePassingScenario(sourceChainIdx, destChainIdx uint64, sourceWalletGet chainB := sys.L2s()[destChainIdx] logger.Info("chain info", "sourceChain", chainA.ID(), "destChain", chainB.ID()) + elclientA, err := chainA.Nodes()[0].GethClient() + require.NoError(t, err) + elclientB, err := chainB.Nodes()[0].GethClient() + require.NoError(t, err) logger.Info("wait until both chains pass genesis") require.Eventually(t, func() bool { - elclientA, err := chainA.Nodes()[0].GethClient() - require.NoError(t, err) - elclientB, err := chainB.Nodes()[0].GethClient() - require.NoError(t, err) chainAUnsafeHeadNum, err := elclientA.BlockNumber(ctx) require.NoError(t, err) chainBUnsafeHeadNum, err := elclientB.BlockNumber(ctx) @@ -91,6 +92,26 @@ func messagePassingScenario(sourceChainIdx, destChainIdx uint64, sourceWalletGet ChainId: chainA.ID(), } + supervisor, err := sys.Supervisor(ctx) + require.NoError(t, err) + + // enforce supervisor views + require.Eventually(t, func() bool { + syncStatus, err := supervisor.SyncStatus(ctx) + require.NoError(t, err) + chainAView, ok := syncStatus.Chains[eth.ChainIDFromBig(chainA.ID())] + require.True(t, ok) + chainBView, ok := syncStatus.Chains[eth.ChainIDFromBig(chainB.ID())] + require.True(t, ok) + blockB, err := elclientB.BlockByNumber(ctx, big.NewInt(int64(chainBView.LocalUnsafe.Number))) + require.NoError(t, err) + checkA := chainAView.LocalUnsafe.Number >= identifier.BlockNumber.Uint64() + checkB := blockB.Header().Time >= identifier.Timestamp.Uint64() + logger.Info("wait until supervisor indexes chain A block with initiating message", "check", checkA, "supervisor", chainAView.LocalUnsafe.Number, "chainA", identifier.BlockNumber.Uint64()) + logger.Info("wait until supervisor indexes chain B head which passes timestamp invariant", "check", checkB, "supervisor", blockB.Header().Time, "chainA", identifier.Timestamp.Uint64()) + return checkA && checkB + }, 20*time.Second, 2*time.Second) + // Execute message logger.Info("Execute message", "address", sha256PrecompileAddr, "message", dummyMessage) execResult := userB.ExecuteMessage(identifier, sentMessage).Send(ctx)