Registro delle decisioni

Il registro canonico è doc/DECISIONS.md. Questa pagina riassume i punti di svolta.

2026-08-25 — Revisione di sicurezza interna

Un rilievo di gravità alta: le esecuzioni parziali lasciavano ETH e USDC bloccati nei router, interamente tassati. Corretto rifiutando le esecuzioni parziali invece di gestirle.

2026-08-27 — La commissione passa dal 4 % al 5 %

La quota del creatore raddoppia, dall'1 % al 2 %. Lo schema di $STOCKFUN passa da 2 / 1,5 / 0,5 a 2 / 2,5 / 0,5. La quota della tesoreria resta al 2 %, ed è il numero che non cambia mai.

Conseguenza accettata: l'andata e ritorno passa dal 7,84 % al 9,75 %. Dal 2026-10-05 l'aliquota e la sua ripartizione sono impostazioni dell'owner, e questi valori sono quelli di default.

2026-08-27 — Il buyback del creatore

Toglie l'esclusione "nessuna uscita" su un unico percorso, che finisce sempre al burn. Il Treasury Ratio può ora scendere a discrezione di un creatore. Rimosso il 2026-09-27, sostituito dall'airdrop.

2026-08-29 — Modalità di emergenza

L'owner può spostare gli asset di una tesoreria dopo 48 ore di attesa pubblica. Sostituisce la promessa "nessuno può toccare la tesoreria". Il protocollo smette di essere descritto come trustless. Immediata dal 2026-10-05: il periodo di attesa non esiste più.

2026-09-11 — Il rail passa a Robinhood Chain

L'ostacolo era l'idoneità di un contratto vault presso un emittente a mint primario, mai documentata pubblicamente. I pool secondari di Robinhood Chain non la richiedono. Prezzo pagato: una dipendenza cross-chain accettata.

2026-09-12 — La bonding curve viene eliminata

Sostituita da due posizioni Uniswap v4 single-sided, bloccate dalla creazione. Nessuna graduation, nessuna migrazione, nessuna commissione di graduation.

La FDV di lancio non cambia: resta quella a cui apriva la curva, 3,409 ETH. Un primo ticket da 2 ETH prende il 36,06 % della supply contro il 36,99 % di prima — il lancio si comporta come prima, a meno di un punto.

Scartati lungo il percorso: un lancio a $5.000 con un tetto a $50.000, che dava solo 3,25 ETH di profondità e permetteva al primo acquirente da 2 ETH di prendere il 57 % della supply. E l'idea che un tetto più basso avrebbe calmato il mercato — passa prima il testimone alla banda senza limite, che è sottile, e raddoppia la FDV raggiunta dopo 50 ETH di spesa.

2026-09-12 — Anti-snipe in tre blocchi

Solo il creatore nel blocco 1, 99 % al buyback nel blocco 2 tranne il creatore e la whitelist dell'owner, normale in seguito. Sostituito il 2026-09-28 dall'anti-snipe decrescente.

Presa con piena consapevolezza dell'obiezione: una tassa del 99 % produce qualcosa solo se qualcuno perde i propri soldi, e chiudere il blocco 2 avrebbe avuto lo stesso effetto deterrente senza vittime. La whitelist sta a livello di protocollo anziché di creatore, proprio perché non possa diventare un vantaggio da insider, mercato per mercato.

2026-09-12 — Nessun burn sulle vendite

L'idea di inviare al burn il 10 % dei token in entrata a ogni vendita è stata abbandonata. Pagata dal venditore, portava l'andata e ritorno al 18,78 %. Pagata dall'LP, rendeva falso "liquidità bloccata per sempre" e dava a chiunque una leva di circa 1:1 per bruciare il flottante e pompare la propria bag.

2026-09-27 — L'airdrop sostituisce il buyback del creatore

La tesoreria di un mercato ha ora un solo uso: il 100 % delle azioni che compra viene distribuito in airdrop agli holder del suo token, pro rata, in natura, su Robinhood Chain. Il buyback del creatore è rimosso, e con esso il percorso inverso del bridge. Il buyback e burn di $STOCKFUN resta.

Scartati lungo il percorso: mantenere il buyback del creatore, e una ripartizione che teneva il 60 % nella tesoreria e ne distribuiva il 40 %, il vecchio piano V2. Conseguenze accettate: nessuna tesoreria si accumula più, il Treasury Ratio perde il suo significato, e slogan e tagline sono da rivedere. Il meccanismo è stato implementato il 2026-10-04: vedi L'airdrop.

2026-09-27 — Un ciclo ogni 24 ore

La cadenza dell'airdrop è fissata lo stesso giorno. Una volta ogni 24 ore, per ogni mercato la cui tesoreria ha accumulato almeno 0,1 ETH, il keeper converte, esegue il bridge, compra le azioni, poi le distribuisce in airdrop. Sotto la soglia, quel giorno non succede nulla; l'ETH attende.

Le azioni si possono comprare solo quando la borsa USA è aperta, quindi non c'è alcun ciclo nel fine settimana né nei giorni festivi del NYSE. Nel codice del keeper, fino al 2026-10-06 la conversione avveniva durante la sessione, al primo giro in cui il vault deteneva la soglia; da allora segue questa decisione, una volta per finestra, al primo giro del keeper dopo la chiusura della finestra e solo se il vault detiene la soglia in quel momento (vedi 2026-10-06 sotto); dal sesto ciclo di audit, lo stesso giorno, anche l'USDC che un vault detiene segue questa cadenza. L'invio all'airdrop avviene una volta per finestra dal 2026-10-05, dopo la sessione del giorno: vedi Il keeper.

2026-09-27 — Fondi bloccati e misurazione della detenzione

I residui di un ciclo interrotto completano il percorso al ciclo successivo, che la soglia sia raggiunta o no. I fondi dell'airdrop rimasti bloccati per 24 ore in un vault speculare possono essere spostati dall'owner senza preavviso: l'unica eccezione al periodo di attesa pubblico di 48 ore, scelta consapevolmente. La detenzione viene misurata come saldo medio nelle 24 ore precedenti il ciclo, anche il lunedì. La finestra dei fondi bloccati è passata a 48 ore il 2026-09-28, e la regola è stata chiusa il 2026-10-05, senza essere mai implementata.

2026-09-28 — Anti-snipe decrescente

80 % nel blocco di apertura, meno 8 punti per blocco, 5 % dall'11° blocco, su acquisti e vendite. L'eccedenza va alla tesoreria del mercato, o alle commissioni del team da riscuotere su $STOCKFUN. Esenti: l'acquisto di lancio del creatore e una whitelist stabilita dal creatore, fissata nella transazione di creazione, pubblica, immutabile e con un tetto di 20 indirizzi; su $STOCKFUN, stabilita dall'owner al lancio. Dal 2026-10-05 questi numeri sono impostazioni dell'owner, e i valori qui sopra sono quelli di default.

Scartato lungo il percorso: marcare i wallet che comprano nei primi blocchi e tassarne le vendite successive, anche dopo un trasferimento. Un pool v4 non vede il wallet, una tassa prelevata dal token fa fallire la vendita, e bloccare i wallet marcati fuori dal router StockFun farebbe segnalare il token dagli scanner. Conseguenza accettata: la whitelist passa dal protocollo al creatore, cosa che la decisione del 2026-09-12 aveva escluso per evitare un vantaggio da insider.

2026-09-28 — Fondi dell'airdrop bloccati: 48 ore

I fondi dell'airdrop rimasti 48 ore in un vault speculare, invece di 24, possono essere spostati dall'owner senza preavviso. A 24 ore la finestra coincideva con il periodo del ciclo, quindi un normale riporto al ciclo successivo diventava spostabile senza preavviso; a 48 ore non è più così. Un fallimento del venerdì diventa comunque spostabile la domenica, prima del ciclo del lunedì. Deciso lo stesso giorno: il conteggio non si ferma mai, né durante una pausa né nel fine settimana. Chiusa il 2026-10-05, mai implementata: il trasferimento di emergenza è immediato ovunque.

