// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.6
// 	protoc        v5.29.3
// source: path/qos/evm.proto

// TODO_TECHDEBT(@adshmh): Address linter warning on all the .proto files.
// TODO_TECHDEBT(@adshmh): Package name "path.qos" should be suffixed with a correctly formed version, such as "path.qos.v1"
//
// Buf used as linter for proto files:
// https://buf.build/docs/lint/overview/

package qos

import (
	_ "github.com/buildwithgrove/path/observation/metadata"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// EVMRequestValidationError enumerates possible causes for EVM request rejection:
// Invalid request types (as of PR #186):
//  1. Internal server error while reading the HTTP request body
//  2. Unmarshal error when parsing request into the expected format
type EVMRequestValidationError int32

const (
	EVMRequestValidationError_EVM_REQUEST_VALIDATION_ERROR_UNSPECIFIED                  EVMRequestValidationError = 0
	EVMRequestValidationError_EVM_REQUEST_VALIDATION_ERROR_HTTP_BODY_READ_FAILURE       EVMRequestValidationError = 1
	EVMRequestValidationError_EVM_REQUEST_VALIDATION_ERROR_REQUEST_UNMARSHALING_FAILURE EVMRequestValidationError = 2
)

// Enum value maps for EVMRequestValidationError.
var (
	EVMRequestValidationError_name = map[int32]string{
		0: "EVM_REQUEST_VALIDATION_ERROR_UNSPECIFIED",
		1: "EVM_REQUEST_VALIDATION_ERROR_HTTP_BODY_READ_FAILURE",
		2: "EVM_REQUEST_VALIDATION_ERROR_REQUEST_UNMARSHALING_FAILURE",
	}
	EVMRequestValidationError_value = map[string]int32{
		"EVM_REQUEST_VALIDATION_ERROR_UNSPECIFIED":                  0,
		"EVM_REQUEST_VALIDATION_ERROR_HTTP_BODY_READ_FAILURE":       1,
		"EVM_REQUEST_VALIDATION_ERROR_REQUEST_UNMARSHALING_FAILURE": 2,
	}
)

func (x EVMRequestValidationError) Enum() *EVMRequestValidationError {
	p := new(EVMRequestValidationError)
	*p = x
	return p
}

func (x EVMRequestValidationError) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (EVMRequestValidationError) Descriptor() protoreflect.EnumDescriptor {
	return file_path_qos_evm_proto_enumTypes[0].Descriptor()
}

func (EVMRequestValidationError) Type() protoreflect.EnumType {
	return &file_path_qos_evm_proto_enumTypes[0]
}

func (x EVMRequestValidationError) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use EVMRequestValidationError.Descriptor instead.
func (EVMRequestValidationError) EnumDescriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{0}
}

// TODO_DOCUMENT(@adshmh): Create a design document for the feature described below.
// TODO_MVP(@adshmh): Add EVMUserErrorType enum
//
// Purpose: Distinguish between endpoint technical failures and user input errors
//
// Background:
// - Currently we only track endpoint/technical failures
// - Need to identify when request seems valid but fails due to user input issues (e.g., non-existent hash)
//
// Implementation:
// 1. Create new EVMUserErrorType enum with categories like RESOURCE_NOT_FOUND, INVALID_PARAMETER
// 2. Add user_error field to appropriate response types
// 3. Update HTTP status code selection logic to consider user errors
//
// Benefits:
// - More accurate error reporting to clients
// - Appropriate HTTP status codes (e.g., 404 vs 500)
// - Better client debugging experience
//
// EVMResponseValidationError defines why an endpoint response was rejected.
// Current invalid response types (as of PR #186):
//  1. EmptyResponse - endpoint returned no data
//  2. UnmarshalErr - response failed to parse into expected format
//  3. NoResponse - no responses recorded by the QoS service: probably caused by protocol-level errors
type EVMResponseValidationError int32

const (
	EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED EVMResponseValidationError = 0
	EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_EMPTY       EVMResponseValidationError = 1 // Response with no data.
	EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNMARSHAL   EVMResponseValidationError = 2 // Response parsing failed
	EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_NO_RESPONSE EVMResponseValidationError = 3 // No response received from any endpoint
)

// Enum value maps for EVMResponseValidationError.
var (
	EVMResponseValidationError_name = map[int32]string{
		0: "EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED",
		1: "EVM_RESPONSE_VALIDATION_ERROR_EMPTY",
		2: "EVM_RESPONSE_VALIDATION_ERROR_UNMARSHAL",
		3: "EVM_RESPONSE_VALIDATION_ERROR_NO_RESPONSE",
	}
	EVMResponseValidationError_value = map[string]int32{
		"EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED": 0,
		"EVM_RESPONSE_VALIDATION_ERROR_EMPTY":       1,
		"EVM_RESPONSE_VALIDATION_ERROR_UNMARSHAL":   2,
		"EVM_RESPONSE_VALIDATION_ERROR_NO_RESPONSE": 3,
	}
)

func (x EVMResponseValidationError) Enum() *EVMResponseValidationError {
	p := new(EVMResponseValidationError)
	*p = x
	return p
}

func (x EVMResponseValidationError) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (EVMResponseValidationError) Descriptor() protoreflect.EnumDescriptor {
	return file_path_qos_evm_proto_enumTypes[1].Descriptor()
}

func (EVMResponseValidationError) Type() protoreflect.EnumType {
	return &file_path_qos_evm_proto_enumTypes[1]
}

func (x EVMResponseValidationError) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use EVMResponseValidationError.Descriptor instead.
func (EVMResponseValidationError) EnumDescriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{1}
}

