Merge PR #3607: Reconcile DecCoin/s API with Coin/s API

This commit is contained in:
Alexander Bezobchuk
2019-02-15 16:33:23 +01:00
committed by Christopher Goes
parent 1aa6c197ff
commit 26c13b28cd
15 changed files with 456 additions and 291 deletions
+3 -3
View File
@@ -35,7 +35,7 @@ func (msg MsgSend) ValidateBasic() sdk.Error {
if msg.ToAddress.Empty() {
return sdk.ErrInvalidAddress("missing recipient address")
}
if !msg.Amount.IsPositive() {
if !msg.Amount.IsAllPositive() {
return sdk.ErrInsufficientCoins("send amount must be positive")
}
return nil
@@ -112,7 +112,7 @@ func (in Input) ValidateBasic() sdk.Error {
if !in.Coins.IsValid() {
return sdk.ErrInvalidCoins(in.Coins.String())
}
if !in.Coins.IsPositive() {
if !in.Coins.IsAllPositive() {
return sdk.ErrInvalidCoins(in.Coins.String())
}
return nil
@@ -140,7 +140,7 @@ func (out Output) ValidateBasic() sdk.Error {
if !out.Coins.IsValid() {
return sdk.ErrInvalidCoins(out.Coins.String())
}
if !out.Coins.IsPositive() {
if !out.Coins.IsAllPositive() {
return sdk.ErrInvalidCoins(out.Coins.String())
}
return nil
-14
View File
@@ -172,7 +172,6 @@ func TestMsgMultiSendValidation(t *testing.T) {
input2 := NewInput(addr1, eth123)
output1 := NewOutput(addr2, atom123)
output2 := NewOutput(addr2, atom124)
output3 := NewOutput(addr2, eth123)
outputMulti := NewOutput(addr2, atom123eth123)
var emptyAddr sdk.AccAddress
@@ -195,19 +194,6 @@ func TestMsgMultiSendValidation(t *testing.T) {
Inputs: []Input{input1},
Outputs: []Output{output2}}, // amounts dont match
},
{false, MsgMultiSend{
Inputs: []Input{input1},
Outputs: []Output{output3}}, // amounts dont match
},
{false, MsgMultiSend{
Inputs: []Input{input1},
Outputs: []Output{outputMulti}}, // amounts dont match
},
{false, MsgMultiSend{
Inputs: []Input{input2},
Outputs: []Output{output1}}, // amounts dont match
},
{true, MsgMultiSend{
Inputs: []Input{input1},
Outputs: []Output{output1}},
+2 -1
View File
@@ -41,7 +41,7 @@ func (k Keeper) calculateDelegationRewardsBetween(ctx sdk.Context, val sdk.Valid
starting := k.GetValidatorHistoricalRewards(ctx, val.GetOperator(), startingPeriod)
ending := k.GetValidatorHistoricalRewards(ctx, val.GetOperator(), endingPeriod)
difference := ending.CumulativeRewardRatio.Minus(starting.CumulativeRewardRatio)
if difference.HasNegative() {
if difference.IsAnyNegative() {
panic("negative rewards should not be possible")
}
// note: necessary to truncate so we don't allow withdrawing more rewards than owed
@@ -100,6 +100,7 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val sdk.Validator, de
// truncate coins, return remainder to community pool
coins, remainder := rewards.TruncateDecimal()
outstanding := k.GetOutstandingRewards(ctx)
k.SetOutstandingRewards(ctx, outstanding.Minus(rewards))
feePool := k.GetFeePool(ctx)
feePool.CommunityPool = feePool.CommunityPool.Plus(remainder)
+30 -13
View File
@@ -270,28 +270,31 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) {
power := int64(100)
valTokens := sdk.TokensFromTendermintPower(power)
commission := staking.NewCommissionMsg(sdk.NewDecWithPrec(5, 1), sdk.NewDecWithPrec(5, 1), sdk.NewDec(0))
msg := staking.NewMsgCreateValidator(valOpAddr1, valConsPk1,
sdk.NewCoin(sdk.DefaultBondDenom, valTokens), staking.Description{}, commission, sdk.OneInt())
msg := staking.NewMsgCreateValidator(
valOpAddr1, valConsPk1,
sdk.NewCoin(sdk.DefaultBondDenom, valTokens),
staking.Description{}, commission, sdk.OneInt(),
)
require.True(t, sh(ctx, msg).IsOK())
// assert correct initial balance
expTokens := balanceTokens.Sub(valTokens)
require.Equal(t,
sdk.Coins{{sdk.DefaultBondDenom, expTokens}},
ak.GetAccount(ctx, sdk.AccAddress(valOpAddr1)).GetCoins())
sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, expTokens)},
ak.GetAccount(ctx, sdk.AccAddress(valOpAddr1)).GetCoins(),
)
// end block to bond validator
staking.EndBlocker(ctx, sk)
// set zero outstanding rewards
k.SetOutstandingRewards(ctx, sdk.DecCoins{})
// fetch validator and delegation
val := sk.Validator(ctx, valOpAddr1)
// allocate some rewards
initial := sdk.TokensFromTendermintPower(10)
tokens := sdk.DecCoins{{sdk.DefaultBondDenom, sdk.NewDecFromInt(initial)}}
tokens := sdk.DecCoins{sdk.NewDecCoin(sdk.DefaultBondDenom, initial)}
k.SetOutstandingRewards(ctx, tokens)
k.AllocateTokensToValidator(ctx, val, tokens)
// historical count should be 2 (initial + latest for delegation)
@@ -305,14 +308,20 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) {
// assert correct balance
exp := balanceTokens.Sub(valTokens).Add(initial.DivRaw(2))
require.Equal(t, sdk.Coins{{sdk.DefaultBondDenom, exp}}, ak.GetAccount(ctx, sdk.AccAddress(valOpAddr1)).GetCoins())
require.Equal(t,
sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, exp)},
ak.GetAccount(ctx, sdk.AccAddress(valOpAddr1)).GetCoins(),
)
// withdraw commission
require.Nil(t, k.WithdrawValidatorCommission(ctx, valOpAddr1))
// assert correct balance
exp = balanceTokens.Sub(valTokens).Add(initial)
require.Equal(t, sdk.Coins{{sdk.DefaultBondDenom, exp}}, ak.GetAccount(ctx, sdk.AccAddress(valOpAddr1)).GetCoins())
require.Equal(t,
sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, exp)},
ak.GetAccount(ctx, sdk.AccAddress(valOpAddr1)).GetCoins(),
)
}
func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) {
@@ -458,8 +467,12 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
ctx, _, k, sk, _ := CreateTestInputDefault(t, false, 1000)
sh := staking.NewHandler(sk)
initial := int64(20)
totalRewards := sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(initial*2))}
tokens := sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(initial))}
// initialize state
k.SetOutstandingRewards(ctx, sdk.DecCoins{})
k.SetOutstandingRewards(ctx, totalRewards)
// create validator with 50% commission
commission := staking.NewCommissionMsg(sdk.NewDecWithPrec(5, 1), sdk.NewDecWithPrec(5, 1), sdk.NewDec(0))
@@ -475,8 +488,6 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
del1 := sk.Delegation(ctx, sdk.AccAddress(valOpAddr1), valOpAddr1)
// allocate some rewards
initial := int64(20)
tokens := sdk.DecCoins{{sdk.DefaultBondDenom, sdk.NewDec(initial)}}
k.AllocateTokensToValidator(ctx, val, tokens)
// historical count should be 2 (validator init, delegation init)
@@ -529,6 +540,9 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
// commission should be zero
require.True(t, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1).IsZero())
totalRewards = k.GetOutstandingRewards(ctx).Plus(tokens)
k.SetOutstandingRewards(ctx, totalRewards)
// allocate some more rewards
k.AllocateTokensToValidator(ctx, val, tokens)
@@ -553,6 +567,9 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
// commission should be half initial
require.Equal(t, sdk.DecCoins{{sdk.DefaultBondDenom, sdk.NewDec(initial / 2)}}, k.GetValidatorAccumulatedCommission(ctx, valOpAddr1))
totalRewards = k.GetOutstandingRewards(ctx).Plus(tokens)
k.SetOutstandingRewards(ctx, totalRewards)
// allocate some more rewards
k.AllocateTokensToValidator(ctx, val, tokens)
+12 -11
View File
@@ -6,7 +6,6 @@ import (
"github.com/stretchr/testify/require"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/distribution/types"
)
func TestSetWithdrawAddr(t *testing.T) {
@@ -26,21 +25,23 @@ func TestSetWithdrawAddr(t *testing.T) {
func TestWithdrawValidatorCommission(t *testing.T) {
ctx, ak, keeper, _, _ := CreateTestInputDefault(t, false, 1000)
valCommission := sdk.DecCoins{
sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(5).Quo(sdk.NewDec(4))),
sdk.NewDecCoinFromDec("stake", sdk.NewDec(3).Quo(sdk.NewDec(2))),
}
// set zero outstanding rewards
keeper.SetOutstandingRewards(ctx, types.OutstandingRewards{})
keeper.SetOutstandingRewards(ctx, valCommission)
// check initial balance
balance := ak.GetAccount(ctx, sdk.AccAddress(valOpAddr3)).GetCoins()
expTokens := sdk.TokensFromTendermintPower(1000)
require.Equal(t, sdk.Coins{
{"stake", sdk.TokensFromTendermintPower(1000)},
sdk.NewCoin("stake", sdk.TokensFromTendermintPower(1000)),
}, balance)
// set commission
keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr3, sdk.DecCoins{
{"mytoken", sdk.NewDec(5).Quo(sdk.NewDec(4))},
{"stake", sdk.NewDec(3).Quo(sdk.NewDec(2))},
})
keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr3, valCommission)
// withdraw commission
keeper.WithdrawValidatorCommission(ctx, valOpAddr3)
@@ -48,15 +49,15 @@ func TestWithdrawValidatorCommission(t *testing.T) {
// check balance increase
balance = ak.GetAccount(ctx, sdk.AccAddress(valOpAddr3)).GetCoins()
require.Equal(t, sdk.Coins{
{"mytoken", sdk.NewInt(1)},
{"stake", expTokens.AddRaw(1)},
sdk.NewCoin("mytoken", sdk.NewInt(1)),
sdk.NewCoin("stake", expTokens.AddRaw(1)),
}, balance)
// check remainder
remainder := keeper.GetValidatorAccumulatedCommission(ctx, valOpAddr3)
require.Equal(t, sdk.DecCoins{
{"mytoken", sdk.NewDec(1).Quo(sdk.NewDec(4))},
{"stake", sdk.NewDec(1).Quo(sdk.NewDec(2))},
sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(1).Quo(sdk.NewDec(4))),
sdk.NewDecCoinFromDec("stake", sdk.NewDec(1).Quo(sdk.NewDec(2))),
}, remainder)
require.True(t, true)
+1 -1
View File
@@ -31,7 +31,7 @@ func AllInvariants(d distr.Keeper, stk types.StakingKeeper) sdk.Invariant {
func NonNegativeOutstandingInvariant(k distr.Keeper) sdk.Invariant {
return func(ctx sdk.Context) error {
outstanding := k.GetOutstandingRewards(ctx)
if outstanding.HasNegative() {
if outstanding.IsAnyNegative() {
return fmt.Errorf("negative outstanding coins: %v", outstanding)
}
return nil
+1 -1
View File
@@ -20,7 +20,7 @@ func InitialFeePool() FeePool {
// ValidateGenesis validates the fee pool for a genesis state
func (f FeePool) ValidateGenesis() error {
if f.CommunityPool.HasNegative() {
if f.CommunityPool.IsAnyNegative() {
return fmt.Errorf("negative CommunityPool in distribution fee pool, is %v",
f.CommunityPool)
}