package paymentsdb import ( "context" "github.com/lightningnetwork/lnd/lntypes" ) // DB represents the interface to the underlying payments database. type DB interface { PaymentReader PaymentWriter } // PaymentReader represents the interface to read operations from the payments // database. type PaymentReader interface { // QueryPayments queries the payments database and should support // pagination. QueryPayments(ctx context.Context, query Query) (Response, error) // FetchPayment fetches the payment corresponding to the given payment // hash. FetchPayment(paymentHash lntypes.Hash) (*MPPayment, error) // FetchInFlightPayments returns all payments with status InFlight. FetchInFlightPayments() ([]*MPPayment, error) } // PaymentWriter represents the interface to write operations to the payments // database. type PaymentWriter interface { // DeletePayment deletes a payment from the DB given its payment hash. DeletePayment(paymentHash lntypes.Hash, failedAttemptsOnly bool) error // DeletePayments deletes all payments from the DB given the specified // flags. DeletePayments(failedOnly, failedAttemptsOnly bool) (int, error) PaymentControl } // PaymentControl represents the interface to control the payment lifecycle and // its database operations. This interface represents the control flow of how // a payment should be handled in the database. They are not just writing // operations but they inherently represent the flow of a payment. The methods // are called in the following order: // // 1. InitPayment // 2. RegisterAttempt (a payment can have multiple attempts) // 3. SettleAttempt or FailAttempt (attempts can also fail as long as the // sending amount will be eventually settled). // 4. Payment succeeds or "Fail" is called. // 5. DeleteFailedAttempts is called which will delete all failed attempts // for a payment to clean up the database. type PaymentControl interface { // InitPayment checks that no other payment with the same payment hash // exists in the database before creating a new payment. However, it // should allow the user making a subsequent payment if the payment is // in a Failed state. InitPayment(lntypes.Hash, *PaymentCreationInfo) error // RegisterAttempt atomically records the provided HTLCAttemptInfo. RegisterAttempt(lntypes.Hash, *HTLCAttemptInfo) (*MPPayment, error) // SettleAttempt marks the given attempt settled with the preimage. If // this is a multi shard payment, this might implicitly mean the // full payment succeeded. // // After invoking this method, InitPayment should always return an // error to prevent us from making duplicate payments to the same // payment hash. The provided preimage is atomically saved to the DB // for record keeping. SettleAttempt(lntypes.Hash, uint64, *HTLCSettleInfo) (*MPPayment, error) // FailAttempt marks the given payment attempt failed. FailAttempt(lntypes.Hash, uint64, *HTLCFailInfo) (*MPPayment, error) // Fail transitions a payment into the Failed state, and records // the ultimate reason the payment failed. Note that this should only // be called when all active attempts are already failed. After // invoking this method, InitPayment should return nil on its next call // for this payment hash, allowing the user to make a subsequent // payment. Fail(lntypes.Hash, FailureReason) (*MPPayment, error) // DeleteFailedAttempts removes all failed HTLCs from the db. It should // be called for a given payment whenever all inflight htlcs are // completed, and the payment has reached a final terminal state. DeleteFailedAttempts(lntypes.Hash) error }