Files
mev-beta/docs/SWAP_DETECTION_FIX_20251030.md

7.5 KiB
Raw Blame History

Swap Detection Fix - October 30, 2025

Status: CODE CHANGES COMPLETE - Testing in Progress Priority: CRITICAL Fixes: Issue #3 from FIXES_APPLIED_20251030.md


Problem Statement

The MEV bot was processing blocks but detecting 0 DEX transactions and 0 swap events, preventing all arbitrage detection.

Evidence

[INFO] Block 395144133: Processing 7 transactions, found 0 DEX transactions
[INFO] Block 395144133: No DEX transactions found in 7 total transactions
[INFO] 📦 Block 395144133: NO SWAP EVENTS FOUND - continuing to monitor

Root Cause

The ArbitrumL2Parser filters transactions by checking if transaction.to matches addresses in the dexContracts map. This map only contained ~20 hardcoded DEX router addresses and 3 high-activity pools.

The 96 newly discovered pools from the 20-token expansion were NOT in this map, so swaps to those pools were filtered out before processing.

File: pkg/arbitrum/l2_parser.go:518

contractName, isDEXContract := p.dexContracts[toAddr]
if funcInfo, isDEXFunction := p.dexFunctions[functionSig]; isDEXFunction {
    // Process as DEX transaction
}

Solution Implemented

1. Added Method to Populate Discovered Pools

File: pkg/arbitrum/l2_parser.go:423-458

// AddDiscoveredPoolsToDEXContracts adds discovered pools to the DEX contracts map for swap detection
// This is CRITICAL for detecting swaps on discovered pools, not just hardcoded high-activity pools
func (p *ArbitrumL2Parser) AddDiscoveredPoolsToDEXContracts() {
	if p.poolDiscovery == nil {
		p.logger.Warn("Pool discovery not initialized, cannot add discovered pools to DEX contracts")
		return
	}

	allPools := p.poolDiscovery.GetAllPools()
	addedCount := 0

	for _, pool := range allPools {
		poolAddr := common.HexToAddress(pool.Address)

		// Create descriptive name for the pool contract using token address prefixes
		token0Prefix := pool.Token0
		token1Prefix := pool.Token1
		if len(token0Prefix) > 10 {
			token0Prefix = token0Prefix[:10] // Use first 10 chars of address
		}
		if len(token1Prefix) > 10 {
			token1Prefix = token1Prefix[:10]
		}

		contractName := fmt.Sprintf("%s_Pool_%s_%s", pool.Protocol, token0Prefix, token1Prefix)

		// Only add if not already in the map (preserve hardcoded high-activity pools)
		if _, exists := p.dexContracts[poolAddr]; !exists {
			p.dexContracts[poolAddr] = contractName
			addedCount++
		}
	}

	p.logger.Info(fmt.Sprintf("✅ Added %d discovered pools to DEX contract filter (total: %d DEX contracts monitored)",
		addedCount, len(p.dexContracts)))
}

2. Added Getter to Expose L2Parser

File: pkg/monitor/concurrent.go:830-834

// GetL2Parser returns the ArbitrumL2Parser instance for external configuration
// This allows callers to configure the parser after initialization (e.g., adding discovered pools)
func (m *ArbitrumMonitor) GetL2Parser() *arbitrum.ArbitrumL2Parser {
	return m.l2Parser
}

3. Integrated with Arbitrage Service

File: pkg/arbitrage/service.go:1539-1552

// 🔧 FIX #3: Add discovered pools to DEX contract filter for swap detection
// This is CRITICAL - without this, swaps on discovered pools won't be detected
if sas.poolDiscovery != nil && sas.poolDiscovery.GetPoolCount() > 0 {
	sas.logger.Info("🔧 Adding discovered pools to DEX contract filter...")
	l2Parser := monitor.GetL2Parser()
	if l2Parser != nil {
		l2Parser.AddDiscoveredPoolsToDEXContracts()
		sas.logger.Info("✅ Discovered pools integrated with swap detection system")
	} else {
		sas.logger.Warn("⚠️  L2Parser not available, discovered pools not added to DEX filter")
	}
} else {
	sas.logger.Warn("⚠️  No pools discovered, swap detection will use hardcoded pools only")
}

