diff --git a/op-e2e/e2eutils/disputegame/helper.go b/op-e2e/e2eutils/disputegame/helper.go index cb3213fdb375..feb8af6e5336 100644 --- a/op-e2e/e2eutils/disputegame/helper.go +++ b/op-e2e/e2eutils/disputegame/helper.go @@ -11,7 +11,9 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" + "github.com/ethereum-optimism/optimism/op-challenger/config" "github.com/ethereum-optimism/optimism/op-challenger/fault/alphabet" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -52,6 +54,7 @@ type FactoryHelper struct { require *require.Assertions client *ethclient.Client opts *bind.TransactOpts + factoryAddr common.Address factory *bindings.DisputeGameFactory blockOracle *bindings.BlockOracle l2oo *bindings.L2OutputOracleCaller @@ -65,7 +68,8 @@ func NewFactoryHelper(t *testing.T, ctx context.Context, deployments *genesis.L1 require.NoError(err) require.NotNil(deployments, "No deployments") - factory, err := bindings.NewDisputeGameFactory(deployments.DisputeGameFactoryProxy, client) + factoryAddr := deployments.DisputeGameFactoryProxy + factory, err := bindings.NewDisputeGameFactory(factoryAddr, client) require.NoError(err) blockOracle, err := bindings.NewBlockOracle(deployments.BlockOracle, client) require.NoError(err) @@ -78,6 +82,7 @@ func NewFactoryHelper(t *testing.T, ctx context.Context, deployments *genesis.L1 client: client, opts: opts, factory: factory, + factoryAddr: factoryAddr, blockOracle: blockOracle, l2oo: l2oo, } @@ -150,6 +155,21 @@ func (h *FactoryHelper) StartCannonGame(ctx context.Context, rootClaim common.Ha }, } } +func (h *FactoryHelper) StartChallenger(ctx context.Context, l1Endpoint string, name string, options ...challenger.Option) *challenger.Helper { + opts := []challenger.Option{ + func(c *config.Config) { + // Uncomment when challenger actually supports setting the game factory address + //c.FactoryAddress = h.factoryAddr + c.TraceType = config.TraceTypeAlphabet + }, + } + opts = append(opts, options...) + c := challenger.NewChallenger(h.t, ctx, l1Endpoint, name, opts...) + h.t.Cleanup(func() { + _ = c.Close() + }) + return c +} // waitForProposals waits until there are at least two proposals in the output oracle // This is the minimum required for creating a game. diff --git a/op-e2e/faultproof_test.go b/op-e2e/faultproof_test.go index 0b5fcc71e874..43dc1b2a4925 100644 --- a/op-e2e/faultproof_test.go +++ b/op-e2e/faultproof_test.go @@ -13,6 +13,37 @@ import ( "github.com/stretchr/testify/require" ) +func TestCannonMultipleGames(t *testing.T) { + t.Skip("Challenger doesn't yet support multiple games") + InitParallel(t) + + ctx := context.Background() + sys, l1Client := startFaultDisputeSystem(t) + t.Cleanup(sys.Close) + + gameFactory := disputegame.NewFactoryHelper(t, ctx, sys.cfg.L1Deployments, l1Client) + // Start a challenger with the correct alphabet trace + gameFactory.StartChallenger(ctx, sys.NodeEndpoint("l1"), "TowerDefense", func(c *config.Config) { + c.AgreeWithProposedOutput = true + c.AlphabetTrace = "abcdefg" + c.TxMgrConfig.PrivateKey = e2eutils.EncodePrivKeyToString(sys.cfg.Secrets.Alice) + }) + + game1 := gameFactory.StartAlphabetGame(ctx, "abcxyz") + // Wait for the challenger to respond to the first game + game1.WaitForClaimCount(ctx, 2) + + game2 := gameFactory.StartAlphabetGame(ctx, "zyxabc") + // Wait for the challenger to respond to the second game + game2.WaitForClaimCount(ctx, 2) + + // Challenger should respond to new claims + game2.Attack(ctx, 1, common.Hash{0xaa}) + game2.WaitForClaimCount(ctx, 4) + game1.Defend(ctx, 1, common.Hash{0xaa}) + game1.WaitForClaimCount(ctx, 4) +} + func TestResolveDisputeGame(t *testing.T) { InitParallel(t)