diff --git a/observability-lib/go.mod b/observability-lib/go.mod index 5449577518..c082c62649 100644 --- a/observability-lib/go.mod +++ b/observability-lib/go.mod @@ -1,22 +1,24 @@ module github.com/smartcontractkit/chainlink-common/observability-lib -go 1.21.4 +go 1.24.2 + +toolchain go1.24.4 require ( github.com/go-resty/resty/v2 v2.15.3 github.com/grafana/grafana-foundation-sdk/go v0.0.0-20241009194022-923b32e3e69b github.com/spf13/cobra v1.8.1 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/net v0.30.0 // indirect + golang.org/x/net v0.38.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/observability-lib/go.sum b/observability-lib/go.sum index 02dadb6ce6..cdf637ea36 100644 --- a/observability-lib/go.sum +++ b/observability-lib/go.sum @@ -1,7 +1,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/grafana/grafana-foundation-sdk/go v0.0.0-20241009194022-923b32e3e69b h1:YxlugK0wL5hh86wT0hZSGw9cPTvacOUmHxjP15fsIlE= @@ -16,8 +16,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= @@ -26,10 +26,10 @@ github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/capabilities/v2/chain-capabilities/evm/capability.pb.go b/pkg/capabilities/v2/chain-capabilities/evm/capability.pb.go index f4adf8877c..703e12a33c 100644 --- a/pkg/capabilities/v2/chain-capabilities/evm/capability.pb.go +++ b/pkg/capabilities/v2/chain-capabilities/evm/capability.pb.go @@ -9,6 +9,7 @@ package evm import ( _ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/protoc/pkg/pb" evm "github.com/smartcontractkit/chainlink-common/pkg/chains/evm" + pb "github.com/smartcontractkit/chainlink-common/pkg/values/pb" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" @@ -73,6 +74,52 @@ func (ConfidenceLevel) EnumDescriptor() ([]byte, []int) { return file_capability_proto_rawDescGZIP(), []int{0} } +type ReceiverContractExecutionStatus int32 + +const ( + ReceiverContractExecutionStatus_SUCCESS ReceiverContractExecutionStatus = 0 + ReceiverContractExecutionStatus_REVERTED ReceiverContractExecutionStatus = 1 +) + +// Enum value maps for ReceiverContractExecutionStatus. +var ( + ReceiverContractExecutionStatus_name = map[int32]string{ + 0: "SUCCESS", + 1: "REVERTED", + } + ReceiverContractExecutionStatus_value = map[string]int32{ + "SUCCESS": 0, + "REVERTED": 1, + } +) + +func (x ReceiverContractExecutionStatus) Enum() *ReceiverContractExecutionStatus { + p := new(ReceiverContractExecutionStatus) + *p = x + return p +} + +func (x ReceiverContractExecutionStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReceiverContractExecutionStatus) Descriptor() protoreflect.EnumDescriptor { + return file_capability_proto_enumTypes[1].Descriptor() +} + +func (ReceiverContractExecutionStatus) Type() protoreflect.EnumType { + return &file_capability_proto_enumTypes[1] +} + +func (x ReceiverContractExecutionStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReceiverContractExecutionStatus.Descriptor instead. +func (ReceiverContractExecutionStatus) EnumDescriptor() ([]byte, []int) { + return file_capability_proto_rawDescGZIP(), []int{1} +} + type TopicValues struct { state protoimpl.MessageState `protogen:"open.v1"` Values [][]byte `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` // list of possible values for any topic, in [32]byte fix-sized array format @@ -182,11 +229,259 @@ func (x *FilterLogTriggerRequest) GetConfidence() ConfidenceLevel { return ConfidenceLevel_SAFE } +type SignedReport struct { + state protoimpl.MessageState `protogen:"open.v1"` + RawReport []byte `protobuf:"bytes,1,opt,name=raw_report,json=rawReport,proto3" json:"raw_report,omitempty"` + ReportContext []byte `protobuf:"bytes,2,opt,name=report_context,json=reportContext,proto3" json:"report_context,omitempty"` + Signatures [][]byte `protobuf:"bytes,3,rep,name=signatures,proto3" json:"signatures,omitempty"` + Id []byte `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignedReport) Reset() { + *x = SignedReport{} + mi := &file_capability_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignedReport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedReport) ProtoMessage() {} + +func (x *SignedReport) ProtoReflect() protoreflect.Message { + mi := &file_capability_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 SignedReport.ProtoReflect.Descriptor instead. +func (*SignedReport) Descriptor() ([]byte, []int) { + return file_capability_proto_rawDescGZIP(), []int{2} +} + +func (x *SignedReport) GetRawReport() []byte { + if x != nil { + return x.RawReport + } + return nil +} + +func (x *SignedReport) GetReportContext() []byte { + if x != nil { + return x.ReportContext + } + return nil +} + +func (x *SignedReport) GetSignatures() [][]byte { + if x != nil { + return x.Signatures + } + return nil +} + +func (x *SignedReport) GetId() []byte { + if x != nil { + return x.Id + } + return nil +} + +type WriteReportRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Receiver []byte `protobuf:"bytes,1,opt,name=receiver,proto3" json:"receiver,omitempty"` + Report *SignedReport `protobuf:"bytes,2,opt,name=report,proto3" json:"report,omitempty"` + GasConfig *GasConfig `protobuf:"bytes,3,opt,name=gas_config,json=gasConfig,proto3,oneof" json:"gas_config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *WriteReportRequest) Reset() { + *x = WriteReportRequest{} + mi := &file_capability_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WriteReportRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteReportRequest) ProtoMessage() {} + +func (x *WriteReportRequest) ProtoReflect() protoreflect.Message { + mi := &file_capability_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 WriteReportRequest.ProtoReflect.Descriptor instead. +func (*WriteReportRequest) Descriptor() ([]byte, []int) { + return file_capability_proto_rawDescGZIP(), []int{3} +} + +func (x *WriteReportRequest) GetReceiver() []byte { + if x != nil { + return x.Receiver + } + return nil +} + +func (x *WriteReportRequest) GetReport() *SignedReport { + if x != nil { + return x.Report + } + return nil +} + +func (x *WriteReportRequest) GetGasConfig() *GasConfig { + if x != nil { + return x.GasConfig + } + return nil +} + +type GasConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + GasLimit uint64 `protobuf:"varint,1,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GasConfig) Reset() { + *x = GasConfig{} + mi := &file_capability_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GasConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GasConfig) ProtoMessage() {} + +func (x *GasConfig) ProtoReflect() protoreflect.Message { + mi := &file_capability_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 GasConfig.ProtoReflect.Descriptor instead. +func (*GasConfig) Descriptor() ([]byte, []int) { + return file_capability_proto_rawDescGZIP(), []int{4} +} + +func (x *GasConfig) GetGasLimit() uint64 { + if x != nil { + return x.GasLimit + } + return 0 +} + +type WriteReportReply struct { + state protoimpl.MessageState `protogen:"open.v1"` + TxStatus evm.TxStatus `protobuf:"varint,1,opt,name=tx_status,json=txStatus,proto3,enum=loop.evm.TxStatus" json:"tx_status,omitempty"` + ReceiverContractExecutionStatus *ReceiverContractExecutionStatus `protobuf:"varint,2,opt,name=receiver_contract_execution_status,json=receiverContractExecutionStatus,proto3,enum=cre.sdk.v2.evm.ReceiverContractExecutionStatus,oneof" json:"receiver_contract_execution_status,omitempty"` + TxHash []byte `protobuf:"bytes,3,opt,name=tx_hash,json=txHash,proto3,oneof" json:"tx_hash,omitempty"` + TransactionFee *pb.BigInt `protobuf:"bytes,4,opt,name=transaction_fee,json=transactionFee,proto3,oneof" json:"transaction_fee,omitempty"` + ErrorMessage *string `protobuf:"bytes,5,opt,name=error_message,json=errorMessage,proto3,oneof" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *WriteReportReply) Reset() { + *x = WriteReportReply{} + mi := &file_capability_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WriteReportReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteReportReply) ProtoMessage() {} + +func (x *WriteReportReply) ProtoReflect() protoreflect.Message { + mi := &file_capability_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 WriteReportReply.ProtoReflect.Descriptor instead. +func (*WriteReportReply) Descriptor() ([]byte, []int) { + return file_capability_proto_rawDescGZIP(), []int{5} +} + +func (x *WriteReportReply) GetTxStatus() evm.TxStatus { + if x != nil { + return x.TxStatus + } + return evm.TxStatus(0) +} + +func (x *WriteReportReply) GetReceiverContractExecutionStatus() ReceiverContractExecutionStatus { + if x != nil && x.ReceiverContractExecutionStatus != nil { + return *x.ReceiverContractExecutionStatus + } + return ReceiverContractExecutionStatus_SUCCESS +} + +func (x *WriteReportReply) GetTxHash() []byte { + if x != nil { + return x.TxHash + } + return nil +} + +func (x *WriteReportReply) GetTransactionFee() *pb.BigInt { + if x != nil { + return x.TransactionFee + } + return nil +} + +func (x *WriteReportReply) GetErrorMessage() string { + if x != nil && x.ErrorMessage != nil { + return *x.ErrorMessage + } + return "" +} + var File_capability_proto protoreflect.FileDescriptor const file_capability_proto_rawDesc = "" + "\n" + - "\x10capability.proto\x12\x0ecre.sdk.v2.evm\x1a\x1bgoogle/protobuf/empty.proto\x1a*tools/generator/v1alpha/cre_metadata.proto\x1a\x14chains/evm/evm.proto\"%\n" + + "\x10capability.proto\x12\x0ecre.sdk.v2.evm\x1a\x1bgoogle/protobuf/empty.proto\x1a*tools/generator/v1alpha/cre_metadata.proto\x1a\x14chains/evm/evm.proto\x1a\x16values/v1/values.proto\"%\n" + "\vTopicValues\x12\x16\n" + "\x06values\x18\x01 \x03(\fR\x06values\"\xad\x01\n" + "\x17FilterLogTriggerRequest\x12\x1c\n" + @@ -194,12 +489,42 @@ const file_capability_proto_rawDesc = "" + "\x06topics\x18\x02 \x03(\v2\x1b.cre.sdk.v2.evm.TopicValuesR\x06topics\x12?\n" + "\n" + "Confidence\x18\x03 \x01(\x0e2\x1f.cre.sdk.v2.evm.ConfidenceLevelR\n" + - "Confidence*6\n" + + "Confidence\"\x84\x01\n" + + "\fSignedReport\x12\x1d\n" + + "\n" + + "raw_report\x18\x01 \x01(\fR\trawReport\x12%\n" + + "\x0ereport_context\x18\x02 \x01(\fR\rreportContext\x12\x1e\n" + + "\n" + + "signatures\x18\x03 \x03(\fR\n" + + "signatures\x12\x0e\n" + + "\x02id\x18\x04 \x01(\fR\x02id\"\xb4\x01\n" + + "\x12WriteReportRequest\x12\x1a\n" + + "\breceiver\x18\x01 \x01(\fR\breceiver\x124\n" + + "\x06report\x18\x02 \x01(\v2\x1c.cre.sdk.v2.evm.SignedReportR\x06report\x12=\n" + + "\n" + + "gas_config\x18\x03 \x01(\v2\x19.cre.sdk.v2.evm.GasConfigH\x00R\tgasConfig\x88\x01\x01B\r\n" + + "\v_gas_config\"(\n" + + "\tGasConfig\x12\x1b\n" + + "\tgas_limit\x18\x01 \x01(\x04R\bgasLimit\"\xa9\x03\n" + + "\x10WriteReportReply\x12/\n" + + "\ttx_status\x18\x01 \x01(\x0e2\x12.loop.evm.TxStatusR\btxStatus\x12\x81\x01\n" + + "\"receiver_contract_execution_status\x18\x02 \x01(\x0e2/.cre.sdk.v2.evm.ReceiverContractExecutionStatusH\x00R\x1freceiverContractExecutionStatus\x88\x01\x01\x12\x1c\n" + + "\atx_hash\x18\x03 \x01(\fH\x01R\x06txHash\x88\x01\x01\x12?\n" + + "\x0ftransaction_fee\x18\x04 \x01(\v2\x11.values.v1.BigIntH\x02R\x0etransactionFee\x88\x01\x01\x12(\n" + + "\rerror_message\x18\x05 \x01(\tH\x03R\ferrorMessage\x88\x01\x01B%\n" + + "#_receiver_contract_execution_statusB\n" + + "\n" + + "\b_tx_hashB\x12\n" + + "\x10_transaction_feeB\x10\n" + + "\x0e_error_message*6\n" + "\x0fConfidenceLevel\x12\b\n" + "\x04SAFE\x10\x00\x12\n" + "\n" + "\x06LATEST\x10\x01\x12\r\n" + - "\tFINALIZED\x10\x022\xab\a\n" + + "\tFINALIZED\x10\x02*<\n" + + "\x1fReceiverContractExecutionStatus\x12\v\n" + + "\aSUCCESS\x10\x00\x12\f\n" + + "\bREVERTED\x10\x012\x80\b\n" + "\x06Client\x12J\n" + "\fCallContract\x12\x1d.loop.evm.CallContractRequest\x1a\x1b.loop.evm.CallContractReply\x12D\n" + "\n" + @@ -213,7 +538,8 @@ const file_capability_proto_rawDesc = "" + "\x13RegisterLogTracking\x12$.loop.evm.RegisterLogTrackingRequest\x1a\x16.google.protobuf.Empty\x12W\n" + "\x15UnregisterLogTracking\x12&.loop.evm.UnregisterLogTrackingRequest\x1a\x16.google.protobuf.Empty\x12F\n" + "\n" + - "LogTrigger\x12'.cre.sdk.v2.evm.FilterLogTriggerRequest\x1a\r.loop.evm.Log0\x01\x1a\x11\x82\xb5\x18\r\b\x01\x12\tevm@1.0.0B]Z[github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/chain-capabilities/evm;evmb\x06proto3" + "LogTrigger\x12'.cre.sdk.v2.evm.FilterLogTriggerRequest\x1a\r.loop.evm.Log0\x01\x12S\n" + + "\vWriteReport\x12\".cre.sdk.v2.evm.WriteReportRequest\x1a .cre.sdk.v2.evm.WriteReportReply\x1a\x11\x82\xb5\x18\r\b\x01\x12\tevm@1.0.0B]Z[github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/chain-capabilities/evm;evmb\x06proto3" var ( file_capability_proto_rawDescOnce sync.Once @@ -227,62 +553,76 @@ func file_capability_proto_rawDescGZIP() []byte { return file_capability_proto_rawDescData } -var file_capability_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_capability_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_capability_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_capability_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_capability_proto_goTypes = []any{ (ConfidenceLevel)(0), // 0: cre.sdk.v2.evm.ConfidenceLevel - (*TopicValues)(nil), // 1: cre.sdk.v2.evm.TopicValues - (*FilterLogTriggerRequest)(nil), // 2: cre.sdk.v2.evm.FilterLogTriggerRequest - (*evm.CallContractRequest)(nil), // 3: loop.evm.CallContractRequest - (*evm.FilterLogsRequest)(nil), // 4: loop.evm.FilterLogsRequest - (*evm.BalanceAtRequest)(nil), // 5: loop.evm.BalanceAtRequest - (*evm.EstimateGasRequest)(nil), // 6: loop.evm.EstimateGasRequest - (*evm.GetTransactionByHashRequest)(nil), // 7: loop.evm.GetTransactionByHashRequest - (*evm.GetTransactionReceiptRequest)(nil), // 8: loop.evm.GetTransactionReceiptRequest - (*emptypb.Empty)(nil), // 9: google.protobuf.Empty - (*evm.QueryTrackedLogsRequest)(nil), // 10: loop.evm.QueryTrackedLogsRequest - (*evm.RegisterLogTrackingRequest)(nil), // 11: loop.evm.RegisterLogTrackingRequest - (*evm.UnregisterLogTrackingRequest)(nil), // 12: loop.evm.UnregisterLogTrackingRequest - (*evm.CallContractReply)(nil), // 13: loop.evm.CallContractReply - (*evm.FilterLogsReply)(nil), // 14: loop.evm.FilterLogsReply - (*evm.BalanceAtReply)(nil), // 15: loop.evm.BalanceAtReply - (*evm.EstimateGasReply)(nil), // 16: loop.evm.EstimateGasReply - (*evm.GetTransactionByHashReply)(nil), // 17: loop.evm.GetTransactionByHashReply - (*evm.GetTransactionReceiptReply)(nil), // 18: loop.evm.GetTransactionReceiptReply - (*evm.LatestAndFinalizedHeadReply)(nil), // 19: loop.evm.LatestAndFinalizedHeadReply - (*evm.QueryTrackedLogsReply)(nil), // 20: loop.evm.QueryTrackedLogsReply - (*evm.Log)(nil), // 21: loop.evm.Log + (ReceiverContractExecutionStatus)(0), // 1: cre.sdk.v2.evm.ReceiverContractExecutionStatus + (*TopicValues)(nil), // 2: cre.sdk.v2.evm.TopicValues + (*FilterLogTriggerRequest)(nil), // 3: cre.sdk.v2.evm.FilterLogTriggerRequest + (*SignedReport)(nil), // 4: cre.sdk.v2.evm.SignedReport + (*WriteReportRequest)(nil), // 5: cre.sdk.v2.evm.WriteReportRequest + (*GasConfig)(nil), // 6: cre.sdk.v2.evm.GasConfig + (*WriteReportReply)(nil), // 7: cre.sdk.v2.evm.WriteReportReply + (evm.TxStatus)(0), // 8: loop.evm.TxStatus + (*pb.BigInt)(nil), // 9: values.v1.BigInt + (*evm.CallContractRequest)(nil), // 10: loop.evm.CallContractRequest + (*evm.FilterLogsRequest)(nil), // 11: loop.evm.FilterLogsRequest + (*evm.BalanceAtRequest)(nil), // 12: loop.evm.BalanceAtRequest + (*evm.EstimateGasRequest)(nil), // 13: loop.evm.EstimateGasRequest + (*evm.GetTransactionByHashRequest)(nil), // 14: loop.evm.GetTransactionByHashRequest + (*evm.GetTransactionReceiptRequest)(nil), // 15: loop.evm.GetTransactionReceiptRequest + (*emptypb.Empty)(nil), // 16: google.protobuf.Empty + (*evm.QueryTrackedLogsRequest)(nil), // 17: loop.evm.QueryTrackedLogsRequest + (*evm.RegisterLogTrackingRequest)(nil), // 18: loop.evm.RegisterLogTrackingRequest + (*evm.UnregisterLogTrackingRequest)(nil), // 19: loop.evm.UnregisterLogTrackingRequest + (*evm.CallContractReply)(nil), // 20: loop.evm.CallContractReply + (*evm.FilterLogsReply)(nil), // 21: loop.evm.FilterLogsReply + (*evm.BalanceAtReply)(nil), // 22: loop.evm.BalanceAtReply + (*evm.EstimateGasReply)(nil), // 23: loop.evm.EstimateGasReply + (*evm.GetTransactionByHashReply)(nil), // 24: loop.evm.GetTransactionByHashReply + (*evm.GetTransactionReceiptReply)(nil), // 25: loop.evm.GetTransactionReceiptReply + (*evm.LatestAndFinalizedHeadReply)(nil), // 26: loop.evm.LatestAndFinalizedHeadReply + (*evm.QueryTrackedLogsReply)(nil), // 27: loop.evm.QueryTrackedLogsReply + (*evm.Log)(nil), // 28: loop.evm.Log } var file_capability_proto_depIdxs = []int32{ - 1, // 0: cre.sdk.v2.evm.FilterLogTriggerRequest.topics:type_name -> cre.sdk.v2.evm.TopicValues + 2, // 0: cre.sdk.v2.evm.FilterLogTriggerRequest.topics:type_name -> cre.sdk.v2.evm.TopicValues 0, // 1: cre.sdk.v2.evm.FilterLogTriggerRequest.Confidence:type_name -> cre.sdk.v2.evm.ConfidenceLevel - 3, // 2: cre.sdk.v2.evm.Client.CallContract:input_type -> loop.evm.CallContractRequest - 4, // 3: cre.sdk.v2.evm.Client.FilterLogs:input_type -> loop.evm.FilterLogsRequest - 5, // 4: cre.sdk.v2.evm.Client.BalanceAt:input_type -> loop.evm.BalanceAtRequest - 6, // 5: cre.sdk.v2.evm.Client.EstimateGas:input_type -> loop.evm.EstimateGasRequest - 7, // 6: cre.sdk.v2.evm.Client.GetTransactionByHash:input_type -> loop.evm.GetTransactionByHashRequest - 8, // 7: cre.sdk.v2.evm.Client.GetTransactionReceipt:input_type -> loop.evm.GetTransactionReceiptRequest - 9, // 8: cre.sdk.v2.evm.Client.LatestAndFinalizedHead:input_type -> google.protobuf.Empty - 10, // 9: cre.sdk.v2.evm.Client.QueryTrackedLogs:input_type -> loop.evm.QueryTrackedLogsRequest - 11, // 10: cre.sdk.v2.evm.Client.RegisterLogTracking:input_type -> loop.evm.RegisterLogTrackingRequest - 12, // 11: cre.sdk.v2.evm.Client.UnregisterLogTracking:input_type -> loop.evm.UnregisterLogTrackingRequest - 2, // 12: cre.sdk.v2.evm.Client.LogTrigger:input_type -> cre.sdk.v2.evm.FilterLogTriggerRequest - 13, // 13: cre.sdk.v2.evm.Client.CallContract:output_type -> loop.evm.CallContractReply - 14, // 14: cre.sdk.v2.evm.Client.FilterLogs:output_type -> loop.evm.FilterLogsReply - 15, // 15: cre.sdk.v2.evm.Client.BalanceAt:output_type -> loop.evm.BalanceAtReply - 16, // 16: cre.sdk.v2.evm.Client.EstimateGas:output_type -> loop.evm.EstimateGasReply - 17, // 17: cre.sdk.v2.evm.Client.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply - 18, // 18: cre.sdk.v2.evm.Client.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply - 19, // 19: cre.sdk.v2.evm.Client.LatestAndFinalizedHead:output_type -> loop.evm.LatestAndFinalizedHeadReply - 20, // 20: cre.sdk.v2.evm.Client.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply - 9, // 21: cre.sdk.v2.evm.Client.RegisterLogTracking:output_type -> google.protobuf.Empty - 9, // 22: cre.sdk.v2.evm.Client.UnregisterLogTracking:output_type -> google.protobuf.Empty - 21, // 23: cre.sdk.v2.evm.Client.LogTrigger:output_type -> loop.evm.Log - 13, // [13:24] is the sub-list for method output_type - 2, // [2:13] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 4, // 2: cre.sdk.v2.evm.WriteReportRequest.report:type_name -> cre.sdk.v2.evm.SignedReport + 6, // 3: cre.sdk.v2.evm.WriteReportRequest.gas_config:type_name -> cre.sdk.v2.evm.GasConfig + 8, // 4: cre.sdk.v2.evm.WriteReportReply.tx_status:type_name -> loop.evm.TxStatus + 1, // 5: cre.sdk.v2.evm.WriteReportReply.receiver_contract_execution_status:type_name -> cre.sdk.v2.evm.ReceiverContractExecutionStatus + 9, // 6: cre.sdk.v2.evm.WriteReportReply.transaction_fee:type_name -> values.v1.BigInt + 10, // 7: cre.sdk.v2.evm.Client.CallContract:input_type -> loop.evm.CallContractRequest + 11, // 8: cre.sdk.v2.evm.Client.FilterLogs:input_type -> loop.evm.FilterLogsRequest + 12, // 9: cre.sdk.v2.evm.Client.BalanceAt:input_type -> loop.evm.BalanceAtRequest + 13, // 10: cre.sdk.v2.evm.Client.EstimateGas:input_type -> loop.evm.EstimateGasRequest + 14, // 11: cre.sdk.v2.evm.Client.GetTransactionByHash:input_type -> loop.evm.GetTransactionByHashRequest + 15, // 12: cre.sdk.v2.evm.Client.GetTransactionReceipt:input_type -> loop.evm.GetTransactionReceiptRequest + 16, // 13: cre.sdk.v2.evm.Client.LatestAndFinalizedHead:input_type -> google.protobuf.Empty + 17, // 14: cre.sdk.v2.evm.Client.QueryTrackedLogs:input_type -> loop.evm.QueryTrackedLogsRequest + 18, // 15: cre.sdk.v2.evm.Client.RegisterLogTracking:input_type -> loop.evm.RegisterLogTrackingRequest + 19, // 16: cre.sdk.v2.evm.Client.UnregisterLogTracking:input_type -> loop.evm.UnregisterLogTrackingRequest + 3, // 17: cre.sdk.v2.evm.Client.LogTrigger:input_type -> cre.sdk.v2.evm.FilterLogTriggerRequest + 5, // 18: cre.sdk.v2.evm.Client.WriteReport:input_type -> cre.sdk.v2.evm.WriteReportRequest + 20, // 19: cre.sdk.v2.evm.Client.CallContract:output_type -> loop.evm.CallContractReply + 21, // 20: cre.sdk.v2.evm.Client.FilterLogs:output_type -> loop.evm.FilterLogsReply + 22, // 21: cre.sdk.v2.evm.Client.BalanceAt:output_type -> loop.evm.BalanceAtReply + 23, // 22: cre.sdk.v2.evm.Client.EstimateGas:output_type -> loop.evm.EstimateGasReply + 24, // 23: cre.sdk.v2.evm.Client.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply + 25, // 24: cre.sdk.v2.evm.Client.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply + 26, // 25: cre.sdk.v2.evm.Client.LatestAndFinalizedHead:output_type -> loop.evm.LatestAndFinalizedHeadReply + 27, // 26: cre.sdk.v2.evm.Client.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply + 16, // 27: cre.sdk.v2.evm.Client.RegisterLogTracking:output_type -> google.protobuf.Empty + 16, // 28: cre.sdk.v2.evm.Client.UnregisterLogTracking:output_type -> google.protobuf.Empty + 28, // 29: cre.sdk.v2.evm.Client.LogTrigger:output_type -> loop.evm.Log + 7, // 30: cre.sdk.v2.evm.Client.WriteReport:output_type -> cre.sdk.v2.evm.WriteReportReply + 19, // [19:31] is the sub-list for method output_type + 7, // [7:19] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_capability_proto_init() } @@ -290,13 +630,15 @@ func file_capability_proto_init() { if File_capability_proto != nil { return } + file_capability_proto_msgTypes[3].OneofWrappers = []any{} + file_capability_proto_msgTypes[5].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_capability_proto_rawDesc), len(file_capability_proto_rawDesc)), - NumEnums: 1, - NumMessages: 2, + NumEnums: 2, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/capabilities/v2/chain-capabilities/evm/capability.proto b/pkg/capabilities/v2/chain-capabilities/evm/capability.proto index 67c66237b4..61ff1e2084 100644 --- a/pkg/capabilities/v2/chain-capabilities/evm/capability.proto +++ b/pkg/capabilities/v2/chain-capabilities/evm/capability.proto @@ -7,6 +7,7 @@ package cre.sdk.v2.evm; import "google/protobuf/empty.proto"; import "tools/generator/v1alpha/cre_metadata.proto"; import "chains/evm/evm.proto"; +import "values/v1/values.proto"; enum ConfidenceLevel { SAFE = 0; @@ -46,5 +47,37 @@ service Client { rpc QueryTrackedLogs(loop.evm.QueryTrackedLogsRequest) returns (loop.evm.QueryTrackedLogsReply); rpc RegisterLogTracking(loop.evm.RegisterLogTrackingRequest) returns (google.protobuf.Empty); rpc UnregisterLogTracking(loop.evm.UnregisterLogTrackingRequest) returns (google.protobuf.Empty); - rpc LogTrigger(FilterLogTriggerRequest) returns (stream loop.evm.Log); + rpc LogTrigger(FilterLogTriggerRequest) returns (stream loop.evm.Log);; + rpc WriteReport(WriteReportRequest) returns (WriteReportReply); + +} + +message SignedReport { + bytes raw_report = 1; + bytes report_context = 2; + repeated bytes signatures = 3; + bytes id = 4; +} + +enum ReceiverContractExecutionStatus { + SUCCESS = 0; + REVERTED = 1; +} + +message WriteReportRequest { + bytes receiver = 1; + SignedReport report = 2; + optional GasConfig gas_config = 3; +} + +message GasConfig { + uint64 gas_limit = 1; +} + +message WriteReportReply { + loop.evm.TxStatus tx_status = 1; + optional ReceiverContractExecutionStatus receiver_contract_execution_status = 2; + optional bytes tx_hash = 3; + optional values.v1.BigInt transaction_fee = 4; + optional string error_message = 5; } \ No newline at end of file diff --git a/pkg/capabilities/v2/chain-capabilities/evm/capability_sdk_gen.go b/pkg/capabilities/v2/chain-capabilities/evm/capability_sdk_gen.go index f52c548904..3d4fec006b 100644 --- a/pkg/capabilities/v2/chain-capabilities/evm/capability_sdk_gen.go +++ b/pkg/capabilities/v2/chain-capabilities/evm/capability_sdk_gen.go @@ -280,3 +280,26 @@ func (t *clientLogTrigger) ConfigAsAny() *anypb.Any { func (t *clientLogTrigger) Adapt(trigger *evm.Log) (*evm.Log, error) { return trigger, nil } + +func (c *Client) WriteReport(runtime sdk.Runtime, input *WriteReportRequest) sdk.Promise[*WriteReportReply] { + wrapped, err := anypb.New(input) + if err != nil { + return sdk.PromiseFromResult[*WriteReportReply](nil, err) + } + return sdk.Then(runtime.CallCapability(&sdkpb.CapabilityRequest{ + Id: "evm@1.0.0", + Payload: wrapped, + Method: "WriteReport", + }), func(i *sdkpb.CapabilityResponse) (*WriteReportReply, error) { + switch payload := i.Response.(type) { + case *sdkpb.CapabilityResponse_Error: + return nil, errors.New(payload.Error) + case *sdkpb.CapabilityResponse_Payload: + output := &WriteReportReply{} + err = payload.Payload.UnmarshalTo(output) + return output, err + default: + return nil, errors.New("unexpected response type") + } + }) +} diff --git a/pkg/capabilities/v2/chain-capabilities/evm/capabilitymock/capability_mock_gen.go b/pkg/capabilities/v2/chain-capabilities/evm/capabilitymock/capability_mock_gen.go index ec9ade1bc2..30d6e88049 100644 --- a/pkg/capabilities/v2/chain-capabilities/evm/capabilitymock/capability_mock_gen.go +++ b/pkg/capabilities/v2/chain-capabilities/evm/capabilitymock/capability_mock_gen.go @@ -51,6 +51,8 @@ type ClientCapability struct { UnregisterLogTracking func(ctx context.Context, input *evm.UnregisterLogTrackingRequest) (*emptypb.Empty, error) LogTrigger func(ctx context.Context, input *evm1.FilterLogTriggerRequest) (*evm.Log, error) + // TODO: https://smartcontract-it.atlassian.net/browse/CAPPL-799 add the default to the call + WriteReport func(ctx context.Context, input *evm1.WriteReportRequest) (*evm1.WriteReportReply, error) } func (cap *ClientCapability) Invoke(ctx context.Context, request *sdkpb.CapabilityRequest) *sdkpb.CapabilityResponse { @@ -276,6 +278,28 @@ func (cap *ClientCapability) Invoke(ctx context.Context, request *sdkpb.Capabili capResp.Response = &sdkpb.CapabilityResponse_Error{Error: err.Error()} } } + case "WriteReport": + input := &evm1.WriteReportRequest{} + if err := request.Payload.UnmarshalTo(input); err != nil { + capResp.Response = &sdkpb.CapabilityResponse_Error{Error: err.Error()} + break + } + + if cap.WriteReport == nil { + capResp.Response = &sdkpb.CapabilityResponse_Error{Error: "no stub provided for WriteReport"} + break + } + resp, err := cap.WriteReport(ctx, input) + if err != nil { + capResp.Response = &sdkpb.CapabilityResponse_Error{Error: err.Error()} + } else { + payload, err := anypb.New(resp) + if err == nil { + capResp.Response = &sdkpb.CapabilityResponse_Payload{Payload: payload} + } else { + capResp.Response = &sdkpb.CapabilityResponse_Error{Error: err.Error()} + } + } default: capResp.Response = &sdkpb.CapabilityResponse_Error{Error: fmt.Sprintf("method %s not found", request.Method)} } diff --git a/pkg/capabilities/v2/chain-capabilities/evm/server/capability_server_gen.go b/pkg/capabilities/v2/chain-capabilities/evm/server/capability_server_gen.go index 6fdc5b6267..014ee6dbfa 100644 --- a/pkg/capabilities/v2/chain-capabilities/evm/server/capability_server_gen.go +++ b/pkg/capabilities/v2/chain-capabilities/evm/server/capability_server_gen.go @@ -43,6 +43,8 @@ type ClientCapability interface { RegisterLogTrigger(ctx context.Context, triggerID string, metadata capabilities.RequestMetadata, input *evm1.FilterLogTriggerRequest) (<-chan capabilities.TriggerAndId[*evm.Log], error) UnregisterLogTrigger(ctx context.Context, triggerID string, metadata capabilities.RequestMetadata, input *evm1.FilterLogTriggerRequest) error + WriteReport(ctx context.Context, metadata capabilities.RequestMetadata, input *evm1.WriteReportRequest) (*evm1.WriteReportReply, error) + Start(ctx context.Context) error Close() error HealthReport() map[string]error @@ -226,6 +228,13 @@ func (c *clientCapability) Execute(ctx context.Context, request capabilities.Cap return c.ClientCapability.UnregisterLogTracking(ctx, metadata, input) } return capabilities.Execute(ctx, request, input, config, wrapped) + case "WriteReport": + input := &evm1.WriteReportRequest{} + config := &emptypb.Empty{} + wrapped := func(ctx context.Context, metadata capabilities.RequestMetadata, input *evm1.WriteReportRequest, _ *emptypb.Empty) (*evm1.WriteReportReply, error) { + return c.ClientCapability.WriteReport(ctx, metadata, input) + } + return capabilities.Execute(ctx, request, input, config, wrapped) default: return response, fmt.Errorf("method %s not found", request.Method) } diff --git a/pkg/capabilities/v2/protoc/main.go b/pkg/capabilities/v2/protoc/main.go index 36d582ef98..8f734e272c 100644 --- a/pkg/capabilities/v2/protoc/main.go +++ b/pkg/capabilities/v2/protoc/main.go @@ -7,6 +7,7 @@ import ( "strings" "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/types/pluginpb" "github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/protoc/pkg" ) @@ -18,6 +19,7 @@ func main() { return nil }}.Run(func(plugin *protogen.Plugin) error { goLang := pkg.ServerLangaugeGo + plugin.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL) serverLanguage, err := parseArg(args, "server_language", func(value string) (pkg.ServerLanguage, error) { serverLanguage := pkg.ServerLanguage(strings.ToLower(value)) return serverLanguage, serverLanguage.Validate() diff --git a/pkg/chains/evm/evm.pb.go b/pkg/chains/evm/evm.pb.go index c99a5bb298..8a99f479b6 100644 --- a/pkg/chains/evm/evm.pb.go +++ b/pkg/chains/evm/evm.pb.go @@ -24,6 +24,55 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type TxStatus int32 + +const ( + TxStatus_TX_FATAL TxStatus = 0 + TxStatus_TX_REVERTED TxStatus = 1 + TxStatus_TX_SUCCESS TxStatus = 2 +) + +// Enum value maps for TxStatus. +var ( + TxStatus_name = map[int32]string{ + 0: "TX_FATAL", + 1: "TX_REVERTED", + 2: "TX_SUCCESS", + } + TxStatus_value = map[string]int32{ + "TX_FATAL": 0, + "TX_REVERTED": 1, + "TX_SUCCESS": 2, + } +) + +func (x TxStatus) Enum() *TxStatus { + p := new(TxStatus) + *p = x + return p +} + +func (x TxStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TxStatus) Descriptor() protoreflect.EnumDescriptor { + return file_evm_proto_enumTypes[0].Descriptor() +} + +func (TxStatus) Type() protoreflect.EnumType { + return &file_evm_proto_enumTypes[0] +} + +func (x TxStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TxStatus.Descriptor instead. +func (TxStatus) EnumDescriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{0} +} + // TransactionStatus is an enum for the status of a transaction. // This should always be a 1-1 mapping to: [github.com/smartcontractkit/chainlink-common/pkg/types.TransactionStatus]. type TransactionStatus int32 @@ -68,11 +117,11 @@ func (x TransactionStatus) String() string { } func (TransactionStatus) Descriptor() protoreflect.EnumDescriptor { - return file_evm_proto_enumTypes[0].Descriptor() + return file_evm_proto_enumTypes[1].Descriptor() } func (TransactionStatus) Type() protoreflect.EnumType { - return &file_evm_proto_enumTypes[0] + return &file_evm_proto_enumTypes[1] } func (x TransactionStatus) Number() protoreflect.EnumNumber { @@ -81,7 +130,7 @@ func (x TransactionStatus) Number() protoreflect.EnumNumber { // Deprecated: Use TransactionStatus.Descriptor instead. func (TransactionStatus) EnumDescriptor() ([]byte, []int) { - return file_evm_proto_rawDescGZIP(), []int{0} + return file_evm_proto_rawDescGZIP(), []int{1} } // represents simplified evm-style CallMsg @@ -2158,6 +2207,303 @@ func (x *QueryTrackedLogsReply) GetLogs() []*Log { return nil } +type GasConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + GasLimit uint64 `protobuf:"varint,1,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GasConfig) Reset() { + *x = GasConfig{} + mi := &file_evm_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GasConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GasConfig) ProtoMessage() {} + +func (x *GasConfig) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[35] + 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 GasConfig.ProtoReflect.Descriptor instead. +func (*GasConfig) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{35} +} + +func (x *GasConfig) GetGasLimit() uint64 { + if x != nil { + return x.GasLimit + } + return 0 +} + +type CalculateTransactionFeeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + GasInfo *ReceiptGasInfo `protobuf:"bytes,1,opt,name=gas_info,json=gasInfo,proto3" json:"gas_info,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CalculateTransactionFeeRequest) Reset() { + *x = CalculateTransactionFeeRequest{} + mi := &file_evm_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CalculateTransactionFeeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CalculateTransactionFeeRequest) ProtoMessage() {} + +func (x *CalculateTransactionFeeRequest) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[36] + 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 CalculateTransactionFeeRequest.ProtoReflect.Descriptor instead. +func (*CalculateTransactionFeeRequest) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{36} +} + +func (x *CalculateTransactionFeeRequest) GetGasInfo() *ReceiptGasInfo { + if x != nil { + return x.GasInfo + } + return nil +} + +// represents evm-style receipt +type ReceiptGasInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + GasUsed uint64 `protobuf:"varint,1,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` // gas used by this transaction (in gas units) + EffectiveGasPrice *pb.BigInt `protobuf:"bytes,2,opt,name=effective_gas_price,json=effectiveGasPrice,proto3" json:"effective_gas_price,omitempty"` // actual gas price paid in wei (include after EIP-1559) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReceiptGasInfo) Reset() { + *x = ReceiptGasInfo{} + mi := &file_evm_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReceiptGasInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReceiptGasInfo) ProtoMessage() {} + +func (x *ReceiptGasInfo) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[37] + 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 ReceiptGasInfo.ProtoReflect.Descriptor instead. +func (*ReceiptGasInfo) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{37} +} + +func (x *ReceiptGasInfo) GetGasUsed() uint64 { + if x != nil { + return x.GasUsed + } + return 0 +} + +func (x *ReceiptGasInfo) GetEffectiveGasPrice() *pb.BigInt { + if x != nil { + return x.EffectiveGasPrice + } + return nil +} + +type CalculateTransactionFeeReply struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransactionFee *pb.BigInt `protobuf:"bytes,1,opt,name=transaction_fee,json=transactionFee,proto3" json:"transaction_fee,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CalculateTransactionFeeReply) Reset() { + *x = CalculateTransactionFeeReply{} + mi := &file_evm_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CalculateTransactionFeeReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CalculateTransactionFeeReply) ProtoMessage() {} + +func (x *CalculateTransactionFeeReply) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[38] + 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 CalculateTransactionFeeReply.ProtoReflect.Descriptor instead. +func (*CalculateTransactionFeeReply) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{38} +} + +func (x *CalculateTransactionFeeReply) GetTransactionFee() *pb.BigInt { + if x != nil { + return x.TransactionFee + } + return nil +} + +type SubmitTransactionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + To []byte `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + GasConfig *GasConfig `protobuf:"bytes,3,opt,name=gas_config,json=gasConfig,proto3,oneof" json:"gas_config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SubmitTransactionRequest) Reset() { + *x = SubmitTransactionRequest{} + mi := &file_evm_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubmitTransactionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitTransactionRequest) ProtoMessage() {} + +func (x *SubmitTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[39] + 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 SubmitTransactionRequest.ProtoReflect.Descriptor instead. +func (*SubmitTransactionRequest) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{39} +} + +func (x *SubmitTransactionRequest) GetTo() []byte { + if x != nil { + return x.To + } + return nil +} + +func (x *SubmitTransactionRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *SubmitTransactionRequest) GetGasConfig() *GasConfig { + if x != nil { + return x.GasConfig + } + return nil +} + +type SubmitTransactionReply struct { + state protoimpl.MessageState `protogen:"open.v1"` + TxHash []byte `protobuf:"bytes,1,opt,name=txHash,proto3" json:"txHash,omitempty"` + TxStatus TxStatus `protobuf:"varint,2,opt,name=txStatus,proto3,enum=loop.evm.TxStatus" json:"txStatus,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SubmitTransactionReply) Reset() { + *x = SubmitTransactionReply{} + mi := &file_evm_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubmitTransactionReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitTransactionReply) ProtoMessage() {} + +func (x *SubmitTransactionReply) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[40] + 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 SubmitTransactionReply.ProtoReflect.Descriptor instead. +func (*SubmitTransactionReply) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{40} +} + +func (x *SubmitTransactionReply) GetTxHash() []byte { + if x != nil { + return x.TxHash + } + return nil +} + +func (x *SubmitTransactionReply) GetTxStatus() TxStatus { + if x != nil { + return x.TxStatus + } + return TxStatus_TX_FATAL +} + type GetTransactionStatusRequest struct { state protoimpl.MessageState `protogen:"open.v1"` TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` @@ -2167,7 +2513,7 @@ type GetTransactionStatusRequest struct { func (x *GetTransactionStatusRequest) Reset() { *x = GetTransactionStatusRequest{} - mi := &file_evm_proto_msgTypes[35] + mi := &file_evm_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2179,7 +2525,7 @@ func (x *GetTransactionStatusRequest) String() string { func (*GetTransactionStatusRequest) ProtoMessage() {} func (x *GetTransactionStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_evm_proto_msgTypes[35] + mi := &file_evm_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2192,7 +2538,7 @@ func (x *GetTransactionStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransactionStatusRequest.ProtoReflect.Descriptor instead. func (*GetTransactionStatusRequest) Descriptor() ([]byte, []int) { - return file_evm_proto_rawDescGZIP(), []int{35} + return file_evm_proto_rawDescGZIP(), []int{41} } func (x *GetTransactionStatusRequest) GetTransactionId() string { @@ -2211,7 +2557,7 @@ type GetTransactionStatusReply struct { func (x *GetTransactionStatusReply) Reset() { *x = GetTransactionStatusReply{} - mi := &file_evm_proto_msgTypes[36] + mi := &file_evm_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2223,7 +2569,7 @@ func (x *GetTransactionStatusReply) String() string { func (*GetTransactionStatusReply) ProtoMessage() {} func (x *GetTransactionStatusReply) ProtoReflect() protoreflect.Message { - mi := &file_evm_proto_msgTypes[36] + mi := &file_evm_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2236,7 +2582,7 @@ func (x *GetTransactionStatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransactionStatusReply.ProtoReflect.Descriptor instead. func (*GetTransactionStatusReply) Descriptor() ([]byte, []int) { - return file_evm_proto_rawDescGZIP(), []int{36} + return file_evm_proto_rawDescGZIP(), []int{42} } func (x *GetTransactionStatusReply) GetTransactionStatus() TransactionStatus { @@ -2390,18 +2736,41 @@ const file_evm_proto_rawDesc = "" + "\x0elimit_and_sort\x18\x02 \x01(\v2\x1f.loop.chain.common.LimitAndSortR\flimitAndSort\x12H\n" + "\x10confidence_level\x18\x03 \x01(\x0e2\x1d.loop.chain.common.ConfidenceR\x0fconfidenceLevel\":\n" + "\x15QueryTrackedLogsReply\x12!\n" + - "\x04logs\x18\x01 \x03(\v2\r.loop.evm.LogR\x04logs\"D\n" + + "\x04logs\x18\x01 \x03(\v2\r.loop.evm.LogR\x04logs\"(\n" + + "\tGasConfig\x12\x1b\n" + + "\tgas_limit\x18\x01 \x01(\x04R\bgasLimit\"U\n" + + "\x1eCalculateTransactionFeeRequest\x123\n" + + "\bgas_info\x18\x01 \x01(\v2\x18.loop.evm.ReceiptGasInfoR\agasInfo\"n\n" + + "\x0eReceiptGasInfo\x12\x19\n" + + "\bgas_used\x18\x01 \x01(\x04R\agasUsed\x12A\n" + + "\x13effective_gas_price\x18\x02 \x01(\v2\x11.values.v1.BigIntR\x11effectiveGasPrice\"Z\n" + + "\x1cCalculateTransactionFeeReply\x12:\n" + + "\x0ftransaction_fee\x18\x01 \x01(\v2\x11.values.v1.BigIntR\x0etransactionFee\"\x86\x01\n" + + "\x18SubmitTransactionRequest\x12\x0e\n" + + "\x02to\x18\x01 \x01(\fR\x02to\x12\x12\n" + + "\x04data\x18\x02 \x01(\fR\x04data\x127\n" + + "\n" + + "gas_config\x18\x03 \x01(\v2\x13.loop.evm.GasConfigH\x00R\tgasConfig\x88\x01\x01B\r\n" + + "\v_gas_config\"`\n" + + "\x16SubmitTransactionReply\x12\x16\n" + + "\x06txHash\x18\x01 \x01(\fR\x06txHash\x12.\n" + + "\btxStatus\x18\x02 \x01(\x0e2\x12.loop.evm.TxStatusR\btxStatus\"D\n" + "\x1bGetTransactionStatusRequest\x12%\n" + "\x0etransaction_id\x18\x01 \x01(\tR\rtransactionId\"g\n" + "\x19GetTransactionStatusReply\x12J\n" + - "\x12transaction_status\x18\x01 \x01(\x0e2\x1b.loop.evm.TransactionStatusR\x11transactionStatus*\xd6\x01\n" + + "\x12transaction_status\x18\x01 \x01(\x0e2\x1b.loop.evm.TransactionStatusR\x11transactionStatus*9\n" + + "\bTxStatus\x12\f\n" + + "\bTX_FATAL\x10\x00\x12\x0f\n" + + "\vTX_REVERTED\x10\x01\x12\x0e\n" + + "\n" + + "TX_SUCCESS\x10\x02*\xd6\x01\n" + "\x11TransactionStatus\x12\x1e\n" + "\x1aTRANSACTION_STATUS_UNKNOWN\x10\x00\x12\x1e\n" + "\x1aTRANSACTION_STATUS_PENDING\x10\x01\x12\"\n" + "\x1eTRANSACTION_STATUS_UNCONFIRMED\x10\x02\x12 \n" + "\x1cTRANSACTION_STATUS_FINALIZED\x10\x03\x12\x1d\n" + "\x19TRANSACTION_STATUS_FAILED\x10\x04\x12\x1c\n" + - "\x18TRANSACTION_STATUS_FATAL\x10\x052\x8e\b\n" + + "\x18TRANSACTION_STATUS_FATAL\x10\x052\xd6\t\n" + "\x03EVM\x12[\n" + "\x11GetTransactionFee\x12\".loop.evm.GetTransactionFeeRequest\x1a .loop.evm.GetTransactionFeeReply\"\x00\x12J\n" + "\fCallContract\x12\x1d.loop.evm.CallContractRequest\x1a\x1b.loop.evm.CallContractReply\x12D\n" + @@ -2415,7 +2784,9 @@ const file_evm_proto_rawDesc = "" + "\x10QueryTrackedLogs\x12!.loop.evm.QueryTrackedLogsRequest\x1a\x1f.loop.evm.QueryTrackedLogsReply\x12S\n" + "\x13RegisterLogTracking\x12$.loop.evm.RegisterLogTrackingRequest\x1a\x16.google.protobuf.Empty\x12W\n" + "\x15UnregisterLogTracking\x12&.loop.evm.UnregisterLogTrackingRequest\x1a\x16.google.protobuf.Empty\x12b\n" + - "\x14GetTransactionStatus\x12%.loop.evm.GetTransactionStatusRequest\x1a#.loop.evm.GetTransactionStatusReplyB=Z;github.com/smartcontractkit/chainlink-common/pkg/chains/evmb\x06proto3" + "\x14GetTransactionStatus\x12%.loop.evm.GetTransactionStatusRequest\x1a#.loop.evm.GetTransactionStatusReply\x12Y\n" + + "\x11SubmitTransaction\x12\".loop.evm.SubmitTransactionRequest\x1a .loop.evm.SubmitTransactionReply\x12k\n" + + "\x17CalculateTransactionFee\x12(.loop.evm.CalculateTransactionFeeRequest\x1a&.loop.evm.CalculateTransactionFeeReplyB=Z;github.com/smartcontractkit/chainlink-common/pkg/chains/evmb\x06proto3" var ( file_evm_proto_rawDescOnce sync.Once @@ -2429,125 +2800,141 @@ func file_evm_proto_rawDescGZIP() []byte { return file_evm_proto_rawDescData } -var file_evm_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_evm_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_evm_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_evm_proto_msgTypes = make([]protoimpl.MessageInfo, 43) var file_evm_proto_goTypes = []any{ - (TransactionStatus)(0), // 0: loop.evm.TransactionStatus - (*CallMsg)(nil), // 1: loop.evm.CallMsg - (*Topics)(nil), // 2: loop.evm.Topics - (*Log)(nil), // 3: loop.evm.Log - (*FilterQuery)(nil), // 4: loop.evm.FilterQuery - (*Transaction)(nil), // 5: loop.evm.Transaction - (*Receipt)(nil), // 6: loop.evm.Receipt - (*LPFilter)(nil), // 7: loop.evm.LPFilter - (*Head)(nil), // 8: loop.evm.Head - (*Expression)(nil), // 9: loop.evm.Expression - (*BooleanExpression)(nil), // 10: loop.evm.BooleanExpression - (*And)(nil), // 11: loop.evm.And - (*Or)(nil), // 12: loop.evm.Or - (*HashValueComparator)(nil), // 13: loop.evm.HashValueComparator - (*EventByWord)(nil), // 14: loop.evm.EventByWord - (*EventByTopic)(nil), // 15: loop.evm.EventByTopic - (*Primitive)(nil), // 16: loop.evm.Primitive - (*LatestAndFinalizedHeadReply)(nil), // 17: loop.evm.LatestAndFinalizedHeadReply - (*CallContractRequest)(nil), // 18: loop.evm.CallContractRequest - (*CallContractReply)(nil), // 19: loop.evm.CallContractReply - (*GetTransactionFeeRequest)(nil), // 20: loop.evm.GetTransactionFeeRequest - (*GetTransactionFeeReply)(nil), // 21: loop.evm.GetTransactionFeeReply - (*FilterLogsRequest)(nil), // 22: loop.evm.FilterLogsRequest - (*FilterLogsReply)(nil), // 23: loop.evm.FilterLogsReply - (*BalanceAtRequest)(nil), // 24: loop.evm.BalanceAtRequest - (*BalanceAtReply)(nil), // 25: loop.evm.BalanceAtReply - (*EstimateGasRequest)(nil), // 26: loop.evm.EstimateGasRequest - (*EstimateGasReply)(nil), // 27: loop.evm.EstimateGasReply - (*GetTransactionByHashRequest)(nil), // 28: loop.evm.GetTransactionByHashRequest - (*GetTransactionByHashReply)(nil), // 29: loop.evm.GetTransactionByHashReply - (*GetTransactionReceiptRequest)(nil), // 30: loop.evm.GetTransactionReceiptRequest - (*GetTransactionReceiptReply)(nil), // 31: loop.evm.GetTransactionReceiptReply - (*RegisterLogTrackingRequest)(nil), // 32: loop.evm.RegisterLogTrackingRequest - (*UnregisterLogTrackingRequest)(nil), // 33: loop.evm.UnregisterLogTrackingRequest - (*QueryTrackedLogsRequest)(nil), // 34: loop.evm.QueryTrackedLogsRequest - (*QueryTrackedLogsReply)(nil), // 35: loop.evm.QueryTrackedLogsReply - (*GetTransactionStatusRequest)(nil), // 36: loop.evm.GetTransactionStatusRequest - (*GetTransactionStatusReply)(nil), // 37: loop.evm.GetTransactionStatusReply - (*pb.BigInt)(nil), // 38: values.v1.BigInt - (chain_common.BooleanOperator)(0), // 39: loop.chain.common.BooleanOperator - (chain_common.ComparisonOperator)(0), // 40: loop.chain.common.ComparisonOperator - (*chain_common.Primitive)(nil), // 41: loop.chain.common.Primitive - (*chain_common.LimitAndSort)(nil), // 42: loop.chain.common.LimitAndSort - (chain_common.Confidence)(0), // 43: loop.chain.common.Confidence - (*emptypb.Empty)(nil), // 44: google.protobuf.Empty + (TxStatus)(0), // 0: loop.evm.TxStatus + (TransactionStatus)(0), // 1: loop.evm.TransactionStatus + (*CallMsg)(nil), // 2: loop.evm.CallMsg + (*Topics)(nil), // 3: loop.evm.Topics + (*Log)(nil), // 4: loop.evm.Log + (*FilterQuery)(nil), // 5: loop.evm.FilterQuery + (*Transaction)(nil), // 6: loop.evm.Transaction + (*Receipt)(nil), // 7: loop.evm.Receipt + (*LPFilter)(nil), // 8: loop.evm.LPFilter + (*Head)(nil), // 9: loop.evm.Head + (*Expression)(nil), // 10: loop.evm.Expression + (*BooleanExpression)(nil), // 11: loop.evm.BooleanExpression + (*And)(nil), // 12: loop.evm.And + (*Or)(nil), // 13: loop.evm.Or + (*HashValueComparator)(nil), // 14: loop.evm.HashValueComparator + (*EventByWord)(nil), // 15: loop.evm.EventByWord + (*EventByTopic)(nil), // 16: loop.evm.EventByTopic + (*Primitive)(nil), // 17: loop.evm.Primitive + (*LatestAndFinalizedHeadReply)(nil), // 18: loop.evm.LatestAndFinalizedHeadReply + (*CallContractRequest)(nil), // 19: loop.evm.CallContractRequest + (*CallContractReply)(nil), // 20: loop.evm.CallContractReply + (*GetTransactionFeeRequest)(nil), // 21: loop.evm.GetTransactionFeeRequest + (*GetTransactionFeeReply)(nil), // 22: loop.evm.GetTransactionFeeReply + (*FilterLogsRequest)(nil), // 23: loop.evm.FilterLogsRequest + (*FilterLogsReply)(nil), // 24: loop.evm.FilterLogsReply + (*BalanceAtRequest)(nil), // 25: loop.evm.BalanceAtRequest + (*BalanceAtReply)(nil), // 26: loop.evm.BalanceAtReply + (*EstimateGasRequest)(nil), // 27: loop.evm.EstimateGasRequest + (*EstimateGasReply)(nil), // 28: loop.evm.EstimateGasReply + (*GetTransactionByHashRequest)(nil), // 29: loop.evm.GetTransactionByHashRequest + (*GetTransactionByHashReply)(nil), // 30: loop.evm.GetTransactionByHashReply + (*GetTransactionReceiptRequest)(nil), // 31: loop.evm.GetTransactionReceiptRequest + (*GetTransactionReceiptReply)(nil), // 32: loop.evm.GetTransactionReceiptReply + (*RegisterLogTrackingRequest)(nil), // 33: loop.evm.RegisterLogTrackingRequest + (*UnregisterLogTrackingRequest)(nil), // 34: loop.evm.UnregisterLogTrackingRequest + (*QueryTrackedLogsRequest)(nil), // 35: loop.evm.QueryTrackedLogsRequest + (*QueryTrackedLogsReply)(nil), // 36: loop.evm.QueryTrackedLogsReply + (*GasConfig)(nil), // 37: loop.evm.GasConfig + (*CalculateTransactionFeeRequest)(nil), // 38: loop.evm.CalculateTransactionFeeRequest + (*ReceiptGasInfo)(nil), // 39: loop.evm.ReceiptGasInfo + (*CalculateTransactionFeeReply)(nil), // 40: loop.evm.CalculateTransactionFeeReply + (*SubmitTransactionRequest)(nil), // 41: loop.evm.SubmitTransactionRequest + (*SubmitTransactionReply)(nil), // 42: loop.evm.SubmitTransactionReply + (*GetTransactionStatusRequest)(nil), // 43: loop.evm.GetTransactionStatusRequest + (*GetTransactionStatusReply)(nil), // 44: loop.evm.GetTransactionStatusReply + (*pb.BigInt)(nil), // 45: values.v1.BigInt + (chain_common.BooleanOperator)(0), // 46: loop.chain.common.BooleanOperator + (chain_common.ComparisonOperator)(0), // 47: loop.chain.common.ComparisonOperator + (*chain_common.Primitive)(nil), // 48: loop.chain.common.Primitive + (*chain_common.LimitAndSort)(nil), // 49: loop.chain.common.LimitAndSort + (chain_common.Confidence)(0), // 50: loop.chain.common.Confidence + (*emptypb.Empty)(nil), // 51: google.protobuf.Empty } var file_evm_proto_depIdxs = []int32{ - 38, // 0: loop.evm.Log.block_number:type_name -> values.v1.BigInt - 38, // 1: loop.evm.FilterQuery.fromBlock:type_name -> values.v1.BigInt - 38, // 2: loop.evm.FilterQuery.toBlock:type_name -> values.v1.BigInt - 2, // 3: loop.evm.FilterQuery.topics:type_name -> loop.evm.Topics - 38, // 4: loop.evm.Transaction.value:type_name -> values.v1.BigInt - 38, // 5: loop.evm.Transaction.gas_price:type_name -> values.v1.BigInt - 3, // 6: loop.evm.Receipt.logs:type_name -> loop.evm.Log - 38, // 7: loop.evm.Receipt.effective_gas_price:type_name -> values.v1.BigInt - 38, // 8: loop.evm.Receipt.block_number:type_name -> values.v1.BigInt - 38, // 9: loop.evm.Head.block_number:type_name -> values.v1.BigInt - 16, // 10: loop.evm.Expression.primitive:type_name -> loop.evm.Primitive - 10, // 11: loop.evm.Expression.boolean_expression:type_name -> loop.evm.BooleanExpression - 39, // 12: loop.evm.BooleanExpression.boolean_operator:type_name -> loop.chain.common.BooleanOperator - 9, // 13: loop.evm.BooleanExpression.expression:type_name -> loop.evm.Expression - 9, // 14: loop.evm.And.expr:type_name -> loop.evm.Expression - 9, // 15: loop.evm.Or.expr:type_name -> loop.evm.Expression - 40, // 16: loop.evm.HashValueComparator.operator:type_name -> loop.chain.common.ComparisonOperator - 13, // 17: loop.evm.EventByWord.hashed_value_comparers:type_name -> loop.evm.HashValueComparator - 13, // 18: loop.evm.EventByTopic.hashed_value_comparers:type_name -> loop.evm.HashValueComparator - 41, // 19: loop.evm.Primitive.general_primitive:type_name -> loop.chain.common.Primitive - 14, // 20: loop.evm.Primitive.event_by_word:type_name -> loop.evm.EventByWord - 15, // 21: loop.evm.Primitive.event_by_topic:type_name -> loop.evm.EventByTopic - 8, // 22: loop.evm.LatestAndFinalizedHeadReply.latest:type_name -> loop.evm.Head - 8, // 23: loop.evm.LatestAndFinalizedHeadReply.finalized:type_name -> loop.evm.Head - 1, // 24: loop.evm.CallContractRequest.call:type_name -> loop.evm.CallMsg - 38, // 25: loop.evm.CallContractRequest.block_number:type_name -> values.v1.BigInt - 38, // 26: loop.evm.GetTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt - 4, // 27: loop.evm.FilterLogsRequest.filter_query:type_name -> loop.evm.FilterQuery - 3, // 28: loop.evm.FilterLogsReply.logs:type_name -> loop.evm.Log - 38, // 29: loop.evm.BalanceAtRequest.block_number:type_name -> values.v1.BigInt - 38, // 30: loop.evm.BalanceAtReply.balance:type_name -> values.v1.BigInt - 1, // 31: loop.evm.EstimateGasRequest.msg:type_name -> loop.evm.CallMsg - 5, // 32: loop.evm.GetTransactionByHashReply.transaction:type_name -> loop.evm.Transaction - 6, // 33: loop.evm.GetTransactionReceiptReply.receipt:type_name -> loop.evm.Receipt - 7, // 34: loop.evm.RegisterLogTrackingRequest.filter:type_name -> loop.evm.LPFilter - 9, // 35: loop.evm.QueryTrackedLogsRequest.expression:type_name -> loop.evm.Expression - 42, // 36: loop.evm.QueryTrackedLogsRequest.limit_and_sort:type_name -> loop.chain.common.LimitAndSort - 43, // 37: loop.evm.QueryTrackedLogsRequest.confidence_level:type_name -> loop.chain.common.Confidence - 3, // 38: loop.evm.QueryTrackedLogsReply.logs:type_name -> loop.evm.Log - 0, // 39: loop.evm.GetTransactionStatusReply.transaction_status:type_name -> loop.evm.TransactionStatus - 20, // 40: loop.evm.EVM.GetTransactionFee:input_type -> loop.evm.GetTransactionFeeRequest - 18, // 41: loop.evm.EVM.CallContract:input_type -> loop.evm.CallContractRequest - 22, // 42: loop.evm.EVM.FilterLogs:input_type -> loop.evm.FilterLogsRequest - 24, // 43: loop.evm.EVM.BalanceAt:input_type -> loop.evm.BalanceAtRequest - 26, // 44: loop.evm.EVM.EstimateGas:input_type -> loop.evm.EstimateGasRequest - 28, // 45: loop.evm.EVM.GetTransactionByHash:input_type -> loop.evm.GetTransactionByHashRequest - 30, // 46: loop.evm.EVM.GetTransactionReceipt:input_type -> loop.evm.GetTransactionReceiptRequest - 44, // 47: loop.evm.EVM.LatestAndFinalizedHead:input_type -> google.protobuf.Empty - 34, // 48: loop.evm.EVM.QueryTrackedLogs:input_type -> loop.evm.QueryTrackedLogsRequest - 32, // 49: loop.evm.EVM.RegisterLogTracking:input_type -> loop.evm.RegisterLogTrackingRequest - 33, // 50: loop.evm.EVM.UnregisterLogTracking:input_type -> loop.evm.UnregisterLogTrackingRequest - 36, // 51: loop.evm.EVM.GetTransactionStatus:input_type -> loop.evm.GetTransactionStatusRequest - 21, // 52: loop.evm.EVM.GetTransactionFee:output_type -> loop.evm.GetTransactionFeeReply - 19, // 53: loop.evm.EVM.CallContract:output_type -> loop.evm.CallContractReply - 23, // 54: loop.evm.EVM.FilterLogs:output_type -> loop.evm.FilterLogsReply - 25, // 55: loop.evm.EVM.BalanceAt:output_type -> loop.evm.BalanceAtReply - 27, // 56: loop.evm.EVM.EstimateGas:output_type -> loop.evm.EstimateGasReply - 29, // 57: loop.evm.EVM.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply - 31, // 58: loop.evm.EVM.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply - 17, // 59: loop.evm.EVM.LatestAndFinalizedHead:output_type -> loop.evm.LatestAndFinalizedHeadReply - 35, // 60: loop.evm.EVM.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply - 44, // 61: loop.evm.EVM.RegisterLogTracking:output_type -> google.protobuf.Empty - 44, // 62: loop.evm.EVM.UnregisterLogTracking:output_type -> google.protobuf.Empty - 37, // 63: loop.evm.EVM.GetTransactionStatus:output_type -> loop.evm.GetTransactionStatusReply - 52, // [52:64] is the sub-list for method output_type - 40, // [40:52] is the sub-list for method input_type - 40, // [40:40] is the sub-list for extension type_name - 40, // [40:40] is the sub-list for extension extendee - 0, // [0:40] is the sub-list for field type_name + 45, // 0: loop.evm.Log.block_number:type_name -> values.v1.BigInt + 45, // 1: loop.evm.FilterQuery.fromBlock:type_name -> values.v1.BigInt + 45, // 2: loop.evm.FilterQuery.toBlock:type_name -> values.v1.BigInt + 3, // 3: loop.evm.FilterQuery.topics:type_name -> loop.evm.Topics + 45, // 4: loop.evm.Transaction.value:type_name -> values.v1.BigInt + 45, // 5: loop.evm.Transaction.gas_price:type_name -> values.v1.BigInt + 4, // 6: loop.evm.Receipt.logs:type_name -> loop.evm.Log + 45, // 7: loop.evm.Receipt.effective_gas_price:type_name -> values.v1.BigInt + 45, // 8: loop.evm.Receipt.block_number:type_name -> values.v1.BigInt + 45, // 9: loop.evm.Head.block_number:type_name -> values.v1.BigInt + 17, // 10: loop.evm.Expression.primitive:type_name -> loop.evm.Primitive + 11, // 11: loop.evm.Expression.boolean_expression:type_name -> loop.evm.BooleanExpression + 46, // 12: loop.evm.BooleanExpression.boolean_operator:type_name -> loop.chain.common.BooleanOperator + 10, // 13: loop.evm.BooleanExpression.expression:type_name -> loop.evm.Expression + 10, // 14: loop.evm.And.expr:type_name -> loop.evm.Expression + 10, // 15: loop.evm.Or.expr:type_name -> loop.evm.Expression + 47, // 16: loop.evm.HashValueComparator.operator:type_name -> loop.chain.common.ComparisonOperator + 14, // 17: loop.evm.EventByWord.hashed_value_comparers:type_name -> loop.evm.HashValueComparator + 14, // 18: loop.evm.EventByTopic.hashed_value_comparers:type_name -> loop.evm.HashValueComparator + 48, // 19: loop.evm.Primitive.general_primitive:type_name -> loop.chain.common.Primitive + 15, // 20: loop.evm.Primitive.event_by_word:type_name -> loop.evm.EventByWord + 16, // 21: loop.evm.Primitive.event_by_topic:type_name -> loop.evm.EventByTopic + 9, // 22: loop.evm.LatestAndFinalizedHeadReply.latest:type_name -> loop.evm.Head + 9, // 23: loop.evm.LatestAndFinalizedHeadReply.finalized:type_name -> loop.evm.Head + 2, // 24: loop.evm.CallContractRequest.call:type_name -> loop.evm.CallMsg + 45, // 25: loop.evm.CallContractRequest.block_number:type_name -> values.v1.BigInt + 45, // 26: loop.evm.GetTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt + 5, // 27: loop.evm.FilterLogsRequest.filter_query:type_name -> loop.evm.FilterQuery + 4, // 28: loop.evm.FilterLogsReply.logs:type_name -> loop.evm.Log + 45, // 29: loop.evm.BalanceAtRequest.block_number:type_name -> values.v1.BigInt + 45, // 30: loop.evm.BalanceAtReply.balance:type_name -> values.v1.BigInt + 2, // 31: loop.evm.EstimateGasRequest.msg:type_name -> loop.evm.CallMsg + 6, // 32: loop.evm.GetTransactionByHashReply.transaction:type_name -> loop.evm.Transaction + 7, // 33: loop.evm.GetTransactionReceiptReply.receipt:type_name -> loop.evm.Receipt + 8, // 34: loop.evm.RegisterLogTrackingRequest.filter:type_name -> loop.evm.LPFilter + 10, // 35: loop.evm.QueryTrackedLogsRequest.expression:type_name -> loop.evm.Expression + 49, // 36: loop.evm.QueryTrackedLogsRequest.limit_and_sort:type_name -> loop.chain.common.LimitAndSort + 50, // 37: loop.evm.QueryTrackedLogsRequest.confidence_level:type_name -> loop.chain.common.Confidence + 4, // 38: loop.evm.QueryTrackedLogsReply.logs:type_name -> loop.evm.Log + 39, // 39: loop.evm.CalculateTransactionFeeRequest.gas_info:type_name -> loop.evm.ReceiptGasInfo + 45, // 40: loop.evm.ReceiptGasInfo.effective_gas_price:type_name -> values.v1.BigInt + 45, // 41: loop.evm.CalculateTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt + 37, // 42: loop.evm.SubmitTransactionRequest.gas_config:type_name -> loop.evm.GasConfig + 0, // 43: loop.evm.SubmitTransactionReply.txStatus:type_name -> loop.evm.TxStatus + 1, // 44: loop.evm.GetTransactionStatusReply.transaction_status:type_name -> loop.evm.TransactionStatus + 21, // 45: loop.evm.EVM.GetTransactionFee:input_type -> loop.evm.GetTransactionFeeRequest + 19, // 46: loop.evm.EVM.CallContract:input_type -> loop.evm.CallContractRequest + 23, // 47: loop.evm.EVM.FilterLogs:input_type -> loop.evm.FilterLogsRequest + 25, // 48: loop.evm.EVM.BalanceAt:input_type -> loop.evm.BalanceAtRequest + 27, // 49: loop.evm.EVM.EstimateGas:input_type -> loop.evm.EstimateGasRequest + 29, // 50: loop.evm.EVM.GetTransactionByHash:input_type -> loop.evm.GetTransactionByHashRequest + 31, // 51: loop.evm.EVM.GetTransactionReceipt:input_type -> loop.evm.GetTransactionReceiptRequest + 51, // 52: loop.evm.EVM.LatestAndFinalizedHead:input_type -> google.protobuf.Empty + 35, // 53: loop.evm.EVM.QueryTrackedLogs:input_type -> loop.evm.QueryTrackedLogsRequest + 33, // 54: loop.evm.EVM.RegisterLogTracking:input_type -> loop.evm.RegisterLogTrackingRequest + 34, // 55: loop.evm.EVM.UnregisterLogTracking:input_type -> loop.evm.UnregisterLogTrackingRequest + 43, // 56: loop.evm.EVM.GetTransactionStatus:input_type -> loop.evm.GetTransactionStatusRequest + 41, // 57: loop.evm.EVM.SubmitTransaction:input_type -> loop.evm.SubmitTransactionRequest + 38, // 58: loop.evm.EVM.CalculateTransactionFee:input_type -> loop.evm.CalculateTransactionFeeRequest + 22, // 59: loop.evm.EVM.GetTransactionFee:output_type -> loop.evm.GetTransactionFeeReply + 20, // 60: loop.evm.EVM.CallContract:output_type -> loop.evm.CallContractReply + 24, // 61: loop.evm.EVM.FilterLogs:output_type -> loop.evm.FilterLogsReply + 26, // 62: loop.evm.EVM.BalanceAt:output_type -> loop.evm.BalanceAtReply + 28, // 63: loop.evm.EVM.EstimateGas:output_type -> loop.evm.EstimateGasReply + 30, // 64: loop.evm.EVM.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply + 32, // 65: loop.evm.EVM.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply + 18, // 66: loop.evm.EVM.LatestAndFinalizedHead:output_type -> loop.evm.LatestAndFinalizedHeadReply + 36, // 67: loop.evm.EVM.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply + 51, // 68: loop.evm.EVM.RegisterLogTracking:output_type -> google.protobuf.Empty + 51, // 69: loop.evm.EVM.UnregisterLogTracking:output_type -> google.protobuf.Empty + 44, // 70: loop.evm.EVM.GetTransactionStatus:output_type -> loop.evm.GetTransactionStatusReply + 42, // 71: loop.evm.EVM.SubmitTransaction:output_type -> loop.evm.SubmitTransactionReply + 40, // 72: loop.evm.EVM.CalculateTransactionFee:output_type -> loop.evm.CalculateTransactionFeeReply + 59, // [59:73] is the sub-list for method output_type + 45, // [45:59] is the sub-list for method input_type + 45, // [45:45] is the sub-list for extension type_name + 45, // [45:45] is the sub-list for extension extendee + 0, // [0:45] is the sub-list for field type_name } func init() { file_evm_proto_init() } @@ -2566,13 +2953,14 @@ func file_evm_proto_init() { (*Primitive_EventByWord)(nil), (*Primitive_EventByTopic)(nil), } + file_evm_proto_msgTypes[39].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_evm_proto_rawDesc), len(file_evm_proto_rawDesc)), - NumEnums: 1, - NumMessages: 37, + NumEnums: 2, + NumMessages: 43, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/chains/evm/evm.proto b/pkg/chains/evm/evm.proto index d15b513fd3..ff51ce3c34 100644 --- a/pkg/chains/evm/evm.proto +++ b/pkg/chains/evm/evm.proto @@ -20,6 +20,8 @@ service EVM{ rpc RegisterLogTracking(RegisterLogTrackingRequest) returns (google.protobuf.Empty); rpc UnregisterLogTracking(UnregisterLogTrackingRequest) returns (google.protobuf.Empty); rpc GetTransactionStatus(GetTransactionStatusRequest) returns (GetTransactionStatusReply); + rpc SubmitTransaction(SubmitTransactionRequest) returns (SubmitTransactionReply); + rpc CalculateTransactionFee(CalculateTransactionFeeRequest) returns (CalculateTransactionFeeReply); } // represents simplified evm-style CallMsg @@ -238,12 +240,40 @@ message QueryTrackedLogsReply { repeated Log logs = 1; } -message GetTransactionStatusRequest { - string transaction_id = 1; +enum TxStatus { + TX_FATAL = 0; + TX_REVERTED = 1; + TX_SUCCESS = 2; } -message GetTransactionStatusReply { - TransactionStatus transaction_status = 1; +message GasConfig { + uint64 gas_limit = 1; +} + +message CalculateTransactionFeeRequest { + ReceiptGasInfo gas_info = 1; +} + +// represents evm-style receipt +message ReceiptGasInfo { + uint64 gas_used = 1; // gas used by this transaction (in gas units) + values.v1.BigInt effective_gas_price = 2; // actual gas price paid in wei (include after EIP-1559) +} + + +message CalculateTransactionFeeReply { + values.v1.BigInt transaction_fee = 1; +} + +message SubmitTransactionRequest { + bytes to = 1; + bytes data = 2; + optional GasConfig gas_config = 3; +} + +message SubmitTransactionReply { + bytes txHash = 1; + TxStatus txStatus = 2; } // TransactionStatus is an enum for the status of a transaction. @@ -256,3 +286,13 @@ enum TransactionStatus { TRANSACTION_STATUS_FAILED = 4; TRANSACTION_STATUS_FATAL = 5; } + +message GetTransactionStatusRequest { + string transaction_id = 1; +} + +message GetTransactionStatusReply { + TransactionStatus transaction_status = 1; +} + + diff --git a/pkg/chains/evm/evm_grpc.pb.go b/pkg/chains/evm/evm_grpc.pb.go index 2c66a36b69..6984209111 100644 --- a/pkg/chains/evm/evm_grpc.pb.go +++ b/pkg/chains/evm/evm_grpc.pb.go @@ -20,18 +20,20 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - EVM_GetTransactionFee_FullMethodName = "/loop.evm.EVM/GetTransactionFee" - EVM_CallContract_FullMethodName = "/loop.evm.EVM/CallContract" - EVM_FilterLogs_FullMethodName = "/loop.evm.EVM/FilterLogs" - EVM_BalanceAt_FullMethodName = "/loop.evm.EVM/BalanceAt" - EVM_EstimateGas_FullMethodName = "/loop.evm.EVM/EstimateGas" - EVM_GetTransactionByHash_FullMethodName = "/loop.evm.EVM/GetTransactionByHash" - EVM_GetTransactionReceipt_FullMethodName = "/loop.evm.EVM/GetTransactionReceipt" - EVM_LatestAndFinalizedHead_FullMethodName = "/loop.evm.EVM/LatestAndFinalizedHead" - EVM_QueryTrackedLogs_FullMethodName = "/loop.evm.EVM/QueryTrackedLogs" - EVM_RegisterLogTracking_FullMethodName = "/loop.evm.EVM/RegisterLogTracking" - EVM_UnregisterLogTracking_FullMethodName = "/loop.evm.EVM/UnregisterLogTracking" - EVM_GetTransactionStatus_FullMethodName = "/loop.evm.EVM/GetTransactionStatus" + EVM_GetTransactionFee_FullMethodName = "/loop.evm.EVM/GetTransactionFee" + EVM_CallContract_FullMethodName = "/loop.evm.EVM/CallContract" + EVM_FilterLogs_FullMethodName = "/loop.evm.EVM/FilterLogs" + EVM_BalanceAt_FullMethodName = "/loop.evm.EVM/BalanceAt" + EVM_EstimateGas_FullMethodName = "/loop.evm.EVM/EstimateGas" + EVM_GetTransactionByHash_FullMethodName = "/loop.evm.EVM/GetTransactionByHash" + EVM_GetTransactionReceipt_FullMethodName = "/loop.evm.EVM/GetTransactionReceipt" + EVM_LatestAndFinalizedHead_FullMethodName = "/loop.evm.EVM/LatestAndFinalizedHead" + EVM_QueryTrackedLogs_FullMethodName = "/loop.evm.EVM/QueryTrackedLogs" + EVM_RegisterLogTracking_FullMethodName = "/loop.evm.EVM/RegisterLogTracking" + EVM_UnregisterLogTracking_FullMethodName = "/loop.evm.EVM/UnregisterLogTracking" + EVM_GetTransactionStatus_FullMethodName = "/loop.evm.EVM/GetTransactionStatus" + EVM_SubmitTransaction_FullMethodName = "/loop.evm.EVM/SubmitTransaction" + EVM_CalculateTransactionFee_FullMethodName = "/loop.evm.EVM/CalculateTransactionFee" ) // EVMClient is the client API for EVM service. @@ -50,6 +52,8 @@ type EVMClient interface { RegisterLogTracking(ctx context.Context, in *RegisterLogTrackingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) UnregisterLogTracking(ctx context.Context, in *UnregisterLogTrackingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) GetTransactionStatus(ctx context.Context, in *GetTransactionStatusRequest, opts ...grpc.CallOption) (*GetTransactionStatusReply, error) + SubmitTransaction(ctx context.Context, in *SubmitTransactionRequest, opts ...grpc.CallOption) (*SubmitTransactionReply, error) + CalculateTransactionFee(ctx context.Context, in *CalculateTransactionFeeRequest, opts ...grpc.CallOption) (*CalculateTransactionFeeReply, error) } type eVMClient struct { @@ -180,6 +184,26 @@ func (c *eVMClient) GetTransactionStatus(ctx context.Context, in *GetTransaction return out, nil } +func (c *eVMClient) SubmitTransaction(ctx context.Context, in *SubmitTransactionRequest, opts ...grpc.CallOption) (*SubmitTransactionReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SubmitTransactionReply) + err := c.cc.Invoke(ctx, EVM_SubmitTransaction_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eVMClient) CalculateTransactionFee(ctx context.Context, in *CalculateTransactionFeeRequest, opts ...grpc.CallOption) (*CalculateTransactionFeeReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CalculateTransactionFeeReply) + err := c.cc.Invoke(ctx, EVM_CalculateTransactionFee_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // EVMServer is the server API for EVM service. // All implementations must embed UnimplementedEVMServer // for forward compatibility. @@ -196,6 +220,8 @@ type EVMServer interface { RegisterLogTracking(context.Context, *RegisterLogTrackingRequest) (*emptypb.Empty, error) UnregisterLogTracking(context.Context, *UnregisterLogTrackingRequest) (*emptypb.Empty, error) GetTransactionStatus(context.Context, *GetTransactionStatusRequest) (*GetTransactionStatusReply, error) + SubmitTransaction(context.Context, *SubmitTransactionRequest) (*SubmitTransactionReply, error) + CalculateTransactionFee(context.Context, *CalculateTransactionFeeRequest) (*CalculateTransactionFeeReply, error) mustEmbedUnimplementedEVMServer() } @@ -242,6 +268,12 @@ func (UnimplementedEVMServer) UnregisterLogTracking(context.Context, *Unregister func (UnimplementedEVMServer) GetTransactionStatus(context.Context, *GetTransactionStatusRequest) (*GetTransactionStatusReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTransactionStatus not implemented") } +func (UnimplementedEVMServer) SubmitTransaction(context.Context, *SubmitTransactionRequest) (*SubmitTransactionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubmitTransaction not implemented") +} +func (UnimplementedEVMServer) CalculateTransactionFee(context.Context, *CalculateTransactionFeeRequest) (*CalculateTransactionFeeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CalculateTransactionFee not implemented") +} func (UnimplementedEVMServer) mustEmbedUnimplementedEVMServer() {} func (UnimplementedEVMServer) testEmbeddedByValue() {} @@ -479,6 +511,42 @@ func _EVM_GetTransactionStatus_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _EVM_SubmitTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SubmitTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EVMServer).SubmitTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EVM_SubmitTransaction_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EVMServer).SubmitTransaction(ctx, req.(*SubmitTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _EVM_CalculateTransactionFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CalculateTransactionFeeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EVMServer).CalculateTransactionFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EVM_CalculateTransactionFee_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EVMServer).CalculateTransactionFee(ctx, req.(*CalculateTransactionFeeRequest)) + } + return interceptor(ctx, in, info, handler) +} + // EVM_ServiceDesc is the grpc.ServiceDesc for EVM service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -534,6 +602,14 @@ var EVM_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetTransactionStatus", Handler: _EVM_GetTransactionStatus_Handler, }, + { + MethodName: "SubmitTransaction", + Handler: _EVM_SubmitTransaction_Handler, + }, + { + MethodName: "CalculateTransactionFee", + Handler: _EVM_CalculateTransactionFee_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "evm.proto", diff --git a/pkg/chains/evm/proto_helpers.go b/pkg/chains/evm/proto_helpers.go index 8b19fb2fb8..00bc0d5c6a 100644 --- a/pkg/chains/evm/proto_helpers.go +++ b/pkg/chains/evm/proto_helpers.go @@ -492,3 +492,51 @@ func putGeneralPrimitive(exp *Expression, p *chaincommonpb.Primitive) { func putEVMPrimitive(exp *Expression, p *Primitive) { exp.Evaluator = &Expression_Primitive{Primitive: &Primitive{Primitive: p.Primitive}} } + +func ConvertGasConfigToProto(gasConfig *evmtypes.GasConfig) *GasConfig { + if gasConfig == nil { + return nil + } + return &GasConfig{ + GasLimit: *gasConfig.GasLimit, + } +} + +func ConvertGasConfigFromProto(gasConfig *GasConfig) *evmtypes.GasConfig { + if gasConfig == nil { + return nil + } + return &evmtypes.GasConfig{ + GasLimit: &gasConfig.GasLimit, + } +} + +func ConvertTxStatusFromProto(txStatus TxStatus) evmtypes.TransactionStatus { + switch txStatus { + case TxStatus_TX_SUCCESS: + return evmtypes.TxSuccess + case TxStatus_TX_REVERTED: + return evmtypes.TxReverted + default: + return evmtypes.TxFatal + } +} + +func ConvertTxStatusToProto(txStatus evmtypes.TransactionStatus) TxStatus { + switch txStatus { + case evmtypes.TxSuccess: + return TxStatus_TX_SUCCESS + case evmtypes.TxReverted: + return TxStatus_TX_REVERTED + default: + return TxStatus_TX_FATAL + } +} + +func ConvertSubmitTransactionRequestFromProto(txRequest *SubmitTransactionRequest) evmtypes.SubmitTransactionRequest { + return evmtypes.SubmitTransactionRequest{ + To: evmtypes.Address(txRequest.To), + Data: evmtypes.ABIPayload(txRequest.Data), + GasConfig: ConvertGasConfigFromProto(txRequest.GasConfig), + } +} diff --git a/pkg/loop/internal/pb/relayerset/relayerset.pb.go b/pkg/loop/internal/pb/relayerset/relayerset.pb.go index 82c3917048..96dbd8b91d 100644 --- a/pkg/loop/internal/pb/relayerset/relayerset.pb.go +++ b/pkg/loop/internal/pb/relayerset/relayerset.pb.go @@ -1902,6 +1902,110 @@ func (x *GetTransactionStatusRequest) GetRequest() *evm.GetTransactionStatusRequ return nil } +type SubmitTransactionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RelayerId *RelayerId `protobuf:"bytes,1,opt,name=relayerId,proto3" json:"relayerId,omitempty"` + Request *evm.SubmitTransactionRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SubmitTransactionRequest) Reset() { + *x = SubmitTransactionRequest{} + mi := &file_relayerset_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubmitTransactionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitTransactionRequest) ProtoMessage() {} + +func (x *SubmitTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_relayerset_proto_msgTypes[37] + 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 SubmitTransactionRequest.ProtoReflect.Descriptor instead. +func (*SubmitTransactionRequest) Descriptor() ([]byte, []int) { + return file_relayerset_proto_rawDescGZIP(), []int{37} +} + +func (x *SubmitTransactionRequest) GetRelayerId() *RelayerId { + if x != nil { + return x.RelayerId + } + return nil +} + +func (x *SubmitTransactionRequest) GetRequest() *evm.SubmitTransactionRequest { + if x != nil { + return x.Request + } + return nil +} + +type CalculateTransactionFeeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RelayerId *RelayerId `protobuf:"bytes,1,opt,name=relayerId,proto3" json:"relayerId,omitempty"` + Request *evm.CalculateTransactionFeeRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CalculateTransactionFeeRequest) Reset() { + *x = CalculateTransactionFeeRequest{} + mi := &file_relayerset_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CalculateTransactionFeeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CalculateTransactionFeeRequest) ProtoMessage() {} + +func (x *CalculateTransactionFeeRequest) ProtoReflect() protoreflect.Message { + mi := &file_relayerset_proto_msgTypes[38] + 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 CalculateTransactionFeeRequest.ProtoReflect.Descriptor instead. +func (*CalculateTransactionFeeRequest) Descriptor() ([]byte, []int) { + return file_relayerset_proto_rawDescGZIP(), []int{38} +} + +func (x *CalculateTransactionFeeRequest) GetRelayerId() *RelayerId { + if x != nil { + return x.RelayerId + } + return nil +} + +func (x *CalculateTransactionFeeRequest) GetRequest() *evm.CalculateTransactionFeeRequest { + if x != nil { + return x.Request + } + return nil +} + var File_relayerset_proto protoreflect.FileDescriptor const file_relayerset_proto_rawDesc = "" + @@ -2020,7 +2124,13 @@ const file_relayerset_proto_rawDesc = "" + "\arequest\x18\x02 \x01(\v2&.loop.evm.UnregisterLogTrackingRequestR\arequest\"\x98\x01\n" + "\x1bGetTransactionStatusRequest\x128\n" + "\trelayerId\x18\x01 \x01(\v2\x1a.loop.relayerset.RelayerIdR\trelayerId\x12?\n" + - "\arequest\x18\x02 \x01(\v2%.loop.evm.GetTransactionStatusRequestR\arequest2\xaf\x0f\n" + + "\arequest\x18\x02 \x01(\v2%.loop.evm.GetTransactionStatusRequestR\arequest\"\x92\x01\n" + + "\x18SubmitTransactionRequest\x128\n" + + "\trelayerId\x18\x01 \x01(\v2\x1a.loop.relayerset.RelayerIdR\trelayerId\x12<\n" + + "\arequest\x18\x02 \x01(\v2\".loop.evm.SubmitTransactionRequestR\arequest\"\x9e\x01\n" + + "\x1eCalculateTransactionFeeRequest\x128\n" + + "\trelayerId\x18\x01 \x01(\v2\x1a.loop.relayerset.RelayerIdR\trelayerId\x12B\n" + + "\arequest\x18\x02 \x01(\v2(.loop.evm.CalculateTransactionFeeRequestR\arequest2\xaf\x0f\n" + "\n" + "RelayerSet\x12P\n" + "\x03Get\x12\".loop.relayerset.GetRelayerRequest\x1a#.loop.relayerset.GetRelayerResponse\"\x00\x12[\n" + @@ -2042,7 +2152,8 @@ const file_relayerset_proto_rawDesc = "" + "\x12ContractReaderBind\x12*.loop.relayerset.ContractReaderBindRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n" + "\x14ContractReaderUnbind\x12,.loop.relayerset.ContractReaderUnbindRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\\\n" + "\x13ContractReaderStart\x12+.loop.relayerset.ContractReaderStartRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\\\n" + - "\x13ContractReaderClose\x12+.loop.relayerset.ContractReaderCloseRequest\x1a\x16.google.protobuf.Empty\"\x002\xf1\b\n" + + "\x13ContractReaderClose\x12+.loop.relayerset.ContractReaderCloseRequest\x1a\x16.google.protobuf.Empty\"\x002\xc7\n" + + "\n" + "\rEVMRelayerSet\x12b\n" + "\x11GetTransactionFee\x12).loop.relayerset.GetTransactionFeeRequest\x1a .loop.evm.GetTransactionFeeReply\"\x00\x12Q\n" + "\fCallContract\x12$.loop.relayerset.CallContractRequest\x1a\x1b.loop.evm.CallContractReply\x12K\n" + @@ -2056,7 +2167,9 @@ const file_relayerset_proto_rawDesc = "" + "\x10QueryTrackedLogs\x12(.loop.relayerset.QueryTrackedLogsRequest\x1a\x1f.loop.evm.QueryTrackedLogsReply\x12Z\n" + "\x13RegisterLogTracking\x12+.loop.relayerset.RegisterLogTrackingRequest\x1a\x16.google.protobuf.Empty\x12^\n" + "\x15UnregisterLogTracking\x12-.loop.relayerset.UnregisterLogTrackingRequest\x1a\x16.google.protobuf.Empty\x12i\n" + - "\x14GetTransactionStatus\x12,.loop.relayerset.GetTransactionStatusRequest\x1a#.loop.evm.GetTransactionStatusReplyBNZLgithub.com/smartcontractkit/chainlink-common/pkg/loop/internal/pb/relayersetb\x06proto3" + "\x14GetTransactionStatus\x12,.loop.relayerset.GetTransactionStatusRequest\x1a#.loop.evm.GetTransactionStatusReply\x12`\n" + + "\x11SubmitTransaction\x12).loop.relayerset.SubmitTransactionRequest\x1a .loop.evm.SubmitTransactionReply\x12r\n" + + "\x17CalculateTransactionFee\x12/.loop.relayerset.CalculateTransactionFeeRequest\x1a&.loop.evm.CalculateTransactionFeeReplyBNZLgithub.com/smartcontractkit/chainlink-common/pkg/loop/internal/pb/relayersetb\x06proto3" var ( file_relayerset_proto_rawDescOnce sync.Once @@ -2070,7 +2183,7 @@ func file_relayerset_proto_rawDescGZIP() []byte { return file_relayerset_proto_rawDescData } -var file_relayerset_proto_msgTypes = make([]protoimpl.MessageInfo, 38) +var file_relayerset_proto_msgTypes = make([]protoimpl.MessageInfo, 40) var file_relayerset_proto_goTypes = []any{ (*RelayerId)(nil), // 0: loop.relayerset.RelayerId (*GetRelayerRequest)(nil), // 1: loop.relayerset.GetRelayerRequest @@ -2109,40 +2222,46 @@ var file_relayerset_proto_goTypes = []any{ (*RegisterLogTrackingRequest)(nil), // 34: loop.relayerset.RegisterLogTrackingRequest (*UnregisterLogTrackingRequest)(nil), // 35: loop.relayerset.UnregisterLogTrackingRequest (*GetTransactionStatusRequest)(nil), // 36: loop.relayerset.GetTransactionStatusRequest - nil, // 37: loop.relayerset.RelayerHealthReportResponse.ReportEntry - (*pb.GetLatestValueRequest)(nil), // 38: loop.GetLatestValueRequest - (*pb.BatchGetLatestValuesRequest)(nil), // 39: loop.BatchGetLatestValuesRequest - (*pb.QueryKeyRequest)(nil), // 40: loop.QueryKeyRequest - (*pb.QueryKeysRequest)(nil), // 41: loop.QueryKeysRequest - (*pb.BindRequest)(nil), // 42: loop.BindRequest - (*pb.UnbindRequest)(nil), // 43: loop.UnbindRequest - (*evm.GetTransactionFeeRequest)(nil), // 44: loop.evm.GetTransactionFeeRequest - (*evm.CallContractRequest)(nil), // 45: loop.evm.CallContractRequest - (*evm.FilterLogsRequest)(nil), // 46: loop.evm.FilterLogsRequest - (*evm.BalanceAtRequest)(nil), // 47: loop.evm.BalanceAtRequest - (*evm.EstimateGasRequest)(nil), // 48: loop.evm.EstimateGasRequest - (*evm.GetTransactionByHashRequest)(nil), // 49: loop.evm.GetTransactionByHashRequest - (*evm.GetTransactionReceiptRequest)(nil), // 50: loop.evm.GetTransactionReceiptRequest - (*evm.QueryTrackedLogsRequest)(nil), // 51: loop.evm.QueryTrackedLogsRequest - (*evm.RegisterLogTrackingRequest)(nil), // 52: loop.evm.RegisterLogTrackingRequest - (*evm.UnregisterLogTrackingRequest)(nil), // 53: loop.evm.UnregisterLogTrackingRequest - (*evm.GetTransactionStatusRequest)(nil), // 54: loop.evm.GetTransactionStatusRequest - (*emptypb.Empty)(nil), // 55: google.protobuf.Empty - (*pb.GetLatestValueReply)(nil), // 56: loop.GetLatestValueReply - (*pb.GetLatestValueWithHeadDataReply)(nil), // 57: loop.GetLatestValueWithHeadDataReply - (*pb.BatchGetLatestValuesReply)(nil), // 58: loop.BatchGetLatestValuesReply - (*pb.QueryKeyReply)(nil), // 59: loop.QueryKeyReply - (*pb.QueryKeysReply)(nil), // 60: loop.QueryKeysReply - (*evm.GetTransactionFeeReply)(nil), // 61: loop.evm.GetTransactionFeeReply - (*evm.CallContractReply)(nil), // 62: loop.evm.CallContractReply - (*evm.FilterLogsReply)(nil), // 63: loop.evm.FilterLogsReply - (*evm.BalanceAtReply)(nil), // 64: loop.evm.BalanceAtReply - (*evm.EstimateGasReply)(nil), // 65: loop.evm.EstimateGasReply - (*evm.GetTransactionByHashReply)(nil), // 66: loop.evm.GetTransactionByHashReply - (*evm.GetTransactionReceiptReply)(nil), // 67: loop.evm.GetTransactionReceiptReply - (*evm.LatestAndFinalizedHeadReply)(nil), // 68: loop.evm.LatestAndFinalizedHeadReply - (*evm.QueryTrackedLogsReply)(nil), // 69: loop.evm.QueryTrackedLogsReply - (*evm.GetTransactionStatusReply)(nil), // 70: loop.evm.GetTransactionStatusReply + (*SubmitTransactionRequest)(nil), // 37: loop.relayerset.SubmitTransactionRequest + (*CalculateTransactionFeeRequest)(nil), // 38: loop.relayerset.CalculateTransactionFeeRequest + nil, // 39: loop.relayerset.RelayerHealthReportResponse.ReportEntry + (*pb.GetLatestValueRequest)(nil), // 40: loop.GetLatestValueRequest + (*pb.BatchGetLatestValuesRequest)(nil), // 41: loop.BatchGetLatestValuesRequest + (*pb.QueryKeyRequest)(nil), // 42: loop.QueryKeyRequest + (*pb.QueryKeysRequest)(nil), // 43: loop.QueryKeysRequest + (*pb.BindRequest)(nil), // 44: loop.BindRequest + (*pb.UnbindRequest)(nil), // 45: loop.UnbindRequest + (*evm.GetTransactionFeeRequest)(nil), // 46: loop.evm.GetTransactionFeeRequest + (*evm.CallContractRequest)(nil), // 47: loop.evm.CallContractRequest + (*evm.FilterLogsRequest)(nil), // 48: loop.evm.FilterLogsRequest + (*evm.BalanceAtRequest)(nil), // 49: loop.evm.BalanceAtRequest + (*evm.EstimateGasRequest)(nil), // 50: loop.evm.EstimateGasRequest + (*evm.GetTransactionByHashRequest)(nil), // 51: loop.evm.GetTransactionByHashRequest + (*evm.GetTransactionReceiptRequest)(nil), // 52: loop.evm.GetTransactionReceiptRequest + (*evm.QueryTrackedLogsRequest)(nil), // 53: loop.evm.QueryTrackedLogsRequest + (*evm.RegisterLogTrackingRequest)(nil), // 54: loop.evm.RegisterLogTrackingRequest + (*evm.UnregisterLogTrackingRequest)(nil), // 55: loop.evm.UnregisterLogTrackingRequest + (*evm.GetTransactionStatusRequest)(nil), // 56: loop.evm.GetTransactionStatusRequest + (*evm.SubmitTransactionRequest)(nil), // 57: loop.evm.SubmitTransactionRequest + (*evm.CalculateTransactionFeeRequest)(nil), // 58: loop.evm.CalculateTransactionFeeRequest + (*emptypb.Empty)(nil), // 59: google.protobuf.Empty + (*pb.GetLatestValueReply)(nil), // 60: loop.GetLatestValueReply + (*pb.GetLatestValueWithHeadDataReply)(nil), // 61: loop.GetLatestValueWithHeadDataReply + (*pb.BatchGetLatestValuesReply)(nil), // 62: loop.BatchGetLatestValuesReply + (*pb.QueryKeyReply)(nil), // 63: loop.QueryKeyReply + (*pb.QueryKeysReply)(nil), // 64: loop.QueryKeysReply + (*evm.GetTransactionFeeReply)(nil), // 65: loop.evm.GetTransactionFeeReply + (*evm.CallContractReply)(nil), // 66: loop.evm.CallContractReply + (*evm.FilterLogsReply)(nil), // 67: loop.evm.FilterLogsReply + (*evm.BalanceAtReply)(nil), // 68: loop.evm.BalanceAtReply + (*evm.EstimateGasReply)(nil), // 69: loop.evm.EstimateGasReply + (*evm.GetTransactionByHashReply)(nil), // 70: loop.evm.GetTransactionByHashReply + (*evm.GetTransactionReceiptReply)(nil), // 71: loop.evm.GetTransactionReceiptReply + (*evm.LatestAndFinalizedHeadReply)(nil), // 72: loop.evm.LatestAndFinalizedHeadReply + (*evm.QueryTrackedLogsReply)(nil), // 73: loop.evm.QueryTrackedLogsReply + (*evm.GetTransactionStatusReply)(nil), // 74: loop.evm.GetTransactionStatusReply + (*evm.SubmitTransactionReply)(nil), // 75: loop.evm.SubmitTransactionReply + (*evm.CalculateTransactionFeeReply)(nil), // 76: loop.evm.CalculateTransactionFeeReply } var file_relayerset_proto_depIdxs = []int32{ 0, // 0: loop.relayerset.GetRelayerRequest.id:type_name -> loop.relayerset.RelayerId @@ -2156,104 +2275,112 @@ var file_relayerset_proto_depIdxs = []int32{ 0, // 8: loop.relayerset.NewContractReaderRequest.relayerId:type_name -> loop.relayerset.RelayerId 0, // 9: loop.relayerset.NewContractWriterRequest.relayerId:type_name -> loop.relayerset.RelayerId 0, // 10: loop.relayerset.LatestHeadRequest.relayerId:type_name -> loop.relayerset.RelayerId - 37, // 11: loop.relayerset.RelayerHealthReportResponse.report:type_name -> loop.relayerset.RelayerHealthReportResponse.ReportEntry - 38, // 12: loop.relayerset.ContractReaderGetLatestValueRequest.request:type_name -> loop.GetLatestValueRequest - 39, // 13: loop.relayerset.ContractReaderBatchGetLatestValuesRequest.request:type_name -> loop.BatchGetLatestValuesRequest - 40, // 14: loop.relayerset.ContractReaderQueryKeyRequest.request:type_name -> loop.QueryKeyRequest - 41, // 15: loop.relayerset.ContractReaderQueryKeysRequest.request:type_name -> loop.QueryKeysRequest - 42, // 16: loop.relayerset.ContractReaderBindRequest.request:type_name -> loop.BindRequest - 43, // 17: loop.relayerset.ContractReaderUnbindRequest.request:type_name -> loop.UnbindRequest + 39, // 11: loop.relayerset.RelayerHealthReportResponse.report:type_name -> loop.relayerset.RelayerHealthReportResponse.ReportEntry + 40, // 12: loop.relayerset.ContractReaderGetLatestValueRequest.request:type_name -> loop.GetLatestValueRequest + 41, // 13: loop.relayerset.ContractReaderBatchGetLatestValuesRequest.request:type_name -> loop.BatchGetLatestValuesRequest + 42, // 14: loop.relayerset.ContractReaderQueryKeyRequest.request:type_name -> loop.QueryKeyRequest + 43, // 15: loop.relayerset.ContractReaderQueryKeysRequest.request:type_name -> loop.QueryKeysRequest + 44, // 16: loop.relayerset.ContractReaderBindRequest.request:type_name -> loop.BindRequest + 45, // 17: loop.relayerset.ContractReaderUnbindRequest.request:type_name -> loop.UnbindRequest 0, // 18: loop.relayerset.GetTransactionFeeRequest.relayerId:type_name -> loop.relayerset.RelayerId - 44, // 19: loop.relayerset.GetTransactionFeeRequest.request:type_name -> loop.evm.GetTransactionFeeRequest + 46, // 19: loop.relayerset.GetTransactionFeeRequest.request:type_name -> loop.evm.GetTransactionFeeRequest 0, // 20: loop.relayerset.CallContractRequest.relayerId:type_name -> loop.relayerset.RelayerId - 45, // 21: loop.relayerset.CallContractRequest.request:type_name -> loop.evm.CallContractRequest + 47, // 21: loop.relayerset.CallContractRequest.request:type_name -> loop.evm.CallContractRequest 0, // 22: loop.relayerset.FilterLogsRequest.relayerId:type_name -> loop.relayerset.RelayerId - 46, // 23: loop.relayerset.FilterLogsRequest.request:type_name -> loop.evm.FilterLogsRequest + 48, // 23: loop.relayerset.FilterLogsRequest.request:type_name -> loop.evm.FilterLogsRequest 0, // 24: loop.relayerset.BalanceAtRequest.relayerId:type_name -> loop.relayerset.RelayerId - 47, // 25: loop.relayerset.BalanceAtRequest.request:type_name -> loop.evm.BalanceAtRequest + 49, // 25: loop.relayerset.BalanceAtRequest.request:type_name -> loop.evm.BalanceAtRequest 0, // 26: loop.relayerset.EstimateGasRequest.relayerId:type_name -> loop.relayerset.RelayerId - 48, // 27: loop.relayerset.EstimateGasRequest.request:type_name -> loop.evm.EstimateGasRequest + 50, // 27: loop.relayerset.EstimateGasRequest.request:type_name -> loop.evm.EstimateGasRequest 0, // 28: loop.relayerset.GetTransactionByHashRequest.relayerId:type_name -> loop.relayerset.RelayerId - 49, // 29: loop.relayerset.GetTransactionByHashRequest.request:type_name -> loop.evm.GetTransactionByHashRequest + 51, // 29: loop.relayerset.GetTransactionByHashRequest.request:type_name -> loop.evm.GetTransactionByHashRequest 0, // 30: loop.relayerset.GetTransactionReceiptRequest.relayerId:type_name -> loop.relayerset.RelayerId - 50, // 31: loop.relayerset.GetTransactionReceiptRequest.request:type_name -> loop.evm.GetTransactionReceiptRequest + 52, // 31: loop.relayerset.GetTransactionReceiptRequest.request:type_name -> loop.evm.GetTransactionReceiptRequest 0, // 32: loop.relayerset.QueryTrackedLogsRequest.relayerId:type_name -> loop.relayerset.RelayerId - 51, // 33: loop.relayerset.QueryTrackedLogsRequest.request:type_name -> loop.evm.QueryTrackedLogsRequest + 53, // 33: loop.relayerset.QueryTrackedLogsRequest.request:type_name -> loop.evm.QueryTrackedLogsRequest 0, // 34: loop.relayerset.RegisterLogTrackingRequest.relayerId:type_name -> loop.relayerset.RelayerId - 52, // 35: loop.relayerset.RegisterLogTrackingRequest.request:type_name -> loop.evm.RegisterLogTrackingRequest + 54, // 35: loop.relayerset.RegisterLogTrackingRequest.request:type_name -> loop.evm.RegisterLogTrackingRequest 0, // 36: loop.relayerset.UnregisterLogTrackingRequest.relayerId:type_name -> loop.relayerset.RelayerId - 53, // 37: loop.relayerset.UnregisterLogTrackingRequest.request:type_name -> loop.evm.UnregisterLogTrackingRequest + 55, // 37: loop.relayerset.UnregisterLogTrackingRequest.request:type_name -> loop.evm.UnregisterLogTrackingRequest 0, // 38: loop.relayerset.GetTransactionStatusRequest.relayerId:type_name -> loop.relayerset.RelayerId - 54, // 39: loop.relayerset.GetTransactionStatusRequest.request:type_name -> loop.evm.GetTransactionStatusRequest - 1, // 40: loop.relayerset.RelayerSet.Get:input_type -> loop.relayerset.GetRelayerRequest - 3, // 41: loop.relayerset.RelayerSet.List:input_type -> loop.relayerset.ListAllRelayersRequest - 8, // 42: loop.relayerset.RelayerSet.NewPluginProvider:input_type -> loop.relayerset.NewPluginProviderRequest - 10, // 43: loop.relayerset.RelayerSet.NewContractReader:input_type -> loop.relayerset.NewContractReaderRequest - 12, // 44: loop.relayerset.RelayerSet.NewContractWriter:input_type -> loop.relayerset.NewContractWriterRequest - 0, // 45: loop.relayerset.RelayerSet.StartRelayer:input_type -> loop.relayerset.RelayerId - 0, // 46: loop.relayerset.RelayerSet.CloseRelayer:input_type -> loop.relayerset.RelayerId - 0, // 47: loop.relayerset.RelayerSet.RelayerReady:input_type -> loop.relayerset.RelayerId - 0, // 48: loop.relayerset.RelayerSet.RelayerHealthReport:input_type -> loop.relayerset.RelayerId - 0, // 49: loop.relayerset.RelayerSet.RelayerName:input_type -> loop.relayerset.RelayerId - 14, // 50: loop.relayerset.RelayerSet.RelayerLatestHead:input_type -> loop.relayerset.LatestHeadRequest - 18, // 51: loop.relayerset.RelayerSet.ContractReaderGetLatestValue:input_type -> loop.relayerset.ContractReaderGetLatestValueRequest - 18, // 52: loop.relayerset.RelayerSet.ContractReaderGetLatestValueWithHeadData:input_type -> loop.relayerset.ContractReaderGetLatestValueRequest - 19, // 53: loop.relayerset.RelayerSet.ContractReaderBatchGetLatestValues:input_type -> loop.relayerset.ContractReaderBatchGetLatestValuesRequest - 20, // 54: loop.relayerset.RelayerSet.ContractReaderQueryKey:input_type -> loop.relayerset.ContractReaderQueryKeyRequest - 21, // 55: loop.relayerset.RelayerSet.ContractReaderQueryKeys:input_type -> loop.relayerset.ContractReaderQueryKeysRequest - 22, // 56: loop.relayerset.RelayerSet.ContractReaderBind:input_type -> loop.relayerset.ContractReaderBindRequest - 23, // 57: loop.relayerset.RelayerSet.ContractReaderUnbind:input_type -> loop.relayerset.ContractReaderUnbindRequest - 24, // 58: loop.relayerset.RelayerSet.ContractReaderStart:input_type -> loop.relayerset.ContractReaderStartRequest - 25, // 59: loop.relayerset.RelayerSet.ContractReaderClose:input_type -> loop.relayerset.ContractReaderCloseRequest - 26, // 60: loop.relayerset.EVMRelayerSet.GetTransactionFee:input_type -> loop.relayerset.GetTransactionFeeRequest - 27, // 61: loop.relayerset.EVMRelayerSet.CallContract:input_type -> loop.relayerset.CallContractRequest - 28, // 62: loop.relayerset.EVMRelayerSet.FilterLogs:input_type -> loop.relayerset.FilterLogsRequest - 29, // 63: loop.relayerset.EVMRelayerSet.BalanceAt:input_type -> loop.relayerset.BalanceAtRequest - 30, // 64: loop.relayerset.EVMRelayerSet.EstimateGas:input_type -> loop.relayerset.EstimateGasRequest - 31, // 65: loop.relayerset.EVMRelayerSet.GetTransactionByHash:input_type -> loop.relayerset.GetTransactionByHashRequest - 32, // 66: loop.relayerset.EVMRelayerSet.GetTransactionReceipt:input_type -> loop.relayerset.GetTransactionReceiptRequest - 14, // 67: loop.relayerset.EVMRelayerSet.LatestAndFinalizedHead:input_type -> loop.relayerset.LatestHeadRequest - 33, // 68: loop.relayerset.EVMRelayerSet.QueryTrackedLogs:input_type -> loop.relayerset.QueryTrackedLogsRequest - 34, // 69: loop.relayerset.EVMRelayerSet.RegisterLogTracking:input_type -> loop.relayerset.RegisterLogTrackingRequest - 35, // 70: loop.relayerset.EVMRelayerSet.UnregisterLogTracking:input_type -> loop.relayerset.UnregisterLogTrackingRequest - 36, // 71: loop.relayerset.EVMRelayerSet.GetTransactionStatus:input_type -> loop.relayerset.GetTransactionStatusRequest - 2, // 72: loop.relayerset.RelayerSet.Get:output_type -> loop.relayerset.GetRelayerResponse - 4, // 73: loop.relayerset.RelayerSet.List:output_type -> loop.relayerset.ListAllRelayersResponse - 9, // 74: loop.relayerset.RelayerSet.NewPluginProvider:output_type -> loop.relayerset.NewPluginProviderResponse - 11, // 75: loop.relayerset.RelayerSet.NewContractReader:output_type -> loop.relayerset.NewContractReaderResponse - 13, // 76: loop.relayerset.RelayerSet.NewContractWriter:output_type -> loop.relayerset.NewContractWriterResponse - 55, // 77: loop.relayerset.RelayerSet.StartRelayer:output_type -> google.protobuf.Empty - 55, // 78: loop.relayerset.RelayerSet.CloseRelayer:output_type -> google.protobuf.Empty - 55, // 79: loop.relayerset.RelayerSet.RelayerReady:output_type -> google.protobuf.Empty - 16, // 80: loop.relayerset.RelayerSet.RelayerHealthReport:output_type -> loop.relayerset.RelayerHealthReportResponse - 17, // 81: loop.relayerset.RelayerSet.RelayerName:output_type -> loop.relayerset.RelayerNameResponse - 15, // 82: loop.relayerset.RelayerSet.RelayerLatestHead:output_type -> loop.relayerset.LatestHeadResponse - 56, // 83: loop.relayerset.RelayerSet.ContractReaderGetLatestValue:output_type -> loop.GetLatestValueReply - 57, // 84: loop.relayerset.RelayerSet.ContractReaderGetLatestValueWithHeadData:output_type -> loop.GetLatestValueWithHeadDataReply - 58, // 85: loop.relayerset.RelayerSet.ContractReaderBatchGetLatestValues:output_type -> loop.BatchGetLatestValuesReply - 59, // 86: loop.relayerset.RelayerSet.ContractReaderQueryKey:output_type -> loop.QueryKeyReply - 60, // 87: loop.relayerset.RelayerSet.ContractReaderQueryKeys:output_type -> loop.QueryKeysReply - 55, // 88: loop.relayerset.RelayerSet.ContractReaderBind:output_type -> google.protobuf.Empty - 55, // 89: loop.relayerset.RelayerSet.ContractReaderUnbind:output_type -> google.protobuf.Empty - 55, // 90: loop.relayerset.RelayerSet.ContractReaderStart:output_type -> google.protobuf.Empty - 55, // 91: loop.relayerset.RelayerSet.ContractReaderClose:output_type -> google.protobuf.Empty - 61, // 92: loop.relayerset.EVMRelayerSet.GetTransactionFee:output_type -> loop.evm.GetTransactionFeeReply - 62, // 93: loop.relayerset.EVMRelayerSet.CallContract:output_type -> loop.evm.CallContractReply - 63, // 94: loop.relayerset.EVMRelayerSet.FilterLogs:output_type -> loop.evm.FilterLogsReply - 64, // 95: loop.relayerset.EVMRelayerSet.BalanceAt:output_type -> loop.evm.BalanceAtReply - 65, // 96: loop.relayerset.EVMRelayerSet.EstimateGas:output_type -> loop.evm.EstimateGasReply - 66, // 97: loop.relayerset.EVMRelayerSet.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply - 67, // 98: loop.relayerset.EVMRelayerSet.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply - 68, // 99: loop.relayerset.EVMRelayerSet.LatestAndFinalizedHead:output_type -> loop.evm.LatestAndFinalizedHeadReply - 69, // 100: loop.relayerset.EVMRelayerSet.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply - 55, // 101: loop.relayerset.EVMRelayerSet.RegisterLogTracking:output_type -> google.protobuf.Empty - 55, // 102: loop.relayerset.EVMRelayerSet.UnregisterLogTracking:output_type -> google.protobuf.Empty - 70, // 103: loop.relayerset.EVMRelayerSet.GetTransactionStatus:output_type -> loop.evm.GetTransactionStatusReply - 72, // [72:104] is the sub-list for method output_type - 40, // [40:72] is the sub-list for method input_type - 40, // [40:40] is the sub-list for extension type_name - 40, // [40:40] is the sub-list for extension extendee - 0, // [0:40] is the sub-list for field type_name + 56, // 39: loop.relayerset.GetTransactionStatusRequest.request:type_name -> loop.evm.GetTransactionStatusRequest + 0, // 40: loop.relayerset.SubmitTransactionRequest.relayerId:type_name -> loop.relayerset.RelayerId + 57, // 41: loop.relayerset.SubmitTransactionRequest.request:type_name -> loop.evm.SubmitTransactionRequest + 0, // 42: loop.relayerset.CalculateTransactionFeeRequest.relayerId:type_name -> loop.relayerset.RelayerId + 58, // 43: loop.relayerset.CalculateTransactionFeeRequest.request:type_name -> loop.evm.CalculateTransactionFeeRequest + 1, // 44: loop.relayerset.RelayerSet.Get:input_type -> loop.relayerset.GetRelayerRequest + 3, // 45: loop.relayerset.RelayerSet.List:input_type -> loop.relayerset.ListAllRelayersRequest + 8, // 46: loop.relayerset.RelayerSet.NewPluginProvider:input_type -> loop.relayerset.NewPluginProviderRequest + 10, // 47: loop.relayerset.RelayerSet.NewContractReader:input_type -> loop.relayerset.NewContractReaderRequest + 12, // 48: loop.relayerset.RelayerSet.NewContractWriter:input_type -> loop.relayerset.NewContractWriterRequest + 0, // 49: loop.relayerset.RelayerSet.StartRelayer:input_type -> loop.relayerset.RelayerId + 0, // 50: loop.relayerset.RelayerSet.CloseRelayer:input_type -> loop.relayerset.RelayerId + 0, // 51: loop.relayerset.RelayerSet.RelayerReady:input_type -> loop.relayerset.RelayerId + 0, // 52: loop.relayerset.RelayerSet.RelayerHealthReport:input_type -> loop.relayerset.RelayerId + 0, // 53: loop.relayerset.RelayerSet.RelayerName:input_type -> loop.relayerset.RelayerId + 14, // 54: loop.relayerset.RelayerSet.RelayerLatestHead:input_type -> loop.relayerset.LatestHeadRequest + 18, // 55: loop.relayerset.RelayerSet.ContractReaderGetLatestValue:input_type -> loop.relayerset.ContractReaderGetLatestValueRequest + 18, // 56: loop.relayerset.RelayerSet.ContractReaderGetLatestValueWithHeadData:input_type -> loop.relayerset.ContractReaderGetLatestValueRequest + 19, // 57: loop.relayerset.RelayerSet.ContractReaderBatchGetLatestValues:input_type -> loop.relayerset.ContractReaderBatchGetLatestValuesRequest + 20, // 58: loop.relayerset.RelayerSet.ContractReaderQueryKey:input_type -> loop.relayerset.ContractReaderQueryKeyRequest + 21, // 59: loop.relayerset.RelayerSet.ContractReaderQueryKeys:input_type -> loop.relayerset.ContractReaderQueryKeysRequest + 22, // 60: loop.relayerset.RelayerSet.ContractReaderBind:input_type -> loop.relayerset.ContractReaderBindRequest + 23, // 61: loop.relayerset.RelayerSet.ContractReaderUnbind:input_type -> loop.relayerset.ContractReaderUnbindRequest + 24, // 62: loop.relayerset.RelayerSet.ContractReaderStart:input_type -> loop.relayerset.ContractReaderStartRequest + 25, // 63: loop.relayerset.RelayerSet.ContractReaderClose:input_type -> loop.relayerset.ContractReaderCloseRequest + 26, // 64: loop.relayerset.EVMRelayerSet.GetTransactionFee:input_type -> loop.relayerset.GetTransactionFeeRequest + 27, // 65: loop.relayerset.EVMRelayerSet.CallContract:input_type -> loop.relayerset.CallContractRequest + 28, // 66: loop.relayerset.EVMRelayerSet.FilterLogs:input_type -> loop.relayerset.FilterLogsRequest + 29, // 67: loop.relayerset.EVMRelayerSet.BalanceAt:input_type -> loop.relayerset.BalanceAtRequest + 30, // 68: loop.relayerset.EVMRelayerSet.EstimateGas:input_type -> loop.relayerset.EstimateGasRequest + 31, // 69: loop.relayerset.EVMRelayerSet.GetTransactionByHash:input_type -> loop.relayerset.GetTransactionByHashRequest + 32, // 70: loop.relayerset.EVMRelayerSet.GetTransactionReceipt:input_type -> loop.relayerset.GetTransactionReceiptRequest + 14, // 71: loop.relayerset.EVMRelayerSet.LatestAndFinalizedHead:input_type -> loop.relayerset.LatestHeadRequest + 33, // 72: loop.relayerset.EVMRelayerSet.QueryTrackedLogs:input_type -> loop.relayerset.QueryTrackedLogsRequest + 34, // 73: loop.relayerset.EVMRelayerSet.RegisterLogTracking:input_type -> loop.relayerset.RegisterLogTrackingRequest + 35, // 74: loop.relayerset.EVMRelayerSet.UnregisterLogTracking:input_type -> loop.relayerset.UnregisterLogTrackingRequest + 36, // 75: loop.relayerset.EVMRelayerSet.GetTransactionStatus:input_type -> loop.relayerset.GetTransactionStatusRequest + 37, // 76: loop.relayerset.EVMRelayerSet.SubmitTransaction:input_type -> loop.relayerset.SubmitTransactionRequest + 38, // 77: loop.relayerset.EVMRelayerSet.CalculateTransactionFee:input_type -> loop.relayerset.CalculateTransactionFeeRequest + 2, // 78: loop.relayerset.RelayerSet.Get:output_type -> loop.relayerset.GetRelayerResponse + 4, // 79: loop.relayerset.RelayerSet.List:output_type -> loop.relayerset.ListAllRelayersResponse + 9, // 80: loop.relayerset.RelayerSet.NewPluginProvider:output_type -> loop.relayerset.NewPluginProviderResponse + 11, // 81: loop.relayerset.RelayerSet.NewContractReader:output_type -> loop.relayerset.NewContractReaderResponse + 13, // 82: loop.relayerset.RelayerSet.NewContractWriter:output_type -> loop.relayerset.NewContractWriterResponse + 59, // 83: loop.relayerset.RelayerSet.StartRelayer:output_type -> google.protobuf.Empty + 59, // 84: loop.relayerset.RelayerSet.CloseRelayer:output_type -> google.protobuf.Empty + 59, // 85: loop.relayerset.RelayerSet.RelayerReady:output_type -> google.protobuf.Empty + 16, // 86: loop.relayerset.RelayerSet.RelayerHealthReport:output_type -> loop.relayerset.RelayerHealthReportResponse + 17, // 87: loop.relayerset.RelayerSet.RelayerName:output_type -> loop.relayerset.RelayerNameResponse + 15, // 88: loop.relayerset.RelayerSet.RelayerLatestHead:output_type -> loop.relayerset.LatestHeadResponse + 60, // 89: loop.relayerset.RelayerSet.ContractReaderGetLatestValue:output_type -> loop.GetLatestValueReply + 61, // 90: loop.relayerset.RelayerSet.ContractReaderGetLatestValueWithHeadData:output_type -> loop.GetLatestValueWithHeadDataReply + 62, // 91: loop.relayerset.RelayerSet.ContractReaderBatchGetLatestValues:output_type -> loop.BatchGetLatestValuesReply + 63, // 92: loop.relayerset.RelayerSet.ContractReaderQueryKey:output_type -> loop.QueryKeyReply + 64, // 93: loop.relayerset.RelayerSet.ContractReaderQueryKeys:output_type -> loop.QueryKeysReply + 59, // 94: loop.relayerset.RelayerSet.ContractReaderBind:output_type -> google.protobuf.Empty + 59, // 95: loop.relayerset.RelayerSet.ContractReaderUnbind:output_type -> google.protobuf.Empty + 59, // 96: loop.relayerset.RelayerSet.ContractReaderStart:output_type -> google.protobuf.Empty + 59, // 97: loop.relayerset.RelayerSet.ContractReaderClose:output_type -> google.protobuf.Empty + 65, // 98: loop.relayerset.EVMRelayerSet.GetTransactionFee:output_type -> loop.evm.GetTransactionFeeReply + 66, // 99: loop.relayerset.EVMRelayerSet.CallContract:output_type -> loop.evm.CallContractReply + 67, // 100: loop.relayerset.EVMRelayerSet.FilterLogs:output_type -> loop.evm.FilterLogsReply + 68, // 101: loop.relayerset.EVMRelayerSet.BalanceAt:output_type -> loop.evm.BalanceAtReply + 69, // 102: loop.relayerset.EVMRelayerSet.EstimateGas:output_type -> loop.evm.EstimateGasReply + 70, // 103: loop.relayerset.EVMRelayerSet.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply + 71, // 104: loop.relayerset.EVMRelayerSet.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply + 72, // 105: loop.relayerset.EVMRelayerSet.LatestAndFinalizedHead:output_type -> loop.evm.LatestAndFinalizedHeadReply + 73, // 106: loop.relayerset.EVMRelayerSet.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply + 59, // 107: loop.relayerset.EVMRelayerSet.RegisterLogTracking:output_type -> google.protobuf.Empty + 59, // 108: loop.relayerset.EVMRelayerSet.UnregisterLogTracking:output_type -> google.protobuf.Empty + 74, // 109: loop.relayerset.EVMRelayerSet.GetTransactionStatus:output_type -> loop.evm.GetTransactionStatusReply + 75, // 110: loop.relayerset.EVMRelayerSet.SubmitTransaction:output_type -> loop.evm.SubmitTransactionReply + 76, // 111: loop.relayerset.EVMRelayerSet.CalculateTransactionFee:output_type -> loop.evm.CalculateTransactionFeeReply + 78, // [78:112] is the sub-list for method output_type + 44, // [44:78] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_relayerset_proto_init() } @@ -2267,7 +2394,7 @@ func file_relayerset_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_relayerset_proto_rawDesc), len(file_relayerset_proto_rawDesc)), NumEnums: 0, - NumMessages: 38, + NumMessages: 40, NumExtensions: 0, NumServices: 2, }, diff --git a/pkg/loop/internal/pb/relayerset/relayerset.proto b/pkg/loop/internal/pb/relayerset/relayerset.proto index 7f5c2e8079..2198ce8ec2 100644 --- a/pkg/loop/internal/pb/relayerset/relayerset.proto +++ b/pkg/loop/internal/pb/relayerset/relayerset.proto @@ -135,6 +135,8 @@ service EVMRelayerSet { rpc RegisterLogTracking(RegisterLogTrackingRequest) returns (google.protobuf.Empty); rpc UnregisterLogTracking(UnregisterLogTrackingRequest) returns (google.protobuf.Empty); rpc GetTransactionStatus(GetTransactionStatusRequest) returns (loop.evm.GetTransactionStatusReply); + rpc SubmitTransaction(SubmitTransactionRequest) returns (loop.evm.SubmitTransactionReply); + rpc CalculateTransactionFee(CalculateTransactionFeeRequest) returns (loop.evm.CalculateTransactionFeeReply); } message ContractReaderGetLatestValueRequest { @@ -230,7 +232,15 @@ message GetTransactionStatusRequest { loop.evm.GetTransactionStatusRequest request = 2; } +message SubmitTransactionRequest { + RelayerId relayerId = 1; + loop.evm.SubmitTransactionRequest request = 2; +} +message CalculateTransactionFeeRequest { + RelayerId relayerId = 1; + loop.evm.CalculateTransactionFeeRequest request = 2; +} diff --git a/pkg/loop/internal/pb/relayerset/relayerset_grpc.pb.go b/pkg/loop/internal/pb/relayerset/relayerset_grpc.pb.go index ee2caf0414..8867fdf433 100644 --- a/pkg/loop/internal/pb/relayerset/relayerset_grpc.pb.go +++ b/pkg/loop/internal/pb/relayerset/relayerset_grpc.pb.go @@ -846,18 +846,20 @@ var RelayerSet_ServiceDesc = grpc.ServiceDesc{ } const ( - EVMRelayerSet_GetTransactionFee_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionFee" - EVMRelayerSet_CallContract_FullMethodName = "/loop.relayerset.EVMRelayerSet/CallContract" - EVMRelayerSet_FilterLogs_FullMethodName = "/loop.relayerset.EVMRelayerSet/FilterLogs" - EVMRelayerSet_BalanceAt_FullMethodName = "/loop.relayerset.EVMRelayerSet/BalanceAt" - EVMRelayerSet_EstimateGas_FullMethodName = "/loop.relayerset.EVMRelayerSet/EstimateGas" - EVMRelayerSet_GetTransactionByHash_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionByHash" - EVMRelayerSet_GetTransactionReceipt_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionReceipt" - EVMRelayerSet_LatestAndFinalizedHead_FullMethodName = "/loop.relayerset.EVMRelayerSet/LatestAndFinalizedHead" - EVMRelayerSet_QueryTrackedLogs_FullMethodName = "/loop.relayerset.EVMRelayerSet/QueryTrackedLogs" - EVMRelayerSet_RegisterLogTracking_FullMethodName = "/loop.relayerset.EVMRelayerSet/RegisterLogTracking" - EVMRelayerSet_UnregisterLogTracking_FullMethodName = "/loop.relayerset.EVMRelayerSet/UnregisterLogTracking" - EVMRelayerSet_GetTransactionStatus_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionStatus" + EVMRelayerSet_GetTransactionFee_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionFee" + EVMRelayerSet_CallContract_FullMethodName = "/loop.relayerset.EVMRelayerSet/CallContract" + EVMRelayerSet_FilterLogs_FullMethodName = "/loop.relayerset.EVMRelayerSet/FilterLogs" + EVMRelayerSet_BalanceAt_FullMethodName = "/loop.relayerset.EVMRelayerSet/BalanceAt" + EVMRelayerSet_EstimateGas_FullMethodName = "/loop.relayerset.EVMRelayerSet/EstimateGas" + EVMRelayerSet_GetTransactionByHash_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionByHash" + EVMRelayerSet_GetTransactionReceipt_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionReceipt" + EVMRelayerSet_LatestAndFinalizedHead_FullMethodName = "/loop.relayerset.EVMRelayerSet/LatestAndFinalizedHead" + EVMRelayerSet_QueryTrackedLogs_FullMethodName = "/loop.relayerset.EVMRelayerSet/QueryTrackedLogs" + EVMRelayerSet_RegisterLogTracking_FullMethodName = "/loop.relayerset.EVMRelayerSet/RegisterLogTracking" + EVMRelayerSet_UnregisterLogTracking_FullMethodName = "/loop.relayerset.EVMRelayerSet/UnregisterLogTracking" + EVMRelayerSet_GetTransactionStatus_FullMethodName = "/loop.relayerset.EVMRelayerSet/GetTransactionStatus" + EVMRelayerSet_SubmitTransaction_FullMethodName = "/loop.relayerset.EVMRelayerSet/SubmitTransaction" + EVMRelayerSet_CalculateTransactionFee_FullMethodName = "/loop.relayerset.EVMRelayerSet/CalculateTransactionFee" ) // EVMRelayerSetClient is the client API for EVMRelayerSet service. @@ -876,6 +878,8 @@ type EVMRelayerSetClient interface { RegisterLogTracking(ctx context.Context, in *RegisterLogTrackingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) UnregisterLogTracking(ctx context.Context, in *UnregisterLogTrackingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) GetTransactionStatus(ctx context.Context, in *GetTransactionStatusRequest, opts ...grpc.CallOption) (*evm.GetTransactionStatusReply, error) + SubmitTransaction(ctx context.Context, in *SubmitTransactionRequest, opts ...grpc.CallOption) (*evm.SubmitTransactionReply, error) + CalculateTransactionFee(ctx context.Context, in *CalculateTransactionFeeRequest, opts ...grpc.CallOption) (*evm.CalculateTransactionFeeReply, error) } type eVMRelayerSetClient struct { @@ -1006,6 +1010,26 @@ func (c *eVMRelayerSetClient) GetTransactionStatus(ctx context.Context, in *GetT return out, nil } +func (c *eVMRelayerSetClient) SubmitTransaction(ctx context.Context, in *SubmitTransactionRequest, opts ...grpc.CallOption) (*evm.SubmitTransactionReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(evm.SubmitTransactionReply) + err := c.cc.Invoke(ctx, EVMRelayerSet_SubmitTransaction_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eVMRelayerSetClient) CalculateTransactionFee(ctx context.Context, in *CalculateTransactionFeeRequest, opts ...grpc.CallOption) (*evm.CalculateTransactionFeeReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(evm.CalculateTransactionFeeReply) + err := c.cc.Invoke(ctx, EVMRelayerSet_CalculateTransactionFee_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // EVMRelayerSetServer is the server API for EVMRelayerSet service. // All implementations must embed UnimplementedEVMRelayerSetServer // for forward compatibility. @@ -1022,6 +1046,8 @@ type EVMRelayerSetServer interface { RegisterLogTracking(context.Context, *RegisterLogTrackingRequest) (*emptypb.Empty, error) UnregisterLogTracking(context.Context, *UnregisterLogTrackingRequest) (*emptypb.Empty, error) GetTransactionStatus(context.Context, *GetTransactionStatusRequest) (*evm.GetTransactionStatusReply, error) + SubmitTransaction(context.Context, *SubmitTransactionRequest) (*evm.SubmitTransactionReply, error) + CalculateTransactionFee(context.Context, *CalculateTransactionFeeRequest) (*evm.CalculateTransactionFeeReply, error) mustEmbedUnimplementedEVMRelayerSetServer() } @@ -1068,6 +1094,12 @@ func (UnimplementedEVMRelayerSetServer) UnregisterLogTracking(context.Context, * func (UnimplementedEVMRelayerSetServer) GetTransactionStatus(context.Context, *GetTransactionStatusRequest) (*evm.GetTransactionStatusReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTransactionStatus not implemented") } +func (UnimplementedEVMRelayerSetServer) SubmitTransaction(context.Context, *SubmitTransactionRequest) (*evm.SubmitTransactionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubmitTransaction not implemented") +} +func (UnimplementedEVMRelayerSetServer) CalculateTransactionFee(context.Context, *CalculateTransactionFeeRequest) (*evm.CalculateTransactionFeeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CalculateTransactionFee not implemented") +} func (UnimplementedEVMRelayerSetServer) mustEmbedUnimplementedEVMRelayerSetServer() {} func (UnimplementedEVMRelayerSetServer) testEmbeddedByValue() {} @@ -1305,6 +1337,42 @@ func _EVMRelayerSet_GetTransactionStatus_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } +func _EVMRelayerSet_SubmitTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SubmitTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EVMRelayerSetServer).SubmitTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EVMRelayerSet_SubmitTransaction_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EVMRelayerSetServer).SubmitTransaction(ctx, req.(*SubmitTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _EVMRelayerSet_CalculateTransactionFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CalculateTransactionFeeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EVMRelayerSetServer).CalculateTransactionFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EVMRelayerSet_CalculateTransactionFee_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EVMRelayerSetServer).CalculateTransactionFee(ctx, req.(*CalculateTransactionFeeRequest)) + } + return interceptor(ctx, in, info, handler) +} + // EVMRelayerSet_ServiceDesc is the grpc.ServiceDesc for EVMRelayerSet service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1360,6 +1428,14 @@ var EVMRelayerSet_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetTransactionStatus", Handler: _EVMRelayerSet_GetTransactionStatus_Handler, }, + { + MethodName: "SubmitTransaction", + Handler: _EVMRelayerSet_SubmitTransaction_Handler, + }, + { + MethodName: "CalculateTransactionFee", + Handler: _EVMRelayerSet_CalculateTransactionFee_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "relayerset.proto", diff --git a/pkg/loop/internal/relayer/evm.go b/pkg/loop/internal/relayer/evm.go index 5828728488..39eb11295e 100644 --- a/pkg/loop/internal/relayer/evm.go +++ b/pkg/loop/internal/relayer/evm.go @@ -20,6 +20,36 @@ type EVMClient struct { grpcClient evmpb.EVMClient } +// CalculateTransactionFee implements types.EVMService. +func (e *EVMClient) CalculateTransactionFee(ctx context.Context, receiptGasInfo evmtypes.ReceiptGasInfo) (*evmtypes.TransactionFee, error) { + reply, err := e.grpcClient.CalculateTransactionFee(ctx, &evmpb.CalculateTransactionFeeRequest{GasInfo: &evmpb.ReceiptGasInfo{ + GasUsed: receiptGasInfo.GasUsed, + EffectiveGasPrice: valuespb.NewBigIntFromInt(receiptGasInfo.EffectiveGasPrice), + }}) + if err != nil { + return nil, net.WrapRPCErr(err) + } + + return &evmtypes.TransactionFee{TransactionFee: valuespb.NewIntFromBigInt(reply.GetTransactionFee())}, nil +} + +// SubmitTransaction implements types.EVMService. +func (e *EVMClient) SubmitTransaction(ctx context.Context, txRequest evmtypes.SubmitTransactionRequest) (*evmtypes.TransactionResult, error) { + reply, err := e.grpcClient.SubmitTransaction(ctx, &evmpb.SubmitTransactionRequest{ + To: txRequest.To[:], + Data: txRequest.Data, + GasConfig: evmpb.ConvertGasConfigToProto(txRequest.GasConfig), + }) + if err != nil { + return nil, net.WrapRPCErr(err) + } + + return &evmtypes.TransactionResult{ + TxStatus: evmpb.ConvertTxStatusFromProto(reply.TxStatus), + TxHash: evmtypes.Hash(reply.TxHash), + }, nil +} + func NewEVMCClient(grpcClient evmpb.EVMClient) *EVMClient { return &EVMClient{ grpcClient: grpcClient, @@ -331,3 +361,27 @@ func (e *evmServer) GetTransactionStatus(ctx context.Context, request *evmpb.Get //nolint: gosec // G115 return &evmpb.GetTransactionStatusReply{TransactionStatus: evmpb.TransactionStatus(txStatus)}, nil } + +func (e *evmServer) SubmitTransaction(ctx context.Context, request *evmpb.SubmitTransactionRequest) (*evmpb.SubmitTransactionReply, error) { + txResult, err := e.impl.SubmitTransaction(ctx, evmpb.ConvertSubmitTransactionRequestFromProto(request)) + if err != nil { + return nil, err + } + return &evmpb.SubmitTransactionReply{ + TxHash: txResult.TxHash[:], + TxStatus: evmpb.ConvertTxStatusToProto(txResult.TxStatus), + }, nil +} + +func (e *evmServer) CalculateTransactionFee(ctx context.Context, request *evmpb.CalculateTransactionFeeRequest) (*evmpb.CalculateTransactionFeeReply, error) { + txFee, err := e.impl.CalculateTransactionFee(ctx, evmtypes.ReceiptGasInfo{ + GasUsed: request.GasInfo.GasUsed, + EffectiveGasPrice: valuespb.NewIntFromBigInt(request.GasInfo.EffectiveGasPrice), + }) + if err != nil { + return nil, err + } + return &evmpb.CalculateTransactionFeeReply{ + TransactionFee: valuespb.NewBigIntFromInt(txFee.TransactionFee), + }, nil +} diff --git a/pkg/loop/internal/relayer/evm_test.go b/pkg/loop/internal/relayer/evm_test.go index cb9443b7e2..09fc7715f8 100644 --- a/pkg/loop/internal/relayer/evm_test.go +++ b/pkg/loop/internal/relayer/evm_test.go @@ -145,7 +145,7 @@ func Test_EVMDomainRoundTripThroughGRPC(t *testing.T) { require.NoError(t, err) require.Equal(t, txFee, fee.TransactionFee) }) - + t.Run("GetTransactionStatus", func(t *testing.T) { evmService.staticGetTransactionStatus = func(ctx context.Context, transactionID types.IdempotencyKey) (types.TransactionStatus, error) { require.Equal(t, txId, transactionID) @@ -308,18 +308,20 @@ func Test_EVMDomainRoundTripThroughGRPC(t *testing.T) { } type staticEVMService struct { - staticCallContract func(ctx context.Context, msg *evm.CallMsg, blockNumber *big.Int) ([]byte, error) - staticFilterLogs func(ctx context.Context, filterQuery evm.FilterQuery) ([]*evm.Log, error) - staticBalanceAt func(ctx context.Context, account evm.Address, blockNumber *big.Int) (*big.Int, error) - staticEstimateGas func(ctx context.Context, call *evm.CallMsg) (uint64, error) - staticGetTransactionByHash func(ctx context.Context, hash evm.Hash) (*evm.Transaction, error) - staticGetTransactionReceipt func(ctx context.Context, txHash evm.Hash) (*evm.Receipt, error) - staticGetTransactionFee func(ctx context.Context, transactionID types.IdempotencyKey) (*evm.TransactionFee, error) - staticQueryTrackedLogs func(ctx context.Context, filterQuery []query.Expression, limitAndSort query.LimitAndSort, confidenceLevel primitives.ConfidenceLevel) ([]*evm.Log, error) - staticLatestAndFinalizedHead func(ctx context.Context) (latest evm.Head, finalized evm.Head, err error) - staticRegisterLogTracking func(ctx context.Context, filter evm.LPFilterQuery) error - staticUnregisterLogTracking func(ctx context.Context, filterName string) error - staticGetTransactionStatus func(ctx context.Context, transactionID types.IdempotencyKey) (types.TransactionStatus, error) + staticCallContract func(ctx context.Context, msg *evm.CallMsg, blockNumber *big.Int) ([]byte, error) + staticFilterLogs func(ctx context.Context, filterQuery evm.FilterQuery) ([]*evm.Log, error) + staticBalanceAt func(ctx context.Context, account evm.Address, blockNumber *big.Int) (*big.Int, error) + staticEstimateGas func(ctx context.Context, call *evm.CallMsg) (uint64, error) + staticGetTransactionByHash func(ctx context.Context, hash evm.Hash) (*evm.Transaction, error) + staticGetTransactionReceipt func(ctx context.Context, txHash evm.Hash) (*evm.Receipt, error) + staticGetTransactionFee func(ctx context.Context, transactionID types.IdempotencyKey) (*evm.TransactionFee, error) + staticQueryTrackedLogs func(ctx context.Context, filterQuery []query.Expression, limitAndSort query.LimitAndSort, confidenceLevel primitives.ConfidenceLevel) ([]*evm.Log, error) + staticLatestAndFinalizedHead func(ctx context.Context) (latest evm.Head, finalized evm.Head, err error) + staticRegisterLogTracking func(ctx context.Context, filter evm.LPFilterQuery) error + staticUnregisterLogTracking func(ctx context.Context, filterName string) error + staticGetTransactionStatus func(ctx context.Context, transactionID types.IdempotencyKey) (types.TransactionStatus, error) + staticSubmitTransaction func(ctx context.Context, submitTransactionRequest evm.SubmitTransactionRequest) (*evm.TransactionResult, error) + staticCalculateTransactionFee func(ctx context.Context, gasInfo evm.ReceiptGasInfo) (*evm.TransactionFee, error) } func (s *staticEVMService) CallContract(ctx context.Context, msg *evm.CallMsg, blockNumber *big.Int) ([]byte, error) { @@ -362,14 +364,22 @@ func (s *staticEVMService) RegisterLogTracking(ctx context.Context, filter evm.L return s.staticRegisterLogTracking(ctx, filter) } -func (s *staticEVMService) UnregisterLogTracking(ctx context.Context, filterName string) error { - return s.staticUnregisterLogTracking(ctx, filterName) -} - func (s *staticEVMService) GetTransactionStatus(ctx context.Context, transactionID types.IdempotencyKey) (types.TransactionStatus, error) { return s.staticGetTransactionStatus(ctx, transactionID) } +func (s *staticEVMService) CalculateTransactionFee(ctx context.Context, gasInfo evm.ReceiptGasInfo) (*evm.TransactionFee, error) { + return s.staticCalculateTransactionFee(ctx, gasInfo) +} + +func (s *staticEVMService) SubmitTransaction(ctx context.Context, submitTransactionRequest evm.SubmitTransactionRequest) (*evm.TransactionResult, error) { + return s.staticSubmitTransaction(ctx, submitTransactionRequest) +} + +func (s *staticEVMService) UnregisterLogTracking(ctx context.Context, filterName string) error { + return s.staticUnregisterLogTracking(ctx, filterName) +} + func generateFixtureQuery() []query.Expression { exprs := make([]query.Expression, 0) diff --git a/pkg/loop/internal/relayerset/evm.go b/pkg/loop/internal/relayerset/evm.go index 0c9ab2ba61..afff60d184 100644 --- a/pkg/loop/internal/relayerset/evm.go +++ b/pkg/loop/internal/relayerset/evm.go @@ -20,6 +20,26 @@ type evmClient struct { client relayerset.EVMRelayerSetClient } +func (e *evmClient) CalculateTransactionFee(ctx context.Context, in *evmpb.CalculateTransactionFeeRequest, opts ...grpc.CallOption) (*evmpb.CalculateTransactionFeeReply, error) { + return e.client.CalculateTransactionFee(ctx, &relayerset.CalculateTransactionFeeRequest{ + RelayerId: &relayerset.RelayerId{ + Network: e.relayID.Network, + ChainId: e.relayID.ChainID, + }, + Request: in}, + opts...) +} + +func (e *evmClient) SubmitTransaction(ctx context.Context, in *evmpb.SubmitTransactionRequest, opts ...grpc.CallOption) (*evmpb.SubmitTransactionReply, error) { + return e.client.SubmitTransaction(ctx, &relayerset.SubmitTransactionRequest{ + RelayerId: &relayerset.RelayerId{ + Network: e.relayID.Network, + ChainId: e.relayID.ChainID, + }, + Request: in}, + opts...) +} + var _ evmpb.EVMClient = (*evmClient)(nil) func (e evmClient) GetTransactionFee(ctx context.Context, in *evmpb.GetTransactionFeeRequest, opts ...grpc.CallOption) (*evmpb.GetTransactionFeeReply, error) { @@ -362,6 +382,46 @@ func (s *Server) GetTransactionStatus(ctx context.Context, request *relayerset.G return &evmpb.GetTransactionStatusReply{TransactionStatus: evmpb.TransactionStatus(txStatus)}, nil } +func (s *Server) SubmitTransaction(ctx context.Context, request *relayerset.SubmitTransactionRequest) (*evmpb.SubmitTransactionReply, error) { + evmService, err := s.getEVMService(ctx, request.GetRelayerId()) + if err != nil { + return nil, err + } + + txResult, err := evmService.SubmitTransaction(ctx, evm.SubmitTransactionRequest{ + To: evm.Address(request.GetRequest().To), + Data: evm.ABIPayload(request.GetRequest().Data), + GasConfig: evmpb.ConvertGasConfigFromProto(request.GetRequest().GetGasConfig()), + }) + if err != nil { + return nil, err + } + + return &evmpb.SubmitTransactionReply{ + TxHash: txResult.TxHash[:], + TxStatus: evmpb.ConvertTxStatusToProto(txResult.TxStatus), + }, nil +} + +func (s *Server) CalculateTransactionFee(ctx context.Context, request *relayerset.CalculateTransactionFeeRequest) (*evmpb.CalculateTransactionFeeReply, error) { + evmService, err := s.getEVMService(ctx, request.GetRelayerId()) + if err != nil { + return nil, err + } + + fee, err := evmService.CalculateTransactionFee(ctx, evm.ReceiptGasInfo{ + GasUsed: request.GetRequest().GasInfo.GasUsed, + EffectiveGasPrice: valuespb.NewIntFromBigInt(request.GetRequest().GasInfo.EffectiveGasPrice), + }) + if err != nil { + return nil, err + } + + return &evmpb.CalculateTransactionFeeReply{ + TransactionFee: valuespb.NewBigIntFromInt(fee.TransactionFee), + }, nil +} + func (s *Server) getEVMService(ctx context.Context, id *relayerset.RelayerId) (types.EVMService, error) { r, err := s.getRelayer(ctx, id) if err != nil { diff --git a/pkg/loop/internal/relayerset/relayerset_test.go b/pkg/loop/internal/relayerset/relayerset_test.go index 994c4ed922..110dd4c35d 100644 --- a/pkg/loop/internal/relayerset/relayerset_test.go +++ b/pkg/loop/internal/relayerset/relayerset_test.go @@ -425,13 +425,45 @@ func Test_RelayerSet_EVMService(t *testing.T) { require.Equal(t, &evmLog, out[0]) }, }, + { + name: "SubmitTransaction", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + txRequest := evmtypes.SubmitTransactionRequest{ + To: address1, + Data: []byte("data"), + } + expectedTxResult := evmtypes.TransactionResult{ + TxStatus: evmtypes.TxSuccess, + TxHash: evmtypes.Hash{1, 2, 3}, + } + mockEVM.EXPECT().SubmitTransaction(mock.Anything, txRequest).Return(&expectedTxResult, nil) + txResult, err := evm.SubmitTransaction(ctx, txRequest) + require.NoError(t, err) + require.Equal(t, &expectedTxResult, txResult) + }, + }, + { + name: "CalculateTransactionFee", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + gasInfo := evmtypes.ReceiptGasInfo{ + GasUsed: 1000, + EffectiveGasPrice: big.NewInt(2000), + } + expectedFee := &evmtypes.TransactionFee{ + TransactionFee: big.NewInt(2000000), + } + mockEVM.EXPECT().CalculateTransactionFee(mock.Anything, gasInfo).Return(expectedFee, nil) + fee, err := evm.CalculateTransactionFee(ctx, gasInfo) + require.NoError(t, err) + require.Equal(t, expectedFee, fee) + }, + }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { mockEVM := mocks2.NewEVMService(t) - evm := TestEVM{mockedContractReader: mockEVM} - relayer1.On("EVM", mock.Anything, mock.Anything).Return(evm, nil).Once() + relayer1.On("EVM", mock.Anything, mock.Anything).Return(mockEVM, nil).Once() fetchedEVM, err := retrievedRelayer.EVM() require.NoError(t, err) @@ -497,6 +529,14 @@ type TestEVM struct { mockedContractReader *mocks2.EVMService } +func (t *TestEVM) CalculateTransactionFee(ctx context.Context, receipt evmtypes.ReceiptGasInfo) (*evmtypes.TransactionFee, error) { + return t.mockedContractReader.CalculateTransactionFee(ctx, receipt) +} + +func (t *TestEVM) SubmitTransaction(ctx context.Context, txRequest evmtypes.SubmitTransactionRequest) (*evmtypes.TransactionResult, error) { + return t.mockedContractReader.SubmitTransaction(ctx, txRequest) +} + func (t TestEVM) CallContract(ctx context.Context, msg *evmtypes.CallMsg, blockNumber *big.Int) ([]byte, error) { return t.mockedContractReader.CallContract(ctx, msg, blockNumber) } diff --git a/pkg/monitoring/go.mod b/pkg/monitoring/go.mod index 4a1219bf10..371e5a0d21 100644 --- a/pkg/monitoring/go.mod +++ b/pkg/monitoring/go.mod @@ -9,7 +9,7 @@ require ( github.com/linkedin/goavro/v2 v2.12.0 github.com/prometheus/client_golang v1.21.1 github.com/riferrei/srclient v0.5.4 - github.com/smartcontractkit/chainlink-common v0.7.1-0.20250616192719-9839ff5867ae + github.com/smartcontractkit/chainlink-common v0.7.1-0.20250617211352-85557b9d591b github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/stretchr/testify v1.10.0 go.uber.org/goleak v1.3.0 diff --git a/pkg/monitoring/go.sum b/pkg/monitoring/go.sum index e639b251f4..1a3ea36e5a 100644 --- a/pkg/monitoring/go.sum +++ b/pkg/monitoring/go.sum @@ -141,8 +141,8 @@ github.com/shirou/gopsutil/v4 v4.25.2 h1:NMscG3l2CqtWFS86kj3vP7soOczqrQYIEhO/pMv github.com/shirou/gopsutil/v4 v4.25.2/go.mod h1:34gBYJzyqCDT11b6bMHP0XCvWeU3J61XRT7a2EmCRTA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartcontractkit/chainlink-common v0.7.1-0.20250616192719-9839ff5867ae h1:vKeS5Xfo6SL5dfixJHimYkFyVEl6Kimn3DBSgTM8Rao= -github.com/smartcontractkit/chainlink-common v0.7.1-0.20250616192719-9839ff5867ae/go.mod h1:1ntZ0rtQpPx6h+xlcOJp0ccqHFaxTzW2Z62FJG358q0= +github.com/smartcontractkit/chainlink-common v0.7.1-0.20250617211352-85557b9d591b h1:ulKyrSPMsvYqtXFBd9Oq/QF+amsaqmBQFezzXXoqkfk= +github.com/smartcontractkit/chainlink-common v0.7.1-0.20250617211352-85557b9d591b/go.mod h1:1ntZ0rtQpPx6h+xlcOJp0ccqHFaxTzW2Z62FJG358q0= github.com/smartcontractkit/freeport v0.1.1 h1:B5fhEtmgomdIhw03uPVbVTP6oPv27fBhZsoZZMSIS8I= github.com/smartcontractkit/freeport v0.1.1/go.mod h1:T4zH9R8R8lVWKfU7tUvYz2o2jMv1OpGCdpY2j2QZXzU= github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= diff --git a/pkg/types/chains/evm/evm.go b/pkg/types/chains/evm/evm.go index aff8524599..dac1459b14 100644 --- a/pkg/types/chains/evm/evm.go +++ b/pkg/types/chains/evm/evm.go @@ -1,6 +1,7 @@ package evm import ( + "fmt" "math/big" "time" ) @@ -84,6 +85,11 @@ type Transaction struct { Value *big.Int // amount of eth sent in wei } +type ReceiptGasInfo struct { + GasUsed uint64 // actual gas used during execution in gas units + EffectiveGasPrice *big.Int // actual price in wei paid per gas unit +} + // matches evm-style receipt type Receipt struct { Status uint64 // 1 for success 0 for revert @@ -108,3 +114,51 @@ type Head struct { type TransactionFee struct { TransactionFee *big.Int // Cost of transaction in wei } + +type SignedReport struct { + RawReport []byte + ReportContext []byte + Signatures [][]byte + ID []byte +} + +// TransactionStatus is the result of the transaction sent to the chain +type TransactionStatus int + +const ( + // Transaction processing failed due to a network issue, RPC issue, or other fatal error + TxFatal TransactionStatus = iota + // Transaction was sent successfully to the chain but the smart contract execution reverted + TxReverted + // Transaction was sent successfully to the chain, smart contract executed successfully and mined into a block. + TxSuccess +) + +type TxError struct { + // Internal ID used for tracking purposes of transactions. + TxID string +} + +func (e *TxError) Error() string { + return fmt.Sprintf("Fail processing Transaction with internal TxID: %s", e.TxID) +} + +// PLEX-1524 - Refactor this to return the Tx Hash in a Transaction type and a second return value for the TxStatus. We may even be able to return the whole transaction object instead of just the hash. +type TransactionResult struct { + TxStatus TransactionStatus + TxHash Hash +} + +type GasConfig struct { + // Default to nil. If not specified the value configured in GasEstimator will be used + GasLimit *uint64 + // Default to nil. If not specified the value configured in GasEstimator will be used + MaxGasPrice *big.Int +} + +type SubmitTransactionRequest struct { + To Address + Data ABIPayload + // Default to nil. If not specified the configured gas estimator config will be used + GasConfig *GasConfig +} diff --git a/pkg/types/mocks/evm_service.go b/pkg/types/mocks/evm_service.go index 496f91154c..2d5408fb90 100644 --- a/pkg/types/mocks/evm_service.go +++ b/pkg/types/mocks/evm_service.go @@ -89,6 +89,65 @@ func (_c *EVMService_BalanceAt_Call) RunAndReturn(run func(context.Context, [20] return _c } +// CalculateTransactionFee provides a mock function with given fields: ctx, receiptGasInfo +func (_m *EVMService) CalculateTransactionFee(ctx context.Context, receiptGasInfo evm.ReceiptGasInfo) (*evm.TransactionFee, error) { + ret := _m.Called(ctx, receiptGasInfo) + + if len(ret) == 0 { + panic("no return value specified for CalculateTransactionFee") + } + + var r0 *evm.TransactionFee + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, evm.ReceiptGasInfo) (*evm.TransactionFee, error)); ok { + return rf(ctx, receiptGasInfo) + } + if rf, ok := ret.Get(0).(func(context.Context, evm.ReceiptGasInfo) *evm.TransactionFee); ok { + r0 = rf(ctx, receiptGasInfo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*evm.TransactionFee) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, evm.ReceiptGasInfo) error); ok { + r1 = rf(ctx, receiptGasInfo) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EVMService_CalculateTransactionFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CalculateTransactionFee' +type EVMService_CalculateTransactionFee_Call struct { + *mock.Call +} + +// CalculateTransactionFee is a helper method to define mock.On call +// - ctx context.Context +// - receiptGasInfo evm.ReceiptGasInfo +func (_e *EVMService_Expecter) CalculateTransactionFee(ctx interface{}, receiptGasInfo interface{}) *EVMService_CalculateTransactionFee_Call { + return &EVMService_CalculateTransactionFee_Call{Call: _e.mock.On("CalculateTransactionFee", ctx, receiptGasInfo)} +} + +func (_c *EVMService_CalculateTransactionFee_Call) Run(run func(ctx context.Context, receiptGasInfo evm.ReceiptGasInfo)) *EVMService_CalculateTransactionFee_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(evm.ReceiptGasInfo)) + }) + return _c +} + +func (_c *EVMService_CalculateTransactionFee_Call) Return(_a0 *evm.TransactionFee, _a1 error) *EVMService_CalculateTransactionFee_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EVMService_CalculateTransactionFee_Call) RunAndReturn(run func(context.Context, evm.ReceiptGasInfo) (*evm.TransactionFee, error)) *EVMService_CalculateTransactionFee_Call { + _c.Call.Return(run) + return _c +} + // CallContract provides a mock function with given fields: ctx, msg, blockNumber func (_m *EVMService) CallContract(ctx context.Context, msg *evm.CallMsg, blockNumber *big.Int) ([]byte, error) { ret := _m.Called(ctx, msg, blockNumber) @@ -670,6 +729,65 @@ func (_c *EVMService_RegisterLogTracking_Call) RunAndReturn(run func(context.Con return _c } +// SubmitTransaction provides a mock function with given fields: ctx, txRequest +func (_m *EVMService) SubmitTransaction(ctx context.Context, txRequest evm.SubmitTransactionRequest) (*evm.TransactionResult, error) { + ret := _m.Called(ctx, txRequest) + + if len(ret) == 0 { + panic("no return value specified for SubmitTransaction") + } + + var r0 *evm.TransactionResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, evm.SubmitTransactionRequest) (*evm.TransactionResult, error)); ok { + return rf(ctx, txRequest) + } + if rf, ok := ret.Get(0).(func(context.Context, evm.SubmitTransactionRequest) *evm.TransactionResult); ok { + r0 = rf(ctx, txRequest) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*evm.TransactionResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, evm.SubmitTransactionRequest) error); ok { + r1 = rf(ctx, txRequest) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EVMService_SubmitTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubmitTransaction' +type EVMService_SubmitTransaction_Call struct { + *mock.Call +} + +// SubmitTransaction is a helper method to define mock.On call +// - ctx context.Context +// - txRequest evm.SubmitTransactionRequest +func (_e *EVMService_Expecter) SubmitTransaction(ctx interface{}, txRequest interface{}) *EVMService_SubmitTransaction_Call { + return &EVMService_SubmitTransaction_Call{Call: _e.mock.On("SubmitTransaction", ctx, txRequest)} +} + +func (_c *EVMService_SubmitTransaction_Call) Run(run func(ctx context.Context, txRequest evm.SubmitTransactionRequest)) *EVMService_SubmitTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(evm.SubmitTransactionRequest)) + }) + return _c +} + +func (_c *EVMService_SubmitTransaction_Call) Return(_a0 *evm.TransactionResult, _a1 error) *EVMService_SubmitTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EVMService_SubmitTransaction_Call) RunAndReturn(run func(context.Context, evm.SubmitTransactionRequest) (*evm.TransactionResult, error)) *EVMService_SubmitTransaction_Call { + _c.Call.Return(run) + return _c +} + // UnregisterLogTracking provides a mock function with given fields: ctx, filterName func (_m *EVMService) UnregisterLogTracking(ctx context.Context, filterName string) error { ret := _m.Called(ctx, filterName) diff --git a/pkg/types/relayer.go b/pkg/types/relayer.go index 6497dfac1d..47e537fbfe 100644 --- a/pkg/types/relayer.go +++ b/pkg/types/relayer.go @@ -107,16 +107,16 @@ type GethClient interface { // FinalizedBlockNumber(-3) → last finalized block (“finalized”) // // Any positive value is treated as an explicit block height. +} + +type EVMService interface { + GethClient CallContract(ctx context.Context, msg *evm.CallMsg, blockNumber *big.Int) ([]byte, error) FilterLogs(ctx context.Context, filterQuery evm.FilterQuery) ([]*evm.Log, error) BalanceAt(ctx context.Context, account evm.Address, blockNumber *big.Int) (*big.Int, error) EstimateGas(ctx context.Context, call *evm.CallMsg) (uint64, error) GetTransactionByHash(ctx context.Context, hash evm.Hash) (*evm.Transaction, error) GetTransactionReceipt(ctx context.Context, txHash evm.Hash) (*evm.Receipt, error) -} - -type EVMService interface { - GethClient // RegisterLogTracking registers a persistent log filter for tracking and caching logs // based on the provided filter parameters. Once registered, matching logs will be collected @@ -141,6 +141,12 @@ type EVMService interface { // GetTransactionFee retrieves the fee of a transaction in wei from the underlying chain GetTransactionFee(ctx context.Context, transactionID IdempotencyKey) (*evm.TransactionFee, error) + // Submits a transaction to the EVM chain. It will return once the transaction is included in a block or an error occurs. + SubmitTransaction(ctx context.Context, txRequest evm.SubmitTransactionRequest) (*evm.TransactionResult, error) + + // Utility function to calculate the total fee based on a tx receipt + CalculateTransactionFee(ctx context.Context, receiptGasInfo evm.ReceiptGasInfo) (*evm.TransactionFee, error) + // GetTransactionStatus returns the current status of a transaction in the underlying chain's TXM. GetTransactionStatus(ctx context.Context, transactionID IdempotencyKey) (TransactionStatus, error) }