2019-10-01 12:22:30 -03:00

68 lines
1.7 KiB
Go

package libwallet
import (
fmt "fmt"
"strings"
"github.com/lightningnetwork/lnd/zpay32"
"github.com/pkg/errors"
)
// Invoice is muun's invoice struct
type Invoice struct {
RawInvoice string
FallbackAddress *MuunPaymentURI
Network *Network
MilliSat string
Destination []byte
PaymentHash [32]byte
Expiry int64
Description string
}
const lightningScheme = "lightning:"
// ParseInvoice parses an Invoice from an invoice string and a network
func ParseInvoice(invoice string, network *Network) (*Invoice, error) {
if strings.HasPrefix(strings.ToLower(invoice), lightningScheme) {
// Remove lightning scheme from rawInvoice
invoice = invoice[len(lightningScheme):len(invoice)]
}
parsedInvoice, err := zpay32.Decode(invoice, network.network)
if err != nil {
return nil, errors.Wrapf(err, "Couldnt parse invoice")
}
var fallbackAdd *MuunPaymentURI
if parsedInvoice.FallbackAddr != nil {
fallbackAdd, err = GetPaymentURI(parsedInvoice.FallbackAddr.String(), network)
if err != nil {
return nil, errors.Wrapf(err, "Couldnt get address")
}
}
var description string
if parsedInvoice.Description != nil {
description = *parsedInvoice.Description
}
var milliSats string
if parsedInvoice.MilliSat != nil {
milliSats = fmt.Sprintf("%v", uint64(*parsedInvoice.MilliSat))
}
return &Invoice{
RawInvoice: invoice,
FallbackAddress: fallbackAdd,
Network: network,
MilliSat: milliSats,
Destination: parsedInvoice.Destination.SerializeCompressed(),
PaymentHash: *parsedInvoice.PaymentHash,
Expiry: parsedInvoice.Timestamp.Unix() + int64(parsedInvoice.Expiry().Seconds()),
Description: description,
}, nil
}