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 }