cosmos-sdk/x/distribution/types/dec_coin.go

104 lines
2.3 KiB
Go
Raw Normal View History

2018-09-05 16:15:15 -07:00
package types
2018-09-10 15:37:58 -07:00
import (
"strings"
2018-09-05 16:15:15 -07:00
2018-09-10 15:37:58 -07:00
sdk "github.com/cosmos/cosmos-sdk/types"
)
2018-09-05 16:15:15 -07:00
// Coins which can have additional decimal points
type DecCoin struct {
Denom string `json:"denom"`
2018-09-10 15:37:58 -07:00
Amount sdk.Dec `json:"amount"`
2018-09-05 16:15:15 -07:00
}
func NewDecCoin(coin sdk.Coin) DecCoin {
2018-09-19 16:00:21 -07:00
return DecCoin{
2018-09-05 16:15:15 -07:00
Denom: coin.Denom,
2018-09-19 16:00:21 -07:00
Amount: sdk.NewDecFromInt(coin.Amount),
2018-09-05 16:15:15 -07:00
}
}
2018-09-10 15:37:58 -07:00
// Adds amounts of two coins with same denom
func (coin DecCoin) Plus(coinB DecCoin) DecCoin {
if !(coin.Denom == coinB.Denom) {
return coin
}
2018-09-19 16:00:21 -07:00
return DecCoin{coin.Denom, coin.Amount.Add(coinB.Amount)}
2018-09-10 15:37:58 -07:00
}
// return the decimal coins with trunctated decimals
func (coin DecCoin) TruncateDecimal() sdk.Coin {
return sdk.NewCoin(coin.Denom, coin.Amount.TruncateInt())
}
//_______________________________________________________________________
// coins with decimal
type DecCoins []DecCoin
2018-09-05 16:15:15 -07:00
func NewDecCoins(coins sdk.Coins) DecCoins {
dcs := make(DecCoins, len(coins))
for i, coin := range coins {
dcs[i] = NewDecCoin(coin)
}
2018-09-19 16:00:21 -07:00
return dcs
2018-09-05 16:15:15 -07:00
}
2018-09-10 15:37:58 -07:00
2018-09-19 16:00:21 -07:00
// return the coins with trunctated decimals
2018-09-10 15:37:58 -07:00
func (coins DecCoins) TruncateDecimal() sdk.Coins {
2018-09-19 16:00:21 -07:00
out := make(sdk.Coins, len(coins))
2018-09-10 15:37:58 -07:00
for i, coin := range coins {
out[i] = coin.TruncateDecimal()
}
2018-09-19 16:00:21 -07:00
return out
2018-09-10 15:37:58 -07:00
}
// Plus combines two sets of coins
// CONTRACT: Plus will never return Coins where one Coin has a 0 amount.
func (coins DecCoins) Plus(coinsB DecCoins) DecCoins {
sum := ([]DecCoin)(nil)
indexA, indexB := 0, 0
lenA, lenB := len(coins), len(coinsB)
for {
if indexA == lenA {
if indexB == lenB {
return sum
}
return append(sum, coinsB[indexB:]...)
} else if indexB == lenB {
return append(sum, coins[indexA:]...)
}
coinA, coinB := coins[indexA], coinsB[indexB]
switch strings.Compare(coinA.Denom, coinB.Denom) {
case -1:
sum = append(sum, coinA)
indexA++
case 0:
if coinA.Amount.Add(coinB.Amount).IsZero() {
// ignore 0 sum coin type
} else {
sum = append(sum, coinA.Plus(coinB))
}
indexA++
indexB++
case 1:
sum = append(sum, coinB)
indexB++
}
}
}
2018-09-13 23:35:02 -07:00
// multiply all the coins by a multiple
func (coins DecCoins) Mul(multiple sdk.Dec) DecCoins {
products := make([]DecCoin, len(coins))
for i, coin := range coins {
2018-09-19 16:33:12 -07:00
product := DecCoin{
2018-09-13 23:35:02 -07:00
Denom: coin.Denom,
Amount: coin.Amount.Mul(multiple),
}
products[i] = product
}
return products
}