github.com/cosmos/cosmos-sdk@v0.50.10/codec/address/bech32_codec.go (about) 1 package address 2 3 import ( 4 "errors" 5 "strings" 6 7 "cosmossdk.io/core/address" 8 errorsmod "cosmossdk.io/errors" 9 10 sdk "github.com/cosmos/cosmos-sdk/types" 11 "github.com/cosmos/cosmos-sdk/types/bech32" 12 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" 13 ) 14 15 type Bech32Codec struct { 16 Bech32Prefix string 17 } 18 19 var _ address.Codec = &Bech32Codec{} 20 21 func NewBech32Codec(prefix string) address.Codec { 22 return Bech32Codec{prefix} 23 } 24 25 // StringToBytes encodes text to bytes 26 func (bc Bech32Codec) StringToBytes(text string) ([]byte, error) { 27 if len(strings.TrimSpace(text)) == 0 { 28 return []byte{}, errors.New("empty address string is not allowed") 29 } 30 31 hrp, bz, err := bech32.DecodeAndConvert(text) 32 if err != nil { 33 return nil, err 34 } 35 36 if hrp != bc.Bech32Prefix { 37 return nil, errorsmod.Wrapf(sdkerrors.ErrLogic, "hrp does not match bech32 prefix: expected '%s' got '%s'", bc.Bech32Prefix, hrp) 38 } 39 40 if err := sdk.VerifyAddressFormat(bz); err != nil { 41 return nil, err 42 } 43 44 return bz, nil 45 } 46 47 // BytesToString decodes bytes to text 48 func (bc Bech32Codec) BytesToString(bz []byte) (string, error) { 49 if len(bz) == 0 { 50 return "", nil 51 } 52 53 text, err := bech32.ConvertAndEncode(bc.Bech32Prefix, bz) 54 if err != nil { 55 return "", err 56 } 57 58 return text, nil 59 }