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