// EVMRequestObservations captures all observations made while serving a single EVM blockchain service request.
type EVMRequestObservations struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// chain_id is the blockchain identifier for the evm QoS implementation.
	// This is preset by the processor and not determined by the request.
	// Expected as the `Result` field in eth_chainId responses.
	ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
	// service_id is the identifier for the evm QoS implementation.
	// It is the "alias" or human readable interpratation of the chain_id.
	ServiceId string `protobuf:"bytes,7,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// The origin of the request:
	// - Organic: real (i.e. user) requests
	// - Synthetic: requests built by QoS module for collecting data on endpoints (a.k.a hydrator)
	RequestOrigin RequestOrigin `protobuf:"varint,8,opt,name=request_origin,json=requestOrigin,proto3,enum=path.qos.RequestOrigin" json:"request_origin,omitempty"`
	// The length of the client's request payload, in bytes.
	RequestPayloadLength uint32 `protobuf:"varint,2,opt,name=request_payload_length,json=requestPayloadLength,proto3" json:"request_payload_length,omitempty"`
	// If this oneof IS SET, then one of the following validation failures happened:
	//   - Indicates the request failed validation
	//   - Contains details about the specific failure type
	//   - The HTTP status code in the selected failure type overrides any status codes from
	//     endpoint observations and should be returned to the client
	//
	// If this oneof IS NOT SET, then one of the following occurred:
	//   - The request passed validation
	//   - The HTTP status code from the most recent endpoint observation should be used instead
	//
	// Types that are valid to be assigned to RequestValidationFailure:
	//
	//	*EVMRequestObservations_EvmHttpBodyReadFailure
	//	*EVMRequestObservations_EvmRequestUnmarshalingFailure
	RequestValidationFailure isEVMRequestObservations_RequestValidationFailure `protobuf_oneof:"request_validation_failure"`
	// Each request may have multiple observations to support batch requests.
	RequestObservations []*EVMRequestObservation `protobuf:"bytes,10,rep,name=request_observations,json=requestObservations,proto3" json:"request_observations,omitempty"`
	// endpoint_selection_metadata contains metadata about the endpoint selection process.
	EndpointSelectionMetadata *EndpointSelectionMetadata `protobuf:"bytes,9,opt,name=endpoint_selection_metadata,json=endpointSelectionMetadata,proto3" json:"endpoint_selection_metadata,omitempty"`
	// Internal error encountered processing the request, if any.
	// Example: no endpoint responses received.
	// On single JSONRPC request: applies to the single request.
	// On batch JSONRPC requests: only set if the entire batch failed (e.g. no endpoint responses for any of the requests of the batch)
	RequestError  *RequestError `protobuf:"bytes,11,opt,name=request_error,json=requestError,proto3,oneof" json:"request_error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *EVMRequestObservations) Reset() {
	*x = EVMRequestObservations{}
	mi := &file_path_qos_evm_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMRequestObservations) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMRequestObservations) ProtoMessage() {}

func (x *EVMRequestObservations) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMRequestObservations.ProtoReflect.Descriptor instead.
func (*EVMRequestObservations) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{0}
}

func (x *EVMRequestObservations) GetChainId() string {
	if x != nil {
		return x.ChainId
	}
	return ""
}

func (x *EVMRequestObservations) GetServiceId() string {
	if x != nil {
		return x.ServiceId
	}
	return ""
}

func (x *EVMRequestObservations) GetRequestOrigin() RequestOrigin {
	if x != nil {
		return x.RequestOrigin
	}
	return RequestOrigin_REQUEST_ORIGIN_UNSPECIFIED
}

func (x *EVMRequestObservations) GetRequestPayloadLength() uint32 {
	if x != nil {
		return x.RequestPayloadLength
	}
	return 0
}

func (x *EVMRequestObservations) GetRequestValidationFailure() isEVMRequestObservations_RequestValidationFailure {
	if x != nil {
		return x.RequestValidationFailure
	}
	return nil
}

func (x *EVMRequestObservations) GetEvmHttpBodyReadFailure() *EVMHTTPBodyReadFailure {
	if x != nil {
		if x, ok := x.RequestValidationFailure.(*EVMRequestObservations_EvmHttpBodyReadFailure); ok {
			return x.EvmHttpBodyReadFailure
		}
	}
	return nil
}

func (x *EVMRequestObservations) GetEvmRequestUnmarshalingFailure() *EVMRequestUnmarshalingFailure {
	if x != nil {
		if x, ok := x.RequestValidationFailure.(*EVMRequestObservations_EvmRequestUnmarshalingFailure); ok {
			return x.EvmRequestUnmarshalingFailure
		}
	}
	return nil
}

func (x *EVMRequestObservations) GetRequestObservations() []*EVMRequestObservation {
	if x != nil {
		return x.RequestObservations
	}
	return nil
}

func (x *EVMRequestObservations) GetEndpointSelectionMetadata() *EndpointSelectionMetadata {
	if x != nil {
		return x.EndpointSelectionMetadata
	}
	return nil
}

func (x *EVMRequestObservations) GetRequestError() *RequestError {
	if x != nil {
		return x.RequestError
	}
	return nil
}

type isEVMRequestObservations_RequestValidationFailure interface {
	isEVMRequestObservations_RequestValidationFailure()
}

type EVMRequestObservations_EvmHttpBodyReadFailure struct {
	// Indicates a failure to read the HTTP request body
	EvmHttpBodyReadFailure *EVMHTTPBodyReadFailure `protobuf:"bytes,3,opt,name=evm_http_body_read_failure,json=evmHttpBodyReadFailure,proto3,oneof"`
}

type EVMRequestObservations_EvmRequestUnmarshalingFailure struct {
	// Indicates a failure to unmarshal/parse the request
	EvmRequestUnmarshalingFailure *EVMRequestUnmarshalingFailure `protobuf:"bytes,4,opt,name=evm_request_unmarshaling_failure,json=evmRequestUnmarshalingFailure,proto3,oneof"`
}

func (*EVMRequestObservations_EvmHttpBodyReadFailure) isEVMRequestObservations_RequestValidationFailure() {
}

func (*EVMRequestObservations_EvmRequestUnmarshalingFailure) isEVMRequestObservations_RequestValidationFailure() {
}

// EVMRequestObservation stores a single observation from an endpoint servicing the protocol response.
// This is necessary to support batch requests.
type EVMRequestObservation struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The EVM blockchain service's JSON-RPC request.
	// This field will be populated only if request validation succeeds.
	// If there is an error reading the HTTP request, there will be no jsonrpc_request.
	// TODO_TECHDEBT: Assumes EVM chains only support JSON-RPC. May need refactoring to support other protocols.
	JsonrpcRequest *JsonRpcRequest `protobuf:"bytes,5,opt,name=jsonrpc_request,json=jsonrpcRequest,proto3" json:"jsonrpc_request,omitempty"`
	// EVM-specific observations from endpoint(s) that responded to the service request.
	// Multiple observations may occur when:
	// * Original endpoint fails
	// * Request is sent to additional endpoints for data collection
	// This field will only be populated if request validation succeeds.
	EndpointObservations []*EVMEndpointObservation `protobuf:"bytes,6,rep,name=endpoint_observations,json=endpointObservations,proto3" json:"endpoint_observations,omitempty"`
	unknownFields        protoimpl.UnknownFields
	sizeCache            protoimpl.SizeCache
}

