Il TreasuryVault
Un vault per mercato. Riceve il 2 % di ogni trade e lo trasforma in azioni tokenizzate, distribuite in airdrop agli holder del token. È il contratto più pesante del protocollo, e quello con meno poteri.
Cosa non ha
Niente withdraw. Niente transfer. Niente sweep. Niente owner. Queste funzioni non
esistono nell'implementazione attuale, e chiunque può verificarlo: una chiamata fallisce
perché non c'è nulla da chiamare. Dal 2026-10-02 il vault stesso è upgradabile: vedi più
avanti.
Il ciclo di conversione
- Accumulo. L'ETH arriva con i trade. Una volta ogni 24 ore, il ciclo parte se il vault detiene almeno 0,1 ETH quando il keeper lo controlla, al suo primo giro dopo la chiusura della finestra dell'airdrop; al di sotto, quel giorno non scatta nulla, anche se l'ETH supera la soglia più tardi — gas e slippage si mangerebbero l'operazione. Il keeper vi si attiene dal 2026-10-06; fino ad allora convertiva non appena il vault deteneva la soglia.
- ETH → USDC su Uniswap v4 Ethereum, con un limite di 50 punti base rispetto al feed ETH/USD. Coppia profonda, quindi il limite può essere stretto. Il keeper indica l'importo, almeno la soglia e al massimo il saldo, e il limite viene calcolato su quell'importo.
- USDC → USDG tramite Curve, poi attraverso l'OFT di Paxos su LayerZero.
- Acquisto delle azioni sui pool secondari di Robinhood Chain, da parte del vault speculare, con un limite di 200 punti base rispetto a un feed Chainlink indipendente, ogni azione con il cash che le è riservato.
- Airdrop. Nello stesso ciclo giornaliero, il keeper invia le azioni acquistate al contratto dell'airdrop su Ethereum, dove gli holder del token le riscuotono, pro rata. Dal settimo ciclo di audit, il 2026-10-06, le invia una volta che valgono quanto costa inviarle; altrimenti attendono nel vault una finestra successiva.
Il vault misura ciò che riceve effettivamente e rifiuta se il risultato resta sotto il minimo del keeper, che non è mai più permissivo del limite (dal 2026-10-05; fino ad allora il risultato veniva confrontato solo con il limite). Non si fida né del keeper, né del rail, né del prezzo quotato.
Dal 2026-10-05 ogni tratta dell'acquisto viene eseguita a sé, su entrambi i vault che
comprano azioni. Una tratta che fallisce — un percorso che va in revert, un'azione
congelata, un feed non aggiornato, un risultato sotto il minimo, una quotazione rifiutata
e, dal 2026-10-06 su Robinhood Chain, un'azione il cui token mette in pausa il suo oracolo
per un'operazione societaria — conserva il proprio cash riservato alla sua azione ed emette
LegFailed, e le altre tratte vengono eseguite. Solo quando nessuna tratta viene eseguita
la chiamata fallisce, con il motivo della prima tratta, come farebbe una tratta singola.
Fino ad allora una tratta che falliva faceva fallire l'intero acquisto. Su Robinhood Chain,
con il controllo del sequencer dell'oracolo impostato, un sequencer fermo o appena
ripartito trattiene ogni tratta (vedi Il rail Robinhood); quel
controllo è disattivato finché Chainlink non pubblica un feed di uptime per la chain.
La soglia ed entrambi i limiti sono i valori di default di impostazioni dell'owner di StockFun, dal 2026-10-05, lette in tempo reale da ogni vault: quelle della factory per i vault su Ethereum, quella dell'hub remoto per gli acquisti dei vault speculari. Un cambio vale per la conversione successiva di ogni vault.
Importi e riserve
Dal 2026-10-01, dopo l'audit di sicurezza del 2026-09-29:
- Ogni passaggio spende un importo indicato dal keeper. Un vault più grande di quanto la sua sede di esecuzione possa assorbire entro il limite converte a tranche, su più cicli. Prima, ogni passaggio spendeva l'intero saldo, e un vault diventato troppo grande per la sua sede di esecuzione non poteva mai più convertire.
- Il limite del passaggio dell'ETH viene calcolato su quell'importo, non sul saldo del momento. L'ETH che i trade aggiungono mentre la transazione è in attesa non invalida più il minimo del keeper.
- Il cash viene riservato azione per azione. Man mano che arriva, viene accantonato per ogni azione del basket secondo i pesi del basket. Ogni azione spende solo la propria riserva, e un'azione che il keeper salta la conserva per dopo. Prima, la quota di un'azione saltata veniva ripartita di nuovo sull'intero basket: saltando, un keeper poteva spostare quasi tutta una tesoreria su una sola azione.
Entrambi i vault che comprano azioni funzionano così: il vault speculare su Robinhood Chain, in USDG, e il vault su Ethereum sul rail locale, in USDC.
In entrambi, dalla pipeline di sicurezza del 2026-10-01, un trasferimento di emergenza che fa scendere il cash sotto le riserve le azzera tutte: ciò che resta, e ogni afflusso successivo, viene ripartito da capo secondo i pesi del basket. Un'emergenza che prende solo cash non riservato, o un altro asset, le conserva. Prima, l'azzeramento esisteva solo nella lettura che il vault faceva delle proprie riserve: le vecchie riserve tornavano con l'afflusso successivo, e l'ordine delle chiamate del keeper decideva il mix del basket.
Il ruolo del keeper
Attivare, nient'altro. Sceglie il momento, indica l'importo di ogni passaggio, propone i percorsi di swap e fornisce gli importi minimi — che il vault rifiuta se sono più permissivi del proprio limite oracolo, o se un importo supera quanto è riservato a quell'azione. Il keeper può chiedere più del limite, mai meno. Dal 2026-10-05 il vault applica il minimo del keeper a ciò che arriva effettivamente.
Il keeper spende per intero la riserva di ogni azione, tranne sull'ultima azione del basket, dove trattiene n−1 unità, con n pari al numero di azioni: vedi Il keeper.
Sul rail Ondo opzionale, il keeper consegna al vault una quotazione firmata dall'emittente
per ogni tratta. Una quotazione del genere vale per chiunque la presenti, per cui dal
2026-10-05 il router Ondo serve solo i vault della factory, il vault del protocollo e
quello di ogni mercato registrato, e rifiuta chiunque altro (NotAVault): nessun altro può
spendere la quotazione del keeper e far fallire quella conversione. E ogni router del
protocollo rifiuta sé stesso come destinatario di uno swap, per cui non detiene nulla tra
una transazione e l'altra.
Qualunque cosa indichi, il keeper non può deviare un asset, scegliere un altro basket, spostare il cash di un'azione su un'altra, né allentare un limite.
L'airdrop
Le azioni del vault hanno una sola destinazione: gli holder del token, a ogni airdrop, pro rata rispetto a quanto detengono. La ripartizione deriva dai saldi secondo una regola che nessuno sceglie — né il creatore né il keeper. Il meccanismo è implementato dal 2026-10-04, non deployato: vedi L'airdrop.
Sul rail locale, è il vault stesso a consegnare le proprie azioni. sendToAirdrop(stocks),
riservata al keeper, invia l'intero saldo di ogni azione del basket in lista al contratto
dell'airdrop indicato dalla factory, letto in tempo reale. Il vault approva gli importi
esatti, il contratto li preleva e li accredita al ciclo corrente del mercato, e le
approvazioni vengono chiuse di nuovo prima che la chiamata termini. Un'azione in lista due
volte o fuori dal basket fa fallire la chiamata; un'azione senza saldo viene saltata. Dal
2026-10-05 ogni azione va a sé: una il cui saldo non si può leggere o il cui trasferimento
viene rifiutato, per esempio per un congelamento dell'emittente, resta nel vault con un
evento (AirdropSendFailed), e le altre partono; quando non parte nessuna azione, la
chiamata fallisce e ne indica il motivo. Un vault collegato al bridge hub rifiuta questa
chiamata: le sue azioni vengono comprate e detenute su Robinhood Chain, dove il vault
speculare le invia allo stesso modo, attraverso l'adapter LayerZero di ogni azione.
Il buyback del creatore, buybackAndBurn(...), che permetteva a un creatore di vendere
azioni della tesoreria per riacquistare e bruciare il proprio token, è stato abbandonato il
2026-09-27 e rimosso dal codice il 2026-09-28.
Cosa può detenere un vault
ETH, USDC, USDG e le azioni del suo basket, più, sul rail Ondo opzionale, l'USDon che un mint dell'emittente può rimborsare. Un vault non compra nient'altro. Ciò deriva dal codice; nessun test lo verifica come invariante, e nulla impedisce a terzi di inviare un token estraneo all'indirizzo di un vault. La modalità di emergenza porta fuori un token del genere come qualsiasi altro asset.
Un vault pieno di USDC non è guasto: è in transito. Tutti e tre gli stati sono mostrati come la tesoreria in attesa del prossimo airdrop; solo le azioni vengono distribuite, una volta acquistate.
Un proxy per mercato
Dal 2026-10-02 il vault di ogni mercato è un proxy a sé. Viene creato con il mercato, davanti all'implementazione dei vault che la factory indica in quel momento, e inizializzato nella stessa transazione con il suo basket, il suo mercato, e il router, l'oracolo e il bridge hub che la factory indica allora. L'owner di StockFun fa l'upgrade dei vault uno per uno, mercato per mercato, con effetto immediato. Una nuova implementazione indicata nella factory raggiunge solo i mercati creati in seguito.
I vault speculari su Robinhood Chain seguono la stessa regola: vedi Il rail Robinhood.
Modalità di emergenza
Dal 2026-08-29, l'owner di StockFun può spostare qualsiasi asset fuori da un vault, verso qualsiasi indirizzo; dal 2026-10-05 il trasferimento è immediato, senza preavviso. Insieme all'airdrop, è l'unico modo in cui l'implementazione attuale lascia uscire gli asset da un vault, ed è trattato in Modalità di emergenza.