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 }