2026-09-28 — La detenzione registrata onchain

Il token di ogni mercato registra nel tempo la detenzione di ogni wallet, così un contratto calcola la media nelle 24 ore precedenti un ciclo e ogni quota; il keeper non le fornisce mai. Scartata: una ripartizione calcolata offchain dal keeper e pubblicata con un periodo di contestazione. Costo accettato: ogni trasferimento del token paga gas in più.

2026-09-28 — L'airdrop in azioni wrapped, su Ethereum

Le azioni comprate su Robinhood Chain vi vengono bloccate in adapter LayerZero deployati da StockFun, uno per azione, e inviate su Ethereum come azioni wrapped. La distribuzione avviene su Ethereum, dove vivono il token e la sua detenzione, e ogni holder riscuote la propria quota a proprie spese. Conseguenze accettate: le azioni wrapped valgono solo quanto le azioni bloccate e la configurazione LayerZero, non hanno mercato su Ethereum, e un congelamento degli Stock Token da parte del loro emittente immobilizzerebbe le azioni bloccate. Deciso lo stesso giorno: l'owner detiene la configurazione LayerZero degli adapter, senza periodo di attesa e senza limite ai prelievi, come fa Paxos per l'USDG. Scartate: una configurazione congelata dopo il deploy, e modifiche con un preavviso di 48 ore.

2026-09-28 — Il router ufficiale resta modificabile

L'owner può cambiare in qualsiasi momento lo swap router ufficiale, e l'hook riconosce la whitelist anti-snipe attraverso quel router. Conseguenza accettata: indicando un altro router, l'owner può esentare chiunque dall'anti-snipe.

2026-09-28 — Una commissione di creazione di 0,001 ETH

La commissione di creazione diventa 0,001 ETH, fissata nel codice, invece di circa $3: nessun feed di prezzo, nessuna impostazione dell'owner. Il suo valore in dollari ora segue il prezzo dell'ETH. Un'impostazione dell'owner dal 2026-10-05, 0,001 ETH di default.

2026-09-28 — Il PoolManager fuori dal registro della detenzione

Il token non registra il PoolManager di Uniswap, parte di ogni swap, che detiene i token di tutti i pool e non riceve mai un airdrop: la sua cronologia vale zero, mentre quella del trader resta registrata. Risparmio misurato: circa 24.000 di gas per swap, sia in acquisto sia in vendita.

2026-09-29 — Nessuna commissione LP sui pool StockFun

I pool vengono creati con una commissione LP di Uniswap pari a zero invece dello 0,30 %: la tassa dell'hook rappresenta l'intero costo di un trade, il 5 % per direzione e il 9,75 % per un'andata e ritorno prima dell'impatto sul prezzo. Costo accettato: la tesoreria, il team e il creatore perdono la loro quota delle commissioni LP, e viene meno il burn della parte in token di quelle commissioni. Dal 2026-10-05 la commissione LP è un'impostazione del lancio, zero di default; ogni pool mantiene quella con cui è stato creato.

2026-10-01 — Correzioni dell'audit di sicurezza del 2026-09-29

Applicate il 2026-09-30 e il 2026-10-01, dopo che ogni rilievo è stato esaminato e la sua correzione scelta. Ogni rilievo corretto ha dei test di regressione che falliscono sul codice sottoposto ad audit.

Solo il lock della liquidità può aggiungere liquidità a un pool StockFun: una posizione di terzi faceva da controparte agli swap tassati senza pagare la tassa né l'anti-snipe. Il nuovo permesso dell'hook ha cambiato l'indirizzo dell'hook, che è stato minato di nuovo.

Solo la quota della tesoreria viene inviata durante un trade. Le quote del team e del buyback vengono accreditate sull'hook e pagate tramite riscossioni che chiunque può chiamare, ai wallet correnti della factory; l'escrow non esiste più. Il router e il lock pagano l'importo in entrata prima dello swap. Fino ad allora, un wallet delle commissioni che a sua volta chiamava Uniswap poteva fermare il trading su ogni pool.

Ogni passaggio di conversione spende un importo indicato dal keeper, così un vault più grande della sua sede di esecuzione converte a tranche. Il cash viene riservato per ogni azione del basket man mano che arriva, e un'azione che il keeper salta conserva la propria riserva; il vault speculare funziona allo stesso modo.

Ogni token registra nel tempo la propria supply al di fuori del PoolManager di Uniswap, il denominatore della quota pro rata dell'airdrop. Delle tre opzioni dell'audit, questa costa una scrittura in più per swap; registrare di nuovo il PoolManager sarebbe costato circa 24.000 gas per swap. Conseguenza accettata: le finestre dell'airdrop iniziano e finiscono a un'ora esatta.

Sul rail Robinhood, un basket rifiutato non blocca più gli altri mercati di un batch, a un token remoto corrisponde un solo identificatore, un'esecuzione parziale su v3 fa fallire il suo percorso, un hub remoto in pausa applica comunque i cambi di ruolo, e le registrazioni canoniche vengono pagate nell'ordine in cui sono arrivate.

Misurato: un acquisto tramite il router costa 113.529 gas e una vendita 137.250, contro 125.862 e 150.416 prima. Ancora aperti, in attesa della decisione dell'owner: la rotazione dell'adapter del bridge (M-2, e L-8 con essa), le attestazioni Ondo (M-7), e i router che accettano sé stessi come destinatario (L-4). Dal 2026-10-05 M-7 e L-4 sono corretti, e M-2 resta com'è per decisione dell'owner, e L-8 con esso.

2026-10-01 — La pipeline di sicurezza completa le correzioni

Lo stesso giorno, un secondo round di audit, da parte di due auditor indipendenti, ha completato diverse correzioni. Ognuna ha dei test di regressione; nessuna cambia una decisione di design o un parametro immutabile.

Su Robinhood Chain, un percorso v3 viene eseguito un pool alla volta, e ogni pool deve consumare tutto il proprio input: il controllo precedente vedeva solo il primo pool, e un'esecuzione parziale più avanti lasciava il token intermedio dove chiunque poteva prenderlo. Un ticket contabile canonico paga al massimo tante registrazioni quante ne ha aggiunte alla coda, a partire dalle più vecchie, così un arretrato non lo spinge più oltre il gas della sua esecuzione automatica; lo sweep paga il resto.

Un'emergenza eseguita che fa scendere il cash di un vault sotto le sue riserve le azzera tutte, in entrambi i vault: ciò che resta, e ogni afflusso successivo, viene ripartito da capo secondo i pesi. Fino ad allora l'azzeramento esisteva solo nella lettura, e le vecchie riserve tornavano con l'afflusso successivo.

Il keeper trattiene n−1 unità sull'ultima azione di un basket a ogni acquisto: il resto dell'arrotondamento va a quell'azione, e un trasferimento di polvere poteva far fallire l'acquisto. Dimezza inoltre una tranche di burn che il pool $STOCKFUN non riesce a eseguire per intero. Ogni token registra il suo primo punto orario al deploy, cosa che contava solo su un orologio che parte dall'ora 0, come quello di una chain di test. Lo stock router di Ethereum esegue un sync prima di pagare in ETH, e la Lens rifiuta una pagina vuota.

Misurato: il primo swap di ogni ora su un token costa circa da 28.000 a 30.000 gas in più come transazione a sé, non circa 23.000.

In attesa della decisione dell'owner, non decisi: un'emergenza sul cash registrato dell'hub remoto, le cui registrazioni vengono poi pagate con il cash di altri mercati (R2H-1); un token cash che rifiuta un vault speculare, il che ferma la coda canonica e fa fallire i batch che comprendono quel mercato (R2H-2); il lato contratti del margine dell'ultima azione, che cambia la regola di allocazione documentata (R2T-1); prelevare la tassa sugli acquisti come claim del PoolManager, così che qualsiasi router possa comprare (R2F-1, option b); far deployare il vault di $STOCKFUN dalla factory stessa (R2F-2); e tre punti informativi (R2H-4, R2H-6, R2H-7). Un'azione che non si può mai più comprare continua a ricevere la propria quota di ogni afflusso, secondo il suo peso: è voluto, perché dismettere una tratta cambierebbe i pesi fissi del basket. Dal 2026-10-05 R2H-1 è coperto dagli strumenti di sistemazione dei conti dei cicli di audit di quel giorno più una procedura, la messa in pausa dell'hub remoto da parte dell'owner prima del trasferimento; R2H-2 è chiuso dalle consegne non bloccanti del quarto ciclo; l'option b di R2F-1 è scartata, e la tassa resta prelevata come oggi; e un vault che rifiuta ETH non ferma più il suo mercato, il blocco descritto da R2F-2: vedi più avanti le voci del 2026-10-05.

