170 lines
5.1 KiB
Markdown
170 lines
5.1 KiB
Markdown
# Comprehensive Profit Calculation Audit Report
|
|
**Date**: November 3, 2025
|
|
**Status**: CRITICAL - No arbitrage opportunities detected
|
|
|
|
## Executive Summary
|
|
The MEV bot is running with proper pool detection (bindings integration successful) but detecting ZERO arbitrage opportunities. This indicates fundamental issues with profit calculations.
|
|
|
|
## Current Issues Identified
|
|
|
|
### 1. Pool Detection Status ✅
|
|
- **Working**: Contract bindings successfully integrated
|
|
- **Working**: Pool type detection (UniswapV2/V3, Algebra variants)
|
|
- **Working**: Blacklisting of invalid pools
|
|
- **Issue**: Some pools still causing "execution reverted" errors
|
|
|
|
### 2. Arbitrage Detection Status ❌
|
|
- **Critical**: 0 opportunities detected in hours of operation
|
|
- **Stats**: Detected: 0, Executed: 0, Successful: 0
|
|
- **Root Cause**: Likely profit calculation or threshold issues
|
|
|
|
## Root Cause Analysis
|
|
|
|
### 1. Decimal Precision Issues
|
|
**Problem**: Token decimals not properly handled
|
|
- WETH has 18 decimals
|
|
- USDC/USDT have 6 decimals
|
|
- WBTC has 8 decimals
|
|
|
|
**Current Code Issue**:
|
|
```go
|
|
// Incorrect: Treating all amounts as 18 decimals
|
|
amountInFloat, _ = new(big.Float).Quo(new(big.Float).SetInt(swapInfo.AmountIn), big.NewFloat(1e18)).Float64()
|
|
```
|
|
|
|
**Fix Required**:
|
|
```go
|
|
// Correct: Use actual token decimals
|
|
decimals := tokenDecimals[tokenAddress]
|
|
divisor := new(big.Float).SetFloat64(math.Pow(10, float64(decimals)))
|
|
amountInFloat, _ = new(big.Float).Quo(new(big.Float).SetInt(swapInfo.AmountIn), divisor).Float64()
|
|
```
|
|
|
|
### 2. Fee Calculation Errors
|
|
**Problem**: UniswapV3 fees incorrectly interpreted
|
|
- V3 fees are in units of 0.01% (1 = 0.01%, 100 = 1%)
|
|
- V2 fees are fixed at 0.3% (30 basis points)
|
|
|
|
**Current Issue**:
|
|
```go
|
|
// Fee from binding is *big.Int but represents basis points
|
|
fee := pool.Fee() // Returns 3000 for 0.3% fee
|
|
// Need to convert to actual percentage
|
|
```
|
|
|
|
**Fix Required**:
|
|
```go
|
|
feePercent := float64(fee.Int64()) / 1000000.0 // Convert basis points to decimal
|
|
```
|
|
|
|
### 3. Profit Threshold Too Conservative
|
|
**Current Setting**: 0.1% minimum profit (from config)
|
|
**Market Reality**: Most arbitrage profits are 0.01% - 0.05%
|
|
|
|
**Fix Required**:
|
|
- Lower threshold to 0.01% (1 basis point)
|
|
- Account for gas costs properly
|
|
- Consider flash loan fees (0.09% on Aave)
|
|
|
|
### 4. Price Calculation Logic
|
|
**Problem**: Not accounting for price impact and slippage
|
|
```go
|
|
// Current: Simple calculation
|
|
profit = amountOut - amountIn
|
|
|
|
// Should be:
|
|
profit = (amountOut * (1 - slippage)) - amountIn - gasCost - flashLoanFee
|
|
```
|
|
|
|
## Immediate Action Plan
|
|
|
|
### Phase 1: Fix Critical Calculations (NOW)
|
|
1. **Token Decimal Handling**
|
|
- Create decimal registry for all tokens
|
|
- Use correct divisors for each token
|
|
|
|
2. **Fee Conversion Fix**
|
|
- Convert UniswapV3 fees from basis points
|
|
- Handle V2 fixed fees correctly
|
|
- Account for protocol fees
|
|
|
|
3. **Lower Profit Threshold**
|
|
- Reduce from 0.1% to 0.01%
|
|
- Make configurable per token pair
|
|
|
|
### Phase 2: Enhanced Calculations
|
|
1. **Gas Cost Integration**
|
|
- Fetch current gas price
|
|
- Calculate execution cost
|
|
- Include in profit calculation
|
|
|
|
2. **Slippage Protection**
|
|
- Add configurable slippage (0.5% default)
|
|
- Calculate minimum output amounts
|
|
|
|
3. **Flash Loan Costs**
|
|
- Include 0.09% Aave fee
|
|
- Calculate break-even points
|
|
|
|
### Phase 3: Testing & Validation
|
|
1. **Unit Tests for Calculations**
|
|
- Test with different decimals
|
|
- Verify fee calculations
|
|
- Validate profit thresholds
|
|
|
|
2. **Integration Testing**
|
|
- Fork mainnet for testing
|
|
- Replay historical transactions
|
|
- Verify profit calculations match reality
|
|
|
|
## Code Locations to Fix
|
|
|
|
1. **pkg/profitcalc/profit_calc.go**
|
|
- `CalculateProfit()` function
|
|
- Decimal handling logic
|
|
- Fee calculations
|
|
|
|
2. **pkg/arbitrage/detection_engine.go**
|
|
- Profit threshold checks
|
|
- Opportunity filtering logic
|
|
|
|
3. **pkg/pricing/engine.go**
|
|
- Price impact calculations
|
|
- Slippage adjustments
|
|
|
|
4. **internal/config/config.go**
|
|
- Lower MinProfitThreshold
|
|
- Add per-pair thresholds
|
|
|
|
## Validation Metrics
|
|
After fixes, we should see:
|
|
- **Opportunities/hour**: 10-50 (market dependent)
|
|
- **Success rate**: 20-40% (competition dependent)
|
|
- **Average profit**: 0.02-0.05% per trade
|
|
- **Daily profit**: $50-500 (volume dependent)
|
|
|
|
## Critical Success Factors
|
|
1. ✅ Detect at least 1 opportunity per minute
|
|
2. ✅ Calculate profits with 6+ decimal precision
|
|
3. ✅ Account for all fees and costs
|
|
4. ✅ Execute profitable trades only
|
|
5. ✅ Monitor and log all calculations
|
|
|
|
## Next Steps
|
|
1. Implement decimal fixes immediately
|
|
2. Deploy with lower thresholds
|
|
3. Monitor for 1 hour
|
|
4. Adjust based on results
|
|
5. Scale up execution
|
|
|
|
## Risk Assessment
|
|
- **High Risk**: Executing with wrong calculations = losses
|
|
- **Medium Risk**: Missing opportunities = no profit
|
|
- **Low Risk**: Over-conservative thresholds = fewer trades
|
|
|
|
## Conclusion
|
|
The bot's core infrastructure is working (pool detection, monitoring, bindings) but profit calculations are preventing opportunity detection. Immediate fixes to decimal handling and thresholds should restore functionality.
|
|
|
|
**Estimated Time to Fix**: 2-4 hours
|
|
**Expected Result**: 10+ opportunities/hour detected
|
|
**Profit Potential**: $50-500/day once operational |