diff --git a/x/staking/errors.go b/x/staking/errors.go index 1e3a26a02..77f009fe0 100644 --- a/x/staking/errors.go +++ b/x/staking/errors.go @@ -8,6 +8,7 @@ const ( // Staking errors reserve 300 - 399. CodeEmptyValidator sdk.CodeType = 300 CodeInvalidUnbond sdk.CodeType = 301 + CodeEmptyStake sdk.CodeType = 302 ) func ErrEmptyValidator() sdk.Error { @@ -18,6 +19,10 @@ func ErrInvalidUnbond() sdk.Error { return newError(CodeInvalidUnbond, "") } +func ErrEmptyStake() sdk.Error { + return newError(CodeEmptyStake, "") +} + // ----------------------------- // Helpers diff --git a/x/staking/types.go b/x/staking/types.go index 0ea1796ae..263b8630d 100644 --- a/x/staking/types.go +++ b/x/staking/types.go @@ -30,6 +30,10 @@ func (msg BondMsg) Type() string { } func (msg BondMsg) ValidateBasic() sdk.Error { + if msg.Stake.IsZero() { + return ErrEmptyStake() + } + return nil } diff --git a/x/staking/types_test.go b/x/staking/types_test.go new file mode 100644 index 000000000..7c9dd228c --- /dev/null +++ b/x/staking/types_test.go @@ -0,0 +1,31 @@ +package staking + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + crypto "github.com/tendermint/go-crypto" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func TestBondMsgValidation(t *testing.T) { + privKey := crypto.GenPrivKeyEd25519() + cases := []struct { + valid bool + bondMsg BondMsg + }{ + {true, NewBondMsg(sdk.Address{}, sdk.Coin{"mycoin", 5}, privKey.PubKey())}, + {false, NewBondMsg(sdk.Address{}, sdk.Coin{"mycoin", 0}, privKey.PubKey())}, + } + + for i, tc := range cases { + err := tc.bondMsg.ValidateBasic() + if tc.valid { + assert.Nil(t, err, "%d: %+v", i, err) + } else { + assert.NotNil(t, err, "%d", i) + } + } +}