func (x *EVMRequestObservation) Reset() {
	*x = EVMRequestObservation{}
	mi := &file_path_qos_evm_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMRequestObservation) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMRequestObservation) ProtoMessage() {}

func (x *EVMRequestObservation) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[1]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMRequestObservation.ProtoReflect.Descriptor instead.
func (*EVMRequestObservation) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{1}
}

func (x *EVMRequestObservation) GetJsonrpcRequest() *JsonRpcRequest {
	if x != nil {
		return x.JsonrpcRequest
	}
	return nil
}

func (x *EVMRequestObservation) GetEndpointObservations() []*EVMEndpointObservation {
	if x != nil {
		return x.EndpointObservations
	}
	return nil
}

// TODO_MVP(@adshmh): Remove HTTP body read validation once QoS interface is updated
// to receive request payload directly rather than reading from the HTTP request body.
//
// EVMHTTPBodyReadFailure represents a validation failure due to internal server error
// while attempting to read the HTTP request body.
type EVMHTTPBodyReadFailure struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code to return to the client - typically 500 Internal Server Error
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// The specific type of request validation error
	ValidationError EVMRequestValidationError `protobuf:"varint,2,opt,name=validation_error,json=validationError,proto3,enum=path.qos.EVMRequestValidationError" json:"validation_error,omitempty"`
	// Additional error details if available
	ErrorDetails  *string `protobuf:"bytes,3,opt,name=error_details,json=errorDetails,proto3,oneof" json:"error_details,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *EVMHTTPBodyReadFailure) Reset() {
	*x = EVMHTTPBodyReadFailure{}
	mi := &file_path_qos_evm_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMHTTPBodyReadFailure) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMHTTPBodyReadFailure) ProtoMessage() {}

func (x *EVMHTTPBodyReadFailure) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[2]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMHTTPBodyReadFailure.ProtoReflect.Descriptor instead.
func (*EVMHTTPBodyReadFailure) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{2}
}

func (x *EVMHTTPBodyReadFailure) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMHTTPBodyReadFailure) GetValidationError() EVMRequestValidationError {
	if x != nil {
		return x.ValidationError
	}
	return EVMRequestValidationError_EVM_REQUEST_VALIDATION_ERROR_UNSPECIFIED
}

func (x *EVMHTTPBodyReadFailure) GetErrorDetails() string {
	if x != nil && x.ErrorDetails != nil {
		return *x.ErrorDetails
	}
	return ""
}

// EVMRequestUnmarshalingFailure represents a validation failure due to being unable
// to parse the incoming request into the expected format.
type EVMRequestUnmarshalingFailure struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code to return to the client - typically 400 Bad Request
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// The specific type of request validation error
	ValidationError EVMRequestValidationError `protobuf:"varint,2,opt,name=validation_error,json=validationError,proto3,enum=path.qos.EVMRequestValidationError" json:"validation_error,omitempty"`
	// Additional error details if available
	ErrorDetails  *string `protobuf:"bytes,3,opt,name=error_details,json=errorDetails,proto3,oneof" json:"error_details,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *EVMRequestUnmarshalingFailure) Reset() {
	*x = EVMRequestUnmarshalingFailure{}
	mi := &file_path_qos_evm_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMRequestUnmarshalingFailure) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMRequestUnmarshalingFailure) ProtoMessage() {}

func (x *EVMRequestUnmarshalingFailure) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[3]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMRequestUnmarshalingFailure.ProtoReflect.Descriptor instead.
func (*EVMRequestUnmarshalingFailure) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{3}
}

func (x *EVMRequestUnmarshalingFailure) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMRequestUnmarshalingFailure) GetValidationError() EVMRequestValidationError {
	if x != nil {
		return x.ValidationError
	}
	return EVMRequestValidationError_EVM_REQUEST_VALIDATION_ERROR_UNSPECIFIED
}

func (x *EVMRequestUnmarshalingFailure) GetErrorDetails() string {
	if x != nil && x.ErrorDetails != nil {
		return *x.ErrorDetails
	}
	return ""
}

// EVMEndpointObservation stores a single observation from an endpoint servicing the protocol response.
// Example: A Pocket node on Shannon backed by an Ethereum data node servicing an `eth_getBlockNumber` request.
type EVMEndpointObservation struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Address of the endpoint handling the request (e.g., onchain address of a Pocket Shannon node)
	EndpointAddr string `protobuf:"bytes,1,opt,name=endpoint_addr,json=endpointAddr,proto3" json:"endpoint_addr,omitempty"`
	// Details of the response received from the endpoint
	//
	// Types that are valid to be assigned to ResponseObservation:
	//
	//	*EVMEndpointObservation_ChainIdResponse
	//	*EVMEndpointObservation_BlockNumberResponse
	//	*EVMEndpointObservation_GetBalanceResponse
	//	*EVMEndpointObservation_UnrecognizedResponse
	//	*EVMEndpointObservation_EmptyResponse
	//	*EVMEndpointObservation_NoResponse
	ResponseObservation isEVMEndpointObservation_ResponseObservation `protobuf_oneof:"response_observation"`
	// Only set if the endpoint returned a valid JSONRPC response.
	ParsedJsonrpcResponse *JsonRpcResponse `protobuf:"bytes,8,opt,name=parsed_jsonrpc_response,json=parsedJsonrpcResponse,proto3,oneof" json:"parsed_jsonrpc_response,omitempty"`
	unknownFields         protoimpl.UnknownFields
	sizeCache             protoimpl.SizeCache
}

func (x *EVMEndpointObservation) Reset() {
	*x = EVMEndpointObservation{}
	mi := &file_path_qos_evm_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMEndpointObservation) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMEndpointObservation) ProtoMessage() {}

func (x *EVMEndpointObservation) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[4]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMEndpointObservation.ProtoReflect.Descriptor instead.
func (*EVMEndpointObservation) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{4}
}

func (x *EVMEndpointObservation) GetEndpointAddr() string {
	if x != nil {
		return x.EndpointAddr
	}
	return ""
}

