github.com/diadata-org/diadata@v1.4.593/pkg/dia/helpers/velarhelper/client.go (about)

     1  package velarhelper
     2  
     3  import (
     4  	"crypto/tls"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"net/http/httputil"
    10  	"time"
    11  
    12  	"github.com/sirupsen/logrus"
    13  )
    14  
    15  const (
    16  	DeployerAddress   = "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1"
    17  	DeployerAddressV2 = "SP20X3DC5R091J8B6YPQT638J8NR1W83KN6TN5BJY"
    18  	VelarCoreAddress  = DeployerAddress + ".univ2-core"
    19  	VelarURL          = "https://api.velar.co"
    20  )
    21  
    22  type VelarClient struct {
    23  	debug      bool
    24  	httpClient *http.Client
    25  	logger     *logrus.Entry
    26  }
    27  
    28  func NewVelarClient(logger *logrus.Entry, isDebug bool) *VelarClient {
    29  	tr := &http.Transport{
    30  		TLSClientConfig: &tls.Config{
    31  			MinVersion: tls.VersionTLS12,
    32  			MaxVersion: 0,
    33  		},
    34  	}
    35  	httpClient := &http.Client{
    36  		Transport: tr,
    37  		Timeout:   10 * time.Second,
    38  	}
    39  
    40  	return &VelarClient{
    41  		debug:      isDebug,
    42  		httpClient: httpClient,
    43  		logger:     logger,
    44  	}
    45  }
    46  
    47  func (c *VelarClient) GetAllTokens() ([]TokenMetadata, error) {
    48  	req, err := http.NewRequest(http.MethodGet, VelarURL+"/tokens", http.NoBody)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  
    53  	var tokens []TokenMetadata
    54  	err = c.callVelarAPI(req, &tokens)
    55  	if err != nil {
    56  		return nil, err
    57  	}
    58  	return tokens, nil
    59  }
    60  
    61  func (c *VelarClient) GetAllTickers() ([]Ticker, error) {
    62  	req, err := http.NewRequest(http.MethodGet, VelarURL+"/tickers", http.NoBody)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	var tickers []Ticker
    68  	err = c.callVelarAPI(req, &tickers)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  	return tickers, nil
    73  }
    74  
    75  func (c *VelarClient) callVelarAPI(request *http.Request, target interface{}) error {
    76  	if c.debug {
    77  		dump, err := httputil.DumpRequestOut(request, true)
    78  		if err != nil {
    79  			c.logger.WithError(err).Error("failed to dump request out")
    80  			return err
    81  		}
    82  		c.logger.Infof("\n%s", string(dump))
    83  	}
    84  
    85  	resp, err := c.httpClient.Do(request)
    86  	if err != nil {
    87  		return err
    88  	}
    89  	defer resp.Body.Close()
    90  
    91  	if c.debug {
    92  		dump, err := httputil.DumpResponse(resp, true)
    93  		if err != nil {
    94  			c.logger.WithError(err).Error("failed to dump response")
    95  			return err
    96  		}
    97  		c.logger.Infof("\n%s\n", string(dump))
    98  	}
    99  
   100  	if resp.StatusCode != http.StatusOK {
   101  		err = fmt.Errorf("failed to call Velar API, status code: %d", resp.StatusCode)
   102  		c.logger.Error(err.Error())
   103  		return err
   104  	}
   105  
   106  	data, err := io.ReadAll(resp.Body)
   107  	if err != nil {
   108  		c.logger.WithError(err).Error("failed to read response body")
   109  		return err
   110  	}
   111  
   112  	err = json.Unmarshal(data, &target)
   113  	if err != nil {
   114  		c.logger.Error("failed to decode response body")
   115  		return err
   116  	}
   117  	return nil
   118  }