working
This commit is contained in:
parent
d7794b483d
commit
9a2aee8791
|
@ -0,0 +1,8 @@
|
||||||
|
package stake
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// burn burn burn
|
||||||
|
func BurnFeeHandler(ctx sdk.Context, _ sdk.Tx, collectedFees sdk.Coins) {}
|
|
@ -1,91 +0,0 @@
|
||||||
package stake
|
|
||||||
|
|
||||||
//// keeper of the staking store
|
|
||||||
//type Keeper struct {
|
|
||||||
//storeKey sdk.StoreKey
|
|
||||||
//cdc *wire.Codec
|
|
||||||
//coinKeeper bank.Keeper
|
|
||||||
|
|
||||||
//// codespace
|
|
||||||
//codespace sdk.CodespaceType
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func NewKeeper(cdc *wire.Codec, key sdk.StoreKey, ck bank.Keeper, codespace sdk.CodespaceType) Keeper {
|
|
||||||
//keeper := Keeper{
|
|
||||||
//storeKey: key,
|
|
||||||
//cdc: cdc,
|
|
||||||
//coinKeeper: ck,
|
|
||||||
//codespace: codespace,
|
|
||||||
//}
|
|
||||||
//return keeper
|
|
||||||
//}
|
|
||||||
|
|
||||||
////_________________________________________________________________________
|
|
||||||
|
|
||||||
//// cummulative power of the non-absent prevotes
|
|
||||||
//func (k Keeper) GetTotalPrecommitVotingPower(ctx sdk.Context) sdk.Dec {
|
|
||||||
//store := ctx.KVStore(k.storeKey)
|
|
||||||
|
|
||||||
//// get absent prevote indexes
|
|
||||||
//absents := ctx.AbsentValidators()
|
|
||||||
|
|
||||||
//TotalPower := sdk.ZeroDec()
|
|
||||||
//i := int32(0)
|
|
||||||
//iterator := store.SubspaceIterator(ValidatorsBondedKey)
|
|
||||||
//for ; iterator.Valid(); iterator.Next() {
|
|
||||||
|
|
||||||
//skip := false
|
|
||||||
//for j, absentIndex := range absents {
|
|
||||||
//if absentIndex > i {
|
|
||||||
//break
|
|
||||||
//}
|
|
||||||
|
|
||||||
//// if non-voting validator found, skip adding its power
|
|
||||||
//if absentIndex == i {
|
|
||||||
//absents = append(absents[:j], absents[j+1:]...) // won't need again
|
|
||||||
//skip = true
|
|
||||||
//break
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
//if skip {
|
|
||||||
//continue
|
|
||||||
//}
|
|
||||||
|
|
||||||
//bz := iterator.Value()
|
|
||||||
//var validator Validator
|
|
||||||
//k.cdc.MustUnmarshalBinary(bz, &validator)
|
|
||||||
//TotalPower = TotalPower.Add(validator.Power)
|
|
||||||
//i++
|
|
||||||
//}
|
|
||||||
//iterator.Close()
|
|
||||||
//return TotalPower
|
|
||||||
//}
|
|
||||||
|
|
||||||
////_______________________________________________________________________
|
|
||||||
|
|
||||||
//// XXX TODO trim functionality
|
|
||||||
|
|
||||||
//// retrieve all the power changes which occur after a height
|
|
||||||
//func (k Keeper) GetPowerChangesAfterHeight(ctx sdk.Context, earliestHeight int64) (pcs []PowerChange) {
|
|
||||||
//store := ctx.KVStore(k.storeKey)
|
|
||||||
|
|
||||||
//iterator := store.SubspaceIterator(PowerChangeKey) //smallest to largest
|
|
||||||
//for ; iterator.Valid(); iterator.Next() {
|
|
||||||
//pcBytes := iterator.Value()
|
|
||||||
//var pc PowerChange
|
|
||||||
//k.cdc.MustUnmarshalBinary(pcBytes, &pc)
|
|
||||||
//if pc.Height < earliestHeight {
|
|
||||||
//break
|
|
||||||
//}
|
|
||||||
//pcs = append(pcs, pc)
|
|
||||||
//}
|
|
||||||
//iterator.Close()
|
|
||||||
//return
|
|
||||||
//}
|
|
||||||
|
|
||||||
//// set a power change
|
|
||||||
//func (k Keeper) setPowerChange(ctx sdk.Context, pc PowerChange) {
|
|
||||||
//store := ctx.KVStore(k.storeKey)
|
|
||||||
//b := k.cdc.MustMarshalBinary(pc)
|
|
||||||
//store.Set(GetPowerChangeKey(pc.Height), b)
|
|
||||||
//}
|
|
|
@ -0,0 +1 @@
|
||||||
|
package keeper
|
|
@ -0,0 +1 @@
|
||||||
|
package keeper
|
|
@ -0,0 +1,29 @@
|
||||||
|
package keeper
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// keys/key-prefixes
|
||||||
|
var (
|
||||||
|
GlobalKey = []byte{0x00} // key for global distribution state
|
||||||
|
ValidatorDistInfoKey = []byte{0x01} // prefix for each key to a validator distribution
|
||||||
|
DelegatorDistInfoKey = []byte{0x02} // prefix for each key to a delegation distribution
|
||||||
|
)
|
||||||
|
|
||||||
|
// gets the key for the validator distribution info from address
|
||||||
|
// VALUE: distribution/types.ValidatorDistInfo
|
||||||
|
func GetValidatorDistInfoKey(operatorAddr sdk.ValAddress) []byte {
|
||||||
|
return append(ValidatorDistInfoKey, operatorAddr.Bytes()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// gets the key for delegator distribution for a validator
|
||||||
|
// VALUE: distribution/types.DelegatorDistInfo
|
||||||
|
func GetDelegationDistInfoKey(delAddr sdk.AccAddress, valOperatorAddr sdk.ValAddress) []byte {
|
||||||
|
return append(GetDelegationDistInfosKey(delAddr), valAddr.Bytes()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// gets the prefix for a delegator's distributions across all validators
|
||||||
|
func GetDelegationDistInfosKey(delAddr sdk.AccAddress) []byte {
|
||||||
|
return append(DelegatorDistInfoKey, delAddr.Bytes()...)
|
||||||
|
}
|
|
@ -1,31 +0,0 @@
|
||||||
package stake
|
|
||||||
|
|
||||||
//// test if is a gotValidator from the last update
|
|
||||||
//func TestGetTotalPrecommitVotingPower(t *testing.T) {
|
|
||||||
//ctx, _, keeper := createTestInput(t, false, 0)
|
|
||||||
|
|
||||||
//amts := []int64{10000, 1000, 100, 10, 1}
|
|
||||||
//var candidatesIn [5]Candidate
|
|
||||||
//for i, amt := range amts {
|
|
||||||
//candidatesIn[i] = NewCandidate(addrVals[i], pks[i], Description{})
|
|
||||||
//candidatesIn[i].BondedShares = sdk.NewDec(amt)
|
|
||||||
//candidatesIn[i].DelegatorShares = sdk.NewDec(amt)
|
|
||||||
//keeper.setCandidate(ctx, candidatesIn[i])
|
|
||||||
//}
|
|
||||||
|
|
||||||
//// test that an empty gotValidator set doesn't have any gotValidators
|
|
||||||
//gotValidators := keeper.GetValidators(ctx)
|
|
||||||
//require.Equal(t, 5, len(gotValidators))
|
|
||||||
|
|
||||||
//totPow := keeper.GetTotalPrecommitVotingPower(ctx)
|
|
||||||
//exp := sdk.NewDec(11111)
|
|
||||||
//require.True(t, exp.Equal(totPow), "exp %v, got %v", exp, totPow)
|
|
||||||
|
|
||||||
//// set absent gotValidators to be the 1st and 3rd record sorted by pubKey address
|
|
||||||
//ctx = ctx.WithAbsentValidators([]int32{1, 3})
|
|
||||||
//totPow = keeper.GetTotalPrecommitVotingPower(ctx)
|
|
||||||
|
|
||||||
//// XXX verify that this order should infact exclude these two records
|
|
||||||
//exp = sdk.NewDec(11100)
|
|
||||||
//require.True(t, exp.Equal(totPow), "exp %v, got %v", exp, totPow)
|
|
||||||
//}
|
|
|
@ -1,72 +0,0 @@
|
||||||
package stake
|
|
||||||
|
|
||||||
import (
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
// burn burn burn
|
|
||||||
func BurnFeeHandler(ctx sdk.Context, _ sdk.Tx, collectedFees sdk.Coins) {}
|
|
||||||
|
|
||||||
//// Handle fee distribution to the validators and delegators
|
|
||||||
//func (k Keeper) FeeHandler(ctx sdk.Context, collectedFees sdk.Coins) {
|
|
||||||
//pool := k.GetPool(ctx)
|
|
||||||
//params := k.GetParams(ctx)
|
|
||||||
|
|
||||||
//// XXX determine
|
|
||||||
//candidate := NewCandidate(addrs[0], pks[0], Description{})
|
|
||||||
|
|
||||||
//// calculate the proposer reward
|
|
||||||
//precommitPower := k.GetTotalPrecommitVotingPower(ctx)
|
|
||||||
//toProposer := coinsMulRat(collectedFees, (sdk.NewDec(1, 100).Add(sdk.NewDec(4, 100).Mul(precommitPower).Quo(pool.BondedShares))))
|
|
||||||
//candidate.ProposerRewardPool = candidate.ProposerRewardPool.Plus(toProposer)
|
|
||||||
|
|
||||||
//toReservePool := coinsMulRat(collectedFees, params.ReservePoolFee)
|
|
||||||
//pool.FeeReservePool = pool.FeeReservePool.Plus(toReservePool)
|
|
||||||
|
|
||||||
//distributedReward := (collectedFees.Minus(toProposer)).Minus(toReservePool)
|
|
||||||
//pool.FeePool = pool.FeePool.Plus(distributedReward)
|
|
||||||
//pool.FeeSumReceived = pool.FeeSumReceived.Plus(distributedReward)
|
|
||||||
//pool.FeeRecent = distributedReward
|
|
||||||
|
|
||||||
//// lastly update the FeeRecent term
|
|
||||||
//pool.FeeRecent = collectedFees
|
|
||||||
|
|
||||||
//k.setPool(ctx, pool)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func coinsMulRat(coins sdk.Coins, rat sdk.Dec) sdk.Coins {
|
|
||||||
//var res sdk.Coins
|
|
||||||
//for _, coin := range coins {
|
|
||||||
//coinMulAmt := rat.Mul(sdk.NewDec(coin.Amount)).Evaluate()
|
|
||||||
//coinMul := sdk.Coins{{coin.Denom, coinMulAmt}}
|
|
||||||
//res = res.Plus(coinMul)
|
|
||||||
//}
|
|
||||||
//return res
|
|
||||||
//}
|
|
||||||
|
|
||||||
////____________________________________________________________________________-
|
|
||||||
|
|
||||||
//// calculate adjustment changes for a candidate at a height
|
|
||||||
//func CalculateAdjustmentChange(candidate Candidate, pool Pool, denoms []string, height int64) (Candidate, Pool) {
|
|
||||||
|
|
||||||
//heightRat := sdk.NewDec(height)
|
|
||||||
//lastHeightRat := sdk.NewDec(height - 1)
|
|
||||||
//candidateFeeCount := candidate.BondedShares.Mul(heightRat)
|
|
||||||
//poolFeeCount := pool.BondedShares.Mul(heightRat)
|
|
||||||
|
|
||||||
//for i, denom := range denoms {
|
|
||||||
//poolFeeSumReceived := sdk.NewDec(pool.FeeSumReceived.AmountOf(denom))
|
|
||||||
//poolFeeRecent := sdk.NewDec(pool.FeeRecent.AmountOf(denom))
|
|
||||||
//// calculate simple and projected pools
|
|
||||||
//simplePool := candidateFeeCount.Quo(poolFeeCount).Mul(poolFeeSumReceived)
|
|
||||||
//calc1 := candidate.PrevBondedShares.Mul(lastHeightRat).Quo(pool.PrevBondedShares.Mul(lastHeightRat)).Mul(poolFeeRecent)
|
|
||||||
//calc2 := candidate.BondedShares.Quo(pool.BondedShares).Mul(poolFeeRecent)
|
|
||||||
//projectedPool := calc1.Add(calc2)
|
|
||||||
|
|
||||||
//AdjustmentChange := simplePool.Sub(projectedPool)
|
|
||||||
//candidate.FeeAdjustments[i] = candidate.FeeAdjustments[i].Add(AdjustmentChange)
|
|
||||||
//pool.FeeAdjustments[i] = pool.FeeAdjustments[i].Add(AdjustmentChange)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//return candidate, pool
|
|
||||||
//}
|
|
|
@ -1,107 +0,0 @@
|
||||||
package stake
|
|
||||||
|
|
||||||
//// GenesisState - all staking state that must be provided at genesis
|
|
||||||
//type GenesisState struct {
|
|
||||||
//Pool Pool `json:"pool"`
|
|
||||||
//Params Params `json:"params"`
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func NewGenesisState(pool Pool, params Params, candidates []Candidate, bonds []Delegation) GenesisState {
|
|
||||||
//return GenesisState{
|
|
||||||
//Pool: pool,
|
|
||||||
//Params: params,
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
|
|
||||||
//// get raw genesis raw message for testing
|
|
||||||
//func DefaultGenesisState() GenesisState {
|
|
||||||
//return GenesisState{
|
|
||||||
//Pool: initialPool(),
|
|
||||||
//Params: defaultParams(),
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
|
|
||||||
//// fee information for a validator
|
|
||||||
//type Validator struct {
|
|
||||||
//Adjustments []sdk.Dec `json:"fee_adjustments"` // XXX Adjustment factors for lazy fee accounting, couples with Params.BondDenoms
|
|
||||||
//PrevBondedShares sdk.Dec `json:"prev_bonded_shares"` // total shares of a global hold pools
|
|
||||||
//}
|
|
||||||
|
|
||||||
////_________________________________________________________________________
|
|
||||||
|
|
||||||
//// Params defines the high level settings for staking
|
|
||||||
//type Params struct {
|
|
||||||
//FeeDenoms []string `json:"fee_denoms"` // accepted fee denoms
|
|
||||||
//ReservePoolFee sdk.Dec `json:"reserve_pool_fee"` // percent of fees which go to reserve pool
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func (p Params) equal(p2 Params) bool {
|
|
||||||
//return p.BondDenom == p2.BondDenom &&
|
|
||||||
//p.ReservePoolFee.Equal(p2.ReservePoolFee)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func defaultParams() Params {
|
|
||||||
//return Params{
|
|
||||||
//FeeDenoms: []string{"steak"},
|
|
||||||
//ReservePoolFee: sdk.NewDec(5, 100),
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
|
|
||||||
////_________________________________________________________________________
|
|
||||||
|
|
||||||
//// Pool - dynamic parameters of the current state
|
|
||||||
//type Pool struct {
|
|
||||||
//FeeReservePool sdk.Coins `json:"fee_reserve_pool"` // XXX reserve pool of collected fees for use by governance
|
|
||||||
//FeePool sdk.Coins `json:"fee_pool"` // XXX fee pool for all the fee shares which have already been distributed
|
|
||||||
//FeeSumReceived sdk.Coins `json:"fee_sum_received"` // XXX sum of all fees received, post reserve pool `json:"fee_sum_received"`
|
|
||||||
//FeeRecent sdk.Coins `json:"fee_recent"` // XXX most recent fee collected
|
|
||||||
//FeeAdjustments []sdk.Dec `json:"fee_adjustments"` // XXX Adjustment factors for lazy fee accounting, couples with Params.BondDenoms
|
|
||||||
//PrevBondedShares sdk.Dec `json:"prev_bonded_shares"` // XXX last recorded bonded shares
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func (p Pool) equal(p2 Pool) bool {
|
|
||||||
//return p.FeeReservePool.IsEqual(p2.FeeReservePool) &&
|
|
||||||
//p.FeePool.IsEqual(p2.FeePool) &&
|
|
||||||
//p.FeeSumReceived.IsEqual(p2.FeeSumReceived) &&
|
|
||||||
//p.FeeRecent.IsEqual(p2.FeeRecent) &&
|
|
||||||
//sdk.DecsEqual(p.FeeAdjustments, p2.FeeAdjustments) &&
|
|
||||||
//p.PrevBondedShares.Equal(p2.PrevBondedShares)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//// initial pool for testing
|
|
||||||
//func initialPool() Pool {
|
|
||||||
//return Pool{
|
|
||||||
//FeeReservePool: sdk.Coins(nil),
|
|
||||||
//FeePool: sdk.Coins(nil),
|
|
||||||
//FeeSumReceived: sdk.Coins(nil),
|
|
||||||
//FeeRecent: sdk.Coins(nil),
|
|
||||||
//FeeAdjustments: []sdk.Dec{sdk.ZeroDec()},
|
|
||||||
//PrevBondedShares: sdk.ZeroDec(),
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
|
|
||||||
////_________________________________________________________________________
|
|
||||||
|
|
||||||
//// Used in calculation of fee shares, added to a queue for each block where a power change occures
|
|
||||||
//type PowerChange struct {
|
|
||||||
//Height int64 `json:"height"` // block height at change
|
|
||||||
//Power sdk.Dec `json:"power"` // total power at change
|
|
||||||
//PrevPower sdk.Dec `json:"prev_power"` // total power at previous height-1
|
|
||||||
//FeesIn sdk.Coins `json:"fees_in"` // fees in at block height
|
|
||||||
//PrevFeePool sdk.Coins `json:"prev_fee_pool"` // total fees in at previous block height
|
|
||||||
//}
|
|
||||||
|
|
||||||
////_________________________________________________________________________
|
|
||||||
//// KEY MANAGEMENT
|
|
||||||
|
|
||||||
//var (
|
|
||||||
//// Keys for store prefixes
|
|
||||||
//PowerChangeKey = []byte{0x09} // prefix for power change object
|
|
||||||
//)
|
|
||||||
|
|
||||||
//// get the key for the accumulated update validators
|
|
||||||
//func GetPowerChangeKey(height int64) []byte {
|
|
||||||
//heightBytes := make([]byte, binary.MaxVarintLen64)
|
|
||||||
//binary.BigEndian.PutUint64(heightBytes, ^uint64(height)) // invert height (older validators first)
|
|
||||||
//return append(PowerChangeKey, heightBytes...)
|
|
||||||
//}
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
|
// coins with decimal
|
||||||
|
type DecCoins []DecCoin
|
||||||
|
|
||||||
|
// Coins which can have additional decimal points
|
||||||
|
type DecCoin struct {
|
||||||
|
Amount sdk.Dec
|
||||||
|
Denom string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Global state for distribution
|
||||||
|
type Global struct {
|
||||||
|
TotalValAccumUpdateHeight int64 // last height which the total validator accum was updated
|
||||||
|
TotalValAccum sdk.Dec // total valdator accum held by validators
|
||||||
|
Pool DecCoins // funds for all validators which have yet to be withdrawn
|
||||||
|
CommunityPool DecCoins // pool for community funds yet to be spent
|
||||||
|
}
|
||||||
|
|
||||||
|
// distribution info for a particular validator
|
||||||
|
type ValidatorDistInfo struct {
|
||||||
|
GlobalWithdrawalHeight int64 // last height this validator withdrew from the global pool
|
||||||
|
Pool DecCoins // rewards owed to delegators, commission has already been charged (includes proposer reward)
|
||||||
|
PoolCommission DecCoins // commission collected by this validator (pending withdrawal)
|
||||||
|
|
||||||
|
TotalDelAccumUpdateHeight int64 // last height which the total delegator accum was updated
|
||||||
|
TotalDelAccum sdk.Dec // total proposer pool accumulation factor held by delegators
|
||||||
|
}
|
||||||
|
|
||||||
|
// distribution info for a delegation
|
||||||
|
type DelegatorDistInfo struct {
|
||||||
|
WithdrawalHeight int64 // last time this delegation withdrew rewards
|
||||||
|
}
|
Loading…
Reference in New Issue