github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/codec/bech32_codec.go (about)

     1  package codec
     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  	text, err := bech32.ConvertAndEncode(bc.bech32Prefix, bz)
    50  	if err != nil {
    51  		return "", err
    52  	}
    53  
    54  	return text, nil
    55  }