@@ -124,18 +124,15 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
124124 // Read requests if Prague is enabled.
125125 var requests [][]byte
126126 if p .config .IsPrague (block .Number (), block .Time ()) {
127- // EIP-6110 deposits
128- depositRequests , err := ParseDepositLogs ( allLogs , p . config )
129- if err != nil {
127+ requests = [][] byte {}
128+ // EIP-6110
129+ if err := ParseDepositLogs ( & requests , allLogs , p . config ); err != nil {
130130 return nil , err
131131 }
132- requests = append (requests , depositRequests )
133- // EIP-7002 withdrawals
134- withdrawalRequests := ProcessWithdrawalQueue (evm )
135- requests = append (requests , withdrawalRequests )
136- // EIP-7251 consolidations
137- consolidationRequests := ProcessConsolidationQueue (evm )
138- requests = append (requests , consolidationRequests )
132+ // EIP-7002
133+ ProcessWithdrawalQueue (& requests , evm )
134+ // EIP-7251
135+ ProcessConsolidationQueue (& requests , evm )
139136 }
140137
141138 // Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
@@ -289,17 +286,17 @@ func ProcessParentBlockHash(prevHash common.Hash, evm *vm.EVM) {
289286
290287// ProcessWithdrawalQueue calls the EIP-7002 withdrawal queue contract.
291288// It returns the opaque request data returned by the contract.
292- func ProcessWithdrawalQueue (evm * vm.EVM ) [] byte {
293- return processRequestsSystemCall (evm , 0x01 , params .WithdrawalQueueAddress )
289+ func ProcessWithdrawalQueue (requests * [][] byte , evm * vm.EVM ) {
290+ processRequestsSystemCall (requests , evm , 0x01 , params .WithdrawalQueueAddress )
294291}
295292
296293// ProcessConsolidationQueue calls the EIP-7251 consolidation queue contract.
297294// It returns the opaque request data returned by the contract.
298- func ProcessConsolidationQueue (evm * vm.EVM ) [] byte {
299- return processRequestsSystemCall (evm , 0x02 , params .ConsolidationQueueAddress )
295+ func ProcessConsolidationQueue (requests * [][] byte , evm * vm.EVM ) {
296+ processRequestsSystemCall (requests , evm , 0x02 , params .ConsolidationQueueAddress )
300297}
301298
302- func processRequestsSystemCall (evm * vm.EVM , requestType byte , addr common.Address ) [] byte {
299+ func processRequestsSystemCall (requests * [][] byte , evm * vm.EVM , requestType byte , addr common.Address ) {
303300 if tracer := evm .Config .Tracer ; tracer != nil {
304301 if tracer .OnSystemCallStart != nil {
305302 tracer .OnSystemCallStart ()
@@ -320,28 +317,34 @@ func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Addres
320317 evm .StateDB .AddAddressToAccessList (addr )
321318 ret , _ , _ := evm .Call (vm .AccountRef (msg .From ), * msg .To , msg .Data , 30_000_000 , common .U2560 )
322319 evm .StateDB .Finalise (true )
320+ if len (ret ) == 0 {
321+ return // skip empty output
322+ }
323323
324- // Create withdrawals requestsData with prefix 0x01
324+ // Append prefixed requestsData to the requests list.
325325 requestsData := make ([]byte , len (ret )+ 1 )
326326 requestsData [0 ] = requestType
327327 copy (requestsData [1 :], ret )
328- return requestsData
328+ * requests = append ( * requests , requestsData )
329329}
330330
331331// ParseDepositLogs extracts the EIP-6110 deposit values from logs emitted by
332332// BeaconDepositContract.
333- func ParseDepositLogs (logs []* types.Log , config * params.ChainConfig ) ([] byte , error ) {
333+ func ParseDepositLogs (requests * [][] byte , logs []* types.Log , config * params.ChainConfig ) error {
334334 deposits := make ([]byte , 1 ) // note: first byte is 0x00 (== deposit request type)
335335 for _ , log := range logs {
336336 if log .Address == config .DepositContractAddress {
337337 request , err := types .DepositLogToRequest (log .Data )
338338 if err != nil {
339- return nil , fmt .Errorf ("unable to parse deposit data: %v" , err )
339+ return fmt .Errorf ("unable to parse deposit data: %v" , err )
340340 }
341341 deposits = append (deposits , request ... )
342342 }
343343 }
344- return deposits , nil
344+ if len (deposits ) > 1 {
345+ * requests = append (* requests , deposits )
346+ }
347+ return nil
345348}
346349
347350// ProcessOnPersist applies a system call to the governance contract.
0 commit comments