Merge PR #3607: Reconcile DecCoin/s API with Coin/s API
This commit is contained in:
committed by
Christopher Goes
parent
1aa6c197ff
commit
26c13b28cd
+3
-3
@@ -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
|
||||
|
||||
@@ -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}},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user