func (x *EVMEndpointObservation) GetResponseObservation() isEVMEndpointObservation_ResponseObservation {
	if x != nil {
		return x.ResponseObservation
	}
	return nil
}

func (x *EVMEndpointObservation) GetChainIdResponse() *EVMChainIDResponse {
	if x != nil {
		if x, ok := x.ResponseObservation.(*EVMEndpointObservation_ChainIdResponse); ok {
			return x.ChainIdResponse
		}
	}
	return nil
}

func (x *EVMEndpointObservation) GetBlockNumberResponse() *EVMBlockNumberResponse {
	if x != nil {
		if x, ok := x.ResponseObservation.(*EVMEndpointObservation_BlockNumberResponse); ok {
			return x.BlockNumberResponse
		}
	}
	return nil
}

func (x *EVMEndpointObservation) GetGetBalanceResponse() *EVMGetBalanceResponse {
	if x != nil {
		if x, ok := x.ResponseObservation.(*EVMEndpointObservation_GetBalanceResponse); ok {
			return x.GetBalanceResponse
		}
	}
	return nil
}

func (x *EVMEndpointObservation) GetUnrecognizedResponse() *EVMUnrecognizedResponse {
	if x != nil {
		if x, ok := x.ResponseObservation.(*EVMEndpointObservation_UnrecognizedResponse); ok {
			return x.UnrecognizedResponse
		}
	}
	return nil
}

func (x *EVMEndpointObservation) GetEmptyResponse() *EVMEmptyResponse {
	if x != nil {
		if x, ok := x.ResponseObservation.(*EVMEndpointObservation_EmptyResponse); ok {
			return x.EmptyResponse
		}
	}
	return nil
}

func (x *EVMEndpointObservation) GetNoResponse() *EVMNoResponse {
	if x != nil {
		if x, ok := x.ResponseObservation.(*EVMEndpointObservation_NoResponse); ok {
			return x.NoResponse
		}
	}
	return nil
}

func (x *EVMEndpointObservation) GetParsedJsonrpcResponse() *JsonRpcResponse {
	if x != nil {
		return x.ParsedJsonrpcResponse
	}
	return nil
}

type isEVMEndpointObservation_ResponseObservation interface {
	isEVMEndpointObservation_ResponseObservation()
}

type EVMEndpointObservation_ChainIdResponse struct {
	// Response to `eth_chainId` request
	// Reference: https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid
	ChainIdResponse *EVMChainIDResponse `protobuf:"bytes,2,opt,name=chain_id_response,json=chainIdResponse,proto3,oneof"`
}

type EVMEndpointObservation_BlockNumberResponse struct {
	// Response to `eth_blockNumber` request
	// References:
	// * https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber
	// * Chain IDs: https://chainlist.org
	BlockNumberResponse *EVMBlockNumberResponse `protobuf:"bytes,3,opt,name=block_number_response,json=blockNumberResponse,proto3,oneof"`
}

type EVMEndpointObservation_GetBalanceResponse struct {
	// Response to `eth_getBalance` request, which may be used to update archival state.
	// See the EVMGetBalanceResponse message for more details.
	// References:
	// * https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance
	GetBalanceResponse *EVMGetBalanceResponse `protobuf:"bytes,4,opt,name=get_balance_response,json=getBalanceResponse,proto3,oneof"`
}

type EVMEndpointObservation_UnrecognizedResponse struct {
	// Responses not used in endpoint validation (e.g., JSONRPC ID field from `eth_call`)
	UnrecognizedResponse *EVMUnrecognizedResponse `protobuf:"bytes,5,opt,name=unrecognized_response,json=unrecognizedResponse,proto3,oneof"`
}

type EVMEndpointObservation_EmptyResponse struct {
	// EVMEmptyResponse indicates an endpoint returned no data.
	// Used to:
	//   - Disqualify endpoints that return empty responses
	//   - Track metrics for empty response patterns
	EmptyResponse *EVMEmptyResponse `protobuf:"bytes,6,opt,name=empty_response,json=emptyResponse,proto3,oneof"`
}

type EVMEndpointObservation_NoResponse struct {
	// EVMNoResponse indicates no response was received from any endpoint.
	// This differs from EVMEmptyResponse as no response was reported by the protocol.
	NoResponse *EVMNoResponse `protobuf:"bytes,7,opt,name=no_response,json=noResponse,proto3,oneof"`
}

func (*EVMEndpointObservation_ChainIdResponse) isEVMEndpointObservation_ResponseObservation() {}

func (*EVMEndpointObservation_BlockNumberResponse) isEVMEndpointObservation_ResponseObservation() {}

func (*EVMEndpointObservation_GetBalanceResponse) isEVMEndpointObservation_ResponseObservation() {}

func (*EVMEndpointObservation_UnrecognizedResponse) isEVMEndpointObservation_ResponseObservation() {}

func (*EVMEndpointObservation_EmptyResponse) isEVMEndpointObservation_ResponseObservation() {}

func (*EVMEndpointObservation_NoResponse) isEVMEndpointObservation_ResponseObservation() {}

// TODO_MVP(@adshmh): Implement a consolidated SanctionObservation message structure that:
//  1. Contains both SanctionType enum and RecommendedSanction field
//  2. Can be embedded as a single field within all qos/Response.proto messages
//  3. Ensures sanction policies are explicitly documented within message definitions
//  4. Search for all instances of RecommendedSanction in the codebase and use this new structure instead
//
// EVMChainIDResponse stores the response to an `eth_chainId` request
// https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid
type EVMChainIDResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code received from the endpoint
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// The chain ID value returned in the response
	ChainIdResponse string `protobuf:"bytes,2,opt,name=chain_id_response,json=chainIdResponse,proto3" json:"chain_id_response,omitempty"`
	// Why the response failed QoS validation
	// If not set, the response is considered valid
	ResponseValidationError *EVMResponseValidationError `protobuf:"varint,3,opt,name=response_validation_error,json=responseValidationError,proto3,enum=path.qos.EVMResponseValidationError,oneof" json:"response_validation_error,omitempty"`
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *EVMChainIDResponse) Reset() {
	*x = EVMChainIDResponse{}
	mi := &file_path_qos_evm_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMChainIDResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMChainIDResponse) ProtoMessage() {}

