82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
package htlcswitch
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/lightningnetwork/lnd/channeldb"
|
|
"github.com/lightningnetwork/lnd/lnwire"
|
|
)
|
|
|
|
var (
|
|
// ErrPaymentIDNotFound is an error returned if the given paymentID is
|
|
// not found.
|
|
ErrPaymentIDNotFound = errors.New("paymentID not found")
|
|
|
|
// ErrPaymentIDAlreadyExists is returned if we try to write a pending
|
|
// payment whose paymentID already exists.
|
|
ErrPaymentIDAlreadyExists = errors.New("paymentID already exists")
|
|
)
|
|
|
|
// PaymentResult wraps a decoded result received from the network after a
|
|
// payment attempt was made. This is what is eventually handed to the router
|
|
// for processing.
|
|
type PaymentResult struct {
|
|
// Preimage is set by the switch in case a sent HTLC was settled.
|
|
Preimage [32]byte
|
|
|
|
// Error is non-nil in case a HTLC send failed, and the HTLC is now
|
|
// irrevocably cancelled. If the payment failed during forwarding, this
|
|
// error will be a *ForwardingError.
|
|
Error error
|
|
}
|
|
|
|
// networkResult is the raw result received from the network after a payment
|
|
// attempt has been made. Since the switch doesn't always have the necessary
|
|
// data to decode the raw message, we store it together with some meta data,
|
|
// and decode it when the router query for the final result.
|
|
type networkResult struct {
|
|
// msg is the received result. This should be of type UpdateFulfillHTLC
|
|
// or UpdateFailHTLC.
|
|
msg lnwire.Message
|
|
|
|
// unencrypted indicates whether the failure encoded in the message is
|
|
// unencrypted, and hence doesn't need to be decrypted.
|
|
unencrypted bool
|
|
|
|
// isResolution indicates whether this is a resolution message, in
|
|
// which the failure reason might not be included.
|
|
isResolution bool
|
|
}
|
|
|
|
// serializeNetworkResult serializes the networkResult.
|
|
func serializeNetworkResult(w io.Writer, n *networkResult) error {
|
|
if _, err := lnwire.WriteMessage(w, n.msg, 0); err != nil {
|
|
return err
|
|
}
|
|
|
|
return channeldb.WriteElements(w, n.unencrypted, n.isResolution)
|
|
}
|
|
|
|
// deserializeNetworkResult deserializes the networkResult.
|
|
func deserializeNetworkResult(r io.Reader) (*networkResult, error) {
|
|
var (
|
|
err error
|
|
)
|
|
|
|
n := &networkResult{}
|
|
|
|
n.msg, err = lnwire.ReadMessage(r, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := channeldb.ReadElements(r,
|
|
&n.unencrypted, &n.isResolution,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return n, nil
|
|
}
|