Nasce dall'annuncio sulla fine della Proof of Reserves. La notizia in se' vale
poco: si perde un segnale ad alta frequenza e DEBOLE (una PoR auto-pubblicata
prova che gli attivi esistono in un istante, non che coprano le passivita') e si
guadagna un audit annuale indipendente sotto VARA piu' il 90% degli attivi presso
Coinbase come custode. E non l'abbiamo mai sorvegliata: zero occorrenze nel
codice. Rinunciato di proposito a catturare l'ultimo dato — uno snapshot singolo
auto-riportato non regge lo standard di prova e non permetterebbe di stimare `p`.
CONSEGUENZA VERA: la decisione "100% Deribit fino a $20k" ha fra i suoi riapritori
"`p` che diventa stimabile invece che assunto". Dal 1/9 il segnale pubblico passa
da quotidiano ad ANNUALE: da una serie si stima, da un punto all'anno no. Quel
riapritore diventa praticamente irraggiungibile => la decisione e' ora gated SOLO
dal capitale.
TROVATO CERCANDO: esiste un feed RSS degli exchange-update, e conteneva quattro
annunci materiali che nessuno leggeva. Il caso che decide: le specifiche dei perp
USDC sono cambiate il 18/08, ANNUNCIATE IL 14/08. check_specs() e' nato da quella
svista e gira ogni ora, ma rileva la deriva DOPO; il feed l'avrebbe detta quattro
giorni PRIMA. La prima volta e' andata bene solo perche' i cambi erano RIDUZIONI.
Costruito scripts/live/venue_news.py (in cron_daily accanto a fee_watch):
- NON interpreta: dice "e' uscito questo, guardalo". Nessun automatismo su un
testo di marketing (P13). Classifica solo l'urgenza.
- parole-chiave DERIVATE da deribit._CONTRACT e config/live.json, non
ridichiarate (P1): chi aggiunge un asset allarga la sorveglianza da solo, ed
e' il test che lo blinda.
- primo giro semina senza allertare (P9); feed illeggibile -> exit 2, mai
silenzio implicito (P5).
Debito #8 si RESTRINGE, non si chiude: il Rulebook non ha un feed.
Confermato due volte lo zero USDC: l'espansione del 31/07 non contiene l'Italia
ne' alcun paese UE, mentre San Marino e Citta' del Vaticano SONO idonei. Non
asserisco una causa (ci sono anche Canada e Giappone).
DUE CORREZIONI dalla KB "Cross collateral specifications":
(a) Il saldo negativo costa una collateral fee dello 0,05% AL GIORNO = 18,25%/anno,
al secondo — 4,3x la resa USDE. Il 30/08 avevo scritto "lo finanzia a
interesse" SENZA il numero: giusto e vuoto. Col numero, il criterio del
cuscino di regolamento diventa aritmetica (-14 punti). E il ribilanciamento
automatico non salva: scatta a $1M assoluti o al 100% della cross equity,
irraggiungibili a $2k. Non veniamo ribilanciati: sanguiniamo la fee.
(b) L'haircut USDe ufficiale e' 5%, noi abbiamo 0.10 registrato come "verificato
sul venue" il 26/08 senza traccia di come. NON riparato (P12/M28): si tiene
0.10 perche' e' il lato conservativo, non e' sul percorso soldi e non morde
fino al 90% di quota. Divergenza dichiarata in config.
Di lato: BUIDL haircut 2% (sarebbe stato il miglior collaterale del listino, se
si potesse comprare), stETH 7,5% (terza ragione indipendente per lasciarlo stare).
Nessuna fonte documenta un tetto sulle QUANTITA': il ~31,2% resta misurato e non
spiegato — e ora si sa che non e' una svista di lettura.
Suite: 800 passati (5 nuovi su venue_news).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
19 KiB
2026-08-30 — "porta in USDE tutto il capitale che non viene usato": il venue dice 31%
Richiesta dell'operatore, verbatim: "porta in usde tutto il capitale che non viene usato". Arriva il 30/08, cioè un giorno prima della data a cui l'operatore stesso aveva rinviato la decisione di quota (gate USDE-01, rinvio al 31/08). L'anticipo è esplicito e vale come decisione.
1. "Il capitale che non viene usato" non è una quantità piccola: è quasi tutto
Stato letto dal gateway alle 19:50Z: USDC $1.563,09 (di cui $11,36 impegnati a margine), USDE 500,1757 → $500,18, totale $2.063,26, quota 24,2%. Posizioni BTC $354,72 + ETH $213,36 = $568,08 lordi (0,275x).
Il margine consuma $11 su $2.063, e l'USDE è cross-collateral: convertirlo non lo toglie dall'uso. Anche a piena esposizione del libro (lordo 1,0x) il margine sarebbe ~$41. Presa alla lettera la richiesta è una quota ~99% — il 100% che il gate esclude per nome ("mai 100%: R1 emittente non recuperabile"). Le due letture plausibili ("non a margine" e "non esposto dal libro") convergono entrambe su ~97-99%: non è un'ambiguità che si risolve scegliendo, è una che si porta all'operatore.
2. Il vincolo che r0830_usde_quota non aveva guardato: il cuscino di REGOLAMENTO
L'analisi del 30/08 aveva misurato il margine e concluso — correttamente — che l'haircut non
morde a nessuna quota fino al 90%, nemmeno a leva 1,50x con USDE a 0,95. Vero, e irrilevante:
il P&L e il funding dei perp USDC-lineari si regolano in USDC, non nel collaterale. Lo si vede
nel conto: equity − balance = $7,24 di floating, tutto nel secchio USDC.
A quota 99% resterebbero $41 di USDC contro un libro che, col disaster-SL a −30% sulla massima
esposizione, può perderne **$619**: il saldo va negativo e Deribit lo finanzia a interesse, che si
mangia la resa che si stava comprando. Il vincolo non è il margine, ma non è nemmeno assente.
📌 Corretto e QUANTIFICATO il 31/08 (KB Cross collateral specifications): «a collateral fee will be charged […] default = 0.05% per day», al secondo, sulla valuta negativa — cioè 18,25%/anno, 4,3× la resa USDE che si starebbe comprando. Il ribilanciamento automatico non salva: scatta a $1M assoluti o al 100% della cross equity, soglie irraggiungibili a $2k. Qui il 30/08 avevo scritto «lo finanzia a interesse» senza il numero: il numero rende il criterio del cuscino più giustificato, non meno.
Criterio dichiarato: cuscino USDC ≥ disaster-SL sulla massima esposizione lorda del libro =
n_asset × frac × disaster_sl_pct = 2 × 0,5 × 0,30 = 30% dell'equity — tutto derivato da
config/live.json e src/live/book.py, mai ridichiarato (P1). Che lascia esattamente 70%.
Non è un argmax (M8): la quota massima e il criterio coincidono per costruzione, e infatti il 70%
cade esattamente sul limite, con zero slack.
Tabella portata all'operatore (APR allora creduta 3,26% [1,13-4,51], n=4 — vedi §5, è sbagliata):
| quota | converti | USDC che resta | resa/anno | evento emittente vs maxDD libro |
|---|---|---|---|---|
| 24,2% (allora) | — | $1.563 | $16 | 3,1× |
| 50% | $531 | $1.032 | $34 | 6,3× |
| 70% | $944 | $619 | $47 | 8,8× |
| ~99% | $1.522 | $41 | $66 | 12,3× |
Scelta dell'operatore: 70%, il massimo compatibile col cuscino.
3. Esecuzione: da 500 a 644 USDE, poi il muro
Nuovo attrezzo scripts/live/usde_convert.py (dry-run di default). Non passa da
DeribitTrader: execution.ALLOWED ammette solo i due perp del libro ed è il guardrail
anti-fat-finger del percorso soldi — non si allarga per farci entrare uno spot che col libro
non c'entra. Lo script porta le proprie guardie: banda prezzo [0,995 – 1,005], tetto HARD di quota
0,95, il cuscino di regolamento, dry-run.
Convertiti +144 USDE (500,1757 → 644,175691), quota 24,24% → 31,21%, tutti i fill a 1,0002-1,0003, fee 0. Poi ogni acquisto ha smesso di passare.
4. not_enough_funds_in_currency è un messaggio FUORVIANTE — la cronaca delle ipotesi sbagliate
Si tiene apposta, perché chi rilegge non deve rifare questo giro. Tre ipotesi, tutte plausibili, tutte sbagliate:
- "È la taglia." 943,98 rifiutato per
Invalid params→ vero:min_trade_amount: 1econtract_size: 1, il passo è intero (confermato dapublic/get_instrument; il gateway non espone quel tool, la risposta è arrivata dall'API pubblica). Quantizzato a intero: 933 rifiutato per fondi, con $1.541 disponibili. Falso indizio. - "È il rate-limit." 100 passava e 300 no; poi anche 1 rifiutato otto volte di fila. Aggiunto backoff sul tempo fino a 90s: rifiutato lo stesso. Falso.
- "È il prezzo." Diagnosi a tre ordini da 1 USDE: SELL @1,0000 OK, BUY @1,0003 OK,
BUY @1,0002 e BUY market rifiutati. Vero in parte: il book REST pubblico è in ritardo
sul matching engine, e un limite a
ask+1 ticka volte non incrocia davvero. Difetto mio, e istruttivo: prezzavo l'ordine sull'indice invece che sul book. Sono due prezzi con due mestieri — l'indice marca il collaterale (usde.valuta, mediana multi-exchange: la lezione Binance 10/10), il book prezza lo scambio. Corretto con 5 tick di margine e tetto duro 1,0010: il fill avviene al prezzo del libro, quindi il margine non si paga.
Ma corretto il prezzo, 200 e 800 continuavano a fallire con 4.552 di profondità all'ask.
5. 🚨 Il fatto vero: un TETTO DEL VENUE sull'USDE, a 644,175691 (31,21%)
Esperimento a saldo neutro, quattro ordini di fila (20:14Z):
BUY 20 @1.0007 -> not_enough_funds_in_currency USDE 644.1757
SELL 20 @0.9996 -> OK USDE 624.1757
BUY 20 @1.0007 -> OK USDE 644.1757
BUY 5 @1.0007 -> not_enough_funds_in_currency USDE 644.1757
È un tetto sul LIVELLO: non taglia, non prezzo, non liquidità, non cadenza, non fondi ($1.408 disponibili). Lo stesso ordine che viene rifiutato passa subito dopo una vendita di pari taglia. La quota del 70% non è raggiungibile, e nemmeno il 50%.
La formula del tetto non è leggibile da qui: public/get_currencies non espone un cap
(in_cross_collateral_pool: true, nient'altro), e il gateway non espone né get_order_book né
available_withdrawal_funds — è il debito #11, il gateway è l'unico pezzo della catena che
possediamo e si ha solo quel che espone. Registrato come fatto misurato, non spiegato (D5: un buco
quantificato è un risultato, uno taciuto è un debito).
6. 🚨 E la resa non è quella che credevamo: l'USDC paga 3,40%
public/get_currencies, letta oggi:
| valuta | APR pubblicata |
|---|---|
| USDE | 4,1071% |
| USDC | 3,4000% |
I nostri reward USDE misurati (+0,052055 · +0,061815 · +0,061821 al giorno su 500 → ~4,5%/anno) confermano che la APR pubblicata di USDE è reale. Il che rende credibile anche l'altra riga.
Se l'USDC frutta già 3,40%, il guadagno del passaggio a USDE non è il tasso: è lo spread, 0,71 punti. Sui $644 che teniamo vale ~$4,6/anno, non $21; sui $144 convertiti oggi, ~$1,0/anno. Il gate USDE-01 ha misurato con cura il reward dell'USDE e non ha mai chiesto cosa facesse l'USDC fermo: è il controfattuale mancante — M1 in un'altra veste, si giudica il marginale, non il livello. E cambia il verso della decisione: si prende un rischio emittente non recuperabile (a 31,2% vale 3,9× il maxDD dell'intero libro) per 0,71 punti.
⚠️ Quello che NON è dimostrato: che la APR USDC sia effettivamente accreditata sul nostro conto. Sull'USDE l'abbiamo vista arrivare per delta; sull'USDC il P&L di trading copre $0,13/giorno di interesse e il gateway non espone il Transaction Log. Va verificato su un giorno senza trade prima di trattarlo come misura — qui è una APR pubblicata dal venue più una conferma indiretta, non un reward osservato.
7. Cosa resta a terra
- Conto: USDC $1.419,61 · USDE 644,175691 ($644,18) · totale $2.063,79 · quota 31,21%.
Nessun ordine spot appeso (restano i due
tp01-disasterreduce_only). Posizioni invariate. Equity vista dal book $2.063,86 ("mainnet USDC + USDE 644 @ 1.0000"): sizing corretto, nessun falso "uscita di fondi". config/live.json: aggiuntoquota_target: 0.70(la decisione dell'operatore, oggi bloccata dal venue).quota_max_fracalzato a 0,85 e rimesso a 0,50 nella stessa sessione: la soglia larga presupponeva un 70% che non esiste, e lasciarla avrebbe disarmato la guardia per uno scenario che non si è verificato. Con la quota reale al 31%, il 50% morde di nuovo.- Non fatto: portare la quota al 70%. Il venue non lo consente. Non è una rinuncia discrezionale, è un rifiuto misurato e riproducibile.
APPENDICE (stessa sera, 23:40-23:55Z) — l'USDC NON frutta sul nostro conto: §6 era sbagliata
Richiesta dell'operatore: "verifica se l'USDC frutta davvero sul nostro conto". Verificato. La risposta ribalta la §6 di questo stesso diario, che va letta con questa appendice accanto.
Perché la domanda sembrava dover aspettare, e invece no
Il gateway non espone il Transaction Log (provati get_transaction_log, get_settlement_history,
get_deposits, get_transfers, get_interest_history: tutti 404 — debito #11). L'unica serie
storica del conto è trades.db.equity: oraria ma arrotondata a 2 decimali, e contiene il P&L
non realizzato, che a posizioni aperte oscilla di ±$2-8/ora. $0,13/giorno di interesse ci sparisce.
Poi la fonte ufficiale Deribit ha spostato il problema dal rumore al calendario:
«Every day at 00:00 UTC, Deribit calculates the minimum equity of USDC that a user has been holding over the previous 24 hours. […] After the month is over, the rewards from each day are summed together and paid out as a single monthly payment early in the following month.» —
insights.deribit.com/education/usdc-rewards-now-paid-on-deribit/
I reward USDC si pagano UNA VOLTA AL MESE, non ogni giorno come quelli USDE. Ecco perché non li
avevamo mai visti: guardavamo a cadenza giornaliera, dove l'USDE si vede e l'USDC per costruzione no.
E un accredito mensile da qualche dollaro si vede benissimo anche a 2 decimali — purché il libro
sia FLAT, perché allora equity == balance == USDC e ogni scalino è un accredito.
La misura: due confini di mese, entrambi a libro flat
| finestra | punti orari | equity min | equity max | ore senza alcun movimento | scalini >1 cent | reward atteso se idoneo |
|---|---|---|---|---|---|---|
| 29/06 → 08/07 | 238 | 598,06 | 598,06 | 237 / 237 | 0 | $0,45 (8 gg dal 23/06) |
| 31/07 → 03/08 | 96 | 596,92 | 596,92 | tutte | 0 | $1,72 (luglio intero) |
Il secondo è il caso decisivo: $1,72 attesi contro una risoluzione di $0,01 — 172× — e l'equity non si muove di un centesimo per quattro giorni pieni, coprendo tutta la finestra "early in the following month". Non è un'assenza sotto la soglia di rilevabilità: è uno zero misurato.
⇒ Il conto NON riceve i reward USDC. N=2 confini indipendenti, entrambi puliti per costruzione.
Perché, e perché è coerente col fatto che l'USDE invece paga
Deribit: «A user's eligibility to receive USDC is based on their location». L'ipotesi che spiega entrambe le osservazioni è MiCA: USDC è un e-money token regolamentato, e a un residente UE non se ne può corrispondere rendimento; USDe non è un EMT, e infatti i suoi reward arrivano (li abbiamo visti per delta: +0,052055 · +0,061815 · +0,061821). ⚠️ Questa è la spiegazione plausibile, non una fonte normativa verificata (P13/M27: una norma citata si verifica come un numero). Il fatto misurato è lo zero, non il suo motivo.
Cosa cambia (e cosa la §6 aveva sbagliato)
- La premessa originale del gate USDE-01 è RESTAURATA. Il guadagno di tenere USDE non è lo spread 0,71 punti: è il tasso pieno ~4,1%, perché l'alternativa sul nostro conto rende 0. Sui $644 che teniamo: ~$26/anno (e ~$29 al ritmo misurato di ~4,5%), non i ~$4,6 di §6.
- Cosa avevo sbagliato, e la lezione. Ho letto
apr: 3.4inpublic/get_currenciese l'ho trattato come una proprietà del nostro conto. È una proprietà del venue: un listino, non un accredito. La conferma indiretta che invocavo ("i reward USDE misurati coincidono con la loro APR pubblicata") provava che il listino è reale per l'USDE, e non diceva nulla sull'idoneità dell'USDC. 📌 Un tasso pubblicato non è un tasso incassato: si verifica sul CONTO, e la verifica costava una query sulla serie che avevamo già. È N10 in una veste nuova — la verifica a €0 va fatta prima, e si fa sul venue, non sul sito; qui perfino il venue non bastava, serviva il conto. - Resta vero e non toccato: il tetto del venue al 31,21%, il cuscino di regolamento (30% dell'equity, che lascia il 70%), e che a 31,2% l'evento emittente vale ~3,9× il maxDD del libro. La decisione "tenere o no i $644" cambia però di segno rispetto a come l'avevo chiusa: si compra $26/anno, non $4,6.
Strumento lasciato in piedi
scripts/live/balance_watch.py + scripts/cron_balance.sh (orario al minuto :42, libero
fra :25/:35/:47; sola lettura). Registra il balance a 8 decimali per valuta — la serie che
mancava — con il conteggio dei fill dall'ultimo campione e il nozionale lordo, così una finestra
sporca si riconosce invece di essere mediata dentro. Etichetta PULITA le finestre a 0 fill e libro
flat, dove il Δ USDC è l'interesse, e ne stampa l'APR implicita accanto a quella attesa.
Serve a sorvegliare che lo zero resti zero (o che cambi, se l'idoneità cambia): l'inizio di
settembre è il prossimo confine di mese, ed è già strumentato.
APPENDICE 2 (2026-08-31) — la fonte ufficiale: due correzioni alle mie conclusioni
L'operatore ha passato l'articolo support.deribit.com/.../Yield-reward-bearing-coins. WebFetch lo
prende 403 (Cloudflare); si legge dall'API Help Center in JSON:
support.deribit.com/api/v2/help_center/en-us/articles/31424939199261.json → HTTP 200.
Aggiornato dal venue il 2026-08-20. Contiene tre cose che il progetto non sapeva.
1. L'ITALIA è nella lista degli esclusi dai reward USDC — e non è MiCA
«The following jurisdictions are not eligible to receive USDC rewards: Austria, Belarus, Belgium, Bulgaria, Canada, […] Italy, Japan, […]»
Lo zero misurato è confermato dalla fonte. Ma l'ipotesi che avevo scritto — MiCA, USDC è un e-money token e USDe no — è sbagliata: la lista contiene Canada e Giappone, non è il perimetro MiCA. È policy di giurisdizione di Deribit. M27: una fonte normativa citata si verifica come un numero — e io l'avevo dedotta invece di leggerla.
2. La finestra di pagamento è di DUE SETTIMANE, non di tre giorni — il «172×» era sovra-affermato
«The monthly USDC rewards payment is then made within the first two weeks of the following month.»
Avevo verificato su 29/06→08/07 e 31/07→03/08: 8 giorni su 14 e 3 su 14. Rifatto sulle finestre vere:
| accredito | finestra vera | letture | escursione TOTALE equity | scalini ≥70% dell'atteso | esito |
|---|---|---|---|---|---|
| giugno ($0,45) | 01→16/07 | 374 | $2,74 | 7 | ❌ NON conclusivo |
| luglio ($1,72) | 01→16/08 | 382 | $0,48 | 0 | ✅ conclusivo |
Luglio regge da solo: il credito atteso è 3,6× l'intera escursione dell'equity su due settimane. Giugno no — il libro ha iniziato a operare a metà mese e il rumore ha la taglia del segnale. ⇒ La conclusione non cambia (una finestra conclusiva + la lista ufficiale), ma l'evidenza è una finestra, non due. Avevo citato la sotto-finestra piatta e chiamato «zero misurato» ciò che la finestra completa non copriva: scegliere la sotto-finestra che fa vedere lo zero è la stessa mossa che il progetto vieta a un backtest.
3. Il tetto NON è un livello: è una FRAZIONE dell'equity, e scala col conto
L'articolo documenta un Cap ETHENA che diluisce il tasso a livello di exchange —
User APR = min(min_exchange_USDe_balance, Ethena Cap) / min_exchange_USDe_balance × Ethena APR —
e nessun limite sulle quantità detenibili da un conto. Quindi il muro non aveva base
documentale, e andava ri-sondato. Fatto (31/08, giorno UTC nuovo → non è un limite giornaliero):
BUY 5 -> not_enough_funds_in_currency USDE 644.175691 (muro ancora li')
SELL 10 -> OK USDE 634.175691
BUY 10 -> not_enough_funds_in_currency USDE 634.175691 <-- ieri 644,18 passava!
BUY 5 -> OK USDE 639.175691
BUY 3 -> OK USDE 642.175691
BUY 1 -> OK USDE 643.175691
BUY 1 -> not_enough_funds_in_currency USDE 643.175691
Ieri si tornava a 644,18 e oggi no, con l'equity scesa di $8. Il tetto si è mosso con lei:
| tetto | equity | frazione | |
|---|---|---|---|
| 30/08 | [644,18 · 645,18) | $2.063,79 | 31,21% – 31,26% |
| 31/08 | [643,18 · 644,18) | $2.055,56 | 31,29% – 31,34% |
I bracket distano 0,05pp, dentro il rumore dell'equity (±$2-8/ora). Candidato pulito 5/16 = 31,25%, ma con questa risoluzione non si distingue da una regola sul collaterale scontato dell'haircut (~29%): non si sceglie quella che conviene, si cita la banda (M25).
⇒ Il tetto SCALA col conto. La quota resta ~31% per sempre, il valore in dollari cresce col capitale, e il 70% non è raggiungibile né ora né mai. Conseguenza che ieri non avevo visto: essendo pinnati al tetto, il rischio emittente resta una frazione COSTANTE del conto — non si diluisce crescendo, a meno di vendere apposta.
4. E l'USDe ha un fee del 5% che non avevamo mai nominato
«Deribit Fee: A percentage deducted from the reward before distribution (currently 5%)» · reward su minima equity 00:00→24:00 UTC, distribuiti ~12:00 UTC, «visible inside Transaction Log» (che il gateway non espone: da lì il metodo per delta).
Il nostro misurato (~4,5%/anno) è già netto del fee: è quello che arriva sul conto, ed è
l'unico numero da citare. La apr di get_currencies (4,1071%) è un listino, non un incasso —
la stessa confusione che mi era costata la §6.
5. Cablato, così il tetto smette di vivere in prosa
Alla domanda dell'operatore «dove è scritto il valore del tetto» la risposta era: in tre note di
testo e in nessun posto che il codice legga, tanto che usde_convert --quota 0.70 dichiarava
«piano valido» per un ordine che il venue avrebbe rifiutato. Ora:
config/live.json→usde.venue_cap_frac0.312 (bordo BASSO dei bracket: fa fallire il piano prima dell'ordine invece che dopo il rifiuto) +venue_cap_misuratocon la data;src/live/usde.pylo porta nei default — unica autorità, come tutto il resto della sezione (P1);usde_convert.piano()rifiuta il bersaglio sopra il tetto e stampa il massimo raggiungibile. Verificato:--quota 0.70→ «TETTO DEL VENUE: bersaglio $1.438,90 sopra $641,34 (31,2% dell'equity, misurato 2026-08-31)», nessun ordine inviato.
Stato finale: USDE 643,175691 (quota 31,29%, cioè al tetto), USDC $1.412,40, totale $2.055,57.