2018-10-04 18:37:40 -07:00
|
|
|
package keeper
|
|
|
|
|
2018-10-10 14:43:47 -07:00
|
|
|
import (
|
|
|
|
"testing"
|
2018-10-04 18:37:40 -07:00
|
|
|
|
2018-10-10 14:43:47 -07:00
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/x/stake"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
2018-10-04 18:37:40 -07:00
|
|
|
|
2018-10-10 14:43:47 -07:00
|
|
|
func TestAllocateFeesBasic(t *testing.T) {
|
|
|
|
|
|
|
|
// no community tax on inputs
|
|
|
|
ctx, _, keeper, sk, fck := CreateTestInputAdvanced(t, false, 100, sdk.ZeroDec())
|
|
|
|
stakeHandler := stake.NewHandler(sk)
|
|
|
|
denom := sk.GetParams(ctx).BondDenom
|
|
|
|
|
|
|
|
//first make a validator
|
2018-10-10 20:16:49 -07:00
|
|
|
totalPower := int64(10)
|
|
|
|
totalPowerDec := sdk.NewDec(totalPower)
|
|
|
|
msgCreateValidator := stake.NewTestMsgCreateValidator(valOpAddr1, valConsPk1, totalPower)
|
2018-10-10 14:43:47 -07:00
|
|
|
got := stakeHandler(ctx, msgCreateValidator)
|
|
|
|
require.True(t, got.IsOK(), "expected msg to be ok, got %v", got)
|
|
|
|
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
|
|
|
|
|
|
|
|
// verify everything has been set in staking correctly
|
|
|
|
validator, found := sk.GetValidator(ctx, valOpAddr1)
|
|
|
|
require.True(t, found)
|
|
|
|
require.Equal(t, sdk.Bonded, validator.Status)
|
2018-10-10 20:16:49 -07:00
|
|
|
assert.True(sdk.DecEq(t, totalPowerDec, validator.Tokens))
|
|
|
|
assert.True(sdk.DecEq(t, totalPowerDec, validator.DelegatorShares))
|
2018-10-10 14:43:47 -07:00
|
|
|
bondedTokens := sk.TotalPower(ctx)
|
2018-10-10 20:16:49 -07:00
|
|
|
assert.True(sdk.DecEq(t, totalPowerDec, bondedTokens))
|
2018-10-10 14:43:47 -07:00
|
|
|
|
|
|
|
// initial fee pool should be empty
|
|
|
|
feePool := keeper.GetFeePool(ctx)
|
|
|
|
require.Nil(t, feePool.Pool)
|
|
|
|
|
2018-10-10 20:16:49 -07:00
|
|
|
// allocate 100 denom of fees
|
2018-10-10 14:43:47 -07:00
|
|
|
feeInputs := sdk.NewInt(100)
|
|
|
|
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
|
|
|
|
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
|
|
|
|
keeper.SetProposerConsAddr(ctx, valConsAddr1)
|
2018-10-14 23:34:01 -07:00
|
|
|
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
|
2018-10-10 14:43:47 -07:00
|
|
|
keeper.AllocateFees(ctx)
|
|
|
|
|
|
|
|
// verify that these fees have been received by the feePool
|
|
|
|
feePool = keeper.GetFeePool(ctx)
|
|
|
|
expRes := sdk.NewDecFromInt(feeInputs).Mul(sdk.NewDecWithPrec(95, 2)) // 5% goes to proposer
|
|
|
|
require.Equal(t, 1, len(feePool.Pool))
|
|
|
|
require.True(sdk.DecEq(t, expRes, feePool.Pool[0].Amount))
|
2018-10-04 18:37:40 -07:00
|
|
|
}
|
2018-10-10 20:16:49 -07:00
|
|
|
|
|
|
|
func TestAllocateFeesWithCommunityTax(t *testing.T) {
|
|
|
|
ctx, _, keeper, sk, fck := CreateTestInputAdvanced(t, false, 100, sdk.NewDecWithPrec(1, 2)) //1%
|
|
|
|
stakeHandler := stake.NewHandler(sk)
|
|
|
|
denom := sk.GetParams(ctx).BondDenom
|
|
|
|
|
|
|
|
//first make a validator
|
|
|
|
totalPower := int64(10)
|
|
|
|
msgCreateValidator := stake.NewTestMsgCreateValidator(valOpAddr1, valConsPk1, totalPower)
|
|
|
|
got := stakeHandler(ctx, msgCreateValidator)
|
|
|
|
require.True(t, got.IsOK(), "expected msg to be ok, got %v", got)
|
|
|
|
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
|
|
|
|
|
|
|
|
// allocate 100 denom of fees
|
|
|
|
feeInputs := sdk.NewInt(100)
|
|
|
|
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
|
|
|
|
keeper.SetProposerConsAddr(ctx, valConsAddr1)
|
2018-10-14 23:34:01 -07:00
|
|
|
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
|
2018-10-10 20:16:49 -07:00
|
|
|
keeper.AllocateFees(ctx)
|
|
|
|
|
|
|
|
// verify that these fees have been received by the feePool
|
|
|
|
feePool := keeper.GetFeePool(ctx)
|
|
|
|
// 5% goes to proposer, 1% community tax
|
|
|
|
expRes := sdk.NewDecFromInt(feeInputs).Mul(sdk.NewDecWithPrec(94, 2))
|
|
|
|
require.Equal(t, 1, len(feePool.Pool))
|
|
|
|
require.True(sdk.DecEq(t, expRes, feePool.Pool[0].Amount))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAllocateFeesWithPartialPrecommitPower(t *testing.T) {
|
|
|
|
ctx, _, keeper, sk, fck := CreateTestInputAdvanced(t, false, 100, sdk.NewDecWithPrec(1, 2)) //1%
|
|
|
|
stakeHandler := stake.NewHandler(sk)
|
|
|
|
denom := sk.GetParams(ctx).BondDenom
|
|
|
|
|
|
|
|
//first make a validator
|
2018-10-12 04:15:13 -07:00
|
|
|
totalPower := int64(100)
|
2018-10-10 20:16:49 -07:00
|
|
|
msgCreateValidator := stake.NewTestMsgCreateValidator(valOpAddr1, valConsPk1, totalPower)
|
|
|
|
got := stakeHandler(ctx, msgCreateValidator)
|
|
|
|
require.True(t, got.IsOK(), "expected msg to be ok, got %v", got)
|
|
|
|
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
|
|
|
|
|
|
|
|
// allocate 100 denom of fees
|
|
|
|
feeInputs := sdk.NewInt(100)
|
|
|
|
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
|
|
|
|
keeper.SetProposerConsAddr(ctx, valConsAddr1)
|
2018-10-14 23:34:01 -07:00
|
|
|
keeper.SetPercentPrecommitVotes(ctx, sdk.NewDecWithPrec(25, 2))
|
2018-10-10 20:16:49 -07:00
|
|
|
keeper.AllocateFees(ctx)
|
|
|
|
|
|
|
|
// verify that these fees have been received by the feePool
|
|
|
|
feePool := keeper.GetFeePool(ctx)
|
|
|
|
// 1% + 4%*0.25 goes to proposer, 1% community tax
|
|
|
|
expRes := sdk.NewDecFromInt(feeInputs).Mul(sdk.NewDecWithPrec(97, 2))
|
|
|
|
require.Equal(t, 1, len(feePool.Pool))
|
|
|
|
require.True(sdk.DecEq(t, expRes, feePool.Pool[0].Amount))
|
|
|
|
}
|