Files
mev-beta/docs/PROFIT_CALCULATION_AUDIT.md

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