173 lines
5.9 KiB
Bash
Executable file
173 lines
5.9 KiB
Bash
Executable file
#!/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
|