Merge PR #4600: Check Denom when (Un|Re)delegating

This commit is contained in:
Federico Kunze 2019-06-20 15:51:18 +02:00 committed by Alexander Bezobchuk
parent 6d5ca0b4f1
commit eda558bc7e
3 changed files with 54 additions and 2 deletions

View File

@ -0,0 +1 @@
#4598 Fix redelegation and undelegation txs that were not checking for the correct bond denomination.

View File

@ -107,7 +107,7 @@ func handleMsgCreateValidator(ctx sdk.Context, msg types.MsgCreateValidator, k k
return ErrValidatorPubKeyExists(k.Codespace()).Result()
}
if msg.Value.Denom != k.GetParams(ctx).BondDenom {
if msg.Value.Denom != k.BondDenom(ctx) {
return ErrBadDenom(k.Codespace()).Result()
}
@ -216,7 +216,7 @@ func handleMsgDelegate(ctx sdk.Context, msg types.MsgDelegate, k keeper.Keeper)
return ErrNoValidatorFound(k.Codespace()).Result()
}
if msg.Amount.Denom != k.GetParams(ctx).BondDenom {
if msg.Amount.Denom != k.BondDenom(ctx) {
return ErrBadDenom(k.Codespace()).Result()
}
@ -244,6 +244,10 @@ func handleMsgUndelegate(ctx sdk.Context, msg types.MsgUndelegate, k keeper.Keep
return err.Result()
}
if msg.Amount.Denom != k.BondDenom(ctx) {
return ErrBadDenom(k.Codespace()).Result()
}
completionTime, err := k.Undelegate(ctx, msg.DelegatorAddress, msg.ValidatorAddress, shares)
if err != nil {
return err.Result()
@ -268,6 +272,10 @@ func handleMsgBeginRedelegate(ctx sdk.Context, msg types.MsgBeginRedelegate, k k
return err.Result()
}
if msg.Amount.Denom != k.BondDenom(ctx) {
return ErrBadDenom(k.Codespace()).Result()
}
completionTime, err := k.BeginRedelegation(
ctx, msg.DelegatorAddress, msg.ValidatorSrcAddress, msg.ValidatorDstAddress, shares,
)

View File

@ -1281,3 +1281,46 @@ func TestInvalidMsg(t *testing.T) {
require.False(t, res.IsOK())
require.True(t, strings.Contains(res.Log, "unrecognized staking message type"))
}
func TestInvalidCoinDenom(t *testing.T) {
ctx, _, keeper := keep.CreateTestInput(t, false, 1000)
valA, valB, delAddr := sdk.ValAddress(keep.Addrs[0]), sdk.ValAddress(keep.Addrs[1]), keep.Addrs[2]
valTokens := sdk.TokensFromConsensusPower(100)
invalidCoin := sdk.NewCoin("churros", valTokens)
validCoin := sdk.NewCoin(sdk.DefaultBondDenom, valTokens)
oneCoin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.OneInt())
commission := types.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.ZeroDec())
msgCreate := types.NewMsgCreateValidator(valA, keep.PKs[0], invalidCoin, Description{}, commission, sdk.OneInt())
got := handleMsgCreateValidator(ctx, msgCreate, keeper)
require.False(t, got.IsOK())
msgCreate = types.NewMsgCreateValidator(valA, keep.PKs[0], validCoin, Description{}, commission, sdk.OneInt())
got = handleMsgCreateValidator(ctx, msgCreate, keeper)
require.True(t, got.IsOK())
msgCreate = types.NewMsgCreateValidator(valB, keep.PKs[1], validCoin, Description{}, commission, sdk.OneInt())
got = handleMsgCreateValidator(ctx, msgCreate, keeper)
require.True(t, got.IsOK())
msgDelegate := types.NewMsgDelegate(delAddr, valA, invalidCoin)
got = handleMsgDelegate(ctx, msgDelegate, keeper)
require.False(t, got.IsOK())
msgDelegate = types.NewMsgDelegate(delAddr, valA, validCoin)
got = handleMsgDelegate(ctx, msgDelegate, keeper)
require.True(t, got.IsOK())
msgUndelegate := types.NewMsgUndelegate(delAddr, valA, invalidCoin)
got = handleMsgUndelegate(ctx, msgUndelegate, keeper)
require.False(t, got.IsOK())
msgUndelegate = types.NewMsgUndelegate(delAddr, valA, oneCoin)
got = handleMsgUndelegate(ctx, msgUndelegate, keeper)
require.True(t, got.IsOK())
msgRedelegate := types.NewMsgBeginRedelegate(delAddr, valA, valB, invalidCoin)
got = handleMsgBeginRedelegate(ctx, msgRedelegate, keeper)
require.False(t, got.IsOK())
msgRedelegate = types.NewMsgBeginRedelegate(delAddr, valA, valB, oneCoin)
got = handleMsgBeginRedelegate(ctx, msgRedelegate, keeper)
require.True(t, got.IsOK())
}