Files
mev-beta/orig/scripts/watch-live.sh
Administrator c54c569f30 refactor: move all remaining files to orig/ directory
Completed clean root directory structure:
- Root now contains only: .git, .env, docs/, orig/
- Moved all remaining files and directories to orig/:
  - Config files (.claude, .dockerignore, .drone.yml, etc.)
  - All .env variants (except active .env)
  - Git config (.gitconfig, .github, .gitignore, etc.)
  - Tool configs (.golangci.yml, .revive.toml, etc.)
  - Documentation (*.md files, @prompts)
  - Build files (Dockerfiles, Makefile, go.mod, go.sum)
  - Docker compose files
  - All source directories (scripts, tests, tools, etc.)
  - Runtime directories (logs, monitoring, reports)
  - Dependency files (node_modules, lib, cache)
  - Special files (--delete)

- Removed empty runtime directories (bin/, data/)

V2 structure is now clean:
- docs/planning/ - V2 planning documents
- orig/ - Complete V1 codebase preserved
- .env - Active environment config (not in git)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 10:53:05 +01:00

256 lines
13 KiB
Bash
Executable File

#!/bin/bash
# Live MEV Bot Activity Monitor
# Shows real-time opportunities and execution attempts
echo "════════════════════════════════════════════════════════════"
echo "🤖 MEV Bot Live Activity Monitor"
echo "════════════════════════════════════════════════════════════"
echo ""
echo "Monitoring: logs/mev_bot.log"
echo "Bot Wallet: 0x40091653f652a259747D86d7Cbe3e2848082a051"
echo "Network: Arbitrum One"
echo ""
echo "Watching for:"
echo " 🎯 Opportunities detected"
echo " ✅ Executable opportunities (isExecutable:true)"
echo " ⚡ Execution attempts"
echo " 💰 Successful trades"
echo " ❌ Errors (parsing, RPC, zero address)"
echo ""
echo "Press Ctrl+C to stop"
echo "════════════════════════════════════════════════════════════"
echo ""
# Color codes
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Track stats
OPPORTUNITIES=0
EXECUTABLE=0
EXECUTIONS=0
ERRORS=0
PARSING_ERRORS=0
RPC_ERRORS=0
ZERO_ADDRESS_ERRORS=0
LAST_STATS_DISPLAY=0 # Track last opportunity count when stats were displayed
# CRITICAL FIX: Use correct log file name (mev_bot.log with underscore, not mev-bot.log with hyphen)
tail -f logs/mev_bot.log | while read line; do
# Detect opportunities (NEW: Updated to match current log format)
if echo "$line" | grep -q "⚡ Starting arbitrage analysis\|ARBITRAGE OPPORTUNITY DETECTED\|\[OPPORTUNITY\]"; then
OPPORTUNITIES=$((OPPORTUNITIES + 1))
# Extract basic info
TIMESTAMP=$(echo "$line" | awk '{print $1, $2}')
# Check if executable
if echo "$line" | grep -q "isExecutable:true"; then
EXECUTABLE=$((EXECUTABLE + 1))
echo -e "${GREEN}[$TIMESTAMP] ✅ EXECUTABLE OPPORTUNITY #$EXECUTABLE${NC}"
# Extract token pair (executable)
if echo "$line" | grep -oP 'tokenIn:[^ ]+' &>/dev/null; then
TOKEN_IN=$(echo "$line" | grep -oP 'tokenIn:[^ \]]+' | cut -d: -f2)
TOKEN_OUT=$(echo "$line" | grep -oP 'tokenOut:[^ \]]+' | cut -d: -f2)
echo -e "${CYAN} 🔄 Pair: ${TOKEN_IN}${TOKEN_OUT}${NC}"
fi
# Extract amounts
AMOUNT_IN=$(echo "$line" | grep -oP 'Amount In: [0-9.]+' | grep -oP '[0-9.]+')
AMOUNT_OUT=$(echo "$line" | grep -oP 'Amount Out: [0-9.]+' | grep -oP '[0-9.]+')
if [[ -n "$AMOUNT_IN" ]] && [[ -n "$AMOUNT_OUT" ]]; then
echo -e "${CYAN} 📊 Amounts: ${AMOUNT_IN}${AMOUNT_OUT}${NC}"
fi
# Extract financial metrics
ESTIMATED_PROFIT=$(echo "$line" | grep -oP 'estimatedProfitETH:[0-9.]+' | cut -d: -f2)
GAS_COST=$(echo "$line" | grep -oP 'gasCostETH:[0-9.eE+-]+' | cut -d: -f2)
NET_PROFIT=$(echo "$line" | grep -oP 'netProfitETH:[0-9.eE+-]+' | cut -d: -f2)
if [[ -n "$NET_PROFIT" ]]; then
echo -e "${GREEN} 💰 Net Profit: ${NET_PROFIT} ETH${NC}"
fi
if [[ -n "$GAS_COST" ]]; then
echo -e "${YELLOW} ⛽ Gas Cost: ${GAS_COST} ETH${NC}"
fi
# Extract profit margin
PROFIT_MARGIN=$(echo "$line" | grep -oP 'profitMargin:[0-9.eE+-]+' | cut -d: -f2)
if [[ -n "$PROFIT_MARGIN" ]]; then
PROFIT_MARGIN_PCT=$(echo "$PROFIT_MARGIN * 100" | bc -l 2>/dev/null || echo "$PROFIT_MARGIN")
echo -e "${GREEN} 📊 Profit Margin: $(printf "%.4f" $PROFIT_MARGIN_PCT 2>/dev/null || echo "$PROFIT_MARGIN")%${NC}"
fi
# Extract price impact
PRICE_IMPACT=$(echo "$line" | grep -oP 'priceImpact:[0-9.eE+-]+' | cut -d: -f2)
if [[ -n "$PRICE_IMPACT" ]]; then
PRICE_IMPACT_PCT=$(echo "$PRICE_IMPACT * 100" | bc -l 2>/dev/null || echo "$PRICE_IMPACT")
echo -e "${GREEN} 📊 Price Impact: $(printf "%.6f" $PRICE_IMPACT_PCT 2>/dev/null || echo "$PRICE_IMPACT")%${NC}"
fi
# Extract confidence
CONFIDENCE=$(echo "$line" | grep -oP 'confidence:[0-9.]+' | cut -d: -f2)
if [[ -n "$CONFIDENCE" ]]; then
CONFIDENCE_PCT=$(echo "$CONFIDENCE * 100" | bc -l 2>/dev/null || echo "$CONFIDENCE")
echo -e "${GREEN} 🎯 Confidence: $(printf "%.1f" $CONFIDENCE_PCT 2>/dev/null || echo "$CONFIDENCE")%${NC}"
fi
else
# Non-executable - Show detailed metrics
echo -e "${YELLOW}[$TIMESTAMP] 🎯 Opportunity #$OPPORTUNITIES (not executable)${NC}"
# Extract token pair (non-executable)
if echo "$line" | grep -oP 'tokenIn:[^ ]+' &>/dev/null; then
TOKEN_IN=$(echo "$line" | grep -oP 'tokenIn:[^ \]]+' | cut -d: -f2)
TOKEN_OUT=$(echo "$line" | grep -oP 'tokenOut:[^ \]]+' | cut -d: -f2)
echo -e "${CYAN} 🔄 Pair: ${TOKEN_IN}${TOKEN_OUT}${NC}"
fi
# Extract amounts
AMOUNT_IN=$(echo "$line" | grep -oP 'Amount In: [0-9.]+' | grep -oP '[0-9.]+')
AMOUNT_OUT=$(echo "$line" | grep -oP 'Amount Out: [0-9.]+' | grep -oP '[0-9.]+')
if [[ -n "$AMOUNT_IN" ]] && [[ -n "$AMOUNT_OUT" ]]; then
echo -e "${CYAN} 📊 Amounts: ${AMOUNT_IN}${AMOUNT_OUT}${NC}"
fi
# Extract financial metrics
ESTIMATED_PROFIT=$(echo "$line" | grep -oP 'estimatedProfitETH:[0-9.]+' | cut -d: -f2)
GAS_COST=$(echo "$line" | grep -oP 'gasCostETH:[0-9.eE+-]+' | cut -d: -f2)
NET_PROFIT=$(echo "$line" | grep -oP 'netProfitETH:-?[0-9.eE+-]+' | cut -d: -f2)
if [[ -n "$ESTIMATED_PROFIT" ]] && [[ -n "$GAS_COST" ]] && [[ -n "$NET_PROFIT" ]]; then
# Convert scientific notation to readable format
GAS_COST_GWEI=$(echo "$GAS_COST * 1000000000" | bc -l 2>/dev/null || echo "$GAS_COST")
echo -e "${YELLOW} 💰 Estimated Profit: ${ESTIMATED_PROFIT} ETH${NC}"
echo -e "${RED} ⛽ Gas Cost: ${GAS_COST} ETH ($(printf "%.4f" $GAS_COST_GWEI 2>/dev/null || echo "?") Gwei)${NC}"
echo -e "${RED} 📉 Net After Gas: ${NET_PROFIT} ETH${NC}"
fi
# Extract slippage/price impact
PRICE_IMPACT=$(echo "$line" | grep -oP 'priceImpact:[0-9.eE+-]+' | cut -d: -f2)
if [[ -n "$PRICE_IMPACT" ]]; then
# Convert to percentage (multiply by 100)
PRICE_IMPACT_PCT=$(echo "$PRICE_IMPACT * 100" | bc -l 2>/dev/null || echo "$PRICE_IMPACT")
echo -e "${YELLOW} 📊 Price Impact: $(printf "%.6f" $PRICE_IMPACT_PCT 2>/dev/null || echo "$PRICE_IMPACT")%${NC}"
fi
# Extract profit margin
PROFIT_MARGIN=$(echo "$line" | grep -oP 'profitMargin:-?[0-9.eE+-]+' | cut -d: -f2)
if [[ -n "$PROFIT_MARGIN" ]]; then
PROFIT_MARGIN_PCT=$(echo "$PROFIT_MARGIN * 100" | bc -l 2>/dev/null || echo "$PROFIT_MARGIN")
echo -e "${RED} 📊 Profit Margin: $(printf "%.6f" $PROFIT_MARGIN_PCT 2>/dev/null || echo "$PROFIT_MARGIN")%${NC}"
fi
# Extract confidence score
CONFIDENCE=$(echo "$line" | grep -oP 'confidence:[0-9.]+' | cut -d: -f2)
if [[ -n "$CONFIDENCE" ]]; then
CONFIDENCE_PCT=$(echo "$CONFIDENCE * 100" | bc -l 2>/dev/null || echo "$CONFIDENCE")
echo -e "${YELLOW} 🎯 Confidence: $(printf "%.1f" $CONFIDENCE_PCT 2>/dev/null || echo "$CONFIDENCE")%${NC}"
fi
# Extract reject reason (at the end for context)
if echo "$line" | grep -oP 'rejectReason:[^]]+' &>/dev/null; then
REASON=$(echo "$line" | grep -oP 'rejectReason:\K[^}]+' | head -c 200)
# Trim to just the meaningful part (remove trailing field names)
REASON=$(echo "$REASON" | sed 's/ token[0-9].*$//' | sed 's/ protocol.*$//' | sed 's/ poolAddress.*$//')
echo -e "${RED} ❌ Reason: $REASON${NC}"
fi
fi
echo ""
fi
# Detect execution attempts (NEW: Updated to match current log format)
if echo "$line" | grep -q "Executing arbitrage\|Transaction submitted\|Flash loan initiated\|🚀 EXECUTING ARBITRAGE\|Flash loan executed"; then
EXECUTIONS=$((EXECUTIONS + 1))
TIMESTAMP=$(echo "$line" | awk '{print $1, $2}')
if echo "$line" | grep -q "Flash loan\|⚡"; then
echo -e "${BLUE}[$TIMESTAMP] ⚡ FLASH LOAN/EXECUTION INITIATED #$EXECUTIONS${NC}"
elif echo "$line" | grep -q "Transaction submitted\|🚀"; then
TXHASH=$(echo "$line" | grep -oP '0x[a-fA-F0-9]{64}' | head -1)
echo -e "${GREEN}[$TIMESTAMP] 🚀 TRANSACTION SUBMITTED${NC}"
if [[ -n "$TXHASH" ]]; then
echo -e "${GREEN} 📝 TxHash: $TXHASH${NC}"
echo -e "${GREEN} 🔗 Arbiscan: https://arbiscan.io/tx/$TXHASH${NC}"
fi
else
echo -e "${BLUE}[$TIMESTAMP] ⚡ EXECUTING ARBITRAGE #$EXECUTIONS${NC}"
fi
echo ""
fi
# Detect confirmations (NEW: Updated to match current log format)
if echo "$line" | grep -q "Trade confirmed\|execution successful\|✅ Trade executed\|Successfully executed"; then
TIMESTAMP=$(echo "$line" | awk '{print $1, $2}')
echo -e "${GREEN}[$TIMESTAMP] ✅ TRADE CONFIRMED!${NC}"
# Extract profit if available
if echo "$line" | grep -oP 'Profit:.*ETH' &>/dev/null; then
PROFIT=$(echo "$line" | grep -oP 'Profit:.*ETH')
echo -e "${GREEN} 💰 $PROFIT${NC}"
fi
echo ""
fi
# Detect CRITICAL errors only (skip rate limits and batch fetch failures)
if echo "$line" | grep -qi "ERROR\|WARN" && ! echo "$line" | grep -qi "429 Too Many\|batch fetch.*failed\|Failed to fetch batch"; then
ERRORS=$((ERRORS + 1))
TIMESTAMP=$(echo "$line" | awk '{print $1, $2}')
# Categorize error type and show descriptive label
if echo "$line" | grep -qi "parsing.*failed\|PARSING FAILED"; then
PARSING_ERRORS=$((PARSING_ERRORS + 1))
echo -e "${RED}[$TIMESTAMP] ❌ PARSING ERROR #$PARSING_ERRORS${NC}"
elif echo "$line" | grep -qi "panic\|fatal\|crash"; then
echo -e "${RED}[$TIMESTAMP] 🔥 CRITICAL ERROR #$ERRORS${NC}"
elif echo "$line" | grep -qi "DNS\|name resolution\|lookup.*failed"; then
RPC_ERRORS=$((RPC_ERRORS + 1))
echo -e "${RED}[$TIMESTAMP] ❌ DNS/NETWORK ERROR #$RPC_ERRORS${NC}"
elif echo "$line" | grep -qi "connection.*closed\|connection refused\|dial tcp"; then
RPC_ERRORS=$((RPC_ERRORS + 1))
echo -e "${RED}[$TIMESTAMP] ❌ CONNECTION ERROR #$RPC_ERRORS${NC}"
elif echo "$line" | grep -qi "0x0000000000000000000000000000000000000000"; then
ZERO_ADDRESS_ERRORS=$((ZERO_ADDRESS_ERRORS + 1))
echo -e "${RED}[$TIMESTAMP] ❌ ZERO ADDRESS ERROR #$ZERO_ADDRESS_ERRORS${NC}"
else
echo -e "${RED}[$TIMESTAMP] ❌ ERROR #$ERRORS${NC}"
fi
# IMPROVED: Extract error message using multiple patterns (CRITICAL FIX: removed truncation)
# Try pattern 1: "error:" or "error="
ERROR_MSG=$(echo "$line" | grep -oP 'error[=:]\s*\K[^|]*' | head -c 300)
# Try pattern 2: Extract message after [ERROR] or [WARN] tag (CRITICAL FIX: increased limit to 300)
if [[ -z "$ERROR_MSG" ]]; then
ERROR_MSG=$(echo "$line" | sed -n 's/.*\[ERROR\]\s*//p' | sed -n 's/.*\[WARN\]\s*//p' | head -c 300)
fi
# Try pattern 3: Extract everything after timestamp and log level (CRITICAL FIX: increased limit to 300)
if [[ -z "$ERROR_MSG" ]]; then
# Format: "2025/11/02 20:19:03 [ERROR] message"
ERROR_MSG=$(echo "$line" | sed -E 's/^[0-9]{4}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} \[(ERROR|WARN)\] //' | head -c 300)
fi
# Display error message if extracted
if [[ -n "$ERROR_MSG" ]]; then
echo -e "${RED} ⚠️ $ERROR_MSG${NC}"
fi
echo ""
fi
# Show periodic stats every 20 opportunities (only when count changes)
if [ $((OPPORTUNITIES % 20)) -eq 0 ] && [ $OPPORTUNITIES -gt 0 ] && [ $OPPORTUNITIES -ne $LAST_STATS_DISPLAY ]; then
echo -e "${CYAN}────────────────────────────────────────────────────────────${NC}"
echo -e "${CYAN}📊 Stats:${NC}"
echo -e "${CYAN} Opportunities: $OPPORTUNITIES | Executable: $EXECUTABLE | Executions: $EXECUTIONS${NC}"
echo -e "${CYAN} Errors: $ERRORS (Parsing: $PARSING_ERRORS | RPC: $RPC_ERRORS | Zero Addr: $ZERO_ADDRESS_ERRORS)${NC}"
echo -e "${CYAN}────────────────────────────────────────────────────────────${NC}"
echo ""
LAST_STATS_DISPLAY=$OPPORTUNITIES # Update last display count
fi
done