2018-09-04 13:19:37 -07:00
|
|
|
package types
|
|
|
|
|
|
|
|
import sdk "github.com/cosmos/cosmos-sdk/types"
|
|
|
|
|
|
|
|
// distribution info for a delegation
|
|
|
|
type DelegatorDistInfo struct {
|
2018-09-17 20:02:15 -07:00
|
|
|
DelegatorAddr sdk.AccAddress `json:"delegator_addr"`
|
|
|
|
ValOperatorAddr sdk.ValAddress `json:"val_operator_addr"`
|
|
|
|
WithdrawalHeight int64 `json:"withdrawal_height"` // last time this delegation withdrew rewards
|
2018-09-04 13:19:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// withdraw rewards from delegator
|
|
|
|
func (di DelegatorDistInfo) WithdrawRewards(g Global, vi ValidatorDistInfo,
|
2018-09-13 23:35:02 -07:00
|
|
|
height int64, totalBonded, vdTokens, totalDelShares, delegatorShares,
|
|
|
|
commissionRate Dec) (di DelegatorDistInfo, g Global, withdrawn DecCoins) {
|
2018-09-04 13:19:37 -07:00
|
|
|
|
|
|
|
vi.UpdateTotalDelAccum(height, totalDelShares)
|
|
|
|
g = vi.TakeGlobalRewards(g, height, totalBonded, vdTokens, commissionRate)
|
|
|
|
|
|
|
|
blocks = height - di.WithdrawalHeight
|
|
|
|
di.WithdrawalHeight = height
|
2018-09-13 23:35:02 -07:00
|
|
|
accum := delegatorShares.Mul(sdk.NewDec(blocks))
|
|
|
|
withdrawalTokens := vi.Pool.Mul(accum.Quo(vi.TotalDelAccum))
|
2018-09-04 13:19:37 -07:00
|
|
|
|
2018-09-13 23:35:02 -07:00
|
|
|
vi.Pool = vi.Pool.Sub(withdrawalTokens)
|
|
|
|
vi.TotalDelAccum = vi.TotalDelAccum.sub(accum)
|
2018-09-04 13:19:37 -07:00
|
|
|
|
|
|
|
return di, g, withdrawalTokens
|
|
|
|
}
|
2018-09-17 20:02:15 -07:00
|
|
|
|
|
|
|
//_____________________________________________________________________
|
|
|
|
|
|
|
|
// withdraw address for the delegation rewards
|
|
|
|
type DelegatorWithdrawInfo struct {
|
|
|
|
DelegatorAddr sdk.AccAddress `json:"delegator_addr"`
|
|
|
|
WithdrawAddr sdk.AccAddress `json:"withdraw_addr"`
|
|
|
|
}
|