Skip to content

Commit 0a7ba24

Browse files
authored
Fix ConvertExpressionsFromProto (#1575)
1 parent efac15b commit 0a7ba24

File tree

3 files changed

+374
-21
lines changed

3 files changed

+374
-21
lines changed

pkg/chains/evm/proto_helpers.go

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -519,20 +519,27 @@ func ConvertHashedValueComparatorsToProto(hashedValueComparators []evmprimitives
519519
return protoHashedValueComparators
520520
}
521521

522-
func ConvertHashedValueComparatorsFromProto(protoHashedValueComparators []*HashValueComparator) []evmprimitives.HashedValueComparator {
522+
func ConvertHashedValueComparatorsFromProto(protoHashedValueComparators []*HashValueComparator) ([]evmprimitives.HashedValueComparator, error) {
523523
hashedValueComparators := make([]evmprimitives.HashedValueComparator, 0, len(protoHashedValueComparators))
524524
for _, protoHvc := range protoHashedValueComparators {
525+
if protoHvc == nil {
526+
return nil, errors.New("hashed value comparator can't be nil")
527+
}
525528
values := make([]evmtypes.Hash, 0, len(protoHvc.GetValues()))
526529
for _, value := range protoHvc.GetValues() {
527-
values = append(values, evmtypes.Hash(value))
530+
hashValue, err := ConvertHashFromProto(value)
531+
if err != nil {
532+
return nil, fmt.Errorf("failed to convert hash value: %w", err)
533+
}
534+
values = append(values, hashValue)
528535
}
529536
hashedValueComparators = append(hashedValueComparators,
530537
evmprimitives.HashedValueComparator{
531538
Values: values,
532539
Operator: primitives.ComparisonOperator(protoHvc.GetOperator()),
533540
})
534541
}
535-
return hashedValueComparators
542+
return hashedValueComparators, nil
536543
}
537544

538545
func ConvertExpressionsToProto(expressions []query.Expression) ([]*Expression, error) {
@@ -552,7 +559,7 @@ func ConvertExpressionsFromProto(protoExpressions []*Expression) ([]query.Expres
552559
for idx, protoExpression := range protoExpressions {
553560
expr, err := convertExpressionFromProto(protoExpression)
554561
if err != nil {
555-
return nil, fmt.Errorf("err to convert expr idx %d err: %w", idx, err)
562+
return nil, status.Errorf(codes.InvalidArgument, "err to convert expr idx %d err: %s", idx, err.Error())
556563
}
557564

558565
expressions = append(expressions, expr)
@@ -626,13 +633,17 @@ func convertExpressionToProto(expression query.Expression) (*Expression, error)
626633
}
627634

628635
func convertExpressionFromProto(protoExpression *Expression) (query.Expression, error) {
636+
if protoExpression == nil {
637+
return query.Expression{}, errors.New("expression can not be nil")
638+
}
639+
629640
switch protoEvaluatedExpr := protoExpression.GetEvaluator().(type) {
630641
case *Expression_BooleanExpression:
631642
var expressions []query.Expression
632-
for _, expression := range protoEvaluatedExpr.BooleanExpression.GetExpression() {
643+
for idx, expression := range protoEvaluatedExpr.BooleanExpression.GetExpression() {
633644
convertedExpression, err := convertExpressionFromProto(expression)
634645
if err != nil {
635-
return query.Expression{}, err
646+
return query.Expression{}, fmt.Errorf("failed to convert sub-expression %d: %w", idx, err)
636647
}
637648
expressions = append(expressions, convertedExpression)
638649
}
@@ -651,25 +662,44 @@ func convertExpressionFromProto(protoExpression *Expression) (query.Expression,
651662
return convertEVMExpressionToProto(protoEvaluatedExpr.Primitive)
652663
}
653664
default:
654-
return query.Expression{}, status.Errorf(codes.InvalidArgument, "Unknown expression type: %T", protoExpression)
665+
return query.Expression{}, fmt.Errorf("unknown expression type: %T", protoExpression.GetEvaluator())
655666
}
656667
}
657668

658669
func convertEVMExpressionToProto(protoPrimitive *Primitive) (query.Expression, error) {
659670
switch primitive := protoPrimitive.GetPrimitive().(type) {
660671
case *Primitive_ContractAddress:
661-
address := evmtypes.Address(primitive.ContractAddress)
672+
address, err := ConvertAddressFromProto(primitive.ContractAddress)
673+
if err != nil {
674+
return query.Expression{}, fmt.Errorf("failed to convert contract address: %w", err)
675+
}
662676
return evmprimitives.NewAddressFilter(address), nil
663677
case *Primitive_EventSig:
664-
return evmprimitives.NewEventSigFilter(evmtypes.Hash(primitive.EventSig)), nil
678+
hash, err := ConvertHashFromProto(primitive.EventSig)
679+
if err != nil {
680+
return query.Expression{}, fmt.Errorf("failed to convert event sig: %w", err)
681+
}
682+
return evmprimitives.NewEventSigFilter(hash), nil
665683
case *Primitive_EventByTopic:
666-
return evmprimitives.NewEventByTopicFilter(primitive.EventByTopic.GetTopic(),
667-
ConvertHashedValueComparatorsFromProto(primitive.EventByTopic.GetHashedValueComparers())), nil
684+
if primitive.EventByTopic == nil {
685+
return query.Expression{}, errors.New("EventByTopic can not be nil")
686+
}
687+
valueCmp, err := ConvertHashedValueComparatorsFromProto(primitive.EventByTopic.GetHashedValueComparers())
688+
if err != nil {
689+
return query.Expression{}, fmt.Errorf("failed to convert EventByTopic hashed value comparators: %w", err)
690+
}
691+
return evmprimitives.NewEventByTopicFilter(primitive.EventByTopic.GetTopic(), valueCmp), nil
668692
case *Primitive_EventByWord:
669-
return evmprimitives.NewEventByWordFilter(int(primitive.EventByWord.GetWordIndex()),
670-
ConvertHashedValueComparatorsFromProto(primitive.EventByWord.GetHashedValueComparers())), nil
693+
if primitive.EventByWord == nil {
694+
return query.Expression{}, errors.New("EventByWord can not be nil")
695+
}
696+
valueCmp, err := ConvertHashedValueComparatorsFromProto(primitive.EventByWord.GetHashedValueComparers())
697+
if err != nil {
698+
return query.Expression{}, fmt.Errorf("failed to convert EventByWord hashed value comparators: %w", err)
699+
}
700+
return evmprimitives.NewEventByWordFilter(int(primitive.EventByWord.GetWordIndex()), valueCmp), nil
671701
default:
672-
return query.Expression{}, status.Errorf(codes.InvalidArgument, "Unknown primitive type: %T", primitive)
702+
return query.Expression{}, fmt.Errorf("unknown primitive type: %T", primitive)
673703
}
674704
}
675705

0 commit comments

Comments
 (0)