Files
ark/common/encoding.go
Marco Argentieri 6608b2cc9a ARK_NETWORK=liquid (#140)
* Update config.go

Signed-off-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>

* common: mainnet > liquid

---------

Signed-off-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>
2024-04-25 20:27:50 +02:00

66 lines
1.4 KiB
Go

package common
import (
"fmt"
"github.com/btcsuite/btcd/btcutil/bech32"
"github.com/decred/dcrd/dcrec/secp256k1/v4"
)
func EncodeAddress(
hrp string, userKey, aspKey *secp256k1.PublicKey,
) (addr string, err error) {
if userKey == nil {
err = fmt.Errorf("missing public key")
return
}
if aspKey == nil {
err = fmt.Errorf("missing asp public key")
return
}
if hrp != Liquid.Addr && hrp != TestNet.Addr {
err = fmt.Errorf("invalid prefix")
return
}
combinedKey := append(
aspKey.SerializeCompressed(), userKey.SerializeCompressed()...,
)
grp, err := bech32.ConvertBits(combinedKey, 8, 5, true)
if err != nil {
return
}
addr, err = bech32.EncodeM(hrp, grp)
return
}
func DecodeAddress(
addr string,
) (hrp string, userKey *secp256k1.PublicKey, aspKey *secp256k1.PublicKey, err error) {
prefix, buf, err := bech32.DecodeNoLimit(addr)
if err != nil {
return
}
if prefix != Liquid.Addr && prefix != TestNet.Addr {
err = fmt.Errorf("invalid prefix")
return
}
grp, err := bech32.ConvertBits(buf, 5, 8, false)
if err != nil {
return
}
aKey, err := secp256k1.ParsePubKey(grp[:33])
if err != nil {
err = fmt.Errorf("failed to parse public key: %s", err)
return
}
uKey, err := secp256k1.ParsePubKey(grp[33:])
if err != nil {
err = fmt.Errorf("failed to parse asp public key: %s", err)
return
}
hrp = prefix
userKey = uKey
aspKey = aKey
return
}