2018-10-05 03:41:38 -07:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
2018-12-10 06:27:25 -08:00
|
|
|
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2018-10-05 03:41:38 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestTakeFeePoolRewards(t *testing.T) {
|
|
|
|
|
|
|
|
// initialize
|
|
|
|
height := int64(0)
|
|
|
|
fp := InitialFeePool()
|
|
|
|
vi1 := NewValidatorDistInfo(valAddr1, height)
|
|
|
|
vi2 := NewValidatorDistInfo(valAddr2, height)
|
|
|
|
vi3 := NewValidatorDistInfo(valAddr3, height)
|
|
|
|
commissionRate1 := sdk.NewDecWithPrec(2, 2)
|
|
|
|
commissionRate2 := sdk.NewDecWithPrec(3, 2)
|
|
|
|
commissionRate3 := sdk.NewDecWithPrec(4, 2)
|
|
|
|
validatorTokens1 := sdk.NewDec(10)
|
|
|
|
validatorTokens2 := sdk.NewDec(40)
|
|
|
|
validatorTokens3 := sdk.NewDec(50)
|
|
|
|
totalBondedTokens := validatorTokens1.Add(validatorTokens2).Add(validatorTokens3)
|
|
|
|
|
|
|
|
// simulate adding some stake for inflation
|
|
|
|
height = 10
|
2018-10-26 04:27:55 -07:00
|
|
|
fp.ValPool = DecCoins{NewDecCoin("stake", 1000)}
|
2018-10-05 03:41:38 -07:00
|
|
|
|
2018-10-26 04:42:53 -07:00
|
|
|
vi1, fp = vi1.TakeFeePoolRewards(NewWithdrawContext(
|
|
|
|
fp, height, totalBondedTokens, validatorTokens1, commissionRate1))
|
2018-10-22 01:18:10 -07:00
|
|
|
require.True(sdk.DecEq(t, sdk.NewDec(900), fp.TotalValAccum.Accum))
|
2018-10-26 04:27:55 -07:00
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(900), fp.ValPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(100-2), vi1.DelPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(2), vi1.ValCommission[0].Amount))
|
2018-10-05 03:41:38 -07:00
|
|
|
|
2018-10-26 04:42:53 -07:00
|
|
|
vi2, fp = vi2.TakeFeePoolRewards(NewWithdrawContext(
|
|
|
|
fp, height, totalBondedTokens, validatorTokens2, commissionRate2))
|
2018-10-22 01:18:10 -07:00
|
|
|
require.True(sdk.DecEq(t, sdk.NewDec(500), fp.TotalValAccum.Accum))
|
2018-10-26 04:27:55 -07:00
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(500), fp.ValPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(400-12), vi2.DelPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, vi2.ValCommission[0].Amount, sdk.NewDec(12)))
|
2018-10-05 03:41:38 -07:00
|
|
|
|
|
|
|
// add more blocks and inflation
|
|
|
|
height = 20
|
2018-10-26 04:27:55 -07:00
|
|
|
fp.ValPool[0].Amount = fp.ValPool[0].Amount.Add(sdk.NewDec(1000))
|
2018-10-05 03:41:38 -07:00
|
|
|
|
2018-10-26 04:42:53 -07:00
|
|
|
vi3, fp = vi3.TakeFeePoolRewards(NewWithdrawContext(
|
|
|
|
fp, height, totalBondedTokens, validatorTokens3, commissionRate3))
|
2018-10-22 01:18:10 -07:00
|
|
|
require.True(sdk.DecEq(t, sdk.NewDec(500), fp.TotalValAccum.Accum))
|
2018-10-26 04:27:55 -07:00
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(500), fp.ValPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(1000-40), vi3.DelPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, vi3.ValCommission[0].Amount, sdk.NewDec(40)))
|
2018-10-05 03:41:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestWithdrawCommission(t *testing.T) {
|
|
|
|
|
|
|
|
// initialize
|
|
|
|
height := int64(0)
|
|
|
|
fp := InitialFeePool()
|
|
|
|
vi := NewValidatorDistInfo(valAddr1, height)
|
|
|
|
commissionRate := sdk.NewDecWithPrec(2, 2)
|
|
|
|
validatorTokens := sdk.NewDec(10)
|
|
|
|
totalBondedTokens := validatorTokens.Add(sdk.NewDec(90)) // validator-1 is 10% of total power
|
|
|
|
|
|
|
|
// simulate adding some stake for inflation
|
|
|
|
height = 10
|
2018-10-26 04:27:55 -07:00
|
|
|
fp.ValPool = DecCoins{NewDecCoin("stake", 1000)}
|
2018-10-05 03:41:38 -07:00
|
|
|
|
|
|
|
// for a more fun staring condition, have an non-withdraw update
|
2018-10-26 04:42:53 -07:00
|
|
|
vi, fp = vi.TakeFeePoolRewards(NewWithdrawContext(
|
|
|
|
fp, height, totalBondedTokens, validatorTokens, commissionRate))
|
2018-10-22 01:18:10 -07:00
|
|
|
require.True(sdk.DecEq(t, sdk.NewDec(900), fp.TotalValAccum.Accum))
|
2018-10-26 04:27:55 -07:00
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(900), fp.ValPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(100-2), vi.DelPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(2), vi.ValCommission[0].Amount))
|
2018-10-05 03:41:38 -07:00
|
|
|
|
|
|
|
// add more blocks and inflation
|
|
|
|
height = 20
|
2018-10-26 04:27:55 -07:00
|
|
|
fp.ValPool[0].Amount = fp.ValPool[0].Amount.Add(sdk.NewDec(1000))
|
2018-10-05 03:41:38 -07:00
|
|
|
|
2018-10-26 04:42:53 -07:00
|
|
|
vi, fp, commissionRecv := vi.WithdrawCommission(NewWithdrawContext(
|
|
|
|
fp, height, totalBondedTokens, validatorTokens, commissionRate))
|
2018-10-22 01:18:10 -07:00
|
|
|
require.True(sdk.DecEq(t, sdk.NewDec(1800), fp.TotalValAccum.Accum))
|
2018-10-26 04:27:55 -07:00
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(1800), fp.ValPool[0].Amount))
|
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(200-4), vi.DelPool[0].Amount))
|
|
|
|
assert.Zero(t, len(vi.ValCommission))
|
2018-10-05 03:41:38 -07:00
|
|
|
assert.True(sdk.DecEq(t, sdk.NewDec(4), commissionRecv[0].Amount))
|
|
|
|
}
|