2026-10-02 — Tutti i moduli upgradabili

Fino ad allora, nessun contratto del protocollo poteva ricevere un upgrade. Tutti i moduli tranne i token e il lock della liquidità diventano upgradabili dall'owner di StockFun, con effetto immediato: nessun timelock. Ognuno è un proxy con upgrade tramite UUPS, e chiede alla propria autorità di upgrade chi può farne l'upgrade: la factory su Ethereum, l'hub remoto su Robinhood Chain. I vault, su entrambe le chain, sono un proxy per mercato, con upgrade mercato per mercato. Il proxy dell'hook è minato con tutti i 14 permessi v4, così un'implementazione successiva può usare qualsiasi callback senza spostare l'indirizzo.

I token non hanno alcuna logica propria: un semplice ERC-20 con supply fissa e un solo setter, setRecorder, per l'owner. Il registro della detenzione li lascia per un nuovo modulo, il registratore della detenzione, che ogni token chiama a ogni trasferimento; se la chiamata fallisce, il trasferimento fallisce. Dal 2026-10-05 i token hanno anche dei rescue, per ciò che viene inviato al loro stesso indirizzo, e quella chiamata bloccante è l'unica eccezione voluta alla regola di isolamento del fondatore (vedi più avanti).

Il lock della liquidità resta non upgradabile e acquisisce una modalità di chiusura: l'owner la annuncia, e 30 giorni dopo può recuperare l'intera liquidità di ogni pool, compresa quella di $STOCKFUN, verso qualsiasi indirizzo. L'owner può annullare; il trading continua durante i 30 giorni, e nessun nuovo mercato può essere lanciato finché una chiusura è in sospeso. Esiste per il caso in cui il progetto chiuda; i 30 giorni sono il preavviso degli holder. Nemmeno il deployer dei vault speculari su Robinhood Chain è upgradabile: l'indirizzo di ogni vault speculare deriva da esso.

Cosa cambia: un upgrade non attende le 48 ore della modalità di emergenza, che resta; le regole che questo libro definisce fisse, dai limiti dei vault al burn e all'aliquota del 5 %, valgono finché l'owner non fa l'upgrade del modulo che le contiene; la factory viene deployata per prima e collegata dall'owner, il che cambia l'ordine di deploy. Uno swap costa circa 27.000 gas in più, misurato in isolamento: un acquisto 237.190 gas invece di 210.105, una vendita 285.031 invece di 258.278 — il prezzo dei proxy sul suo percorso e della chiamata al registratore. Dal 2026-10-05 nemmeno la modalità di emergenza ha più un periodo di attesa, e i limiti dei vault e l'aliquota del 5 % sono impostazioni dell'owner.

2026-10-04 — Il contratto dell'airdrop

Implementato e testato, non deployato. AirdropDistributor, un modulo upgradabile su Ethereum legato alla factory, distribuisce le azioni di ogni mercato per ciclo giornaliero. La finestra di un ciclo si chiude alle 13:00 UTC, prima dell'apertura USA tutto l'anno; i suoi acquisti e invii avvengono nella sessione che segue. Un ciclo si apre con il suo primo invio, o prima di esso, e congela i suoi numeri: il registratore della detenzione, la lista di esclusione in vigore alla chiusura della finestra, e le detenzioni idonee. Due percorsi lo alimentano, sendToAirdrop sul vault speculare, attraverso l'adapter LayerZero di ogni azione, e sul vault Ethereum per il rail locale; nient'altro accredita un ciclo.

Deciso lo stesso giorno: nessun invio da parte del keeper, solo l'holder riscuote, a proprie spese (TBD 5); nessun tetto per wallet, nessun minimo, nessuna scadenza (TBD 7); una lista di esclusione per token, stabilita dall'owner, al massimo 16 indirizzi, con sempre l'indirizzo di burn e il contratto di vesting per $STOCKFUN (TBD 8). Un invio per una finestra senza detenzioni idonee viene messo da parte per la prima finestra che ne ha, chiunque chiami e in qualunque momento, purché nel frattempo l'ora del ciclo non cambi e il registratore della detenzione del token non venga sostituito.

Accettato e documentato: il keeper sceglie quando, quindi un invio che arriva dopo le 13:00 UTC successive viene misurato sulla finestra del giorno dopo; spostare l'ora del ciclo ridisegna le finestre non ancora aperte, comprese quelle che le azioni messe da parte devono ancora esaminare; il registratore della detenzione di un token riceve l'upgrade sul posto, e non viene mai sostituito su un token attivo. Fuori da questa modifica: la regola delle 48 ore per i fondi bloccati, gli adapter delle azioni, il passaggio dell'airdrop nel keeper e la schermata di riscossione della dapp. Dal 2026-10-05 non c'è più alcun contratto di vesting da escludere, la regola delle 48 ore è chiusa, e l'ora del ciclo fa parte di una programmazione che l'owner imposta, la durata e l'orario di chiusura delle finestre (setCycleSchedule); un registratore indicato su un token attivo parte dalla supply del token al di fuori del PoolManager (vedi più avanti la voce del ciclo di audit).

2026-10-05 — Nessuna allocazione al team, una modalità di emergenza immediata, ogni numero un'impostazione

Tre decisioni, implementate e testate lo stesso giorno, non deployate.

L'allocazione al team scompare. Il contratto di vesting del team, TeamVesting, è eliminato, e nessun $STOCKFUN è riservato al team: l'intera supply, 1.000.000.000 token di default, va nella posizione single-sided bloccata, così come l'intera supply di un mercato va nelle sue due posizioni. Fino ad allora il 10 % andava al contratto di vesting su 12 mesi, e l'airdrop escludeva quel contratto dai cicli di $STOCKFUN; ora è escluso solo l'indirizzo di burn, insieme, dal terzo ciclo di audit di quel giorno, all'operatore del lancio (vedi più avanti).

La modalità di emergenza diventa immediata. emergencyTransfer sposta un asset fuori da un vault, da un bridge hub o dal contratto dell'airdrop, verso qualsiasi indirizzo, subito; ogni trasferimento ha un id sequenziale e un evento pubblico. La programmazione con 48 ore di attesa del 2026-08-29 non esiste più, insieme alla sua finestra di annullamento, e il periodo di attesa non è un parametro: un'emergenza agisce non appena l'owner la usa, mai dopo un'attesa. Anche la sostituzione dell'adapter del bridge, changeAdapter, è immediata, con gli stessi indirizzi fissati. La regola per i fondi dell'airdrop bloccati, decisa il 2026-09-27 e il 2026-09-28 e mai implementata, è chiusa: il trasferimento immediato la copre, su qualsiasi contratto, in qualsiasi momento.

Ogni numero diventa un'impostazione. I numeri del protocollo sono ora impostazioni onchain dell'owner, su entrambe le chain, e i valori di oggi sono quelli di default: la tassa, la sua ripartizione e l'anti-snipe; la commissione di creazione e i limiti di lunghezza dei testi di un nuovo mercato; la forma dei nuovi mercati, commissione LP e tick spacing compresi, e le quote di ciò che incassano le posizioni bloccate; la soglia di conversione e i limiti di prezzo dei vault; la programmazione e i limiti dell'airdrop; gli heartbeat degli oracoli; il gas e lo slippage del bridge. Ognuna ha effetto subito e rifiuta i valori impossibili. Un cambio della tassa vale dallo swap successivo su ogni pool, compreso uno ancora nei suoi blocchi anti-snipe; un cambio di forma vale per i mercati creati in seguito, e ogni pool mantiene la commissione LP e il tick spacing con cui è stato creato.

