github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/pkg/currency/fiat.go (about)

     1  package currency
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	fiatcurrency1 "github.com/NpoolPlatform/chain-middleware/pkg/mw/fiat/currency"
     8  	fiatcurrencyfeed1 "github.com/NpoolPlatform/chain-middleware/pkg/mw/fiat/currency/feed"
     9  	fiatcurrencymwpb "github.com/NpoolPlatform/message/npool/chain/mw/v1/fiat/currency"
    10  	fiatcurrencyfeedmwpb "github.com/NpoolPlatform/message/npool/chain/mw/v1/fiat/currency/feed"
    11  
    12  	coinbase "github.com/NpoolPlatform/chain-middleware/pkg/currency/coinbase"
    13  	coingecko "github.com/NpoolPlatform/chain-middleware/pkg/currency/coingecko"
    14  
    15  	"github.com/NpoolPlatform/go-service-framework/pkg/logger"
    16  	cruder "github.com/NpoolPlatform/libent-cruder/pkg/cruder"
    17  	basetypes "github.com/NpoolPlatform/message/npool/basetypes/v1"
    18  	"github.com/shopspring/decimal"
    19  )
    20  
    21  //nolint:funlen,gocyclo
    22  func _refreshFiats(ctx context.Context, feedType basetypes.CurrencyFeedType) error {
    23  	offset := int32(0)
    24  	const limit = int32(100)
    25  
    26  	for {
    27  		h1, err := fiatcurrencyfeed1.NewHandler(
    28  			ctx,
    29  			fiatcurrencyfeed1.WithConds(&fiatcurrencyfeedmwpb.Conds{
    30  				FeedType: &basetypes.Uint32Val{Op: cruder.EQ, Value: uint32(feedType)},
    31  				Disabled: &basetypes.BoolVal{Op: cruder.EQ, Value: false},
    32  			}),
    33  			fiatcurrencyfeed1.WithOffset(offset),
    34  			fiatcurrencyfeed1.WithLimit(limit),
    35  		)
    36  		if err != nil {
    37  			logger.Sugar().Errorw(
    38  				"_refreshFiats",
    39  				"Error", err,
    40  			)
    41  			return err
    42  		}
    43  
    44  		feeds, _, err := h1.GetFeeds(ctx)
    45  		if err != nil {
    46  			logger.Sugar().Errorw(
    47  				"_refreshFiats",
    48  				"Error", err,
    49  			)
    50  			return err
    51  		}
    52  		if len(feeds) == 0 {
    53  			return nil
    54  		}
    55  
    56  		feedMap := map[string]*fiatcurrencyfeedmwpb.Feed{}
    57  		fiatNames := []string{}
    58  
    59  		for _, _feed := range feeds {
    60  			if _feed.FeedFiatName == "" {
    61  				continue
    62  			}
    63  			feedMap[_feed.FiatID] = _feed
    64  			fiatNames = append(fiatNames, _feed.FeedFiatName)
    65  		}
    66  		if len(fiatNames) == 0 {
    67  			return fmt.Errorf("invalid feeds")
    68  		}
    69  
    70  		var prices map[string]decimal.Decimal
    71  		switch feedType {
    72  		case basetypes.CurrencyFeedType_CoinGecko:
    73  			prices, err = coingecko.CoinGeckoFiatPrices(fiatNames)
    74  		case basetypes.CurrencyFeedType_CoinBase:
    75  			prices, err = coinbase.CoinBaseFiatPrices(fiatNames)
    76  		default:
    77  			return fmt.Errorf("invalid feedtype")
    78  		}
    79  		if err != nil {
    80  			logger.Sugar().Errorw(
    81  				"_refreshFiats",
    82  				"Error", err,
    83  			)
    84  			return err
    85  		}
    86  
    87  		_feedMap := map[string]*fiatcurrencyfeedmwpb.Feed{}
    88  		fiatRefreshed := map[string]bool{}
    89  		for _, _feed := range feeds {
    90  			_feedMap[_feed.FeedFiatName] = _feed
    91  		}
    92  
    93  		reqs := []*fiatcurrencymwpb.CurrencyReq{}
    94  		for _feedFiatName, _price := range prices {
    95  			_feed, ok := _feedMap[_feedFiatName]
    96  			if !ok {
    97  				continue
    98  			}
    99  			_priceStr := _price.String()
   100  			reqs = append(reqs, &fiatcurrencymwpb.CurrencyReq{
   101  				FiatID:          &_feed.FiatID,
   102  				FeedType:        &feedType,
   103  				MarketValueHigh: &_priceStr,
   104  				MarketValueLow:  &_priceStr,
   105  			})
   106  			fiatRefreshed[_feed.FiatID] = true
   107  		}
   108  
   109  		for _, _feed := range feeds {
   110  			refreshed, ok := fiatRefreshed[_feed.FiatID]
   111  			if !ok {
   112  				logger.Sugar().Warnw(
   113  					"_refreshFiats",
   114  					"FiatID", _feed.FiatID,
   115  					"Refreshed", refreshed,
   116  					"FeedFiatName", _feed.FeedFiatName,
   117  				)
   118  			}
   119  		}
   120  
   121  		h2, err := fiatcurrency1.NewHandler(
   122  			ctx,
   123  			fiatcurrency1.WithReqs(reqs, true),
   124  		)
   125  		if err != nil {
   126  			logger.Sugar().Errorw(
   127  				"_refreshFiats",
   128  				"Error", err,
   129  			)
   130  			return err
   131  		}
   132  
   133  		_, err = h2.CreateCurrencies(ctx)
   134  		if err != nil {
   135  			logger.Sugar().Errorw(
   136  				"_refreshFiats",
   137  				"Error", err,
   138  			)
   139  			return err
   140  		}
   141  
   142  		offset += limit
   143  	}
   144  }
   145  
   146  func refreshFiats(ctx context.Context) {
   147  	if err := _refreshFiats(ctx, basetypes.CurrencyFeedType_CoinGecko); err != nil {
   148  		logger.Sugar().Warnw(
   149  			"refreshFiats",
   150  			"FeedType", basetypes.CurrencyFeedType_CoinGecko,
   151  			"Error", err,
   152  		)
   153  	}
   154  
   155  	if err := _refreshFiats(ctx, basetypes.CurrencyFeedType_CoinBase); err != nil {
   156  		logger.Sugar().Warnw(
   157  			"refreshFiats",
   158  			"FeedType", basetypes.CurrencyFeedType_CoinGecko,
   159  			"Error", err,
   160  		)
   161  	}
   162  }