#!/bin/bash # Test Calculations Framework - Extract and validate arbitrage calculations from logs set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" TEST_DIR="$PROJECT_ROOT/tests/calculation-validation" LOG_FILE="${1:-/tmp/mev_full_logs.txt}" # Colors for output GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}═══════════════════════════════════════════════════════════════════════${NC}" echo -e "${BLUE} MEV Bot - Arbitrage Calculation Validation Framework${NC}" echo -e "${BLUE}═══════════════════════════════════════════════════════════════════════${NC}" echo "" # Create test directory mkdir -p "$TEST_DIR/extracted" mkdir -p "$TEST_DIR/reports" echo -e "${YELLOW}Step 1: Extracting arbitrage opportunities from logs...${NC}" # Check if log file exists if [ ! -f "$LOG_FILE" ]; then echo -e "${YELLOW}Log file not found at $LOG_FILE${NC}" echo -e "${YELLOW}Extracting from running container...${NC}" podman logs mev-bot-dev-master-dev 2>&1 > "$LOG_FILE" fi # Extract executable opportunities echo -e "${GREEN}Extracting executable opportunities...${NC}" grep "EXECUTABLE OPPORTUNITY" "$LOG_FILE" > "$TEST_DIR/extracted/executable_opportunities.log" || true EXEC_COUNT=$(wc -l < "$TEST_DIR/extracted/executable_opportunities.log" || echo "0") echo -e " ✓ Found $EXEC_COUNT executable opportunities" # Extract opportunity details echo -e "${GREEN}Extracting opportunity details...${NC}" grep "ARBITRAGE OPPORTUNITY DETECTED" "$LOG_FILE" -A 20 > "$TEST_DIR/extracted/opportunity_details.log" || true DETAIL_COUNT=$(grep -c "ARBITRAGE OPPORTUNITY DETECTED" "$TEST_DIR/extracted/opportunity_details.log" || echo "0") echo -e " ✓ Found $DETAIL_COUNT opportunity records" # Extract V3 swap calculations echo -e "${GREEN}Extracting V3 swap calculations...${NC}" grep "V3 calculation:" "$LOG_FILE" > "$TEST_DIR/extracted/v3_calculations.log" || true V3_COUNT=$(wc -l < "$TEST_DIR/extracted/v3_calculations.log" || echo "0") echo -e " ✓ Found $V3_COUNT V3 swap calculations" # Extract profit threshold checks echo -e "${GREEN}Extracting profit threshold checks...${NC}" grep "Profit threshold check:" "$LOG_FILE" > "$TEST_DIR/extracted/threshold_checks.log" || true THRESHOLD_COUNT=$(wc -l < "$TEST_DIR/extracted/threshold_checks.log" || echo "0") echo -e " ✓ Found $THRESHOLD_COUNT threshold validation checks" # Extract rejected opportunities echo -e "${GREEN}Extracting rejected opportunities...${NC}" grep "rejectReason:" "$LOG_FILE" | grep -v "rejectReason: " | grep -v "rejectReason:$" > "$TEST_DIR/extracted/rejections.log" || true REJECT_COUNT=$(wc -l < "$TEST_DIR/extracted/rejections.log" || echo "0") echo -e " ✓ Found $REJECT_COUNT rejections" echo "" echo -e "${YELLOW}Step 2: Generating summary report...${NC}" REPORT_FILE="$TEST_DIR/reports/validation_report_$(date +%Y%m%d_%H%M%S).md" cat > "$REPORT_FILE" <> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" head -10 "$TEST_DIR/extracted/executable_opportunities.log" >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" fi echo "## Profit Calculation Validation" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" if [ $THRESHOLD_COUNT -gt 0 ]; then echo "### Sample Threshold Checks (First 5)" >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" head -5 "$TEST_DIR/extracted/threshold_checks.log" >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" fi echo "## Rejection Analysis" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" if [ $REJECT_COUNT -gt 0 ]; then echo "### Rejection Reasons Breakdown" >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" grep -oP 'rejectReason:\K[^,}]+' "$TEST_DIR/extracted/rejections.log" | sort | uniq -c | sort -rn >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" fi echo "## V3 Calculation Samples" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" if [ $V3_COUNT -gt 0 ]; then echo "### Recent V3 Calculations (Last 10)" >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" tail -10 "$TEST_DIR/extracted/v3_calculations.log" >> "$REPORT_FILE" echo '```' >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" fi echo "---" >> "$REPORT_FILE" echo "**Report saved to:** $REPORT_FILE" >> "$REPORT_FILE" echo -e "${GREEN}✓ Report generated: $REPORT_FILE${NC}" echo "" echo -e "${YELLOW}Step 3: Analyzing calculation accuracy...${NC}" # Parse and validate calculations if [ $EXEC_COUNT -gt 0 ]; then echo -e "${GREEN}Validating executable opportunity calculations...${NC}" # Extract profit values grep -oP 'Profit=\K[0-9.]+' "$TEST_DIR/extracted/executable_opportunities.log" > "$TEST_DIR/extracted/profit_values.txt" || true # Calculate statistics if [ -f "$TEST_DIR/extracted/profit_values.txt" ] && [ -s "$TEST_DIR/extracted/profit_values.txt" ]; then TOTAL_PROFIT=$(awk '{sum+=$1} END {print sum}' "$TEST_DIR/extracted/profit_values.txt") AVG_PROFIT=$(awk '{sum+=$1} END {print sum/NR}' "$TEST_DIR/extracted/profit_values.txt") MAX_PROFIT=$(sort -n "$TEST_DIR/extracted/profit_values.txt" | tail -1) MIN_PROFIT=$(sort -n "$TEST_DIR/extracted/profit_values.txt" | head -1) echo -e " ${BLUE}Total Profit Detected:${NC} $TOTAL_PROFIT ETH" echo -e " ${BLUE}Average Profit:${NC} $AVG_PROFIT ETH" echo -e " ${BLUE}Max Profit:${NC} $MAX_PROFIT ETH" echo -e " ${BLUE}Min Profit:${NC} $MIN_PROFIT ETH" fi fi echo "" echo -e "${YELLOW}Step 4: Extracting test data for replay...${NC}" # Create JSON test data for replay TEST_DATA_FILE="$TEST_DIR/extracted/test_data.json" echo "{" > "$TEST_DATA_FILE" echo " \"timestamp\": \"$(date -Iseconds)\"," >> "$TEST_DATA_FILE" echo " \"executableOpportunities\": $EXEC_COUNT," >> "$TEST_DATA_FILE" echo " \"totalOpportunities\": $DETAIL_COUNT," >> "$TEST_DATA_FILE" echo " \"v3Calculations\": $V3_COUNT," >> "$TEST_DATA_FILE" echo " \"thresholdChecks\": $THRESHOLD_COUNT," >> "$TEST_DATA_FILE" echo " \"rejections\": $REJECT_COUNT," >> "$TEST_DATA_FILE" echo " \"logFile\": \"$LOG_FILE\"," >> "$TEST_DATA_FILE" echo " \"extractedFiles\": {" >> "$TEST_DATA_FILE" echo " \"executable\": \"$TEST_DIR/extracted/executable_opportunities.log\"," >> "$TEST_DATA_FILE" echo " \"details\": \"$TEST_DIR/extracted/opportunity_details.log\"," >> "$TEST_DATA_FILE" echo " \"v3Calcs\": \"$TEST_DIR/extracted/v3_calculations.log\"," >> "$TEST_DATA_FILE" echo " \"thresholds\": \"$TEST_DIR/extracted/threshold_checks.log\"," >> "$TEST_DATA_FILE" echo " \"rejections\": \"$TEST_DIR/extracted/rejections.log\"" >> "$TEST_DATA_FILE" echo " }" >> "$TEST_DATA_FILE" echo "}" >> "$TEST_DATA_FILE" echo -e "${GREEN}✓ Test data saved: $TEST_DATA_FILE${NC}" echo "" echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════${NC}" echo -e "${GREEN} Extraction Complete!${NC}" echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════${NC}" echo "" echo -e "${BLUE}Next Steps:${NC}" echo -e " 1. Review report: cat $REPORT_FILE" echo -e " 2. Run Go validation tests: go test ./tests/calculation-validation/..." echo -e " 3. Replay calculations: go run ./tests/calculation-validation/replay.go" echo "" echo -e "${YELLOW}Files Created:${NC}" echo -e " - Executable opportunities: $TEST_DIR/extracted/executable_opportunities.log" echo -e " - Opportunity details: $TEST_DIR/extracted/opportunity_details.log" echo -e " - V3 calculations: $TEST_DIR/extracted/v3_calculations.log" echo -e " - Threshold checks: $TEST_DIR/extracted/threshold_checks.log" echo -e " - Rejections: $TEST_DIR/extracted/rejections.log" echo -e " - Test data JSON: $TEST_DATA_FILE" echo -e " - Validation report: $REPORT_FILE" echo ""