Resta fisso: il preavviso di 30 giorni della modalità di chiusura, END_DELAY, nel lock, che non è upgradabile; le unità e le codifiche, dal punto base all'ora del registro della detenzione; e i collegamenti, dai feed di prezzo agli endpoint del bridge, che solo un upgrade può far puntare altrove.

Conseguenza accettata: le cifre che questo libro riporta per la tassa, il lancio, i vault e l'airdrop sono valori di default, non garanzie; l'owner può cambiare ognuna di esse in qualsiasi momento, senza preavviso. Misurato: leggere le impostazioni della tassa costa a uno swap circa 1.200 gas in più, a caldo. Vedi Modello di fiducia.

2026-10-05 — Le correzioni del ciclo di audit

Lo stesso giorno, un ciclo di revisione su tutto il codice ha portato a correzioni dei contratti, ognuna con un test di regressione, non deployate. Quattro di esse cambiano il comportamento.

Dopo un trasferimento di emergenza, i conti vengono sistemati, mai pagati a spese di un altro mercato. Il contratto dell'airdrop e l'hub remoto detengono asset dovuti a più mercati. Dopo un trasferimento fuori dall'uno o dall'altro, i pagamenti che dipendono da ciò che manca attendono — le riscossioni dell'airdrop di quell'azione, i pagamenti dell'hub remoto sul rail USDG — finché gli asset non tornano o l'owner di StockFun non imputa la perdita al ciclo o al mercato che l'ha subita; sul rail canonico, prima che arrivi il deposito successivo, l'owner elimina la registrazione il cui cash è stato preso dal trasferimento. Un ciclo può essere svalutato in parte solo finché nessuno ne ha riscosso l'azione, e ogni holder perde allora nella stessa proporzione; una volta pagati alcuni holder, solo dell'intero residuo, che perdono gli holder non ancora pagati. Il trasferimento in sé resta immediato e incondizionato. Vedi Modalità di emergenza.

Solo il keeper esegue il bridge. Fino ad allora chiunque poteva inviare un batch del bridge: una terza parte poteva infilarne uno al minimo più permissivo dell'adapter tra due propri trade sul pool Curve, o far fallire il batch del keeper facendo prima il bridge di uno dei suoi vault.

Solo il keeper e l'owner di StockFun deployano in anticipo un vault speculare su Robinhood Chain. Fino ad allora chiunque poteva farlo, anche per un mercato che non esisteva ancora, legato ai collegamenti di quel giorno. Un vault deployato in anticipo ora prende lo stock router e l'oracolo dell'hub remoto al suo primo batch.

Un registratore della detenzione indicato su un token attivo parte dalla supply del token al di fuori del PoolManager, e un registratore che ha già registrato il token lo rifiuta. Fino ad allora un registratore nuovo partiva da zero: ogni vendita falliva, e le quote dell'airdrop dei cicli aperti in seguito erano rotte per sempre. Ora il trading continua, e gli holder di cui il nuovo registratore non ha visto alcun movimento risultano non aver detenuto nulla fino al loro movimento successivo. L'upgrade del registratore sul posto resta la regola.

Correzioni minori: i vault applicano il minimo del keeper stesso a ciò che arriva effettivamente, non solo il proprio limite; il ticket contabile del bridge canonico paga in base alla dimensione del batch; le impostazioni rifiutano un tick di lancio a cui nessun pool può aprire, un limite vuoto per il nome, e un hook e un lock su PoolManager diversi; un passaggio a finestre dell'airdrop più lunghe non blocca più un mercato con azioni messe da parte. Vedi Modello di fiducia.

2026-10-05 — Il secondo passaggio del ciclo di audit

Lo stesso giorno, un secondo ciclo di revisione sulle correzioni ha portato ad altre correzioni dei contratti, ognuna con un test, non deployate, e a modifiche del keeper.

I conti conteggiano ciò che li copre, mai il saldo. Il saldo del contratto dell'airdrop, e dell'hub remoto sul rail USDG, comprende anche token arrivati ma non ancora accreditati: una consegna il cui ultimo passaggio non è stato eseguito. Dopo un'emergenza, tali token potevano riaprire le riscossioni di un ciclo svuotato e pagarle con le azioni di un altro mercato. Entrambi i contratti ora conteggiano da sé ciò che copre i loro conti. Un trasferimento di emergenza prende innanzitutto da quello; ciò che prende oltre quello proveniva da token non ancora accreditati, e le consegne successive lo ripianano prima di coprire qualsiasi cosa, con l'hub remoto che registra quei batch invece di consegnarli. Gli asset tornano tramite restore, che chiunque può chiamare; un semplice trasferimento non copre nulla, quindi i token dispersi si recuperano solo per ripristinarli. Vedi Modalità di emergenza.

Dopo uno stralcio dell'intero residuo di un ciclo, che segue una riscossione, ciò che raggiunge quel ciclo in seguito viene ripartito pro rata tra tutti i suoi holder, come se l'importo stralciato non ci fosse mai stato; fino ad allora andava prima agli holder non ancora pagati, nell'ordine in cui riscuotevano. Uno stralcio che non lascia nulla di ciò che un mercato tiene da parte pone fine alla sua ricerca di una finestra.

Un token rifiuta un registratore della detenzione legato a un PoolManager di Uniswap diverso da quello del suo pool, che conterebbe il pool come un holder e pagherebbe a ogni holder una frazione della propria quota. E un registratore indicato su un token attivo mantiene una supply registrata almeno pari al totale degli holder, non pari a esso, finché ogni holder non ha fatto un movimento.

Sul bridge canonico, la commissione viene quotata a una base fee indicata dal keeper, il doppio dell'ultima, con l'eccesso restituito: una quotazione letta senza un prezzo del gas vedeva una base fee pari a zero, e un batch lungo falliva. L'hub remoto apprende chi è il keeper solo da un batch: prima del primo, l'owner di StockFun deploya in anticipo il vault speculare del primo mercato, e un mercato il cui vault il keeper non può deployare in anticipo viene lasciato fuori dal suo batch, con un avviso. Il keeper conta separatamente i fallimenti di un vault su Ethereum e su Robinhood Chain.

Quanto al secondo round del 2026-10-01: R2H-1 è coperto dagli strumenti di sistemazione dei conti più una procedura, la messa in pausa dell'hub remoto da parte dell'owner prima del trasferimento; R2H-2 è mitigato, ancora aperto: un vault speculare congelato non ferma più per sempre la coda canonica, e solo il keeper compone un batch, ma una consegna a quel vault fallisce ancora per intero, quindi il keeper deve lasciare fuori quel mercato. Vedi Modello di fiducia. Chiuso lo stesso giorno dal quarto passaggio: vedi più avanti.

2026-10-05 — Un guasto non blocca mai il resto

La regola di progettazione del fondatore, fissata lo stesso giorno: quando qualcosa fa fallire una funzione, le altre funzioni non devono farne le spese; tutto deve continuare a funzionare, e tutto deve avere una leva per recuperare i fondi persi e ricevere la correzione. Ha due parti. Isolamento: un guasto in una funzione, un mercato, un'azione, un ciclo, una registrazione o un destinatario non blocca mai gli altri; l'elemento viene saltato, conservato come dovuto o differito, con un evento, e il resto prosegue. Leve: ogni contratto che può detenere ETH o token, anche di passaggio o per errore, ha una leva per portare fuori ciò che resta bloccato, e ogni modulo può ricevere una correzione, un upgrade o un setter che lo sostituisce. Dal quarto ciclo di audit in poi, i cicli contano come un difetto qualsiasi violazione.

