Skip to content

Commit fe7fd23

Browse files
cl-efornaciaridimriou
authored andcommitted
Use mapstructure for unpacking input tuple to go struct
1 parent eea7b24 commit fe7fd23

1 file changed

Lines changed: 7 additions & 153 deletions

File tree

pkg/txm/clientwrappers/dualbroadcast/meta_client.go

Lines changed: 7 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/ethereum/go-ethereum/common"
1919
"github.com/ethereum/go-ethereum/common/hexutil"
2020
evmtypes "github.com/ethereum/go-ethereum/core/types"
21+
"github.com/mitchellh/mapstructure"
2122

2223
"github.com/smartcontractkit/chainlink-common/pkg/logger"
2324

@@ -353,17 +354,17 @@ func VerifyResponse(metacalldata MetacalldataResponse, dualBroadcastParams strin
353354
}
354355

355356
result := new(Metacalldata)
356-
result.UOP, err = copyUserOp(args[0])
357+
err = mapstructure.Decode(args[0], &result.UOP)
357358
if err != nil {
358-
return nil, fmt.Errorf("error unpacking UO: %w", err)
359+
return nil, fmt.Errorf("error unpacking UOP: %w", err)
359360
}
360-
result.SOPs, err = copySolverOps(args[1])
361+
err = mapstructure.Decode(args[1], &result.SOPs)
361362
if err != nil {
362-
return nil, fmt.Errorf("error unpacking SOs: %w", err)
363+
return nil, fmt.Errorf("error unpacking SOPs: %w", err)
363364
}
364-
result.DOP, err = copyDAppOp(args[2])
365+
err = mapstructure.Decode(args[2], &result.DOP)
365366
if err != nil {
366-
return nil, fmt.Errorf("error unpacking DO: %w", err)
367+
return nil, fmt.Errorf("error unpacking DOP: %w", err)
367368
}
368369
return VerifyMetadata(txData, fromAddress, *result, fwdrDestAddress, dApp, to, metacalldata)
369370
}
@@ -479,150 +480,3 @@ func verifyRaw(raw any) (reflect.Value, error) {
479480
}
480481
return rv, nil
481482
}
482-
483-
func copyUserOp(raw any) (UO, error) {
484-
var u UO
485-
486-
rv, err := verifyRaw(raw)
487-
if err != nil {
488-
return u, err
489-
}
490-
491-
to, err := getFieldTyped[common.Address]("To", rv)
492-
if err != nil {
493-
return u, err
494-
}
495-
u.To = to
496-
497-
maxFeePerGas, err := getFieldTyped[*big.Int]("MaxFeePerGas", rv)
498-
if err != nil {
499-
return u, err
500-
}
501-
u.MaxFeePerGas = maxFeePerGas
502-
503-
dapp, err := getFieldTyped[common.Address]("Dapp", rv)
504-
if err != nil {
505-
return u, err
506-
}
507-
u.Dapp = dapp
508-
509-
control, err := getFieldTyped[common.Address]("Control", rv)
510-
if err != nil {
511-
return u, err
512-
}
513-
u.Control = control
514-
515-
f, err := getField("Data", rv)
516-
if err != nil {
517-
return u, err
518-
}
519-
if f.Kind() != reflect.Slice || f.Type().Elem().Kind() != reflect.Uint8 {
520-
return u, errors.New("field Data not []byte")
521-
}
522-
u.Data = f.Bytes()
523-
524-
return u, nil
525-
}
526-
527-
func copySolverOp(raw any) (SO, error) {
528-
var s SO
529-
530-
rv, err := verifyRaw(raw)
531-
if err != nil {
532-
return s, err
533-
}
534-
535-
to, err := getFieldTyped[common.Address]("To", rv)
536-
if err != nil {
537-
return s, err
538-
}
539-
s.To = to
540-
541-
control, err := getFieldTyped[common.Address]("Control", rv)
542-
if err != nil {
543-
return s, err
544-
}
545-
s.Control = control
546-
547-
return s, nil
548-
}
549-
550-
func copySolverOps(raw any) ([]SO, error) {
551-
sliceVal := reflect.ValueOf(raw)
552-
if !sliceVal.IsValid() {
553-
return nil, errors.New("raw is invalid")
554-
}
555-
if sliceVal.Kind() == reflect.Pointer || sliceVal.Kind() == reflect.Interface {
556-
if sliceVal.IsNil() {
557-
return nil, errors.New("raw is nil")
558-
}
559-
sliceVal = sliceVal.Elem()
560-
}
561-
562-
if sliceVal.Kind() != reflect.Slice && sliceVal.Kind() != reflect.Array {
563-
return nil, fmt.Errorf("raw is not a slice or array, got %s", sliceVal.Kind())
564-
}
565-
566-
n := sliceVal.Len()
567-
out := make([]SO, 0, n)
568-
for i := range n {
569-
solverOp, err := copySolverOp(sliceVal.Index(i).Interface())
570-
if err != nil {
571-
return nil, fmt.Errorf("failed to copy solverOp at index %d: %w", i, err)
572-
}
573-
out = append(out, solverOp)
574-
}
575-
return out, nil
576-
}
577-
578-
func copyDAppOp(raw any) (DO, error) {
579-
var d DO
580-
581-
rv, err := verifyRaw(raw)
582-
if err != nil {
583-
return d, err
584-
}
585-
586-
to, err := getFieldTyped[common.Address]("To", rv)
587-
if err != nil {
588-
return d, err
589-
}
590-
d.To = to
591-
592-
control, err := getFieldTyped[common.Address]("Control", rv)
593-
if err != nil {
594-
return d, err
595-
}
596-
d.Control = control
597-
598-
bundler, err := getFieldTyped[common.Address]("Bundler", rv)
599-
if err != nil {
600-
return d, err
601-
}
602-
d.Bundler = bundler
603-
604-
return d, nil
605-
}
606-
607-
func getField(name string, rv reflect.Value) (reflect.Value, error) {
608-
f := rv.FieldByName(name)
609-
if !f.IsValid() {
610-
return reflect.Value{}, fmt.Errorf("field %s not found", name)
611-
}
612-
return f, nil
613-
}
614-
615-
func getFieldTyped[T any](name string, rv reflect.Value) (value T, err error) {
616-
f := rv.FieldByName(name)
617-
if !f.IsValid() {
618-
return value, fmt.Errorf("field %s not found", name)
619-
}
620-
621-
var ok bool
622-
value, ok = f.Interface().(T)
623-
if !ok {
624-
var t T
625-
return value, fmt.Errorf("field %s is not of expected type %T", name, t)
626-
}
627-
return value, nil
628-
}

0 commit comments

Comments
 (0)