func (x *EVMChainIDResponse) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[5]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMChainIDResponse.ProtoReflect.Descriptor instead.
func (*EVMChainIDResponse) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{5}
}

func (x *EVMChainIDResponse) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMChainIDResponse) GetChainIdResponse() string {
	if x != nil {
		return x.ChainIdResponse
	}
	return ""
}

func (x *EVMChainIDResponse) GetResponseValidationError() EVMResponseValidationError {
	if x != nil && x.ResponseValidationError != nil {
		return *x.ResponseValidationError
	}
	return EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED
}

// EVMBlockNumberResponse stores the response to an `eth_getBlockNumber` request
// https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber
type EVMBlockNumberResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code received from the endpoint
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// The block number value returned in the response
	BlockNumberResponse string `protobuf:"bytes,2,opt,name=block_number_response,json=blockNumberResponse,proto3" json:"block_number_response,omitempty"`
	// Why the response failed QoS validation
	// If not set, the response is considered valid
	ResponseValidationError *EVMResponseValidationError `protobuf:"varint,3,opt,name=response_validation_error,json=responseValidationError,proto3,enum=path.qos.EVMResponseValidationError,oneof" json:"response_validation_error,omitempty"`
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *EVMBlockNumberResponse) Reset() {
	*x = EVMBlockNumberResponse{}
	mi := &file_path_qos_evm_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMBlockNumberResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMBlockNumberResponse) ProtoMessage() {}

func (x *EVMBlockNumberResponse) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[6]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMBlockNumberResponse.ProtoReflect.Descriptor instead.
func (*EVMBlockNumberResponse) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{6}
}

func (x *EVMBlockNumberResponse) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMBlockNumberResponse) GetBlockNumberResponse() string {
	if x != nil {
		return x.BlockNumberResponse
	}
	return ""
}

func (x *EVMBlockNumberResponse) GetResponseValidationError() EVMResponseValidationError {
	if x != nil && x.ResponseValidationError != nil {
		return *x.ResponseValidationError
	}
	return EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED
}

// EVMGetBalanceResponse stores the response to an `eth_getBalance` request.
// https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance
type EVMGetBalanceResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code received from the endpoint
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// The contract address for which the the balance is checked.
	ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"`
	// The block number at which the balance is checked.
	BlockNumber string `protobuf:"bytes,3,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"`
	// The balance value at the block number for the address provided.
	Balance string `protobuf:"bytes,4,opt,name=balance,proto3" json:"balance,omitempty"`
	// Why the response failed QoS validation
	// If not set, the response is considered valid
	ResponseValidationError *EVMResponseValidationError `protobuf:"varint,5,opt,name=response_validation_error,json=responseValidationError,proto3,enum=path.qos.EVMResponseValidationError,oneof" json:"response_validation_error,omitempty"`
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *EVMGetBalanceResponse) Reset() {
	*x = EVMGetBalanceResponse{}
	mi := &file_path_qos_evm_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMGetBalanceResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMGetBalanceResponse) ProtoMessage() {}

func (x *EVMGetBalanceResponse) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[7]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMGetBalanceResponse.ProtoReflect.Descriptor instead.
func (*EVMGetBalanceResponse) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{7}
}

func (x *EVMGetBalanceResponse) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMGetBalanceResponse) GetContractAddress() string {
	if x != nil {
		return x.ContractAddress
	}
	return ""
}

func (x *EVMGetBalanceResponse) GetBlockNumber() string {
	if x != nil {
		return x.BlockNumber
	}
	return ""
}

func (x *EVMGetBalanceResponse) GetBalance() string {
	if x != nil {
		return x.Balance
	}
	return ""
}

func (x *EVMGetBalanceResponse) GetResponseValidationError() EVMResponseValidationError {
	if x != nil && x.ResponseValidationError != nil {
		return *x.ResponseValidationError
	}
	return EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED
}

// EVMUnrecognizedResponse handles requests with unrecognized/unvalidated response methods for QoS endpoint selection.
// - Example: eth_call response contents used for endpoint validation (as of PR #72)
// - Sanctions still apply to endpoints returning invalid responses (e.g. unparsable JSONRPC)
type EVMUnrecognizedResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code received from the endpoint
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// The JSON-RPC response received
	JsonrpcResponse *JsonRpcResponse `protobuf:"bytes,2,opt,name=jsonrpc_response,json=jsonrpcResponse,proto3" json:"jsonrpc_response,omitempty"`
	// Why the response failed QoS validation
	// If not set, the response is considered valid
	ResponseValidationError *EVMResponseValidationError `protobuf:"varint,3,opt,name=response_validation_error,json=responseValidationError,proto3,enum=path.qos.EVMResponseValidationError,oneof" json:"response_validation_error,omitempty"`
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *EVMUnrecognizedResponse) Reset() {
	*x = EVMUnrecognizedResponse{}
	mi := &file_path_qos_evm_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMUnrecognizedResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMUnrecognizedResponse) ProtoMessage() {}

func (x *EVMUnrecognizedResponse) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[8]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMUnrecognizedResponse.ProtoReflect.Descriptor instead.
func (*EVMUnrecognizedResponse) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{8}
}

func (x *EVMUnrecognizedResponse) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMUnrecognizedResponse) GetJsonrpcResponse() *JsonRpcResponse {
	if x != nil {
		return x.JsonrpcResponse
	}
	return nil
}

func (x *EVMUnrecognizedResponse) GetResponseValidationError() EVMResponseValidationError {
	if x != nil && x.ResponseValidationError != nil {
		return *x.ResponseValidationError
	}
	return EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED
}

// EVMEmptyResponse represents an endpoint's empty response, which triggers
// automatic endpoint disqualification by EVM QoS processors.
type EVMEmptyResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code represents the status code sent to the client when the chosen endpoint returns an empty response.
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// Always set to EMPTY for empty responses
	ResponseValidationError EVMResponseValidationError `protobuf:"varint,2,opt,name=response_validation_error,json=responseValidationError,proto3,enum=path.qos.EVMResponseValidationError" json:"response_validation_error,omitempty"`
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *EVMEmptyResponse) Reset() {
	*x = EVMEmptyResponse{}
	mi := &file_path_qos_evm_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMEmptyResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMEmptyResponse) ProtoMessage() {}

func (x *EVMEmptyResponse) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[9]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMEmptyResponse.ProtoReflect.Descriptor instead.
func (*EVMEmptyResponse) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{9}
}