Un'eccezione voluta: la notifica di un token al suo registratore della detenzione resta bloccante, e una notifica che fallisce fa fallire il trasferimento. Una notifica a cui fosse permesso fallire lascerebbe che un holder la privasse del gas nel proprio trasferimento, così che il registro salti il movimento e la sua quota dell'airdrop cresca. La leva è immediata: setRecorder(0) sul token, o un upgrade sul posto del registratore, di una transazione ciascuna.

Conseguenze accettate: una quota rifiutata attende il suo destinatario invece di fermare il resto; un trasferimento di emergenza non imputato ad alcun mercato fa attendere i pagamenti di quell'asset finché non viene sistemato; e finché un token non ha un registratore, l'airdrop non apre alcun suo ciclo e ne mette da parte le azioni. Vedi Architettura.

2026-10-05 — Il terzo passaggio del ciclo di audit

Lo stesso giorno, un terzo ciclo, condotto sulle sequenze: operazioni corrette da sole che vanno storte in un certo ordine o in un certo momento. Ogni correzione ha un test, non deployata.

restore restituisce prima ciò che un trasferimento di emergenza ha preso oltre a ciò che copre i conti, sul contratto dell'airdrop e sul rail USDG dell'hub remoto, e copre i conti con il resto: restituire i token di una consegna in attesa non paga più con essi il mercato svuotato. Un'azione stralciata per intero da un ciclo prima che qualcuno la riscuotesse esce dalla lista di quel ciclo.

Un registratore della detenzione indicato su un token attivo avvia una nuova registrazione al momento del cambio: l'airdrop non misura alcuna finestra iniziata prima di esso, le cui azioni attendono, messe da parte, la prima finestra che copre per intero, e il token notifica il saldo dell'indirizzo di burn al momento del cambio. Fino ad allora una finestra del genere, misurata solo dal cambio, pagava di più chi si era mosso dopo. Procedura: aprire prima i cicli delle finestre già chiuse, poi cambiare subito dopo la fine di una finestra; l'upgrade sul posto del registratore resta la regola.

Lo script di lancio di $STOCKFUN esclude dall'airdrop l'operatore del lancio, la cui detenzione il primo ciclo pagava fino ad allora. Gli script del bridge si fermano prima del deploy quando la factory indica già un altro hub, e mappano le azioni prima di indicare l'hub; setBridgeHub rifiuta un hub che non può trasportare un basket registrato. Offchain: una transazione la cui ricevuta non si può leggere viene seguita tramite il suo hash e non viene mai inviata due volte; la sorveglianza delle emergenze legge i propri eventi a blocchi, e lancia un'allerta una volta quando fallisce e una volta quando si riprende; un mercato la cui voce nel batch non si può costruire viene lasciato fuori, con un'allerta. Nell'app, una transazione non confermata conserva il suo hash (dal decimo ciclo di audit viene seguita fino a ciò che viene minato al suo nonce, e un annullamento nel wallet non viene mai letto come fatto: sotto), e un pool che la modalità di chiusura ha recuperato non mostra né prezzo né trading.

2026-10-05 — Il quarto passaggio del ciclo di audit: la regola nel codice

Lo stesso giorno, il quarto ciclo ha portato nel codice la regola del fondatore. Ogni correzione ha un test di regressione, non deployata.

Le consegne del bridge non bloccano mai un altro mercato, la decisione dell'owner su R2H-2: una quota che il token cash rifiuta a un vault speculare resta sull'hub remoto, dovuta al suo mercato, e gli altri vengono pagati; sul rail canonico esce dalla coda, così le registrazioni che la seguono vengono pagate. Chiunque la paga in seguito con sweep. Un trasferimento di emergenza sull'hub remoto può essere imputato a un solo mercato, i cui conti vengono sistemati nella stessa chiamata. Le riscossioni pagano ciò che possono: un'azione per cui i conti non bastano, o il cui trasferimento viene rifiutato, viene differita e resta dovuta, e claimMany salta un ciclo che esclude il chiamante. Ogni tratta d'acquisto, ogni azione di un invio all'airdrop e ogni mercato di un batch del bridge va a sé. Un vault che rifiuta ETH non ferma più il suo mercato: l'hook conserva ciò che non ha potuto pagare come dovuto a quel vault, il lock conserva per il suo destinatario la quota rifiutata di un incasso di commissioni, e chiunque li paga; un contratto creatore che non può ricevere ETH riscuote verso un altro indirizzo. La Lens legge un vault alla volta.

Leve ovunque: un rescue di ciò che un modulo detiene per errore su ogni modulo che non conserva nulla di nessuno, sull'hook solo per ciò che è disperso, sul lock mai per le quote che conserva, sul burner per il suo ETH solo quando nessun burn potrebbe più spenderlo, e su entrambi i token; i vault, gli hub e il contratto dell'airdrop mantengono la modalità di emergenza.

Inoltre: il router Ondo serve solo i vault della sua factory (M-7), e ogni router rifiuta sé stesso come destinatario (L-4); il ticket di deposito del rail canonico viene prezzato alla base fee; lo script di lancio di $STOCKFUN mette in lista l'operatore prima del conio; il controllo dello storage confronta ogni livello di ogni struct. Deciso lo stesso giorno: M-2 e R2F-1 restano come sono. Vedi Modalità di emergenza e Modello di fiducia.

2026-10-05 — Il passaggio dell'airdrop nel keeper e la schermata di riscossione

Scritti lo stesso giorno, su richiesta del fondatore, senza alcuna nuova decisione; non deployati. Il keeper invia le azioni di ogni mercato una volta per finestra, dopo la sessione USA di default: prima colloca le azioni messe da parte, poi apre il ciclo, poi fa l'invio, ogni azione e ogni mercato a sé, e segue ogni consegna da Robinhood Chain finché non viene accreditata, con un'allerta che riporta il comando per rieseguire una consegna in ritardo. La schermata di riscossione della dapp elenca ciò che un wallet può riscuotere, finestra per finestra, e riscuote fino a dieci finestre per transazione, circa da 3,4 a 3,5 milioni di gas misurati a freddo. Escluso: eseguire automaticamente l'ultimo passo di una consegna fallita; l'allerta fornisce invece il comando.

Il passaggio offchain del quarto ciclo ha poi dato al keeper i suoi nuovi compiti: pagare i debiti che l'hook e il lock conservano, lanciare allerte sulle tratte fallite, sui mercati esclusi ripetutamente e sulle consegne rifiutate, pianificare ogni tratta d'azione a sé, un file di stato tra un riavvio e l'altro e l'incasso giornaliero delle commissioni LP. L'app mostra "Figures unavailable" per un vault che non può rispondere. Vedi Il keeper e La dapp.

2026-10-05 — Il quinto passaggio del ciclo di audit

Lo stesso giorno, un quinto ciclo ha trovato sette problemi di gravità bassa, ognuno corretto con un test, non deployato. Il trasferimento dell'hub remoto imputato a una registrazione canonica è per una registrazione il cui deposito è arrivato: rifiuta un importo oltre il cash non trattenuto per le quote rifiutate, e una registrazione il cui deposito è andato perso viene stralciata. Un'azione il cui saldo non si può leggere non ferma più un invio all'airdrop, né la sua quotazione, e nemmeno un adapter senza codice ferma più la quotazione. I contratti di implementazione della factory e dell'hub remoto, che tengono il loro admin nello storage del proxy, hanno il loro deployer come leva per ciò che viene inviato loro. Il lock ed entrambi i token ottengono rescue per i claim v4 e gli NFT inviati loro per errore; il lock continua a non avere alcuna chiamata generica. Un batch del bridge lascia fuori un mercato il cui vault non ha ancora codice. È stato corretto un commento che descriveva in modo errato come un acquisto sposta i fondi. Vedi Modalità di emergenza.

2026-10-06 — Il passaggio offchain del quinto ciclo

