public List<BlockSimulationResult> process(
      final BlockHeader blockHeader,
      final BlockSimulationParameter simulationParameter,
      final MutableWorldState worldState) {
    int countStateCalls = simulationParameter.getBlockStateCalls().size();
    List<BlockSimulationResult> results = new ArrayList<>(countStateCalls);

    // Fill gaps between blocks and set the correct block number and timestamp
    List<BlockStateCall> blockStateCalls =
        fillBlockStateCalls(simulationParameter.getBlockStateCalls(), blockHeader);

    BlockHeader currentBlockHeader = blockHeader;
    HashMap<Long, Hash> blockHashCache = HashMap.newHashMap(countStateCalls);
    long simulationCumulativeGasUsed = 0;
    for (BlockStateCall stateCall : blockStateCalls) {
      BlockSimulationResult result =
          processBlockStateCall(
              currentBlockHeader,
              stateCall,
              worldState,
              simulationParameter.isValidation(),
              simulationParameter.isTraceTransfers(),
              simulationParameter::getFakeSignature,
              blockHashCache,
              simulationCumulativeGasUsed);
      results.add(result);
      BlockHeader resultBlockHeader = result.getBlock().getHeader();
      blockHashCache.put(resultBlockHeader.getNumber(), resultBlockHeader.getHash());
      currentBlockHeader = resultBlockHeader;
      simulationCumulativeGasUsed += resultBlockHeader.getGasUsed();
    }
    return results;
  }
Processes a list of BlockStateCalls sequentially, collecting the results.

@param blockHeader The block header for all simulations.
@param simulationParameter The BlockSimulationParameter containing the block state calls.
@param worldState The initial MutableWorldState to start with.
@return A list of BlockSimulationResult objects from processing each BlockStateCall.
ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/BlockSimulator.java