Skip to content

Commit eb60af8

Browse files
authored
fix: apply multi decode functions instead of string contains check in HexAddressFromBech32String (#454)
* fix: apply multi decode functions instead of string contains check in HexAddressFromBech32String * align for account, validator, and consensus addresses like sdk * https://github.com/cosmos/cosmos-sdk/blob/release/v0.53.x/client/debug/main.go#L262 * test
1 parent 6acac06 commit eb60af8

File tree

3 files changed

+64
-12
lines changed

3 files changed

+64
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
- [\#376](https://github.com/cosmos/evm/pull/376) Fix precompile initialization for local node development script
2323
- [\#384](https://github.com/cosmos/evm/pull/384) Fix debug_traceTransaction RPC failing with block height mismatch errors
2424
- [\#441](https://github.com/cosmos/evm/pull/441) Align precompiles map with available static check to Prague.
25+
- [\#454](https://github.com/cosmos/evm/pull/454) Align multi decode functions instead of string contains check in HexAddressFromBech32String.
2526

2627
### IMPROVEMENTS
2728

utils/utils.go

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,40 @@ func Bech32StringFromHexAddress(hexAddr string) string {
6363
}
6464

6565
// HexAddressFromBech32String converts a hex address to a bech32 encoded address.
66-
func HexAddressFromBech32String(addr string) (res common.Address, err error) {
67-
if strings.Contains(addr, sdk.PrefixValidator) {
68-
valAddr, err := sdk.ValAddressFromBech32(addr)
69-
if err != nil {
70-
return res, err
71-
}
72-
return common.BytesToAddress(valAddr.Bytes()), nil
66+
func HexAddressFromBech32String(addr string) (common.Address, error) {
67+
decodeFns := []func(string) ([]byte, error){
68+
func(s string) ([]byte, error) {
69+
accAddr, err := sdk.AccAddressFromBech32(s)
70+
if err != nil {
71+
return nil, err
72+
}
73+
return accAddr.Bytes(), nil
74+
},
75+
func(s string) ([]byte, error) {
76+
valAddr, err := sdk.ValAddressFromBech32(s)
77+
if err != nil {
78+
return nil, err
79+
}
80+
return valAddr.Bytes(), nil
81+
},
82+
func(s string) ([]byte, error) {
83+
consAddr, err := sdk.ConsAddressFromBech32(s)
84+
if err != nil {
85+
return nil, err
86+
}
87+
return consAddr.Bytes(), nil
88+
},
7389
}
7490

75-
accAddr, err := sdk.AccAddressFromBech32(addr)
76-
if err != nil {
77-
return res, err
91+
var lastErr error
92+
for _, fn := range decodeFns {
93+
bz, err := fn(addr)
94+
if err == nil {
95+
return common.BytesToAddress(bz), nil
96+
}
97+
lastErr = err
7898
}
79-
80-
return common.BytesToAddress(accAddr), nil
99+
return common.Address{}, errorsmod.Wrapf(lastErr, "failed to convert bech32 string to address")
81100
}
82101

83102
// IsSupportedKey returns true if the pubkey type is supported by the chain

utils/utils_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,3 +742,35 @@ func TestCalcBaseFee(t *testing.T) {
742742
})
743743
}
744744
}
745+
746+
func TestHexAddressFromBech32String(t *testing.T) {
747+
accAddr := "cosmos16val7w9lc7wltqvpt0kscaul4xd6l2l43nhcq4"
748+
valAddr := "cosmosvaloper16val7w9lc7wltqvpt0kscaul4xd6l2l458rdvx"
749+
consAddr := "cosmosvalcons16val7w9lc7wltqvpt0kscaul4xd6l2l4q5s3q8"
750+
invalidAddr := "invalid1address"
751+
expectedHex := "0xd33bFF38Bfc79df581815BED0c779FA99BaFAbf5"
752+
753+
testCases := []struct {
754+
name string
755+
input string
756+
wantHex string
757+
wantError bool
758+
}{
759+
{"account address", accAddr, expectedHex, false},
760+
{"validator address", valAddr, expectedHex, false},
761+
{"consensus address", consAddr, expectedHex, false},
762+
{"invalid address", invalidAddr, "", true},
763+
}
764+
765+
for _, tc := range testCases {
766+
t.Run(tc.name, func(t *testing.T) {
767+
addr, err := utils.HexAddressFromBech32String(tc.input)
768+
if tc.wantError {
769+
require.Error(t, err)
770+
} else {
771+
require.NoError(t, err)
772+
require.Equal(t, tc.wantHex, addr.Hex())
773+
}
774+
})
775+
}
776+
}

0 commit comments

Comments
 (0)