@@ -106,18 +106,15 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
106106 // Read requests if Prague is enabled.
107107 var requests [][]byte
108108 if p .config .IsPrague (block .Number (), block .Time ()) {
109- // EIP-6110 deposits
110- depositRequests , err := ParseDepositLogs ( allLogs , p . config )
111- if err != nil {
109+ requests = [][] byte {}
110+ // EIP-6110
111+ if err := ParseDepositLogs ( & requests , allLogs , p . config ); err != nil {
112112 return nil , err
113113 }
114- requests = append (requests , depositRequests )
115- // EIP-7002 withdrawals
116- withdrawalRequests := ProcessWithdrawalQueue (evm )
117- requests = append (requests , withdrawalRequests )
118- // EIP-7251 consolidations
119- consolidationRequests := ProcessConsolidationQueue (evm )
120- requests = append (requests , consolidationRequests )
114+ // EIP-7002
115+ ProcessWithdrawalQueue (& requests , evm )
116+ // EIP-7251
117+ ProcessConsolidationQueue (& requests , evm )
121118 }
122119
123120 // Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
@@ -271,17 +268,17 @@ func ProcessParentBlockHash(prevHash common.Hash, evm *vm.EVM) {
271268
272269// ProcessWithdrawalQueue calls the EIP-7002 withdrawal queue contract.
273270// It returns the opaque request data returned by the contract.
274- func ProcessWithdrawalQueue (evm * vm.EVM ) [] byte {
275- return processRequestsSystemCall (evm , 0x01 , params .WithdrawalQueueAddress )
271+ func ProcessWithdrawalQueue (requests * [][] byte , evm * vm.EVM ) {
272+ processRequestsSystemCall (requests , evm , 0x01 , params .WithdrawalQueueAddress )
276273}
277274
278275// ProcessConsolidationQueue calls the EIP-7251 consolidation queue contract.
279276// It returns the opaque request data returned by the contract.
280- func ProcessConsolidationQueue (evm * vm.EVM ) [] byte {
281- return processRequestsSystemCall (evm , 0x02 , params .ConsolidationQueueAddress )
277+ func ProcessConsolidationQueue (requests * [][] byte , evm * vm.EVM ) {
278+ processRequestsSystemCall (requests , evm , 0x02 , params .ConsolidationQueueAddress )
282279}
283280
284- func processRequestsSystemCall (evm * vm.EVM , requestType byte , addr common.Address ) [] byte {
281+ func processRequestsSystemCall (requests * [][] byte , evm * vm.EVM , requestType byte , addr common.Address ) {
285282 if tracer := evm .Config .Tracer ; tracer != nil {
286283 if tracer .OnSystemCallStart != nil {
287284 tracer .OnSystemCallStart ()
@@ -302,26 +299,32 @@ func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Addres
302299 evm .StateDB .AddAddressToAccessList (addr )
303300 ret , _ , _ := evm .Call (vm .AccountRef (msg .From ), * msg .To , msg .Data , 30_000_000 , common .U2560 )
304301 evm .StateDB .Finalise (true )
302+ if len (ret ) == 0 {
303+ return // skip empty output
304+ }
305305
306- // Create withdrawals requestsData with prefix 0x01
306+ // Append prefixed requestsData to the requests list.
307307 requestsData := make ([]byte , len (ret )+ 1 )
308308 requestsData [0 ] = requestType
309309 copy (requestsData [1 :], ret )
310- return requestsData
310+ * requests = append ( * requests , requestsData )
311311}
312312
313313// ParseDepositLogs extracts the EIP-6110 deposit values from logs emitted by
314314// BeaconDepositContract.
315- func ParseDepositLogs (logs []* types.Log , config * params.ChainConfig ) ([] byte , error ) {
315+ func ParseDepositLogs (requests * [][] byte , logs []* types.Log , config * params.ChainConfig ) error {
316316 deposits := make ([]byte , 1 ) // note: first byte is 0x00 (== deposit request type)
317317 for _ , log := range logs {
318318 if log .Address == config .DepositContractAddress {
319319 request , err := types .DepositLogToRequest (log .Data )
320320 if err != nil {
321- return nil , fmt .Errorf ("unable to parse deposit data: %v" , err )
321+ return fmt .Errorf ("unable to parse deposit data: %v" , err )
322322 }
323323 deposits = append (deposits , request ... )
324324 }
325325 }
326- return deposits , nil
326+ if len (deposits ) > 1 {
327+ * requests = append (* requests , deposits )
328+ }
329+ return nil
327330}
0 commit comments