La revisione del codice offchain nel quinto ciclo ha trovato tre problemi di gravità media e sedici di gravità bassa, ciascuno corretto lo stesso giorno con un test, non deployato. Il keeper ora si attiene alla cadenza del 2026-09-27: l'ETH di un vault si converte una volta per finestra dell'airdrop, se il vault detiene la soglia al primo giro del keeper dopo la chiusura della finestra; al di sotto, l'ETH attende la finestra successiva. Fino ad allora il keeper lo convertiva a qualsiasi giro della sessione non appena il vault deteneva la soglia. Ogni transazione che il keeper invia viene scritta nel suo file di stato, con il suo nonce, prima che se ne attenda la ricevuta, così un keeper interrotto mentre attende non la invia di nuovo; una che nessun nodo conosce più viene abbandonata dopo un limite di tempo; una cartella di stato è usata da un solo keeper alla volta. Sul rail Ondo, un acquisto che Ondo quota sotto il limite del vault non viene più inviato per fallire, né pagato con un'attestazione. Un'azione il cui adapter non risponde resta fuori da un invio all'airdrop da sola.

Un basket comprende al massimo cinque azioni, un limite tecnico che l'owner di StockFun può cambiare con un upgrade: ogni costo che cresce con un basket è misurato fino a quella dimensione, e i tre basket del lancio comprendono tre, tre e due azioni. La Lens riporta lo stato di ogni vault e ciò che l'hook e il lock gli devono, e il suo upgrade va in produzione prima del Worker e dell'app che la leggono. Lo script di lancio di $STOCKFUN riprende un'esecuzione che si è fermata prima che il mercato del protocollo fosse indicato, invece di coniare un secondo token. L'app conta nella sua tesoreria l'ETH dovuto a un vault, lascia in una riscossione spazio per un'azione accreditata prima che sia minata, ricorda un'azione che il suo token ha rifiutato, e non mostra mai come nulla una cifra che non ha potuto leggere. Vedi Il keeper, I basket e La dapp.

2026-10-06 — Il sesto ciclo di audit

Il sesto ciclo ha trovato un problema di gravità alta e cinque di gravità bassa, ciascuno corretto lo stesso giorno con un test, non deployato. Sul bridge canonico, usato sulla testnet e come fallback, il keeper smetteva di rieseguire i ticket di un batch non appena i suoi mercati erano accreditati, e a un mercato poteva essere accreditato il cash di un altro batch, così un deposito che aveva mancato la sua esecuzione automatica poteva scadere. Il keeper ora segue ogni ticket finché non sa che è stato eseguito, qualunque sia l'accredito del suo trasferimento, riesegue quello ancora vivo e lancia un'allerta quando di un ticket non si sa che sia stato eseguito dopo sei ore di default, o quando è perso; accredita un trasferimento canonico solo in base agli eventi dell'hub remoto stesso, mai in base a un saldo.

Con le correzioni è arrivata una decisione, presa dall'audit come suo default raccomandato: la cadenza del 2026-09-27 si estende all'USDC. L'USDC di un vault, speso in azioni su Ethereum o inviato attraverso il bridge, parte una volta dopo ogni conversione del suo ETH, e al massimo una volta per finestra negli altri casi; fino ad allora poche unità di USDC inviate a un vault facevano inviare al keeper una transazione, o un intero batch del bridge, a ogni giro. Gli acquisti su Robinhood Chain avvengono ancora a ogni giro: il saldo di un vault speculare non distingue una consegna da una donazione, e i tetti di ogni acquisto distribuiscono di proposito una consegna grande su più giri. Le esecuzioni locali e di testnet disattivano entrambe le cadenze con lo stesso interruttore.

Corretti anche: una ricerca di azioni messe da parte che non collocherebbe nulla, per un vault che non ha nulla da inviare, non viene più inviata ogni giorno; un vault sotto la soglia viene controllato su un saldo letto dopo la chiusura della finestra; prima ancora, lo stesso giorno, il file di deploy locale viene verificato rispetto alla chain prima di essere usato; l'app contrassegna il prezzo di $STOCKFUN come "(last read)" finché la Lens non riesce a leggerne la tesoreria, e il worker nel frattempo non registra alcun prezzo per esso. Il ciclo di audit successivo, avviato lo stesso giorno, ha rilevato che il keeper quotava ogni vault su un solo router mentre ogni vault conserva il router con cui è stato creato: ora ogni vault viene quotato sul proprio. Vedi Il keeper.

Dal settimo ciclo, sotto, "nulla da inviare" significa nulla che valga la pena inviare, e il keeper legge ogni ticket partendo dalla ricevuta della sua creazione.

2026-10-06 — Il settimo ciclo di audit

Il settimo ciclo ha trovato un problema di gravità media e quattordici di gravità bassa, ciascuno corretto lo stesso giorno con un test, non deployato; i contratti erano puliti. Sul bridge canonico, il keeper leggeva se un ticket esisteva ancora prima di leggere la ricevuta della sua creazione: un deposito creato tra le due letture, o visto da due nodi a un blocco di distanza, poteva passare per eseguito mentre era ancora vivo, e scadere senza riesecuzione e senza allerta. Ora li legge nell'ordine in cui lo fa l'SDK di Arbitrum: prima la ricevuta, poi l'esecuzione automatica, poi il ticket a un blocco non anteriore alla sua creazione.

Con le correzioni è arrivata una decisione, presa dall'audit come suo default raccomandato: il keeper invia all'airdrop solo ciò che vale quanto costa inviarlo. Un'azione sopra la polvere che il bridge LayerZero non può trasportare, valutata con l'oracolo stesso del suo vault all'ultima risposta del suo feed di prezzo, deve valere la propria commissione LayerZero, o la sua quota del gas dell'invio su Ethereum, e le azioni che passano devono valere insieme l'intero invio più l'apertura del ciclo della finestra quando non è ancora aperto; altrimenti attendono nel vault una finestra successiva, con ciò che si accumula. Un valore che il keeper non riesce a leggere lascia partire l'invio, come prima. Il multiplo è un'impostazione del keeper, KEEPER_AIRDROP_MIN_VALUE_BPS: una volta il costo di default, e 0 disattiva la regola. Decide solo quando parte un'azione, mai quanto, cosa o dove. Fino ad allora un regalo di azioni appena sopra la polvere al vault di un mercato che nessuno scambia faceva aprire al keeper il ciclo di quella finestra e pagare un messaggio LayerZero ogni giorno; e la stessa polvere contava come "qualcosa da inviare", così il limite sulle ricerche di azioni messe da parte del sesto ciclo non valeva sul bridge.

Corretti anche: ogni ricerca nei log del keeper si ferma qualche blocco sotto l'ultimo blocco della chain, così un evento non viene mai perso dietro un nodo in ritardo di uno o due blocchi; il keeper verifica che ogni RPC serva la chain indicata dalla sua configurazione, e altrimenti si rifiuta di partire; il suo webhook di allerta ha un limite di tempo e la sua risposta viene letta, e un'allerta che non accetta viene conservata e inviata di nuovo; un'impostazione vuota prende il suo default. Il Worker dati dell'app legge ogni contratto upgradabile a sé, così uno che fallisce dopo un upgrade difettoso non azzera più le cifre del token $STOCKFUN; mostra il volume a 24 ore come sconosciuto finché le sue letture dei log dei trade continuano a fallire, verifica che ciascuno dei suoi endpoint serva la sua chain, e il grafico dei prezzi colloca ogni punto al suo orario. Né la Lens né lo schema di dati del Worker cambiano. Vedi Il keeper e La dapp.

Dall'ottavo ciclo, sotto, per un'azione la cui quotazione propria è zero si interroga il suo adapter, l'apertura della finestra si conta una sola volta sul rail locale, il ticket si legge qualche blocco sotto l'ultimo, e il keeper non presume più un identificatore di chain quando non ne è impostato nessuno.

2026-10-06 — Le protezioni dei feed di prezzo su Robinhood Chain

