channeldb: add method Registrable to decide adding HTLCs
This commit adds a new method, `Registrable`, to help decide whether adding new HTLCs to a given payment is allowed. A new unit test, `TestRegistrable` is also added to test it.
This commit is contained in:
1 parent
c71601124a
commit
09b67af48d
4 files changed
+175
-47
No files matched your search
@@ -235,6 +235,44 @@ func (m *MPPayment) GetAttempt(id uint64) (*HTLCAttempt, error) {
|
||||
return nil, errors.New("htlc attempt not found on payment")
|
||||
}
|
||||
|
||||
// Registrable returns an error to specify whether adding more HTLCs to the
|
||||
// payment with its current status is allowed. A payment can accept new HTLC
|
||||
// registrations when it's newly created, or none of its HTLCs is in a terminal
|
||||
// state.
|
||||
func (m *MPPayment) Registrable() error {
|
||||
// Get the terminal info.
|
||||
settle, reason := m.TerminalInfo()
|
||||
settled := settle != nil
|
||||
failed := reason != nil
|
||||
|
||||
// If updating the payment is not allowed, we can't register new HTLCs.
|
||||
// Otherwise, the status must be either `StatusInitiated` or
|
||||
// `StatusInFlight`.
|
||||
if err := m.Status.updatable(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Exit early if this is not inflight.
|
||||
if m.Status != StatusInFlight {
|
||||
return nil
|
||||
}
|
||||
|
||||
// There are still inflight HTLCs and we need to check whether there
|
||||
// are settled HTLCs or the payment is failed. If we already have
|
||||
// settled HTLCs, we won't allow adding more HTLCs.
|
||||
if settled {
|
||||
return ErrPaymentPendingSettled
|
||||
}
|
||||
|
||||
// If the payment is already failed, we won't allow adding more HTLCs.
|
||||
if failed {
|
||||
return ErrPaymentPendingFailed
|
||||
}
|
||||
|
||||
// Otherwise we can add more HTLCs.
|
||||
return nil
|
||||
}
|
||||
|
||||
// serializeHTLCSettleInfo serializes the details of a settled htlc.
|
||||
func serializeHTLCSettleInfo(w io.Writer, s *HTLCSettleInfo) error {
|
||||
if _, err := w.Write(s.Preimage[:]); err != nil {
|
||||
|
||||
Reference in new issue
Block a user