Files Modified

  1. pkg/arbitrum/l2_parser.go

    • Added: AddDiscoveredPoolsToDEXContracts() method (lines 423-458)
  2. pkg/monitor/concurrent.go

    • Added: GetL2Parser() getter method (lines 830-834)
  3. pkg/arbitrage/service.go

    • Modified: createArbitrumMonitor() to call AddDiscoveredPoolsToDEXContracts() (lines 1539-1552)
  4. config/local.yaml

    • Updated: WebSocket endpoint to wss://arb1.arbitrum.io/ws (line 8)

Expected Behavior After Fix

Before

[INFO] Block 395144133: Processing 7 transactions, found 0 DEX transactions
[INFO] 📦 Block 395144133: NO SWAP EVENTS FOUND

After

[INFO] 🔧 Adding discovered pools to DEX contract filter...
[INFO] ✅ Added 96 discovered pools to DEX contract filter (total: 116 DEX contracts monitored)
[INFO] ✅ Discovered pools integrated with swap detection system
[INFO] Block 395144200: Processing 15 transactions, found 3 DEX transactions
[INFO] 📦 Block 395144200: 2 swap events detected on monitored pools
[INFO] Processing swap: 1000 USDC → 0.5 WETH on pool 0xC6962004f452bE9203591991D15f6b388e09E8D0

Impact

Critical

  • Swap Detection: Bot can now detect swaps on all 96 discovered pools
  • DEX Coverage: Increased from ~20 to ~116 monitored contracts (5.8x improvement)
  • Arbitrage Opportunities: Can detect opportunities across full token matrix

High

  • Price Updates: Swaps will trigger price updates (via calculatePriceImpact)
  • Market Coverage: 20 tokens × 96 pools = full market visibility

Medium

  • Maintainability: No hardcoding needed for new pools
  • Scalability: Automatic integration as new pools are discovered

Testing Status

Build Status

Compilation successful - No errors

Runtime Testing

In Progress - Bot startup encountering provider connection issues (unrelated to this fix)

Expected Test Results

When bot successfully starts, logs should show:

  1. Pool discovery completes (96 pools)
  2. " Added 96 discovered pools to DEX contract filter"
  3. DEX transactions detected in subsequent blocks
  4. Swap events processed and prices updated

Verification Steps

1. Check Pool Integration

tail -f logs/mev_bot.log | grep "Added.*discovered pools"
# Should see: "✅ Added 96 discovered pools to DEX contract filter (total: 116 DEX contracts monitored)"

2. Monitor Swap Detection

tail -f logs/mev_bot.log | grep -E "DEX transactions|swap.*detected"
# Should see: "Block X: Processing Y transactions, found Z DEX transactions" where Z > 0

3. Verify Price Updates

tail -f logs/mev_bot.log | grep -i "price.*update"
# Should see: Price cache updates after swap events

Remaining Issues

Provider Connection

The bot is currently stuck during startup trying to connect to expired/invalid provider endpoints in providers_runtime.yaml. This is NOT related to the swap detection fix.

Solution: Either:

  1. Update providers_runtime.yaml with valid Alchemy/Chainstack API keys
  2. Or simplify to use only the free public endpoint from .env

  • Previous Fixes: docs/FIXES_APPLIED_20251030.md
  • Caching Analysis: docs/CACHING_ANALYSIS_20251030.md
  • 20-Token Expansion: docs/20_TOKEN_EXPANSION_COMPLETE.md

Next Steps

  1. Resolve Provider Issues: Fix RPC/WS endpoint configuration
  2. Test Swap Detection: Run bot and verify swaps are detected
  3. Monitor Performance: Track DEX transaction detection rate
  4. Optimize if Needed: Adjust pool filtering if too many false positives

Document Version: 1.0 Last Updated: October 30, 2025 19:40 UTC Changes Applied: 3 files modified, 1 config updated Build Status: Successful Testing Status: Pending provider fix