7.5 KiB
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
-
pkg/arbitrum/l2_parser.go- Added:
AddDiscoveredPoolsToDEXContracts()method (lines 423-458)
- Added:
-
pkg/monitor/concurrent.go- Added:
GetL2Parser()getter method (lines 830-834)
- Added:
-
pkg/arbitrage/service.go- Modified:
createArbitrumMonitor()to call AddDiscoveredPoolsToDEXContracts() (lines 1539-1552)
- Modified:
-
config/local.yaml- Updated: WebSocket endpoint to
wss://arb1.arbitrum.io/ws(line 8)
- Updated: WebSocket endpoint to
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:
- Pool discovery completes (96 pools)
- "✅ Added 96 discovered pools to DEX contract filter"
- DEX transactions detected in subsequent blocks
- 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:
- Update
providers_runtime.yamlwith valid Alchemy/Chainstack API keys - Or simplify to use only the free public endpoint from
.env
Related Documents
- 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
- Resolve Provider Issues: Fix RPC/WS endpoint configuration
- Test Swap Detection: Run bot and verify swaps are detected
- Monitor Performance: Track DEX transaction detection rate
- 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