harb/onchain/analysis/run-bglp-fee-test.sh

110 lines
3.8 KiB
Bash
Raw Normal View History

#!/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 ==="