@@ -20,6 +20,26 @@ import (
2020 "github.com/stackup-wallet/stackup-bundler/pkg/userop"
2121)
2222
23+ type TraceInput struct {
24+ Rpc * ethRpc.Client
25+ EntryPoint common.Address
26+ Op * userop.UserOperation
27+ ChainID * big.Int
28+
29+ // Tracer for debug_traceCall
30+ CustomTracer string
31+
32+ // Optional params for simulateHandleOps
33+ Target common.Address
34+ Data []byte
35+ }
36+
37+ type TraceOutput struct {
38+ Trace * tracer.BundlerErrorReturn
39+ Result * reverts.ExecutionResultRevert
40+ Event * entrypoint.EntrypointUserOperationEvent
41+ }
42+
2343func parseUserOperationEvent (
2444 entryPoint common.Address ,
2545 ep * entrypoint.Entrypoint ,
@@ -50,82 +70,79 @@ func parseUserOperationEvent(
5070 return ev , nil
5171}
5272
53- func TraceSimulateHandleOp (
54- rpc * ethRpc.Client ,
55- entryPoint common.Address ,
56- op * userop.UserOperation ,
57- chainID * big.Int ,
58- customTracer string ,
59- target common.Address ,
60- data []byte ,
61- ) (* reverts.ExecutionResultRevert , * entrypoint.EntrypointUserOperationEvent , error ) {
62- ep , err := entrypoint .NewEntrypoint (entryPoint , ethclient .NewClient (rpc ))
73+ func TraceSimulateHandleOp (in * TraceInput ) (* TraceOutput , error ) {
74+ ep , err := entrypoint .NewEntrypoint (in .EntryPoint , ethclient .NewClient (in .Rpc ))
6375 if err != nil {
64- return nil , nil , err
76+ return nil , err
6577 }
66- auth , err := bind .NewKeyedTransactorWithChainID (utils .DummyPk , chainID )
78+ auth , err := bind .NewKeyedTransactorWithChainID (utils .DummyPk , in . ChainID )
6779 if err != nil {
68- return nil , nil , err
80+ return nil , err
6981 }
7082 auth .GasLimit = math .MaxUint64
7183 auth .NoSend = true
72- tx , err := ep .SimulateHandleOp (auth , entrypoint .UserOperation (* op ), target , data )
84+ tx , err := ep .SimulateHandleOp (auth , entrypoint .UserOperation (* in . Op ), in . Target , in . Data )
7385 if err != nil {
74- return nil , nil , err
86+ return nil , err
7587 }
88+ out := & TraceOutput {}
7689
7790 var res tracer.BundlerErrorReturn
7891 req := utils.TraceCallReq {
7992 From : common .HexToAddress ("0x" ),
80- To : entryPoint ,
93+ To : in . EntryPoint ,
8194 Data : tx .Data (),
8295 }
8396 opts := utils.TraceCallOpts {
84- Tracer : customTracer ,
97+ Tracer : in . CustomTracer ,
8598 }
86- if err := rpc .CallContext (context .Background (), & res , "debug_traceCall" , & req , "latest" , & opts ); err != nil {
87- return nil , nil , err
99+ if err := in . Rpc .CallContext (context .Background (), & res , "debug_traceCall" , & req , "latest" , & opts ); err != nil {
100+ return nil , err
88101 }
89102 outErr , err := errors .ParseHexToRpcDataError (res .Output )
90103 if err != nil {
91- return nil , nil , err
104+ return nil , err
92105 }
93106 if res .ValidationOOG {
94- return nil , nil , errors .NewRPCError (errors .EXECUTION_REVERTED , "validation OOG" , nil )
107+ return nil , errors .NewRPCError (errors .EXECUTION_REVERTED , "validation OOG" , nil )
95108 }
109+ out .Trace = & res
96110
97111 sim , simErr := reverts .NewExecutionResult (outErr )
98112 if simErr != nil {
99113 fo , foErr := reverts .NewFailedOp (outErr )
100114 if foErr != nil {
101- return nil , nil , fmt .Errorf ("%s, %s" , simErr , foErr )
115+ return nil , fmt .Errorf ("%s, %s" , simErr , foErr )
102116 }
103- return nil , nil , errors .NewRPCError (errors .REJECTED_BY_EP_OR_ACCOUNT , fo .Reason , fo )
117+ return nil , errors .NewRPCError (errors .REJECTED_BY_EP_OR_ACCOUNT , fo .Reason , fo )
104118 }
119+ out .Result = sim
105120
106121 if len (res .Reverts ) != 0 {
107122 data , err := hexutil .Decode (res .Reverts [len (res .Reverts )- 1 ])
108123 if err != nil {
109- return sim , nil , err
124+ return out , err
110125 }
111126
112127 if len (data ) == 0 {
113128 if res .ExecutionOOG {
114- return sim , nil , errors .NewRPCError (errors .EXECUTION_REVERTED , "execution OOG" , nil )
129+ return out , errors .NewRPCError (errors .EXECUTION_REVERTED , "execution OOG" , nil )
115130 }
116- return sim , nil , errors .NewRPCError (errors .EXECUTION_REVERTED , "execution reverted" , nil )
131+ return out , errors .NewRPCError (errors .EXECUTION_REVERTED , "execution reverted" , nil )
117132 }
118133
119134 reason , err := errors .DecodeRevert (data )
120135 if err != nil {
121- return sim , nil , err
136+ return out , err
122137 }
123- return sim , nil , errors .NewRPCError (errors .EXECUTION_REVERTED , reason , reason )
138+ return out , errors .NewRPCError (errors .EXECUTION_REVERTED , reason , reason )
124139 }
125140
126- ev , err := parseUserOperationEvent (entryPoint , ep , res .UserOperationEvent )
141+ ev , err := parseUserOperationEvent (in . EntryPoint , ep , res .UserOperationEvent )
127142 if err != nil {
128- return nil , nil , err
143+ return out , err
129144 }
130- return sim , ev , nil
145+ out .Event = ev
146+
147+ return out , nil
131148}
0 commit comments