Skip to content

Commit da0426a

Browse files
sunnya97cwgoes
authored andcommitted
Merge PR #2601: Bech32 Empty Addresses
1 parent fd5e7b9 commit da0426a

File tree

8 files changed

+84
-22
lines changed

8 files changed

+84
-22
lines changed

PENDING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ BREAKING CHANGES
3535
* [\#3522](https://github.com/cosmos/cosmos-sdk/pull/3522) Get rid of double negatives: Coins.IsNotNegative() -> Coins.IsAnyNegative().
3636
* \#3561 Don't unnecessarily store denominations in staking
3737

38+
3839
* Tendermint
3940

4041

@@ -59,6 +60,7 @@ FEATURES
5960
* [\#3477][distribution] new query endpoint "delegator_validators"
6061
* [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) Provided a lazy loading implementation of Keybase that locks the underlying
6162
storage only for the time needed to perform the required operation. Also added Keybase reference to TxBuilder struct.
63+
* [types] [\#2580](https://github.com/cosmos/cosmos-sdk/issues/2580) Addresses now Bech32 empty addresses to an empty string
6264

6365
* Tendermint
6466

types/address.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"errors"
88
"fmt"
9+
"strings"
910

1011
"github.com/tendermint/tendermint/crypto"
1112
"github.com/tendermint/tendermint/crypto/encoding/amino"
@@ -71,12 +72,21 @@ func AccAddressFromHex(address string) (addr AccAddress, err error) {
7172

7273
// AccAddressFromBech32 creates an AccAddress from a Bech32 string.
7374
func AccAddressFromBech32(address string) (addr AccAddress, err error) {
75+
if len(strings.TrimSpace(address)) == 0 {
76+
return AccAddress{}, nil
77+
}
78+
7479
bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()
80+
7581
bz, err := GetFromBech32(address, bech32PrefixAccAddr)
7682
if err != nil {
7783
return nil, err
7884
}
7985

86+
if len(bz) != AddrLen {
87+
return nil, errors.New("Incorrect address length")
88+
}
89+
8090
return AccAddress(bz), nil
8191
}
8292

@@ -141,7 +151,12 @@ func (aa AccAddress) Bytes() []byte {
141151

142152
// String implements the Stringer interface.
143153
func (aa AccAddress) String() string {
154+
if aa.Empty() {
155+
return ""
156+
}
157+
144158
bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()
159+
145160
bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixAccAddr, aa.Bytes())
146161
if err != nil {
147162
panic(err)
@@ -187,12 +202,21 @@ func ValAddressFromHex(address string) (addr ValAddress, err error) {
187202

188203
// ValAddressFromBech32 creates a ValAddress from a Bech32 string.
189204
func ValAddressFromBech32(address string) (addr ValAddress, err error) {
205+
if len(strings.TrimSpace(address)) == 0 {
206+
return ValAddress{}, nil
207+
}
208+
190209
bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()
210+
191211
bz, err := GetFromBech32(address, bech32PrefixValAddr)
192212
if err != nil {
193213
return nil, err
194214
}
195215

216+
if len(bz) != AddrLen {
217+
return nil, errors.New("Incorrect address length")
218+
}
219+
196220
return ValAddress(bz), nil
197221
}
198222

@@ -258,7 +282,12 @@ func (va ValAddress) Bytes() []byte {
258282

259283
// String implements the Stringer interface.
260284
func (va ValAddress) String() string {
285+
if va.Empty() {
286+
return ""
287+
}
288+
261289
bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()
290+
262291
bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixValAddr, va.Bytes())
263292
if err != nil {
264293
panic(err)
@@ -304,12 +333,21 @@ func ConsAddressFromHex(address string) (addr ConsAddress, err error) {
304333

305334
// ConsAddressFromBech32 creates a ConsAddress from a Bech32 string.
306335
func ConsAddressFromBech32(address string) (addr ConsAddress, err error) {
336+
if len(strings.TrimSpace(address)) == 0 {
337+
return ConsAddress{}, nil
338+
}
339+
307340
bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()
341+
308342
bz, err := GetFromBech32(address, bech32PrefixConsAddr)
309343
if err != nil {
310344
return nil, err
311345
}
312346

347+
if len(bz) != AddrLen {
348+
return nil, errors.New("Incorrect address length")
349+
}
350+
313351
return ConsAddress(bz), nil
314352
}
315353

@@ -380,7 +418,12 @@ func (ca ConsAddress) Bytes() []byte {
380418

381419
// String implements the Stringer interface.
382420
func (ca ConsAddress) String() string {
421+
if ca.Empty() {
422+
return ""
423+
}
424+
383425
bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()
426+
384427
bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixConsAddr, ca.Bytes())
385428
if err != nil {
386429
panic(err)

types/address_test.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
)
1414

1515
var invalidStrs = []string{
16-
"",
1716
"hello, world!",
1817
"0xAA",
1918
"AAA",
@@ -33,6 +32,24 @@ func testMarshal(t *testing.T, original interface{}, res interface{}, marshal fu
3332
require.Equal(t, original, res)
3433
}
3534

35+
func TestEmptyAddresses(t *testing.T) {
36+
require.Equal(t, (types.AccAddress{}).String(), "")
37+
require.Equal(t, (types.ValAddress{}).String(), "")
38+
require.Equal(t, (types.ConsAddress{}).String(), "")
39+
40+
accAddr, err := types.AccAddressFromBech32("")
41+
require.True(t, accAddr.Empty())
42+
require.Nil(t, err)
43+
44+
valAddr, err := types.ValAddressFromBech32("")
45+
require.True(t, valAddr.Empty())
46+
require.Nil(t, err)
47+
48+
consAddr, err := types.ConsAddressFromBech32("")
49+
require.True(t, consAddr.Empty())
50+
require.Nil(t, err)
51+
}
52+
3653
func TestRandBech32PubkeyConsistency(t *testing.T) {
3754
var pub ed25519.PubKeyEd25519
3855

@@ -200,7 +217,7 @@ func TestConfiguredPrefix(t *testing.T) {
200217
config := types.GetConfig()
201218
config.SetBech32PrefixForAccount(prefix+"acc", prefix+"pub")
202219
acc := types.AccAddress(pub.Address())
203-
require.True(t, strings.HasPrefix(acc.String(), prefix+"acc"))
220+
require.True(t, strings.HasPrefix(acc.String(), prefix+"acc"), acc.String())
204221
bech32Pub := types.MustBech32ifyAccPub(pub)
205222
require.True(t, strings.HasPrefix(bech32Pub, prefix+"pub"))
206223

x/distribution/types/msg.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ func (msg MsgSetWithdrawAddress) GetSignBytes() []byte {
4040

4141
// quick validity check
4242
func (msg MsgSetWithdrawAddress) ValidateBasic() sdk.Error {
43-
if msg.DelegatorAddr == nil {
43+
if msg.DelegatorAddr.Empty() {
4444
return ErrNilDelegatorAddr(DefaultCodespace)
4545
}
46-
if msg.WithdrawAddr == nil {
46+
if msg.WithdrawAddr.Empty() {
4747
return ErrNilWithdrawAddr(DefaultCodespace)
4848
}
4949
return nil
@@ -78,10 +78,10 @@ func (msg MsgWithdrawDelegatorReward) GetSignBytes() []byte {
7878

7979
// quick validity check
8080
func (msg MsgWithdrawDelegatorReward) ValidateBasic() sdk.Error {
81-
if msg.DelegatorAddr == nil {
81+
if msg.DelegatorAddr.Empty() {
8282
return ErrNilDelegatorAddr(DefaultCodespace)
8383
}
84-
if msg.ValidatorAddr == nil {
84+
if msg.ValidatorAddr.Empty() {
8585
return ErrNilValidatorAddr(DefaultCodespace)
8686
}
8787
return nil
@@ -114,7 +114,7 @@ func (msg MsgWithdrawValidatorCommission) GetSignBytes() []byte {
114114

115115
// quick validity check
116116
func (msg MsgWithdrawValidatorCommission) ValidateBasic() sdk.Error {
117-
if msg.ValidatorAddr == nil {
117+
if msg.ValidatorAddr.Empty() {
118118
return ErrNilValidatorAddr(DefaultCodespace)
119119
}
120120
return nil

x/gov/msgs.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (msg MsgSubmitProposal) ValidateBasic() sdk.Error {
5959
if !validProposalType(msg.ProposalType) {
6060
return ErrInvalidProposalType(DefaultCodespace, msg.ProposalType)
6161
}
62-
if len(msg.Proposer) == 0 {
62+
if msg.Proposer.Empty() {
6363
return sdk.ErrInvalidAddress(msg.Proposer.String())
6464
}
6565
if !msg.InitialDeposit.IsValid() {
@@ -172,7 +172,7 @@ func (msg MsgVote) Type() string { return TypeMsgVote }
172172

173173
// Implements Msg.
174174
func (msg MsgVote) ValidateBasic() sdk.Error {
175-
if len(msg.Voter.Bytes()) == 0 {
175+
if msg.Voter.Empty() {
176176
return sdk.ErrInvalidAddress(msg.Voter.String())
177177
}
178178
if msg.ProposalID < 0 {

x/slashing/msg.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (msg MsgUnjail) GetSignBytes() []byte {
3636

3737
// quick validity check
3838
func (msg MsgUnjail) ValidateBasic() sdk.Error {
39-
if msg.ValidatorAddr == nil {
39+
if msg.ValidatorAddr.Empty() {
4040
return ErrBadValidatorAddr(DefaultCodespace)
4141
}
4242
return nil

x/staking/keeper/query_utils.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress, s
9090
iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
9191
defer iterator.Close()
9292

93-
srcValFilter := !(srcValAddress.Empty() || srcValAddress == nil)
94-
dstValFilter := !(dstValAddress.Empty() || dstValAddress == nil)
93+
srcValFilter := !(srcValAddress.Empty())
94+
dstValFilter := !(dstValAddress.Empty())
9595

9696
for ; iterator.Valid(); iterator.Next() {
9797
redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value())

x/staking/types/msg.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ func (msg MsgCreateValidator) GetSignBytes() []byte {
123123
// quick validity check
124124
func (msg MsgCreateValidator) ValidateBasic() sdk.Error {
125125
// note that unmarshaling from bech32 ensures either empty or valid
126-
if msg.DelegatorAddr == nil {
126+
if msg.DelegatorAddr.Empty() {
127127
return ErrNilDelegatorAddr(DefaultCodespace)
128128
}
129-
if msg.ValidatorAddr == nil {
129+
if msg.ValidatorAddr.Empty() {
130130
return ErrNilValidatorAddr(DefaultCodespace)
131131
}
132132
if msg.Value.Amount.LTE(sdk.ZeroInt()) {
@@ -186,7 +186,7 @@ func (msg MsgEditValidator) GetSignBytes() []byte {
186186

187187
// quick validity check
188188
func (msg MsgEditValidator) ValidateBasic() sdk.Error {
189-
if msg.ValidatorAddr == nil {
189+
if msg.ValidatorAddr.Empty() {
190190
return sdk.NewError(DefaultCodespace, CodeInvalidInput, "nil validator address")
191191
}
192192

@@ -237,10 +237,10 @@ func (msg MsgDelegate) GetSignBytes() []byte {
237237

238238
// quick validity check
239239
func (msg MsgDelegate) ValidateBasic() sdk.Error {
240-
if msg.DelegatorAddr == nil {
240+
if msg.DelegatorAddr.Empty() {
241241
return ErrNilDelegatorAddr(DefaultCodespace)
242242
}
243-
if msg.ValidatorAddr == nil {
243+
if msg.ValidatorAddr.Empty() {
244244
return ErrNilValidatorAddr(DefaultCodespace)
245245
}
246246
if msg.Value.Amount.LTE(sdk.ZeroInt()) {
@@ -285,13 +285,13 @@ func (msg MsgBeginRedelegate) GetSignBytes() []byte {
285285

286286
// quick validity check
287287
func (msg MsgBeginRedelegate) ValidateBasic() sdk.Error {
288-
if msg.DelegatorAddr == nil {
288+
if msg.DelegatorAddr.Empty() {
289289
return ErrNilDelegatorAddr(DefaultCodespace)
290290
}
291-
if msg.ValidatorSrcAddr == nil {
291+
if msg.ValidatorSrcAddr.Empty() {
292292
return ErrNilValidatorAddr(DefaultCodespace)
293293
}
294-
if msg.ValidatorDstAddr == nil {
294+
if msg.ValidatorDstAddr.Empty() {
295295
return ErrNilValidatorAddr(DefaultCodespace)
296296
}
297297
if msg.SharesAmount.LTE(sdk.ZeroDec()) {
@@ -328,10 +328,10 @@ func (msg MsgUndelegate) GetSignBytes() []byte {
328328

329329
// quick validity check
330330
func (msg MsgUndelegate) ValidateBasic() sdk.Error {
331-
if msg.DelegatorAddr == nil {
331+
if msg.DelegatorAddr.Empty() {
332332
return ErrNilDelegatorAddr(DefaultCodespace)
333333
}
334-
if msg.ValidatorAddr == nil {
334+
if msg.ValidatorAddr.Empty() {
335335
return ErrNilValidatorAddr(DefaultCodespace)
336336
}
337337
if msg.SharesAmount.LTE(sdk.ZeroDec()) {

0 commit comments

Comments
 (0)