func (x *EVMEmptyResponse) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMEmptyResponse) GetResponseValidationError() EVMResponseValidationError {
	if x != nil {
		return x.ResponseValidationError
	}
	return EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED
}

// EVMNoResponse represents a situation where no responses were reported to QoS by the protocol.
// This is due to protocol failures, e.g. if the selected endpoint was maxed out.
type EVMNoResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The HTTP status code to return, typically 503 Service Unavailable
	HttpStatusCode int32 `protobuf:"varint,1,opt,name=http_status_code,json=httpStatusCode,proto3" json:"http_status_code,omitempty"`
	// Always set to NO_RESPONSE for this scenario
	ResponseValidationError EVMResponseValidationError `protobuf:"varint,2,opt,name=response_validation_error,json=responseValidationError,proto3,enum=path.qos.EVMResponseValidationError" json:"response_validation_error,omitempty"`
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *EVMNoResponse) Reset() {
	*x = EVMNoResponse{}
	mi := &file_path_qos_evm_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *EVMNoResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EVMNoResponse) ProtoMessage() {}

func (x *EVMNoResponse) ProtoReflect() protoreflect.Message {
	mi := &file_path_qos_evm_proto_msgTypes[10]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EVMNoResponse.ProtoReflect.Descriptor instead.
func (*EVMNoResponse) Descriptor() ([]byte, []int) {
	return file_path_qos_evm_proto_rawDescGZIP(), []int{10}
}

func (x *EVMNoResponse) GetHttpStatusCode() int32 {
	if x != nil {
		return x.HttpStatusCode
	}
	return 0
}

func (x *EVMNoResponse) GetResponseValidationError() EVMResponseValidationError {
	if x != nil {
		return x.ResponseValidationError
	}
	return EVMResponseValidationError_EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED
}

var File_path_qos_evm_proto protoreflect.FileDescriptor

const file_path_qos_evm_proto_rawDesc = "" +
	"\n" +
	"\x12path/qos/evm.proto\x12\bpath.qos\x1a\x16path/qos/jsonrpc.proto\x1a\x1dpath/qos/request_origin.proto\x1a*path/qos/endpoint_selection_metadata.proto\x1a\x1cpath/qos/request_error.proto\x1a\x1cpath/metadata/metadata.proto\"\xfb\x05\n" +
	"\x16EVMRequestObservations\x12\x19\n" +
	"\bchain_id\x18\x01 \x01(\tR\achainId\x12\x1d\n" +
	"\n" +
	"service_id\x18\a \x01(\tR\tserviceId\x12>\n" +
	"\x0erequest_origin\x18\b \x01(\x0e2\x17.path.qos.RequestOriginR\rrequestOrigin\x124\n" +
	"\x16request_payload_length\x18\x02 \x01(\rR\x14requestPayloadLength\x12^\n" +
	"\x1aevm_http_body_read_failure\x18\x03 \x01(\v2 .path.qos.EVMHTTPBodyReadFailureH\x00R\x16evmHttpBodyReadFailure\x12r\n" +
	" evm_request_unmarshaling_failure\x18\x04 \x01(\v2'.path.qos.EVMRequestUnmarshalingFailureH\x00R\x1devmRequestUnmarshalingFailure\x12R\n" +
	"\x14request_observations\x18\n" +
	" \x03(\v2\x1f.path.qos.EVMRequestObservationR\x13requestObservations\x12c\n" +
	"\x1bendpoint_selection_metadata\x18\t \x01(\v2#.path.qos.EndpointSelectionMetadataR\x19endpointSelectionMetadata\x12@\n" +
	"\rrequest_error\x18\v \x01(\v2\x16.path.qos.RequestErrorH\x01R\frequestError\x88\x01\x01B\x1c\n" +
	"\x1arequest_validation_failureB\x10\n" +
	"\x0e_request_errorJ\x04\b\x05\x10\x06J\x04\b\x06\x10\aR\x0fjsonrpc_requestR\x15endpoint_observations\"\xb1\x01\n" +
	"\x15EVMRequestObservation\x12A\n" +
	"\x0fjsonrpc_request\x18\x05 \x01(\v2\x18.path.qos.JsonRpcRequestR\x0ejsonrpcRequest\x12U\n" +
	"\x15endpoint_observations\x18\x06 \x03(\v2 .path.qos.EVMEndpointObservationR\x14endpointObservations\"\xce\x01\n" +
	"\x16EVMHTTPBodyReadFailure\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12N\n" +
	"\x10validation_error\x18\x02 \x01(\x0e2#.path.qos.EVMRequestValidationErrorR\x0fvalidationError\x12(\n" +
	"\rerror_details\x18\x03 \x01(\tH\x00R\ferrorDetails\x88\x01\x01B\x10\n" +
	"\x0e_error_details\"\xd5\x01\n" +
	"\x1dEVMRequestUnmarshalingFailure\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12N\n" +
	"\x10validation_error\x18\x02 \x01(\x0e2#.path.qos.EVMRequestValidationErrorR\x0fvalidationError\x12(\n" +
	"\rerror_details\x18\x03 \x01(\tH\x00R\ferrorDetails\x88\x01\x01B\x10\n" +
	"\x0e_error_details\"\x9d\x05\n" +
	"\x16EVMEndpointObservation\x12#\n" +
	"\rendpoint_addr\x18\x01 \x01(\tR\fendpointAddr\x12J\n" +
	"\x11chain_id_response\x18\x02 \x01(\v2\x1c.path.qos.EVMChainIDResponseH\x00R\x0fchainIdResponse\x12V\n" +
	"\x15block_number_response\x18\x03 \x01(\v2 .path.qos.EVMBlockNumberResponseH\x00R\x13blockNumberResponse\x12S\n" +
	"\x14get_balance_response\x18\x04 \x01(\v2\x1f.path.qos.EVMGetBalanceResponseH\x00R\x12getBalanceResponse\x12X\n" +
	"\x15unrecognized_response\x18\x05 \x01(\v2!.path.qos.EVMUnrecognizedResponseH\x00R\x14unrecognizedResponse\x12C\n" +
	"\x0eempty_response\x18\x06 \x01(\v2\x1a.path.qos.EVMEmptyResponseH\x00R\remptyResponse\x12:\n" +
	"\vno_response\x18\a \x01(\v2\x17.path.qos.EVMNoResponseH\x00R\n" +
	"noResponse\x12V\n" +
	"\x17parsed_jsonrpc_response\x18\b \x01(\v2\x19.path.qos.JsonRpcResponseH\x01R\x15parsedJsonrpcResponse\x88\x01\x01B\x16\n" +
	"\x14response_observationB\x1a\n" +
	"\x18_parsed_jsonrpc_response\"\x8d\x02\n" +
	"\x12EVMChainIDResponse\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12*\n" +
	"\x11chain_id_response\x18\x02 \x01(\tR\x0fchainIdResponse\x12\x82\x01\n" +
	"\x19response_validation_error\x18\x03 \x01(\x0e2$.path.qos.EVMResponseValidationErrorB\x1b\x8a\xb5\x18\x17Validation failure typeH\x00R\x17responseValidationError\x88\x01\x01B\x1c\n" +
	"\x1a_response_validation_error\"\x97\x02\n" +
	"\x16EVMBlockNumberResponse\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x122\n" +
	"\x15block_number_response\x18\x02 \x01(\tR\x13blockNumberResponse\x12\x80\x01\n" +
	"\x19response_validation_error\x18\x03 \x01(\x0e2$.path.qos.EVMResponseValidationErrorB\x19\x8a\xb5\x18\x15Validity failure typeH\x00R\x17responseValidationError\x88\x01\x01B\x1c\n" +
	"\x1a_response_validation_error\"\xca\x02\n" +
	"\x15EVMGetBalanceResponse\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12)\n" +
	"\x10contract_address\x18\x02 \x01(\tR\x0fcontractAddress\x12!\n" +
	"\fblock_number\x18\x03 \x01(\tR\vblockNumber\x12\x18\n" +
	"\abalance\x18\x04 \x01(\tR\abalance\x12\x80\x01\n" +
	"\x19response_validation_error\x18\x05 \x01(\x0e2$.path.qos.EVMResponseValidationErrorB\x19\x8a\xb5\x18\x15Validity failure typeH\x00R\x17responseValidationError\x88\x01\x01B\x1c\n" +
	"\x1a_response_validation_error\"\xaa\x02\n" +
	"\x17EVMUnrecognizedResponse\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12D\n" +
	"\x10jsonrpc_response\x18\x02 \x01(\v2\x19.path.qos.JsonRpcResponseR\x0fjsonrpcResponse\x12\x80\x01\n" +
	"\x19response_validation_error\x18\x03 \x01(\x0e2$.path.qos.EVMResponseValidationErrorB\x19\x8a\xb5\x18\x15Validity failure typeH\x00R\x17responseValidationError\x88\x01\x01B\x1c\n" +
	"\x1a_response_validation_error\"\xb9\x01\n" +
	"\x10EVMEmptyResponse\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12{\n" +
	"\x19response_validation_error\x18\x02 \x01(\x0e2$.path.qos.EVMResponseValidationErrorB\x19\x8a\xb5\x18\x15Validity failure typeR\x17responseValidationError\"\xb6\x01\n" +
	"\rEVMNoResponse\x12(\n" +
	"\x10http_status_code\x18\x01 \x01(\x05R\x0ehttpStatusCode\x12{\n" +
	"\x19response_validation_error\x18\x02 \x01(\x0e2$.path.qos.EVMResponseValidationErrorB\x19\x8a\xb5\x18\x15Validity failure typeR\x17responseValidationError*\xc1\x01\n" +
	"\x19EVMRequestValidationError\x12,\n" +
	"(EVM_REQUEST_VALIDATION_ERROR_UNSPECIFIED\x10\x00\x127\n" +
	"3EVM_REQUEST_VALIDATION_ERROR_HTTP_BODY_READ_FAILURE\x10\x01\x12=\n" +
	"9EVM_REQUEST_VALIDATION_ERROR_REQUEST_UNMARSHALING_FAILURE\x10\x02*\xd0\x01\n" +
	"\x1aEVMResponseValidationError\x12-\n" +
	")EVM_RESPONSE_VALIDATION_ERROR_UNSPECIFIED\x10\x00\x12'\n" +
	"#EVM_RESPONSE_VALIDATION_ERROR_EMPTY\x10\x01\x12+\n" +
	"'EVM_RESPONSE_VALIDATION_ERROR_UNMARSHAL\x10\x02\x12-\n" +
	")EVM_RESPONSE_VALIDATION_ERROR_NO_RESPONSE\x10\x03B0Z.github.com/buildwithgrove/path/observation/qosb\x06proto3"

var (
	file_path_qos_evm_proto_rawDescOnce sync.Once
	file_path_qos_evm_proto_rawDescData []byte
)

func file_path_qos_evm_proto_rawDescGZIP() []byte {
	file_path_qos_evm_proto_rawDescOnce.Do(func() {
		file_path_qos_evm_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_path_qos_evm_proto_rawDesc), len(file_path_qos_evm_proto_rawDesc)))
	})
	return file_path_qos_evm_proto_rawDescData
}

