#!/bin/bash # Usage: ./run-fuzzing.sh [optimizer] [key=value ...] [debugCSV] # Examples: # ./run-fuzzing.sh BullMarketOptimizer runs=50 # ./run-fuzzing.sh WhaleOptimizer runs=20 staking=off # ./run-fuzzing.sh BullMarketOptimizer runs=10 trades=30 buybias=80 uncapped=true # ./run-fuzzing.sh BullMarketOptimizer runs=10 trades=30 minbuy=30 maxbuy=70 # ./run-fuzzing.sh BullMarketOptimizer debugCSV # Opens HTML visualizer after generating CSVs # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color BOLD='\033[1m' # Configuration defaults OPTIMIZER=${1:-BullMarketOptimizer} RUNS_VALUE=20 STAKING_ENABLED="true" BUYBIAS_VALUE="50" TRADES_VALUE="15" STAKINGBIAS_VALUE="80" UNCAPPED_VALUE="true" MINBUY_VALUE="20" MAXBUY_VALUE="80" DEBUG_CSV=false # Parse arguments (skip first which is optimizer) shift for arg in "$@"; do case "$arg" in debugCSV) DEBUG_CSV=true RUNS_VALUE=3 TRADES_VALUE=5 ;; runs=*) RUNS_VALUE=${arg#runs=} ;; staking=off|staking=false|staking=0) STAKING_ENABLED="false" ;; staking=*) STAKING_ENABLED="true" ;; buybias=*) BUYBIAS_VALUE=${arg#buybias=} ;; trades=*) TRADES_VALUE=${arg#trades=} ;; stakingbias=*) STAKINGBIAS_VALUE=${arg#stakingbias=} ;; uncapped=*) UNCAPPED_VALUE=${arg#uncapped=} ;; minbuy=*) MINBUY_VALUE=${arg#minbuy=} ;; maxbuy=*) MAXBUY_VALUE=${arg#maxbuy=} ;; esac done echo -e "${GREEN}=== Fuzzing Analysis ===${NC}" echo "Optimizer: $OPTIMIZER" echo "Total runs: $RUNS_VALUE" echo "Trades per run: $TRADES_VALUE" echo "Staking: $([ "$STAKING_ENABLED" = "true" ] && echo "enabled" || echo "disabled")" if [ "$STAKING_ENABLED" = "true" ]; then echo "Staking bias: $STAKINGBIAS_VALUE%" fi echo "Buy bias: $BUYBIAS_VALUE%" echo "Uncapped swaps: $UNCAPPED_VALUE" echo "Buy range: ${MINBUY_VALUE}-${MAXBUY_VALUE} ETH" echo "" # Validate optimizer case $OPTIMIZER in BullMarketOptimizer|BearMarketOptimizer|NeutralMarketOptimizer|WhaleOptimizer|ExtremeOptimizer|MaliciousOptimizer) echo "Optimizer validation passed" ;; *) echo -e "${RED}Error: Invalid optimizer class${NC}" echo "Valid options: BullMarketOptimizer, BearMarketOptimizer, NeutralMarketOptimizer, WhaleOptimizer, ExtremeOptimizer, MaliciousOptimizer" exit 1 ;; esac # Run the streamlined fuzzing analysis echo -e "${YELLOW}Starting fuzzing analysis...${NC}" echo "" # Record existing CSV files in analysis folder before running EXISTING_CSVS=$(ls -1 analysis/fuzz-????-???.csv 2>/dev/null | sort) FUZZING_RUNS=$RUNS_VALUE \ OPTIMIZER_CLASS=$OPTIMIZER \ ENABLE_STAKING=$STAKING_ENABLED \ BUY_BIAS=$BUYBIAS_VALUE \ TRADES_PER_RUN=$TRADES_VALUE \ STAKING_BIAS=$STAKINGBIAS_VALUE \ UNCAPPED_SWAPS=$UNCAPPED_VALUE \ MIN_BUY_ETH=$MINBUY_VALUE \ MAX_BUY_ETH=$MAXBUY_VALUE \ forge script analysis/StreamlinedFuzzing.s.sol:StreamlinedFuzzing --skip-simulation --gas-estimate-multiplier 300 -vv 2>&1 # Analysis complete echo "" echo -e "${GREEN}=== ANALYSIS COMPLETE ===${NC}" # Find newly generated CSV files in analysis folder NEW_CSVS=$(ls -1 analysis/fuzz-????-???.csv 2>/dev/null | sort) # Get the scenario code from the first new file if [ "$EXISTING_CSVS" != "$NEW_CSVS" ]; then SCENARIO_CODE=$(echo "$NEW_CSVS" | grep -v -F "$EXISTING_CSVS" | head -1 | sed 's/.*fuzz-\(....\).*/\1/') else SCENARIO_CODE="UNKN" fi # Count generated CSV files for this run CSV_COUNT=$(ls -1 analysis/fuzz-${SCENARIO_CODE}-*.csv 2>/dev/null | wc -l) echo "Generated $CSV_COUNT CSV files with scenario ID: ${SCENARIO_CODE}" # Check for profitable scenarios echo "" echo -e "${YELLOW}=== Checking for Profitable Scenarios ===${NC}" PROFITABLE_COUNT=0 for csv in analysis/fuzz-${SCENARIO_CODE}-*.csv; do if [ -f "$csv" ]; then # Get INIT and FINAL rows INIT_ETH=$(grep "^INIT," "$csv" | cut -d',' -f13) FINAL_ETH=$(grep "^FINAL," "$csv" | cut -d',' -f13) if [ ! -z "$INIT_ETH" ] && [ ! -z "$FINAL_ETH" ]; then if [ "$FINAL_ETH" -gt "$INIT_ETH" ] 2>/dev/null; then PROFIT_PCT=$(echo "scale=1; ($FINAL_ETH - $INIT_ETH) * 100 / $INIT_ETH" | bc -l 2>/dev/null || echo "0") echo -e "${GREEN} $csv: PROFITABLE (+${PROFIT_PCT}%)${NC}" ((PROFITABLE_COUNT++)) fi fi fi done if [ $PROFITABLE_COUNT -eq 0 ]; then echo " No profitable scenarios found" else echo -e "${GREEN}Found $PROFITABLE_COUNT profitable scenarios${NC}" fi echo "" echo -e "${GREEN}CSV files generated with scenario ID: ${SCENARIO_CODE}${NC}" # Launch HTML visualizer if debugCSV mode if [ "$DEBUG_CSV" = true ]; then echo "" echo -e "${YELLOW}Launching HTML visualizer...${NC}" # Check if Python3 is available if command -v python3 &> /dev/null; then echo "Starting local server from analysis folder at http://localhost:8000" echo "Open http://localhost:8000/run-visualizer.html to view results" # Start server from analysis directory so CSV files are directly accessible cd analysis python3 -m http.server 8000 --bind 127.0.0.1 & SERVER_PID=$! # Try to open browser (cross-platform) sleep 1 if command -v open &> /dev/null; then open "http://localhost:8000/run-visualizer.html" elif command -v xdg-open &> /dev/null; then xdg-open "http://localhost:8000/run-visualizer.html" elif command -v wslview &> /dev/null; then wslview "http://localhost:8000/run-visualizer.html" fi echo "" echo "Press Ctrl+C to stop the server" wait $SERVER_PID else echo "Python3 not found. To view results:" echo " cd analysis && python3 -m http.server 8000" echo " Then open http://localhost:8000/run-visualizer.html in your browser" fi fi