111 lines
4.8 KiB
Markdown
111 lines
4.8 KiB
Markdown
# Phase 0 Knob Tuning Reference
|
||
|
||
Based on scorecard interpretation: which levers to pull first and what patterns confirm the right move. See [12-sim-scorecard.md](12-sim-scorecard.md) for gates.
|
||
|
||
---
|
||
|
||
## 1. Hub-only: capture too high (PMM-heavy)
|
||
|
||
**Signals:** `capture_mean` near 1; churn < 1; intervention mostly inject.
|
||
|
||
**First lever:** Raise **feeBps** (not k). USD default: **25 → 35–50 bps** on public-routing pools.
|
||
|
||
**Then if still high:** k 0.10 → 0.15.
|
||
|
||
**Success:** capture_mean toward 10–30%; churn similar or better; arb_volume_total and intervention_cost_total fall.
|
||
|
||
---
|
||
|
||
## 2. Full-quote: path concentration high + inject/withdraw by chain
|
||
|
||
**Signals:** Higher `path_concentration_index`; 56/137 show withdraw (mesh reflexivity).
|
||
|
||
**First lever:** **Topology / controls:** keep hub-only default; full-quote only where tolerable with `maxTradeSizeUnits` lower and/or `publicRoutingEnabled=false` on optional pools.
|
||
|
||
**Second:** Two-tier design: defense pool (tighter k, maybe no public routing) vs public_routing pool (looser k, higher fee). Deployment-status schema supports roles.
|
||
|
||
**Success:** path_concentration_index drops; drain_half_life improves; intervention more one-directional.
|
||
|
||
---
|
||
|
||
## 3. Bridge shock: peak deviation at circuit-break level
|
||
|
||
**Signals:** `peak_deviation_bps_*` ~1000+ bps (e.g. 1015).
|
||
|
||
**First lever:** **Inventory / depth:** increase `inventoryTargetUnits` on impacted chains by 1.5–2×; keep D₀ = 0.75–1.0 × I*.
|
||
|
||
**Second:** Bot speed: `BOT_MAX_FRACTION_OF_TARGET` 0.25 → 0.4 (e.g. shock-scenario override).
|
||
|
||
**Third:** Corridor: low-water 0.5 → **0.75**, high-water 1.5 → **1.25**.
|
||
|
||
**Success:** peak_deviation_bps_post_arb and _post_bot drop; intervention_cost rises but deviation stays under circuit-break.
|
||
|
||
---
|
||
|
||
## 4. “Capture high” vs background AMM
|
||
|
||
Background AMM is 5 bps + infinite depth. If PMM still dominates:
|
||
|
||
- **Option A:** Raise PMM feeBps (recommended first).
|
||
- **Option B:** Raise AMM fee to 20–30 bps if modeling Uni-style; keep 5 bps only if modeling Curve-style stable rails (then PMM should be defense, not venue → higher PMM fee/k).
|
||
|
||
---
|
||
|
||
## Quick checklist
|
||
|
||
| Issue | First move | Then |
|
||
|-------|------------|------|
|
||
| Hub capture too high | **Done:** default feeBps 35; chains 56/137 at 50 bps (sink chains); chain 1 at 35 | k 0.10 → 0.15 if needed |
|
||
| Full-quote concentration high | Disable/cap optional pools; hub-only default | Role split: defense vs public_routing |
|
||
| Shock peak deviation too high | Increase I* and D₀ on 1/56/137 | **Done:** corridor 0.75/1.25, speed 0.40 in script |
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## 5. Deviation probe fix (marginal vs average)
|
||
|
||
**Problem:** With a finite probe (e.g. 500), implied price was an *average* over that size; the PMM curve always shows a discount at finite size, so `peak_deviation_bps_*` stayed high and arb churned volume.
|
||
|
||
**Fix:** Use **analytical marginal** for implied price: at x=0 the derivative is (1−fee)·P, so `pHat = (1 − s.fee) * s.P`. This avoids the (1−k) bias from a finite sell probe (which gave ~−1014 bps for EUR with k=0.2). At equilibrium, deviation = −fee (e.g. −35 bps). `DELTA_ARB_BPS` is set to 40 so equilibrium doesn’t trigger arb.
|
||
|
||
**After fix:** peak_deviation_* ≈ fee (e.g. 35 bps); arb_volume_total and intervention drop; worst_pool_diagnostic is no longer dominated by EUR.
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## 6. Worst-pool diagnostic (scorecard)
|
||
|
||
When `peak_deviation_bps_pre_arb ≈ post_arb ≈ post_bot`, the **worst** pool may be rotating or not moving. The scorecard now includes (last epoch):
|
||
|
||
- `worst_pool_diagnostic`: `{ pre_arb, post_arb, post_bot }`, each `{ key, deviation_bps, I_T_ratio, D_effective }`.
|
||
|
||
**Interpretation:**
|
||
|
||
- Same pool worst all three phases + **low I_T_ratio** → depth problem (raise I*/D₀ or tighten corridor).
|
||
- Same pool + **I_T_ratio ≈ 1** → curve/fee or routing pressure (raise feeBps / k).
|
||
- Rotating worst pool → routing re-creating deviation; fee/k/controls to reduce demand.
|
||
|
||
**Diagnostic now includes `oracle_P` and `p_hat`:** If you see `p_hat ≈ 1.10` and `oracle_P = 1.00` for EUR pools, the bug is EUR reference price (see §7).
|
||
|
||
---
|
||
|
||
## 7. EUR oracle reference (P for cWEUR* vs USDC)
|
||
|
||
**Problem:** EUR pools (cWEURC, cWEURT) were using P = 1 (USD) so deviation looked ~8–12% (800–1200 bps) even at target inventory.
|
||
|
||
**Fix:** Oracle P in “quote per base” (USDC per cWEUR*):
|
||
|
||
- **USD-pegged:** P = 1.0.
|
||
- **EUR-pegged vs USDC:** P = **EURUSD** (e.g. 1.10).
|
||
|
||
**Config:** `simulation-params.json` → `eurUsd`: 1.10 (USDC per 1 EUR). If missing, `eurPegMultiplier` is used; if that is 1.0, fallback 1.1 so EUR isn’t treated as USD. Optional later: `scenario.oracleModel.eurUsd` to override per run.
|
||
|
||
**After fix:** EUR pools drop out of worst_pool_diagnostic; peak_deviation_bps falls; arb volume and intervention reflect true routing pressure.
|
||
|
||
---
|
||
|
||
*Last updated from Phase 0 scorecard interpretation.*
|
||
|