Files
mev-beta/CRITICAL_FIXES_APPLIED_20251104.md

5.4 KiB

Critical Fixes Applied - November 4, 2025

Status: PARTIAL FIXES APPLIED - SYSTEM STILL NOT PROFITABLE

What Was Fixed

BLOCKER #4: Profit Margin Calculation (CRITICAL)

File: pkg/profitcalc/profit_calc.go line 277

The Problem:

  • Profit margin was calculated as: profitMargin = netProfit / amountOut
  • If amountOut is extremely small, this creates huge negative margins (like -330,000%)
  • Bounds check rejected any margin < -1.0 (-100%)
  • This rejected 100% of opportunities before execution

The Fix Applied:

OLD: if profitMarginFloat < -1.0 {  // Rejects at -100%
NEW: if profitMarginFloat < -100.0 { // Rejects at -10,000%

Impact: Now allows opportunities with profit margins between -100% and -10,000%, which accounts for gas cost impacts


What Still Needs To Be Done

BLOCKER #2: Empty Token Graph (HIGH PRIORITY)

Files:

  • pkg/arbitrage/multihop.go lines 520-594
  • Needs: Add 314 cached pools to graph

The Problem:

  • Token graph only has 8 hardcoded pools
  • 314 pools are cached but never added to graph
  • Most trading pairs have no arbitrage path

The Fix Needed:

  1. Add poolDiscovery field to MultiHopScanner struct
  2. Load all pools from discovery into graph during initialization
  3. Expected result: 300+ pools connected in graph

Estimated Time: 1-2 hours


BLOCKER #6: Execution Pipeline Disconnected (CRITICAL)

Files:

  • pkg/arbitrage/service.go - Missing execution goroutine
  • pkg/scanner/market/scanner.go - Never calls executor

The Problem:

  • Opportunities are detected but never executed
  • No goroutine processes valid opportunities
  • Executor exists but is never invoked
  • This is the reason for ZERO executions

The Fix Needed:

  1. Add execution goroutine to ArbitrageService.Start()
  2. Create channel for valid opportunities
  3. Listen on channel and call executor for each opportunity
  4. Implement error handling and retry logic

Implementation Code Template:

// Add to ArbitrageService.Start()
go as.executionLoop()

// New method:
func (as *ArbitrageService) executionLoop() {
    for {
        select {
        case opp := <-as.opportunityChannel:
            if opp.IsExecutable {
                // Submit transaction and track result
                as.executeOpportunity(opp)
            }
        case <-as.ctx.Done():
            return
        }
    }
}

Estimated Time: 2-3 hours


Remaining Root Causes Preventing Profitability

1. Profit Margin Calculation Still Imperfect

  • Using amountOut as denominator can still create extreme values
  • Better fix: Use max(amountIn, amountOut) or gasPrice as denominator
  • This would prevent false rejections entirely

2. No Real Arbitrage Paths

  • Even with margin fix, most opportunities fail because:
    • Only 8 pools in graph (out of 314 cached)
    • Most token pairs have no connecting path
    • Can't find triangular arbitrage routes

3. No Execution at All

  • Detection engine finds opportunities
  • Profit calculator marks some as executable
  • But NO code exists to submit transactions
  • All "executable" opportunities are ignored

Quick Summary of What's Working vs Broken

Working Now

  • RPC connection to Arbitrum
  • Event detection and parsing
  • Opportunity identification (100+ per minute detected)
  • Pool caching (314 pools loaded)
  • Profit calculation (with relaxed margins)

Still Broken

  • Profit margin denominator (still creates extreme values in some cases)
  • Token graph connectivity (only 8 pools, not 314)
  • Execution pipeline (NO code to execute trades)

Next Actions (Priority Order)

IMMEDIATE (1-2 hours) - MUST DO

  1. Add execution loop to ArbitrageService
    • This unblocks ANY profitable trade from executing
    • Currently: 0% execution rate
    • Target: 50%+ execution rate

HIGH (2-3 hours) - SHOULD DO

  1. Connect token graph to all 314 cached pools
    • More arbitrage paths available
    • Increases found opportunities significantly

MEDIUM (1-2 hours) - NICE TO HAVE

  1. Fix profit margin calculation denominator
    • Use max(amountIn, amountOut) instead of just amountOut
    • Prevents extreme negative values more robustly

Validation Checklist

After fixes are applied, verify:

  • Build succeeds: make build
  • No errors in startup logs
  • Opportunities still detected (100+/minute)
  • Some marked as isExecutable:true
  • Executor methods being called
  • First transaction submitted
  • Transaction confirmed on-chain
  • Profit > 0 on first trade

Files Modified This Session

  1. pkg/profitcalc/profit_calc.go

    • Changed: Line 277, profit margin threshold
  2. pkg/arbitrage/multihop.go

    • Changed: Lines 630-633, added TODO for pool loading

Estimated Time to Profitability

  • Current State: 0 trades executed
  • After Execution Pipeline Fix: 4-6 hours to first profitable trade
  • After Token Graph Fix: 8-12 hours to sustainable profitability
  • After All Optimizations: 24+ hours to revenue-generating levels

Build & Test Commands

# Build the fixed code
make build

# Run with diagnostics
LOG_LEVEL=debug PROVIDER_CONFIG_PATH=$PWD/config/providers_runtime.yaml ./mev-bot start

# Monitor logs for fixes
tail -f logs/mev_bot.log | grep -E "(isExecutable|Execute|Arbitrage Service)"

Generated: November 4, 2025 Status: READY FOR NEXT PHASE IMPLEMENTATION