diff --git a/.pending/bugfixes/sdk/4598-fix-check-bond- b/.pending/bugfixes/sdk/4598-fix-check-bond- new file mode 100644 index 0000000000..13992ef104 --- /dev/null +++ b/.pending/bugfixes/sdk/4598-fix-check-bond- @@ -0,0 +1 @@ +#4598 Fix redelegation and undelegation txs that were not checking for the correct bond denomination. \ No newline at end of file diff --git a/x/staking/handler.go b/x/staking/handler.go index 0cda2be629..be96d94a5d 100644 --- a/x/staking/handler.go +++ b/x/staking/handler.go @@ -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, ) diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index e5e3acfd4b..5d020ecb30 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -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()) +}