107 lines
4.1 KiB
Markdown
107 lines
4.1 KiB
Markdown
# 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
|
|
```go
|
|
// 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
|
|
```go
|
|
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
|
|
```go
|
|
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. |