2018-03-22 06:39:31 -07:00
|
|
|
package stake
|
|
|
|
|
|
|
|
import (
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
|
|
)
|
|
|
|
|
2018-03-29 05:27:35 -07:00
|
|
|
// get the bond ratio of the global state
|
|
|
|
func (p Pool) bondedRatio() sdk.Rat {
|
|
|
|
if p.TotalSupply > 0 {
|
|
|
|
return sdk.NewRat(p.BondedPool, p.TotalSupply)
|
|
|
|
}
|
2018-04-30 14:21:14 -07:00
|
|
|
return sdk.ZeroRat()
|
2018-03-29 05:27:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// get the exchange rate of bonded token per issued share
|
|
|
|
func (p Pool) bondedShareExRate() sdk.Rat {
|
|
|
|
if p.BondedShares.IsZero() {
|
2018-04-30 14:21:14 -07:00
|
|
|
return sdk.OneRat()
|
2018-03-29 05:27:35 -07:00
|
|
|
}
|
|
|
|
return sdk.NewRat(p.BondedPool).Quo(p.BondedShares)
|
|
|
|
}
|
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
// get the exchange rate of unbonded tokens held in validators per issued share
|
2018-03-29 05:27:35 -07:00
|
|
|
func (p Pool) unbondedShareExRate() sdk.Rat {
|
|
|
|
if p.UnbondedShares.IsZero() {
|
2018-04-30 14:21:14 -07:00
|
|
|
return sdk.OneRat()
|
2018-03-29 05:27:35 -07:00
|
|
|
}
|
|
|
|
return sdk.NewRat(p.UnbondedPool).Quo(p.UnbondedShares)
|
|
|
|
}
|
2018-03-22 06:39:31 -07:00
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
// move a validators asset pool from bonded to unbonded pool
|
|
|
|
func (p Pool) bondedToUnbondedPool(validator Validator) (Pool, Validator) {
|
2018-03-22 06:39:31 -07:00
|
|
|
|
|
|
|
// replace bonded shares with unbonded shares
|
2018-05-09 21:01:58 -07:00
|
|
|
p, tokens := p.removeSharesBonded(validator.BondedShares)
|
|
|
|
p, validator.BondedShares = p.addTokensUnbonded(tokens)
|
2018-05-10 16:02:35 -07:00
|
|
|
validator.Status = sdk.Unbonded
|
2018-05-09 21:01:58 -07:00
|
|
|
return p, validator
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
// move a validators asset pool from unbonded to bonded pool
|
|
|
|
func (p Pool) unbondedToBondedPool(validator Validator) (Pool, Validator) {
|
2018-03-22 06:39:31 -07:00
|
|
|
|
|
|
|
// replace unbonded shares with bonded shares
|
2018-05-09 21:01:58 -07:00
|
|
|
p, tokens := p.removeSharesUnbonded(validator.BondedShares)
|
|
|
|
p, validator.BondedShares = p.addTokensBonded(tokens)
|
2018-05-10 16:02:35 -07:00
|
|
|
validator.Status = sdk.Bonded
|
2018-05-09 21:01:58 -07:00
|
|
|
return p, validator
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//_______________________________________________________________________
|
|
|
|
|
2018-03-29 02:43:15 -07:00
|
|
|
func (p Pool) addTokensBonded(amount int64) (p2 Pool, issuedShares sdk.Rat) {
|
2018-04-30 14:21:14 -07:00
|
|
|
issuedShares = sdk.NewRat(amount).Quo(p.bondedShareExRate()) // tokens * (shares/tokens)
|
2018-03-22 09:00:45 -07:00
|
|
|
p.BondedPool += amount
|
|
|
|
p.BondedShares = p.BondedShares.Add(issuedShares)
|
2018-03-28 13:37:42 -07:00
|
|
|
return p, issuedShares
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
2018-03-29 02:43:15 -07:00
|
|
|
func (p Pool) removeSharesBonded(shares sdk.Rat) (p2 Pool, removedTokens int64) {
|
2018-03-22 09:00:45 -07:00
|
|
|
removedTokens = p.bondedShareExRate().Mul(shares).Evaluate() // (tokens/shares) * shares
|
|
|
|
p.BondedShares = p.BondedShares.Sub(shares)
|
2018-04-03 20:41:08 -07:00
|
|
|
p.BondedPool = p.BondedPool - removedTokens
|
2018-03-28 13:37:42 -07:00
|
|
|
return p, removedTokens
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
2018-03-29 02:43:15 -07:00
|
|
|
func (p Pool) addTokensUnbonded(amount int64) (p2 Pool, issuedShares sdk.Rat) {
|
2018-04-30 14:21:14 -07:00
|
|
|
issuedShares = sdk.NewRat(amount).Quo(p.unbondedShareExRate()) // tokens * (shares/tokens)
|
2018-03-22 09:00:45 -07:00
|
|
|
p.UnbondedShares = p.UnbondedShares.Add(issuedShares)
|
|
|
|
p.UnbondedPool += amount
|
2018-03-28 13:37:42 -07:00
|
|
|
return p, issuedShares
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
2018-03-29 02:43:15 -07:00
|
|
|
func (p Pool) removeSharesUnbonded(shares sdk.Rat) (p2 Pool, removedTokens int64) {
|
2018-03-22 09:00:45 -07:00
|
|
|
removedTokens = p.unbondedShareExRate().Mul(shares).Evaluate() // (tokens/shares) * shares
|
|
|
|
p.UnbondedShares = p.UnbondedShares.Sub(shares)
|
|
|
|
p.UnbondedPool -= removedTokens
|
2018-03-28 13:37:42 -07:00
|
|
|
return p, removedTokens
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//_______________________________________________________________________
|
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
// add tokens to a validator
|
|
|
|
func (p Pool) validatorAddTokens(validator Validator,
|
|
|
|
amount int64) (p2 Pool, validator2 Validator, issuedDelegatorShares sdk.Rat) {
|
2018-03-22 06:39:31 -07:00
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
exRate := validator.delegatorShareExRate()
|
2018-03-30 13:51:40 -07:00
|
|
|
|
2018-03-22 06:39:31 -07:00
|
|
|
var receivedGlobalShares sdk.Rat
|
2018-05-10 16:02:35 -07:00
|
|
|
if validator.Status == sdk.Bonded {
|
2018-03-29 02:43:15 -07:00
|
|
|
p, receivedGlobalShares = p.addTokensBonded(amount)
|
2018-03-22 06:39:31 -07:00
|
|
|
} else {
|
2018-03-29 02:43:15 -07:00
|
|
|
p, receivedGlobalShares = p.addTokensUnbonded(amount)
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
2018-05-09 21:01:58 -07:00
|
|
|
validator.BondedShares = validator.BondedShares.Add(receivedGlobalShares)
|
2018-03-22 06:39:31 -07:00
|
|
|
|
|
|
|
issuedDelegatorShares = exRate.Mul(receivedGlobalShares)
|
2018-05-09 21:01:58 -07:00
|
|
|
validator.DelegatorShares = validator.DelegatorShares.Add(issuedDelegatorShares)
|
2018-03-29 05:27:35 -07:00
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
return p, validator, issuedDelegatorShares
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
// remove shares from a validator
|
|
|
|
func (p Pool) validatorRemoveShares(validator Validator,
|
|
|
|
shares sdk.Rat) (p2 Pool, validator2 Validator, createdCoins int64) {
|
2018-03-22 06:39:31 -07:00
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
//exRate := validator.delegatorShareExRate() //XXX make sure not used
|
2018-03-22 06:39:31 -07:00
|
|
|
|
2018-05-09 21:01:58 -07:00
|
|
|
globalPoolSharesToRemove := validator.delegatorShareExRate().Mul(shares)
|
2018-05-10 16:02:35 -07:00
|
|
|
if validator.Status == sdk.Bonded {
|
2018-03-29 02:43:15 -07:00
|
|
|
p, createdCoins = p.removeSharesBonded(globalPoolSharesToRemove)
|
2018-03-22 06:39:31 -07:00
|
|
|
} else {
|
2018-03-29 02:43:15 -07:00
|
|
|
p, createdCoins = p.removeSharesUnbonded(globalPoolSharesToRemove)
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|
2018-05-09 21:01:58 -07:00
|
|
|
validator.BondedShares = validator.BondedShares.Sub(globalPoolSharesToRemove)
|
|
|
|
validator.DelegatorShares = validator.DelegatorShares.Sub(shares)
|
|
|
|
return p, validator, createdCoins
|
2018-03-22 06:39:31 -07:00
|
|
|
}
|