From 294a6fc0335dcb24d81e7f025d84f15f9cc53515 Mon Sep 17 00:00:00 2001
From: Andreas Bigger <abigger87@gmail.com>
Date: Wed, 2 Aug 2023 18:32:50 -0400
Subject: [PATCH] parent 58a2d8945e65caf8a5ccd588a33bdd60851fe11d author
 Andreas Bigger <abigger87@gmail.com> 1691015570 -0400 committer Andreas
 Bigger <abigger87@gmail.com> 1691404554 -0400

Wire up the Challenger preimage loading.
---
 op-challenger/fault/agent.go         | 15 ++++++++++++++-
 op-challenger/fault/service.go       |  5 ++---
 op-challenger/fault/solver/solver.go |  6 ++++++
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/op-challenger/fault/agent.go b/op-challenger/fault/agent.go
index 2724f5d41..9deb45894 100644
--- a/op-challenger/fault/agent.go
+++ b/op-challenger/fault/agent.go
@@ -23,16 +23,18 @@ type Agent struct {
 	solver                  *solver.Solver
 	loader                  Loader
 	responder               Responder
+	updater                 types.OracleUpdater
 	maxDepth                int
 	agreeWithProposedOutput bool
 	log                     log.Logger
 }
 
-func NewAgent(loader Loader, maxDepth int, trace types.TraceProvider, responder Responder, agreeWithProposedOutput bool, log log.Logger) *Agent {
+func NewAgent(loader Loader, maxDepth int, trace types.TraceProvider, responder Responder, updater types.OracleUpdater, agreeWithProposedOutput bool, log log.Logger) *Agent {
 	return &Agent{
 		solver:                  solver.NewSolver(maxDepth, trace),
 		loader:                  loader,
 		responder:               responder,
+		updater:                 updater,
 		maxDepth:                maxDepth,
 		agreeWithProposedOutput: agreeWithProposedOutput,
 		log:                     log,
@@ -132,6 +134,17 @@ func (a *Agent) step(ctx context.Context, claim types.Claim, game types.Game) er
 		return nil
 	}
 
+	oracleData, err := a.solver.GetOracleData(ctx, claim)
+	if err != nil {
+		a.log.Debug("Failed to get oracle data", "err", err)
+		return nil
+	}
+
+	a.log.Info("Updating oracle data", "oracleKey", oracleData.OracleKey, "oracleData", oracleData.OracleData)
+	if err := a.updater.UpdateOracle(ctx, *oracleData); err != nil {
+		return fmt.Errorf("failed to load oracle data: %w", err)
+	}
+
 	a.log.Info("Attempting step", "claim_depth", claim.Depth(), "maxDepth", a.maxDepth)
 	step, err := a.solver.AttemptStep(ctx, claim, agreeWithClaimLevel)
 	if err != nil {
diff --git a/op-challenger/fault/service.go b/op-challenger/fault/service.go
index d1bb39f32..5d1d00f35 100644
--- a/op-challenger/fault/service.go
+++ b/op-challenger/fault/service.go
@@ -64,8 +64,7 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
 }
 
 // newTypedService creates a new Service from a provided trace provider.
-func newTypedService(ctx context.Context, logger log.Logger, cfg *config.Config, client *ethclient.Client, provider types.TraceProvider, uploader types.OracleUpdater, txMgr txmgr.TxManager) (*service, error) {
-
+func newTypedService(ctx context.Context, logger log.Logger, cfg *config.Config, client *ethclient.Client, provider types.TraceProvider, updater types.OracleUpdater, txMgr txmgr.TxManager) (*service, error) {
 	contract, err := bindings.NewFaultDisputeGameCaller(cfg.GameAddress, client)
 	if err != nil {
 		return nil, fmt.Errorf("failed to bind the fault dispute game contract: %w", err)
@@ -83,7 +82,7 @@ func newTypedService(ctx context.Context, logger log.Logger, cfg *config.Config,
 		return nil, fmt.Errorf("failed to bind the fault contract: %w", err)
 	}
 
-	agent := NewAgent(loader, cfg.GameDepth, provider, responder, cfg.AgreeWithProposedOutput, gameLogger)
+	agent := NewAgent(loader, cfg.GameDepth, provider, responder, updater, cfg.AgreeWithProposedOutput, gameLogger)
 
 	return &service{
 		agent:                   agent,
diff --git a/op-challenger/fault/solver/solver.go b/op-challenger/fault/solver/solver.go
index 78cbb729a..11b5e906d 100644
--- a/op-challenger/fault/solver/solver.go
+++ b/op-challenger/fault/solver/solver.go
@@ -28,6 +28,12 @@ func NewSolver(gameDepth int, traceProvider types.TraceProvider) *Solver {
 	}
 }
 
+// GetOracleData returns the oracle data for the provided claim.
+// It passes through to the [TraceProvider] by finding the trace index for the claim.
+func (s *Solver) GetOracleData(ctx context.Context, claim types.Claim) (*types.PreimageOracleData, error) {
+	return s.trace.GetOracleData(ctx, claim.TraceIndex(s.gameDepth))
+}
+
 // NextMove returns the next move to make given the current state of the game.
 func (s *Solver) NextMove(ctx context.Context, claim types.Claim, agreeWithClaimLevel bool) (*types.Claim, error) {
 	if agreeWithClaimLevel {
-- 
2.23.0