From e746df3caa1e7c3ff21d487742ca86c5ac6d9a99 Mon Sep 17 00:00:00 2001 From: MPins Date: Mon, 8 Sep 2025 16:24:33 -0700 Subject: [PATCH] zpay32: add support for P2TR fallback addresses --- zpay32/decode.go | 23 ++++++++++++++++++++--- zpay32/encode.go | 6 ++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/zpay32/decode.go b/zpay32/decode.go index f97c77838..577f6a6d1 100644 --- a/zpay32/decode.go +++ b/zpay32/decode.go @@ -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 diff --git a/zpay32/encode.go b/zpay32/encode.go index 43ccd5ecb..50f294e51 100644 --- a/zpay32/encode.go +++ b/zpay32/encode.go @@ -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") }