var file_path_qos_evm_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_path_qos_evm_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
var file_path_qos_evm_proto_goTypes = []any{
	(EVMRequestValidationError)(0),        // 0: path.qos.EVMRequestValidationError
	(EVMResponseValidationError)(0),       // 1: path.qos.EVMResponseValidationError
	(*EVMRequestObservations)(nil),        // 2: path.qos.EVMRequestObservations
	(*EVMRequestObservation)(nil),         // 3: path.qos.EVMRequestObservation
	(*EVMHTTPBodyReadFailure)(nil),        // 4: path.qos.EVMHTTPBodyReadFailure
	(*EVMRequestUnmarshalingFailure)(nil), // 5: path.qos.EVMRequestUnmarshalingFailure
	(*EVMEndpointObservation)(nil),        // 6: path.qos.EVMEndpointObservation
	(*EVMChainIDResponse)(nil),            // 7: path.qos.EVMChainIDResponse
	(*EVMBlockNumberResponse)(nil),        // 8: path.qos.EVMBlockNumberResponse
	(*EVMGetBalanceResponse)(nil),         // 9: path.qos.EVMGetBalanceResponse
	(*EVMUnrecognizedResponse)(nil),       // 10: path.qos.EVMUnrecognizedResponse
	(*EVMEmptyResponse)(nil),              // 11: path.qos.EVMEmptyResponse
	(*EVMNoResponse)(nil),                 // 12: path.qos.EVMNoResponse
	(RequestOrigin)(0),                    // 13: path.qos.RequestOrigin
	(*EndpointSelectionMetadata)(nil),     // 14: path.qos.EndpointSelectionMetadata
	(*RequestError)(nil),                  // 15: path.qos.RequestError
	(*JsonRpcRequest)(nil),                // 16: path.qos.JsonRpcRequest
	(*JsonRpcResponse)(nil),               // 17: path.qos.JsonRpcResponse
}
var file_path_qos_evm_proto_depIdxs = []int32{
	13, // 0: path.qos.EVMRequestObservations.request_origin:type_name -> path.qos.RequestOrigin
	4,  // 1: path.qos.EVMRequestObservations.evm_http_body_read_failure:type_name -> path.qos.EVMHTTPBodyReadFailure
	5,  // 2: path.qos.EVMRequestObservations.evm_request_unmarshaling_failure:type_name -> path.qos.EVMRequestUnmarshalingFailure
	3,  // 3: path.qos.EVMRequestObservations.request_observations:type_name -> path.qos.EVMRequestObservation
	14, // 4: path.qos.EVMRequestObservations.endpoint_selection_metadata:type_name -> path.qos.EndpointSelectionMetadata
	15, // 5: path.qos.EVMRequestObservations.request_error:type_name -> path.qos.RequestError
	16, // 6: path.qos.EVMRequestObservation.jsonrpc_request:type_name -> path.qos.JsonRpcRequest
	6,  // 7: path.qos.EVMRequestObservation.endpoint_observations:type_name -> path.qos.EVMEndpointObservation
	0,  // 8: path.qos.EVMHTTPBodyReadFailure.validation_error:type_name -> path.qos.EVMRequestValidationError
	0,  // 9: path.qos.EVMRequestUnmarshalingFailure.validation_error:type_name -> path.qos.EVMRequestValidationError
	7,  // 10: path.qos.EVMEndpointObservation.chain_id_response:type_name -> path.qos.EVMChainIDResponse
	8,  // 11: path.qos.EVMEndpointObservation.block_number_response:type_name -> path.qos.EVMBlockNumberResponse
	9,  // 12: path.qos.EVMEndpointObservation.get_balance_response:type_name -> path.qos.EVMGetBalanceResponse
	10, // 13: path.qos.EVMEndpointObservation.unrecognized_response:type_name -> path.qos.EVMUnrecognizedResponse
	11, // 14: path.qos.EVMEndpointObservation.empty_response:type_name -> path.qos.EVMEmptyResponse
	12, // 15: path.qos.EVMEndpointObservation.no_response:type_name -> path.qos.EVMNoResponse
	17, // 16: path.qos.EVMEndpointObservation.parsed_jsonrpc_response:type_name -> path.qos.JsonRpcResponse
	1,  // 17: path.qos.EVMChainIDResponse.response_validation_error:type_name -> path.qos.EVMResponseValidationError
	1,  // 18: path.qos.EVMBlockNumberResponse.response_validation_error:type_name -> path.qos.EVMResponseValidationError
	1,  // 19: path.qos.EVMGetBalanceResponse.response_validation_error:type_name -> path.qos.EVMResponseValidationError
	17, // 20: path.qos.EVMUnrecognizedResponse.jsonrpc_response:type_name -> path.qos.JsonRpcResponse
	1,  // 21: path.qos.EVMUnrecognizedResponse.response_validation_error:type_name -> path.qos.EVMResponseValidationError
	1,  // 22: path.qos.EVMEmptyResponse.response_validation_error:type_name -> path.qos.EVMResponseValidationError
	1,  // 23: path.qos.EVMNoResponse.response_validation_error:type_name -> path.qos.EVMResponseValidationError
	24, // [24:24] is the sub-list for method output_type
	24, // [24:24] is the sub-list for method input_type
	24, // [24:24] is the sub-list for extension type_name
	24, // [24:24] is the sub-list for extension extendee
	0,  // [0:24] is the sub-list for field type_name
}

