live: l'equity del book e' il TOTALE cross-collateral — USDE valutato all'indice pubblico
Trovato eseguendo il test di eligibilita' USDE ($500 convertiti alle 13:04Z, fill 1.0003 fee 0): shadow._equity leggeva solo il conto USDC -> il giro successivo avrebbe visto -24,3%, mandato un falso "USCITA DI FONDI" e venduto ~$140 di posizioni. Riparato prima del giro delle 13:47: _collaterale_usde() valuta l'USDE all'indice pubblico usde_usdc (mediana multi-exchange, lezione Binance 10/10/2025), depeg passa nel sizing, clamp a 1.0 sopra la pari, fallback 1.0 dichiarato (mai 0: il fallback si sceglie sul danno, P5). 6 test nuovi in tests/test_shadow_usde.py. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B9UyJLHzR7EJzxR3iQ3RN1
This commit is contained in:
@@ -88,12 +88,53 @@ def _positions(client):
|
||||
return pos, note, err
|
||||
|
||||
|
||||
USDE_INDEX_URL = "https://www.deribit.com/api/v2/public/get_index_price?index_name=usde_usdc"
|
||||
|
||||
|
||||
def _collaterale_usde(client) -> tuple[float, str]:
|
||||
"""Valore USD dell'USDE tenuto come collaterale (test di eligibilita' 2026-08-26).
|
||||
|
||||
PERCHE' ESISTE. `_equity` leggeva SOLO il conto USDC: convertire $500 in USDE ha fatto
|
||||
sparire il 24% dell'equity dalla vista del book — falso 'USCITA DI FONDI' e vendite
|
||||
indesiderate al giro successivo. L'equity del conto e' il TOTALE cross-collateral.
|
||||
|
||||
IL PREZZO viene dall'indice pubblico `usde_usdc` (mediana multi-exchange con clamp
|
||||
±0,5% per fonte) — NON dal book interno ne' da 1.0 cablato: il 10/10/2025 su Binance
|
||||
l'oracle sul proprio book ha marcato USDe a $0,65 mentre l'indice mondo diceva ~$0,99.
|
||||
Sotto la pari il prezzo PASSA (un depeg vero deve ridurre il sizing, non sparire);
|
||||
sopra la pari si clampa a 1.0 (conservativo). Se l'indice non e' leggibile: fallback al
|
||||
last del ticker via gateway, poi 1.0 DICHIARATO — contare 0 ricreerebbe esattamente il
|
||||
falso -24% che questa funzione elimina (P5: il fallback si sceglie sul danno)."""
|
||||
try:
|
||||
eq = float(client.account_summary("USDE").get("equity") or 0)
|
||||
except Exception:
|
||||
return 0.0, ""
|
||||
if eq <= 0:
|
||||
return 0.0, ""
|
||||
px = None
|
||||
try:
|
||||
import requests
|
||||
r = requests.get(USDE_INDEX_URL, timeout=5).json()
|
||||
px = float(r["result"]["index_price"])
|
||||
except Exception:
|
||||
try:
|
||||
px = float(client.ticker("USDE_USDC").get("last_price") or 0) or None
|
||||
except Exception:
|
||||
px = None
|
||||
if px is None or not (0.0 < px < 2.0):
|
||||
return eq, f"USDE {eq:,.0f} valutato 1.0000 (indice non leggibile)"
|
||||
return eq * min(px, 1.0), f"USDE {eq:,.0f} @ {min(px, 1.0):.4f}"
|
||||
|
||||
|
||||
def _equity(client, marks):
|
||||
if client is None:
|
||||
return None, "offline"
|
||||
try:
|
||||
eq = float(client.account_summary("USDC").get("equity") or 0)
|
||||
if eq > 1:
|
||||
usde_usd, usde_note = _collaterale_usde(client)
|
||||
if usde_usd > 0:
|
||||
return eq + usde_usd, f"mainnet USDC + {usde_note}"
|
||||
return eq, "mainnet USDC"
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user