From eded6d02be18c23dd99a6a0cf8018e61cca1a1e0 Mon Sep 17 00:00:00 2001 From: Dmytro Haidashenko Date: Fri, 10 Jul 2026 17:28:51 +0200 Subject: [PATCH] PLEX-3129 EVM LP allow to fast forward to a block --- pkg/chains/evm/evm.pb.go | 168 ++++++++++++++++++---------- pkg/chains/evm/evm.proto | 5 + pkg/chains/evm/evm_grpc.pb.go | 38 +++++++ pkg/loop/internal/relayer/evm.go | 12 ++ pkg/loop/internal/relayerset/evm.go | 17 +++ pkg/types/mocks/evm_service.go | 47 ++++++++ pkg/types/relayer.go | 7 ++ 7 files changed, 235 insertions(+), 59 deletions(-) diff --git a/pkg/chains/evm/evm.pb.go b/pkg/chains/evm/evm.pb.go index 557058d5e5..5fbdaf195b 100644 --- a/pkg/chains/evm/evm.pb.go +++ b/pkg/chains/evm/evm.pb.go @@ -3011,6 +3011,50 @@ func (x *GetFiltersNamesReply) GetItems() []string { return nil } +type LPSkipToBlockRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + BlockNumber int64 `protobuf:"varint,1,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"` // block number to skip to + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LPSkipToBlockRequest) Reset() { + *x = LPSkipToBlockRequest{} + mi := &file_evm_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LPSkipToBlockRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LPSkipToBlockRequest) ProtoMessage() {} + +func (x *LPSkipToBlockRequest) ProtoReflect() protoreflect.Message { + mi := &file_evm_proto_msgTypes[49] + 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 LPSkipToBlockRequest.ProtoReflect.Descriptor instead. +func (*LPSkipToBlockRequest) Descriptor() ([]byte, []int) { + return file_evm_proto_rawDescGZIP(), []int{49} +} + +func (x *LPSkipToBlockRequest) GetBlockNumber() int64 { + if x != nil { + return x.BlockNumber + } + return 0 +} + var File_evm_proto protoreflect.FileDescriptor const file_evm_proto_rawDesc = "" + @@ -3210,7 +3254,9 @@ const file_evm_proto_rawDesc = "" + "\x17GetForwarderForEOAReply\x12\x12\n" + "\x04addr\x18\x01 \x01(\fR\x04addr\",\n" + "\x14GetFiltersNamesReply\x12\x14\n" + - "\x05items\x18\x01 \x03(\tR\x05items*9\n" + + "\x05items\x18\x01 \x03(\tR\x05items\"9\n" + + "\x14LPSkipToBlockRequest\x12!\n" + + "\fblock_number\x18\x01 \x01(\x03R\vblockNumber*9\n" + "\bTxStatus\x12\f\n" + "\bTX_FATAL\x10\x00\x12\x0f\n" + "\vTX_REVERTED\x10\x01\x12\x0e\n" + @@ -3222,7 +3268,7 @@ const file_evm_proto_rawDesc = "" + "\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\xc5\v\n" + + "\x18TRANSACTION_STATUS_FATAL\x10\x052\x8e\f\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" + @@ -3241,7 +3287,8 @@ const file_evm_proto_rawDesc = "" + "\x11SubmitTransaction\x12\".loop.evm.SubmitTransactionRequest\x1a .loop.evm.SubmitTransactionReply\x12k\n" + "\x17CalculateTransactionFee\x12(.loop.evm.CalculateTransactionFeeRequest\x1a&.loop.evm.CalculateTransactionFeeReply\x12\\\n" + "\x12GetForwarderForEOA\x12#.loop.evm.GetForwarderForEOARequest\x1a!.loop.evm.GetForwarderForEOAReply\x12K\n" + - "\x10GetLatestLPBlock\x12\x16.google.protobuf.Empty\x1a\x1f.loop.evm.GetLatestLPBlockReplyB=Z;github.com/smartcontractkit/chainlink-common/pkg/chains/evmb\x06proto3" + "\x10GetLatestLPBlock\x12\x16.google.protobuf.Empty\x1a\x1f.loop.evm.GetLatestLPBlockReply\x12G\n" + + "\rLPSkipToBlock\x12\x1e.loop.evm.LPSkipToBlockRequest\x1a\x16.google.protobuf.EmptyB=Z;github.com/smartcontractkit/chainlink-common/pkg/chains/evmb\x06proto3" var ( file_evm_proto_rawDescOnce sync.Once @@ -3256,7 +3303,7 @@ func file_evm_proto_rawDescGZIP() []byte { } var file_evm_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_evm_proto_msgTypes = make([]protoimpl.MessageInfo, 49) +var file_evm_proto_msgTypes = make([]protoimpl.MessageInfo, 50) var file_evm_proto_goTypes = []any{ (TxStatus)(0), // 0: loop.evm.TxStatus (TransactionStatus)(0), // 1: loop.evm.TransactionStatus @@ -3309,64 +3356,65 @@ var file_evm_proto_goTypes = []any{ (*GetForwarderForEOARequest)(nil), // 48: loop.evm.GetForwarderForEOARequest (*GetForwarderForEOAReply)(nil), // 49: loop.evm.GetForwarderForEOAReply (*GetFiltersNamesReply)(nil), // 50: loop.evm.GetFiltersNamesReply - (*pb.BigInt)(nil), // 51: values.v1.BigInt - (chain_common.BooleanOperator)(0), // 52: loop.chain.common.BooleanOperator - (chain_common.ComparisonOperator)(0), // 53: loop.chain.common.ComparisonOperator - (*chain_common.Primitive)(nil), // 54: loop.chain.common.Primitive - (chain_common.Confidence)(0), // 55: loop.chain.common.Confidence - (*chain_common.LimitAndSort)(nil), // 56: loop.chain.common.LimitAndSort - (*emptypb.Empty)(nil), // 57: google.protobuf.Empty + (*LPSkipToBlockRequest)(nil), // 51: loop.evm.LPSkipToBlockRequest + (*pb.BigInt)(nil), // 52: values.v1.BigInt + (chain_common.BooleanOperator)(0), // 53: loop.chain.common.BooleanOperator + (chain_common.ComparisonOperator)(0), // 54: loop.chain.common.ComparisonOperator + (*chain_common.Primitive)(nil), // 55: loop.chain.common.Primitive + (chain_common.Confidence)(0), // 56: loop.chain.common.Confidence + (*chain_common.LimitAndSort)(nil), // 57: loop.chain.common.LimitAndSort + (*emptypb.Empty)(nil), // 58: google.protobuf.Empty } var file_evm_proto_depIdxs = []int32{ - 51, // 0: loop.evm.Log.block_number:type_name -> values.v1.BigInt - 51, // 1: loop.evm.FilterQuery.fromBlock:type_name -> values.v1.BigInt - 51, // 2: loop.evm.FilterQuery.toBlock:type_name -> values.v1.BigInt + 52, // 0: loop.evm.Log.block_number:type_name -> values.v1.BigInt + 52, // 1: loop.evm.FilterQuery.fromBlock:type_name -> values.v1.BigInt + 52, // 2: loop.evm.FilterQuery.toBlock:type_name -> values.v1.BigInt 3, // 3: loop.evm.FilterQuery.topics:type_name -> loop.evm.Topics - 51, // 4: loop.evm.Transaction.value:type_name -> values.v1.BigInt - 51, // 5: loop.evm.Transaction.gas_price:type_name -> values.v1.BigInt + 52, // 4: loop.evm.Transaction.value:type_name -> values.v1.BigInt + 52, // 5: loop.evm.Transaction.gas_price:type_name -> values.v1.BigInt 4, // 6: loop.evm.Receipt.logs:type_name -> loop.evm.Log - 51, // 7: loop.evm.Receipt.effective_gas_price:type_name -> values.v1.BigInt - 51, // 8: loop.evm.Receipt.block_number:type_name -> values.v1.BigInt - 51, // 9: loop.evm.Receipt.l1_Fee:type_name -> values.v1.BigInt - 51, // 10: loop.evm.Header.block_number:type_name -> values.v1.BigInt + 52, // 7: loop.evm.Receipt.effective_gas_price:type_name -> values.v1.BigInt + 52, // 8: loop.evm.Receipt.block_number:type_name -> values.v1.BigInt + 52, // 9: loop.evm.Receipt.l1_Fee:type_name -> values.v1.BigInt + 52, // 10: loop.evm.Header.block_number:type_name -> values.v1.BigInt 18, // 11: loop.evm.Expression.primitive:type_name -> loop.evm.Primitive 12, // 12: loop.evm.Expression.boolean_expression:type_name -> loop.evm.BooleanExpression - 52, // 13: loop.evm.BooleanExpression.boolean_operator:type_name -> loop.chain.common.BooleanOperator + 53, // 13: loop.evm.BooleanExpression.boolean_operator:type_name -> loop.chain.common.BooleanOperator 11, // 14: loop.evm.BooleanExpression.expression:type_name -> loop.evm.Expression 11, // 15: loop.evm.And.expr:type_name -> loop.evm.Expression 11, // 16: loop.evm.Or.expr:type_name -> loop.evm.Expression - 53, // 17: loop.evm.HashValueComparator.operator:type_name -> loop.chain.common.ComparisonOperator + 54, // 17: loop.evm.HashValueComparator.operator:type_name -> loop.chain.common.ComparisonOperator 15, // 18: loop.evm.EventByWord.hashed_value_comparers:type_name -> loop.evm.HashValueComparator 15, // 19: loop.evm.EventByTopic.hashed_value_comparers:type_name -> loop.evm.HashValueComparator - 54, // 20: loop.evm.Primitive.general_primitive:type_name -> loop.chain.common.Primitive + 55, // 20: loop.evm.Primitive.general_primitive:type_name -> loop.chain.common.Primitive 16, // 21: loop.evm.Primitive.event_by_word:type_name -> loop.evm.EventByWord 17, // 22: loop.evm.Primitive.event_by_topic:type_name -> loop.evm.EventByTopic - 51, // 23: loop.evm.HeaderByNumberRequest.block_number:type_name -> values.v1.BigInt - 55, // 24: loop.evm.HeaderByNumberRequest.confidence_level:type_name -> loop.chain.common.Confidence + 52, // 23: loop.evm.HeaderByNumberRequest.block_number:type_name -> values.v1.BigInt + 56, // 24: loop.evm.HeaderByNumberRequest.confidence_level:type_name -> loop.chain.common.Confidence 9, // 25: loop.evm.HeaderByNumberReply.header:type_name -> loop.evm.Header 2, // 26: loop.evm.CallContractRequest.call:type_name -> loop.evm.CallMsg - 51, // 27: loop.evm.CallContractRequest.block_number:type_name -> values.v1.BigInt - 55, // 28: loop.evm.CallContractRequest.confidence_level:type_name -> loop.chain.common.Confidence - 51, // 29: loop.evm.GetTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt + 52, // 27: loop.evm.CallContractRequest.block_number:type_name -> values.v1.BigInt + 56, // 28: loop.evm.CallContractRequest.confidence_level:type_name -> loop.chain.common.Confidence + 52, // 29: loop.evm.GetTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt 5, // 30: loop.evm.FilterLogsRequest.filter_query:type_name -> loop.evm.FilterQuery - 55, // 31: loop.evm.FilterLogsRequest.confidence_level:type_name -> loop.chain.common.Confidence + 56, // 31: loop.evm.FilterLogsRequest.confidence_level:type_name -> loop.chain.common.Confidence 4, // 32: loop.evm.FilterLogsReply.logs:type_name -> loop.evm.Log - 51, // 33: loop.evm.BalanceAtRequest.block_number:type_name -> values.v1.BigInt - 55, // 34: loop.evm.BalanceAtRequest.confidence_level:type_name -> loop.chain.common.Confidence - 51, // 35: loop.evm.BalanceAtReply.balance:type_name -> values.v1.BigInt + 52, // 33: loop.evm.BalanceAtRequest.block_number:type_name -> values.v1.BigInt + 56, // 34: loop.evm.BalanceAtRequest.confidence_level:type_name -> loop.chain.common.Confidence + 52, // 35: loop.evm.BalanceAtReply.balance:type_name -> values.v1.BigInt 2, // 36: loop.evm.EstimateGasRequest.msg:type_name -> loop.evm.CallMsg 6, // 37: loop.evm.GetTransactionByHashReply.transaction:type_name -> loop.evm.Transaction 7, // 38: loop.evm.GetTransactionReceiptReply.receipt:type_name -> loop.evm.Receipt 8, // 39: loop.evm.RegisterLogTrackingRequest.filter:type_name -> loop.evm.LPFilter 11, // 40: loop.evm.QueryTrackedLogsRequest.expression:type_name -> loop.evm.Expression - 56, // 41: loop.evm.QueryTrackedLogsRequest.limit_and_sort:type_name -> loop.chain.common.LimitAndSort - 55, // 42: loop.evm.QueryTrackedLogsRequest.confidence_level:type_name -> loop.chain.common.Confidence + 57, // 41: loop.evm.QueryTrackedLogsRequest.limit_and_sort:type_name -> loop.chain.common.LimitAndSort + 56, // 42: loop.evm.QueryTrackedLogsRequest.confidence_level:type_name -> loop.chain.common.Confidence 4, // 43: loop.evm.QueryTrackedLogsReply.logs:type_name -> loop.evm.Log 10, // 44: loop.evm.GetLatestLPBlockReply.lp_block:type_name -> loop.evm.LPBlock 42, // 45: loop.evm.CalculateTransactionFeeRequest.gas_info:type_name -> loop.evm.ReceiptGasInfo - 51, // 46: loop.evm.ReceiptGasInfo.effective_gas_price:type_name -> values.v1.BigInt - 51, // 47: loop.evm.ReceiptGasInfo.l1_Fee:type_name -> values.v1.BigInt - 51, // 48: loop.evm.CalculateTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt + 52, // 46: loop.evm.ReceiptGasInfo.effective_gas_price:type_name -> values.v1.BigInt + 52, // 47: loop.evm.ReceiptGasInfo.l1_Fee:type_name -> values.v1.BigInt + 52, // 48: loop.evm.CalculateTransactionFeeReply.transaction_fee:type_name -> values.v1.BigInt 40, // 49: loop.evm.SubmitTransactionRequest.gas_config:type_name -> loop.evm.GasConfig 0, // 50: loop.evm.SubmitTransactionReply.txStatus:type_name -> loop.evm.TxStatus 1, // 51: loop.evm.GetTransactionStatusReply.transaction_status:type_name -> loop.evm.TransactionStatus @@ -3379,33 +3427,35 @@ var file_evm_proto_depIdxs = []int32{ 33, // 58: loop.evm.EVM.GetTransactionReceipt:input_type -> loop.evm.GetTransactionReceiptRequest 19, // 59: loop.evm.EVM.HeaderByNumber:input_type -> loop.evm.HeaderByNumberRequest 37, // 60: loop.evm.EVM.QueryTrackedLogs:input_type -> loop.evm.QueryTrackedLogsRequest - 57, // 61: loop.evm.EVM.GetFiltersNames:input_type -> google.protobuf.Empty + 58, // 61: loop.evm.EVM.GetFiltersNames:input_type -> google.protobuf.Empty 35, // 62: loop.evm.EVM.RegisterLogTracking:input_type -> loop.evm.RegisterLogTrackingRequest 36, // 63: loop.evm.EVM.UnregisterLogTracking:input_type -> loop.evm.UnregisterLogTrackingRequest 46, // 64: loop.evm.EVM.GetTransactionStatus:input_type -> loop.evm.GetTransactionStatusRequest 44, // 65: loop.evm.EVM.SubmitTransaction:input_type -> loop.evm.SubmitTransactionRequest 41, // 66: loop.evm.EVM.CalculateTransactionFee:input_type -> loop.evm.CalculateTransactionFeeRequest 48, // 67: loop.evm.EVM.GetForwarderForEOA:input_type -> loop.evm.GetForwarderForEOARequest - 57, // 68: loop.evm.EVM.GetLatestLPBlock:input_type -> google.protobuf.Empty - 24, // 69: loop.evm.EVM.GetTransactionFee:output_type -> loop.evm.GetTransactionFeeReply - 22, // 70: loop.evm.EVM.CallContract:output_type -> loop.evm.CallContractReply - 26, // 71: loop.evm.EVM.FilterLogs:output_type -> loop.evm.FilterLogsReply - 28, // 72: loop.evm.EVM.BalanceAt:output_type -> loop.evm.BalanceAtReply - 30, // 73: loop.evm.EVM.EstimateGas:output_type -> loop.evm.EstimateGasReply - 32, // 74: loop.evm.EVM.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply - 34, // 75: loop.evm.EVM.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply - 20, // 76: loop.evm.EVM.HeaderByNumber:output_type -> loop.evm.HeaderByNumberReply - 38, // 77: loop.evm.EVM.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply - 50, // 78: loop.evm.EVM.GetFiltersNames:output_type -> loop.evm.GetFiltersNamesReply - 57, // 79: loop.evm.EVM.RegisterLogTracking:output_type -> google.protobuf.Empty - 57, // 80: loop.evm.EVM.UnregisterLogTracking:output_type -> google.protobuf.Empty - 47, // 81: loop.evm.EVM.GetTransactionStatus:output_type -> loop.evm.GetTransactionStatusReply - 45, // 82: loop.evm.EVM.SubmitTransaction:output_type -> loop.evm.SubmitTransactionReply - 43, // 83: loop.evm.EVM.CalculateTransactionFee:output_type -> loop.evm.CalculateTransactionFeeReply - 49, // 84: loop.evm.EVM.GetForwarderForEOA:output_type -> loop.evm.GetForwarderForEOAReply - 39, // 85: loop.evm.EVM.GetLatestLPBlock:output_type -> loop.evm.GetLatestLPBlockReply - 69, // [69:86] is the sub-list for method output_type - 52, // [52:69] is the sub-list for method input_type + 58, // 68: loop.evm.EVM.GetLatestLPBlock:input_type -> google.protobuf.Empty + 51, // 69: loop.evm.EVM.LPSkipToBlock:input_type -> loop.evm.LPSkipToBlockRequest + 24, // 70: loop.evm.EVM.GetTransactionFee:output_type -> loop.evm.GetTransactionFeeReply + 22, // 71: loop.evm.EVM.CallContract:output_type -> loop.evm.CallContractReply + 26, // 72: loop.evm.EVM.FilterLogs:output_type -> loop.evm.FilterLogsReply + 28, // 73: loop.evm.EVM.BalanceAt:output_type -> loop.evm.BalanceAtReply + 30, // 74: loop.evm.EVM.EstimateGas:output_type -> loop.evm.EstimateGasReply + 32, // 75: loop.evm.EVM.GetTransactionByHash:output_type -> loop.evm.GetTransactionByHashReply + 34, // 76: loop.evm.EVM.GetTransactionReceipt:output_type -> loop.evm.GetTransactionReceiptReply + 20, // 77: loop.evm.EVM.HeaderByNumber:output_type -> loop.evm.HeaderByNumberReply + 38, // 78: loop.evm.EVM.QueryTrackedLogs:output_type -> loop.evm.QueryTrackedLogsReply + 50, // 79: loop.evm.EVM.GetFiltersNames:output_type -> loop.evm.GetFiltersNamesReply + 58, // 80: loop.evm.EVM.RegisterLogTracking:output_type -> google.protobuf.Empty + 58, // 81: loop.evm.EVM.UnregisterLogTracking:output_type -> google.protobuf.Empty + 47, // 82: loop.evm.EVM.GetTransactionStatus:output_type -> loop.evm.GetTransactionStatusReply + 45, // 83: loop.evm.EVM.SubmitTransaction:output_type -> loop.evm.SubmitTransactionReply + 43, // 84: loop.evm.EVM.CalculateTransactionFee:output_type -> loop.evm.CalculateTransactionFeeReply + 49, // 85: loop.evm.EVM.GetForwarderForEOA:output_type -> loop.evm.GetForwarderForEOAReply + 39, // 86: loop.evm.EVM.GetLatestLPBlock:output_type -> loop.evm.GetLatestLPBlockReply + 58, // 87: loop.evm.EVM.LPSkipToBlock:output_type -> google.protobuf.Empty + 70, // [70:88] is the sub-list for method output_type + 52, // [52:70] is the sub-list for method input_type 52, // [52:52] is the sub-list for extension type_name 52, // [52:52] is the sub-list for extension extendee 0, // [0:52] is the sub-list for field type_name @@ -3434,7 +3484,7 @@ func file_evm_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_evm_proto_rawDesc), len(file_evm_proto_rawDesc)), NumEnums: 2, - NumMessages: 49, + NumMessages: 50, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/chains/evm/evm.proto b/pkg/chains/evm/evm.proto index 0e14774d1d..b7813578a7 100644 --- a/pkg/chains/evm/evm.proto +++ b/pkg/chains/evm/evm.proto @@ -25,6 +25,7 @@ service EVM{ rpc CalculateTransactionFee(CalculateTransactionFeeRequest) returns (CalculateTransactionFeeReply); rpc GetForwarderForEOA(GetForwarderForEOARequest) returns (GetForwarderForEOAReply); rpc GetLatestLPBlock(google.protobuf.Empty) returns (GetLatestLPBlockReply); + rpc LPSkipToBlock(LPSkipToBlockRequest) returns (google.protobuf.Empty); } // represents simplified evm-style CallMsg @@ -373,3 +374,7 @@ message GetForwarderForEOAReply { message GetFiltersNamesReply { repeated string items = 1; } + +message LPSkipToBlockRequest { + int64 block_number = 1; // block number to skip to +} diff --git a/pkg/chains/evm/evm_grpc.pb.go b/pkg/chains/evm/evm_grpc.pb.go index d97ee57012..e9d4bcbf9f 100644 --- a/pkg/chains/evm/evm_grpc.pb.go +++ b/pkg/chains/evm/evm_grpc.pb.go @@ -37,6 +37,7 @@ const ( EVM_CalculateTransactionFee_FullMethodName = "/loop.evm.EVM/CalculateTransactionFee" EVM_GetForwarderForEOA_FullMethodName = "/loop.evm.EVM/GetForwarderForEOA" EVM_GetLatestLPBlock_FullMethodName = "/loop.evm.EVM/GetLatestLPBlock" + EVM_LPSkipToBlock_FullMethodName = "/loop.evm.EVM/LPSkipToBlock" ) // EVMClient is the client API for EVM service. @@ -60,6 +61,7 @@ type EVMClient interface { CalculateTransactionFee(ctx context.Context, in *CalculateTransactionFeeRequest, opts ...grpc.CallOption) (*CalculateTransactionFeeReply, error) GetForwarderForEOA(ctx context.Context, in *GetForwarderForEOARequest, opts ...grpc.CallOption) (*GetForwarderForEOAReply, error) GetLatestLPBlock(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetLatestLPBlockReply, error) + LPSkipToBlock(ctx context.Context, in *LPSkipToBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } type eVMClient struct { @@ -240,6 +242,16 @@ func (c *eVMClient) GetLatestLPBlock(ctx context.Context, in *emptypb.Empty, opt return out, nil } +func (c *eVMClient) LPSkipToBlock(ctx context.Context, in *LPSkipToBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, EVM_LPSkipToBlock_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. @@ -261,6 +273,7 @@ type EVMServer interface { CalculateTransactionFee(context.Context, *CalculateTransactionFeeRequest) (*CalculateTransactionFeeReply, error) GetForwarderForEOA(context.Context, *GetForwarderForEOARequest) (*GetForwarderForEOAReply, error) GetLatestLPBlock(context.Context, *emptypb.Empty) (*GetLatestLPBlockReply, error) + LPSkipToBlock(context.Context, *LPSkipToBlockRequest) (*emptypb.Empty, error) mustEmbedUnimplementedEVMServer() } @@ -322,6 +335,9 @@ func (UnimplementedEVMServer) GetForwarderForEOA(context.Context, *GetForwarderF func (UnimplementedEVMServer) GetLatestLPBlock(context.Context, *emptypb.Empty) (*GetLatestLPBlockReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetLatestLPBlock not implemented") } +func (UnimplementedEVMServer) LPSkipToBlock(context.Context, *LPSkipToBlockRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method LPSkipToBlock not implemented") +} func (UnimplementedEVMServer) mustEmbedUnimplementedEVMServer() {} func (UnimplementedEVMServer) testEmbeddedByValue() {} @@ -649,6 +665,24 @@ func _EVM_GetLatestLPBlock_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _EVM_LPSkipToBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LPSkipToBlockRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EVMServer).LPSkipToBlock(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EVM_LPSkipToBlock_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EVMServer).LPSkipToBlock(ctx, req.(*LPSkipToBlockRequest)) + } + 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) @@ -724,6 +758,10 @@ var EVM_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetLatestLPBlock", Handler: _EVM_GetLatestLPBlock_Handler, }, + { + MethodName: "LPSkipToBlock", + Handler: _EVM_LPSkipToBlock_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "evm.proto", diff --git a/pkg/loop/internal/relayer/evm.go b/pkg/loop/internal/relayer/evm.go index 3d09f906fe..6f5a2a403c 100644 --- a/pkg/loop/internal/relayer/evm.go +++ b/pkg/loop/internal/relayer/evm.go @@ -303,6 +303,11 @@ func (e *EVMClient) GetLatestLPBlock(ctx context.Context) (*evmtypes.LPBlock, er }, nil } +func (e *EVMClient) LPSkipToBlock(ctx context.Context, blockNumber int64) error { + _, err := e.grpcClient.LPSkipToBlock(ctx, &evmpb.LPSkipToBlockRequest{BlockNumber: blockNumber}) + return net.WrapRPCErr(err) +} + type evmServer struct { evmpb.UnimplementedEVMServer @@ -570,6 +575,13 @@ func (e *evmServer) GetLatestLPBlock(ctx context.Context, _ *emptypb.Empty) (*ev }, nil } +func (e *evmServer) LPSkipToBlock(ctx context.Context, request *evmpb.LPSkipToBlockRequest) (*emptypb.Empty, error) { + if err := e.impl.LPSkipToBlock(ctx, request.GetBlockNumber()); err != nil { + return nil, err + } + return &emptypb.Empty{}, 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, diff --git a/pkg/loop/internal/relayerset/evm.go b/pkg/loop/internal/relayerset/evm.go index 2e9c81163e..c8b00278c8 100644 --- a/pkg/loop/internal/relayerset/evm.go +++ b/pkg/loop/internal/relayerset/evm.go @@ -95,6 +95,10 @@ func (e evmClient) GetLatestLPBlock(ctx context.Context, in *emptypb.Empty, opts return e.client.GetLatestLPBlock(appendRelayID(ctx, e.relayID), in, opts...) } +func (e evmClient) LPSkipToBlock(ctx context.Context, in *evmpb.LPSkipToBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + return e.client.LPSkipToBlock(appendRelayID(ctx, e.relayID), in, opts...) +} + type evmServer struct { evmpb.UnimplementedEVMServer parent *Server @@ -489,6 +493,19 @@ func (es *evmServer) GetLatestLPBlock(ctx context.Context, in *emptypb.Empty) (* }, nil } +func (es *evmServer) LPSkipToBlock(ctx context.Context, request *evmpb.LPSkipToBlockRequest) (*emptypb.Empty, error) { + evmService, err := es.parent.getEVMService(ctx) + if err != nil { + return nil, err + } + + if err = evmService.LPSkipToBlock(ctx, request.GetBlockNumber()); err != nil { + return nil, err + } + + return &emptypb.Empty{}, nil +} + func (es *evmServer) GetForwarderForEOA(ctx context.Context, request *evmpb.GetForwarderForEOARequest) (*evmpb.GetForwarderForEOAReply, error) { evmService, err := es.parent.getEVMService(ctx) if err != nil { diff --git a/pkg/types/mocks/evm_service.go b/pkg/types/mocks/evm_service.go index e6615a198c..9a4727c966 100644 --- a/pkg/types/mocks/evm_service.go +++ b/pkg/types/mocks/evm_service.go @@ -788,6 +788,53 @@ func (_c *EVMService_HeaderByNumber_Call) RunAndReturn(run func(context.Context, return _c } +// LPSkipToBlock provides a mock function with given fields: ctx, blockNumber +func (_m *EVMService) LPSkipToBlock(ctx context.Context, blockNumber int64) error { + ret := _m.Called(ctx, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for LPSkipToBlock") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, int64) error); ok { + r0 = rf(ctx, blockNumber) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EVMService_LPSkipToBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LPSkipToBlock' +type EVMService_LPSkipToBlock_Call struct { + *mock.Call +} + +// LPSkipToBlock is a helper method to define mock.On call +// - ctx context.Context +// - blockNumber int64 +func (_e *EVMService_Expecter) LPSkipToBlock(ctx interface{}, blockNumber interface{}) *EVMService_LPSkipToBlock_Call { + return &EVMService_LPSkipToBlock_Call{Call: _e.mock.On("LPSkipToBlock", ctx, blockNumber)} +} + +func (_c *EVMService_LPSkipToBlock_Call) Run(run func(ctx context.Context, blockNumber int64)) *EVMService_LPSkipToBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64)) + }) + return _c +} + +func (_c *EVMService_LPSkipToBlock_Call) Return(_a0 error) *EVMService_LPSkipToBlock_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EVMService_LPSkipToBlock_Call) RunAndReturn(run func(context.Context, int64) error) *EVMService_LPSkipToBlock_Call { + _c.Call.Return(run) + return _c +} + // QueryTrackedLogs provides a mock function with given fields: ctx, filterQuery, limitAndSort, confidenceLevel func (_m *EVMService) QueryTrackedLogs(ctx context.Context, filterQuery []query.Expression, limitAndSort query.LimitAndSort, confidenceLevel primitives.ConfidenceLevel) ([]*evm.Log, error) { ret := _m.Called(ctx, filterQuery, limitAndSort, confidenceLevel) diff --git a/pkg/types/relayer.go b/pkg/types/relayer.go index dcb942da82..be054da8fb 100644 --- a/pkg/types/relayer.go +++ b/pkg/types/relayer.go @@ -199,6 +199,9 @@ type EVMService interface { // GetLatestLPBlock retrieves current LatestBlock from cache perspective GetLatestLPBlock(ctx context.Context) (*evm.LPBlock, error) + // LPSkipToBlock skips log poller to the given block number + LPSkipToBlock(ctx context.Context, blockNumber int64) error + // GetFiltersNames returns all registered filters' names for later pruning // TODO PLEX-1465: once code is moved away, remove this GetFiltersNames method GetFiltersNames(ctx context.Context) ([]string, error) @@ -539,6 +542,10 @@ func (ues *UnimplementedEVMService) GetLatestLPBlock(ctx context.Context) (*evm. return nil, status.Errorf(codes.Unimplemented, "method GetLatestLPBlock not implemented") } +func (ues *UnimplementedEVMService) LPSkipToBlock(ctx context.Context, blockNumber int64) error { + return status.Errorf(codes.Unimplemented, "method LPSkipToBlock not implemented") +} + func (ues *UnimplementedEVMService) GetFiltersNames(ctx context.Context) ([]string, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFiltersNames not implemented") }