Il piano di lancio elencava due protezioni che l'oracolo non aveva ancora, entrambe raccomandate dalla documentazione di Robinhood. Sono costruite, non deployate, come impostazioni dell'owner di StockFun che partono disattivate; ciascuna può solo trattenere un prezzo, mai cambiarlo.

  • Un'operazione societaria. Mentre un'azione ne attraversa una, il suo token dice che il suo oracolo è in pausa, e il suo feed di prezzo mantiene il suo ultimo valore, che può ancora sembrare fresco mentre il moltiplicatore del token cambia. L'oracolo ora trattiene il prezzo di quell'azione: la sua tratta d'acquisto fallisce da sola, con il suo cash conservato per essa, e le altre azioni del basket vengono acquistate. Il controllo è attivo per ogni azione del rail Robinhood, azione per azione, così un token la cui risposta non si può usare, o il cui flag resta attivo, può essere disattivato da solo. Un token che non risponde conta come non in pausa: Robinhood definisce il flag indicativo, e il controllo di freschezza proprio del feed resta la protezione principale.
  • Il sequencer. Robinhood Chain è una chain Arbitrum con un unico sequencer. Con il feed di uptime del sequencer L2 di Chainlink, l'oracolo trattiene ogni prezzo finché il sequencer è fermo, è ripartito entro il periodo di grazia (un'ora di default), o il feed non si può leggere. Non esiste alcun feed del genere per Robinhood Chain, e Chainlink non li aggiunge più alle nuove reti: il rail viene deployato con questo controllo disattivato, per una scelta esplicita che lo script di deploy richiede, e l'owner di StockFun imposta il feed se mai ne viene pubblicato uno.

Su Ethereum entrambe restano disattivate. Vedi Il rail Robinhood.

2026-10-06 — L'ottavo ciclo di audit

L'ottavo ciclo ha trovato un problema di gravità media e otto di gravità bassa, ciascuno corretto lo stesso giorno con un test, non deployato; i contratti e le protezioni dei feed di prezzo erano puliti. Prima che l'app avesse letto il registro dei basket della chain, il suo modulo di lancio offriva i basket configurati con i loro numeri configurati: su un deploy che numerasse i suoi basket in altro modo, un creatore poteva lanciare un mercato, in modo irreversibile, su un basket diverso da quello mostrato. Il modulo ora offre solo i basket letti dalla chain, e rilegge dalla factory quello scelto subito prima dell'invio, che rifiuta se il nome o le azioni differiscono.

Corretti anche: il keeper segue un batch del bridge solo una volta che il blocco che lo contiene è profondo qualche blocco, così una riorganizzazione dei blocchi più recenti di Ethereum non può più lasciarlo a seguire identificatori che non esistono mai; distingue la polvere che il bridge non può trasportare da un'azione la cui commissione LayerZero non si può quotare, che ora lascia fuori con un'allerta invece di scartarla in silenzio; conserva un'unica allerta in attesa per allerta distinta, con quante volte e quando è stata lanciata, così le allerte ripetute a ogni ciclo non scalzano più un'allerta isolata; non mette più da parte un file di stato scritto per un'altra chain prima di aver verificato quale chain serve il suo RPC, e richiede entrambi gli identificatori di chain; legge un ticket qualche blocco sotto l'ultimo, che ogni nodo di un endpoint ha; e sul rail locale conta una sola volta l'apertura della finestra. Il keeper, il suo preflight e il suo ispettore conoscono ora le protezioni dei feed di prezzo: gli acquisti su Robinhood Chain attendono finché l'oracolo trattiene i prezzi per il sequencer, con un'allerta, e un'azione in un'operazione societaria attende da sola, mai contata come un fallimento. Il Worker dati dell'app non fa mai arretrare la sua finestra dei trade, così un nodo qualche blocco indietro non fa più contare due volte dei blocchi al volume a 24 ore; il suo proxy RPC rifiuta qualsiasi cosa non sia un indirizzo; pubblica perché manca il prezzo di un'azione (schema di dati 8), cosa che l'app mostra; e il pannello di trading addebita a un wallet nella whitelist la tassa normale durante la finestra anti-snipe, come fa l'hook. La Lens non cambia, e il Worker e l'app si deployano ancora in qualsiasi ordine. Vedi Il keeper e La dapp.

2026-10-06 — Il gas della consegna dell'airdrop con Glamsterdam

Sepolia ha attivato l'aggiornamento Glamsterdam di Ethereum il 2026-10-06, durante l'esecuzione su testnet con LayerZero (sotto); Hoodi e la mainnet non avevano ancora una data. Riprezza la crescita dello stato: un nuovo slot di storage scritto a freddo costa 110.020 gas, contro 22.100 prima. Ogni cifra di gas fissa dei contratti e degli script è stata misurata di nuovo su Sepolia, e tutte reggono tranne una coppia, il gas che una consegna dell'airdrop riceve su Ethereum: l'invio del vault speculare portava un'unica cifra di compose, 600.000, e il lzReceive dell'OFT dell'azione riceveva solo ciò che quell'OFT impone. Ogni consegna del primo ciclo dell'esecuzione è rimasta senza gas presso l'executor di LayerZero ed è stata eseguita a mano. Il decimo ciclo di audit ne ha trovati poi altri due: il gas proprio degli script di deploy e quello del compose del bridge per un batch (sotto).

La decisione del fondatore, lo stesso giorno: il keeper simula ogni consegna e ne sceglie il gas, contenuto entro limiti che l'owner di StockFun fissa sull'hub remoto; una consegna ancora bloccata viene rieseguita dal keeper, e segnalata con un'allerta a un secondo fallimento. Nel codice, non deployato sulla mainnet:

  • L'hub remoto detiene due politiche di gas, ciascuna con un default, un minimo e un massimo: il gas di lzReceive oltre a ciò che impone l'OFT dell'azione, 650.000 tra 200.000 e 1.500.000 (setAirdropReceiveGas), e il gas del compose, 1.250.000 tra 600.000 e 4.000.000 (setAirdropComposeGas). Il sendToAirdrop(stocks, receiveGas, composeGas) del vault speculare invia ciò che l'hub concede per ciò che chiede il keeper, e zero prende il default; la chiamata con le sole azioni prende entrambi i default. Un hub aggiornato con un upgrade da prima delle politiche rifiuta ogni invio finché entrambe non sono impostate
  • Il keeper simula il lzReceive e il compose di ogni azione su Ethereum, dall'indirizzo dell'endpoint, e chiede il fabbisogno più il 25 %; quando una simulazione non può girare, prende ciò che hanno usato le ultime consegne del mercato, poi i default dell'hub. Una consegna che resta memorizzata sull'endpoint, una volta che l'executor di LayerZero l'ha fatta fallire o dopo dieci minuti, viene rieseguita dalla chiave stessa del keeper, con il suo fabbisogno simulato più il 25 %, al massimo 4.000.000 gas di default; una che non può partire è oggetto di un'allerta con il comando per eseguirla a mano, e un secondo fallimento è oggetto di un'allerta e non viene mai inviato di nuovo
  • L'app riscuote cinque finestre per transazione invece di dieci, lascia 400.000 gas per ogni azione che una finestra può ancora ricevere, e aggiungeva 150.000 gas alla stima di ogni scrittura, cosa che il nono ciclo di audit ha sostituito con il limite proprio di ogni scrittura (sotto)

La correzione è stata applicata con un upgrade all'hub remoto e al vault speculare dell'esecuzione su testnet, e ne ha sostenuto i cicli successivi. Vedi Il keeper e Il rail Robinhood.

2026-10-06 — L'esecuzione su testnet con LayerZero

Il protocollo è stato deployato su Sepolia e sulla testnet di Robinhood Chain, con gli script di produzione o con wrapper di testnet che ne mantengono il corpo, in 167 transazioni, tutte riuscite, con azioni di test, adapter di test, un USDG di test e feed simulati, ed è girato dalle 13:50 alle 19:07 UTC: sette finestre orarie, l'ETH di ciascuna convertito, passato dal bridge via LayerZero e speso sulle azioni di test; sei cicli dell'airdrop rinviati via LayerZero, i primi quattro riscossi per intero da cinque holder, ogni pagamento esattamente la quota calcolata dal registratore della detenzione; le esercitazioni di incidente svolte su messaggi reali e recuperate come documentato, tranne due metà. L'esecuzione dimostra il codice di StockFun sugli endpoint, sul DVN e sull'executor reali di LayerZero. Non dimostra la coppia USDG di Paxos, le azioni di Robinhood e i loro adapter, feed o liquidità reali, né il gas, le commissioni e la finalità della mainnet: resta una prova sulla mainnet. Ciò che ha trovato nel codice di produzione è il riprezzamento di Glamsterdam (sopra) e parte del nono ciclo di audit (sotto). Vedi Il rail Robinhood.

