Skip to content

Commit

Permalink
Merge PR #4600: Check Denom when (Un|Re)delegating
Browse files Browse the repository at this point in the history
  • Loading branch information
fedekunze authored and alexanderbez committed Jun 20, 2019
1 parent 6d5ca0b commit eda558b
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
1 change: 1 addition & 0 deletions .pending/bugfixes/sdk/4598-fix-check-bond-
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#4598 Fix redelegation and undelegation txs that were not checking for the correct bond denomination.
12 changes: 10 additions & 2 deletions x/staking/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}

Expand Down Expand Up @@ -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()
}

Expand Down Expand Up @@ -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()
Expand All @@ -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,
)
Expand Down
43 changes: 43 additions & 0 deletions x/staking/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}

0 comments on commit eda558b

Please sign in to comment.