cosmos-sdk/types/account.go

168 lines
3.9 KiB
Go
Raw Normal View History

2018-01-07 12:27:56 -08:00
package types
2018-01-06 14:22:21 -08:00
import (
2018-03-17 11:18:04 -07:00
"encoding/hex"
"errors"
"fmt"
2018-03-17 11:18:04 -07:00
crypto "github.com/tendermint/go-crypto"
2018-06-01 07:23:58 -07:00
"github.com/tendermint/tmlibs/bech32"
2018-03-01 23:49:07 -08:00
cmn "github.com/tendermint/tmlibs/common"
2018-01-06 14:22:21 -08:00
)
//Address is a go crypto-style Address
2018-03-01 23:49:07 -08:00
type Address = cmn.HexBytes
2018-05-28 16:27:34 -07:00
// Bech32 prefixes
const (
Bech32PrefixAccAddr = "cosmosaccaddr"
Bech32PrefixAccPub = "cosmosaccpub"
Bech32PrefixValAddr = "cosmosvaladdr"
Bech32PrefixValPub = "cosmosvalpub"
)
2018-06-01 07:23:58 -07:00
// Bech32ifyAcc takes Address and returns the bech32 encoded string
func Bech32ifyAcc(addr Address) (string, error) {
return bech32.ConvertAndEncode(Bech32PrefixAccAddr, addr.Bytes())
}
2018-06-07 15:32:14 -07:00
// MustBech32ifyAcc panics on bech32-encoding failure
func MustBech32ifyAcc(addr Address) string {
enc, err := Bech32ifyAcc(addr)
if err != nil {
panic(err)
}
return enc
}
2018-06-01 07:23:58 -07:00
// Bech32ifyAccPub takes AccountPubKey and returns the bech32 encoded string
func Bech32ifyAccPub(pub crypto.PubKey) (string, error) {
return bech32.ConvertAndEncode(Bech32PrefixAccPub, pub.Bytes())
}
2018-06-07 15:32:14 -07:00
// MustBech32ifyAccPub panics on bech32-encoding failure
func MustBech32ifyAccPub(pub crypto.PubKey) string {
enc, err := Bech32ifyAccPub(pub)
if err != nil {
panic(err)
}
return enc
}
2018-06-01 07:23:58 -07:00
// Bech32ifyVal returns the bech32 encoded string for a validator address
func Bech32ifyVal(addr Address) (string, error) {
2018-06-01 07:23:58 -07:00
return bech32.ConvertAndEncode(Bech32PrefixValAddr, addr.Bytes())
}
2018-06-07 15:32:14 -07:00
// MustBech32ifyVal panics on bech32-encoding failure
func MustBech32ifyVal(addr Address) string {
enc, err := Bech32ifyVal(addr)
if err != nil {
panic(err)
}
return enc
}
2018-06-01 07:23:58 -07:00
// Bech32ifyValPub returns the bech32 encoded string for a validator pubkey
func Bech32ifyValPub(pub crypto.PubKey) (string, error) {
return bech32.ConvertAndEncode(Bech32PrefixValPub, pub.Bytes())
}
2018-06-07 15:32:14 -07:00
// MustBech32ifyValPub pancis on bech32-encoding failure
func MustBech32ifyValPub(pub crypto.PubKey) string {
enc, err := Bech32ifyValPub(pub)
if err != nil {
panic(err)
}
return enc
}
2018-03-17 11:18:04 -07:00
// create an Address from a string
func GetAccAddressHex(address string) (addr Address, err error) {
2018-03-17 11:18:04 -07:00
if len(address) == 0 {
return addr, errors.New("must use provide address")
}
bz, err := hex.DecodeString(address)
if err != nil {
return nil, err
}
return Address(bz), nil
}
// create an Address from a string
2018-06-01 07:23:58 -07:00
func GetAccAddressBech32(address string) (addr Address, err error) {
bz, err := GetFromBech32(address, Bech32PrefixAccAddr)
if err != nil {
return nil, err
}
return Address(bz), nil
}
// create a Pubkey from a string
func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) {
bz, err := GetFromBech32(address, Bech32PrefixAccPub)
if err != nil {
return nil, err
}
pk, err = crypto.PubKeyFromBytes(bz)
if err != nil {
return nil, err
}
return pk, nil
}
// create an Address from a hex string
func GetValAddressHex(address string) (addr Address, err error) {
if len(address) == 0 {
return addr, errors.New("must use provide address")
}
bz, err := hex.DecodeString(address)
if err != nil {
return nil, err
}
return Address(bz), nil
}
2018-06-01 07:23:58 -07:00
// create an Address from a bech32 string
func GetValAddressBech32(address string) (addr Address, err error) {
bz, err := GetFromBech32(address, Bech32PrefixValAddr)
if err != nil {
return nil, err
}
return Address(bz), nil
}
2018-06-07 12:36:03 -07:00
// decode a validator public key into a PubKey
2018-06-01 07:23:58 -07:00
func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) {
bz, err := GetFromBech32(pubkey, Bech32PrefixValPub)
if err != nil {
return nil, err
}
pk, err = crypto.PubKeyFromBytes(bz)
if err != nil {
return nil, err
}
return pk, nil
}
2018-05-28 16:27:34 -07:00
// decode a bytestring from a bech32-encoded string
func GetFromBech32(bech32str, prefix string) ([]byte, error) {
2018-06-01 07:23:58 -07:00
if len(bech32str) == 0 {
2018-05-28 16:27:34 -07:00
return nil, errors.New("must provide non-empty string")
}
2018-06-01 07:23:58 -07:00
hrp, bz, err := bech32.DecodeAndConvert(bech32str)
2018-05-28 16:27:34 -07:00
if err != nil {
return nil, err
}
if hrp != prefix {
return nil, fmt.Errorf("invalid bech32 prefix. Expected %s, Got %s", prefix, hrp)
2018-05-28 16:27:34 -07:00
}
return bz, nil
}