101 lines
2.8 KiB
Go
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
|
|
}
|