github.com/cosmos/cosmos-sdk@v0.50.10/types/address_test.go (about)

     1  package types_test
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"encoding/hex"
     7  	"fmt"
     8  	mathrand "math/rand"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/stretchr/testify/suite"
    14  	"sigs.k8s.io/yaml"
    15  
    16  	"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
    17  	"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
    18  	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
    19  	"github.com/cosmos/cosmos-sdk/types"
    20  	"github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" //nolint:staticcheck // SA1019: legacybech32 is deprecated: use the bech32 package instead.
    21  )
    22  
    23  type addressTestSuite struct {
    24  	suite.Suite
    25  }
    26  
    27  func TestAddressTestSuite(t *testing.T) {
    28  	suite.Run(t, new(addressTestSuite))
    29  }
    30  
    31  func (s *addressTestSuite) SetupSuite() {
    32  	s.T().Parallel()
    33  }
    34  
    35  var invalidStrs = []string{
    36  	"hello, world!",
    37  	"0xAA",
    38  	"AAA",
    39  	types.Bech32PrefixAccAddr + "AB0C",
    40  	types.Bech32PrefixAccPub + "1234",
    41  	types.Bech32PrefixValAddr + "5678",
    42  	types.Bech32PrefixValPub + "BBAB",
    43  	types.Bech32PrefixConsAddr + "FF04",
    44  	types.Bech32PrefixConsPub + "6789",
    45  }
    46  
    47  func (s *addressTestSuite) testMarshal(original, res interface{}, marshal func() ([]byte, error), unmarshal func([]byte) error) {
    48  	bz, err := marshal()
    49  	s.Require().Nil(err)
    50  	s.Require().Nil(unmarshal(bz))
    51  	s.Require().Equal(original, res)
    52  }
    53  
    54  func (s *addressTestSuite) TestEmptyAddresses() {
    55  	s.T().Parallel()
    56  	s.Require().Equal((types.AccAddress{}).String(), "")
    57  	s.Require().Equal((types.ValAddress{}).String(), "")
    58  	s.Require().Equal((types.ConsAddress{}).String(), "")
    59  
    60  	accAddr, err := types.AccAddressFromBech32("")
    61  	s.Require().True(accAddr.Empty())
    62  	s.Require().Error(err)
    63  
    64  	valAddr, err := types.ValAddressFromBech32("")
    65  	s.Require().True(valAddr.Empty())
    66  	s.Require().Error(err)
    67  
    68  	consAddr, err := types.ConsAddressFromBech32("")
    69  	s.Require().True(consAddr.Empty())
    70  	s.Require().Error(err)
    71  }
    72  
    73  func (s *addressTestSuite) TestYAMLMarshalers() {
    74  	addr := secp256k1.GenPrivKey().PubKey().Address()
    75  
    76  	acc := types.AccAddress(addr)
    77  	val := types.ValAddress(addr)
    78  	cons := types.ConsAddress(addr)
    79  
    80  	got, _ := yaml.Marshal(&acc)
    81  	s.Require().Equal(acc.String()+"\n", string(got))
    82  
    83  	got, _ = yaml.Marshal(&val)
    84  	s.Require().Equal(val.String()+"\n", string(got))
    85  
    86  	got, _ = yaml.Marshal(&cons)
    87  	s.Require().Equal(cons.String()+"\n", string(got))
    88  }
    89  
    90  func (s *addressTestSuite) TestRandBech32AccAddrConsistency() {
    91  	pubBz := make([]byte, ed25519.PubKeySize)
    92  	pub := &ed25519.PubKey{Key: pubBz}
    93  
    94  	for i := 0; i < 1000; i++ {
    95  		rand.Read(pub.Key)
    96  
    97  		acc := types.AccAddress(pub.Address())
    98  		res := types.AccAddress{}
    99  
   100  		s.testMarshal(&acc, &res, acc.MarshalJSON, (&res).UnmarshalJSON)
   101  		s.testMarshal(&acc, &res, acc.Marshal, (&res).Unmarshal)
   102  
   103  		str := acc.String()
   104  		res, err := types.AccAddressFromBech32(str)
   105  		s.Require().Nil(err)
   106  		s.Require().Equal(acc, res)
   107  
   108  		str = hex.EncodeToString(acc)
   109  		res, err = types.AccAddressFromHexUnsafe(str)
   110  		s.Require().Nil(err)
   111  		s.Require().Equal(acc, res)
   112  	}
   113  
   114  	for _, str := range invalidStrs {
   115  		_, err := types.AccAddressFromHexUnsafe(str)
   116  		s.Require().NotNil(err)
   117  
   118  		_, err = types.AccAddressFromBech32(str)
   119  		s.Require().NotNil(err)
   120  
   121  		err = (*types.AccAddress)(nil).UnmarshalJSON([]byte("\"" + str + "\""))
   122  		s.Require().NotNil(err)
   123  	}
   124  
   125  	_, err := types.AccAddressFromHexUnsafe("")
   126  	s.Require().Equal(types.ErrEmptyHexAddress, err)
   127  }
   128  
   129  // Test that the account address cache ignores the bech32 prefix setting, retrieving bech32 addresses from the cache.
   130  // This will cause the AccAddress.String() to print out unexpected prefixes if the config was changed between bech32 lookups.
   131  // See https://github.com/cosmos/cosmos-sdk/issues/15317.
   132  func (s *addressTestSuite) TestAddrCache() {
   133  	// Use a random key
   134  	pubBz := make([]byte, ed25519.PubKeySize)
   135  	pub := &ed25519.PubKey{Key: pubBz}
   136  	rand.Read(pub.Key)
   137  
   138  	// Set SDK bech32 prefixes to 'osmo'
   139  	prefix := "osmo"
   140  	conf := types.GetConfig()
   141  	conf.SetBech32PrefixForAccount(prefix, prefix+"pub")
   142  	conf.SetBech32PrefixForValidator(prefix+"valoper", prefix+"valoperpub")
   143  	conf.SetBech32PrefixForConsensusNode(prefix+"valcons", prefix+"valconspub")
   144  
   145  	acc := types.AccAddress(pub.Address())
   146  	osmoAddrBech32 := acc.String()
   147  
   148  	// Set SDK bech32 to 'cosmos'
   149  	prefix = "cosmos"
   150  	conf.SetBech32PrefixForAccount(prefix, prefix+"pub")
   151  	conf.SetBech32PrefixForValidator(prefix+"valoper", prefix+"valoperpub")
   152  	conf.SetBech32PrefixForConsensusNode(prefix+"valcons", prefix+"valconspub")
   153  
   154  	// We name this 'addrCosmos' to prove a point, but the bech32 address will still begin with 'osmo' due to the cache behavior.
   155  	addrCosmos := types.AccAddress(pub.Address())
   156  	cosmosAddrBech32 := addrCosmos.String()
   157  
   158  	// The default behavior will retrieve the bech32 address from the cache, ignoring the bech32 prefix change.
   159  	s.Require().Equal(osmoAddrBech32, cosmosAddrBech32)
   160  	s.Require().True(strings.HasPrefix(osmoAddrBech32, "osmo"))
   161  	s.Require().True(strings.HasPrefix(cosmosAddrBech32, "osmo"))
   162  }
   163  
   164  // Test that the bech32 prefix is respected when the address cache is disabled.
   165  // This causes AccAddress.String() to print out the expected prefixes if the config is changed between bech32 lookups.
   166  // See https://github.com/cosmos/cosmos-sdk/issues/15317.
   167  func (s *addressTestSuite) TestAddrCacheDisabled() {
   168  	types.SetAddrCacheEnabled(false)
   169  
   170  	// Use a random key
   171  	pubBz := make([]byte, ed25519.PubKeySize)
   172  	pub := &ed25519.PubKey{Key: pubBz}
   173  	rand.Read(pub.Key)
   174  
   175  	// Set SDK bech32 prefixes to 'osmo'
   176  	prefix := "osmo"
   177  	conf := types.GetConfig()
   178  	conf.SetBech32PrefixForAccount(prefix, prefix+"pub")
   179  	conf.SetBech32PrefixForValidator(prefix+"valoper", prefix+"valoperpub")
   180  	conf.SetBech32PrefixForConsensusNode(prefix+"valcons", prefix+"valconspub")
   181  
   182  	acc := types.AccAddress(pub.Address())
   183  	osmoAddrBech32 := acc.String()
   184  
   185  	// Set SDK bech32 to 'cosmos'
   186  	prefix = "cosmos"
   187  	conf.SetBech32PrefixForAccount(prefix, prefix+"pub")
   188  	conf.SetBech32PrefixForValidator(prefix+"valoper", prefix+"valoperpub")
   189  	conf.SetBech32PrefixForConsensusNode(prefix+"valcons", prefix+"valconspub")
   190  
   191  	addrCosmos := types.AccAddress(pub.Address())
   192  	cosmosAddrBech32 := addrCosmos.String()
   193  
   194  	// retrieve the bech32 address from the cache, respecting the bech32 prefix change.
   195  	s.Require().NotEqual(osmoAddrBech32, cosmosAddrBech32)
   196  	s.Require().True(strings.HasPrefix(osmoAddrBech32, "osmo"))
   197  	s.Require().True(strings.HasPrefix(cosmosAddrBech32, "cosmos"))
   198  }
   199  
   200  func (s *addressTestSuite) TestValAddr() {
   201  	pubBz := make([]byte, ed25519.PubKeySize)
   202  	pub := &ed25519.PubKey{Key: pubBz}
   203  
   204  	for i := 0; i < 20; i++ {
   205  		rand.Read(pub.Key)
   206  
   207  		acc := types.ValAddress(pub.Address())
   208  		res := types.ValAddress{}
   209  
   210  		s.testMarshal(&acc, &res, acc.MarshalJSON, (&res).UnmarshalJSON)
   211  		s.testMarshal(&acc, &res, acc.Marshal, (&res).Unmarshal)
   212  
   213  		str := acc.String()
   214  		res, err := types.ValAddressFromBech32(str)
   215  		s.Require().Nil(err)
   216  		s.Require().Equal(acc, res)
   217  
   218  		str = hex.EncodeToString(acc)
   219  		res, err = types.ValAddressFromHex(str)
   220  		s.Require().Nil(err)
   221  		s.Require().Equal(acc, res)
   222  
   223  	}
   224  
   225  	for _, str := range invalidStrs {
   226  		_, err := types.ValAddressFromHex(str)
   227  		s.Require().NotNil(err)
   228  
   229  		_, err = types.ValAddressFromBech32(str)
   230  		s.Require().NotNil(err)
   231  
   232  		err = (*types.ValAddress)(nil).UnmarshalJSON([]byte("\"" + str + "\""))
   233  		s.Require().NotNil(err)
   234  	}
   235  
   236  	// test empty string
   237  	_, err := types.ValAddressFromHex("")
   238  	s.Require().Equal(types.ErrEmptyHexAddress, err)
   239  }
   240  
   241  func (s *addressTestSuite) TestConsAddress() {
   242  	pubBz := make([]byte, ed25519.PubKeySize)
   243  	pub := &ed25519.PubKey{Key: pubBz}
   244  
   245  	for i := 0; i < 20; i++ {
   246  		rand.Read(pub.Key[:])
   247  
   248  		acc := types.ConsAddress(pub.Address())
   249  		res := types.ConsAddress{}
   250  
   251  		s.testMarshal(&acc, &res, acc.MarshalJSON, (&res).UnmarshalJSON)
   252  		s.testMarshal(&acc, &res, acc.Marshal, (&res).Unmarshal)
   253  
   254  		str := acc.String()
   255  		res, err := types.ConsAddressFromBech32(str)
   256  		s.Require().Nil(err)
   257  		s.Require().Equal(acc, res)
   258  
   259  		str = hex.EncodeToString(acc)
   260  		res, err = types.ConsAddressFromHex(str)
   261  		s.Require().Nil(err)
   262  		s.Require().Equal(acc, res)
   263  	}
   264  
   265  	for _, str := range invalidStrs {
   266  		_, err := types.ConsAddressFromHex(str)
   267  		s.Require().NotNil(err)
   268  
   269  		_, err = types.ConsAddressFromBech32(str)
   270  		s.Require().NotNil(err)
   271  
   272  		err = (*types.ConsAddress)(nil).UnmarshalJSON([]byte("\"" + str + "\""))
   273  		s.Require().NotNil(err)
   274  	}
   275  
   276  	// test empty string
   277  	_, err := types.ConsAddressFromHex("")
   278  	s.Require().Equal(types.ErrEmptyHexAddress, err)
   279  }
   280  
   281  const letterBytes = "abcdefghijklmnopqrstuvwxyz"
   282  
   283  func RandString(n int) string {
   284  	b := make([]byte, n)
   285  	for i := range b {
   286  		b[i] = letterBytes[mathrand.Intn(len(letterBytes))]
   287  	}
   288  	return string(b)
   289  }
   290  
   291  func (s *addressTestSuite) TestConfiguredPrefix() {
   292  	pubBz := make([]byte, ed25519.PubKeySize)
   293  	pub := &ed25519.PubKey{Key: pubBz}
   294  	for length := 1; length < 10; length++ {
   295  		for times := 1; times < 20; times++ {
   296  			rand.Read(pub.Key[:])
   297  			// Test if randomly generated prefix of a given length works
   298  			prefix := RandString(length)
   299  
   300  			// Assuming that GetConfig is not sealed.
   301  			config := types.GetConfig()
   302  			config.SetBech32PrefixForAccount(
   303  				prefix+types.PrefixAccount,
   304  				prefix+types.PrefixPublic)
   305  
   306  			acc := types.AccAddress(pub.Address())
   307  			s.Require().True(strings.HasPrefix(
   308  				acc.String(),
   309  				prefix+types.PrefixAccount), acc.String())
   310  
   311  			bech32Pub := legacybech32.MustMarshalPubKey(legacybech32.AccPK, pub) //nolint:staticcheck // SA1019: legacybech32 is deprecated: use the bech32 package instead.
   312  			s.Require().True(strings.HasPrefix(
   313  				bech32Pub,
   314  				prefix+types.PrefixPublic))
   315  
   316  			config.SetBech32PrefixForValidator(
   317  				prefix+types.PrefixValidator+types.PrefixAddress,
   318  				prefix+types.PrefixValidator+types.PrefixPublic)
   319  
   320  			val := types.ValAddress(pub.Address())
   321  			s.Require().True(strings.HasPrefix(
   322  				val.String(),
   323  				prefix+types.PrefixValidator+types.PrefixAddress))
   324  
   325  			bech32ValPub := legacybech32.MustMarshalPubKey(legacybech32.ValPK, pub) //nolint:staticcheck // SA1019: legacybech32 is deprecated: use the bech32 package instead.
   326  			s.Require().True(strings.HasPrefix(
   327  				bech32ValPub,
   328  				prefix+types.PrefixValidator+types.PrefixPublic))
   329  
   330  			config.SetBech32PrefixForConsensusNode(
   331  				prefix+types.PrefixConsensus+types.PrefixAddress,
   332  				prefix+types.PrefixConsensus+types.PrefixPublic)
   333  
   334  			cons := types.ConsAddress(pub.Address())
   335  			s.Require().True(strings.HasPrefix(
   336  				cons.String(),
   337  				prefix+types.PrefixConsensus+types.PrefixAddress))
   338  
   339  			bech32ConsPub := legacybech32.MustMarshalPubKey(legacybech32.ConsPK, pub) //nolint:staticcheck // SA1019: legacybech32 is deprecated: use the bech32 package instead.
   340  			s.Require().True(strings.HasPrefix(
   341  				bech32ConsPub,
   342  				prefix+types.PrefixConsensus+types.PrefixPublic))
   343  		}
   344  	}
   345  }
   346  
   347  func (s *addressTestSuite) TestAddressInterface() {
   348  	pubBz := make([]byte, ed25519.PubKeySize)
   349  	pub := &ed25519.PubKey{Key: pubBz}
   350  	rand.Read(pub.Key)
   351  
   352  	addrs := []types.Address{
   353  		types.ConsAddress(pub.Address()),
   354  		types.ValAddress(pub.Address()),
   355  		types.AccAddress(pub.Address()),
   356  	}
   357  
   358  	for _, addr := range addrs {
   359  		switch addr := addr.(type) {
   360  		case types.AccAddress:
   361  			_, err := types.AccAddressFromBech32(addr.String())
   362  			s.Require().Nil(err)
   363  		case types.ValAddress:
   364  			_, err := types.ValAddressFromBech32(addr.String())
   365  			s.Require().Nil(err)
   366  		case types.ConsAddress:
   367  			_, err := types.ConsAddressFromBech32(addr.String())
   368  			s.Require().Nil(err)
   369  		default:
   370  			s.T().Fail()
   371  		}
   372  	}
   373  }
   374  
   375  func (s *addressTestSuite) TestVerifyAddressFormat() {
   376  	addr0 := make([]byte, 0)
   377  	addr5 := make([]byte, 5)
   378  	addr20 := make([]byte, 20)
   379  	addr32 := make([]byte, 32)
   380  	addr256 := make([]byte, 256)
   381  
   382  	err := types.VerifyAddressFormat(addr0)
   383  	s.Require().EqualError(err, "addresses cannot be empty: unknown address")
   384  	err = types.VerifyAddressFormat(addr5)
   385  	s.Require().NoError(err)
   386  	err = types.VerifyAddressFormat(addr20)
   387  	s.Require().NoError(err)
   388  	err = types.VerifyAddressFormat(addr32)
   389  	s.Require().NoError(err)
   390  	err = types.VerifyAddressFormat(addr256)
   391  	s.Require().EqualError(err, "address max length is 255, got 256: unknown address")
   392  }
   393  
   394  func (s *addressTestSuite) TestCustomAddressVerifier() {
   395  	// Create a 10 byte address
   396  	addr := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   397  	accBech := types.AccAddress(addr).String()
   398  	valBech := types.ValAddress(addr).String()
   399  	consBech := types.ConsAddress(addr).String()
   400  	// Verify that the default logic doesn't reject this 10 byte address
   401  	// The default verifier is nil, we're only checking address length is
   402  	// between 1-255 bytes.
   403  	err := types.VerifyAddressFormat(addr)
   404  	s.Require().Nil(err)
   405  	_, err = types.AccAddressFromBech32(accBech)
   406  	s.Require().Nil(err)
   407  	_, err = types.ValAddressFromBech32(valBech)
   408  	s.Require().Nil(err)
   409  	_, err = types.ConsAddressFromBech32(consBech)
   410  	s.Require().Nil(err)
   411  
   412  	// Set a custom address verifier only accepts 20 byte addresses
   413  	types.GetConfig().SetAddressVerifier(func(bz []byte) error {
   414  		n := len(bz)
   415  		if n == 20 {
   416  			return nil
   417  		}
   418  		return fmt.Errorf("incorrect address length %d", n)
   419  	})
   420  
   421  	// Verifiy that the custom logic rejects this 10 byte address
   422  	err = types.VerifyAddressFormat(addr)
   423  	s.Require().NotNil(err)
   424  	_, err = types.AccAddressFromBech32(accBech)
   425  	s.Require().NotNil(err)
   426  	_, err = types.ValAddressFromBech32(valBech)
   427  	s.Require().NotNil(err)
   428  	_, err = types.ConsAddressFromBech32(consBech)
   429  	s.Require().NotNil(err)
   430  
   431  	// Reinitialize the global config to default address verifier (nil)
   432  	types.GetConfig().SetAddressVerifier(nil)
   433  }
   434  
   435  func (s *addressTestSuite) TestBech32ifyAddressBytes() {
   436  	addr10byte := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   437  	addr20byte := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
   438  	type args struct {
   439  		prefix string
   440  		bs     []byte
   441  	}
   442  	tests := []struct {
   443  		name    string
   444  		args    args
   445  		want    string
   446  		wantErr bool
   447  	}{
   448  		{"empty address", args{"prefixa", []byte{}}, "", false},
   449  		{"empty prefix", args{"", addr20byte}, "", true},
   450  		{"10-byte address", args{"prefixa", addr10byte}, "prefixa1qqqsyqcyq5rqwzqf3953cc", false},
   451  		{"10-byte address", args{"prefixb", addr10byte}, "prefixb1qqqsyqcyq5rqwzqf20xxpc", false},
   452  		{"20-byte address", args{"prefixa", addr20byte}, "prefixa1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn7hzdtn", false},
   453  		{"20-byte address", args{"prefixb", addr20byte}, "prefixb1qqqsyqcyq5rqwzqfpg9scrgwpugpzysnrujsuw", false},
   454  	}
   455  	for _, tt := range tests {
   456  		tt := tt
   457  		s.T().Run(tt.name, func(t *testing.T) {
   458  			got, err := types.Bech32ifyAddressBytes(tt.args.prefix, tt.args.bs)
   459  			if (err != nil) != tt.wantErr {
   460  				t.Errorf("Bech32ifyBytes() error = %v, wantErr %v", err, tt.wantErr)
   461  				return
   462  			}
   463  			require.Equal(t, tt.want, got)
   464  		})
   465  	}
   466  }
   467  
   468  func (s *addressTestSuite) TestMustBech32ifyAddressBytes() {
   469  	addr10byte := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   470  	addr20byte := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
   471  	type args struct {
   472  		prefix string
   473  		bs     []byte
   474  	}
   475  	tests := []struct {
   476  		name      string
   477  		args      args
   478  		want      string
   479  		wantPanic bool
   480  	}{
   481  		{"empty address", args{"prefixa", []byte{}}, "", false},
   482  		{"empty prefix", args{"", addr20byte}, "", true},
   483  		{"10-byte address", args{"prefixa", addr10byte}, "prefixa1qqqsyqcyq5rqwzqf3953cc", false},
   484  		{"10-byte address", args{"prefixb", addr10byte}, "prefixb1qqqsyqcyq5rqwzqf20xxpc", false},
   485  		{"20-byte address", args{"prefixa", addr20byte}, "prefixa1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn7hzdtn", false},
   486  		{"20-byte address", args{"prefixb", addr20byte}, "prefixb1qqqsyqcyq5rqwzqfpg9scrgwpugpzysnrujsuw", false},
   487  	}
   488  	for _, tt := range tests {
   489  		tt := tt
   490  		s.T().Run(tt.name, func(t *testing.T) {
   491  			if tt.wantPanic {
   492  				require.Panics(t, func() { types.MustBech32ifyAddressBytes(tt.args.prefix, tt.args.bs) })
   493  				return
   494  			}
   495  			require.Equal(t, tt.want, types.MustBech32ifyAddressBytes(tt.args.prefix, tt.args.bs))
   496  		})
   497  	}
   498  }
   499  
   500  func (s *addressTestSuite) TestAddressTypesEquals() {
   501  	addr1 := secp256k1.GenPrivKey().PubKey().Address()
   502  	accAddr1 := types.AccAddress(addr1)
   503  	consAddr1 := types.ConsAddress(addr1)
   504  	valAddr1 := types.ValAddress(addr1)
   505  
   506  	addr2 := secp256k1.GenPrivKey().PubKey().Address()
   507  	accAddr2 := types.AccAddress(addr2)
   508  	consAddr2 := types.ConsAddress(addr2)
   509  	valAddr2 := types.ValAddress(addr2)
   510  
   511  	// equality
   512  	s.Require().True(accAddr1.Equals(accAddr1))   //nolint:gocritic // checking if these are the same
   513  	s.Require().True(consAddr1.Equals(consAddr1)) //nolint:gocritic // checking if these are the same
   514  	s.Require().True(valAddr1.Equals(valAddr1))   //nolint:gocritic // checking if these are the same
   515  
   516  	// emptiness
   517  	s.Require().True(types.AccAddress{}.Equals(types.AccAddress{})) //nolint:gocritic // checking if these are the same
   518  	s.Require().True(types.AccAddress{}.Equals(types.AccAddress(nil)))
   519  	s.Require().True(types.AccAddress(nil).Equals(types.AccAddress{}))
   520  	s.Require().True(types.AccAddress(nil).Equals(types.AccAddress(nil))) //nolint:gocritic // checking if these are the same
   521  
   522  	s.Require().True(types.ConsAddress{}.Equals(types.ConsAddress{})) //nolint:gocritic // checking if these are the same
   523  	s.Require().True(types.ConsAddress{}.Equals(types.ConsAddress(nil)))
   524  	s.Require().True(types.ConsAddress(nil).Equals(types.ConsAddress{}))
   525  	s.Require().True(types.ConsAddress(nil).Equals(types.ConsAddress(nil))) //nolint:gocritic // checking if these are the same
   526  
   527  	s.Require().True(types.ValAddress{}.Equals(types.ValAddress{})) //nolint:gocritic // checking if these are the same
   528  	s.Require().True(types.ValAddress{}.Equals(types.ValAddress(nil)))
   529  	s.Require().True(types.ValAddress(nil).Equals(types.ValAddress{}))
   530  	s.Require().True(types.ValAddress(nil).Equals(types.ValAddress(nil))) //nolint:gocritic // checking if these are the same
   531  
   532  	s.Require().False(accAddr1.Equals(accAddr2))
   533  	s.Require().Equal(accAddr1.Equals(accAddr2), accAddr2.Equals(accAddr1))
   534  	s.Require().False(consAddr1.Equals(consAddr2))
   535  	s.Require().Equal(consAddr1.Equals(consAddr2), consAddr2.Equals(consAddr1))
   536  	s.Require().False(valAddr1.Equals(valAddr2))
   537  	s.Require().Equal(valAddr1.Equals(valAddr2), valAddr2.Equals(valAddr1))
   538  }
   539  
   540  func (s *addressTestSuite) TestNilAddressTypesEmpty() {
   541  	s.Require().True(types.AccAddress(nil).Empty())
   542  	s.Require().True(types.ConsAddress(nil).Empty())
   543  	s.Require().True(types.ValAddress(nil).Empty())
   544  }
   545  
   546  func (s *addressTestSuite) TestGetConsAddress() {
   547  	pk := secp256k1.GenPrivKey().PubKey()
   548  	s.Require().NotEqual(types.GetConsAddress(pk), pk.Address())
   549  	s.Require().True(bytes.Equal(types.GetConsAddress(pk).Bytes(), pk.Address().Bytes()))
   550  	s.Require().Panics(func() { types.GetConsAddress(cryptotypes.PubKey(nil)) })
   551  }
   552  
   553  func (s *addressTestSuite) TestGetFromBech32() {
   554  	_, err := types.GetFromBech32("", "prefix")
   555  	s.Require().Error(err)
   556  	s.Require().Equal("decoding Bech32 address failed: must provide a non empty address", err.Error())
   557  	_, err = types.GetFromBech32("cosmos1qqqsyqcyq5rqwzqfys8f67", "x")
   558  	s.Require().Error(err)
   559  	s.Require().Equal("invalid Bech32 prefix; expected x, got cosmos", err.Error())
   560  }