#!/bin/bash # Generate comprehensive test report from 24-hour run set -e LOG_DIR="logs/24h_test" LATEST_LOG=$(ls -t ${LOG_DIR}/test_*.log 2>/dev/null | head -1) if [ -z "${LATEST_LOG}" ]; then echo "❌ No log file found" exit 1 fi REPORT_FILE="${LOG_DIR}/report_$(date +%Y%m%d_%H%M%S).md" echo "📊 Generating test report from: ${LATEST_LOG}" echo " Output: ${REPORT_FILE}" cat > "${REPORT_FILE}" << EOF # MEV Bot 24-Hour Validation Test Report ## Generated: $(date) --- ## Test Configuration **Log File:** ${LATEST_LOG} **Test Duration:** $(stat -c %y "${LATEST_LOG}" 2>/dev/null || stat -f %Sm "${LATEST_LOG}" 2>/dev/null) - $(date) **Binary:** bin/mev-bot ($(ls -lh bin/mev-bot | awk '{print $5}')) --- ## Performance Statistics ### Block Processing EOF # Block stats TOTAL_BLOCKS=$(grep -c "Processing.*transactions" "${LATEST_LOG}" 2>/dev/null || echo "0") echo "- **Total Blocks Processed:** ${TOTAL_BLOCKS}" >> "${REPORT_FILE}" # DEX transaction stats TOTAL_DEX=$(grep -c "DEX Transaction detected" "${LATEST_LOG}" 2>/dev/null || echo "0") echo "- **DEX Transactions:** ${TOTAL_DEX}" >> "${REPORT_FILE}" # Calculate rate if [ "${TOTAL_BLOCKS}" -gt "0" ]; then DEX_RATE=$(awk "BEGIN {printf \"%.2f\", (${TOTAL_DEX} / ${TOTAL_BLOCKS}) * 100}") echo "- **DEX Transaction Rate:** ${DEX_RATE}%" >> "${REPORT_FILE}" fi cat >> "${REPORT_FILE}" << EOF ### Arbitrage Opportunities EOF # Opportunity stats TOTAL_OPPS=$(grep -c "ARBITRAGE OPPORTUNITY" "${LATEST_LOG}" 2>/dev/null || echo "0") PROFITABLE=$(grep "ARBITRAGE OPPORTUNITY" "${LATEST_LOG}" 2>/dev/null | grep -c "isExecutable:true" || echo "0") REJECTED=$(grep "ARBITRAGE OPPORTUNITY" "${LATEST_LOG}" 2>/dev/null | grep -c "isExecutable:false" || echo "0") echo "- **Total Opportunities Detected:** ${TOTAL_OPPS}" >> "${REPORT_FILE}" echo "- **Profitable (Executable):** ${PROFITABLE}" >> "${REPORT_FILE}" echo "- **Rejected (Unprofitable):** ${REJECTED}" >> "${REPORT_FILE}" if [ "${TOTAL_OPPS}" -gt "0" ]; then SUCCESS_RATE=$(awk "BEGIN {printf \"%.2f\", (${PROFITABLE} / ${TOTAL_OPPS}) * 100}") echo "- **Success Rate:** ${SUCCESS_RATE}%" >> "${REPORT_FILE}" fi cat >> "${REPORT_FILE}" << EOF ### Cache Performance EOF # Cache stats CACHE_LOGS=$(grep "Reserve cache metrics" "${LATEST_LOG}" 2>/dev/null | tail -1) if [ -n "${CACHE_LOGS}" ]; then echo "\`\`\`" >> "${REPORT_FILE}" echo "${CACHE_LOGS}" >> "${REPORT_FILE}" echo "\`\`\`" >> "${REPORT_FILE}" else echo "- **Status:** No cache metrics logged (multihop scanner not triggered)" >> "${REPORT_FILE}" fi cat >> "${REPORT_FILE}" << EOF ### Error Analysis EOF # Error stats TOTAL_ERRORS=$(grep -c "\[ERROR\]" "${LATEST_LOG}" 2>/dev/null || echo "0") TOTAL_WARNS=$(grep -c "\[WARN\]" "${LATEST_LOG}" 2>/dev/null || echo "0") echo "- **Total Errors:** ${TOTAL_ERRORS}" >> "${REPORT_FILE}" echo "- **Total Warnings:** ${TOTAL_WARNS}" >> "${REPORT_FILE}" if [ "${TOTAL_ERRORS}" -gt "0" ]; then echo "" >> "${REPORT_FILE}" echo "**Recent Errors:**" >> "${REPORT_FILE}" echo "\`\`\`" >> "${REPORT_FILE}" grep "\[ERROR\]" "${LATEST_LOG}" 2>/dev/null | tail -10 >> "${REPORT_FILE}" echo "\`\`\`" >> "${REPORT_FILE}" fi cat >> "${REPORT_FILE}" << EOF --- ## Top Opportunities EOF # Extract top opportunities by profit echo "### Most Profitable Opportunities (Top 10)" >> "${REPORT_FILE}" echo "" >> "${REPORT_FILE}" grep "ARBITRAGE OPPORTUNITY" "${LATEST_LOG}" 2>/dev/null | \ grep -o 'netProfitETH:[^ ]*' | \ sort -t: -k2 -rn | \ head -10 | \ nl | \ sed 's/^/- /' >> "${REPORT_FILE}" || echo "- No opportunities found" >> "${REPORT_FILE}" cat >> "${REPORT_FILE}" << EOF --- ## Protocol Distribution EOF # Protocol breakdown echo "### Transactions by Protocol" >> "${REPORT_FILE}" echo "" >> "${REPORT_FILE}" grep "protocol:" "${LATEST_LOG}" 2>/dev/null | \ grep -o 'protocol:[A-Za-z0-9_]*' | \ sort | uniq -c | sort -rn | \ awk '{printf "- **%s:** %d transactions\n", $2, $1}' >> "${REPORT_FILE}" || \ echo "- No protocol data available" >> "${REPORT_FILE}" cat >> "${REPORT_FILE}" << EOF --- ## System Stability ### Uptime EOF # Check if still running PID_FILE="${LOG_DIR}/mev-bot.pid" if [ -f "${PID_FILE}" ]; then PID=$(cat "${PID_FILE}") if ps -p "${PID}" > /dev/null 2>&1; then UPTIME=$(ps -o etime= -p "${PID}" | tr -d ' ') echo "- **Status:** ✅ Running" >> "${REPORT_FILE}" echo "- **Uptime:** ${UPTIME}" >> "${REPORT_FILE}" else echo "- **Status:** ❌ Not Running" >> "${REPORT_FILE}" fi else echo "- **Status:** ⚠️ Unknown (PID file not found)" >> "${REPORT_FILE}" fi ### Crashes CRASHES=$(grep -c "panic\|fatal" "${LATEST_LOG}" 2>/dev/null || echo "0") echo "- **Crashes:** ${CRASHES}" >> "${REPORT_FILE}" cat >> "${REPORT_FILE}" << EOF --- ## Profit Calculation Validation ### Calculation Accuracy EOF # Check for overflows OVERFLOWS=$(grep "ROI:" "${LATEST_LOG}" 2>/dev/null | \ awk -F'ROI:' '{print $2}' | \ awk '{if ($1 > 1000000) print $0}' | \ wc -l) echo "- **Overflow Errors:** ${OVERFLOWS}" >> "${REPORT_FILE}" if [ "${OVERFLOWS}" -eq "0" ]; then echo "- **Status:** ✅ No calculation overflows detected" >> "${REPORT_FILE}" else echo "- **Status:** ⚠️ Calculation issues detected" >> "${REPORT_FILE}" fi cat >> "${REPORT_FILE}" << EOF ### Gas Cost Calculations EOF # Sample gas costs echo "\`\`\`" >> "${REPORT_FILE}" grep "gasCostETH:" "${LATEST_LOG}" 2>/dev/null | head -5 >> "${REPORT_FILE}" || echo "No gas cost data" >> "${REPORT_FILE}" echo "\`\`\`" >> "${REPORT_FILE}" cat >> "${REPORT_FILE}" << EOF --- ## Recommendations EOF # Generate recommendations if [ "${PROFITABLE}" -gt "0" ]; then echo "✅ **PROFIT READY** - Detected ${PROFITABLE} profitable opportunities" >> "${REPORT_FILE}" echo "" >> "${REPORT_FILE}" echo "**Next Steps:**" >> "${REPORT_FILE}" echo "1. Review profitable opportunities for execution" >> "${REPORT_FILE}" echo "2. Implement execution path with flash loans" >> "${REPORT_FILE}" echo "3. Test execution on fork/testnet" >> "${REPORT_FILE}" elif [ "${TOTAL_OPPS}" -gt "0" ]; then echo "⏳ **DETECTION WORKING** - Found ${TOTAL_OPPS} opportunities, all rejected as unprofitable" >> "${REPORT_FILE}" echo "" >> "${REPORT_FILE}" echo "**Next Steps:**" >> "${REPORT_FILE}" echo "1. Continue monitoring during high volatility periods" >> "${REPORT_FILE}" echo "2. Consider lowering profit thresholds (currently rejecting small profits)" >> "${REPORT_FILE}" echo "3. Verify gas cost calculations are accurate" >> "${REPORT_FILE}" else echo "⚠️ **NO OPPORTUNITIES** - No arbitrage opportunities detected" >> "${REPORT_FILE}" echo "" >> "${REPORT_FILE}" echo "**Possible Reasons:**" >> "${REPORT_FILE}" echo "1. Low market volatility during test period" >> "${REPORT_FILE}" echo "2. Efficient markets (arbitrage opportunities filled quickly)" >> "${REPORT_FILE}" echo "3. Detection parameters need tuning" >> "${REPORT_FILE}" fi if [ "${TOTAL_ERRORS}" -gt "50" ]; then echo "" >> "${REPORT_FILE}" echo "⚠️ **HIGH ERROR RATE** - ${TOTAL_ERRORS} errors logged" >> "${REPORT_FILE}" echo "Review error logs and fix issues before production deployment" >> "${REPORT_FILE}" fi if [ -z "${CACHE_LOGS}" ]; then echo "" >> "${REPORT_FILE}" echo "📊 **CACHE NOT VALIDATED** - Multihop scanner not triggered during test" >> "${REPORT_FILE}" echo "Cache performance metrics unavailable - consider extending test duration" >> "${REPORT_FILE}" fi cat >> "${REPORT_FILE}" << EOF --- ## Raw Data **Log File:** \`${LATEST_LOG}\` **Report Generated:** $(date) --- *This report was automatically generated by the MEV bot test harness* EOF echo "✅ Report generated: ${REPORT_FILE}" echo "" echo "📊 Summary:" echo " Blocks: ${TOTAL_BLOCKS}" echo " DEX Txs: ${TOTAL_DEX}" echo " Opportunities: ${TOTAL_OPPS} (${PROFITABLE} profitable)" echo " Errors: ${TOTAL_ERRORS}" echo "" cat "${REPORT_FILE}"