diff --git a/services/omnirpc/http/capture_client.go b/services/omnirpc/http/capture_client.go index 2a791a2d6e..606a067791 100644 --- a/services/omnirpc/http/capture_client.go +++ b/services/omnirpc/http/capture_client.go @@ -2,22 +2,28 @@ package http import ( "context" + "fmt" + "github.com/ethereum/go-ethereum/common" "github.com/synapsecns/sanguine/core/bytemap" + "github.com/synapsecns/sanguine/core/metrics" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) // CaptureClient is a mock client used for checking response values. type CaptureClient struct { requests []*CapturedRequest responseFunc MakeResponseFunc + handler metrics.Handler } // MakeResponseFunc is used for mocking responses. type MakeResponseFunc func(c *CapturedRequest) (Response, error) // NewCaptureClient creates anew client for testing. -func NewCaptureClient(responseFunc MakeResponseFunc) *CaptureClient { - return &CaptureClient{requests: []*CapturedRequest{}, responseFunc: responseFunc} +func NewCaptureClient(handler metrics.Handler, responseFunc MakeResponseFunc) *CaptureClient { + return &CaptureClient{requests: []*CapturedRequest{}, responseFunc: responseFunc, handler: handler} } // Requests turns a list of sent requests. These are not mutation safe. @@ -30,6 +36,7 @@ func (c *CaptureClient) NewRequest() Request { request := CapturedRequest{ Client: c, StringHeaders: make(map[string]string), + Handler: c.handler, } c.requests = append(c.requests, &request) return &request @@ -56,6 +63,8 @@ type CapturedRequest struct { // RequestURIBytes is the request uri bytes. Notably, this will not include // RequestURI's set by SetRequestURI RequestURIBytes []byte + // Metrics is the metrics handler + Handler metrics.Handler } var _ Client = &CaptureClient{} @@ -92,8 +101,30 @@ func (c *CapturedRequest) SetRequestURI(uri string) Request { // Do calls responseFunc for testing. func (c *CapturedRequest) Do() (Response, error) { - //nolint: wrapcheck - return c.Client.responseFunc(c) + _, span := c.Handler.Tracer().Start( + c.Context, + "Do", + trace.WithAttributes( + attribute.String("uri", c.RequestURI), + attribute.String("headers", fmt.Sprintf("%v", c.StringHeaders)), + attribute.String("body", common.Bytes2Hex(c.Body)), + ), + ) + defer func() { + metrics.EndSpan(span) + }() + + resp, err := c.Client.responseFunc(c) + if err != nil { + return nil, err + } + + span.SetAttributes( + attribute.String("response", common.Bytes2Hex(resp.Body())), + attribute.Int("status", resp.StatusCode()), + ) + + return resp, err } var _ Request = &CapturedRequest{} diff --git a/services/omnirpc/http/capture_client_test.go b/services/omnirpc/http/capture_client_test.go index b99b520624..e5a20b9879 100644 --- a/services/omnirpc/http/capture_client_test.go +++ b/services/omnirpc/http/capture_client_test.go @@ -2,23 +2,27 @@ package http_test import ( "context" + "testing" + "github.com/brianvoe/gofakeit/v6" . "github.com/stretchr/testify/assert" + "github.com/synapsecns/sanguine/core/metrics" "github.com/synapsecns/sanguine/services/omnirpc/http" "github.com/synapsecns/sanguine/services/omnirpc/http/mocks" - "testing" ) func TestCaptureClient(t *testing.T) { testRes := gofakeit.ImageJpeg(50, 50) testBody := gofakeit.ImageJpeg(50, 50) - client := http.NewCaptureClient(func(c *http.CapturedRequest) (http.Response, error) { - bodyRes := new(mocks.Response) - bodyRes.On("Body").Return(testRes) + client := http.NewCaptureClient( + metrics.NewNullHandler(), + func(c *http.CapturedRequest) (http.Response, error) { + bodyRes := new(mocks.Response) + bodyRes.On("Body").Return(testRes) - return bodyRes, nil - }) + return bodyRes, nil + }) testCtx := context.Background() @@ -31,8 +35,8 @@ func TestCaptureClient(t *testing.T) { testURL := gofakeit.URL() testReq := client.NewRequest() - testReq.SetBody(testBody) testReq.SetContext(testCtx) + testReq.SetBody(testBody) testReq.SetHeaderBytes(byteHeaderK, byteHeaderV) testReq.SetHeader(strHeaderK, strHeaderV) testReq.SetRequestURI(testURL) diff --git a/services/omnirpc/http/client.go b/services/omnirpc/http/client.go index c07ffaeb77..f228646b9f 100644 --- a/services/omnirpc/http/client.go +++ b/services/omnirpc/http/client.go @@ -3,6 +3,8 @@ package http import ( "context" "strings" + + "github.com/synapsecns/sanguine/core/metrics" ) // Client contains a post client for interacting with json rpc servers. @@ -62,14 +64,14 @@ func init() { // NewClient creates a client from the client type // defaults to fast http. -func NewClient(clientType ClientType) Client { +func NewClient(handler metrics.Handler, clientType ClientType) Client { switch clientType { case FastHTTP: - return NewFastHTTPClient() + return NewFastHTTPClient(handler) case Resty: - return NewRestyClient() + return NewRestyClient(handler) default: - return NewRestyClient() + return NewRestyClient(handler) } } diff --git a/services/omnirpc/http/client_test.go b/services/omnirpc/http/client_test.go index 2e1314ef83..b3cf2e6001 100644 --- a/services/omnirpc/http/client_test.go +++ b/services/omnirpc/http/client_test.go @@ -1,11 +1,12 @@ package http_test import ( - "github.com/brianvoe/gofakeit/v6" - . "github.com/stretchr/testify/assert" "io" "net/http" "net/http/httptest" + + "github.com/brianvoe/gofakeit/v6" + . "github.com/stretchr/testify/assert" ) var jsonOptions = &gofakeit.JSONOptions{ @@ -42,9 +43,9 @@ func (c *HTTPSuite) TestClient() { })) req := client.NewRequest() + req.SetContext(c.GetTestContext()) req.SetRequestURI(svr.URL) req.SetBody(mockBody) - req.SetContext(c.GetTestContext()) for key, val := range headers { if gofakeit.Bool() { req.SetHeader(key, val) diff --git a/services/omnirpc/http/fasthttp.go b/services/omnirpc/http/fasthttp.go index 7b7a3d856e..9560270e79 100644 --- a/services/omnirpc/http/fasthttp.go +++ b/services/omnirpc/http/fasthttp.go @@ -3,12 +3,16 @@ package http import ( "context" "fmt" + "sync" + "time" + "github.com/ImVexed/fasturl" "github.com/puzpuzpuz/xsync" http2 "github.com/synapsecns/fasthttp-http2" + "github.com/synapsecns/sanguine/core/metrics" "github.com/valyala/fasthttp" - "sync" - "time" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) // dialer is an allocated fasthttp dialer for increasing dns cache time. @@ -26,6 +30,7 @@ type fastHTTPClient struct { // no longer needed. This allows Request recycling, reduces GC pressure // and usually improves performance. reqPool sync.Pool + handler metrics.Handler } // FastClient is an interface for storing both fasthttp.Clients and fasthttp.HostClients. @@ -42,16 +47,20 @@ var _ FastClient = &fasthttp.HostClient{} // while substantially faster than resty, this can be a bad choice in certain cases: // - Context Cancellation not respected: fasthttp does not support context cancellation, so we hardcode a timeout here // this is less than ideal and puts additional load on both the application and rpc servers since we pessimistically fetch -func NewFastHTTPClient() Client { - return &fastHTTPClient{clients: xsync.NewMapOf[FastClient](), defaultClient: &fasthttp.Client{ - NoDefaultUserAgentHeader: true, - Dial: dialer.Dial, - DialDualStack: false, - ReadTimeout: time.Second * 30, - WriteTimeout: time.Second * 30, - DisableHeaderNamesNormalizing: true, - DisablePathNormalizing: true, - }} +func NewFastHTTPClient(handler metrics.Handler) Client { + return &fastHTTPClient{ + clients: xsync.NewMapOf[FastClient](), + defaultClient: &fasthttp.Client{ + NoDefaultUserAgentHeader: true, + Dial: dialer.Dial, + DialDualStack: false, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 30, + DisableHeaderNamesNormalizing: true, + DisablePathNormalizing: true, + }, + handler: handler, + } } type rawResponse struct { @@ -135,9 +144,10 @@ func (f *fastHTTPClient) AcquireRequest() *fastHTTPRequest { v := f.reqPool.Get() if v == nil { return &fastHTTPRequest{ - &fasthttp.Request{}, - f, - nil, + Request: &fasthttp.Request{}, + client: f, + context: nil, + handler: f.handler, } } //nolint: forcetypeassert @@ -158,6 +168,7 @@ type fastHTTPRequest struct { // we need to respect context cancellation even after response //nolint: containedctx context context.Context + handler metrics.Handler } // Reset clears request contents. @@ -193,6 +204,18 @@ func (f *fastHTTPRequest) SetRequestURI(uri string) Request { } func (f *fastHTTPRequest) Do() (Response, error) { + _, span := f.handler.Tracer().Start( + f.context, + "Do", + trace.WithAttributes( + attribute.String("uri", f.Request.URI().String()), + attribute.String("headers", fmt.Sprintf("%v", f.Request.Header.String())), + attribute.String("body", string(f.Request.Body())), + ), + ) + defer func() { + metrics.EndSpan(span) + }() defer f.Reset() uri := f.Request.URI() diff --git a/services/omnirpc/http/resty.go b/services/omnirpc/http/resty.go index 58db412bb7..5d69d9edcf 100644 --- a/services/omnirpc/http/resty.go +++ b/services/omnirpc/http/resty.go @@ -2,29 +2,37 @@ package http import ( "context" + "fmt" + "github.com/go-resty/resty/v2" + "github.com/synapsecns/sanguine/core/metrics" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) // RestyClient is a resty client for making requests to the http client. type RestyClient struct { - client *resty.Client + client *resty.Client + handler metrics.Handler } // NewRestyClient creates a resty client. // while much slower than fasthttp, this client requests context cancellation. -func NewRestyClient() Client { - return &RestyClient{client: resty.New()} +func NewRestyClient(handler metrics.Handler) Client { + return &RestyClient{client: resty.New(), handler: handler} } type restyRequest struct { *resty.Request endpoint string + handler metrics.Handler } // NewRequest create a new request. func (r RestyClient) NewRequest() Request { return &restyRequest{ Request: r.client.R(), + handler: r.handler, } } @@ -54,9 +62,24 @@ func (r *restyRequest) SetRequestURI(uri string) Request { return r } -func (r *restyRequest) Do() (Response, error) { - //nolint: wrapcheck - return r.Request.Post(r.endpoint) +func (r *restyRequest) Do() (_ Response, err error) { + _, span := r.handler.Tracer().Start( + r.Request.Context(), + "Do", + trace.WithAttributes( + attribute.String("uri", r.endpoint), + attribute.String("headers", fmt.Sprintf("%v", r.Request.Header)), + attribute.String("body", r.Request.Body.(string)), + ), + ) + defer func() { + metrics.EndSpanWithErr(span, err) + }() + resp, err := r.Request.Post(r.endpoint) + if err != nil { + return nil, fmt.Errorf("could not get response from %s: %w", r.endpoint, err) + } + return resp, nil } var _ Client = &RestyClient{} diff --git a/services/omnirpc/http/suite_test.go b/services/omnirpc/http/suite_test.go index b197306eea..5f376b7175 100644 --- a/services/omnirpc/http/suite_test.go +++ b/services/omnirpc/http/suite_test.go @@ -1,17 +1,25 @@ package http_test import ( + "testing" + "github.com/brianvoe/gofakeit/v6" "github.com/stretchr/testify/suite" + "github.com/synapsecns/sanguine/core" + "github.com/synapsecns/sanguine/core/config" + "github.com/synapsecns/sanguine/core/metrics" + "github.com/synapsecns/sanguine/core/metrics/localmetrics" "github.com/synapsecns/sanguine/core/testsuite" "github.com/synapsecns/sanguine/services/omnirpc/http" - "testing" ) +var buildInfo = config.NewBuildInfo(config.DefaultVersion, config.DefaultCommit, "omnirpc", config.DefaultDate) + // clientSuite defines the basic test suite. type HTTPSuite struct { *testsuite.TestSuite clients []http.Client + metrics metrics.Handler } // NewTestSuite creates a new test suite and performs some basic checks afterward. @@ -27,8 +35,24 @@ func (c *HTTPSuite) SetupTest() { c.TestSuite.SetupTest() for _, clientType := range http.AllClientTypes { - c.clients = append(c.clients, http.NewClient(clientType)) + c.clients = append(c.clients, http.NewClient(metrics.NewNullHandler(), clientType)) + } +} + +func (c *HTTPSuite) SetupSuite() { + c.TestSuite.SetupSuite() + // don't use metrics on ci for integration tests + isCI := core.GetEnvBool("CI", false) + useMetrics := !isCI + metricsHandler := metrics.Null + + if useMetrics { + localmetrics.SetupTestJaeger(c.GetSuiteContext(), c.T()) + metricsHandler = metrics.Jaeger } + var err error + c.metrics, err = metrics.NewByType(c.GetSuiteContext(), buildInfo, metricsHandler) + c.Require().NoError(err) } func TestCommonSuite(t *testing.T) { diff --git a/services/omnirpc/modules/confirmedtofinalized/finalizedproxy.go b/services/omnirpc/modules/confirmedtofinalized/finalizedproxy.go index ce974daa3f..55471ebba9 100644 --- a/services/omnirpc/modules/confirmedtofinalized/finalizedproxy.go +++ b/services/omnirpc/modules/confirmedtofinalized/finalizedproxy.go @@ -6,6 +6,11 @@ import ( "encoding/json" "errors" "fmt" + "io" + "math/big" + "net/http" + "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" @@ -22,10 +27,6 @@ import ( "github.com/synapsecns/sanguine/services/omnirpc/swagger" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" - "io" - "math/big" - "net/http" - "time" ) // FinalizedProxy is the interface for the finalized proxy. @@ -58,7 +59,7 @@ func NewProxy(proxyURL string, handler metrics.Handler, port, maxSubmitAhead, ch proxyURL: proxyURL, handler: handler, port: uint16(port), - client: omniHTTP.NewRestyClient(), + client: omniHTTP.NewRestyClient(handler), logger: handler.ExperimentalLogger(), maxSubmitAhead: maxSubmitAhead, chainID: chainID, diff --git a/services/omnirpc/modules/harmonyproxy/harmonyproxy.go b/services/omnirpc/modules/harmonyproxy/harmonyproxy.go index 023d0ab3ea..32f1540c30 100644 --- a/services/omnirpc/modules/harmonyproxy/harmonyproxy.go +++ b/services/omnirpc/modules/harmonyproxy/harmonyproxy.go @@ -54,7 +54,7 @@ func NewHarmonyProxy(proxyURL string, handler metrics.Handler, port int) *Harmon proxyURL: proxyURL, handler: handler, port: uint16(port), - client: omniHTTP.NewRestyClient(), + client: omniHTTP.NewRestyClient(handler), tracer: handler.Tracer(), } } diff --git a/services/omnirpc/modules/receiptsbackup/receiptsbackup.go b/services/omnirpc/modules/receiptsbackup/receiptsbackup.go index f472d40105..fc0fe85943 100644 --- a/services/omnirpc/modules/receiptsbackup/receiptsbackup.go +++ b/services/omnirpc/modules/receiptsbackup/receiptsbackup.go @@ -5,11 +5,12 @@ import ( "encoding/json" "errors" "fmt" - "github.com/synapsecns/sanguine/services/omnirpc/modules/mixins" "io" "net/http" "time" + "github.com/synapsecns/sanguine/services/omnirpc/modules/mixins" + "github.com/flowchartsman/swaggerui" "github.com/gin-gonic/gin" "github.com/synapsecns/sanguine/core/ginhelper" @@ -57,7 +58,7 @@ func NewProxy(proxyURL, backupURL string, receiptTimeout time.Duration, handler backupURL: backupURL, handler: handler, port: uint16(port), - client: omniHTTP.NewRestyClient(), + client: omniHTTP.NewRestyClient(handler), logger: handler.ExperimentalLogger(), chainID: chainID, receiptTimeout: receiptTimeout, diff --git a/services/omnirpc/proxy/forward.go b/services/omnirpc/proxy/forward.go index ffdf2d37dc..f053b6060c 100644 --- a/services/omnirpc/proxy/forward.go +++ b/services/omnirpc/proxy/forward.go @@ -5,6 +5,9 @@ import ( "context" "crypto/sha256" "fmt" + goHTTP "net/http" + "strings" + "github.com/ImVexed/fasturl" "github.com/goccy/go-json" "github.com/jftuga/ellipsis" @@ -14,8 +17,6 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" "golang.org/x/exp/slices" - goHTTP "net/http" - "strings" ) type rawResponse struct { @@ -129,7 +130,7 @@ const ( ) func (f *Forwarder) forwardRequest(parentCtx context.Context, endpoint string) (_ *rawResponse, err error) { - ctx, span := f.tracer.Start(parentCtx, "forwardRequest", + ctx, span := f.handler.Tracer().Start(parentCtx, "forwardRequest", trace.WithAttributes(attribute.String("endpoint", endpoint)), ) diff --git a/services/omnirpc/proxy/forward_test.go b/services/omnirpc/proxy/forward_test.go index 6eea0570f8..39b3dbc95e 100644 --- a/services/omnirpc/proxy/forward_test.go +++ b/services/omnirpc/proxy/forward_test.go @@ -5,6 +5,11 @@ import ( "encoding/json" "errors" "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "github.com/brianvoe/gofakeit/v6" "github.com/gin-gonic/gin" "github.com/google/uuid" @@ -18,10 +23,6 @@ import ( "github.com/synapsecns/sanguine/services/omnirpc/http/mocks" "github.com/synapsecns/sanguine/services/omnirpc/proxy" proxyMocks "github.com/synapsecns/sanguine/services/omnirpc/proxy/mocks" - "net/http" - "net/http/httptest" - "net/url" - "strconv" ) func (p *ProxySuite) TestServeRequestNoChain() { @@ -84,7 +85,7 @@ func (p *ProxySuite) TestAcquireReleaseForwarder() { forwarder := prxy.AcquireForwarder() forwarder.SetChain(new(chainManagerMocks.Chain)) forwarder.SetC(&gin.Context{}) - forwarder.SetClient(omniHTTP.NewClient(omniHTTP.Resty)) + forwarder.SetClient(omniHTTP.NewClient(p.metrics, omniHTTP.Resty)) forwarder.SetR(prxy) forwarder.SetBody(gofakeit.ImagePng(5, 5)) forwarder.SetRequestID([]byte(uuid.New().String())) @@ -144,12 +145,14 @@ func (p *ProxySuite) TestForwardRequest() { Result: nil, }) - captureClient := omniHTTP.NewCaptureClient(func(c *omniHTTP.CapturedRequest) (omniHTTP.Response, error) { - bodyRes := new(mocks.Response) - bodyRes.On("Body").Return(testRes) - bodyRes.On("StatusCode").Return(200) - return bodyRes, nil - }) + captureClient := omniHTTP.NewCaptureClient( + p.metrics, + func(c *omniHTTP.CapturedRequest) (omniHTTP.Response, error) { + bodyRes := new(mocks.Response) + bodyRes.On("Body").Return(testRes) + bodyRes.On("StatusCode").Return(200) + return bodyRes, nil + }) prxy.SetClient(captureClient) testURL := gofakeit.URL() diff --git a/services/omnirpc/proxy/forwarder.go b/services/omnirpc/proxy/forwarder.go index 4d45abd944..03841fa0e0 100644 --- a/services/omnirpc/proxy/forwarder.go +++ b/services/omnirpc/proxy/forwarder.go @@ -3,19 +3,21 @@ package proxy import ( "context" "fmt" - "github.com/synapsecns/sanguine/ethergo/parser/rpc" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" "io" "net/http" "strconv" "strings" "sync" + "github.com/synapsecns/sanguine/ethergo/parser/rpc" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "github.com/Soft/iter" "github.com/gin-gonic/gin" "github.com/goccy/go-json" "github.com/puzpuzpuz/xsync" + "github.com/synapsecns/sanguine/core/metrics" "github.com/synapsecns/sanguine/core/threaditer" "github.com/synapsecns/sanguine/services/omnirpc/chainmanager" omniHTTP "github.com/synapsecns/sanguine/services/omnirpc/http" @@ -50,8 +52,8 @@ type Forwarder struct { mux sync.RWMutex // span is the span for the request span trace.Span - // tracer is the tracer for the request - tracer trace.Tracer + // handler is the metrics handler + handler metrics.Handler } // Reset resets the forwarder so it can be reused. @@ -77,9 +79,9 @@ func (r *RPCProxy) AcquireForwarder() *Forwarder { v := r.forwarderPool.Get() if v == nil { return &Forwarder{ - r: r, - client: r.client, - tracer: r.tracer, + r: r, + client: r.client, + handler: r.handler, } } //nolint: forcetypeassert @@ -95,7 +97,7 @@ func (r *RPCProxy) ReleaseForwarder(f *Forwarder) { // Forward forwards the rpc request to the servers and makes assertions around confirmation thresholds. // required confirmations can be used to override the required confirmations count. func (r *RPCProxy) Forward(c *gin.Context, chainID uint32, requiredConfirmationsOverride *uint16) { - ctx, span := r.tracer.Start(c, "rpcRequest", + ctx, span := r.handler.Tracer().Start(c, "Forward", trace.WithAttributes(attribute.Int("chainID", int(chainID))), ) diff --git a/services/omnirpc/proxy/server.go b/services/omnirpc/proxy/server.go index a454767746..e99ec2801f 100644 --- a/services/omnirpc/proxy/server.go +++ b/services/omnirpc/proxy/server.go @@ -3,6 +3,11 @@ package proxy import ( "context" "fmt" + "net/http" + "strconv" + "sync" + "time" + "github.com/flowchartsman/swaggerui" "github.com/gin-gonic/gin" "github.com/synapsecns/sanguine/core/ginhelper" @@ -12,17 +17,10 @@ import ( "github.com/synapsecns/sanguine/services/omnirpc/config" omniHTTP "github.com/synapsecns/sanguine/services/omnirpc/http" "github.com/synapsecns/sanguine/services/omnirpc/swagger" - "go.opentelemetry.io/otel/trace" - "net/http" - "strconv" - "sync" - "time" ) // RPCProxy proxies rpc request to the fastest endpoint. Requests fallback in cases where data is not available. type RPCProxy struct { - // tracer is the tracer for the proxy - tracer trace.Tracer // chainManager contains a list of chains and latency ordered rpcs chainManager chainmanager.ChainManager // config contains the config for each chain @@ -50,9 +48,8 @@ func NewProxy(config config.Config, handler metrics.Handler) *RPCProxy { chainManager: chainmanager.NewChainManagerFromConfig(config, handler), refreshInterval: time.Second * time.Duration(config.RefreshInterval), port: config.Port, - client: omniHTTP.NewClient(omniHTTP.ClientTypeFromString(config.ClientType)), + client: omniHTTP.NewClient(handler, omniHTTP.ClientTypeFromString(config.ClientType)), handler: handler, - tracer: handler.Tracer(), } } diff --git a/services/omnirpc/proxy/standardize.go b/services/omnirpc/proxy/standardize.go index 31904ec6c1..2911f7ea68 100644 --- a/services/omnirpc/proxy/standardize.go +++ b/services/omnirpc/proxy/standardize.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/synapsecns/sanguine/ethergo/client" "github.com/synapsecns/sanguine/ethergo/parser/rpc" @@ -34,7 +35,7 @@ type JSONError struct { // rpcTransaction is an eth rpc transaction (copied from ethclient). type rpcTransaction struct { - //nolint: unused + //lint:ignore U1000 it's okay. tx *types.Transaction txExtraInfo } diff --git a/services/rfq/api/db/activequoterequeststatus_string.go b/services/rfq/api/db/activequoterequeststatus_string.go index cb9e64a4d6..3ebff97ae4 100644 --- a/services/rfq/api/db/activequoterequeststatus_string.go +++ b/services/rfq/api/db/activequoterequeststatus_string.go @@ -16,7 +16,7 @@ func _() { const _ActiveQuoteRequestStatus_name = "ReceivedPendingExpiredClosed" -var _ActiveQuoteRequestStatus_index = [...]uint8{0, 8, 15, 22, 31} +var _ActiveQuoteRequestStatus_index = [...]uint8{0, 8, 15, 22, 28} func (i ActiveQuoteRequestStatus) String() string { i -= 1