Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

staticaddr/loopin: make canceled-invoice timeout unlock recoverable

Aperta
#1,167 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
go
Ambito
backend, payments

Direzione di ricerca

Inizia con MonitorInvoiceAndHtlcTxAction e la transizione MonitorInvoiceAndHtlcTx su OnSwapTimedOut, quindi esamina UnlockState, OnRecover e unlockDeposits. Esamina la discussione sul recupero e sul ciclo di vita in PR #1161. Il lavoro è completo quando un timeout senza conferma rimane recuperabile e raggiunge Failed solo dopo che i depositi sono stati sbloccati o si è stabilito che non sono necessari.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Problem

A static-address loop-in can reach the canceled-invoice recovery path without a durable guarantee that its deposits were unlocked.

Current monitor flow:

  1. the payment deadline path cancels the invoice and then unlocks deposits:

    cancelInvoice()
    err = f.unlockDeposits(ctx)
    
  2. those are separate side effects. If loopd shuts down, crashes, or the deposit transition fails after invoice cancellation succeeds but before deposits are moved back to Deposited, recovery sees LookupInvoice return ContractCanceled;

  3. in that recovered state no new deadlineChan is created, so the deadline unlock path is not retried;

  4. if the HTLC never confirmed and the CLTV height arrives, MonitorInvoiceAndHtlcTxAction returns OnSwapTimedOut and the loop-in moves to Failed, while deposits may remain stuck in LoopingIn.

This was discussed during PR #1161: https://github.com/lightninglabs/loop/pull/1161#discussion_r3539797010

The issue appears to predate PR #1161, but that PR touched the surrounding recovery/lifecycle code and made the invariant visible.

Potential fix

Route the no-HTLC-confirmation timeout path through a recoverable state-machine unlock state instead of transitioning directly to Failed.

One possible shape:

  • add a success event such as OnDepositsUnlocked;
  • route MonitorInvoiceAndHtlcTx -> OnSwapTimedOut -> UnlockState (or a more specific UnlockDepositsBeforeFail state);
  • make UnlockState retry on OnRecover;
  • only transition UnlockState -> OnDepositsUnlocked -> Failed after unlockDeposits succeeds;
  • if unlockDeposits fails, keep the loop-in in the unlock state so restart/recovery retries cleanup rather than marking the swap failed with deposits possibly still locked.

The important invariant is: a no-confirmation timeout should not become final Failed until deposit unlock has succeeded or is known to be unnecessary.

Lingua principale
Go
Stelle
593
Fork
138
Merge medio
4g 18h
PR unite (30g)
20

Preparare l'ambiente

  • Include un Dockerfile o un file Docker Compose
  • Ha un modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di lightninglabs/loop

Tutte le issue di lightninglabs/loop

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.