harb/onchain/analysis/run-improved-fuzzing.sh
johba 8b537302d8 feat: Add staking functionality to fuzzing analysis with snatching
- Integrate staking and exitPosition actions into fuzzing scenarios
- Add staking metrics (percentageStaked, avgTaxRate) to CSV output
- Implement snatching mechanism when stake pool reaches capacity
- Add configurable staking parameters (enable/disable, buy bias, staking bias)
- Support configurable number of trades per run
- Simplify to single trader account with proportional ETH funding
- Configure tax rates: 0-15 for initial stakes, 28 for snatching
- Clean up debug logging and verbose output

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-19 18:29:20 +02:00

162 lines
No EOL
4.8 KiB
Bash
Executable file

#!/bin/bash
# Usage: ./run-improved-fuzzing.sh [optimizer] [runs=N] [staking=on|off] [buybias=N] [trades=N] [stakingbias=N]
# Examples:
# ./run-improved-fuzzing.sh BullMarketOptimizer runs=50
# ./run-improved-fuzzing.sh WhaleOptimizer runs=20 staking=off
# ./run-improved-fuzzing.sh BullMarketOptimizer runs=200 staking=on buybias=100 trades=30 stakingbias=95
# 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
OPTIMIZER=${1:-BullMarketOptimizer}
RUNS=${2:-runs=20}
STAKING=${3:-staking=on}
BUYBIAS=${4:-buybias=50}
TRADES=${5:-trades=15}
STAKINGBIAS=${6:-stakingbias=80}
# Parse runs parameter
if [[ $RUNS == runs=* ]]; then
RUNS_VALUE=${RUNS#runs=}
else
RUNS_VALUE=$RUNS
fi
# Parse staking parameter
STAKING_ENABLED="true"
if [[ $STAKING == staking=* ]]; then
STAKING_VALUE=${STAKING#staking=}
if [[ $STAKING_VALUE == "off" ]] || [[ $STAKING_VALUE == "false" ]] || [[ $STAKING_VALUE == "0" ]]; then
STAKING_ENABLED="false"
fi
fi
# Parse buy bias parameter
BUYBIAS_VALUE="50"
if [[ $BUYBIAS == buybias=* ]]; then
BUYBIAS_VALUE=${BUYBIAS#buybias=}
fi
# Parse trades parameter
TRADES_VALUE="15"
if [[ $TRADES == trades=* ]]; then
TRADES_VALUE=${TRADES#trades=}
fi
# Parse staking bias parameter
STAKINGBIAS_VALUE="80"
if [[ $STAKINGBIAS == stakingbias=* ]]; then
STAKINGBIAS_VALUE=${STAKINGBIAS#stakingbias=}
fi
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR="fuzzing_results_improved_${OPTIMIZER}_${TIMESTAMP}"
echo -e "${GREEN}=== Improved 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 "Output directory: $OUTPUT_DIR"
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
# Create output directory
mkdir -p $OUTPUT_DIR
# Run the improved fuzzing with buy bias
echo -e "${YELLOW}Starting improved fuzzing analysis with buy bias...${NC}"
echo ""
FUZZING_RUNS=$RUNS_VALUE \
OPTIMIZER_CLASS=$OPTIMIZER \
ENABLE_STAKING=$STAKING_ENABLED \
BUY_BIAS=$BUYBIAS_VALUE \
TRADES_PER_RUN=$TRADES_VALUE \
STAKING_BIAS=$STAKINGBIAS_VALUE \
TRACK_POSITIONS=true \
forge script analysis/ImprovedFuzzingAnalysis.s.sol:ImprovedFuzzingAnalysis --gas-limit 100000000 -vv 2>&1 | tee $OUTPUT_DIR/fuzzing.log
# Extract key metrics
echo ""
echo -e "${GREEN}=== ANALYSIS COMPLETE ===${NC}"
# Show summary from log
tail -20 $OUTPUT_DIR/fuzzing.log | grep -E "Total scenarios|Profitable|Discovery|Stakes|Snatches" || true
# Check for position CSVs
POSITION_CSV_COUNT=$(ls -1 improved_positions_*.csv 2>/dev/null | wc -l)
if [ $POSITION_CSV_COUNT -gt 0 ]; then
# Move position CSVs to output directory
mv improved_positions_*.csv $OUTPUT_DIR/
echo ""
echo -e "${GREEN}Position CSVs saved to: $OUTPUT_DIR/${NC}"
# Calculate max staking percentage
echo ""
echo -e "${YELLOW}=== Maximum Staking Level ===${NC}"
for f in $OUTPUT_DIR/improved_positions_*.csv; do
tail -1 "$f" | cut -d',' -f13
done | sort -n | tail -1 | awk '{
pct = $1/1e16
printf "%.2f%% of authorized stake (%.2f%% of KRAIKEN supply)\n", pct, pct*0.2
}'
fi
# Check for snatching activity
echo ""
echo -e "${YELLOW}=== Snatching Activity ===${NC}"
SNATCH_COUNT=$(grep -c "SNATCHED" $OUTPUT_DIR/fuzzing.log 2>/dev/null || true)
if [ -z "$SNATCH_COUNT" ]; then
SNATCH_COUNT="0"
fi
if [ "$SNATCH_COUNT" -gt "0" ]; then
echo -e "${GREEN}Snatching observed! Found $SNATCH_COUNT snatching events${NC}"
grep "SNATCHED" $OUTPUT_DIR/fuzzing.log | head -5
else
echo "No snatching observed in this run"
fi
# Check for profitable scenarios
PROFITABLE_COUNT=$(grep -c "PROFITABLE!" $OUTPUT_DIR/fuzzing.log 2>/dev/null || true)
if [ -z "$PROFITABLE_COUNT" ]; then
PROFITABLE_COUNT="0"
fi
if [ "$PROFITABLE_COUNT" -gt "0" ]; then
echo ""
echo -e "${GREEN}=== PROFITABLE SCENARIOS FOUND ===${NC}"
echo "Found $PROFITABLE_COUNT profitable scenarios"
grep "PROFITABLE!" $OUTPUT_DIR/fuzzing.log | head -5
fi
echo ""
echo -e "${GREEN}Full results saved to: $OUTPUT_DIR/${NC}"
echo ""
echo "To view detailed logs:"
echo " cat $OUTPUT_DIR/fuzzing.log"
echo ""
echo "To visualize position movements (if CSVs generated):"
echo " ./analysis/view-scenarios.sh $OUTPUT_DIR"