Skip to content

Commit 5e1238d

Browse files
Use mapstructure for unpacking input tuple to go struct
1 parent 5fb674c commit 5e1238d

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

@@ -349,17 +350,17 @@ func VerifyResponse(metacalldata MetacalldataResponse, dualBroadcastParams strin
349350
}
350351

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

0 commit comments

Comments
 (0)