mirror of
https://github.com/muun/recovery.git
synced 2025-11-10 22:10:14 -05:00
Release 2.0.0
This commit is contained in:
78
vendor/github.com/muun/libwallet/invoices.go
generated
vendored
78
vendor/github.com/muun/libwallet/invoices.go
generated
vendored
@@ -5,6 +5,7 @@ import (
|
||||
"crypto/sha256"
|
||||
"encoding/binary"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path"
|
||||
"time"
|
||||
@@ -16,9 +17,9 @@ import (
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
"github.com/lightningnetwork/lnd/netann"
|
||||
"github.com/lightningnetwork/lnd/zpay32"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/muun/libwallet/hdpath"
|
||||
"github.com/muun/libwallet/sphinx"
|
||||
"github.com/muun/libwallet/walletdb"
|
||||
)
|
||||
|
||||
@@ -185,6 +186,9 @@ func CreateInvoice(net *Network, userKey *HDPrivateKey, routeHints *RouteHints,
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if dbInvoice == nil {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
var paymentHash [32]byte
|
||||
copy(paymentHash[:], dbInvoice.PaymentHash)
|
||||
@@ -268,6 +272,76 @@ func CreateInvoice(net *Network, userKey *HDPrivateKey, routeHints *RouteHints,
|
||||
return bech32, nil
|
||||
}
|
||||
|
||||
// ExposePreimage gives the preimage matching a payment hash if we have it
|
||||
func ExposePreimage(paymentHash []byte) ([]byte, error) {
|
||||
|
||||
if len(paymentHash) != 32 {
|
||||
return nil, fmt.Errorf("ExposePreimage: received invalid hash len %v", len(paymentHash))
|
||||
}
|
||||
|
||||
// Lookup invoice data matching this HTLC using the payment hash
|
||||
db, err := openDB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
secrets, err := db.FindByPaymentHash(paymentHash)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not find invoice data for payment hash: %w", err)
|
||||
}
|
||||
|
||||
return secrets.Preimage, nil
|
||||
}
|
||||
|
||||
func IsInvoiceFulfillable(paymentHash, onionBlob []byte, amount int64, userKey *HDPrivateKey, net *Network) error {
|
||||
if len(paymentHash) != 32 {
|
||||
return fmt.Errorf("IsInvoiceFulfillable: received invalid hash len %v", len(paymentHash))
|
||||
}
|
||||
|
||||
// Lookup invoice data matching this HTLC using the payment hash
|
||||
db, err := openDB()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
secrets, err := db.FindByPaymentHash(paymentHash)
|
||||
if err != nil {
|
||||
return fmt.Errorf("IsInvoiceFulfillable: could not find invoice data for payment hash: %w", err)
|
||||
}
|
||||
|
||||
if len(onionBlob) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
identityKeyPath := hdpath.MustParse(secrets.KeyPath).Child(identityKeyChildIndex)
|
||||
|
||||
nodeHDKey, err := userKey.DeriveTo(identityKeyPath.String())
|
||||
if err != nil {
|
||||
return fmt.Errorf("IsInvoiceFulfillable: failed to derive key: %w", err)
|
||||
}
|
||||
nodeKey, err := nodeHDKey.key.ECPrivKey()
|
||||
if err != nil {
|
||||
return fmt.Errorf("IsInvoiceFulfillable: failed to get priv key: %w", err)
|
||||
}
|
||||
|
||||
err = sphinx.Validate(
|
||||
onionBlob,
|
||||
paymentHash,
|
||||
secrets.PaymentSecret,
|
||||
nodeKey,
|
||||
0, // This is used internally by the sphinx decoder but it's not needed
|
||||
lnwire.MilliSatoshi(uint64(amount)*1000),
|
||||
net.network,
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("IsInvoiceFuflillable: invalid sphinx: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type IncomingSwap struct {
|
||||
FulfillmentTx []byte
|
||||
MuunSignature []byte
|
||||
@@ -282,6 +356,7 @@ type IncomingSwap struct {
|
||||
HtlcExpiration int64
|
||||
HtlcBlock []byte // unused
|
||||
ConfirmationTarget int64 // to validate fee rate, unused for now
|
||||
CollectInSats int64
|
||||
}
|
||||
|
||||
func (s *IncomingSwap) VerifyAndFulfill(userKey *HDPrivateKey, muunKey *HDPublicKey, net *Network) ([]byte, error) {
|
||||
@@ -313,6 +388,7 @@ func (s *IncomingSwap) VerifyAndFulfill(userKey *HDPrivateKey, muunKey *HDPublic
|
||||
SwapServerPublicKey: swapServerPublicKey,
|
||||
ExpirationHeight: s.HtlcExpiration,
|
||||
VerifyOutputAmount: true,
|
||||
Collect: btcutil.Amount(s.CollectInSats),
|
||||
}
|
||||
err = coin.SignInput(0, &tx, userKey, muunKey)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user