harb/onchain/analysis/run-bglp-fee-test.sh
openhands b7260b2eaf chore: analysis tooling, research artifacts, and code quality
- Analysis: parameter sweep scripts, adversarial testing, 2D frontier maps
- Research: KRAIKEN_RESEARCH_REPORT, SECURITY_REVIEW, STORAGE_LAYOUT
- FuzzingBase: consolidated fuzzing helper, BackgroundLP simulation
- Sweep results: CSV data for full 4D sweep (1050 combos), bull-bear,
  AS sweep, VWAP fix validation
- Code quality: .gitignore for fuzz CSVs, gas snapshot, updated docs
- Remove dead analysis helpers (CSVHelper, CSVManager, ScenarioRecorder)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 18:22:03 +00:00

109 lines
3.8 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -uo pipefail
# Test safe configs WITH background LP competition to see realistic fee capture
# Johann's question: does competing LP eat all fees at wide AW?
cd "$(dirname "$0")/.."
FORGE=~/.foundry/bin/forge
echo "=== Fee Revenue with Background LP Competition ==="
echo "BG LP: 40 ETH/layer × 5 layers = 200 ETH competing liquidity"
echo "Attack pattern: buybias=10 (90% sells), 2000 trades"
echo ""
printf "%-8s %-6s %-8s %-6s %-12s %-12s %-10s\n" "AS%" "AW" "ticks" "safe" "WETH_fees" "KRK_fees" "avg_PnL"
run_config() {
local as_pct=$1 aw=$2 runs=${3:-5}
local as_val=$(python3 -c "print(int($as_pct * 1e16))")
local total=0 profitable=0 sum_pnl=0 sum_weth=0 sum_krk=0
for i in $(seq 1 $runs); do
local seed=$RANDOM$RANDOM$RANDOM
local output=$(CI_VALUE=0 \
AS_VALUE=$as_val \
AW_VALUE=$aw \
DD_VALUE=500000000000000000 \
BATCH_SEED=$seed \
OPTIMIZER_CLASS=ConfigurableOptimizer \
UNCAPPED_SWAPS=true \
FUZZING_RUNS=1 \
BUY_BIAS=10 \
TRADES_PER_RUN=2000 \
BG_LP_ETH_PER_LAYER=40000000000000000000 \
$FORGE script analysis/StreamlinedFuzzing.s.sol:StreamlinedFuzzing \
--skip-simulation --gas-estimate-multiplier 300 -vv 2>&1)
local csv_prefix=$(echo "$output" | grep "prefix:" | sed 's/.*prefix: //')
local csv_file="analysis/fuzz-${csv_prefix}-000.csv"
if [ -f "$csv_file" ]; then
local init_eth=$(head -2 "$csv_file" | tail -1 | cut -d',' -f13)
local final_eth=$(tail -1 "$csv_file" | cut -d',' -f13)
local weth_fees=$(tail -1 "$csv_file" | cut -d',' -f19)
local krk_fees=$(tail -1 "$csv_file" | cut -d',' -f20)
if [ -n "$init_eth" ] && [ -n "$final_eth" ]; then
local result=$(python3 -c "
init=$init_eth; final=$final_eth
weth=${weth_fees:-0}; krk=${krk_fees:-0}
pnl = (final - init) / 1e18
weth_e = weth / 1e18
krk_i = int(krk / 1e18)
prof = 1 if pnl > 0 else 0
print(f'{prof} {pnl:.1f} {weth_e:.1f} {krk_i}')
" 2>/dev/null || echo "0 0.0 0.0 0")
local is_prof=$(echo "$result" | cut -d' ' -f1)
local pnl=$(echo "$result" | cut -d' ' -f2)
local weth=$(echo "$result" | cut -d' ' -f3)
local krk=$(echo "$result" | cut -d' ' -f4)
profitable=$((profitable + is_prof))
sum_pnl=$(python3 -c "print(round($sum_pnl + $pnl, 1))")
sum_weth=$(python3 -c "print(round($sum_weth + $weth, 1))")
sum_krk=$((sum_krk + krk))
fi
rm -f "$csv_file"
fi
total=$((total + 1))
done
local avg_pnl=$(python3 -c "print(round($sum_pnl / $total, 1))")
local avg_weth=$(python3 -c "print(round($sum_weth / $total, 1))")
local avg_krk=$((sum_krk / total))
local safe_str="✅ 0/$total"
if [ "$profitable" -gt 0 ]; then
safe_str="$profitable/$total"
fi
# Calculate tick spacing for display
local ticks=$(python3 -c "print(200 + 34 * 20 * $aw // 100)")
printf "%-8s %-6s %-8s %-6s %-12s %-12s %-10s\n" \
"${as_pct}%" "$aw" "${ticks}t" "$safe_str" "${avg_weth}W" "${avg_krk}K" "${avg_pnl}"
}
# Safe configs from 2D frontier (AW ≤ 100)
echo "--- Frontier safe configs (no BG LP previously) ---"
run_config 30 100 5
run_config 35 100 5
run_config 10 100 5
# New extended configs (AW > 100) that were safe
echo ""
echo "--- Extended AW configs (safe from recent sweep) ---"
run_config 50 150 5
run_config 50 200 5
run_config 70 200 5
# Comparison: bull config
echo ""
echo "--- Bull config for reference ---"
run_config 100 20 5
echo ""
echo "=== Done ==="