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>
201 lines
8.7 KiB
Bash
Executable File
201 lines
8.7 KiB
Bash
Executable File
#!/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" <<EOF
|
|
# Arbitrage Calculation Validation Report
|
|
**Generated:** $(date)
|
|
**Log File:** $LOG_FILE
|
|
|
|
## Summary Statistics
|
|
|
|
- **Executable Opportunities:** $EXEC_COUNT
|
|
- **Total Opportunity Records:** $DETAIL_COUNT
|
|
- **V3 Calculations:** $V3_COUNT
|
|
- **Threshold Checks:** $THRESHOLD_COUNT
|
|
- **Rejections:** $REJECT_COUNT
|
|
|
|
## Executable Opportunities Analysis
|
|
|
|
EOF
|
|
|
|
if [ $EXEC_COUNT -gt 0 ]; then
|
|
echo "### Top 10 Executable Opportunities" >> "$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 ""
|