Files
plm-lottery/docs/guida-utente.md
T
davideandClaude Opus 5 8dd913ec59 Always keep a change output, so every tx stays fee-bumpable (B-62)
The max-amount checkbox sends amount_sats == the whole confirmed balance, so
change came out at 0, the change output was dropped, and the transaction had a
single output. bump_fee has nothing to shrink there: it raised RbfError every
30s until the reconciler abandoned the row six hours later. The RBF
single-change-output limitation was a documented gap, but the UI made it the
*default* withdrawal path.

The extra-input fallback would not have helped this case: a transaction moving
the entire balance already spends every UTXO the sender has. So the fix is at
build time — build_signed_transaction never produces a change output below
DUST_LIMIT_SATS, and never folds it into the fee either:

- withdrawals pass reduce_amount_to_keep_change=True and move a dust limit less.
  The fee already comes out of the withdrawn amount by design, so this is the
  same rule applied a little harder, and Withdrawal.amount_requested_sats vs
  amount_sent_sats already existed to record the difference.
- bets don't: the bet is a fixed price that can't be quietly reduced. A balance
  exactly equal to the bet is refused with balance_leaves_no_change (translated
  into all 7 languages, carrying required_extra_sats), which turns "a user's
  balance must never exactly equal the bet" from a documented assumption into an
  enforced one — and stops an unbumpable bet from holding a round open until the
  reconciler gives up on it.

bump_fee's no-change guard stays: a single-output tx broadcast before this
change can still be pending across the deploy, and it must fail loudly rather
than start shrinking a recipient's output. Its test now hand-builds that shape,
precisely because the builder no longer will.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 23:36:55 +02:00

165 lines
7.8 KiB
Markdown

