cosmos-sdk/x/stake/pool.go

119 lines
3.9 KiB
Go
Raw Normal View History

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)
}
// get the exchange rate of unbonded tokens held in candidates per issued share
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
// move a candidates asset pool from bonded to unbonded pool
2018-03-28 13:37:42 -07:00
func (p Pool) bondedToUnbondedPool(candidate Candidate) (Pool, Candidate) {
2018-03-22 06:39:31 -07:00
// replace bonded shares with unbonded shares
2018-05-04 12:38:25 -07:00
p, tokens := p.removeSharesBonded(candidate.BondedShares)
p, candidate.BondedShares = p.addTokensUnbonded(tokens)
2018-03-22 06:39:31 -07:00
candidate.Status = Unbonded
2018-03-28 13:37:42 -07:00
return p, candidate
2018-03-22 06:39:31 -07:00
}
// move a candidates asset pool from unbonded to bonded pool
2018-03-28 13:37:42 -07:00
func (p Pool) unbondedToBondedPool(candidate Candidate) (Pool, Candidate) {
2018-03-22 06:39:31 -07:00
// replace unbonded shares with bonded shares
2018-05-04 12:38:25 -07:00
p, tokens := p.removeSharesUnbonded(candidate.BondedShares)
p, candidate.BondedShares = p.addTokensBonded(tokens)
2018-03-22 06:39:31 -07:00
candidate.Status = Bonded
2018-03-28 13:37:42 -07:00
return p, candidate
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
}
//_______________________________________________________________________
// add tokens to a candidate
2018-03-29 02:43:15 -07:00
func (p Pool) candidateAddTokens(candidate Candidate,
amount int64) (p2 Pool, candidate2 Candidate, issuedDelegatorShares sdk.Rat) {
2018-03-22 06:39:31 -07:00
2018-03-30 13:51:40 -07:00
exRate := candidate.delegatorShareExRate()
2018-03-22 06:39:31 -07:00
var receivedGlobalShares sdk.Rat
if candidate.Status == 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-04 12:38:25 -07:00
candidate.BondedShares = candidate.BondedShares.Add(receivedGlobalShares)
2018-03-22 06:39:31 -07:00
issuedDelegatorShares = exRate.Mul(receivedGlobalShares)
2018-05-04 12:38:25 -07:00
candidate.DelegatorShares = candidate.DelegatorShares.Add(issuedDelegatorShares)
2018-03-29 05:27:35 -07:00
2018-03-28 13:37:42 -07:00
return p, candidate, issuedDelegatorShares
2018-03-22 06:39:31 -07:00
}
// remove shares from a candidate
2018-03-29 02:43:15 -07:00
func (p Pool) candidateRemoveShares(candidate Candidate,
shares sdk.Rat) (p2 Pool, candidate2 Candidate, createdCoins int64) {
2018-03-22 06:39:31 -07:00
//exRate := candidate.delegatorShareExRate() //XXX make sure not used
globalPoolSharesToRemove := candidate.delegatorShareExRate().Mul(shares)
if candidate.Status == 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-04 12:38:25 -07:00
candidate.BondedShares = candidate.BondedShares.Sub(globalPoolSharesToRemove)
candidate.DelegatorShares = candidate.DelegatorShares.Sub(shares)
2018-03-28 13:37:42 -07:00
return p, candidate, createdCoins
2018-03-22 06:39:31 -07:00
}