contrib/opbot/internal/client.go
// Package internal provides the RFQ client implementation.
package internal
import (
"context"
"fmt"
"net/http"
"github.com/dubonzi/otelresty"
"github.com/go-http-utils/headers"
"github.com/go-resty/resty/v2"
"github.com/synapsecns/sanguine/core/metrics"
)
const (
getRFQRoute = "/transaction-id/%s"
)
// RFQClient is the interface for the RFQ client.
type RFQClient interface {
// GetRFQ gets a quote request by transaction ID.
GetRFQ(ctx context.Context, txIdentifier string) (resp *GetRFQByTxIDResponse, status string, err error)
}
type rfqClientImpl struct {
client *resty.Client
}
// NewRFQClient creates a new RFQClient.
func NewRFQClient(handler metrics.Handler, indexerURL string) RFQClient {
client := resty.New()
client.SetBaseURL(indexerURL)
client.SetHeader(headers.UserAgent, "rfq-client")
otelresty.TraceClient(client, otelresty.WithTracerProvider(handler.GetTracerProvider()))
return &rfqClientImpl{
client: client,
}
}
// GetRFQByTxID gets a quote request by transaction ID or transaction hash.
func (r *rfqClientImpl) GetRFQ(ctx context.Context, txIdentifier string) (*GetRFQByTxIDResponse, string, error) {
var res GetRFQByTxIDResponse
resp, err := r.client.R().SetContext(ctx).
SetResult(&res).
Get(fmt.Sprintf(getRFQRoute, txIdentifier))
if err != nil {
return nil, "", fmt.Errorf("failed to get quote request by tx ID: %w", err)
}
if resp.StatusCode() != http.StatusOK {
return nil, "", fmt.Errorf("unexpected status code: %d", resp.StatusCode())
}
var status string
switch {
case res.BridgeClaim != (BridgeClaim{}):
status = "Claimed"
case res.BridgeProof != (BridgeProof{}):
status = "Proven"
case res.BridgeRelay != (BridgeRelay{}):
status = "Relayed"
case res.BridgeRequest != (BridgeRequest{}):
status = "Requested"
default:
status = "Unknown"
}
return &res, status, nil
}