# Guida utente
Come usare PLM Lottery dall'interfaccia web (`https://<host>/` — vedi
[running-the-server.md](running-the-server.md) per come avviare il server).
## Registrazione e accesso
Nella schermata iniziale trovi due tab: **Registrati** e **Login**.
- **Registrati**: scegli username e password. Al termine ti viene assegnato
automaticamente un **indirizzo di deposito personale** (derivato
server-side) — è per sempre tuo, e riceverai anche eventuali vincite su
quello stesso indirizzo.
- **Login**: se hai già un account, accedi con username e password.
La sessione resta salvata nel browser (fino al logout): non serve rifare
login ogni volta che riapri la pagina.
## La dashboard
Dopo l'accesso vedi, in ordine:
1. **Barra di navigazione** (fissa in alto) — il tuo username e il bottone
"Esci" (logout) nella riga superiore, e i tab delle sezioni subito sotto
2. **Card del round corrente** — sempre visibile, indipendentemente dalla
sezione che stai guardando:
- numero del round e stato (*aperto*, *in chiusura*, *estrazione in
corso*, *pagamento in corso*)
- **timer** che conta alla rovescia il tempo rimanente prima della
chiusura del round
- **giocatori**: quanti hanno già piazzato una bet in questo round
- **jackpot**: quanto riceverà chi vince questo round
3. **Tab di navigazione** con quattro sezioni:
### Estrazione del vincitore
Appena il timer arriva a zero, **nessun nuovo giocatore può più entrare nel
round** — è un "semaforo giallo": il conteggio raggiunto lo zero blocca da
subito le nuove giocate, ma il round non chiude immediatamente. Se qualcuno
aveva già piazzato una bet negli ultimi istanti (transazione trasmessa ma
non ancora confermata), il round aspetta che anche quella si confermi prima
di procedere, così nessuna giocata già fatta viene persa al confine del
round. Solo a quel punto la card mostra un messaggio di stato ("Round
chiuso — attesa conferma puntate…", poi "Estrazione in corso…", poi
"Pagamento al vincitore in corso…") al posto del timer — la stessa cosa
compare nella dashboard di **ogni** utente, anche di chi non ha giocato in
questo round. Questo messaggio resta visibile per l'intera durata della fase
(chiusura → estrazione → pagamento), perché sotto la copertina servono
**fino a tre conferme sulla rete PLM in sequenza**, una diversa dall'altra:
1. conferma dell'ultima giocata rimasta in sospeso (se ce n'era una proprio
allo scadere del timer — altrimenti questo passo è già superato);
2. un nuovo blocco dopo la chiusura, il cui hash serve a scegliere il
vincitore;
3. la conferma della transazione che paga effettivamente la vincita.
Con un blocco PLM ogni ~2 minuti, il tempo reale dall'azzeramento del
timer all'accredito della vincita è quindi in media **4-6 minuti** (se
c'era una giocata da confermare all'ultimo istante) o **2-4 minuti** (se
tutte le giocate erano già confermate prima dello zero) — non pochi
secondi, ed è normale.
Se **hai giocato in questo round**, appena il vincitore è determinato compare
**in aggiunta** (non al posto del messaggio di stato sopra, che resta
visibile finché il pagamento non è confermato) un secondo riquadro solo per
te:
- **"🎉 Hai vinto! +N PLM"** se sei tu il vincitore — l'importo ti verrà
accreditato non appena la transazione di payout viene confermata (il
round successivo non si apre finché questo non accade)
- **"Non hai vinto questa volta."** altrimenti
Chi non ha giocato in questo round non vede mai questo secondo riquadro,
solo il messaggio di stato generico. Il riquadro personale resta visibile
anche **dopo un refresh della pagina** (persiste nel browser), fino
all'apertura del round successivo — non serve restare sulla pagina per non
perderlo, e se hai perso completamente la finestra in tempo reale (es. tab in
background per diversi minuti), lo vedrai comunque comparire non appena
riapri la dashboard.
La dashboard si aggiorna anche **in tempo reale**, non solo a intervalli
fissi: appena qualcosa cambia sul server (una giocata, un cambio di fase del
round, un nuovo blocco confermato...) la pagina lo recepisce quasi subito,
senza bisogno di premere "Aggiorna" o ricaricare.
### Avviso di manutenzione
Se l'operatore ha messo in pausa la lotteria per manutenzione, in cima alla
pagina (visibile anche prima del login) compare un avviso: il round
eventualmente in corso viene comunque **completato normalmente**, vincitore
incluso, ma **non ne parte uno nuovo** finché la manutenzione non termina.
L'avviso sparisce da solo appena l'operatore riprende la lotteria.
### Deposito
- Il tuo **saldo interno**, con bottone "Aggiorna" per ricontrollarlo. Il
numero mostrato include anche il resto di una bet o un prelievo appena
inviati (non ancora confermato sulla rete) — non solo la parte già
confermata — così non sembra che il saldo sia crollato più del dovuto
subito dopo un'operazione. Il colore indica lo stato:
- **verde**: tutto confermato, il saldo mostrato è quello definitivo
- **arancione**: c'è una bet o un prelievo ancora in attesa di conferma —
il numero è corretto, ma non ancora "finale"
- Il tuo **indirizzo di deposito**, con bottone per copiarlo negli appunti
- Il **QR code** dello stesso indirizzo, comodo per inviare PLM da un altro
wallet scansionandolo invece di copiare l'indirizzo a mano
Per depositare, invia PLM (mainnet reale) a quell'indirizzo da un wallet
esterno. Il saldo si aggiorna da solo dopo la prima conferma (e quasi subito,
grazie all'aggiornamento in tempo reale); premi "Aggiorna" se vuoi comunque
ricontrollarlo a mano.
### Bet
Un bottone unico: piazza l'ingresso a costo fisso (mostrato in PLM) nel round
corrente. Puoi avere **al massimo una bet attiva alla volta**. Il costo viene
scalato dal tuo saldo interno.
### Prelievo
Form con due campi:
- **Indirizzo esterno**: dove vuoi ricevere i PLM
- **Importo (PLM)**: quanto prelevare, oppure spunta **"Preleva l'intero
importo"** per prelevare tutto il saldo confermato senza doverlo
ricopiare a mano (il campo importo si disabilita e si aggiorna da solo)
Il prelievo viene costruito e trasmesso sulla rete; la fee di rete viene
scalata dall'importo richiesto (non si aggiunge separatamente). L'importo
minimo prelevabile è pari alla quota fissa di ingresso al round (mostrata
nella sezione Bet).
Con "Preleva l'intero importo" restano sul tuo saldo pochi satoshi (294, cioè
0,00000294 PLM): senza quel resto la transazione non potrebbe essere
ritrasmessa con una fee più alta se la rete fosse lenta, e resterebbe bloccata
per ore. La cifra effettivamente inviata è quindi il saldo meno quei satoshi e
meno la fee di rete.
> **Nota**: attualmente è supportato solo l'indirizzo esterno in formato
> **P2WPKH bech32** (quelli che iniziano con `plm1q...`). Non inserire
> indirizzi legacy (quelli che iniziano con `P...`) o P2SH: al momento
> non sono gestiti correttamente dal server.
### Profilo
Due card:
- **Profilo**: le tue informazioni account — username, indirizzo di
deposito, saldo interno e data di iscrizione. Sola lettura, nessuna
modifica possibile qui.
- **Impostazioni**: form per **cambiare la password**. Serve la password
attuale (per conferma) più la nuova password (minimo 8 caratteri, digitata
due volte). Non richiede un nuovo login: la sessione attiva resta valida
anche dopo il cambio.
Se hai dimenticato la password e non riesci più ad accedere, questa sezione
non ti aiuta (serve la password attuale) — contatta l'operatore della
piattaforma, che può reimpostartene una nuova dal pannello admin.
## Notifiche
Ogni azione (registrazione, login, bet, prelievo, ecc.) mostra un breve
messaggio (toast) verde in caso di successo o rosso in caso di errore, in
basso nella pagina. Se qualcosa non va e il messaggio non basta a capire il
motivo, il dettaglio tecnico è nei log del server (`logs/app.log` o
`data/logs/app.log` con Docker) — non nell'interfaccia.