func init() { file_path_qos_evm_proto_init() }
func file_path_qos_evm_proto_init() {
	if File_path_qos_evm_proto != nil {
		return
	}
	file_path_qos_jsonrpc_proto_init()
	file_path_qos_request_origin_proto_init()
	file_path_qos_endpoint_selection_metadata_proto_init()
	file_path_qos_request_error_proto_init()
	file_path_qos_evm_proto_msgTypes[0].OneofWrappers = []any{
		(*EVMRequestObservations_EvmHttpBodyReadFailure)(nil),
		(*EVMRequestObservations_EvmRequestUnmarshalingFailure)(nil),
	}
	file_path_qos_evm_proto_msgTypes[2].OneofWrappers = []any{}
	file_path_qos_evm_proto_msgTypes[3].OneofWrappers = []any{}
	file_path_qos_evm_proto_msgTypes[4].OneofWrappers = []any{
		(*EVMEndpointObservation_ChainIdResponse)(nil),
		(*EVMEndpointObservation_BlockNumberResponse)(nil),
		(*EVMEndpointObservation_GetBalanceResponse)(nil),
		(*EVMEndpointObservation_UnrecognizedResponse)(nil),
		(*EVMEndpointObservation_EmptyResponse)(nil),
		(*EVMEndpointObservation_NoResponse)(nil),
	}
	file_path_qos_evm_proto_msgTypes[5].OneofWrappers = []any{}
	file_path_qos_evm_proto_msgTypes[6].OneofWrappers = []any{}
	file_path_qos_evm_proto_msgTypes[7].OneofWrappers = []any{}
	file_path_qos_evm_proto_msgTypes[8].OneofWrappers = []any{}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_path_qos_evm_proto_rawDesc), len(file_path_qos_evm_proto_rawDesc)),
			NumEnums:      2,
			NumMessages:   11,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_path_qos_evm_proto_goTypes,
		DependencyIndexes: file_path_qos_evm_proto_depIdxs,
		EnumInfos:         file_path_qos_evm_proto_enumTypes,
		MessageInfos:      file_path_qos_evm_proto_msgTypes,
	}.Build()
	File_path_qos_evm_proto = out.File
	file_path_qos_evm_proto_goTypes = nil
	file_path_qos_evm_proto_depIdxs = nil
}
