Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
phucledien committed Oct 2, 2023
2 parents 911d3d8 + 5ed11b5 commit 736f419
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 34 deletions.
22 changes: 19 additions & 3 deletions pkg/entities/defi.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,29 @@ func (e *Entity) GetHistoricalMarketChart(req *request.GetMarketChartRequest) (*

data, err := e.svc.GeckoTerminal.GetHistoricalMarketData(nerwork, poolAddr, now.Unix())
if err != nil {
return nil, err, 500
if errors.Is(err, baseerrs.ErrTokenNotSupportedYet) {
return nil, err, http.StatusUnprocessableEntity
}
e.log.Fields(logger.Fields{"req": req}).Error(err, "[entity.GetHistoricalMarketChart] svc.GeckoTerminal.GetHistoricalMarketData() failed")
return nil, err, http.StatusInternalServerError
}

resp = data
default:
data, err, statusCode := e.svc.CoinGecko.GetHistoricalMarketData(req.CoinID, req.Currency, req.Days)
if err != nil {
e.log.Fields(logger.Fields{"req": req}).Error(err, "[entity.GetHistoricalMarketChart] svc.CoinGecko.GetHistoricalMarketData() failed")
return nil, err, statusCode
}

resp = data
}

data := &response.CoinPriceHistoryResponse{}

if len(resp.Prices) == 0 {
return data, nil, http.StatusOK
}

