diff --git a/pkg/entities/defi.go b/pkg/entities/defi.go index 2813a670..842ee244 100644 --- a/pkg/entities/defi.go +++ b/pkg/entities/defi.go @@ -225,6 +225,21 @@ func (e *Entity) GetCoinData(coinID string, isDominanceChart bool) (*response.Ge } data.AssetPlatform = platform + // if no market cap data, get token supply to calculate it + // support solana only for now + if data.AssetPlatformID == "solana" && data.Platforms != nil { + currency := "usd" + if _, ok := data.Platforms[data.AssetPlatformID]; ok && data.MarketData.MarketCap[currency] == 0 { + supply, err := util.GetSplTokenSupply(data.Platforms[data.AssetPlatformID]) + if err != nil { + e.log.Fields(logger.Fields{"id": data.AssetPlatformID}).Error(err, "[entity.GetCoinData] util.GetSplTokenSupply() failed") + return data, nil, http.StatusOK + } + price := data.MarketData.CurrentPrice[currency] + data.MarketData.MarketCap[currency] = price * supply + } + } + return data, nil, http.StatusOK } diff --git a/pkg/response/defi.go b/pkg/response/defi.go index c832ade2..78cac426 100644 --- a/pkg/response/defi.go +++ b/pkg/response/defi.go @@ -69,7 +69,7 @@ type GetCoinResponse struct { Symbol string `json:"symbol"` AssetPlatformID string `json:"asset_platform_id"` AssetPlatform *AssetPlatformResponseData `json:"asset_platform"` - Platforms interface{} `json:"platforms"` + Platforms map[string]string `json:"platforms"` BlockTimeInMinutes int64 `json:"block_time_in_minutes"` HashingAlgorithm interface{} `json:"hashing_algorithm"` Categories []string `json:"categories"` diff --git a/pkg/util/solana.go b/pkg/util/solana.go new file mode 100644 index 00000000..7711495c --- /dev/null +++ b/pkg/util/solana.go @@ -0,0 +1,20 @@ +package util + +import ( + "context" + "math" + + "github.com/portto/solana-go-sdk/client" + "github.com/portto/solana-go-sdk/rpc" +) + +func GetSplTokenSupply(addr string) (float64, error) { + c := client.NewClient(rpc.MainnetRPCEndpoint) + supply, dec, err := c.GetTokenSupply(context.Background(), addr) + if err != nil { + return 0, err + } + + result := float64(supply) / math.Pow10(int(dec)) + return result, nil +}