Files
mev-beta/docs/POOL_BLACKLIST_FIX_20251102.md

4.1 KiB

Pool Blacklist Integration Fix

Date: 2025-11-02 22:30 Status: COMPLETED

Problem

The bot was repeatedly trying to fetch tokens from problematic pools that consistently fail with "failed to call token1(): execution reverted" errors. Even though a blacklist system existed, it wasn't being properly utilized, resulting in:

  • 45+ repeated failures for the same pools
  • Unnecessary RPC calls
  • Log pollution
  • Wasted processing time

Pools Causing Issues

The following pools were repeatedly failing:

  • 0x6f38e884725a116C9C7fBF208e79FE8828a2595F (10+ failures)
  • 0x2f5e87C9312fa29aed5c179E456625D79015299c (5+ failures)
  • 0xB1026b8e7276e7AC75410F1fcbbe21796e8f7526 (5+ failures)
  • 0xC6962004f452bE9203591991D15f6b388e09E8D0 (5+ failures)
  • 0x641C00A822e8b671738d32a431a4Fb6074E5c79d (7+ failures)
  • And many others...

Root Cause

  1. Blacklist Not Integrated: The blacklist system was created but not properly integrated into the swap event processing
  2. No Early Checks: Pool token fetching didn't check blacklist status before attempting RPC calls
  3. Failure Recording Missing: Failures weren't being recorded to trigger blacklisting
  4. Existing Blacklist Not Applied: Pools with 12+ failures had is_blacklisted: false

Solution Implemented

1. Added Blacklist Checks Before Token Fetching

// Check if pool is blacklisted
if sas.poolDiscovery != nil && sas.poolDiscovery.IsPoolBlacklisted(log.Address) {
    sas.logger.Debug(fmt.Sprintf("Skipping blacklisted pool %s", log.Address.Hex()))
    return nil
}

2. Record Failures for Automatic Blacklisting

if err != nil {
    // Record failure for blacklisting
    if sas.poolDiscovery != nil {
        sas.poolDiscovery.RecordPoolFailure(
            log.Address,
            "failed to call token1(): execution reverted",
            "UniswapV3",
            token0Addr,
            token1Addr,
        )
    }
}

3. Early Blacklist Check in getPoolTokens

func (sas *ArbitrageService) getPoolTokens(poolAddress common.Address) {
    // Check if pool is blacklisted before attempting any calls
    if sas.poolDiscovery != nil && sas.poolDiscovery.IsPoolBlacklisted(poolAddress) {
        return common.Address{}, common.Address{}, fmt.Errorf("pool %s is blacklisted", poolAddress.Hex())
    }
    // ... rest of function
}

4. Updated Existing Blacklist Database

  • Marked 237 problematic pools as blacklisted in logs/pool_blacklist.json
  • Set is_blacklisted: true for pools with multiple failures
  • Added proper failure reasons

Files Modified

  1. /pkg/arbitrage/service.go - Added blacklist checks (lines 1657-1683, 1404-1406)
  2. /pkg/pools/blacklist.go - Created comprehensive blacklist system (330 lines)
  3. /pkg/pools/discovery.go - Integrated blacklist (lines 818-855)
  4. /logs/pool_blacklist.json - Updated 237 pools to blacklisted status

Expected Impact

  • 90% reduction in "Failed to get tokens" errors
  • No repeated attempts on known bad pools
  • Cleaner logs with less error spam
  • Better RPC utilization (no wasted calls)
  • Automatic blacklisting after 5 failures

Verification

After implementation:

  • 237 pools are now blacklisted
  • Blacklist checks occur before any RPC calls
  • Failures are recorded and trigger automatic blacklisting
  • Pool discovery respects blacklist status

Monitoring

The blacklist system provides extensive logging:

🚨 POOL FAILURE [1/5]: Pool 0x6f38e884 (UniswapV3) - failed to call token1()
⛔ POOL BLACKLISTED: 0x6f38e884 after 5 failures
📊 Pool Blacklist Statistics: 237 permanent, 0 temporary monitoring
⚠️  Skipping blacklisted pool 0x6f38e884

Future Improvements

  1. Add pool validation before adding to discovery
  2. Implement pool health scoring
  3. Add automatic un-blacklisting after successful validation
  4. Create admin interface for blacklist management
  5. Add pool type detection to avoid non-standard pools

Conclusion

The pool blacklist is now fully integrated and actively preventing repeated failures. This should eliminate the error spam you were seeing and improve overall bot performance.