for _, p := range resp.Prices {
timestamp := time.UnixMilli(int64(p[0])).Format("01-02")
data.Times = append(data.Times, timestamp)
Expand Down Expand Up @@ -680,7 +689,7 @@ func (e *Entity) queryCoins(guildID, query string) ([]model.CoingeckoSupportedTo
switch len(searchResult) {
case 0:
e.log.Fields(logger.Fields{"query": query}).Error(err, "[entity.queryCoins] svc.CoinGecko.SearchCoins - no data found")
return nil, nil, fmt.Errorf("coin %s not found", query)
return nil, nil, baseerrs.ErrRecordNotFound
case 1:
coin, err, code := e.svc.CoinGecko.GetCoin(searchResult[0].ID)
if err != nil {
Expand All @@ -700,6 +709,7 @@ func (e *Entity) queryCoins(guildID, query string) ([]model.CoingeckoSupportedTo
func (e *Entity) CompareToken(base, target, interval, guildID string) (*response.CompareTokenReponseData, error) {
baseSearch, baseCoin, err := e.queryCoins(guildID, base)
if err != nil {
// if
e.log.Fields(logger.Fields{"guild_id": guildID, "base": base}).Error(err, "[entity.CompareToken] queryCoins failed")
return nil, err
}
Expand Down Expand Up @@ -1317,6 +1327,9 @@ func (e *Entity) GetGasTracker() ([]response.GasTrackerResponse, error) {
chain, err := e.repo.Chain.GetByShortName(chainSp)
if err != nil {
e.log.Fields(logger.Fields{"chain": chain}).Error(err, "[entity.GetGasTracker] repo.Chain.GetByShortName() failed")
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, baseerrs.ErrRecordNotFound
}
return nil, err
}
listChain = append(listChain, *chain)
Expand All @@ -1335,6 +1348,9 @@ func (e *Entity) GetChainGasTracker(chain string) (*response.GasTrackerResponse,
chainModel, err := e.repo.Chain.GetByShortName(chain)
if err != nil {
e.log.Error(err, "[entity.GetChainGasTracker] repo.Chain.GetByShortName() failed")
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, baseerrs.ErrRecordNotFound
}
return nil, err
}

Expand Down
1 change: 1 addition & 0 deletions pkg/model/errors/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,5 @@ var (
ErrInvalidCoingeckoSvcParam = NewStringError("Invalid parameter", 400)
ErrFriendTechKeyAlreadyTracked = NewStringError("Friend tech key already tracked", 409)
ErrFriendTechKeyNotTrackedYet = NewStringError("Friend tech key not tracked yet", 409)
ErrTokenNotSupportedYet = NewStringError("Token not supported yet", 422)
)
69 changes: 43 additions & 26 deletions pkg/service/chainexplorer/chainexplorer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,39 @@ package chainexplorer
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"

"github.com/defipod/mochi/pkg/cache"
"github.com/defipod/mochi/pkg/config"
"github.com/defipod/mochi/pkg/logger"
"github.com/defipod/mochi/pkg/model"
"github.com/defipod/mochi/pkg/response"
"github.com/defipod/mochi/pkg/util"
)

type chainExplorer struct {
cfg config.Config
log logger.Logger
cfg config.Config
log logger.Logger
cache cache.Cache
}

func NewService(cfg config.Config, log logger.Logger) Service {
func NewService(cfg config.Config, log logger.Logger, cache cache.Cache) Service {
return &chainExplorer{
cfg: cfg,
log: log,
cfg: cfg,
log: log,
cache: cache,
}
}

var (
listChainSupportGasTracker = []string{"ftm", "bsc", "eth", "polygon"}
)

func (c *chainExplorer) GetGasTracker(listChain []model.Chain) ([]response.GasTrackerResponse, error) {
apiKey := ""
gasTrackerResp := make([]response.GasTrackerResponse, 0)
for _, chain := range listChain {
apiKey = c.getChainApiKey(chain.ShortName)

gasTracker, err := c.executeGetGasTracker(chain.APIBaseURL, apiKey)
url := fmt.Sprintf("%smodule=gastracker&action=gasoracle&apikey=%s", chain.APIBaseURL, apiKey)
gasTracker, err := c.executeGetGasTracker(url)
if err != nil {
c.log.Fields(logger.Fields{"chain": chain}).Error(err, "failed to get gas tracker")
return nil, err
Expand Down Expand Up @@ -67,28 +68,44 @@ func (c *chainExplorer) getChainApiKey(chain string) string {
return ""
}
}
func (c *chainExplorer) executeGetGasTracker(url, apiKey string) (*response.ChainExplorerGasTracker, error) {
var client = &http.Client{}
request, err := http.NewRequest("GET", fmt.Sprintf("%smodule=gastracker&action=gasoracle&apikey=%s", url, apiKey), nil)
if err != nil {
return nil, err

func (c *chainExplorer) executeGetGasTracker(url string) (*response.ChainExplorerGasTracker, error) {
resp := &response.ChainExplorerGasTracker{}
cached, err := c.doCacheGasTracker(url)
if err == nil && cached != "" {
go c.doNetworkGetGasTracker(url, resp)
return resp, json.Unmarshal([]byte(cached), resp)
}

responseURL, err := client.Do(request)
if err != nil {
if err := c.doNetworkGetGasTracker(url, resp); err != nil {
c.log.Error(err, "[chainexplorer.executeGasTracker] c.doNetworkGetGastracker() failed")
return nil, err
}

defer responseURL.Body.Close()
resBody, err := ioutil.ReadAll(responseURL.Body)
return resp, nil
}

func (c *chainExplorer) doNetworkGetGasTracker(url string, resp interface{}) error {
query := util.SendRequestQuery{
URL: url,
ParseForm: resp,
}
statusCode, err := util.SendRequest(query)
if err != nil {
return nil, err
return fmt.Errorf("send request failed: %v", err)
}

res := &response.ChainExplorerGasTracker{}
err = json.Unmarshal(resBody, res)
if err != nil {
return nil, err
if statusCode != http.StatusOK {
return fmt.Errorf("get gas tracker from explorer failed, status code: %d", statusCode)
}
return res, nil

// cache data
bytes, _ := json.Marshal(resp)
c.cache.Set(url, string(bytes), 1*time.Hour)

return nil
}

func (c *chainExplorer) doCacheGasTracker(url string) (string, error) {
return c.cache.GetString(url)
}
10 changes: 8 additions & 2 deletions pkg/service/geckoterminal/geckoterminal.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ import (
"net/url"
"strconv"

"github.com/defipod/mochi/pkg/config"
"github.com/defipod/mochi/pkg/response"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/go-rod/stealth"

"github.com/defipod/mochi/pkg/config"
"github.com/defipod/mochi/pkg/model/errors"
"github.com/defipod/mochi/pkg/response"
)

const (
Expand Down Expand Up @@ -236,6 +238,10 @@ func (g *GeckoTerminal) GetHistoricalMarketData(network, poolAddr string, before
return nil, err
}

if len(candlesticks.Data.Attributes.OhlcvList) == 0 {
return nil, errors.ErrTokenNotSupportedYet
}

prices := [][]float64{}
marketCaps := [][]float64{}

Expand Down
9 changes: 9 additions & 0 deletions pkg/service/geckoterminal/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,3 +164,12 @@ type CandlestickData struct {
type CandlestickAttributes struct {
OhlcvList [][]float64 `json:"ohlcv_list"`
}

type ErrorResp struct {
Errors []Error `json:"errors"`
}

type Error struct {
Status string `json:"status"`
Title string `json:"title"`
}
5 changes: 2 additions & 3 deletions pkg/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package service
import (
"fmt"

"github.com/defipod/mochi/pkg/service/friendtech"

"github.com/go-redis/redis/v8"

"github.com/defipod/mochi/pkg/cache"
Expand All @@ -23,6 +21,7 @@ import (
"github.com/defipod/mochi/pkg/service/dexscreener"
"github.com/defipod/mochi/pkg/service/discord"
"github.com/defipod/mochi/pkg/service/ethplorer"
"github.com/defipod/mochi/pkg/service/friendtech"
"github.com/defipod/mochi/pkg/service/geckoterminal"
"github.com/defipod/mochi/pkg/service/github"
"github.com/defipod/mochi/pkg/service/indexer"
Expand Down Expand Up @@ -109,7 +108,7 @@ func NewService(
Bluemove: bluemove.New(&cfg, log),
MochiProfile: mochiprofile.NewService(&cfg, log),
MochiPay: mochipay.NewService(&cfg, log),
ChainExplorer: chainexplorer.NewService(cfg, log),
ChainExplorer: chainexplorer.NewService(cfg, log, cache),
Sui: sui.New(&cfg, log, cache),
Birdeye: birdeye.NewService(&cfg, log, cache),
Swap: swap.New(&cfg, log),
Expand Down

0 comments on commit 736f419

Please sign in to comment.