@@ -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