blockbook/common/currencyrateticker.go
2023-04-24 23:58:08 +02:00

101 lines
2.8 KiB
Go

package common
import (
"strings"
"time"
)
// CurrencyRatesTicker contains coin ticker data fetched from API
type CurrencyRatesTicker struct {
Timestamp time.Time `json:"timestamp"` // return as unix timestamp in API
Rates map[string]float32 `json:"rates"` // rates of the base currency against a list of vs currencies
TokenRates map[string]float32 `json:"tokenRates,omitempty"` // rates of the tokens (identified by the address of the contract) against the base currency
}
var (
// TickerRecalculateTokenRate signals if it is necessary to recalculate token rate to base rate
// this happens when token rates are downloaded in TokenVsCurrency different from the base currency
TickerRecalculateTokenRate bool
// TickerTokenVsCurrency is the currency in which the token rates are downloaded
TickerTokenVsCurrency string
)
// Convert returns token rate in base currency
func (t *CurrencyRatesTicker) GetTokenRate(token string) (float32, bool) {
if t.TokenRates != nil {
rate, found := t.TokenRates[strings.ToLower(token)]
if !found {
return 0, false
}
if TickerRecalculateTokenRate {
vsRate, found := t.Rates[TickerTokenVsCurrency]
if !found || vsRate == 0 {
return 0, false
}
rate = rate / vsRate
}
return rate, found
}
return 0, false
}
// Convert converts value in base currency to toCurrency
func (t *CurrencyRatesTicker) Convert(baseValue float64, toCurrency string) float64 {
rate, found := t.Rates[toCurrency]
if !found {
return 0
}
return baseValue * float64(rate)
}
// ConvertTokenToBase converts token value to base currency
func (t *CurrencyRatesTicker) ConvertTokenToBase(value float64, token string) float64 {
rate, found := t.GetTokenRate(token)
if found {
return value * float64(rate)
}
return 0
}
// ConvertTokenToBase converts token value to toCurrency currency
func (t *CurrencyRatesTicker) ConvertToken(value float64, token string, toCurrency string) float64 {
baseValue := t.ConvertTokenToBase(value, token)
if baseValue > 0 {
return t.Convert(baseValue, toCurrency)
}
return 0
}
// TokenRateInCurrency return token rate in toCurrency currency
func (t *CurrencyRatesTicker) TokenRateInCurrency(token string, toCurrency string) float32 {
rate, found := t.GetTokenRate(token)
if found {
baseRate, found := t.Rates[toCurrency]
if found {
return baseRate * rate
}
}
return 0
}
// IsSuitableTicker checks if the ticker can provide data for given vsCurrency or token
func IsSuitableTicker(ticker *CurrencyRatesTicker, vsCurrency string, token string) bool {
if vsCurrency != "" {
if ticker.Rates == nil {
return false
}
if _, found := ticker.Rates[vsCurrency]; !found {
return false
}
}
if token != "" {
if ticker.TokenRates == nil {
return false
}
if _, found := ticker.TokenRates[token]; !found {
return false
}
}
return true
}