zpay32: add support for P2TR fallback addresses
This commit is contained in:
2 files changed
+24
-5
No files matched your search
+20
-3
@@ -15,10 +15,18 @@ import (
|
|||||||
"github.com/btcsuite/btcd/btcutil/bech32"
|
"github.com/btcsuite/btcd/btcutil/bech32"
|
||||||
"github.com/btcsuite/btcd/chaincfg"
|
"github.com/btcsuite/btcd/chaincfg"
|
||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
|
"github.com/btcsuite/btcd/txscript"
|
||||||
"github.com/lightningnetwork/lnd/fn/v2"
|
"github.com/lightningnetwork/lnd/fn/v2"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
fallbackVersionWitness = txscript.BaseSegwitWitnessVersion
|
||||||
|
fallbackVersionTaproot = txscript.TaprootWitnessVersion
|
||||||
|
fallbackVersionPubkeyHash = 17
|
||||||
|
fallbackVersionScriptHash = 18
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrInvalidUTF8Description is returned if the invoice description is
|
// ErrInvalidUTF8Description is returned if the invoice description is
|
||||||
// not valid UTF-8.
|
// not valid UTF-8.
|
||||||
@@ -529,7 +537,7 @@ func parseFallbackAddr(data []byte, net *chaincfg.Params) (btcutil.Address, erro
|
|||||||
|
|
||||||
version := data[0]
|
version := data[0]
|
||||||
switch version {
|
switch version {
|
||||||
case 0:
|
case fallbackVersionWitness:
|
||||||
witness, err := bech32.ConvertBits(data[1:], 5, 8, false)
|
witness, err := bech32.ConvertBits(data[1:], 5, 8, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -548,7 +556,16 @@ func parseFallbackAddr(data []byte, net *chaincfg.Params) (btcutil.Address, erro
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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)
|
pubKeyHash, err := bech32.ConvertBits(data[1:], 5, 8, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -558,7 +575,7 @@ func parseFallbackAddr(data []byte, net *chaincfg.Params) (btcutil.Address, erro
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
case 18:
|
case fallbackVersionScriptHash:
|
||||||
scriptHash, err := bech32.ConvertBits(data[1:], 5, 8, false)
|
scriptHash, err := bech32.ConvertBits(data[1:], 5, 8, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
+4
-2
@@ -202,13 +202,15 @@ func writeTaggedFields(bufferBase32 *bytes.Buffer, invoice *Invoice) error {
|
|||||||
var version byte
|
var version byte
|
||||||
switch addr := invoice.FallbackAddr.(type) {
|
switch addr := invoice.FallbackAddr.(type) {
|
||||||
case *btcutil.AddressPubKeyHash:
|
case *btcutil.AddressPubKeyHash:
|
||||||
version = 17
|
version = fallbackVersionPubkeyHash
|
||||||
case *btcutil.AddressScriptHash:
|
case *btcutil.AddressScriptHash:
|
||||||
version = 18
|
version = fallbackVersionScriptHash
|
||||||
case *btcutil.AddressWitnessPubKeyHash:
|
case *btcutil.AddressWitnessPubKeyHash:
|
||||||
version = addr.WitnessVersion()
|
version = addr.WitnessVersion()
|
||||||
case *btcutil.AddressWitnessScriptHash:
|
case *btcutil.AddressWitnessScriptHash:
|
||||||
version = addr.WitnessVersion()
|
version = addr.WitnessVersion()
|
||||||
|
case *btcutil.AddressTaproot:
|
||||||
|
version = addr.WitnessVersion()
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unknown fallback address type")
|
return fmt.Errorf("unknown fallback address type")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user