2026-10-06 — Il nono ciclo di audit, e il gate di verifica

Il nono ciclo ha rivisto le correzioni dell'ottavo, e ha raccolto i rilievi dell'operatore dell'esecuzione su testnet con LayerZero. Ha trovato due problemi di gravità media, il gas della consegna dell'airdrop (sopra) e il Worker dati dell'app, che ricostruiva il suo failover RPC a ogni espulsione del suo oggetto Cloudflare, il che, durante un'interruzione dell'RPC principale, gli inviava 37 richieste in meno di sette minuti dove ora ne partono 8; e problemi di gravità bassa nel keeper, nel Worker e in uno script di testnet, ciascuno corretto lo stesso giorno con un test. Per un minuto dopo una delle sue transazioni, il keeper legge ciò che ha cambiato, e stima il gas di ciò che invia dopo, al blocco di quella transazione, così un nodo indietro di un blocco non trasforma più in un falso fallimento il batch del bridge inviato subito dopo una conversione; ogni sua transazione parte con il suo gas stimato più il 25 %; le allerte che non ha potuto consegnare partono nell'ordine in cui sono state lanciate per ultime; un ticket che la sua stessa riesecuzione ha cancellato non viene più segnalato come vivo; un orario della chain che nessuna data può contenere si legge "an unknown time"; decodifica gli errori dell'oracolo; e il suo preflight gira sul deploy dell'esecuzione su testnet. Il Worker registra il numero di blocco proprio di Robinhood Chain.

Da questo ciclo un secondo agente rivede la modifica di ogni correzione prima che venga inviata al repository, rispetto alle classi di difetto che i cicli precedenti hanno trovato, la maggior parte nelle correzioni del ciclo precedente: il gate di verifica. Ciò che trova viene corretto come un rilievo di revisione, e quella correzione ripassa dal gate. In questo ciclo ha trovato difetti di gravità bassa in varie correzioni, tra cui una riesecuzione che credeva a un'allerta che chiunque può emettere, ora creduta solo se viene dall'executor di LayerZero, e un'altra che decideva un'esecuzione fallita al blocco stesso di quell'esecuzione, cosa che una riorganizzazione del blocco avrebbe potuto trasformare in un falso secondo fallimento: ora attende che il blocco sia profondo qualche blocco. Tutti sono corretti.

La revisione del Worker e dell'app dello stesso ciclo ha poi trovato un altro problema di gravità media, i 150.000 gas che l'app aggiungeva alla stima di una scrittura, che non bastavano quando un trade incontra più storage nuovo del segno di supply dell'ora, corretto lo stesso giorno: ogni scrittura riceve ora la sua stima più 50.000 gas, e un trade anche il gas di ogni scrittura che la sua stima non può vedere e che può ancora avvenire, letto al blocco della stima; una scrittura la cui stima fallisce parte con un limite fisso, e un lancio allora attende. I suoi due rilievi di gravità bassa sono stati corretti anche loro: un piatto che è una stima viene contrassegnato con "+" ovunque compaia, e un'approvazione che non si può leggere non viene mai presa per nessuna. Il ciclo non è pulito, e il conteggio dei cicli puliti resta a zero. Vedi Il keeper e La dapp.

2026-10-06 — Il decimo ciclo di audit

Il decimo ciclo ha rivisto le correzioni del nono e il lavoro sull'aggiornamento Glamsterdam di Ethereum, ogni area da un'angolazione propria: i contratti con i nuovi prezzi del gas, ogni messaggio cross-chain che fallisce a destinazione, il keeper sull'arco di mesi, l'app con wallet reali, e i documenti rispetto al codice. Ha trovato tre problemi di gravità media e sei di gravità bassa, ciascuno corretto lo stesso giorno con un test, ogni correzione rivista dal gate di verifica, non deployato sulla mainnet. I contratti sono risultati puliti sotto l'angolazione del gas con entrambe le tabelle di prezzo.

  • La procedura di deploy con Glamsterdam. Il deploy documentato su Ethereum non poteva riuscire: lo strumento di deploy dava a ogni transazione il gas della sua simulazione locale, ai prezzi vecchi, mentre la creazione di un contratto ora ne richiede da quattro a sette volte tanto. Ogni trasmissione ora chiede al nodo il gas di ogni transazione una volta minata la precedente; eseguita su Sepolia
  • Il gas di compose di un batch del bridge. L'ultimo passo di un batch del bridge su Robinhood Chain riceveva un'unica cifra di gas fissa, 1.200.000, qualunque cosa contenesse il batch: quattro nuovi mercati a cinque azioni l'hanno lasciato senza gas, il loro USDG è rimasto allora sull'hub remoto senza alcuna registrazione, e ogni batch successivo con gli stessi mercati falliva allo stesso modo. Ora il gas è una base più una parte per mercato, 200.000 e 400.000 di default, entrambe impostazioni dell'owner di StockFun, e un batch porta al massimo 17 mercati, il che tiene il suo messaggio sotto il limite di dimensione di LayerZero e il suo gas sotto il limite per transazione di Robinhood Chain; il keeper ne invia al massimo altrettanti e lascia il resto al suo giro successivo, prima i mercati che attendono da più tempo. Il gas in più costa poco: l'executor di LayerZero lo fattura al prezzo del gas di Robinhood Chain, 0,00001 ETH per milione di gas sulla testnet. L'allerta del keeper per un trasferimento bloccato ora dice a che punto è il messaggio del batch. L'adapter della testnet è stato aggiornato con un upgrade lo stesso giorno e il suo batch successivo è passato con il nuovo gas
  • La sorveglianza delle emergenze. Il keeper nominava tutti i vault sorvegliati in un'unica richiesta di log, che un endpoint rifiuta oltre il suo limite: una volta che il registro lo avesse superato, nessun trasferimento di emergenza sarebbe più stato inoltrato. Ora li nomina a gruppi, limitati da una nuova variabile
  • Correzioni minori. I testi di errore del keeper conservano di un indirizzo RPC solo l'host; le sue letture di ogni mercato passano da Multicall3, cento mercati per chiamata, invece che una per una a ogni giro; l'app segue una transazione che il wallet annulla o sostituisce, senza mai mostrare un annullamento come fatto, e per un minuto dopo la propria transazione legge a un blocco non anteriore a quello di quella transazione, così una vendita subito dopo la sua approvazione non viene più rifiutata da un nodo indietro di un blocco; e due documenti sono stati allineati al codice

Con il suo default di inviare dopo la sessione USA, il keeper ora rilegge un vault senza nulla da inviare dopo la chiusura solo alla sessione successiva. Una conseguenza di questo risparmio, e non una regola nuova: un'azione data a un vault dopo la chiusura, al di fuori di qualsiasi acquisto, parte con l'invio della sessione successiva, in una finestra più tarda; ciò che portano gli acquisti del vault stesso va sempre nella finestra terminata quel giorno.

L'audit ha anche valutato una raccomandazione, non un difetto: riscossioni che lascino un wei in ciascuno degli accumuli di commissioni dell'hook, perché il trade successivo non paghi mai la scrittura di quegli slot da zero. Per ora non è adottata. Il gas in più ricade sul primo trade dopo ogni riscossione, circa 104.000 per slot, e il margine dell'app per esso alza il limite di un trade, non ciò che paga; la modifica toccherebbe codice di riscossione le cui regole formali non potrebbero essere dimostrate di nuovo senza un'esecuzione del prover; e l'hook e il burner possono adottarla più tardi tramite upgrade, senza migrazione. Il ciclo non è pulito, e il conteggio dei cicli puliti resta a zero. Vedi Il keeper, Il rail Robinhood e La dapp.