zpay32: add support for P2TR fallback addresses

This commit is contained in:
MPins committed 2025-09-12 10:46:17 -07:00
1 parent 5082566ed7
commit e746df3caa
2 files changed
+24 -5

No files matched your search

+20 -3
View File
@@ -15,10 +15,18 @@ import (
"github.com/btcsuite/btcd/btcutil/bech32"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/txscript"
"github.com/lightningnetwork/lnd/fn/v2"
"github.com/lightningnetwork/lnd/lnwire"
)
const (
fallbackVersionWitness = txscript.BaseSegwitWitnessVersion
fallbackVersionTaproot = txscript.TaprootWitnessVersion
fallbackVersionPubkeyHash = 17
fallbackVersionScriptHash = 18
)
var (
// ErrInvalidUTF8Description is returned if the invoice description is
// not valid UTF-8.
@@ -529,7 +537,7 @@ func parseFallbackAddr(data []byte, net *chaincfg.Params) (btcutil.Address, erro
version := data[0]
switch version {
case 0:
case fallbackVersionWitness:
witness, err := bech32.ConvertBits(data[1:], 5, 8, false)
if err != nil {
return nil, err
@@ -548,7 +556,16 @@ func parseFallbackAddr(data []byte, net *chaincfg.Params) (btcutil.Address, erro
if err != nil {
return nil, err
}
case 17:
case fallbackVersionTaproot:
witness, err := bech32.ConvertBits(data[1:], 5, 8, false)
if err != nil {
return nil, err
}
addr, err = btcutil.NewAddressTaproot(witness, net)
if err != nil {
return nil, err
}
case fallbackVersionPubkeyHash:
pubKeyHash, err := bech32.ConvertBits(data[1:], 5, 8, false)
if err != nil {
return nil, err
@@ -558,7 +575,7 @@ func parseFallbackAddr(data []byte, net *chaincfg.Params) (btcutil.Address, erro
if err != nil {
return nil, err
}
case 18:
case fallbackVersionScriptHash:
scriptHash, err := bech32.ConvertBits(data[1:], 5, 8, false)
if err != nil {
return nil, err
+4 -2
View File
@@ -202,13 +202,15 @@ func writeTaggedFields(bufferBase32 *bytes.Buffer, invoice *Invoice) error {
var version byte
switch addr := invoice.FallbackAddr.(type) {
case *btcutil.AddressPubKeyHash:
version = 17
version = fallbackVersionPubkeyHash
case *btcutil.AddressScriptHash:
version = 18
version = fallbackVersionScriptHash
case *btcutil.AddressWitnessPubKeyHash:
version = addr.WitnessVersion()
case *btcutil.AddressWitnessScriptHash:
version = addr.WitnessVersion()
case *btcutil.AddressTaproot:
version = addr.WitnessVersion()
default:
return fmt.Errorf("unknown fallback address type")
}